From 691fc9e378ce3f2ed4b8ad0bf6e0998084058342 Mon Sep 17 00:00:00 2001 From: "microsoft-github-operations[bot]" <55726097+microsoft-github-operations[bot]@users.noreply.github.com> Date: Mon, 8 Jan 2024 05:07:53 +0000 Subject: [PATCH 001/223] Initial commit --- .gitignore | 398 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 398 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..8a30d258 --- /dev/null +++ b/.gitignore @@ -0,0 +1,398 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml From 0a5b8ac802f1345c3f773b7210ef0eee88a7f52e Mon Sep 17 00:00:00 2001 From: Microsoft Open Source Date: Sun, 7 Jan 2024 21:07:56 -0800 Subject: [PATCH 002/223] CODE_OF_CONDUCT.md committed --- CODE_OF_CONDUCT.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..f9ba8cf6 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,9 @@ +# Microsoft Open Source Code of Conduct + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). + +Resources: + +- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) +- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) +- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns From 79993761aa0e474e081dfe63bd36e9eae065c947 Mon Sep 17 00:00:00 2001 From: Microsoft Open Source Date: Sun, 7 Jan 2024 21:07:57 -0800 Subject: [PATCH 003/223] README.md committed --- README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..5cd7cecf --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +# Project + +> This repo has been populated by an initial template to help get you started. Please +> make sure to update the content to build a great experience for community-building. + +As the maintainer of this project, please make a few updates: + +- Improving this README.MD file to provide a great experience +- Updating SUPPORT.MD with content about this project's support experience +- Understanding the security reporting process in SECURITY.MD +- Remove this section from the README + +## Contributing + +This project welcomes contributions and suggestions. Most contributions require you to agree to a +Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us +the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. + +When you submit a pull request, a CLA bot will automatically determine whether you need to provide +a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions +provided by the bot. You will only need to do this once across all repos using our CLA. + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or +contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. + +## Trademarks + +This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft +trademarks or logos is subject to and must follow +[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). +Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. +Any use of third-party trademarks or logos are subject to those third-party's policies. From ffe60a2f574046d92dacf0fc825206bd5d4d9251 Mon Sep 17 00:00:00 2001 From: Microsoft Open Source Date: Sun, 7 Jan 2024 21:07:57 -0800 Subject: [PATCH 004/223] SECURITY.md committed --- SECURITY.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..b3c89efc --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,41 @@ + + +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet) and [Xamarin](https://github.com/xamarin). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/security.md/definition), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/security.md/msrc/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/security.md/msrc/pgp). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/security.md/msrc/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/security.md/cvd). + + From d5b4496ae5ba0e69c0f4b5058959294a8d829bec Mon Sep 17 00:00:00 2001 From: Microsoft Open Source Date: Sun, 7 Jan 2024 21:07:58 -0800 Subject: [PATCH 005/223] SUPPORT.md committed --- SUPPORT.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 SUPPORT.md diff --git a/SUPPORT.md b/SUPPORT.md new file mode 100644 index 00000000..291d4d43 --- /dev/null +++ b/SUPPORT.md @@ -0,0 +1,25 @@ +# TODO: The maintainer of this repo has not yet edited this file + +**REPO OWNER**: Do you want Customer Service & Support (CSS) support for this product/project? + +- **No CSS support:** Fill out this template with information about how to file issues and get help. +- **Yes CSS support:** Fill out an intake form at [aka.ms/onboardsupport](https://aka.ms/onboardsupport). CSS will work with/help you to determine next steps. +- **Not sure?** Fill out an intake as though the answer were "Yes". CSS will help you decide. + +*Then remove this first heading from this SUPPORT.MD file before publishing your repo.* + +# Support + +## How to file issues and get help + +This project uses GitHub Issues to track bugs and feature requests. Please search the existing +issues before filing new issues to avoid duplicates. For new issues, file your bug or +feature request as a new Issue. + +For help and questions about using this project, please **REPO MAINTAINER: INSERT INSTRUCTIONS HERE +FOR HOW TO ENGAGE REPO OWNERS OR COMMUNITY FOR HELP. COULD BE A STACK OVERFLOW TAG OR OTHER +CHANNEL. WHERE WILL YOU HELP PEOPLE?**. + +## Microsoft Support Policy + +Support for this **PROJECT or PRODUCT** is limited to the resources listed above. From 7b21ad278e7f257fbd28a1cc0e23b4ac58c6953f Mon Sep 17 00:00:00 2001 From: Microsoft Open Source Date: Sun, 7 Jan 2024 21:07:59 -0800 Subject: [PATCH 006/223] LICENSE committed --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..9e841e7a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE From 400c261e47683648485ce5971291ad11c5acd929 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 6 Feb 2024 19:44:58 +0800 Subject: [PATCH 007/223] init commit --- .gitignore | 402 +---------------------- CONTRIBUTING.md | 14 + DISCLAIMER.md | 35 ++ LICENSE | 34 +- README.md | 135 ++++++-- assets/overview.png | Bin 0 -> 211834 bytes assets/ufo_blue.png | Bin 0 -> 13063 bytes assets/ufo_rv.png | Bin 0 -> 35025 bytes requirements.txt | 8 + ufo/__init__.py | 0 ufo/__main__.py | 5 + ufo/config/__init__.py | 0 ufo/config/config.py | 24 ++ ufo/config/config.yaml | 40 +++ ufo/llm/__init__.py | 0 ufo/llm/llm_call.py | 59 ++++ ufo/llm/prompt.py | 74 +++++ ufo/module/__init__.py | 0 ufo/module/flow.py | 431 +++++++++++++++++++++++++ ufo/prompts/base/action_selection.yaml | 288 +++++++++++++++++ ufo/prompts/base/app_selection.yaml | 185 +++++++++++ ufo/ufo.py | 96 ++++++ ufo/ui_control/__init__.py | 4 + ufo/ui_control/control.py | 233 +++++++++++++ ufo/ui_control/screenshot.py | 198 ++++++++++++ ufo/utils/__init__.py | 179 ++++++++++ 26 files changed, 2012 insertions(+), 432 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 DISCLAIMER.md create mode 100644 assets/overview.png create mode 100644 assets/ufo_blue.png create mode 100644 assets/ufo_rv.png create mode 100644 requirements.txt create mode 100644 ufo/__init__.py create mode 100644 ufo/__main__.py create mode 100644 ufo/config/__init__.py create mode 100644 ufo/config/config.py create mode 100644 ufo/config/config.yaml create mode 100644 ufo/llm/__init__.py create mode 100644 ufo/llm/llm_call.py create mode 100644 ufo/llm/prompt.py create mode 100644 ufo/module/__init__.py create mode 100644 ufo/module/flow.py create mode 100644 ufo/prompts/base/action_selection.yaml create mode 100644 ufo/prompts/base/app_selection.yaml create mode 100644 ufo/ufo.py create mode 100644 ufo/ui_control/__init__.py create mode 100644 ufo/ui_control/control.py create mode 100644 ufo/ui_control/screenshot.py create mode 100644 ufo/utils/__init__.py diff --git a/.gitignore b/.gitignore index 8a30d258..182c5752 100644 --- a/.gitignore +++ b/.gitignore @@ -1,398 +1,8 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Ww][Ii][Nn]32/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ -[Ll]ogs/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# ASP.NET Scaffolding -ScaffoldingReadMe.txt - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.tlog -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*.json -coverage*.xml -coverage*.info - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio 6 auto-generated project file (contains which files were open etc.) -*.vbp - -# Visual Studio 6 workspace and project file (working project files containing files to include in project) -*.dsw -*.dsp - -# Visual Studio 6 technical files -*.ncb -*.aps - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) +# Ignore Jupyter Notebook checkpoints +.ipynb_checkpoints +/test/* +/test/*.ipynb +/logs/* __pycache__/ +**/__pycache__/ *.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# Visual Studio History (VSHistory) files -.vshistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - -# Fody - auto-generated XML schema -FodyWeavers.xsd - -# VS Code files for those working on multiple tools -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -# Local History for Visual Studio Code -.history/ - -# Windows Installer files from build outputs -*.cab -*.msi -*.msix -*.msm -*.msp - -# JetBrains Rider -*.sln.iml diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..c282e9a1 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,14 @@ +# Contributing + +This project welcomes contributions and suggestions. Most contributions require you to +agree to a Contributor License Agreement (CLA) declaring that you have the right to, +and actually do, grant us the rights to use your contribution. For details, visit +https://cla.microsoft.com. + +When you submit a pull request, a CLA-bot will automatically determine whether you need +to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the +instructions provided by the bot. You will only need to do this once across all repositories using our CLA. + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) +or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. \ No newline at end of file diff --git a/DISCLAIMER.md b/DISCLAIMER.md new file mode 100644 index 00000000..dc6a096b --- /dev/null +++ b/DISCLAIMER.md @@ -0,0 +1,35 @@ +# Disclaimer: Code Execution and Data Handling Notice + +By choosing to run the provided code, you acknowledge and agree to the following terms and conditions regarding the functionality and data handling practices: + +## 1. Code Functionality: +The code you are about to execute has the capability to capture screenshots of your working desktop environment and active applications. These screenshots will be processed and sent to the GPT model for inference. + +## 2. Data Transmission: +Upon execution, the captured screenshots will be transmitted to external servers hosting the GPT model. This transmission is necessary for the inference process to generate relevant outputs based on the visual information provided. + +## 3. Data Privacy and Storage: +It is crucial to note that Microsoft, the provider of this code, explicitly states that it does not collect or save any of the transmitted data. The captured screenshots are processed in real-time for the purpose of inference, and no permanent storage or record of this data is retained by Microsoft. + +## 4. User Responsibility: +By running the code, you understand and accept the responsibility for the content and nature of the data present on your desktop during the execution period. It is your responsibility to ensure that no sensitive or confidential information is visible or captured during this process. + +## 5. Security Measures: +Microsoft has implemented security measures to safeguard the data transmission process. However, it is recommended that you run the code in a secure and controlled environment to minimize potential risks. Ensure that you are running the latest security updates on your system. + +## 6. Consent for Inference: +You explicitly provide consent for the GPT model to analyze the captured screenshots for the purpose of generating relevant outputs. This consent is inherent in the act of executing the code. + +## 7. No Guarantee of Accuracy: +The outputs generated by the GPT model are based on patterns learned during training and may not always be accurate or contextually relevant. Microsoft does not guarantee the accuracy or suitability of the inferences made by the model. + +## 8. Indemnification: +Users agree to defend, indemnify, and hold Microsoft harmless from and against all damages, costs, and attorneys' fees in connection with any claims arising from the use of this Repo. + +## 9. Reporting Infringements: +If anyone believes that this Repo infringes on their rights, please notify the project owner via the provided project owner email. Microsoft will investigate and take appropriate actions as necessary. + +## 10. Modifications to the Disclaimer: +Microsoft reserves the right to update or modify this disclaimer at any time without prior notice. It is your responsibility to review the disclaimer periodically for any changes. + +By proceeding to execute the code, you acknowledge that you have read, understood, and agreed to the terms outlined in this disclaimer. If you do not agree with these terms, refrain from running the provided code. \ No newline at end of file diff --git a/LICENSE b/LICENSE index 9e841e7a..63447fd8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,21 @@ - MIT License +Copyright (c) Microsoft Corporation. - Copyright (c) Microsoft Corporation. +MIT License - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md index 5cd7cecf..9a831e2c 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,125 @@ -# Project + -> This repo has been populated by an initial template to help get you started. Please -> make sure to update the content to build a great experience for community-building. +# **UFO** ![ufo](./assets/ufo_blue.png =x24): A **U**I-**F**ocused Agent for Windows **O**S Interaction -As the maintainer of this project, please make a few updates: +
-- Improving this README.MD file to provide a great experience -- Updating SUPPORT.MD with content about this project's support experience -- Understanding the security reporting process in SECURITY.MD -- Remove this section from the README +![Python Version](https://img.shields.io/badge/Python-3776AB?&logo=python&logoColor=white-blue&label=3.10%20%7C%203.11)  +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)  +![Welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat) -## Contributing +
-This project welcomes contributions and suggestions. Most contributions require you to agree to a -Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us -the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. +**UFO** is a **UI-Focused** dual-agent framework that seamlessly navigates and operates within individual applications and across them to fulfill user requests on **Windows OS**, even when spanning multiple applications. -When you submit a pull request, a CLA bot will automatically determine whether you need to provide -a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions -provided by the bot. You will only need to do this once across all repos using our CLA. +

+ +

+ + +## 🆕 News +- 📅 2024-02-30 UFO is released on GitHub🎈. + + +## 💥 Highlights + +- [x] **First Windows Agent Framework** - UFO represents the first agent framework that can translate user request in natural language into grounded operation on Windows OS. +- [x] **Interactive Mode** - UFO allows for multiple sub-requests from users in the same session for completing complex task. +- [x] **Action Safeguard** - UFO supports safeguard to prompt for user confirmation when the action is sensitive. +- [x] **Easy Extension** - UFO is easy to extend to accomplish more complex tasks with different operations. + + +## ✨ Getting Started + + +### 🛠️ Step 1: Installation +UFO requires **Python >= 3.10** running on **Windows OS >= 10**. It can be installed by running the following command: +```bash +# [optional to create conda environment] +# conda create -n ufo python=3.10 +# conda activate ufo + +# clone the repository +git clone https://github.com/microsoft/UFO.git +cd UFO +# install the requirements +pip install -r requirements.txt +``` + +### 🖊️ Step 2: Configure the LLMs +Before running UFO, you need to provide your LLM configurations. Taking OpenAI as an example, you can configure `ufo/config/config.yaml` file as follows. + +#### OpenAI +``` +OPENAI_API_BASE: Your OpenAI Endpoint # The base URL for the OpenAI API +OPENAI_API_KEY: Your OpenAI Key # Set the value to sk-xxx if you host the openai interface for open llm model +OPENAI_API_MODEL: GPT Model Name # The only OpenAI model by now that accepts visual input +``` + +### 🚩 Step 3: Start UFO + +#### ⌨️ Command Line (CLI) + +```bash +# assume you are in the cloned UFO folder +python -m ufo --task +``` + +This will start the UFO process and you can interact with it through the command line interface. +If everything goes well, you will see the following message: + +```bash +Welcome to use UFO🛸, A UI-focused Multimodal Agent for Windows OS. + _ _ _____ ___ +| | | || ___| / _ \ +| | | || |_ | | | | +| |_| || _| | |_| | + \___/ |_| \___/ +Please enter your request to be completed🛸: +``` +#### <**Reminder: Before inputing your request, please make sure the targeted applications are active on the system.**> + + +### Step 4 🎥: Execution Logs + +You can find the screenshots taken and request and reponse logs in the following folder: +``` +ufo/logs// +``` +You may use them to debug, replay, or analyze the agent output. + + +## ❓Get help +* ❔GitHub Issues (prefered) +* For other communications, please contact ufo-agent@microsoft.com +--- + +## 🎬 Demo Examples + +We present two demos videos that complete user request on Windows OS using UFO. + +#### 1️⃣🗑️ Example 1: Deleting all notes on a PowerPoint presentation. +In this example, we will show you how to use UFO to deleting all notes on a PowerPoint presentation with just a few simple steps. Explore it to work smarter not harder! + + +#### 2️⃣📧 Example 2: Composing an email using text from multiple sources. +In this example, we will show you how to use UFO to extract texts from Word documents, description of an image, to compose an email and send. Enjoy your cross-application experiment with UFO! + + +## 📚 Citation +Our paper could be found [here](http://export.arxiv.org/abs/2311.17541). +If you use UFO in your research, please cite our paper: +``` +@article{ufo, + title={UFO: A UI-Focused Agent for Windows OS Interaction}, + author={Chaoyun Zhang, Liqun Li, Shilin He, Xu Zhang, Bo Qiao, Si Qin, Minghua Ma, Yu Kang, Qingwei Lin, Saravan Rajmohan, Dongmei Zhang, Qi Zhang}, + journal={arXiv preprint arXiv:2311.17541}, + year={2024} +} +``` -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or -contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. ## Trademarks @@ -30,4 +127,4 @@ This project may contain trademarks or logos for projects, products, or services trademarks or logos is subject to and must follow [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. -Any use of third-party trademarks or logos are subject to those third-party's policies. +Any use of third-party trademarks or logos are subject to those third-party's policies. \ No newline at end of file diff --git a/assets/overview.png b/assets/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..50ae022ec2c87a7409eba01881c7136a4f707dd0 GIT binary patch literal 211834 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

quD|9q-itjeO!GxpSr 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

--> -# **UFO** ![ufo](./assets/ufo_blue.png =x24): A **U**I-**F**ocused Agent for Windows **O**S Interaction + + + +

+ A UI-Focused Agent for Windows OS Interaction +

diff --git a/assets/ufo_rv.png b/assets/ufo_rv.png deleted file mode 100644 index d26f6942c1ca892fa8302571cd86d55508b503da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35025 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 T+!%+wV3_(bt)p2=+jSVpD& diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml index 6180231a..16384cca 100644 --- a/ufo/config/config.yaml +++ b/ufo/config/config.yaml @@ -1,8 +1,8 @@ version: 0.1 -OPENAI_API_BASE: "https://cloudgpt-swc.openai.azure.com/openai/deployments/gpt-4-visual-preview/chat/completions?api-version=2023-12-01-preview" # The base URL for the OpenAI API +OPENAI_API_BASE: "" # The base URL for the OpenAI API OPENAI_API_KEY: "" # Set the value to sk-xxx if you host the openai interface for open llm model -OPENAI_API_MODEL: "gpt-4-visual-preview" # The only OpenAI model by now that accepts visual input +OPENAI_API_MODEL: "" # The only OpenAI model by now that accepts visual input CONTROL_BACKEND: "uia" # The backend for control action MAX_TOKENS: 2000 # The max token limit for the response completion MAX_RETRY: 3 # The max retry limit for the response completion From 5b542354e0468b8ce2244cd34ee5701e7299ee3e Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 6 Feb 2024 19:51:12 +0800 Subject: [PATCH 009/223] init commit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3b975d3d..789020d2 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@

- A UI-Focused Agent for Windows OS Interaction + UFO rc="./assets/ufo_blue.png" width="36" />: A UI-Focused Agent for Windows OS Interaction

From 6b522a5ce4c1aa1e432eb4cb1c848d0ddca80c6b Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 6 Feb 2024 19:52:08 +0800 Subject: [PATCH 010/223] init commit --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 789020d2..0905ac87 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,10 @@

- UFO rc="./assets/ufo_blue.png" width="36" />: A UI-Focused Agent for Windows OS Interaction + UFO UFO Image: A UI-Focused Agent for Windows OS Interaction

+
![Python Version](https://img.shields.io/badge/Python-3776AB?&logo=python&logoColor=white-blue&label=3.10%20%7C%203.11)  From ac2a71d6fb21c0225e561b425c79a56963357eb0 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 6 Feb 2024 19:57:20 +0800 Subject: [PATCH 011/223] Update README.md Update video. --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0905ac87..61c3206e 100644 --- a/README.md +++ b/README.md @@ -110,10 +110,18 @@ We present two demos videos that complete user request on Windows OS using UFO. In this example, we will show you how to use UFO to deleting all notes on a PowerPoint presentation with just a few simple steps. Explore it to work smarter not harder! +https://github.com/microsoft/UFO/assets/11352048/cf60c643-04f7-4180-9a55-5fb240627834 + + + #### 2️⃣📧 Example 2: Composing an email using text from multiple sources. In this example, we will show you how to use UFO to extract texts from Word documents, description of an image, to compose an email and send. Enjoy your cross-application experiment with UFO! +https://github.com/microsoft/UFO/assets/11352048/aa41ad47-fae7-4334-8e0b-ba71c4fc32e0 + + + ## 📚 Citation Our paper could be found [here](http://export.arxiv.org/abs/2311.17541). If you use UFO in your research, please cite our paper: @@ -133,4 +141,4 @@ This project may contain trademarks or logos for projects, products, or services trademarks or logos is subject to and must follow [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. -Any use of third-party trademarks or logos are subject to those third-party's policies. \ No newline at end of file +Any use of third-party trademarks or logos are subject to those third-party's policies. From b1ab9bb9e9a8f1d2f60372d4897eea36ee2dbf25 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 6 Feb 2024 20:05:27 +0800 Subject: [PATCH 012/223] readme --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 61c3206e..612fc448 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ Please enter your request to be completed🛸: You can find the screenshots taken and request and reponse logs in the following folder: ``` -ufo/logs// +./ufo/logs// ``` You may use them to debug, replay, or analyze the agent output. @@ -135,6 +135,10 @@ If you use UFO in your research, please cite our paper: ``` +## Disclaimer +By choosing to run the provided code, you acknowledge and agree to the following terms and conditions regarding the functionality and data handling practices in [DISCLAIMER.md](./DISCLAIMER.md) + + ## Trademarks This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft From e279b2cc218ac2a2e7b2333e43b10613c47c42f9 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 6 Feb 2024 20:13:58 +0800 Subject: [PATCH 013/223] readme --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 612fc448..f14da2ee 100644 --- a/README.md +++ b/README.md @@ -26,12 +26,12 @@ ## 🆕 News -- 📅 2024-02-30 UFO is released on GitHub🎈. +- 📅 2024-02-07 UFO is released on GitHub🎈. ## 💥 Highlights -- [x] **First Windows Agent Framework** - UFO represents the first agent framework that can translate user request in natural language into grounded operation on Windows OS. +- [x] **First Windows Agent** - UFO represents the first agent framework that can translate user request in natural language into grounded operation on Windows OS. - [x] **Interactive Mode** - UFO allows for multiple sub-requests from users in the same session for completing complex task. - [x] **Action Safeguard** - UFO supports safeguard to prompt for user confirmation when the action is sensitive. - [x] **Easy Extension** - UFO is easy to extend to accomplish more complex tasks with different operations. @@ -104,7 +104,7 @@ You may use them to debug, replay, or analyze the agent output. ## 🎬 Demo Examples -We present two demos videos that complete user request on Windows OS using UFO. +We present two demos videos that complete user request on Windows OS using UFO. For more video, please consult our technical report. #### 1️⃣🗑️ Example 1: Deleting all notes on a PowerPoint presentation. In this example, we will show you how to use UFO to deleting all notes on a PowerPoint presentation with just a few simple steps. Explore it to work smarter not harder! @@ -128,7 +128,7 @@ If you use UFO in your research, please cite our paper: ``` @article{ufo, title={UFO: A UI-Focused Agent for Windows OS Interaction}, - author={Chaoyun Zhang, Liqun Li, Shilin He, Xu Zhang, Bo Qiao, Si Qin, Minghua Ma, Yu Kang, Qingwei Lin, Saravan Rajmohan, Dongmei Zhang, Qi Zhang}, + author={Chaoyun Zhang, Liqun Li, Shilin He, Xu Zhang, Bo Qiao, Si Qin, Minghua Ma, Yu Kang, Qingwei Lin, Saravan Rajmohan, Dongmei Zhang, Qi Zhang}, journal={arXiv preprint arXiv:2311.17541}, year={2024} } From bb9c187131cb6a15a4df761e7b228f76870d20b6 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 6 Feb 2024 20:16:59 +0800 Subject: [PATCH 014/223] readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f14da2ee..8ce92936 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ Before running UFO, you need to provide your LLM configurations. Taking OpenAI a #### OpenAI ``` OPENAI_API_BASE: Your OpenAI Endpoint # The base URL for the OpenAI API -OPENAI_API_KEY: Your OpenAI Key # Set the value to sk-xxx if you host the openai interface for open llm model +OPENAI_API_KEY: Your OpenAI Key # Set the value to the openai key for the llm model OPENAI_API_MODEL: GPT Model Name # The only OpenAI model by now that accepts visual input ``` @@ -85,7 +85,7 @@ Welcome to use UFO🛸, A UI-focused Multimodal Agent for Windows OS. \___/ |_| \___/ Please enter your request to be completed🛸: ``` -#### <**Reminder: Before inputing your request, please make sure the targeted applications are active on the system.**> +#### **Reminder❗: Before UFO executing your request, please make sure the targeted applications are active on the system.** ### Step 4 🎥: Execution Logs From 6ee45087288f61a034911e262de85658831943cd Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 7 Feb 2024 10:43:49 +0800 Subject: [PATCH 015/223] readme --- README.md | 2 +- assets/overview.png | Bin 211834 -> 0 bytes assets/overview_n.png | Bin 0 -> 211816 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 assets/overview.png create mode 100644 assets/overview_n.png diff --git a/README.md b/README.md index 8ce92936..25b0fb2f 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ **UFO** is a **UI-Focused** dual-agent framework that seamlessly navigates and operates within individual applications and across them to fulfill user requests on **Windows OS**, even when spanning multiple applications.

- +

diff --git a/assets/overview.png b/assets/overview.png deleted file mode 100644 index 50ae022ec2c87a7409eba01881c7136a4f707dd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211834 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
MbU|yh!(B%asaFfKXtF`M<%ui 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

quD|9q-itjeO!GxpSr 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 diff --git a/assets/overview_n.png b/assets/overview_n.png new file mode 100644 index 0000000000000000000000000000000000000000..48b85772838d35fae7eb1ce4b54ba5dc1a3eacbf GIT binary patch literal 211816 zcmeGDWn5HW)G!Q>0!kWmiYVPBDWD)-0wN&Y?I>LXNJ=+Ii1z!S(;2TqgH*XXa3?aPQDsNS^-@Y|8H01moY-wvt`(?n^_Dh(fo~x&) zCj@e!@&@uH7-ky0s%MDOW8HKlTs3u!3l4)rKs%oaH!V$rN?0o?ko> zHBww$oL>&KJF9a>s)2TOemQViUOtf%71f#9oVin8UA|iUwz|5wy1E)(oLXOBU0+{+ zTTNQuTnz)-&CQSrcyn{}Z8c|Sb9FromfzEfERKTJBbuAxFc_>8R)3pQd|R!JERSmL z1TJCl>VYWu1PZu>AuvUg#4UVe2Qhzum^eVdS65dL<_~UHQ*Yr2_|C!R=KKI^VsmqIXA^j0b!T%2xd~qd z?(b|OH-WK$7SKlS0F9kh%-0SI2{aBcw>A$@DB!UjHu~^eyTZ)4Bz|Z*M;j^M3^-0PmB6o-+tU&V>2Dqo~Pv z1Oi>9D!zIB&ckT$n&_>;R_bBI&bwjN*Q4b@C~ZaQL|r@A^s%>Gs^hM2IP6}|(b9n* z!N0Dl7zS&xqj%ol^n(sI_cv+d24J|1#gi|Kj^;P-SU(Y zlD&fw+V-CN@cWoXEI~UOa|Sux(WS?nUvYzWF-ic`hhqZ4oIy>X(ubJyQwsmHf1TIw zR!U-S_#1%!zd`!*3=~A#J>bF9` zy?rc@1!JXTtoENI5C0jWMre?ZPC}1ABl!;A_YJRV~P4stQE-QcYZHK-z2_!T+fiwq5N(5dAW$k+=|c;$R1*ka+*cNw59dYVh7rqJ zaZo5;X$7>bbLvr6;SoyN1%Ww}CL_77x%nsxaJ14Q3!@I z4KRlMmtt`0=4EJA*U#UgTFU*eo~x()kr#p&?gqMUG3t!l^6>`;G&lQ`icp#D6gEk9 zrLo1RGP#HuCFO~=?GI9X>~DMJnJbW6)XeEXnCt*iZ1o6nSD@yN>b}e8K>&LC>mMZ? zcLmbs`8M%AdIWpQ-!yQvGWohNGh2k2C3d2R;yUtlG*mv+smL3twFPWzJB1awei%4e zfca?2WA)TmErghDl<_dTDxwd%YCo;rdffr({X^3B2V>~jw}+Lf(n-OJQkQv(Kc~nA z*h)tef2#VDDOP(L!gdLIJjEFo=D%HyIcL@cYnR z48IGO@sP)ihXwCBKqB-_j?>r(t)CMJ!FyNeCP#|OpYh_5l=c0M8!m}#fF*9JBax<% z<0GNTp5U_4PtAF4&~FsX_rmXhOeDTwSWk7=+_5CS?qJA9C$mT|+sJ+fuOn^S%yZ)1 zJ7$f12X;T2-L+?0OxZi^cV+0-hpuxCL#zkN&?SOQk!xi<8y5*sA6?^@(Baz8rn_tV z@UgPs*+Ws!lt&TbBi7Az02cYERE@APr-c1Ntoj%$2nY$$d1lbsAG}r zRa%LZs=rQC4L8DX*i|WFYA|r4kY^=5{%35Oddok%JaWy-Q1M=-4xROREr3O62K2t3 ztQWj@iQFM__-AdD1xL2V3uugnF1^QbixulJejw@RCaJ3;1Qb~(fcP&`&pwOxb_V_J8g_;E zbwibo*evTtWU^+d1HNQZ+9cC__|1;S8 zMv7Jtf()sP!BNv)0gmcB;5B2KD%@RVvE>hYv@~rEgrKJ_0Pgn!O0=Av-kH@&PQGfo ztCcQpZUDu$sDlyi3eeZKYyUM$`S`!X)Ld#67S5~E7vhwS@^-6k7{r1?&2S8W)l%KP z;rusLf*G4`5Mg?ihdL+cuU(-&0qz0xdbq9s#y7>!Ux<)HP=~4zS-tEJ^)hWIj6C#k z>yBBop(UdrT=$}aRGiKZI6>lB@$e(boJ2+0n0Xd1xR%YIy2?RU{+4XIkz_92k}!k6LXQ2df+H$o<6iaFae zPeRvwO_pym_S73gdD)d+^;S(8mL#?2G z$Qe_HF~DukbLb(@k3Dapv-QDcJjrdU{7m`|Nbn@=%?`yqjWtYaObwCpUEHrh}o)9K5}E+g!UwpQ}_5_QBD6{W@p zBMMFjh@3y~97w7MEO7>U1#mU0YdRieA>wuZF5%H*ayEXxqTUse{{9zE)#z{br?MZi zO&_8^14GZ;bvBuRqg6ILD71BSe_!#f8v8!@kbO*3x$RUUFQck41HdfA9eph+M-gXH z1q`h#{14{cDG|Ok^g;pklW7jyrUGU2_{H?@viO{c*DCXoCiL=8DH_AMpKbn0005s4 z);nxv3nALxmO=Es(vN(O3-*k?isn4@+S)!+~G2Y zCf49Hs%je=sYoXO$2)**(qg3iPaJs-|2De~o51hqiFw;`lv}U<-cbe(eYihT->wPLFl2^qSs}LmJsF|We=>#k>^EffOza;1CmQ4*9t9) zhT2>8{e{r!DwsMx0bma{|O6VBm>1l^2!mQK845w8a}0=$LT@CY5C+? ze8nhAcDV+Z-N}W)ZU=@7?XUffHd(%dP|=P>C0zkC3RT~mDW2tLoK278m984QzS0LWVskVz?W^t*CKa5bHNz*1%2wN?W(Lv;LRDNAH z9bTIc)}Sz8@%x?vBCMRcSFCyV(NkO5hf923lj3){aP&hTo=;wu>5PRqiD1jN!jVD0c+i^k>mO1cZoKEthQoSl+(v2gTyG zqu-}D%H5edOK$kK;%KW!@0l(7P`%$p1n|8RUNd36Vg~K%W1;m$P7I&e7!>8**bp=b z;=ZeUbpe==2kcb;98e&7oW7St2ul4IT(;W)_)cwyG04r3^e~-WOl;mHG zrR(@__CGQ=KWJDn-2ul9Gu6MxfH12M`(M2Jo(71C{?Djb|9^(EsF##9El&A5pEd?& zXCd4GR!V_z2m}g?JPXMNKkGxUcZPl9nR*C{od#yq#TU@h5`f|g(LU_$EcM4_t-mf1X}qP4_m3e)pw`sX{Qvzbx|ZJXbjH``g9N zMQ}o3d_i;wWaIR3N+0^m@=Y5X{vaa*Cy{y=dog=r%~D2Y+Ql4g6L33sJjnqoPg=qM+cY2!Y@*59erYHO=w$f;C)U7+Co+tGq3XHlgL7+Jd zM5o&*Qb)@NL-l&#eO&Ui-}si}VTOl9rHlh?&&C#{nhiUz^IQm?$|R zdCr8mW5H+6KQ^B2jSb#)FO~Y5m_1J`U)H}EV3-pQ{pr46pft;N6kMX8vGn(z^ zcHQu~@y9NEeP&+i7ETRCGX;JJS4q6Co0Vep3{ak{7$^x4jJ*WHTTOulP5lEdw&P@- z>A7`xvV$EvV_QWMb_W-<+d^x)l z8$Q?Ly2Aw=@^?@gAUFH@0^NuR7|0^NRL zx&`F;zb`FxZD3A;{g{>PPOHd%XjQl4Gw2FeYCH-3|q&?M;9LjiFA3B~& z0g5F9*hOJP6s&{V|pp6_y5R@VMWnyktl>9XP1(rdkXJzbX^55_kB*mDePoXKpWYB#U3BD@>{*x zXI`hJ+jAutLtNh7v;oZN9RN}Be5Qzq*jY*I*94Mvb3vB7ju_OTG3(Vx5r7=t&@jO%m8{5(F%!{z9Duk9Po0nbvivYRh z=d+7JEyq(Wq!;>;CwTMT0qa*U|)zGggV9n5Ni$~)@1b01oatP_!5>6^%D9?g#mGlxCumgOSsjP9LD6a z_{{mzY+5c&1TV;gmd@t8Xl`ulZMor4(%Yl2Uw{F$!Ggs(%013oH=- z6F?W#4<&L|afF(ccxR~R=^O9UbKlWjCZ^hT)O7w?6<>zas(OC0^FOJY%6#uFerbrT zZ1)F(Y+QH)YVk1tNu#~3&l~SUHW-lfvS0@Ax%W-~eLxEH_RowJtqwFit%{`cLbrQ0 zPU1y;r#M%f+q%acP%06SG!wUibPra;=&CyOO(6C|WTHDxw9?x@bwc-M7~b1Hq9FLu zHyeDe_p+7cFFBB3dyc_EZ)t;#-aa}!{ADHVjNvspaj^gKw{*22^~|09Rwql&Cuu(e z3%1`LF+{jZovz`4EQJ0+#AWKK&;O)V{C+7|mCAm#NC=mz_4#r_P1*G(!(l?e#lKF`)EG);T3`}&=jOD=3N~(B}{nV?T`e$+627Fr(edEVw&!Q zs}?vu*?-_aThJ)AwWB}LNL%1x`Qv|9#&Byha9EAlHWYNwD7(hZ@o&`$0?o_b-8v*V z&$ad0#+7W5*x%RrO9@!0mjH-e0w$ReswYphu@$b}x>A>;%NT?2Ai8%q%@nH&l`|f| z8$xtTRW>b|3`~L>@Df49nzwy7lB*{ry^W2LCj%7P-MzN00{zCH%D`>G^R7J#1scNerOVntOn3OQ}sg5~l~ z@w}Qd2$1$s`g>|9O}@{;Eoo8*8=$OBtM-SRKqA&)O<3TUrLILf+SC6EG>-a(rITv*TA_g#^#5y7|S6|?lq1J zhT+%&kV{WJh79?kpC<}qHQIE8Mu(gkDthh{gfG#N?qKMU1cHL!aWL)b=U4!s8)(ejE z+J*fY#LX4ilaK1CnYx~1iz)R2?_mb1s^>VkD?pOS0q{)xle`knxEQ9aiBOJ9%~JaO z(3*tYz~{dbYM^OpsmCiFapV1>M#Gew`_S z8ZOOOf|z~Hcs%|~RNgV!_-dt_z3FI~pif$MC)aWrzIw0b?0RL5k3Ih$5})C64_R%& zRR*p#_p=RK*k>z)SOrDI^9#Fh{yuA5VzMN945?mG$q^1aV>+!AF|~Jr#$B*xG$s(Y zp$ZBRe3Os3+`ZJhaIU(FXM=?SgKGuwbi2|Ccdl@6yfkF_BHH#e*=#?yA05=){e3zS z$H~#L^spz6*xDB+6PtZ_`ZD#yh8*?cg_HF$Si|;&l*0O+VzYCta5up>)tG1$f)_lc z7|%;i&SvgwS_6;jC-;S7F|>|aRa*ZSeu8wjV}^&S65m7Kuv$T~xFgOq$Y-*Gh=81{ zOnx)6-;WOQ1Yy!^8&mFsT;_t|m#{D- zhNtRQ5~7y|uo+l@?_**Kuh7pHugt?fbcapaMb7CM2$|QxWUHCs!oQgVIoOZ2U;I_B zj~}pAXK_T#XsC#Tx!AaPcp!_4;@-^yMV`jhiUM8>>0Z5?`4_`}Q{J7vJf=>`9eR=t zQD<=ncwKB=n%TD}n9^YjqPsV@F}|?dxmQW9mF688MwgR_zKKQXRl=D z!p~CjVVx=LK7JRxfTR`uX++40b*f4y`tHd%Sz2rgR6X3dLUJ?0;kUJznnS%+3Xn)y z0?_>3t$61u{#k!W0dd#|F`BSadK zfv`l8C7^6y$W?x7P4$yZLgmYAibn2ki7(sNUL|NqKlnS`+k5GiuEwx|-NSE1GbH4W;`YOW!sA{C*FY z$gCVfl3&PsX1lU%TR_>K4r_gS&F__7ineP0HgH;O_2on-ZGIRrvvBjW6HpnhfSdB_ z+1m2y6A85Hdl6Yym(xEQmm$8R{i>gHp|lb^M1=hbmW^jbxVwXXLNJ@&4u)pJm<q=5B0lB{8jAhbplRw$!cA z8R?vo;mdMb&qZ|TA$m>=ob@5)vuD2)zGpJ3{y~Htu}wfZ?xH=}X&-3O8*T@Nt+b)s z?5o{wa3ajYo$IA4(B6wuWHV)JI6*+1uuA|q{vN*MXtmX&A)}q_oH?6iXZZw2FK$wF zk%(c4zVX!7kh{o3rpP8?EoD6;>p5AYl%X+?5q;tSNTHg7JZJH6BHp}LwlVL#Jf3cv zq4^$675C%K&Fr^NuT1?kiMYPBx!EsAc74ua`|YmuV1plSkAk5P1%J2w0X9_y%-*A3 zgRSu(avz2#?s^1_jGozA*RBzZ2y6yINTIWk6-0R)R#yq@$h2@G3Nt^rE*e65sUeFQ zHQ#Vu64xCjf|avAb!jdf8^OPD5HNZMpS%d}CC}h-ym>Af5TSBKjb`5C^4XxDBcq=k zMlz7JY7+IPz2h;)bKUuC@C4Xb*}V&3K!iJp`0}8B$GMd0&1shS&UEOx^4|V9diW&d z?8VV(^WFE&A|AQHA@kD>FdKmlkCQ=djyD1jraVaZ{h{q;y9r5as+KIgqzzYL>%KR1 zMG4TUf#@W#?@ewPUpH8?8BFmvVk9Q+LPJbfDlJ1JKPY`~;WqBPKbr2Ob<>Cr2=@r* z2tm417(eLqiZ~vMxfD!LvNYbfUQr37a~dS4+4bh0D$>tBIi@W2B)7BoG^a)Wp00!a zsc}*ga=%~E^Np|%Hwzp)6J{sMq_1e!2sT!Pjls%_*N|v|Wa-O!Z%f9HS$93FiLyJw zNKEZE+%1Q`5t3T_{GS2)ZIDU*A} zqg@&kp;8;tGly0oUBJE!I_*BRGD|Asnb%q!a$k3Z@P8g^Eqsx>@gin#f|IUlmU&Qr zlTn_tp%&Xfin+5tvb6O&aZDslKd@zQK$0e;SA$Xg$Vay?yZf4%wYD&VJ~bPXG5S3- z)LN+FfW*=UBlbK1I&?4MR0C2L)$RdOmLoa8{)0>3AdF6;4}HTqj&=}po4Q$9gN`Rp z*TeoawtcOJ3JH{)^>J39@`}6<@->~_Sexk>jUYeh-z}%l){igYn_u{KVqW-8U&7nb z9EH7yLMJ?tP;IxE$n=O+Y8YNAKTIZg3OJ5?D zn>{memE~&(k;&}xDtpw`+`0h{gti9NPqT>Aw_64-AE&;z_%DvwL8Q?) z>Y5iq8`{So@k&)2X6M9I-A1n^D|#uD^bkM%w#m-DtCGkqj>A4Epo@^I9Htf%|8q0{0sNvwXxpTNVJwmQzZ@jP1W1Weo-)aWzEi7So=T7U$3+)`(`zzjXDL$$!AzQLJ&$b53Iww= zsk%p2l?E-`erOrKz-SF@S^L*v1IF|&h4eCEaPmy^q3Gv;!!aKR^3_rvW{5G;QpteR zOY=b|^hDkBMNcKO%80q*!U()C*i23&n;jhlQSNZ8|~hQjRq{M{?rj)1ktKg>p+o*Ng2k`{ner)E|UZ179FJ#Ll3`Qus=lho9UKTpdLo#BOT{!ML*wLJhNc` zJv2J%oUy4Lc&G6B@?1BE*ziI+^GLnd;S`|C&3{R!J*QHh&p*wdSwS{^X{q=j zscLUjCyre@J-nwASLoKsHfj2qx4#pD6+>G2%}Qr*7wbwiPHwmt7Zzw9gc_q)?%Pp_ z-yGwsu3F`SS1l%v57L_*-xBg}LLPDs-6MMn9LCvEj4NKK)}WcNW%=F{<{q|@QhZYA-vx$E+`ZS+^C zGyUl4zO_}Fd-3A+C5h#1dGeMk9Omv%UN%a7&hM9;3dIx|)M1=Kez6$tDpTV>HZBD&?|Uz;7c6Da-ML^NI#8Pd6Xa6Oh9uwwJH2OW*VH4yY8^ z=my1)H%%#ueW0j>g#bF?@5tlbArAhQmb3mYxiEEmX*3eD`PR6GcCDMa#k+V&vEO8H z);G2LD(RDVOXS$~7;#wcW3&bAJfHr`?@6D;8lYLdmQOmL9%l2(-@SNObwG1`Dpd5O z9ncL{7~=H==L_xG6X~&-37G5(pg-?XZxB&+PEINDjAo8`3!{y%^n-duuMdx!P3m7q zZyA^+EO9;Fxad~5>U#rKq)do|(Fc<_*Yoelb6xwIOdfr_88~sH^YTvj>Sj~LYUCuG z2X^w{v_PQH|IN_u7YzP3{v+W4n$}AydLoi4O^;u@B}vYKO<83KH4de{(0`aF?VoEY zEBz?b(gCA}CPxmEhrB+cuIe&R74!b~LnN=?-SEbqpqV|grzEvvqJv-41KRu_f3R(( zz$@g)tK(0&4FvM}XNms^4)fHGm zqUE@U9$9d-LNi%Nq+JBGWf>tG6rP5>?!0p<4lGJ+E&A{5rJPg?Oi$M)1kDEf5=c%;mm4W{6nayNO)h1Dqua3&(E`RH2 z3={eMBx1p0K_1BFy(hs?xry2i5^cy0`5;5__XwMCmt(NB`~i!^`seuu08h?D{4M%k zVKZS~sY{TT8tBe^wW^ckS0Sz{YI4Xd+IU3emE%>D=o8k^)60)qjpxG`HiE}TsDe+; z@ZLZiU>`dTlYtal+)9RaoN=tSJ%8xa2zhZspQ0c<<$$G&L^V zcIx@QmGbfl%j+q-J?5t)udK9`jlB<*Yg1H?KE(byf}A&Jp5g5)PojVB0{cd#q5zFG zk0!hCUw&x2pr+6GS`E89h)uDpPUM+UgW|8~`SW921X*Wp6;Y-lL>D@6kPOWr!m7t5 zb{$djzV!RC6p3AdV+$#CP>VIHfw?IF<$gfD1h5GKj3_Oi5Q(9jNn-d<9uqs-wCH6bjk{ zd20W6S7N7&Kg3*K&QPOq=gIR+96!=W6-A(4xwNgT!&4esb0d(AD1%zH2VvY7<9kRIT|ymdR)THJl_^0Rcs z7AM>uy7U17E-W$G9Ld3}=J+Qur;T#aW z9pafnbdt>gBhfngyoKODPd?A0{vU4*2^syyzA z&cv@0v0eaH{j}LLLJK$HHlJ_q13ot&8MeK1gs&dfn#XITEU>{-Zf1QV_wFNoc&wIj zK&3PoY6&d32`)XM8x4*Q@$Ctn<4-bGMSp!_3ej)&3{H)kTkl@jhZ!JPIG~ME8*MT~o6egTdZff5S5lfh|h-eSntaC#rXE|wVK zGdEiiRgw%ot*xr6EMC2jwy;2@900)Nt1~&ZKOl2#ka1CWU*D`=PLE}H-`e7mP}%7{ z#m8I%RYgBdZ13IUOF;fQ3MiUGRG!v+iZAeK4Lr3eZ@=s-RUDZsTEJIMk@Cg^%Xr~1#AdtSeh`!<%f@u}1C5D@yG`zD^cN31v zqP1}4@3^$BmdHOFK1XGFy#7m@v&VgB{?tcgQT*N-klV$^fNNDOFxC7@-Ka{&`n{5| zOOLXEvj>c!6}&k|jBNaYb=c>K7davLWP~_ro#@iSP3LlwGc{VKy8VqqJmSc8{%qJH z)x;J8>}XuJrBZ4cFwCN`owP}pdj{oqDbBIgYFX_3rUzsY_fIs&P!>1t|FvaW2R*KvT5U3g` z?*iHKIZL{niuX@Ib8>TPDo&#H`WiY8^5!s>JeS@ zWFy+P2gi(+-^RXV$Hml}F#+qIu&6!xqfrkPiGH$w_4qI`bBLCQYrr~#X}HLGmQrf< zar{qK_QM+{3hVn)3f49oD2f|_{dB<&0?Ytxm;p8pG;mt7f+7%`hSkaaFcyeWOz*Dv z-+=%Lfz6(ll0oH{S(?j}DVhXkJ;&J-HdFF=2zA>n(k2sN5l=aQ{75W!gWj=&M}&L7 z*=7NAZ!b&XgnfnxhkI6keRAZjDA%_A;q{&UtD&2DipGWzM}sj+D-Tb==AD6Mi1lFR80L<#`!YXmX>^# zqSi`f{4!@|`bitQgk}3HGBD2AYL}Or=9_}oL?MfZdLAxeHRWBqEMnLKB0pLm*d za9Q$4Vs*S?#CPjw)Hx7A^=$*G_(&B3nBDSUf~XsgIXF z1Z-xX8lbIa#|>-1^!mobey!&m-NBE}mo1kkXJF1ZI(8}ElMWD)l*4#0S0k^_;thG4-J>lrL@;0+K`y-!VLyr&%cwm_p=|AO0k6))KA<5 zs2m{_l70sRZcH`Cz~MzosdhBK*}b$Z4N*K>$^;@yVM6wO!+`=#VA5Z321$LvcU(CHw+?TWZh?<%4 z`x_tI_UYS{dLKPaMiL4|KY^HO1F8v^QdoeHtQ07}@J}iNQ;sA*+P$1!W*q8P{#Ab@ zN3(k}!zt26rK`UQzB;}Vu~X`1S$4}+ch;X@52EqF_#T- z>YYegv_mP_SXGrio6_P*_U)2!aXY=GThjH}0QRAu8XpbKIL(c{=UrfXkR6kV@nE-d zaD$(h7+)i$S-Y@M5EjzrBW3Pn#t+MqencVr`tCQ!uZy`GPHNh2*sLLK3p6(`$gVH$ zWj=~Y!Q z$W5BO&&Nv1$QS)R-aLXYGDTdA-5tzUa!^5MnX&h~=P&haZx37%K(4167vLr49@R2* z{DT#AxvZ&|6X|{zHGaAt8Gsn|kptY+^{3ut#gK1Td>D9IWhW<@ z#0E^An|t%R@tHMbAsF3yx|!~WcZLOWz{NbR%d{&VmZJ|3CY2C%7$yl+mi?3FonGMlBOsrsw+dj@H58Z0H5x!twDG>FR0$CgX)MJIH zHaYN8gTXEd3vwodc0()hg~jp2xiokZBF3*BFoUW3>QlllP5P5_U;=tiwSdNxxMVxv|f`V>RoB+S~ZQ5)8`r$uRLek5<<=inRm z0nLV|F~0ewqg%Jamv*q@!cjN1W44a@>OWbuq&o?C2tNgu4vx}8o()%^459>+UKz9) z?FYZS21@yB1wUQHaeAJzdJY{vIdr-(v9)cw?JsQmTzx-m>CF6CLX;SoU)B3C9Vrc9 zR~vvpp<}2Wcw*e$*$Z9q5dpo>Y5Va*zVik<&+Ggkj7(36ODLih(RBK5xaJ!7s7yfF zX6jtp;eipi0^a{wgzmSw!Rw_sh2@QHW7XTF-?`hyc*`WKEHgKDXdS;7S4xaXBuH%6 z3cF1&;B?#h=!UZln+MZ56ElBA(_B-Nyuhytm+WY$&-R2R{+{6z*r^jEv8UxHW-*rE zbRA+fK>*cdnLIFr*#ijEZuTubGc`4{Rrvgm#_9NCtKNse155Hk^5uj;K{aNNtx4sh zPT=LGISh=Iak@(C4{|=+JwRm7jdY~r{vWtOG+*;i*B{mLn0>Xn^M7xKGM%kIqLdLl zLEi=71L^%6!}OcF&cf<%QIFdP0L5p=Fu%}*ATa&^I3K}cH&^ysdHQ#Ovbpyd%j!T{ z&RN8AUvcr-=5Ho|JN~f~X!dDj9S>LArF2VLpz!|x#Q}&WFdw!49s6+0B|tFLhWt+l z@V4qdeeX}y;WK|R=V69t#I5^JePDbckPx;qO;#!ZjUPT{vQL;9qS}-4g?9A!XrUN| z^pCqhH2zE@{jX~ql!KMs9~epNE+4L20=v)Y0M~%3voCo#>ol_8Hd2Umw0sr7tZ42Z zZmv0-{&_c^e1(6A2J?9T$LPL-*PLR6Ps=5|TXhpola)Ym52!8xOev_(EqVNBOxjsL zLz*9Ysr#!r_^*~H@CsQUGX^qFYrTIGLnqds9)VBsk1+oxS{jmSi@0d z-uNMb;>iCx?OBORh#HM;{k|TJsDt^%&iwCOcFEHTfyB^i!#)aVv4Ji!U@1gOud zCs~r^en*W1XZd{|z2)Wp5};;4=%1s*M>4q6{~FIo^v%hctp4)o`o{mFA!SsZvqXcQ z$z$WwV8pj5)rluJhe!Yyv8w+tGKlnY!u8g2KJsnudz)PeGwuU0{y(E~wGJjqLLMMw zhkN8|L;cvnKp}NC9!AUP>miPYu+M)(oU67lM$QxPFaH}*FFY28vYc2@Wr_uyfv(dg$(QmbU3c6PvL2CcJm zrA@B5kne?}$~e|wh7Y!^&Tj~CTkclQW3VqekZp?-oTh(SeZuyq$IIyz$ETO?|LW!} z+}7|k;({v0{yn7BR5MFM_`b2;+i!r$gzg)gvzTDYk9}951hy3Oa^kCx6S-twG9BSS z3DIqIM7tR8hO2|y1qVCoy@%n!7-Py^(0eQl)r98`r=T6b5v^q2hBxj_gr!(UTSDPY z2W7Y+R|kc?O{Abo{C_j{XUs4dJlEBzVp(@G{4HIH8rpX!M+cwc-Ij~&Or!?0aSwZoG`f!>T08u`g9tjrjwbmF?RjJkyVEr^R-9VIJ+MF~`G6j%6dDq`to;$d zwb1%=f`Y4PHLlF}{0|TFZZ6a;*xs8+Zcks{3WC!j9je&D)=RV4+InP*xC_$N!*slZB{{6| z8|h^@Z?0CBPSDZJ|8{TwIce^XAJ6_w7xPN=dQBY8?coR8P}1#8JVug(i`KY6{$xN6 za{G?+ke2Scn?{6d#pb7H-RX~G&+vL@Tin5)&V_CXQvzIb)Hqyl0)2Cpdr`wg9`Ybv z%=^2gVwVw_AKTu-Ok^uNH)i?TyG;zYmp6XMLA=l3VaqHGtWfR_-mFT`76Be z*<6(BP6vTF?gI$bwu0-Nej8k%THLMp{v=$DCq9hobDFYU4~j?%QFC)Q9Q0aK2Gx+`3qU(U*e zH)N@0jc~lr?*%g4x`oo`(%z|@0C+=JyIEqPXwu*AC#=CNX7e?8eCYe~emq>~bs3k$ zSB^4q7~RL?X$3oD*~(|@JZ^uDwp0Ne0XnqZ&dDNW^M?|r?rVwr0k2ao^`SVW0@rEE zL^BP-*t>(cKHaNyIkXkAZQ(2d<@*nowGr4LT`CNkp4FwLQ*-po?T~6Co3DXx!V+o9 zP@Xruc};ODLm(gO(V_Z6vj$$Ll+7d42~yB|Qh?b@dNM}$@!vA_B&gzKJ9#c|IGVIx zz!vIKCJtVkLV~GFc}Q5N4Wus8E0Fq8h%X3#eZ#tNH{&VOcweFSe& zKp&S1Uw5K^7FqIAo|4raL;+w9|O$uGX`C9y6P zw$#p_K#5AFI?=3$Fn2I(qqTS`kIYd&ZmE}fK*z{+_X8;eHR$~V45+^v+?x%^NbA0% zmEW02qkUwcL>3^4tR>BUj)2hCG@+q*j<(}&%>G=N4O*b>-Kdl6aSTPAv@z*!LK;rKId_e1ROnRElTu@ZkM z=`cP4I-uci$)l0-K0v`(?iiAik#0Vk6+YHr0-<`-G{~d{)x1PatUDx8%Fz5r!U2Kp z&nXkQ5J3eXG3`|+9f_M_dfH+L%=bQMEd6-`tGoAxLiiq}+;N0mC4sPg08>ETO?C8> zmpI?e78f61#{{*cvbLyJ50fDK^DA91k!?Q#{6O}yUYzFWFR1bvhQVyJ=GgLh6tt8z zMwcWyzQ;<^gR!V&M%60z?4Or{AC~geuxc+YTk5bLcPqYpH4PY-N=^)y@J^>i6rkh9 z9-r!9%NPyobuYZy9NQ;{%iF1`_PQBvX~sTI)VS{v-gS`g86U`fzA1*0{0D&kd{3Ue znV(mFiuVE66Tg8rV=d~b^KUmuVz9g8LfH6g{s^bmX(kEToA2(In_ies_b{E}i!>Vs zd00$H-t{TwXUO)Bv9e+1Xr$$z;cyr%Ed8-hFiku}7LRjp)8U7>QGh+u8bF|Aj4C9v zXqTBY+-c;s4r_SbaYXYcJQ=2sKh%~TtMEjuXvT^rCZPI1YTPY?3}bNl27^n| zq%@AMT-CQ+WQ0lNVm{wa7_5HLe&15m?;2lY9UnhT=KZWKHcpfHZZRvkePPn zHU+SoE0}-zNX<2`3CTmZ^K(xEkjXKI zEhX#H25A`QfGseSPcbE9RP96Msj5hU?=xq*8WPmumLi>Ki=XNveVc)2mYkMp_6>G(@(7(3Cz(r-Ez9M-Ij3^CipWmFwHvb&EZCYmRi@04f`wT9=!9ECyUo^ zLB}nwLHFCmc!Tt^7sYZTNCCsvQ$xdqQ7TMj3euEsLw^f^a0=aX@y`l>ZI2c2#n&ewo;j-jjFN$nb>OG8j5%it2M}6+pCxFASfY% zlt?Wlf&$Xrt#tR20@5Je-3`*qBHi6BDX_p&ODy%?{{GMN9`A>DzwRE_J@;I*Gjq+H zb6(xbdv2KeOTLhF6y|@^Sh!=J8Jx-G6B{#^EFW(lM(U-PiPdboOBDS}>~M#lS`3hV zM;sAgzWy$a(H=a2Yas&cw4#!To#ae!z1u?dO{iytQPsL;MM3q8>q^?*ltu!7=6~{z zsjpkiujM5F8V7$L#((&*e24?s^>SNrUKe~S{ObH&>FE-^G86$K!yK>0bPS`mi`mL#<+&aYV!>0Q#x@o0NQ8}0gtz@Pnae3VrX^dkVj z!0@$gK8^v~Tyb#AQ!^fD9xWp>P1=^d;4-nCla@D8Cm`P_JpyZNrCvtMC%|3B4h5wL z@Fomw*cqIkUk1zK;bttCn=0JC8V={P*R`w(EDFynGWK5SE%{m(ah`VT^CJXpk$S29 zDCQY#7|Tam$IntWMF^3S+|B<;NjeXA63R#$mNWcavI1L~V!Oir-|Cc1Kvr=W9OxZH zx+W1|sI=bF z9HMw9wl_6|l{ZNiGku!!aje+H-}~z8n3H@hwm1&}jxfM$1AxlC*ouYLt(Q@Zmuq&a= zW&O5UhOsW>U1#ia?!LkU3W^2bqM40XDqAkqluD{!EWGNe%E>7?b6s+fea(ue{#~e$ z`;hd@-qLQT(lhOT@mg=ibPxBd@|DBLAaSQOCa>dJHW-W#(=!f#-bTzA3D6f+_eYCz`;JetUqi092DxX&#nD82FmclTHqHrJ%S zN#MRyLTt{iMEPJ0a6VKltiEyqv7Xowfx8MB@L2t9yi4j;8=Dhzukp$>s}H+h>*`}% z**JT=6~jge15{mOF1ySLBQkc&b9?5+kkoFFT&~i0Z}vmhBU|qEJuwKyjB+Ma6B?hJ zW4-(gBcv|O>0nT9oG~h~#a;2_M4dl88yA5CJ8#RRQh}f_11|J8nO^`tLRr_(*u$1Y zCFiN+vgZM+_>_#QRLd_c{HJjWDXVrR3k@=m>djGn&ju+q9syxqetup&)Da&a>6!TC zR|m0-SK&r~Z_Y_>nU0p3G^Bh(^V6;{QF{KVxPLY?Mw!UKii6~d1`T0Y?`neJ0sir` z#0agYYkyrm33Ky}=1!)Mcai9>GSLk#hzmmsN?K8k?V{~=4^82FotypXH&NK^=)QhN zj{&>Kj46g8Td$XPNrzZWk7s@-Azk$f7qUG}dbhMUW@!p3N+|vRO^+@p?>I!1eLo-; z{OIfeH^{|)5Y1RA{J1?+K;(RBNl;I_w)y5uv9q(Waa>W0=u5g$?T?GA;eXa9RCSCU zCoO6les8ck2;sSVT)O)XU=_l{3Y){jr(5$zX6N_b) z-BNty<1kLwF)zK``$|EnWYAMfJmhS;brVffxFzO(0fD**<2$9~BT)l5o$>doE_5H(0r8IqZi0AvoA*COJ!i@JZV>V!1x_@{ z;q9EE*!jiiPlJLXxPl0yi2tk0qw#{6W>|>ZOj6lN7ca7PqCrXqU@YCfd~_7OB!TgKEY(Cy$PquxqN7W#iC-os1nfGZU{ zC)4mlr+`uK1A!E#t!<}hRbZFXS3|PN{L*iUz3H-VZVQfZ*5lV|EMxF5ORrMZI$rE8 z9rk^-r~I5>{99t`3Zq^5AeR}DPrsSX!XC(Yu=x!CCbQSCFBAoZ0yu7-Mv_~zcgo4K zJv}5)dH#vQNcyYZ4By((Sl$%f_vdvXi}xgls!31tJe~>$ay*5XUVCN*f)6sQo+x1} zF?;aFFM7q)=NPqJDVpu+i^H=$=C>ceL-C@B!nrJLJ9Dhl>!XR#P~HL&a5H5Y?xKvD zhwsl$+QNJxPKLqtT^4l}bL?o1E^;b^KQj4AaF6EPlaV`0TD}pCQhnIt)69a)$D5J0&q0;rRoM3n-2whwOZk z;97QRWOmM`1B*1VBv3*48(ru7)o|`azBWT!+igv$6NF1N2!d?3S2jN_%ehLQ3oQI% zDN2vY6CuO~ekdMTG5??lF+RXaoFJycpVX4;oPeSJZFB_TqvZVadgfKoiONu93E8CI zPiCb=9=hk@3}rO)ri7NY^jl441oer*D!1QX#q#{fK8s3x$Mxai#547xkS?c6G89`P zFS4MUsbE||itFb|DVY!1QT{8+JP~FY?I~R0>-Q-B|21p{$4zTBz*x-SnIEjOnE+J7 zbM=c%fE$WiEPtd&V@nAeMY~@C_(1>FY`p!R`jqD>p(aK{U>7F{%Zx;I2Qzxq&i-w4 zXrDfbead0298qz!4_7cGR4DkWh3@<`0HBZryxQxi;51x>w&W9%{rqDH;{lAV-);@I zwCiAV>2hw&aQ=NMpV60v3UNauIV~k#(xdW3JZtLSPg>MJbB^8{ zj9x@`v#-gWa$>!{d;+&Vw|6t#VM0auhfdIdU?QK4?mj`gk6}+QXH4BIgyhVtYyIK4 zU|dM%pV(WLT-&EjkP!9tOJpsHOOxu%>6qC6=v*_h9k@FKapEEL!d5Sc30aQ|;^W=i zSKA@A&D9^X06j-x0M1lK8|&ozxlk?9t|W#Ye~V+4ITl}!)fmAHsrRI*l1s7^-(Iyt&gb=cc9|`Xib78#RVHg|m>ub9H*|V3Y z`HnXQ4e@8%YZ{Daq!OnSNLp0TQxtI^M!n@`mI8NOv)>_q)BTbh)E`1A!=W`JWg=&X zq)7>n_XlzqRe42lpN12*cX#az2a#$n>y34NTq8AO*5COu`f^Rmi*P@4I$JhaOGE5i z{_nO`-Y#r3lz-SGd6A=p8+|IGKF5h!t=#ndG8OZF(Qpv_c*V~=&@0r z0+RpWKISX{@)*k7xI~=(`|m`DxyC-`e`4xBGvk_6#}41aZ?s}*UC5n73BM8C(M1Tn z*K!1@?ElS-Vi3){KVcu!ojm)ty`KW!6WA^2=+z<8nhsgrEsDvy8TXG-!k9ta< z#|^GF8l6a{>*On_kyM-@`7592<{p|8H;vXD_deV9r0&-`(gucf1g2E*n9v%InUHG!tsHJbOz>F9?Gui zu%u4-j`#{mT_U(HaV1pfwO+Ie{?bqB5jT1Va$y=^c_)yUKq>$O7l(ckR56k~l z6vSwouKDVANwUD_B0DyqJGVWz(P&Sy#3W`OK9vz8NE1C8OlL^`@%w;Al^3o)DG5m) z7PtW1DZ2UQlHB&e6rjO)wxu7SFO3=ek+`GXdt2O>wDYNJ>v~)N4r{;OBFY|MJ`<efsrx*d!}&Flk?uuuKga z+i}ilj4g|4@v@$G{p`pI)Tn@Yr}n6SFu@2d594y+to)kbj)4NKZ`3CmY_RB>A1?`h zz}>*;x*iL;{DrA^yxEUS6CDT~?yIZ(_;7cI?LZfk&5@h5Yt%m(^`GC}FR%Vsv*2R- zm;7SZ*<(j7$QbK+*%M{APwaB`^bGwcyAh#M3EZJ1uQKWYf9QEIaJ*!%E-#tT{I;Cd(~cC5CVVJo|+R zIAr{b?j))&4KKsP^Ij}a79`MP-aljl9$sy4L1p{$NKE)`Xxz;^LWJ&$H!G2rV~Wbn z=Bk_MZV;83Ft3!~Hk;c?q;0~6EgmM2tON(|jiaIfkbm*X=EbAcWdLNn_(@OeXzh@d<063$MkD>*UWzBj)|ryFG04}w6ZJTE35JMKdJYiehIkD}sBor2EyHJc_= zPz&f*CEXS zvq~@~zi*Lz*u6|y=3vWpccq8_?n(STh^Wx3w6ZTbGfEFvyb92Uf65zIA*kN}(f9it`27EJ+j9L)DXXp~I$Wq_`VB)d6OI>++EmqV&(E3%$Zi+VV8ep1f={27Fm`@K z&HjdhB8#VGI2J(l+=lNY73in`@<;5@0bgR7lKuBBw${4NR9E6OAq+#wE3=_n2;nE1 z+<1cg+*vG5fKwMz<%Q|z=6+aWcgQ_n+*x=n4|Ku-?2Gl_Q_U}q4e?poOUATsG^#hf zJivv2rt?BDw58;)deICq3xs^Dr|? zIlzyF1E0<&@YP7VNzI};+Apnc0%ZWsI1V7vV4E#-TB_~lS@vckKQ7rt!z8crc-bQW z)WNi+p2L=FgSx>GaBB89*MIqy(H0s^SGBd-pmx{k+l2@wx$Fg`x`E&iZVeAVGm5oL z402@YEqhaS0fJEhA7$YmKTHCfdbO51XVTRUyL|3nuxV7X1^`MMc=uD+Fm;6xXjS{W z08+g1(i#`x4w>vX?T_ZKg0j!rRI}v48y0Xu2f&7`_#09o}CBh4!z!2f$)HcmU-@z6`4gfN8FdvZ`t{am0!? z&?1J2w(>nk6zN1M$~h7x3CSIqGbdr9f`Im`8G+keF_FiI;SdBtD%0OS2VbmD^f@IC zg2((^^pV=Lfl4elj)BVO{G&1N0C))%@H&06r&Q0-wLSTrJmt?k)I^;F-DmU=Pq}4g zgzr9Dn%+{lPOIHH0=qjvbyzX3*Efvl^G}K7|C8B=PSTyA@WnCX_Y9|I-KNwV)Yuz& z{-h&T>sp-eLGtKxO>=vsKa}YQ15rf{%|-Z6VPOpsIXd)5+Vm^-LuyB-MSBI6K&@E( zGPVm@kh#B1{5Et)MN~YD<%jEmtZT-ohKLr!)t@-lkvH}dA%J07UwoFdUnusmRf##; z=Sg{b8!-wqE|RYXd#ol{Pg%dYm8EBAiIrZ^rWeqS%{~YCJde=yx4k0Qt9l;%4w z6hVK3VJ%Bi%+x0p_LY;W5M=TTb$3eFl!u8Ln!e|d);Cxo7QLS$`@Fp>lSM5=LGXVbbLk0JNfxD{%7sb`h=t*^*gw^ynY{+e375Qigx zAb3q&2@`Rl^LA~AgIsk%-44Z!2ic#VWXXbkk&BG93TsNQjIrk7)Hy+Yz9340M{DV9 zj6!j5nl5WWu+xrqHOQZIBcYArijtK94BjOQz-i z6Kq5Ls8r4M+A(`Zp~jb6F`yNt!u|+=Gl;f^DI+!Blv@V#$|P`X>PK42l1m$??+vn~ z>eqe1HQkG;Z<(trT>*HM4$BL*h+eK`%^=Bq{W0DV^>y_-zE$$bURASYDBe(16IZz4 z;a@WG(U}_0tipsjWgpxD$^u@6(4oTrg=ZOeGy87H21(MEv^wV>8}*7$g1J|(5~3d8 z?>>FR-!FY@khq`*D2?wfwc+Voop!3_c%AhwqS)WNom$uL+he$LL+nxgKiz2^tW)p| zyUp!@G;i-1C~Kgu{^(CgM3NhD=h=#U+dj{ks0!Dz=wv??ZDF=9WuEJANa{s4X9WT# z7Eu0@I4X(ZgGqzAYjZF?L%_}xX{vro1k*DyX|929*Tm*u;t%MPBR`*34THD#w>Tt9OCY&_Mwq?79QzG{lzk5=31#a+O}< z(FhEU*LS56V6{YMDlGD~?klgKk?uOw8rUIam+o>kUlv(1z2l8yczO*}o73*S*#QRE ze7riSbP3QBj8Aa4pTOTnygKQpIw55B?)2{q1h?jJDc!#<2xiy*)7;$p=7ADJFyf(h z2e@irv1GCEht`y;0GBF?w!O?yIoj|aqCjo1_$S)@7u?aa{dD95ELJU7lz1NHp)z8P zuOFV;B^le{mut0u;E_d{Yoe=JQ!g(TvT!duF0p*g*SmYOQ46B-+F{CGo|&`s%m94b z@HCYytsjg`9zTs&c{_#j{@X3{KAE8Y21;y>j>7HaO zzjKhvGOva-SkiS6crFF$lvqjuqURhI^ru~4vg|g z85C+!scO-w`(A9()7}4G*usIKFNQX#eEQzR(g6KG#;DWJR&;@+5H$F`09Lt(vYa zNe!lN-b{C=Ia)MonTcxP{B@Rj*ozbA5-9eWGs)x09=|dNrMbw@JrPX6MAEd%5O3~K za5!XGr-Z&(s#H68(rybO`;#+d+h8`f0e z`%)GKQR3Y(O|PC68tI92XIAg6zpM`%lO2JnMBCUTxbH(BR`5Bf^u=nVq zV{$0o}!^fWY}r>U_nh%A989i&MaqZ z_|Y5I>)^a=NSDF#cXV2!P}Vmp9R~O_!0=v$J@_qnpC@#~WZXqh^##~39`|4!I%E1x z)%2Mcfq50@{|p3Yx_<#p({gwG7a~jx@Y^Tu+;aF_nOi0&MP}|ePLUtdr#dKD!BgJq zJy10YP){~MFIPffGN|3Y_D8W2>3`q{kNO<^xNv^T4YST2-`hsgW6Nuv3S@WF4-Pb20 zIBN^ZZ?=}>*Ft2gqn>B!evE;nL)}i#0qn7M(8H<0cZ7BXnUDVyb(3$-adVDBka|QM zR!hW9_1WRJ|Kz$%6Xyd*YKQoqA^WvdL3JICG7sx-^Rn;xei>am#AyX%FEo+&J>_#i z;xLBPB90e}aTLIs1C9zpxu7#N>j8#Kh+{x>ZkV~~CTzaoVQ07mYjnI4b1Slr*3M;$ zLJ|kyz{hIe@BUe7---QWBAb-T->po>e30zDU0tiWkqYLAR|pB4qdb2G^2tZ`{%)Sa z^!OcWXjZp6Jv%tD!(~DTPm}I|nI=cW8^*G2iu15kT@eds*`OZAU16y{HSJ{K6N@>O zh7iJZf!So(cRB_Ezc<7b-I{4z1kdwZYmI0s?RV9QTX%YceqanxX>BAKgYiVgKX9Na zI)D?9@3#V?a@|uf1Y_D2D7#no*UdfDbN$w?^X(R8*wF^XF)n0jvLo38~@%wycQ{Ig?ARoM%Q9u}(*S08QU+em&FE+v&0FC9N%L$;X4v zwtfDo81=$e~r=djYvPd6x^IM!n$n@!5LII?6D zB#{1J@)Y>f#OQDg<)5^_Y1VM?|C{9U6&;Clp_$k%f3*%bHgg#Z0y{wfE%vnH2cpo&pW^-l z+Vt*rzhmkbZM>%5mBO!x#nQ>YWB^_m>^eXH=bh|p&}IsbD&jum5Ng@nQPQ9 zfPM37&>9cmBgg1Q&Jk!Cx^V+%DN-fZt>1Z8$%_GANGMqeJeOi~o4H90o1q_Y0%-?7 zH#JvHq848Y+tn2pX617u5T^|<2OM3}>u!A+|5TP%D$?U9-tFvSRA=cI?s^YBUW^y$ z)k=GANX|7y-fr`28U7=X1y1%F89NIJlNHh4NfEB1o#pgwACw;WzA((=4;`46z~7b| zgClI_v0=LZ_`iU=4#MmG6&%}8VdCtq3Y7g0O<^BN5vs@{c?bXWP-^3E%UB+-fYG>p zz<>zmlK-)=0swJROVso!>Np)Lg1!EeGVxEEsaD;^m+G&ys-2+R)LXSMprhA904D+45aunEVi4`xvzVidLMd*`Bd}Y z_WYZ91WKFl@fH%e?SHbpEAF2iSyXFCU&$kX{Ve|2(v4e`+}Z`R_UFhijXxmI#Bn3u zbeX$`MRQ)?@Dc%?MYzqWmp*5*`{OXg+3o-CL9oqd&0;Mn5%7iYu-;hThcB zPcAsg=FBQOfh$;|Zns@QL3Y_z3SEESR#o=Dd=rJq8!hnsypGd0PX*7 zQmn%0fdt>`?yHvHOZ43-#nWaUB3Ti?^AuX`7Mqf%;h~xYfN-;3xUj9f6vr}z){p?Y z_V1g8>y)XAQ_z1kpPJ1*iB_|B=D$*wmFJkYf%9f*FMW<&^597%(-xY0UsV97>(9Z# z+^jx-oi7&P*ACfpfi4w_R~l(Bi!zo^U%W(H(uJDjii%qxehkwPryVxX+i9Rf^lwk2 zImJHN4h>}LgpH3Mc&Ac#Ix62mlS&IrOQMjTGdhu^&5E4Ho^t(2{P+Yj1AtUuPxv5_ zCb7u!avZQ zeBIsc3^hp|WKoaR5#!rEsq7*3iz+7j*pc44<|+^Pc`F1`@SYvFu0R-mptZg-!hy1g z@Ap#xO_d2<6s17napL+T@~)bx^{xQdOregDa%TDN%rky*NUM89)PuAhsjg6C{l*L| z*D?Mcw#9!Q+}vXZCKFSjv(TewZS$U)avEp%yfg!*45ATHM2@RC;u<_%+1nMCzl%wa zCw}Rp6vPyHQZxDvv(TnLf3Rqzx7ta1lFj;#C;QoBz00NfD`H5@l}1eO({j7Px2CaiKrKJ**`NF| zYHI0QjX@+&jT9luH{K@hifS+3-Wv>>E>s5E6*~KtYL{foUK><@8%eh{SDevX^lwhj z7xjaZO-p2RTIyxUzS08_1B`beh(sa0i0}w^5>isMnkV6IU+omNQ)T2bPtlE}UI;tg z>ALILz=?i&z<8q;EDy%gZb3^P`*q3j`-fKsG|-R-suMZ|rux zI929jed!*wOO;#i95lq+)177`(+xyG!7~KGyE7%j`=urdfQ>Y0Y`yhXs;E@pQlh8RUqvP^pcKYBChQs7UE|?tL?p2>cK45yl4-0?j0Kq{-XF>vy|;<>p)L!kNGXNtO*UBpLVGs zuYq#u_}`u0z(A96?hcKCWtuD=caFTBlOMEE`7{O{VvR+jjjq=6w`Wbq9B)SdCPo4B zc&z*r&-MN1(K$^ueGR3O7I#v*Eg}*WLDawQu4^7!m#b~|kY@sd=?S1WC%mAK4k}hT zQ&9Qw)2b?j!g^~w=QPoX{O}9c=bO&jHK;9!F&h_7-J5Hyj&RaHb3ZqTIi7*SI{%)X zC*9Av7yNGVJSQ{^X!Pr_TIz3TVXD>|cDCUhtN-3!M=9f}oHY&~+iIBl34uIcU8hOh zp&Jj-w;J8xoE>U#5~%hZ3U}*qZrVw?Ov=NQw37v z&z01hB9((C^X=O=c`pEtXz-V_DPMM3z2X!b*FWPo&4Kr6)Oa(W*Sty4OjP$hkG%<6 z0hoPoc}SXa=s-6cH`jqSJ#v3PY}nF7FRPggR~@tBsbw0J_kNO=-LmBSLx;i2<3+$e zaIJ$k+^4JhEnaHoAI(~{8kaYypnz-q)tj%U^w_{Ff2;*XRVco8#a`)O;aOmL?JSeq zm|q4lOP=034UgLO60>$pAoCjHr^hbKfQlG;WeqirID z*?OF;3wp;KoNh_>Nv{n#9}YC-=pGNYoC+Dn@3}&W=pXvV)|0KH^^a+@B&*pt8YOBP zQ5}Y2Pj+e38W-&-j8NXOTC_w6(mM)}!Q+FjQqjQSVtFdFg-rE9;Bq_gRewSM;&nhv zNEQ?VFSodi3acc_=M}rI&&_>!DE)e|Rw>-w^a_c@x*prE`MLq3S&(DU!8}!o=h5_|XexC*(KD#a?)06uJeh$7IJTb_+J=u6{ zD6%N8gF;l+tIB8*yJP{>+jx3 zi})p$dFX3s{>=n@uYFxp0Z(N|KV;F#^p)L8^UH1zmjWTL zP4t_su?wy3pLd>u5cp~Tm9(AwdN#$DZO?_bzzpi$nO*9*V)8rv%(uGh@`{>Q%{m$B z+)-eVa6cZ9wkwTCUdJiVU9Ihl>zjK7f^K36EwY6XCDp~)o{;z^mWEp2=%*ZBoSp7ecpubi-e=Gx}n{F zU(XY#N7JHSRr#;cOl*{La#ZYgKd7H-KK^~Y@#FM{Xz8rO;dh4Cmq*L}b1b}&XoAxS zxuC8*+F)Ux<8dOC@?f?Z%W0ONCKcd@f~_AxCjQz_4|UC9ZM>u0BIe+$P$ttWu{64( zSo!S>gfKmrPgGRFkxaF~eqGe@Pil2m8rhscU5EME+T%libv#0WzKkGdl^z5b;#JY7 z!UsVoAs-9h3Jaw|ZI&@zlZ+J32?_Hy)vJperfWxJA-D$tvO064sQ&|9UJV2WfEFFxQl8e5LU#pa@FS9ak z_A^-$Tv+x;rf}(<`+m&KXFjBp8^*21I`T3zwv^%TN091(2Y4W8}}wQHZhviXoq<~QpdzBLA-KQza zQT3j_$ot;v=8ua4Gmj6a(-#}Ku(RFUGkLSkhn5I;JAR+rzCWkXuz`I!li__(Yw3Qc zWfc*~R6#PW!rsnEr3pG1ots)3S6VtbI5~JaSrrgBf@~EP0P*k%r5o2mL+%6mhVC0a zK8;DC1GyiMfQcqw^^UH@Wpa0f3F1@(Q_w#tO z90pG@@iHb1o#rcvh!uYLq}69tTXp}s6K?;&Q+)@Dihw zj)n@&yQ#9*BaG|Q8zCVFCn7IBuE4JAY-gZVq@8j|(+whd&8L*{j%cO|J~tYsYr5{c zGnNU(s)GvmGo8C1-<>E_dg>2l30BaU4fmt!iH1%S1WY$zXP1^%h;kmo3gAZF)0+m=T?Eh| z#SVdciJp0fc6eU%SkRAOpml`qZ1+YndLn`1Z5a`g@S{&+To|@GKfQc*xuAOqaiNq%;wKOj9%PFt*+mqFFR~(ns9IqV-zZ|`AcXwB` zNJ4=5E)O5#CURj`QK?XmyKBdG0+jp;c=LnyhO>P3xq6gBL?Mtnw=Ez|97GAlkrSFB zXfA&jN(P2@Bi0>N!Wds~Nq5z;7uaf?47OFfH#USl@`e)J3A-n`8MLu`95s~B_jFnJ zU=B7|!iadx~fU< zPN9S0tC+IYRLCY+}c@;zDH8vpQO!_ta+jQ<1SyAO2oN(nKh;9I(I z^zjm{b@8oi{<|COxMa{vz}>#7IQ{j0^aA{Od{yjz){DnSd21E_I za8Xw%C}LD02HlV3TE1u?|H~9=MVLu;rQ@72cF}ns=3v{6UB~kKLio(0d)hrql#Yz< zX2i%9(V4dO%n;EMw!guhTePv&Kv1nFLn!?Mn~9&_G>AMnc7-TA0(NU$2QAGCKuwBT zJgwS|?#ntx??S(oX=7>Q8Ak55M$>%D8miG+zwZRDVote!-6QjI&Qa<#r}`u0Wxrte z@ZTK8uKg2&+Exi5^LiWTgFnB8Qb0s-K>!;Tp^FOxbKCRO-8{k}e0&CpDev%hL7CSc zZqfZX#MmRFV9;%g7KDY*j#G$B@uLsu_O$i(pg=+pho{(O{Hpk^@geM-|&%yyc8Ab6?KmK|9f zV)4r5&0VSv=~D6_+nRb4l-F>Toi%ArK-A6Cw}Q**o5P8o*$XGHO~8X~W^N2DT%hA( z9~=rhYgZT)xq;*RAAW5Rb;k+(EkvwR;?c)MjdFwUuLotfQ@6Z6!yh0>wiZvYgNeuC zh_vIGGdUNL;>9f8Aq>_AdPmXXalXjv9AjR42hh7BjPSXlwJxoZ3?eG%do z5g)L}iOG8rQ83uU#A9=6Kde)B-C-M`qtQoPb<8UyC$AxUgUfYQz)r6qDNTj9jLoydV;c;}n$(6=8 zaP_MVst$2s5OJ6LRX33z^)R>+fSl9NlufsD&c*3_WAN2$c3=dE`X>dp`>f|f3~@Bn1}2s^v zWK2y>%hXb-y3<}YgD(GUbdM9axWhN{uct-5Jm9GIU%I+)#%0tG6Ew9RL2T zh`By=pKOEsUT+}745{X>LTu((yicfb3<6eODPaQ_0Bn=M%XHT>Z_nzR#9c+ek7sP( zLc>)}`EcgnKUTz;(kU%(AKSOvNTbgG$_CD~bYtnyqW@ukC26uiN}I|u@wwXV*Jp_sd>umgA77?9D4X2>3ciRdpL1lkC! zHXVg`>5DeNe&^wAldmhs!M=iXEY~LY5V-f}8w?w;*i=C;WjjAW7B5axGKo|ZN>*wY z#^8o|$I0=;0_^$H*oGDI>!$C@&T;JIq45nXHH41sA`7i#MD!gDkXyhRpiBfHdap0$ z{rqmhj4zwkAD8)lIJeBrSH@5)^p!x+Nqbmkk;` z)*Cc+4Sl2%^xEc-n|>l*m)c2XT7g$1QD#Dyd*_eu+;)%`e{rCf4x2+RdW&ddET6L8 z&UwBE4rLo3s((R$dIU#FbdI@r9(8eDlg&kI)k7CnsKmV4PZB)O_-kX92d>K;_2rq` z9Hx>hxPprR4%onkakK>Lp8BF{qpqI?{!g`^c75+7mLrrw&IO7bS>Q6ruM0;v5#7)C zNqr9UYaX@gRS`kDF?6D3{Zk{O$c2{Yo)pv4n2e3fh4c3-i6|QOXX5de{J7M6+Q)J#GI?1v#bsTgLH6CGZ*A0}J2QU}*$*=&F zHerS0+bh7^Opm~LxcA%Kj(pO^8cx~nEEVdQi6Ib=Bb&Xw$#xaw9ZQr2m`&j@_X7Ip zHogfas!plz+W&roKXnEjC&Gg{?+DWrzBUD4lndW-u6I&Bqs|v>scSFU-F;iMA?i7m z@Gz^3>;$en)LQu06aHsf(tcOVhAYtaA8)gN$AX-oPPf18L}JoqTH1=9Lw@2}emP$A zR?}HmJ@kni=n;WwJg4&oiO#)-j3;D+7lbc=kYh%~fjYa^u5NtN>!5dub)ZvgkB0Mu zw8rBI*Ns`3Z(qdU-A~J}3UKTZ+ynLb3i9bIF@;eV$Q2+5@O*IH*S`@B`)!w2>0D87 zvkPW;8fy>R%5&%-tq5R}0vbbZV}EtB5mftnp2cMCD#zVqe~#rT%jd;H_pG$bIK++S z2ofWcd`{(dWG=a9(d>CjAQ-#(_sF=K;XnS0Z;mjbD6!VJ-7}8Y?ZZ~u57y%+1dL!) zV>(nG%HoID1fv{({!ua+#lq&UdaM0>-MLHk!x+JtkE&jdpe}nV`1TU@qcT5?={rK* zA!NP=D$&{$%y+oa?LA+uNAH~jfp7S=nH+Srm0(nVIl!xmMzk+^`Vxe`iy&Azvwu8_ zXzT>d4qvgpbc&*}$FGw}-AbHGZjovNaEl)uV0|Q`*q(}C@KS%m1jJfh?@e3YGd(s~ z?)HuDEAE&LvI%xiLW%6wnjO#ok>qeYtsp@+x4kYKMp|CJK9!Y`QJe%rqwRtmIBUsF z4><>88!>xx?%Jza&-&&1y0N#xJZo1Dhpna913xRcc4Rq;=nv+|wUlAr4d;hT-?G(& zXxo%lEolgt+ov}h;FdG_^E-ivLEQWNi`{WqRE5YSf7=bT0>>vuaX!^*ELxYtBj#&u zS$3>`7kx5K+sUh6{nX2Fznvj3F1qI256CcYi&&!PL%V0!vqJuq>NJXWRsQvt4NDwizg8(;HY{edP$cV(#XzgC?NWV z^Gdlw-Vs(LvVHb_A)SkJjJ3)hbW|zawARK8hV?BV!WLHF9$;)v;0OipzjYkQ48xhu z`rb^`8Xv~(%>9zMc>m{g)2lV!Y~dzGSo;3^IiCtoy(i1E;h@`YGw?-dj$cQ$qn(|L z%R3>E5Qv!cvB{_oN^(}LyS|@Qx_E4P4Ez({4w%EziKqHsC4*|CY4$&5i&5YY;Rs#7 zmHaZ&IqW3Vm=9b#B=1K{eqebT+YUFZN)dKWVG-7+8ElOcxifcg@3kAPJ)66-TE>K4 zmN5l$euP|tEvOcyhcX4oj&HU7aes*^Q9CUmzuHB|^!Z?8GljldBQ_}D1-HUGLi*Rz zo1L9EcfTvKfw!A(<9LaQftUA$?RwL%(1>&wPMZ=WDiTI)ro(YsHmBt~G`EC3z9EZP zK`dX+*1U<4H*iA{QMbP#%{0LL3YBnW_Jc%0ZlgW2eHfc-%}dc>yFHBPyH^-&eTFCt zy6Aw^C_v766L*h`czT*_7Bx$^GBzL{UaofzWTtmL=OkEr*8k&HS@+nGNKsFOb*Sgv z&o8|@Cm+nN+lAxOzHRLu%Zm|1JuM|63F&Zs!t6HJzq^@G&|1QDEJDF;bY#qp=tEny zi^AC02etrVnZc!!Ye8OtDN$aTx?){J#jW1~ReMUVS2HWM(Tm3qgNxd=-I3Q3?_Xc> zR>Um9Cp#L?Sb#c0CN#~mbr%`a4b11nb2bafR#sM=b2Rw# zG`Pb~jz66@!a5HeJd`q6R|FO`Ro&tg#UABHbK^Hc(!{SPrukWzu&uK|7l(yX{oSEi zf+Wh`Phfa62Gx0OqU2Ra-i_=uIP>A>@+G`0Vw#>RG$bJR)4_q$5UC(VnX%G0^zH6K zG^L{8stu!c-nfC9v@kobnoD_wZ6$@~%haHLSK_-rN=FMVXk0bhV6Jz?~QBN~j2Vd`u)gDl6h#=iHU)lnGfjVpANZ^f6{o-=il6KLnJJSxyLAnqI`kScC*8a42RwzdvR9gJ~W z2u@*X3sm45#F@_2IMo4&+K644;4iPu8ME#F?U!Lh+@v-Oxa=yuc|` zoe$9^xKm0Lw+K}Rxm^Sp->BN>i>td-=bU`oJY$A~bRqoBiz*Wr1YGDravL(dhy}bh zJS^KV0VBD!EtZ=3Ysy;gSdJbFS)_G33|yNTu;p~yNcU$`U;0rkz*?zP#)AL5n29bw2?!k0kJ6x%o%Wi%<=u*y!A>BEP zFg}yQb9WS{f3Ux3bpS)z%etZIAwPc%L>N+)R7x4UU4E4Xseuk=27q(3n)uH$1OfRm z5hg1DOh9<%osds{QBhfK8??;J|280}^`w8#Y~`l%hRA4Lw!joj^p9n%9tM(vFFTdj z6tuQM+Z{^8qj>|WKZwSn0b?HWc-e?U}(R?Lm=2;Cvu=oSJWrbtf^jw<5 zj!_Bt7&eDn$LcTO-*#oR>p?!6wmaT@9XsywA#dR!2p>zZ2^vOYSdslBu$_yJiex=` z?V!h*_O^m5q0?eq6^@Fdfvx-s74V&t;jgvO19zC{z|o#}Efs8zU&Qcw6B!6D)Fo`+ z4B@pS!L^XCz#dXkOWr!finJeYwNG|Jg#NXfxJHk>Ft~-y_wCmik7{MbbVv0A32|MHK^tAfIFwq#ntEq2})lbD$SI^L|x@)Bau&gonbP()L1 zeD(>Wq!B~qf4O7%M|`G0QCx>uNc7OAolfS{7FS?y}407}Eb)^wg--TvA@T%-LF(rzwyi@#n z^m6Ba)+q9o`UrsnbUUQL!9)?iE{t5H3&D1%j^Wn(?U4!VM|>ypr0ax3Q-|O~Tbs}1 z1ML&-VBvD~b3G8@;`dtzjx&~`6CX(d8QIP9vMO}&Qb{*q$(u(T?D6gl=Y`TMb@dE5^ z){G^j^c#5fJjjl~3T=1UnLh49qT<$|5rHoTAimy5+ts|`q7#{bIZ@9;Bx<(w^B?OU zy7tY2VDSF-mdj3mKil{dGN|Y?ns!Miul>=Z)s`;79vs6mEtKO%l%9sZ4e(xs`$mi* z%&@%}G1Pk$)fKVhV8}?oqv+FK($js{qZlxvuKLdHe0eg@{}`SrAsQK`SZvj-G~5!s82prd3o9v~ZUs2#f5FG^ z4n?^nT)Wk39(^9geSJzrz?NXFCb2~9Ov}FrGRG_m73c(WB}Ca=ma>PPMF2<_5p($= z)3zHA#pWIXXqyUt4cNacG}9QvRT|;hF9k#TP=!FI(vlKl$jy-dT*t(xR*j>@Zwac& zqn)F$rWv85Rb?lr;F&ncf9neso8CMw+PfnJ!BPB4?(z+=nP5iX!N7XP8Tnc5V1{(F z&vV1O`T?w|cK%6>fRy%WzKQFoPF@CwjUs zX{*pDqlwqvmeuu7dM+cZrTI`N`-xz+8o|LpAHi&;D!;kNYIK_9U!P{4O^#aq+X zaFA5z`~ArY^!CCObt&lI>QiL{qn<9{b2fr+QlpDbpqJs*vCvz&;sO6B*RQ+qXX=Q~ z_FF&0!5<&v^+A@wwE%3{FH0#+)YQ~XR#w*bcJg=LBK2!mniS#nqSM|N#%rE#Zg0TM zl&SAuKUSqjrmVAz9NU+R(e>b{LO9P@YyOzIX|GbyQDP3?0xqho|H^JH=gQFmE`CzO z6DlOF75is`I(`9TS=&}3xdri-^go%m$R`EzlzO--aAYqZmnedaC~gk2vZ0JwN)e^q*5Q{epE)e5Tm&CNC|fn7i1Tp z#P}}dxS+WXyF_|SP1w7Vav*7^T{kZr+xr4|v6Tkp@VoYB<`ZF=t2k3tBQV#{J^T5k z-x`KUQEhH0#zDn$coSLmK8+nc%EdF9pu$(`Jc$G7bRT z1u3dFkn^r*Q#eL7pugm8@KNIhvDwa!CF1!&%`u0ukPl=kEwDT$`eyxcgM-D*RF6W; z^LjpH_M{LgpB|*AjT7e4$Rjk=RQ+DDAPA)v6@7l@D%=#gyG|W7K3f;qr)Um7o>n;h zaa8!S8)sSrAlqf_#qI5-53rLS&@n-#q7n~n)q43v%h4UZ(8E_Oo&ztT-k5I?m6#|q zuouAi!MAYLt!&Ko)%i(2TIOexgNbsWNDn40cB64WX$%*s4*LGf;p7ylcdVm~1=zNu z59zcwG#;US{tjE{GBM!!rgkmoDmx}v#k&s~0ji16{6HZURKm$nmyj>;MosAzk%fiRo=&`Zp@IB@6~u}6ofEfQHBb){;k{3L_a)Q8i)oKU+>xK$ z`C8`d8WxK}HU*rIcdLPZIvpKSK$fNTJgWHd<5Lu4Zap7^$?{Dpfy9U+E_ZbMi3y;5 zg(b8~2@e~wW9aic(}7v}+SxQ(8!-NWwn{>3%b407n3=)mPWcd?pV&S@ zX|YWy3Fv%Qar>D=Ujo(EKQh{W)GVimkXpfAm6?L8+(Y6EJeA^uxYWLqHMO<0NV9#` zu+y|?4R&x!t&mNc6%`Q?X{xVxb;CX>sD?^UHrmg4h9&2D50HtS>OYCVTsuyq?g@6| zpfBt;26Z|`wUIh~mq#`kvC%@Ddgjw+5S2fn=#{!Zw%9r7)%sE^a0 z1~>dNA>`JcmUJi;5yjIU5MlJG!JYB^R-Gm*$WfskM@TGGDpgPNLd%VWs^sJrtU?#` za!fbYJ9AQ_3#tLMseFxT^s)R=v+RWC6=)ZxPy=-uF@NxOo*ix4pMI0HUgQ7)Axa73 zpa1{2-zi5YKoI6BDs*LA+_9@XJX>SdiV*u>qRz7Lon<~m8WkBKGsX?!^&y_W4tR+b zI{Zw)5b4OemWl7bQeOLcH${JkrPwt?L;YpJpO-H?Qyc|J#z=nT)Y)UbkUkGi{6e0$ zeHWtZYS+_HAfcH+9TvUKP_C?v(hK}St&5=AE;i7I2+tFgDXv8#QDKjVxQLM&HGtNL zG{)h}bSwI;jZKsR!#D6ZDLpXCEJKBw0LX}oS%M?TF?~woF&eC%DjpAIyH=c?L{&fr zbWEv(!6_3#iKoOUvz>@PEdw5$?dX(sM9k35+X)G#>vD`O=mos%mu1hFs$>wYR&w&H z3yfei$MmKK;N|-I^ftI~ds2G@Hx5DDo!$~FP4B8tyr;=Hfi8SPmZ4rkG#6%CT1uj~ z4=WFE7-2kAmH9CC#zK;FJu%KaFiaP+KgL`R93NxeQX6J3@azi?!p2>M8&ntXjC%Tq zE?h;IeA~3KVJdet(H5Rhzvf2G)$PFs1X4t*p{jW;`Vc*_hiOtjB2!?&hIP=sP~18_ z`xZs}Y&;qTl2%<*m_aLx2UZMi*Eavy&W~F)-G|D zj3xten*<)l?YB>S2cLcizX4ktAW+}I2EiDqh7*{F@g&V6)AWlLA^~N2xTWAr~?mV4%%V%w{$22TJgF@3jdg8O4XaA-qFzTHw`PYu6XA| z)6~>O7<|SI(@x+|@M}y$DMrVSy5n{2QD!MBgg!`?s zH~WS%^?AF~7|wOO5Ya*%1&BYV1|N-^Ff#yS&#w{lXQuR+*3Njoc^v7?JXcKlXN5qK zQ&oltrsl2ZdI%l*&Zd9vy~wkcA8YLwkc*T#5V)c4prlB~?$d916IDA+p`-9zXiZH) zL0;Pct)fcgHqsz!wv43v%l|&l&jWQ4(_JX#)NBH>gkvB{1brqsX2HA|R?sg!47eMB z<8fz5SfA_ic!V-w8>xd1(MJn&kB(CCaffR)0<>G?{)bW-q9vI(gcpuQs|CAcN%AW8 z)B1CqCLMK`PSGIo@ypk7&FQM1kc$Y`8%jvvQpFqaFHf|D_iS0*DR_(P zQi3n7Pc4iA!XDjcfZ+NLzMRG-_TK2G=n#1)IVVUtsw)DW&-e8%HE#UG3ug4*KTjx3 zyV*WGBy917`M7gp+xW$z)(QPwuRPN{S56q<1Q24!eN9ot6M_lu{fDGoAN!({p7#6^ zCZV@ptE31%m$#v7_SgdxoAGao>(IZ<7K{~AsqQuBuJ+$gI6$i41}i@L(Fwnw#P)p{F!J->h=Xa z+f2Dh5>~LCg92aekB{T5=Ba(QCEQRFwkJBrc+bFRw(EV+W3!fA;}#l$jyg*TR(pH< zlOk?${6M)kTdP7;q0iTJ`4{4YgedOLU0y@6T4L z87p~0K9P;TMt?qhXSw{^$CjI3OjK03s{OiMusEkH{-{v5<4oHs9yAwD6}3Vf?{P228Py-#;`mK&d1`nb;j+ zP55ecKqHjkzO~}r^Pe>N%;6>)BpkKWJx(2NxK2@?rnd$55I4_{xw&jTl0FA~K8Qad zMvm~QJr!N@gj8Uro^%eSqL(Ymt1e1cB3i&$$EpSr27CJscl7G&{=?c1Y53jg>(n8OOdwVFATh=H+5cL}Mg z8mdW{->GThA=d?QwnlgoKIr=luG9KrQAaj!y97Jcoh2c+?;1_IkL+lv&96;M$_Ti> zqx~*?Q*3)hlY=NLOYMY)i#yClV5uYTXHabNy$pu-YTC_Y%(XZi_qIW07`s62E-Sk9 z30Ij3gq2qbeHtz*=c9PCH$Jzh{pFcm-56J=MapW&Xp_y>hKC#C!J1O*X0b(ZLx~VL+sHq|6m{XNJjo=J-(oYS1Nr}y(!ZXGSvoQ^3 zUQ8FRNO+=7HZjC)|9NeODCGgK(+;J)!O4lTrRB*VR`^(VaCn-U@uiE~AP)*3{0|DJ zZe`B|UL|Cmv7$#m(ij!^I@RBo&8#U-8OIam0}#~jqF_Z~e{xLp_fx%g;Gy5aUn_zP zztp2`K?x;BB7oPoT*Bu(r|TQw;~osF{Y23V!mcsqLnAuu-!n14!FDf6`x{&=FFA6Z z`k;XMaNYO*Yrm$UWjcK7l~~^$4L`?-$nCTque$`vPY#XVtshC)zSz5zr|fV!W*x%q zj%Gh$rlIBH%IS#m5wFQX0$hRgNfaY=T}0v1V@i_K(f57_`TyH!zcDopJk+|N{?)gM z{+n-Ma~&n-{W)%)qNH*=oTn#j4SZUR?_taxMGh4eRnEe~BiTL)z?(NHu8D|7-=R6J zW<9G^j|7n<9bF^DGK;7}!#ZWe|K?*gVAveiS%ng#9AD)tyXWnV3@`MT_AAg%vmto<;!e|f%w4L(6OY2`f4^}*P$xyW1%;>K%N zQZK07Hj)-SFnhMrml2PtgE05o$EZ*mjQRC3!9#4JDxVd)1cG@zPPCLa0q;Hy9iVGE zc}T6n5tlERD~I7l4_Qm5UayqCb5uz2RXdS8{y6gAQR2V&48zpa^Ux9ElMO|P&q1z4 zX~}L}t4M>Z{a*M3ktzIiZ3%vmZEuRX!~pfAO4_YzkuujO0pd5hMYz%~z40TS+9hL8 zO0-LN*&&^Z|5mI^#{lY+28x*z9CQ&zdtEtP5M9-$f)Yqu`)j9oU5HJe!s5VQk;_5j zSQvj3U-iMlspgKQ?*J8V4NB>Ib(Lw677iNUnZR~d4g3cX@?t6oa6`Um7pNuR7-LM5u|(_=DsQWG;Q z0oS~7FeKAaW+-8lEqk0kLq|wqW>c^tL|&xQ*Ocde_jB`u{n_0V9+>iuDDV)}YW}MO zaWt@j@kZZo;1b;tcW_+@Mopehlp(`)lakt=R!qBkA!kg!BZEYQI%;~G)CSDJ2@_3G zIKV-L<}O%6w|~fY+|M}mof={QIXfhKtid&7Q<{EPNvD*fn{?bzJ_!2lgowu~kjV@f z69~WbxDi$qGj!z^pg-M`yz46?=F#@`d3%489W$&P_#p!10%ql%O#yLY|1@Rl92l2_ znOI#3j*=77?M>CE;h9X;n5~q(&R$!8AG`==b<&ajEinxX`aU_tU!@-p_l|1&A&Hr7 z(%dmxw;RP7Bj$za;8kDgVgF3HZ z3XwlR5%h-o-b_sOPySziB1pG$Es^|pz`&9j>pqsx|0l=(a64CnNN{SXH99R|;TXp$ zW;HY!K*Tw~F}yh;Y!)OQS1w*hwAVuW4AMK5V^x3qcXIaU1@`CF%%YatCqEel>*j~O zIPD;h1)VcSdhb*qH=8c#*I7d&)G11G0ERQ|sqZ!80ypsy0IVGBW%8KsM?sgPVxH-` zcmmI3dm(!OuSpG8AlJaI@*f|iv|^H0l8l6V%d+{IBoK2v(4u*s7acM~|EwWS`{v%G7?i$Q$Y{}j7?AWHXgh~cpG@fH8gH9in{Z?SVRKA#Buntmx^#} zW(J36dfacSI;6_l!Qungr8^np8WFR)f@08IF#?vfl4)j1K0Tq zmB(E@356KGLeVi5WRWF@_}taP^scUNRYw*Qhz98Ca^T;ppT>a~mfBW`i(N&3mfLCC zsO`vh{MP`?f?yFX@muY6mwJ=5yaDylk!ef0@|a+Ixu2MVd!V1WQ2O5<+tC=XH>UDW zV4(fPY?^F&UCcWwq(+Gm(l>EIGUFR~sDMw8z>}53UNM_^GgGcC9Z0L*c%Oq=z$;?Ll%Ph2b6ob{xzP*93UKF``RU;JvK-u73(eQ{U>pEae>1)nd4J{dMEKm{+Hsa_V{9jhb4$P(>%=7 z*#23lz2&)XJGKUume%>^a2BM`yVCnJ^Rt4!@uWJS=Q3<{?ehtMm?oPSd?t~LT!goJ z=ZyITC5A>i{>ubb=Qo1+pj`@8kGw|!>0UwI;3y*5Qfq`WNcukjk>CxuZ_CvqUk8}5 zs$ZbXv`Y&oBmS3xWQvjpV>Z%%bX8ipHkvs*IB<#!zF@FVix{t06>in)T=-s2Sl@3e zLo_J7x;PU@7KM~X29ys_ceXWI0JMUY&E04#W>f>1*$i=e4UL)ImyL&s>lUhQ{jq0h z^+5VhaLcW8gz^N-)Ts(4Pn}8b@{02)WilnurA-D$28u9F(5O*DM(8n#fsmbIG~u7t zpSP=)Ub=0Vj3oG~7WZAIcnr8rQ3i1vvxkc@QKvp~%esx|RPSdmG84=P9-S`{l=3lo z)3}R9oeb8qP4GLD*Ns~yR)p^5O*EOm87E^fBA$2tvv^XLrP$JtEwvU z@WfpqFQC)`y<9U)q*Vw1S>&C~P5WM8vkVJNW}qqNRF<0Rn+^GM>h3hk{giw~aWfLr z;e+)EIjFf9;)m$g#{p`~ZELmQcyvPIpiEzkgwkAoC~I~(a1P+6>)VWWpz~s6^-#in z2az$yh6X=yF6OJ`8;~wZxF7gY*j>;I@=LeTUkxm8IP66| zdpi{^x1yyW$x|@Ja^vSXi`eCo*k(Lo3@6(q@(#$~=UWS=f2C87hC6EM#@GRWL*Oy8 z-x>iNHiR2fdns;TzuT82x_zM=HUKYTvOb0`3CYyOcC5@g>YOhWur4&oVpc029rL_^ zbod%%Dc{GvJO?bK$%b6oID9JNl?%dVDjkwodqFCFm9ZiC@fA-6Uhvg%pvcHPH}kCn zmE^ftfk$ar>`42^YxR5N5b(i4nUL}030Qw8)p5qHQcNu&1c_pph>ei zmPZj0!L7XV9B&6bh4i;xkfg@{U-%Peiw=Zr7||_hkX=Z)fXGhjVK5#4Kcknu-nIr| z>H^7OO87|GzArdo2ZV#hloZ2=vP^MRLg4SNZ*=!@01b^ZKW59`>~Z={U&KWLx9`r^ zO;?Da@~`V41~$`S?D#4cIHJT7ZRo$lz~M)}=&rJo$4J+Dq@=t3K7SxsllHW$O2csa zXNbei<&tBEy&J$BjK|N-|FmNXBaLHO z*I7A3L;*xAgaez)H16)$7suP06I^my{I$bvxn(Cza<#(oPw5gGviwi+A?y7E+&3^? zEbs*zClr?c5Miw#Q~eCg+VK%2yx?;hM?)O-|}VjMp`@Roh%S=$Ii89(~ar5SyW zpVJ@O|N89rSQp;UKwS^S?|C8kFD51F$e~P~L&xvt^KF_!>8GRdRenBJW|RL(BfXxp zj1yjcWDIBb?AKrvo#-I`u<77Dv{boq+dsI2_W=ipJF7_H(v-E9W_=FYZ~LiO?JA^V zoZYixhG~~3)6fj1GDDz|UxuY(OTt4iT_lw4Gq3+EN#DI-1BH$8gtd-{c2||llaiX+ zRUh!w6j91ZFCf->AkLOoxAJf}FJVQn&a~>wLZ?{}Wckg18IERnH+^(4nPxK#a~((_ zg=06*0POvBIshYmMM_q5{GV3hdR{g(G-y#B=UpS;&e%LT0qjN4X;$Fun2~~*t!AI* z?pP=m17K+9@vacw<*aDwwf(Jt^<<`DLutfQ4{U9)ttI?{`hsO_n1EwzVNKBaSnvZ= zqX)Rb2Z0~O!s%tht=DZqwjJ&get^U|aV#EhUo@oefCvfpGz&NfBW#VNc3wPc%H!Ax z!ajQg7Q7xK5*)@QpD&vHzasVyrJ{yiXG{MZY1bm>po=K-zfBYCw&YIl_TBWt)!R0X zdmP9#YqwkY@x6>z$k z*wQXYWR$34xv-&-0Rr&Jx<7{cJ31Zv!6}m9`A9PG@Bo< z*QN}i)dEa52XotS4fi)e#YU@YxW&o-tG{%F`r9U?3z54jFInjX-!8@|!SYYzPWr?M zy?EYsO>-@PJcTxa&MuYk+Jj^`#CI5b<>%a)tx6e6_R!oP{u_okmQui+RaOHq3Ducp zJVx6*cs6Udy)?}CflRh(*GkFRmd#2# z18@rM=}UXmyv!&R6#7?E4>Ss{@!rPvNART&9Qk~CgrF;%4D2C8g1`HH#ca|!MLtny z_3;pJuNOQ$u!brPZKtSFk{!}9!@3z6&szfP*=by zJ-v2i2QHAP!F^oe5jyV&6FQxO!yZ(m&eVq^8+a6~IS=f|aXzU)34Nca|8emc-ui~I zFCATTWW-1h^Fb1*oDwx>4%ebtQr9P3RqfMr9@alDPI{xrZ^&10%jLc>ex`8xDir6S z%K$P^Sw-LcFYqrM+n_yMRCm$gex9+#AiE*>SYmv6nVkR{%H?m84$&@T-RV2azlhsv z7!=KMGVH%84)Rc@BM52o3)hN+q(%NmXi;{-aTXAOW@ACIRYVaqOaEf(srrMIY2rJk z@*=v3kc~O?O?2DgbSL5eIS>t^UxP323ABvFTaMf`He2`}zqQBXOh_<8FCmc_n!&ru zN3^HThJp$gZz!k@wTt<1yLTj*yx>t0EB?w3$JZXs8HWQiDOT5tr^kaWE>-O(*D0VI z=pl*xP=vwIidoFisXnx)E*3h+--ESF| z7I2f66A*WEn3cBcIWen=-M0cZL1*$yyfgP`UhXl*u@;7uZfpq3x~%_A+ui@b%`I4W z_DF5J_B+Z<$-qgZ7Nh3XNI^BVnJpJ=;7%$xa60PCvA}I_!OvnKw79!LD7)0xAguCzd50k$=PsOuzb&Coou(xM#UZK(oVRsO z(8tugSNzM_qtOzF`mw>E4(#X@2X7x0sjKH$vG2KmWA-B}#n`-k@FZ9r~28}#dun!?@s@Nje z;$=bM#dm%-|OvpQKG7Afe|RPymq@)V=VldR#ExSY6k zmNA~T^gJyI@mvPhhmuKB1M=SDh3N|N67rT3;y9x2Q{UjIguJl?mME63F^21Ppt=I~ zyOx*R(4?Jf>8zl71!lsPbkxlw3M~y=c{e#N4EQ%KP(T0E;Q_(wox!eRLgUT6zF~Wk zpOuS-SJHu+IH|QBsFr3yzWs2j*nh6_dg>0Aw`Mo5&#&hF=Ljt&Dj$NSR6@P(Sj1M1 z9D*174B!}dNtIMG?D<{ zbk4-ty4Z>bEYUJcoRO7y6q#B7herekQ1Sfel~^Uc*i+#w8)-vDYigk#mqA*K&!R-m zQ@r=&hs8O`Jtc-mO3%@I02o7*H+CY5JaXUWaF>%dOvJ$<`aDtF?d+n|cYuukxXF{q z9P^JsK{|eKWd$ z#F!TDK0D{3z>Y#~nPy&_#&|hN`qjvR{!m5`I(7F%@|v1=f8Spli!9^!US{f#j?+U8 z`nX(MUn9$-nK~?ZvoCXr(hEuDz z1jB|aAM|5aW5n(B2j=T>s3hN=ol%D}whl-CXEHKI6Rv!{_4zON{NR zqBu%Ql-aND%fVH}18#Vcb~96`7uU5=wiGKRCGQycqaLCL8aK4LA{K-KoBUnJB1c25 zrDjpVLYl8*_N<;mK<*^b9u=Qf_C0M8>Mtz_#q;Ma9{!r74#U9)Sar?5~{N(7a! zDCh%;Ev?Z-$&aYqg+~uNgKiTib`H?UdC-cX^XiAkYN6tj2YmMDu1WN}l_&1l3tY_o z=nJ}$^p1aoK{X{9p*9eWI0R2z!iesC=;C@^PRL@e9s{i)?0XVcqX>m$<>{}h3Fe4d;&C7l;_-Xl-WVH@4>F`1qw ztyX09k4-q9Cu50x=O+gIl69x9e*4AmkK^ogryRFt3TBmG5`kfccRRw5s6O`idm?4p zvBby?J+J#V^Hg%VH!X&h+J_@?nz&!~5lYtM#*B=NP?INE2@iDEepQ#`im&9!uo&e; z-2?oC;0xk4LPy=?!{S+X!r`PHxGP&z0_k8;mvFlWXOFx4*1yy(;E(#}FKfBsTki1~ zqeotlJ)i?P-`4^~sD39jOL3WkLAJLe)MM;CdO4L=ApRw?k8CdhU=-4z5dE!9FEaxkA+8zr_N=AkWizdjAp<7 zSk=W^>6iokPX{+^Zqg1bEu0oAaW+j8fb6(T?mpc7gm!3@E!fCFNW(Te)+gc?q@|s# zDWa(jyD?EJSirpoAeRf_FPuK_Ir4+J?1hlr@)?(ktdjUjd7WhL6je*CATgt;Pz;08qDM`fVY0f>d|F2 zWf?1=+Q*`YG3cH)@w|myf7t{lyHkrSp_ae19r?V4b~kr%O=4AFE0LT38m!vizI^}u zfU}mMl=4e5=1ZWRFA9IKg6IpreBVIl0uT|(w59gD_&Q(iVm*UrGRCdlA0|a9A_esj z4!>jXo0rZ#=-?YLf=iP*ZJL-p*$IwK#*Tm6TvFJBN|ijgcj=4UK+0P`SGYOz%tt5b z7+>CCLC@eGL)8EnfFV6a*6yi+DXb}!`!Kv}D)Ps>h=k{sC~$k$t6zKU5+FZlB*Ey; zcArVv6x{tMUjp2(81wwL$R6DfJ|3dr&Qcz+_J-6$ho;CbjsIcEOWvSO>j{Gh59-#@ z>*W{q;kOgx@;kG-;Y0zgAEX=TW81={daI0l9iJ~*gQNcwEh%!*m>N11TLdPL$zRLj z!i%l6+XDsbmHx!LQ*UXqeU`Z${oS(}w@z|Wny00OPpGdLR!;r~F1IY}?Qej_NKxzw z9v$wxYkm!c78d&R_z`%tdIw7rty^6i5@5WtWTCsAlEwEjlB4e50!?ONDPK2+$|B^! z`qszg+TsR=`i5dU^*u&uI+LE|#qB>_-vC|S_ZioXNB=UL5*Vm#Z#|T3>S5q1-FNy# zL{@S0({e64ZC%pQA3pmmRHCXy%u$E&{!*Tcmpd$lpJi#U_xW>~-%jt9^VX~O1OBSk zPcktai~jZ)K}>flH6Ol%T%5UUCQ(g0I22vH<9A*SyU1Iv_2-AwozX@kVt3k11r7$DfcjL_5DcpDwoWxW4a=?Yll2YH{}gjPS5 z7LXRNiU;)Ip2$$ltGv0uU9~rF@Okoa7*}T{*RoH?~ICe6iq6m3d3SW8519KB=!R4rI$_Q);Q+tG0moC+C zQ$ix2za>(`F&rzWi(tC_>-QJn4xIqt&+34zrUAV`iUg%GRo?C}*zYFU+l^b#GwRkN zoiMIs^{^Ci`SGJT4$^%1IYOI#LfXC~lKa_eWdGkDWIR6Y%l^dN<6Q zK8ugRdh~^K?l{X>wAGM>hnZH1&w%QetST1Zm7k;+kK1~ffY6m;>#`@f04 z>1h6P=h{qh@7IrN$IVnM$v_#!lJ}33R+KY7`Q#8KMW${YrOOlE{ zZs+~VPKePvMQ`aiilcEJLR6p1%-x032@}IrW$DzZX}Ma~|8&i5@~j37y|P5obhI0+ zi<@z`6L7@;n%sRv32)`45SjO{Np2!62 zCuQ$fv)PzAEf%b_Tas+OgEl*2yOvAuELD6EV0r8D;S0&KjSYW#?mdHg6XSQLblN@? z_iN}o8HXtPKTB%ofmxc$i_8}A6%AOx-#b5!fL|%V0E5lTg`KCjJ3Wg&Ra?6!Rzja6 zt^9_7A}A@NJ2Tp*UAho6l|yEtDf?gvGG6+_Vd>q+ejH1bM0%to- ztEhJzDbeI$)aeo|s+BELyb1rB)%b{}r)033#*k{(4h?msw_FaC0*i_6lsp z>F*h08`0H+)#@E-T-M1X)BkZ2+{jOZ$*2=o`zyyNQqcAX{-adIanOqK$zy}7al<2z zD1+8VL++P#L-@Pryk;p<=WV!9MmBQYJfn5kL$xd(wjJ=oBp7yqwiwH(Fk+l!c_{yQ zqY&T7Ir_)hVe9dqt7KYOinHdYt%PW*N~xBRXT9^_9NsSK=S|J~8Q`15qgU+?q7M~Q zx~NA{uJ`7`E$X&aK(EE6^br;WO->`H*XODGM!5_Xd^1}LsHN_5z6L#*QRh?zdiydS z^JS;UlZls00#Oq;o*6^%j}?YCsp8ZxY&eOQ44SH#R>zW7v89anMd(%K-+Emr zym)9C&G&1dCctOllG{imi72037FC>l>{x)Itf+kBqKRfS&r)bQ zrs~t;nAX`_Y>1vvx<=39B)ecy1H_ZDzkXyJ3{X|{OZwl{}lky z{X)MjAJs1lQ3XwnHCXU@i6>DYI87*X5Cv3xA%1bwUkod97PbBkUhacMlP>r8#J6Vk zP72vg+xxgLfk^_yKl;=2K7Am_jMzug(PaqjrT(oqjN^ftqqJWy(o4CoyF2{bQF4ut z2YxasgR7O(J`P`0O?S_bT=qYZq@Dhpc2xdEh2bq3iIb>rS}Zpg2iy4mLhNq4(V~r695VeUyuq zF4OVc%iWyLs@&h9htQKW%CNkTid9tiGod?cSK3h{@{HB&qD%H`pHe-ge>nX3e>>v4#(BfH!o*lpqw!3M*TcMs#4_YKVBeq8#0 zYy1st*awRxwF7TTc8aTiUZ+}Vw8wI|BhuTxn70ZBUE#;F!A0KZlVif1wS6|pQSUMY zjJ&1`Tvk%%TNh?npC+&_$o(N_Z)jfbdC?>$^W5+GfS2i=qJ~7)Z-EAgqL+I;UB0@%0wo~MspP4Qm$cZ1BoiAOK7X#e zF`U4qq<5~w<>>PYg5*3a(yV`=%Pnh%^eDI+5Aj+Lw`5!YMvB}J)HNh+ceHj|>m^p5 zxZBUJHj|_TV*Qreba?g408yy6Xv~Vv`_lep+gI~?xP#nd1|c*WI_}X4YehdnEhfG9 zafbY(ENKKJLSsUkKT(QZ!hLj#m5zun+Hv=_!xUn!z*Eg*kL)inA|MuR`wqr#rRQ%JHOkXq=^|O|g4pRfb|Qc8W?{O= z44RfeM+7y_H-)u6R5jR#KMXrn`ChhuOi&-U_BA~nCO%yJGq`BlUlgc{~{y$?XZ7rA4lo{*5L!m?%?@W zeP15QHWlaiz6A@doRA1K#B@@B#L&K{`a^2(qENUgfu`<;}ilc82cax8M?~N<$?~nXi5JpS6 z5Tp;IJ`hM{yoYz%Y?bj=TVvL^D#{aBlWpPatD%7P8xV^7;-Y%d$jjQ!cIJH+5Uzmqs zk#y+5t&TTIMjGk$2J2#lHe7?V>hI>UZ`n{~5~Yqi^dY#)lutE(GPR~de?ROW*!JqT zhVvDIYphQXp!&Wt6 za*r%e(wm~xK1ZKvLQ3d;Dn0}A$Ue^|`K@;GS%+2Hj%?S{81~=(+)(jW<8P2_5?))9 zp(lT)pp(~Goxc1Gy&7X7Eht4PuH8eZ_-rGvu}x;MMcoWktYYqaTO`$3@)4C;>U^uf zf^WXc6Srrlfx`WC!E>@}eNpyco$bFTx(mXK69xvCHzNzkq>Mr4cMS&K5`f`{7YE-L zgOh&w4r}2XqZci{{)$UrF1$zlJOzRU{llTuferayfXRKL%do*Xzix{?ZpelWq zT&Ed4RKs1&Zu)^6lyi>DX-94dSKsg8y;0VIhTN`MOHZESghEAKiR-Ig9&8-fWk{!$#Y-(eBz^Nkq#{y)l-qIG z0!|fR)J{|6nZ5sH{?X#enE;c(Mq8LV+RR|Vnk%}e=fd&gPLnZ(W9?_Sj$oQ=h%&?m zO!5NW|%BL`1}CwfdK6 zV;Y^l$mCz2-@QR11KK*pa=cc%LP=nip`rs)v@+A=@0s|m%I_Qfe?+}^IGk(LJsgp6 zBEbqWC8Rhq!_kFML z`ybb3Klk4Ey4PNNZ3Ops`1jYG4@OEDBQ`&{T64mWDGb>!a5^T}jL%a{RxwUFR+FH+ z_;*z0xR9W@Gjy>&j$=IJ-Fe0+(N`TFTjmdMRJq(8Oe2--H+DSA1~K-vO1(YkEkaxo z?2=wpx?DE?ZLUVhQvpn9XKjfIsJ$NZVeQmo)51Be6z6}{L(&ut9jtTqkbY5|1Rgz| z&64H3z7dm6+vvGD-|+68k<6o=lczN`NJQirwTnc7BHuRmJl`J0o!2&L=Yu){!3e~4AD!$8?yqk?{P4B5dvZC5L$X| z(Jpr?&9oXwoh#5&OdG6{^D*fHSs3kZM7-q~rp7PfE z1+^OK0ap1Tt?G8b`sTT;l<&Qmo>U2y4cAZePjM+mzV@dL4(Wn%jkAz>=p`1x(1aVj zrH`~aTz`+Y$4%}*Bd{_`%?K&T`>Efa3}DQQRub0m-}xn;IWfMX>XfS z;0#H}aqEh$Et@Ubqt|4AG3-*Q)oX>%yiZEnkCQS*2zsEDQ|)kt)H_uuAI&D8tUc^m zC;M;m`TbP@%$sh9?eBt zd93{?N$Y<;P6c$=)P9Jf2Gs*yxm6#L5LUSwRF3PhYGLiwO<cm0g=Q0=GNIDLiG44o}LQ#DRA~H!DezJHk49)T7!bl$=$a^*` z{N)IDo+pR5JpzSoWj^Uev3^{LnFL7{bNI8V`saR`YIXh}U5-1pAJ;87t^*mLCd28) zoiG=FN9)}#$t1l>ejy2iWT~N})M)X~nGJn7WbqEL?Zw;QeE^b8jL1mL7^IPGm!zYLcJ+$Abq}|h^Am|@ZMjhL)}tHYx2d*usd~Y z_vv$LIO#o&^WI~3XurZ~AfqYWK0FbgH$BR=9qAt|(8tn|^)FvMy9CGlI~a8ExcP?a z2{kd|w_Ea{^N#(xW3fK6cRu?o-sO7ZO$S5l^QlQ%w89`wq)PjW(>B)cEADTq6yvm1 zCRlJH69bMpVi$hm1^6W~XJ`FcSqQ6-s=!XTwnZ#TnQ_`q)7!&o*A%l_jyzjk3?vVU zt;V$m?gxu|lcXHLPvFifvQl9NUFXw&INqJ>_9q*6P;IYZU5DTC?vQfvUf)|??da%O z{W7~~6wsaA^Kz5zGNr}DSS3$+g!5@EIBZ8Z&Z+WrC#;&!8n)T`$A?{LQXWON0N}B^vHG~ge zPItvG!uJp6;9<_#7@qAcjwZ-~3lOZ3f5?>qRK+A1AQ{3|sBJ0vXFV$3jei~d^Wdh) z50A#08I3O6DVpa~$D7MqE1Tg7gJn7T=n(5dsij3pqK;CGmKy2FBIOqIf%m=f&5t(& zoVPOmi}CAeVqM@owOA28^!$9B_$N;y9a2=<(o%1X5{~6bMHl?3iAqdc9j*ObDIV+X zBCSjUWKDNsU36CU3-qFkpWV^1&|KFRj8PdHXx{r>{`zVY?oYJRVS5FUl7=%?QlcA? z-%e2jW!kdO^<$O;_|pmzPerx30hn=m$~NvL-OPC7O0>))cx><_41>C$;z;2Np&(ib zvLjoQ*ia5Vq-Em(iFBoh^@ob+?l)&y$C(5US!p-vm?7o^=4_gIgGtQt0%bsy4`$RL zA1xOH$!Q>rnQrylzEjLpY3h=i3`9Dz|A=Z7GX9S}vpo~_?M2q+7B>KV%yg31nZ45Oaq&x zm(1pTJhk-}Vzs?8NI9x7u)cRC`QNWZPwAdCn3>tS)LYEA@W`vNEUz}$^12jmto@aT zaAZil2bm*pPuiI)x>Ei}fA^IwSScHOw^iz@np}Oe_N{#%lcd~P{vow69LKB8!WyV&gWdcp6Ym%_x#Nogk~#07 zVk1!&TCG-Gdc!Q!BHO{#N04bK_vh)Y3o7PsEJNQ#qV`pOpR1I>Uj|Y~{J^_hHavIG z#ricO@q5C?+q6xM@^Amf3yeiC{(jRrL`YK)-V+894@or+)`}vfkKgAw24F=Y1L=^)UKyz zm!dsV-hSo5wSTsE5XPrjfd!CTJx#RPFdNzl85L8qswm^bQ#ds*nkRCry;rO(6aULQ+=I43l6Js;RgnZZr8K|>F^! zQuLGCl`$UGbm{j7N^%S?NtZ@M>zoTqU8{wV881z~=LZFed6hNoiS1vYeP{axU+jSQ z|2pTIp(7H9D4#tDNi$6PJjq1;Cgz60y`}yb_+6!Y5;HujJU0^T0D&v$ZV&skGM8@r z02E($de?+odHsS1+rL~a-^Vz;+MjiB{_o3u5+g=Gg{HVP;5nf#ehLL}R>4A%S*&&+ zEcoSCe?ONN6T=v0SK?>bD`zdg7!^wT#S6ub5l*X6;R)gB$wzZu$1Dj|jMjGI1D*Hc zuArp7oIejZT?xIj+$;X{Y5my-4?6DrE{%1JXB49|W!)Jc`hL7l@zUH-NmIj4&z)B>Jv6gx0iukrj(JhWP$L%^>Po^0v z#Ja(zl);;gc2TQ>5SwlfbrO_fgS1^av{(=^I{D)Eq3GB~lI#o7|1xIz;ws(m=ocE_ zzPwsukj_3W`}aM`P45H~!(}F|q`~RHLI*5NZ5=5)zS9Dw5DZ1Mx`N-3hL-~M7opxj z{RrWuyngW?ZaL}BIK)%wIf*&z&A(~mwat*nG?%=>lG7&F#W2uNpy`ZVX_cR1PV`xc zs$f&Q`M@=)*=m%6OUBf6pEYFuaJ$U#Dnv&4VhQ5>+m5wt<W#fcpd-w-c#xT==4?N_~i^qiFl4> zLC?@x=B+pjK&xSWeck(esBT;p*ittZ>w90yXQK%S@bh@{yBFQSrd)ok z-%~l*!P_+7Gw2}-##ADrq)84g!z_D$r!g1gr;gW=CfJxS#77=gxb34qy_0L-Pc~2c zDlP^#70Ke>R<1;IJWpR51k;FoR42&uus3Ijv^pm1dvV$x@{(l5EcE!CY8U242x13Sc8UM%<|ahnzq1S zz?zn^xm4HA3%)y3ZJ!V9-R}6ulzu^>Sm?HD_u3xG3f_TGG(L~z+LSL)*Ky(*6- z_ge0IH$RxV!X zzllF6U0Uy*g(@?b8n3lMy>C4URE|I~{Y*@Zj>4=Wz6<}tiv|v{-#V#Ku^y-2|NP@d zbjRG1uEcjL@AeVrC-eiPrU!NdxfOKQ(B&INO2iWCFgu{IolnoCILrYrYw=xkQO4ZR z?^F5H??~h!Q2n>)9$Pi48L_*=c7HVqWsN+Ss+I}unXTx z+;t&JCbqhmRku09gRfsbcXKAa5qX!hOAroe?>&XRmA$2`?()yOu1idlP#U3mH9=tY zs_y*lw67gaxZ-8QsMDL1FUdC1r<=k(F-3?{#$p`In{{D8#%%%}vf!n60L`8~5y}-B zdx9ZZU*7xxrSdkJ*W*YSA;Rh2jTu%z#X^{iagm2Pk`-6%FmsYlfQ^Vu2zy^gR3q2C$@TO5RWZ!L zfH=&o2%&GXfGDMe49?oJZ)<|(Oru<@;>C|7L++G5vo~KH?!^t|bc#rK6ci;gY4T2K z{aLHLQT}OPHqJ`D80Mk-5DO9xY)@pRrNtaxo+c$H2SEUGP3rl)_ArNWBGIO{SVJ6k zIn{4*smof$T8+ByPxDaP;Ph2xD_~utlbvLPJYt=Z&T#=m*#0@^BG391*SbEGgEx{f z;oOq5v&C$UuPtu-%UemgQIcH#H57VlQXcH(YGq-{oWJ0N=Cd%?2jz2mZZF;6eX_9#T;`+`jG)hDEDkiV z{DVme1{k)Dp`I1MU4>G!kV~;kskubH&`g`6Y+~%TJ9TksUAO?bLtJf4_3ID8nn>y2 zd_hlEL&_|#>Bk#DCZOB^k4rU+T+y|tFMe{tV9tFsYFY$r0QWnkJlAHriQcDj+28B{ zJ}>$SqISqc1q$Swi{P2u=Iyencf@WX&i^Ipb^A+*nx@)Kb`^bD-vSGwen=9zJOhWL)^T;!N){C}!u@?}YJ+q};!vZ&>qm5}JVaQdATgi8YH@(5Uj(*`(+UVvBij)hjx&tZF8e0 z2U8O+8WJk> zsQhIyF6>o4t@HpA_LG9QNMwy~nBuLH z@aKP9$!1!Vt=&xXVW+{g@ueo#il=q^A6io7`$td6q81FY4;%P4T+4v3oI7yWG;s^3&*6hC{u&vUJWnDaqixr@Y~3|IVni5!a`-sq2c1 z^ST@_?v-iqP2ac!B#`mur@1Z(%7(%PHqj&C0MP9#*ydlHn z+p=i{i>=SahdETv((dJGpGfN?&GKpM42yxngd&9S6TIDiZmR4_gl9~=B9fyW9)k2w zHST$s3bs5+#`R^d&4Cc4toPnsl{E=p_L~lBn~f^PZmCviH@K$M7io|#dEfGw|LH%Ylx2+Q^b5Ql*1XnH z?FY1nxM-aE#%*4 z7t@wo)Pdxr{ux04xa%ixr;m}AfVhSf2jS0$8geAR)mDc&Jnrv#Bq-)G$xq*Lr4Lb` zJ-Jp($$g@6!wMKZw+-TL8bZopNo8;HX~%!^&3SnylcxE&*rvqAr!n(=*{~1~xc?8U z1%dL}(}_~08N%4jabncaCjv)$Qkw*1XF)&_#17BLzD!Twl#o_gUGO?T-l4THC+gbP zAS-#BgzI))C;~wAMXigxi!CX+{s@yLno66w;HBM0Y9$^grm6DBTg2#LlE&tmhZB_0 zA%BW!kIOA%`NBr+?9pDyNPlM=U;PTD>sYxR^1i|{Xgs0x5zrY!-A1;}9-)u+%KAQZ zU~1CjQl|R<9WwC7Php&nZ*yfRzzj`)L_y0?r_7+-^1OP#8O}00T?sGk;3z|$p7N^Q zt)W5JYLyBrRO3bS|A_HcqV73Q8X&v;URgtiX%;ow#_cDP_+`;a_>Zd zQAz|^+)Sjk!5cRQ(iPTk8$9S0M@jW=Lhmasl1g@>W z#_yV-xsWsd<2oztk_n%ab;+BAQ?5ETk<#D9sq(V0#?60T)m&HUS7}qPfO<3NmLaq^ z4#l5V{Qu#z8(7a*k1l>0*1Lui?kW7~)LLle7`0}`vaOO<2HH!FxKyD4_~2F+BI=;| z_T@jjZd-a+sXEYY#4TmWjoRb7sJ%vg#rxR8l0R1B|NfX@JNV3g7CbVd9_bzc%WAA1Jl>r={5_SXDXE?VRZgul>fZw1gAO6Id|av#_2&h(wHE3G_+p29&WztYDxe92m_h<%mCW?`8(o2|P zePE{xnLs(Dq6~k6H?kd=uf+!cm##Aff3*LEJN$Yr$~>AhgM43IG*lqYGIe+uTcXo~ z6y$wTjN2d?zs5eVgF$HVaoxnl+q72h))#}7Ln^5dZztz1<{7c^z_9N!0PTSl2TBDipxrNNWw#gyAXTw`rT);x1LK9wdBY*? zNS!GM?4cVyyrkg&r|Yh7)Io1x8PZ@S=DNbG z`_g4V{LU}M%w?uYwn?6Kc}~xQ)hyc4f(DuPnyta3&lD>GT#+HG)Xk(f3L);6qUuU$ z%Fz(s#3jK<;hpF50owcZRnT&$e8jym)Q7@0eo!V%6H9BI2*sb6YnQ;k&91OcJq$lk zFAE{mTUJ4jpbWAM&|FXtWWri|Ixn~)H82+Pwf2Rks0k9nmY!Tl!&$^X<#!AwxEycwY!Bow$jTB+8px1GQ0{)1jW%*6%wn5j`y1YEZ-e1-oQd|*&is>$L^yb2cZesRpL3m{C=MM`su)fVrIbp(M z?2_du&xdJ_p9SPT3L-c0@5ztY;aDAtkf=q;TtoydHO!-??-anB{A4cb4w z5m|ulRx5@z|J289mFZVX#+FYM{5hU3J=J>E#qmiK^UO5SydRd{0VAjX8Fh)BiuLUb(7!S!gUdDLfQ4C zOXmQp*6OyAk73Mg=$0h(o{f6Uv>Q~QWbH?ZTi!^m0v*5CJ;ZBOP(2qK{g_AvOz&bt zCu3Ra{umE`QR&oac(hpdsw*Q}r*e(eR@+%}+p5gcQ#uBO0wHPy#$M-P=j`8+vY$uA zLr#f;aR>Mj%Ao6{<-ixxnfeg9YE<0Am~Wp0ZGIXD&Aeux{k(Ekoe}YWuU2#?b8msn zXA4hQN9{;bvSL?UU^Fq9Gmilq^sAnjxpX=RNi0gMG}=H-(xETViy`?8W0R zHq*H*%;?celRH+k(LeAzIcQ1(Zad4bW$>D6^iURFlx|C|j!^7NiEC|bbsJmhEMRlm z1$nu~*8RF|#n!I*7#@{=<2wIy@+}~OHq1>TapQx=#6aWY$W8tx)RX685rdSs5Cc|% zroYy)aQ%=6zWt{Uuq(I&JVLu1NGzD#G_^|J(B{7RQ58cga`gc z-Uv~Nqp3=aGT=qQvE^vNgVsK`@iQ%BBdmdTF|0irK`}RYFa1R-Oz1xS{yxPwA&p8l z)oRp4<_xjq9pt&EgFcf{axmW94W6S2GHzm_c)@t(8Ly3*K?ToU_7KFQ8w;Ong|e*T z*E70q%6bKFrwuP(spX372Uw^*3inU#8JRd&!e;t_DRP@ArPG?IrH1ldkSW>5|7T>|-05!gQYtKELhjoB!MW>uvL_|I%#_fWz3_=|RIpAF#U zABYagkrexoq%ZmqTL>ly%J|mdJnbU`Ph+osvU*?ajWT8?qS@GmO(#)J(&ZxP1Sv?+g197U>kI8LiD^T#e@|(FM+f?e*@9o+#A`yg$!-;`vktJVuk_|Q0I+n{ zTDAgwT%PSkBAYrL`?+@Z1C`*A6Sew)$l23;Nj{ysFt8}48k6~@z<6l~0R$^|q@*j> zoX2#OM-RhRmOCukUyO@rs(AA0;fuX%oulmF2Pr!7R+^zy+te%u6M>NnVoJlTm|Nc9 zCB>RqxVDh6HynAPD|IunVlxq0;umYi3|_{!KcK}eQrXG6|6UN_X*QAf%>i@sH>er* zVr>h#;!P~_aXE7;j@Ap>KKbtq*bAP3Gdavp70!@fi0+d-hmpp~T_vx%DqBGYhBI%k zLKib+y&)M6z6TqpS|+rMN`HVnM%SKyWKYAAarW=$?USFbI*ty_>S#CuNZljl#Kumo zyXO+WVB^`(+q}SwI)t30cFGC3(^fa?J7fL!sbrw^poiDzZ*8OPsQn^bJGUJ0XS#Ci zzR8L|T5{qc^dkTFDJQn}xEG{`t^~wK(AI48DPgv^&kQDWl3tBt@2E$2%J;tq6%J1D zTU&t81;$;!yL9kL5Bc!^iP^|$7@8oi!MdhibxI`f^ z&t+sp{v6pjJOBNcg&r@{m9&XlDrv)U1Tp5C1hZiI8`yuPXk8=lZ%DvDtb6=epRf;& ze{;#ABJ}ZPE7vVaSM}648!Mw;q4Nuw;?7i5Mvp=8DRIBWey_D%F-gn}ly>!lP`(71 zen*jA>O={GPrd>AJQvipsK-D4b=!B%>C@~!On3;cqF2*=F;x%Kj7c{Bn=hYj=(R&$IKX)w{A8srvt2$?x+R9F11PQYtlZa&lk$s;i}~kjq@p4r=8O^^GVJ{r`Au@B1l!+Dxx9Y$O`2OX z0_0*B&SI5EOy0;Q5la2^qm=t`OF**?V4YkBz1UDr<(TiWa&}(Iav0S{&=pw%iMgzr zwWhmF@l84060+#eGEML_Uv|-_@@m-pp{LGqxPt7d??_$2boh(AyPYc|r=P-|gZH^t zBG;`m@-iIB4Bt#8yEDZ?7urZmA>v9glHd-)VHEo}$bZr}Fh#D23~wmvpyE5UuEs@~ z+`0YeYbIZFA9q&SywQ%ve|Q!wk2UxFDUehVSK)?dZ)SDC-3MH~%}LdK6&&njd2G?M z=sz)jgx$41_HopO_EiU$MevtVJvZlhc-YyIWL_ROEcw7j1y49P$Ue>lR+q zgngqC>nGYVue1^dum+dC7$lDEn|Yn zLGi@ef{unlRMns=+1pVanI!VenFPxHK25M-A?DM?Lc8fh-A_ZD1yw6}y>*`{s=wnm zp%Q2D5%M;8w-l%K_JP_a{N&MMkU~K_Kl1IeY0IyX|Gp1R7+U8^lJjHabavj~tB^YZ zx;z_USNFqC3-Nk)GL7ozTv$Z@bSChY5xoNfS~PCcufc(5$<~W`A5!i@_AELlECs3R zw_zs^QOkAE>%&AFg-4_A>+!jK6=^JFdHnPX*6A;o;uJB@s)m|dPW3y;DT0#*{CwV& zinHe^3-=b6vg)ExLos+GyHtbhjy1RY{5nyNlR8QDJuZR!BfV^LD=1Js?oWtX;1EkX zihC;BW?2e45c-d6)Pb^RudhjqPsd{9#G@>&HcZ%-e|LkjFpIsbwJ3#Qq8MzUD8+t= zXjR2Hs547ETYB46^ngtt!avA0hPsm>{yqS-6!YK{bbVypTXz2N#OnH#zqIuxOmR`_ z(tP-bB<8~>AIS6cvpCP3tJ}6;RvR+rN|O7IeW%wl}`gtIUzoVW)`n&`n|}haKm@1B@KO{b&>4nuJ}c< zH(W@PXf0}#eZlUp1I;yaU_jrbDoJJkWDDeeXOU6urh zSEKwJC%D09IcR^n>+8z2`FbX|exMmw^KO52k2*$ALbSH|-rVs6ipzLCOh32`VSfF6 z3iW$k4C$ye!A-4)c>KWt!&QdL>l+hs!;Wnltl6En zSF467XF~LKxVv2sZft#J1b-Q`rDh4N$jD$$FRW&AY_2)74&Q`r^ba~##gyk+nWZV| z7yj}5n2n@fz~ap9bf{-#4^AvPb=|8op8Xy z^9_y4N?Z|bo_m!{ikv%t2hsZUoSZX&{i55M`?5QJpE66eO+Ro8lzy3_75w=_cJpsm zqS)ZYL7*uYbIPA#!{r0j`YMlqM8#$WBeuydl}g+fy~c^2PdBhQ%=^jMY}i&|b63FA z;LsyJ@8bGt_Ef}_`+`@&3YjY|*b*fia1PD@V9hr{@M$eQnU3dBD?{yq{4C=}Y!QNS zIftASHlsuCp68a=Vtz*o)Tn2qBK)Y=osycpvGZUf z3k1tj>7u!1)K^Tb%iK&acSFScLhw)XcP!a#z*0YO1)bnUc@BlO;*L(nOl32@@BTQX zxM|kGZ!upzTIIz4V#`hmLP1)tBCm})Y774JDrgOw^S|+bu*l`t(Ea#LR(ZGbwXqCE zS^Eorgv;wEQLKo4F>2fDdu-=_>16eoe0{4Xj%)~(6r#}dSU>O3lgRGuXm@&q%uoW~ zqcdV*PD;sbPP7K~s`Cl7(*>C1sUHf`)~qeOwoT%lB8_X_ zr|-q_e*wEci{+@NlCsu~TOb|fN-Z;Iik>vf$IXo^x$kLMu5>BzMvn1=D+DN~`j$R8NM*Z_nUf$~yldQe>Rb*A!gOs%_AL6=6*)8n`=<7pd)-SN6 zld+*+MYK>?Hz=aip9e%k1OJNVRRj$|4k)kt-3{ZgC@~dg2;+WMU^C2kIB}F2`Km7c zh>osED80jn-6NY;kV}gsZ5d7XUmML1OMda5kho3?@jv6M&+^;MNqC2O62mWxa(Opq z4G$EzN$_QyW;vhP-A#9GXdLK1U5Hb7?2KLcgr84pgHGOiYzZlZ51mlX4Nnn+26QaQ zp{yf(EJAbV7y2e0k|52ob-xp|rG4pT$|y}`biXntCO{#chgM~9@lH5?|Jv6$hbP!Z z@A@1y3_t(VBHGkq>6hU*i&aOVhS}&^tjW)#$VIBzKH7xDJO92QUcuh-l93GW>)%LT z6H8k456Rf+iKS)f>UDrL8wZ#|l;>PY#}aQbG*wW0`si_*BHUwLBy$n%n8@M%0{n=e z@l1F4amU&>1Evtz)%7j`IfdMf?B;w!tqwj@?ylqBrN%;2ziG+BwMfS!IzroCUWv$H!*kgril+`!CXRHAaZijdM4%HGfx@#u! z=En$Jm;&6RG7`>1EUGC-mZ)18)f*N46INuVW_~F)=`kN`H zCv!w*+r8f8ZkHW4oQmlkY%b&VW~QD6C*dwu5=Y8-+xHZuBwQc5y*mQJ=5bnagx z|C*c9!dR&$6r;P)%=w7}>cf+?_#qa?&y)G7g}L_=@rp}*w@D{+k=97d8S&@O4sX=U zJbNaG0$zDh(K``B5z>_PUZen*p9pdL# z;Hc_V&<1O#v}z^935* zZ}*?bD6h=qNyaXje(`>JmkUZtFF7Sp4?IR1=3*gNiw#W7xv%}If4Ee=z2Uc&p&MN+ zI7j^Z*+Mes-N5$CE7<1}q0RFTu_So^QnPn`!R@Bhz73s>;M$_OWXe3Oh7u@IM^yM- z%SH&cY5Ui8jF0QoA9A7hr|oblEyJ&v5@u_isbG#@O*+Q~{sKJp`&@H`?`<(|mErxw z5=|_2p~+`VjsAS&y#XfO4x7R$Twj3i(X3?%23U4tI>LkaIv3g0(ibEwJR($)Z8U~j zPpn)Z{@(Ir5^EFTrREmJ|2UXE*S&co*J^VTxQ_KE657e}m|GdVTs2cJHjshs&I2Nbe^2!{4-F!p3fv*_L| zcogPWUn&)Z)S?*{sI354mGCdzK%Y>pCD6b2Z^J7`S{Gc!w1XjW70ojSy=d$`eL?h0 zs@qrh+*VJX2waln_Mol@(y&I&2xNwYn83n^#VN$P|w)a@FV`W~nfT!<_qb#C&Mm%XjT|GQKcg_hIoqyw)%z!~t`DClBTfsn+Au|8Ix)M}p{ORg4 zVkc@JGSp1N*X^b0^r+PfIN|b!m|Q&>6h0B8N{_!3xPgibdWk|59I9I^Q~rVR7AaEp zsP+tMsS-QbL333ydxy0JS)%9KY!(qFz2)w|pmQJRVyy5!HifdU) z?!qOs9_vO`s9Xs@&!fkElU`++;DQNwpk~&+lvK@|@W2sW@BaaJiubmwmaUcD^_k`rA$3nbLvoX~!O2!)K7m&eLmL)MypsC#=H)SGBCI8a5HreP zEWh5fQ=71N6s{XhxDRcj&A|x`X3_{g7Qie|EP^w*`WWsq)P93@wdQI_Lj zY!U7P))Y`IJrjbq_SDjYj6r$lD90oEmZJEX1Gb&vm)&lquF>R{KWBdFVWu0G z+Ji2Xz-t}oW=AxYOh1)v$CtHy=_M3g<9s(zx;#akYi%)*BeoK$$f{7zd>=Ibn=7$> z-MZ=Uz+cfX zBbNS*Fd2{~i+LjuuFl(M@_Fbyzdeo4IM}QPaegsi`fPWM444hLxNJJ~GQ=ha>SJPN zO)NqtALvFGG+eM7uNHrF0s^}I)7Yekn6{!}XAgf}Er0VPvEj%OS1JIo^%6^}Shnm1 zU^gelm^r$2asg9U!_)5#qm+(u*`*>e?%Ha_9+ zjZJssE#UH_^WNOfY@hO9Ae)$Bl6hm zLdxA&r0bpb4g*?Pt8iLF;x6`0YY$v+gQ^<~h-x9+=`XiIzG5UCcrRSZ@l36@*HbX3 zx}XYr+a|Wo_D4d5!R|`hoSfV?f$F}Q;)=FU6FL!U0dmPXVN>el`hByn(u!ka5nF7a zafwDgLJyq&$tGuY_>!hNI4{}-W&pmdev$*{7>EA|SO z2xW-4tf#|ibZ3@xlH;o~Mw!=o#9?B^ktmDmr(<5q|2fWAbngU6(XyP9G#W!3!RApn z4hqSYQie|y)mpP zc2F_zVo-VF%AMm{3I52yFl_3TfZh1IP4Ywi%b>oUZG;s!k9;e26A72=MCBPnFu~3ak;>o?7IZ|&CY>Ye21LL!hN}zg{kC(ZD<`Eiv zN#^m&Z#hgWSNB#!;4aB|(D8f_VdBl`=P(V0Bg%64{*pq30(?PWA9sI^o9GvBjmP zza0dWeY4)O%K&-csJTQYvrX~6lzZ~n`_<6e2U6A0gG6{yggNZd4%*o zTWLu>>4RLZxedwG24EKU^N=J~*aYv-!ZxkEQ@Zs3maDE>tSs!H`70FRzcngiy-BT_ z4{@`#wEo-kq`wRM&(dTx9DEmr@-?H)jzE5ibih)(!2y!ux7!w4rY?k>i`wU(~Q` z@MF6unC2@xt>eiD*~L{4TL#$Y?(Jl?SS~_8m%5r(=Yr#(;mhH}CRE4!M)Loa?@yS` zY$ILmiyDi+y__0l&@DyE>=%$M;Rk<;g!oc!7ya+sT&@eck(nO&@q4HY=+%0{fimhL zR!9|9?^kunfAg80T3vmM_!7{&8no?oU6j9q_iiNCK4{R_n{J;tTW=^9b5YtIqd*^m z4DhcAurM>b8f%Ta{D4=Vdi?%_g=V$|@P61=UM#d6g?fs5w2us5g4W?kpm#$VD!AJ9 zS;CYA+G`~e4Di5)Bd-@~UYggWhX`(n7>A;gAoJe}xOU-6;7RAu8Af$=N@5D{B0`)#c zj5SYr=TX8#6KOwRam-|ySa(?0M- z*?Ezla4wYHK_P1ee~asEfAa88yln&U!nu4`GJs96mCfh4=q9y4$$8Ng`(!i?Y|SgN-v>S|7e$>;-kDf`Sj)rM;1kllF7JvxE~YikGAHN;2zto; z3yQ`qj8L^xkUAN1@j!j#vHN+5?g6TAPb-40QQUD$Z28HLANasSvibGNSB;of@G`o1VLtFOjF5WyxUMWTOGHi?#^x=hOJrEYhYbaK(ou9-p2?0B!oA@5>w9aP81LDA305tV@J$|# zo~&+~AbjN6T1Ppv^-KcvwjJ1Vy;T77^C;L_%K28>;{0zj42L48v@-55cUX;_dV=<< zlp5EG;No>T9cb_|sH^`Nqe0l+B@=|l{=~;oW7}N-cmC(9aum77D9@d5)g}0ysd`$O z(jTWLBU1I%r=K6|cplOW2?ZP&G*q&zn7hbut~64YDCD^^c-kl- zeG`|X7Eq26`~#0?ISRPjR083=*d6~9Tih*nYqz#= z;IKi@#2#udnBNusinChi+(fg-yqhNK-9?^O@JH{+{3_IkdzyMzEw29yTXpMe(SEz8 z7EWyr;L=J(ZXY2IN?uEPe8sEV@{mepFWBZ$GBg2~ zbR4=!my&3Frmczev*Gp~noTiIhVE*3&f8k&)w61Q%Rz!@K83M#m^mp|N@%F{gOGf)LwZ?T-O?I&7{$rKIeUcs*AG=Qy?eq8Q< zb<+`;?dt0CjwDwu^$*bkI!dprT)*u}%mHFy z_)un9@*cStKfj9?>>E+!nPORvgNx-$nkx))tu#ABtKY5ixh%b&r&2=e{Km73&2|n= zTr=@od*7r!DTu)3+XK%%cQv=x(|}_2@+eiOp+l#I|Hsi)hBfuJaYdyYq(eF+BqU{Y zmx@SAcbAeQC6o?nm`I5*It50TbdBz2Gz`Y5_x#^a+oxUEo^zk)u3xO_4F1x%=1jT* zzg3&*Ec(pTDahaDk5_h_NI!)hc?}>5k4+`ddGjeGy|?ty+#)ZQMud*r9$>dzzUP_) zXl}C0It3BC(>!DyB_fQ!k)BAz#Ci-pVF%9DhlczIV5#js){ZRk?f6E~b9@n8 z(eA&2CCn}Q`Vk!K5|gx7IPUY_8Q`hRaQ>G$>EccXw$U^=x>m6*50;kdtHtU9FCIJO zWw*HA>k(8pF5Yjl9BkjM-SWQM%-Rfi0qKk`7getj$tUzcG{cCX+E3sd*-%ID%(Aq9 zw`RVdl;N}C(w|0-wG4hWEkyShja}q#RVEinn-Y4wtt33FmV~0d5#Hc_q(4|k{xCA_ z0qX+en8#CSLboh=_Oac|l%CUcB=QV1m~esIEJV}{kS6&Ebbw41Fc9=mi1@DllL+`5 zH2hKx8>I~6*Dw_6J316etFy`~8W|3BJ4$2l9ph(TGZIT5XLO7%$0as*f zTlp$n8BK`C>Vu3OXA`6iAj1TLGS`~BVF|eR;hoS5$@l7F0N}YKB{9|IfsPm9;ss~ctuRAla%N$h;E?=8(x3iT}-){K^a3qHI zn~XjXrxP|q2*l7-w-dHK5ZQs2IP0~Fv{%rht%VtnJ-H$!yDWjvu$zl=#>SMjI5NUA zDW5aZ4ib+a6Qqhp>KQVtlX4~DSg+Lm$n6UWX-1?i;S$^**Uh!E$W}Adt|v zwXm5wu++*e974Zd+P(<6YnIBSDC39y;9n#Qke6&v%T(|)o%y`r-;c(auhOCL{mwRs z@oiV(*MrEw4{MV@J(yLn%sklN#inyaTiZ2!qO-H}rCD&F(mmUi)W4&hSKmbi1<(FX zF@{_N))?eR4AinE$*QJvbn!c5rb=e!dY_-gIlwN%^!`QGwfY`vbh$x1M32Ljmh~vF z$xVF23G2_D2hbt}(^as+mHm5q7msY3WvqXC_4F+j>21eDC}Mq6&OZr7O}=L&(ZxcD zmkKl2W1w1?6Z?;+9}tdNoD{|F;tP9DOh!?CHP>=~Uu@S{)XPlNf8gUQ@??b!7e5h8 z8{ezKQlT)kb+Z)7irjePzD}6f!jbzK+Bn#uvs`{3s{tuL`ZM+puv&S_^~ zpD35@G_-_WQE5^8(u=-+esHsQtrqRTyjYyxQsFM@`e_Vlr6aDdl-A($7uHZE+!v>5 z2KL`~~DwoY>m(tV(hx?{Ok>*4q6bPd)&2nX4B7w#X4mf*7TV&ham2 zFg`}u^IdVied#&q$687+{u(~niE6AAu$5yH@evX>SZj^@jmW|{q(z8#iV}N#BEq#D z>mn<0+-GpXM>z6Nad2o)E_>Xr`7kGneYvQ3K%+1)G15$Yw|+oCSBo!yhpYzt3~eq7 zlz1)pO!}W3_=%T;QVqD}iB14}WcFZe7g+L&EBwZ0jeGAJg6We7<#G-Y48^vsMmc$1@ur^-|f<0l$I z3ubsp{jvH7KJ!#SkMCH`W~euSZ_`^@N5E6&!f-v2D!?P+lW$V(R{lp*L2{h+ z-%@EaB<^g2B9?rcpNl@JHYP-^QQ?G2ZUv;KL`#cY;r~G{g#l|2RqW7dZZS1Tx{EPo z=EJ^WKJ&s~1)>q5xnk$#l`jthT)V%z3Ew-3cQkOlHAr+`vJiksSnpA1?N6rqm1)~i zy7{lKf3I*9177>#z(gS~qqQVqGRs>!J zXOzAF4dC-^u$#%&%!DaUdUf(-UQpmPv7AP6(0pe-D_D)?VCnE--HpfUy0?mmatZ22 zL@Rc|d^q=2eaILRH=h6|opRin*ot6>GT?`FmFLhP?b+C5OH0dQLr#)6`IM@1$AXJY zSOlN>a1!eVCKd(EyJky3Vbfy1Y6-)OK1til0v~=j>DXB6Gd?Vl?t0)GuT{a!gk^sa zNp}|{o=pMcT!CF0lH-J|wtHkwTi?47yoweMV)62>>7R6ehhru3H&G6l@fmY8)u?BSlTE2TN3FEA0zd8pk8#& zhQ+>bHK+$JomAU1gD0P(0k9Vuo71MGsJQ7FP?G7kxcy@MVzSp6ug zNOlKn+v7{{pdgc(!dv0!k0GWA<)YqN|5}u1oU0>#MEf#(cWqY1OVTD~o7%=<%Y{&s z+ZFQ1u(UuUL+KC4=I^m)VCdzuUyWO2O!0kWVe0G+5{(fyLVLfE<^@DhBECPBIuf{f z#de{R?Za83L3dY9NhdEWR4AfuSFzsv*(mavN-l6NHdr3xleKz$-|}3*_(as~J9h$t z9rpYObqYh$+dF~XCM$BTllL*4UguOSNPzT)mO|k>_?VKlu&+z9>epY)z!uziZ8IvAK@8K}p&Gye?S#p)+3b({RBN~IlZAKC9SI?J_Y z6kudI>(&s0PWC!Kr0D-KEo6ds7U4pvs+rJORGcFEbA@l4AOg>dvZ7`&coc%{cr6I| z*@FlXZgpD!oJ<&B3<$|^382zT2oGcl9bWjXN(GbGh54s?2J$$Co4T>iMq_1DTNhLx!EHi2&nt$~$v z-XjxuvZSvmA@d&TF$raj?}+Vpu!myb=>#n7pT;t<3><5bIeMROpdY2JE$FxWV!#Cs zp~Ho4@0!rmlMrE z|LO>5ec+KDO;KDWo^w6fUGg4;M&+w@*A}b{(KvkXW=TgBRaD%PQu>Y_=h+to=X|gd z3J#+8*%f07&2Tl)bRmA{IyO@8G5wHu`pSKuU8U{qv5QjuNq8!@3vCt+B1Ck+(87lf z6kS(6Q*B1SRGcMNwje4oHRb7cY-Eb39W+1c9KVKF!`fhc^J+G&gU*hJ5tEUl4L+ea zQtWElgjyf!I6VdXKRyaJ3mLk8gaB==f!ol(Sq_`)S~v|>px_r^$^Tf$LZAPge8f=l z{>=?GO?2rJ-QoU0BqrG!X<*8sP$&(d6>w8slRfKl=4yO};e($E?EQ4-4+W*X8|v3uXdvsGzBWx?!DYJ16{ zFMq4<>L{6p$^N6)wHkC}-_;fS`6&^`D~q3fD9@2-Z#(Bw>o&@|px#rcf!B)COJ z4D6$e){fb>tXwYq$2})fD%J*j@mLwCJ3-p;w9R_u(+G>&my~rx$T)k(?M}13SB>Y; zy~()*K&wM#HChM@P{hM4VEFy!Z^fj`^1=*1&%l2@u5Gqs2apwYi=B(?c=ZDs{#}ou zFAc(FfGJ>iiV?P#12{b0F^6(vtHQQ%g!?}@88?AG0m9QalnXuA^y*>WvEt67)o!J? z2E=&Vzn^bIDr6l~-qLIC$*S=+omq+Wa`z5L2nUY=OEo?8iv>=PCV>Q>L}@?8&hz{GdLA(j$u3EM)%FoJmf9Tx;pxt#~_>xgLBd;rT}s{LjA;lJKdz za+&ceF3u2|pWiyH%L&_oR)oLw=bG5T>p>L|7<{2P0$=Dvo2t&Fo$H?OE$Ep9oUS8@ zmQ74xZszv(_U`WPfw`)y-{uOp;)%K4o!xFEYG8<3e11d7R)9Ld2D!SglbW{A`h2u! zv9^RehUTF+GM#5Z<)3OnN2`urmiC?&(pgr(zt8;n|3T0r&V#Qy(zeO)qNCM+f)QOe z07~4tq4zwLWiI*iEbg;Uv*ctwUvm@MDJp&sWCpl{nXF=H&IoN~Ua$u-6_*6{NtX3* zhf4E0D5K{0J!Eb~?j1xJ1x~)&drh(OAR?5m_6%$~p3A?|${}Ug&7zq^U#CuU1V%Lsh%9| zZli|AXD0eEVbzYVDGdkTv}n780F+Z+5v z06@LONf}Pr(52}9iDkl1km*wDnMq}Ukm7$Yz*|IfJDZl)4v5z5UABw_=+;f+evU@n7sUu~uat)tPw2x(f`VHnUGk3P*|4%;KYMO#f+S+cZ-l zNwk??G$Mk?zZfPCbCSb37k^ALuy-f1QD&A&VJ=P>$=>`u?c;-~eiPxYzI!@owM%5* zSJaEIhpN}@yQX@x9B*A~Q2oNQ#Yp02cQ>J2wX}5xS`kO{);&4-D&$NtSuG>o7mqtI z;2XqRK3LomBrAha^6dRHCp8RL(>~T=NkA&k^8-=0<51nzPQ-U01}@!GFdZZZQas<+gD9_l40WZidL^qMFWSOIVs;qz6|ixabc&{@3W<I(LTVbC5)vZ?}ck$HZ;n%yC;m6?*^ zqR?NzIv8$~Nv(?p@hc_WR z5E+CYG%LUDZt+|E_Xtt2@gkZHCj*U370Z9QM2y*_=wj`bCv zq}EXk`;DFX>ozQIbg6A-?8VXzyf287gqNsT_GH3jd2aO-m87pn!2f*_{r)!~`??yS zxOdZHWcpkYr$ruG0hmcn<`zvNbv*zj7u)5snYux9_>8@KoKyP&kh19zD`>m$49>eV zKq64h(I;DY)Y-bSLSwfPsaulgw9ELu7WVedNSos^MBLBfOY2i$ukI+r@qA80KL18o znpxXEQKm9?=N=Ek1%&&GI-96qZ#p)s_~N;{=YRLJqRWOF@QNN6K|?%BEaGXFH;S|(gL zZP3AO>X#juzR-RIGXq%{gxLZbd)qI8S;ik)ar~;c%%C#<`0@W&prd=;ltba)6T$wo zCYbt+$O7PNtCuaH58+-clpWQVPZe^hNtY`=g7%q_1ymMbm|pJ_ozrk6wK;_4|DPQ~ z4!?G`%c3O@tsYmfH~s8#+0}iderxeL3D<+V@!R$18@~lRI2J_4W9!^!$)$rA8}@s^ z_G)4H$oPZp70#tqJB5lO8A+OS#&8I-!}tC8CH>lY@P)o!N`fURwwpTwyAssAM>~X` zhlFO~0r9mN>jQT4yXIx;^+WwTc7`&_6}O{L{5t%_8lGPBc25KF)-Xf}*YB zrdi=yiXy38fJ(pSjM}b$_W=dosj~rOuT3N!x%K-{03*?dnItxXW$m}NTTiP&8jA_1 z{u2@Hev65lPZY{ydzVIGCRx)?&lPLTRR2PmBE?e&H*v$A3|X&7M_-$5{j8E{dgej2 zX`;ti3o?B{WufD?kRnnE((Z#}DfOhmxqv4zJyOPBYG^uG5W|I0Z@m9f4cGj3x?^yA znQ6mI4RSL|RWgbEIQ&=vu@OJ=tdwxU4jR-0-+GHsm&kc+*!Ko!TU6HHXB;haV{*f` zb>s_FNCdmTnQ8Zmb*!%JxuoDKHG7!%BQX(#>RwdK?dmEaK>fE7(7^=U0Nk&Lqp2Ooji@C%!~U-Pkf*1yx2k( zZ>$wyLma4?KStzETrEfD zZgdLaiYNoLW;HAa*1?}}N>9L)jt4HFUHD$wFL0ZaekQU5^sRXtJlLm;C{?$8J{R>2 zPyPa~9uhzltZHt^TCAQJ+VM!cUo?~FdzDsW8Z`dXmfHu0XK8b_y)r4bwvT@!*Yv%! zYeUF!!&@fzgfsBV?bt~*tqw%6-aI0V9L@KR4Ewk)LQT(*+~xRsfsU|wI+KknQtI&Z zS#siAK}yZ-$*&3)zQqMszGH0!fg$>;AZWeJn9M6!%_BodgC!!`aB)p5+S4jvMC-2< z{81$+^DkRy2MA5dzw~Juo%wTBh+0UF)rx>7K&xY|Znou1mL_((F+A8TE=v?O^EYa8 z?)Q|iA>;8n6w8qD%SpA|HubBvuE=;sX#qUAw?+4PcPDe`ySC=d|0BI}=KdhLCIKC* zceYZFf3h$Pz8S|n1&61IYGDKl9BDoekR?UhcrIh(T%Xyy;x}-#sE#wT3b?W#<0V(} zr=2RDRu+gdp`TPrPW^GOMO=ff`CcY-M%(YuwTZ8z%OYUJx`pWV4#Fx}PYqwsU$3FQb&6KZP zIWYGfRSZatS~{-meBH5+T^z=0Ta8tgEBsAyl|_JxxkI6`kV}zU(T?+Nb^Fzdn4s0! zTLj{#m@~}i%xN=({NuEL3?YI!AFZ;ccWa@6$|IQptgBqCO9JCN&n=IvmdRe2d$S`V5G5QC z4`m#u_-3+a6%d8Ry=)Hb1y6hLuPCYTuabOzVAg%DHFG9!5u36LSgBIMhe}bqpNKlX zDd!fEPz?8sRlodL5|$gos%?cKzntY|hx&H^S@ds&H8ZI3$o!hXCh(-A>z}L2QghNp zhfAQbwHY4*FC|w{z({51y(;Mi`};UI?v&07x|7Dg#(`;46lZ=*21zXLMx95*0Sx&A z+8#$#0+Aia^E|5TvWt16nSYg9*Iq9D2TF)8FMnqvQw_H>JEoNh%(-CRrX%QonFCk? zQT*aht-oPTtd-u1Wo>yJ^kV(8S03ioNvVkywioLHW*r0i-A~g2CV(IY$YW zvUuvj_hbW64JL_Dv$4HXKgihreCDG?fzGcd2_rx6?#i*8ct8C)GC+{^wCHOLrEyNL z^a~;Kbq0Q)>#CYgZq|gqAzV>M%ai0wu9DHk1urCEcfA~9lX#ySyo|sD*wq5oc=MjD zJDy6Ng#K?1zHMRLdrgg0By#g65a5o;{H$503s0XWiRpg-|Dxbfz-RiT4vF0|Yl&JX z0xW?h2&s!F4OVu4BiU$&<+}-&IY$WAR+>9*walnZSY@OkQp=2|vy2fpfdiUOyg;U9 zpw6uHcRqz)Jo^4`bYJ@Qm3@qoeAQRwsTUd!H)sd8mH0Y=dI3f=?{$U9s)RHAr^jOT7~b z%M1;%?JHtZ_h((c{tCyzwhNAIgl$49xF*f36dGTmwQNrpatPxIVF4)mj&%M^f`V_@ z74fTnsZq$s`j9XK)0<=gT=!;zvI^h`%)p5O931+eS240WDFJ8)_aOwas-2Vs-OLOH`?Y5x(X;5h zHkF@HTdubmG{@S*oy1I{s=4QLnsPALGG{RT6i3rbr^Czu@4)*U?-elClid{Vptd`LP4?ohiB1E`npa=LrLjD z`QDtb6-8KQ$IucPp++jR2SaEH9~Dm~e=3FV6;S0@m9bB5ESwJh>#%u~t|W4h<u7S3arcwSIT^djZBY+B0BYESj@n4c28fb zb*#!fJz`;-ws(m|$w3Gio zKw1F+$8>)3cc;T7Ua;Y}OP+vdRg>z~c(&|fG@5*Rzs~ag`WLTwi+dmKK73UKhsxD9 zE8}I>J}xrB{Zs>3oJ5pkdHHG16oqK=#;UboLF27$6R{@-8FH#+$)+htQ}rjdY9#4o zJ($>361x33PpX!Yas~%q4$Im^EonB=%Kf(b>}m z$5{AWJV+#zzb$17F|X>StkI*sVy1xlNnSG-kZT3b%hn@)|HZa@HMSrWj(v&~s>%xT zpFgVUae8b!wT0)$9QuMa$L2{3yHJM;h-F)`G2D&9Z^WM$V~N2Gj8Ox-EMEPtnzjnq z@tu)$WbN5mt^Nu7)bioR4aKcyy4U;PHB0{C#sR1dPZjXLC|9wh$Ij~ntDE*5;Z@w> z)*aW)i~;g`Z|?dI&gXAx3&4&!9g20ZzaL`74Z&9ViaHmPVXJHv%jA14r1421pT;h# z=({&(eJgHSNiC zj-FS-ey?hJdqqrR*_MS}TD#ruXBtB0yPC~q4)M5@&Z3mSj*iml zlbllR^3sPKZ~TXsrukNkyYq`qeJCk&@U6fzH@5ga!`pEy?g1fzzO9V(E%NSw@`Pd3 z6IJ}fXGn$$4hpxvXH4X;{4HEOU+~Y9y(=4cMAF8NI0>r#+E$Rz#yie@^A!*ltXP&qbeXN3C$HGRcY4r3-~!W&u<6XsEy;im9E*WVzCV)3gP2UBRFQ^_axQcE4@Rb?7r;%?OPb%Vm9y=PE@CSFJk-8vF7@dOT(&~ z^$?D&f}0;0CIhGNC{S!ue1%C0tEIwWFN@P)O;dk`Q&5nv`d9ysdXB^*FM&ko`s;8a zj?uG_gr97waRv<$;LERF1>Q#aa_Nn?N?A+WLcSLy4QAS?XGW6pCNq-P>6+EB`bptv z`-+|!Aa7KHy#Lhvaw#Qj=@podOi}-DYOk4m7ToB|-O8_A>`v|v>TIMaIdD{YXPsgi zAeMxzGF$nU9|?iXjxW_q=@7V%$R zs=;^k_Um7}B0LYPtX2^>69)(3ogCLrW5Tuv2)DOws*-|dOR(chB-q=kk?8se`<7~t zwyI2b=)PR?WBG_On9C4d;Wyl)4wsYyQ)Bvwuf_`NC707?-}jTXn8dCeCX9>DkM zW01UBk1>~@^`@1zx}Y!5ZJHM*X!L$RHxvdX`YCk8F>VEtF9P;}+wrgx^) zToiv6wvwg$IN8~TogF>v-; zlnT?XTeUzgHLnnkZDNt>ml+SkSACK%N8Ux@X;s2LOH~prGt^RG$gI!=yaXIk)FwAe zCdB3K_j>rYCz%%4Q@3oj%o|7dRILhK+rynOK9BF|2y*?$T?C9VJuo;v2l$`);$M#A z(AW0R07wBTk3;JA)z#Ie4&E$bMTVk6?o1Y)+s5j9bJydG&Qz;CxrQMO7R!RSkE3ei{K!$Wo+2{w$8?zWR!^X?apL2hWU%|?kic;9} z!)GFFtZwRavHVsaoEO?)V98s=a;^PjeMQh+b5F>ZQZ?aQtab-ePN(n%#8{x{D%$3>@etCTMB&+yQu{y=X zUL$|}w9kf8yr=_(2kRF3ucPdj8`VBbvZWxWx=cE`Aqv7ise3EIbOH{Aq%flP&kxGHEgLiz74QoN5 z*efxm8}`fiH&Ozpx90X%D~3wIbz|h7s>$DKHPIrBYRhdTCJfItkT_Kkc6I=TU?X13 zm&FGoc?k*MBNj|tz!q9Q#1+8wfe{ns_j)w|1u2^OdejHiCdr!Se8Vcf{MBVFPuhj` zVca*_H8FYL9-VI@)N*)5C+~Ncuz|PGj)uX&HD9c(%+BlAV6Uq{ryVy8yG8*!j%`7v zX~O>ouL^m8f;UWWC!XlmK-NswHuM5&6F)nFf2GF{dI%Kj-x07v25c&$DRt`2vWcF6 zpMNrjCVO>68iUqHyJOwl@z4Q}mB$o$Y=XMYUx$BEHJabL@C^_t9;P|-gUSgX)Z0X9 zGd{t3`gkaeyIeTD@_^x+LQL=Z31@dTgC46rvPY;I-9h`T5+u|ByTqEdzND%rxQL}| z_1WsBhm~04;@n7?ffWzKR?duo79N)gGO(KEkcgwM)px4&r>%z_!v&VMQSmxXwHjvH z+T(GVBjz4}*$Vj0kV50VPca;Ie*kkvzgpeIL)Bq*euBX3!Za@y-yz6*mEF};XJ?5A z)e@1&=ZnsM1LhuLDs7dAj%Hx=FJw5w?mn8dxo_0G%$5AUuL^uXdDjQ!FM2f=Jp0*i zL4*r#+f7YBVn}3qwk9a>C$h-(=7}kl-?eogCBrNszPF=xj>PMg2H%^L`EE4nrwH$z zoriHiFtdm8a9;H9F`o3gBY}P!Tu&usYYQ)bL3KW@P>7PN_7;;CJ~j7Dg4e+45#yj! zl9fdXD~`VfPIDi93_9ms+H0qHeNU!hj@6;rPZZHy%8Nw`6Gue8PgI#mRefZ;a2;O_ zVt^8A)@tPv6)wls-#2W_oo3<`)^>!3Xax-Dqq0>-KuPia=QYP?RynyXt`6uH=a={ z0OcF3y`vvMkPJ8-K~?+zYnXszhMHo*i^Z>!?yEwF9k8AfF{u*?OXhVL(XnzHK)x9= z_5xZZdMX)=8r7+z2!=wPFI(v_I~w}K!tyO$K|S+@lN56m!;V#}AZLUlI@x6M3VFB` zR?)J)+e^4y;kqL1;o#wMmhxqR26>XiYR9Moc{6f^UfYa*;yR16HFKyh#vVZ-1A-ER3r-CKmZGmjlQ{^bym57N%eA>#Pk_ zsw@p+l82O54YKt8^*BamD!(6GnPD%MAD@s=LdA5&ZH26@4vZ|V7vHOMNRIh1WqIWy zF4-&sh#8!U9gTea96*1qZc#@NPgU^VSzRJowLb%8$i}Ce{Y(Acxt0}VC0_PZ-s{L6HLlyqf@%o2pywZL?JERyKcWETMQyQ%wES)-1 zII;I(DzxiiLaD9m_m#~7Q#6-;W%C*9hM;~9Okbh>xVt=kF!i)qkTt90{hfgS0D*=k4^K;44?$5BPMg*>7HHN!94_Q`61=_OPQvbJyCNG zkA6gRNe5l8l|i(0E{^oxb5b})TiFH*rg((c%D$IbXEN~NB#{zmMF zT6fCAfhBzA-YUi^st*k##DA#dJtouPGvYYyeT|_k>oa#FbI`BD zZ#byK3%<>0AO}g zo6TJGhT{JjdLY~y09=T^SwR;Nj%gcNEg3QT=UdHkVgZW@77FbqHi9Ta9eZyBcv!+P zt(p4X#M{Ca4h7tLBt5iPs`-U4pof8ayWUH{9XNI4BlN65AQ+Y9>X3|AOUS>|8P4{o z&efbEn}`J*tvxwIbC|BaPt++2~a@F=Lb-tnqGjXk%yC`blkBe{1toRWl-c-1! z?H7Y|wxvuzT!?It9-FQ!aeNCTkr|+6CSHT_fnO!7O9VY!MMPZ22Ikqje&UBKZ^eeZ zG~nkneLCo>GSOE?#OE^GF=!-+qK4zRAyoJ>RBd|_R#nA^UE-fC7rhI6ZTI}*T@6*0 zFP(4nXu4W@Ybx<2c2=lCyyROIj!BC#ve;D>IX~vcf8{kd^_XT6*8KW_lG^xoa@Gwj z!+>!H_N7Hz!~bBdTS9wMWA*uy0@N;iqN@-ZP-KpHO!eC;MIJv&K|A;Qw6^q zI=R$r4XSkZZy2a`_JMAnczk`Zwo|zZ=XbgX=HnY1t@3}ji#N;g5c1xGJuGKv+BqK@ z#6L4UT)&&;%kj&QM= zqD?DlFv=77GcKQb>?!c^KgBD*?L7?t^VkqlYzMwLTaajqDg+e5Z?wSOS0Y%8#Ey2Y zMi79aD{K4Oyf)rd4_d)hT~ChFqysaHNvP%h5ar)#9`uT?%91oHX8QR1wFOLulO{&o z(%ifAh)ne#b+kc^xv4NQe!-i(#+B#TO{6Bi-wT_EY#~}fg_)jHH?t@ZTOQ!vbv`-y z(D!gEwK)8faJJ|goN5jC-tJHA=#Xu?a!;jz{G8Z1jTxfbS;m@g@caL4c)q+}=_0d3 zc9J50j@A5wT56dBmnR-asPZQ;GV6wsp3(ybO|r`je4C+{2{L_i zm{Jx)`*=!s^^LTH$%WxD>25uXTx~0Rb^cNU<4-)OqUCSA`nS&e+Mh|?%XA~E`<#bI zAB>!3;DCC^MWmj73lQP|J`;xd*UnwdzLgmuEJ3~V>0-Zj!YL!Niq9o0i&teFSy~N7 z9ro$*t>&zrOI8~9{jmpnaHL%gGc8l-He2#uVMmaK*NHjU#a}yFNIvvO>%U*TDcW;J zWmb;F%vsG1t3Bg-1~!LT3%yF{zoPanm^AxBv%3`)87@?Q_bV-`S$62viB78JqQ`qT z68$T0wY5jXKD9!%&0W&&%a_5nqq+3Q(*dW^>8p?fkLY>+n8= zYvmcOkAdY(-GLvBSX7lgamaU(I;p`R7AJXl<7AH|bdsbRwWgVaZ{%d|J%Tvbm+GzT zvO42f%-t_2p-qZ0b$f@1t}{&{C?l#PT25I+iFKXxcHgWoL>HY9{4z9+e(IF? zwtpL^xf15IyfyTd&P03c@FGGegzlSRHS2*2YPE1T_Nic?=?En$UT!+C1&+iM7wvvT z6;?pGK0C37QK{hi3U8(BCF>8UhgRDa17e$ZWP6J}QcYQO%x0z8_Z*YG@kbt;! z+3ZyYK6|3wL4YgxkF*}1Nmg=DXKm;aUR#)`w5fffUaXR=?LiItf@(htee@~5bl7DUBo)?5v$Wb4sM-J#H3TPR@&QT>pqNUBOvcH`MQdPl z=2ehVz}8O2$1;VU;5q^MsXp1+NCZ`az8v(*@NB+kcYT2n!3ptsbr72wM$!Rrjk3E* z1-BHkx)Lvav*lKo@!je**k6dTA{@QB6+t!)NF*5g4{b=Zf+gAw(cb~EnizF3Y?vxw zn{oVK(czJy!43%{dL9s`=u@}lnNG}oa30=)K0DbGOnZ)JKuT2Q4i0}avd~F)+9XF9 z*j~Ze`^X(ndg~Kb3}VCcL;XK-FtYV(x%vJ6){g-?qx*Cb$xw$VvkwW;rX+uS@L|tH zs~~J{casOCYK%27CKo@CF|9q9=gENLV%b6#jMFpGx1XuMI{Z$+-kLr zZqc~ysG>uP{!QU&+W6S3e2^!bu};Zd0F(^8i~3HK_1}E08a}VCaur?SeLc z4wNfl^V5||2mcZoOQk6=IU3|c_(xiQH62GM~z#3TmG;*9;Stl z)iN-jb6a&vKAundzjoeqYifs%?mk0EN-%*pf-sb?pf>->10wB8nQ1F;vCIN!P#nZH zF5>mN#gkoEjPXSoqZ$rii$Z%gH)CUVrldwWy$XFlqtrHelAd`wpkv*6v5D)uRzdY} zjWkU#gkQN$>dofzW!?S{9*>!>lWB6~#@$77{)7+B~8BRLq zHey#Mml{mD4P|!ah^B)9J2-G^J_7KDILoqM`cZ2}9ACR$0I06KJivb-ERC-HxK{C&%GR7B*PBeYvGm+hZCMoga1wzGrd==W5l5jVo-VTi zxXoXCJVIhS26eDeA*%fw6lMeH73>^e|1aw#;0|f$+4$(;)gYdf9hzI-CNPDT{L711;{4 zUpmF%5oKUvVLhxeL2XKV^PIcFI8c!d>Y9kg=Yu(5ES;(bo|jr z2bti160DRI0F$Xs^2e_PHySK-E+}cpxJf{|a1*Tg^}m3E`>NJkl<_mf17o~S2_NZA zsg~V<9pZiPZ{U2X-SOU+@W>KIU67yB?1f+*Oz0weBfa2w zllran3FuD%Hs0khUGCzFHa~_ooy~u0wNf7k&`FrEF~LE&C;M=6Kp~smb}A=la$nL| z-vN-4as<%;MNL(Hkr*j)J`kK&$!1Ykb@}zH6juoLi2gj!CO#J)Bu8~MVl$R7M?x+gLF3YASrE!RvhBgh8GN0IxoybaG1h;o=mpr`LCSJGP@cj z`*)#9Q53kVSsXt`I-PZ)6~2P1*;VhfxZk}np!h_b{I2X?Gfg~PAvfyV`m45VCsO5) zWqc2??SRX_h?z+@~a znq_HU6zAn>`TPGMn!20a{pSGyj~~S+j}YpP8g$_{+kteDJw>S7J29<$Z7&gmO|+S9 z;JL&#xAY}-4SSs!u}_!S<2$YFbWe7@Yd$_7YDKL_^PgL%WHB>=dystB%(B*+`o7XuNiKL-|JRncj&h>hXz zm0fHT!_rdRS2R=T+ngU(WXUd-Fz1DOB5l4PT*UX~ncth*e9Vm-rx$)&lVygC%~H;! zUkXYUhOI{v$&;J1m#B$D(<_@)mPv?(de_Cy-MGxvJCao;j?re1<~xjPL0&K+TdR5R zuZNFD^L0eh({ip)x~{nK4~c87)r%`~H*X@A{g0)JzA0jkjt9Sp$2Lhimdd#|s6*ym z{jg_@ztnsqb%wgfsf29=Sgrh@et{&G%y{7|m%le{$DVY+9M=!SpJtC_)FshjxBX16 zVXh;VHkV0a95~kgH1*%-Mriq0zG4>H5;vERjQ?ZlECZtYzOOGL4U*C@(j_2Lf-oc9 zjdX)_3P=t}2}p<1B_-VrLzjT`5K1>g!w^F~_xt-lFL}p3bI!T@?!DIf#8N&TQ0H-J zB8L8c9xlU;_ERZ}_!YON9Zp5!;?#v>EF-u#YtF>)FgAd&(#Vw>|FZFSa=D0u4fLhU zjWjJOiz{xLG;7qBZ~=61I(DFfXGk+8%IfGi%;^Esehc`jJy$|UA z)#{1ET$&|>UBH~p>#j8L8YGZjE6T8?WTQFE?$6GWSYyRVrD7d9j))=s$r>}=~9A0jT*}zfsHHAx`N$+Yi0OfiK3?aozA=wyuP4mE=jBBm*6yID%^_ z+e>oVzgKsg&t7wQp8mY7XukQcU*(OZMa1K{w{$c9`SO96(5`Xc!%-C>)vvlBntDp3 zD_hmH#Z4}pnjL?N3%A8z2~1VxrBtM*s|=3mE1)zPMHimQ`uf!l+LKfi-eTF8?WuPH zAR$n1Fh9RMBjl8^Z&&(T1CH8qv9Ymvge!+%E)i(@XnvXVXzVX}?qCIF_Yt6~<25{} z>(BJB-=*g2OvrT?x&8$XNPWZ65aqRz7`Kpy^iDPW6IzHhFr zc=DeB<^G#vD0WAFhiPb_EJ@(qDJ9O$ecI*^*81_9o}@S8XQ&g~0qOK|BGO#@m<(=_0jj)!t<`ufpeb%z29s8} zh_n5dMnRgG-MsYT3=3UVw~y3KhL0w+_ebnPFT7b$=94pt@W&pwt=>r+I;@)iJ?=vU zkw93O`UJ6i$hl9CY7-ZS8HT!{1)Uyf+v(;6z!j|e6|3cBV=^O>P~K`Gr8Vr!BBf5> zzhaINo_@r6n|g)%oi;F*!edg-{#01ts>f(cBu?YdP;ba}N6MR**BjL3-t?+N$6~Af ze?5BfaEggk*+=~<>x&$_h;g$Ml5VqzgygBwZy&z)qokqH(ibAo2`Tv@-Iokr+06HO z0>f-|^dKB(oG3RU2#BNa{-hDPLD4AWW-pMT9~PTEMy--TMfi@XpfFH z+9dP}lmMV)R@((;UAtZM;8<2>#yj0Lw-DFsmhQa0q@C(}JG=UotJh4cg-V)`lL>`? zBH{wj?XZ?{S&mKEpj}NI>@BP6B%5zLxlJGC_^l&@`h|*NVph1FDqD+zo{PA+hjp2!wjcw^-Y(MP4%cof0C&|#XK6bVp{(Z$tY^M>?2Se z?W9(!@N4vD1_0#20~?6hPkxujNmj(g z97yG%m-V`?+#TQy^xWO8KQm&MRsDiwsDE+Q_y^~Px<1b87vqvprg`8f0|1K^tq;| z7yk-Z&1T?}u-?Pl?zdgSW*cDw&$qeO30Q2^32)t44!Phf@xB2!37+bu@SnAO?98+> z2#0r0iq?b;z@&u73mXY5wWI5`6s#u%(%LFqpv8872KhR%v#?n*uz)6~rREFMBmNh? zVR(~8+l=H2gNuGOm9%dwtAdcm7DB@EGAgXlb~&$f1<-4`xz0C3qz`;;N!`7E9w6a9 zI~d+uV{7RAuviQnO9*&TJe*ZDxn3_jR0aJ5_Rr{_KRme?+_iZ9ePXr2|JP}&82b9k zzs9TBu6Qp;tiUqN8R?s)Q}$O=-y%<+4$UAM_-D=`&~ZG1jA0n>WhGKI|=`iig) z_=DY43zXS1B#xvktAEe1SAE@$3SQH@9X@-5Hr+Lc31f{zGW7NqgBj1iufb~Kt~IvE zNQ4ZN2WW1-dSV-ZXlODlMB;$)j#x;fAy~T}SW#C#>Ti~uvia_8C1ZT^)&MfGSWW9N zA7LsIe90OK;un3QJ0H-R5{|N^8K|+O6xf6VO78-&iL?1|i=8_e{7c6t;@q9W2<4WgwL zI5WAWEtrY_?DXQyn+%0YY%x}gGxc0ry-g_&e^KkIC%{;AT1})ITy652StjHINJ)=- zxL|mjbnFDD5{D?`rFX<|f*@&IKcyO8-$sl9cYl>{S~wV@SYrzBg3GyUsJx zrS2GXmGdU4)?tgbhhGEeM{ry|1z9Ko*Cb8}j?Z<`7LlX0*;t}=gCLyv#kzkC<# zFCoE>x1KAtp=(iG-rHJt`cgZn%l&?Zsd+nLM_f(4ccv+?m>LM;_Wy5tk2e|U-WFz? zq_Fv?3USczD7|s0{ZO%zL#giJbA_jk`&G-Hs;gCHzZSPeH zz9ggHZrDn^BytnM)$prdW&iQ;@x|e}$aVA6zg$DIZdR@d&!6{-lPxThbJi}MmscVS zZ{E$v{icxnT@mLC3adQHr%u8xWx5q&xA^_>)YBl5n?}GdIPa86j!mw#!)5<5?a};3 zr(e~CZ?E2y#KnlT`I6yG9ry^(QTkm$h;g*3AR3thfWcwH1!c%t z_XI)A9}3vgd;1F)23PkHwl$W8AxBYR^@q5oc- z1>YT3go3U4d)hLVbnh@8|2iRa3kTZuK(21FvNZ*^f;z)Za-9Wf8Zsq14m6P zzoFuEi@Y!(3d>8ZVs1A+G_B;84Y{IL(c7g zkLe@F06Ew8nX)c?#*>=^H^ch42FJv|1k#Q^0W6~`D#jz_Ou`olJemxqqSVP>vA@e> z1`~U|W?13zbz*krR^`G=!F==4l0j{^k~z_(2epco0mXZLXt_LSW0G91CaO?FFmO`D zm3hn+GM{LeGeeXPTb@Vh5%Pxng1*3oA%W{=kU7|34&+bbwPz_50*p}TSsWbDQu=8} z>t320m8Q!opAZuZ88G?}ic4E7Ss_-!+0nDv>@tQMmY`(qB!y85Ys{63xaDzHI(QCQqe52CJ<_H5rud^*DBV7`NS@Q~rL1n=nyq!VH!GSj~z`^U#e zJ1qBe&-NurFrM_x_lSk5VKY%GY^)^nI7ku!tLCWy@wvIz1+a=$me9fy%G!$&sphyc zYGDCRf3j8{eUJbeV#AlslIZcN+Wo7sN14NX_~0NiCZ(Xt-pCY4%Ot1RQKQZA`R0&w zWtZJXRUg-6j|Vh?rU1KL246~y4e~^V0~byaMa+jupBEm7UG}apib|d*^<|imcbJmv zOVF#+Fzd*S{EMa)&0DxYBe+8$Y221EIR2t&j3@D{jNinbptOfMx<7-!W(2r|B9f=& zLo}J7cSCjR<=&=-xDABwFLv7GHg3^Zit-nA;O5QE^?*wgmFgR+HwcH82U(`GD!k|wOfqAT4%CvyR$%_T9WwiPh<*O<0vk)POAJ6mWy%;3c$%2Bl5!0AgMKA zYSb2>Je5Ib-uQZan)Y76*3+Ql)NCf{WU!+fJ2E_CS2dJQl6^lKmA@?ig-nyda0cY6 z|1>Cqcl|t!M73<1yvOJ<%~rJCxt#E>Vicv94c@j4p+_I z))!VF05C~arScN$dwhk_o;Qs(S7Oo2OMm883#M+`4rvsh{_X zxj1f;vRa%M2-esN?J1GQi8Q_-?@%okA(y&gK|P(cOtig2^9uCbJEo(fn;JUsnoE*? zMlhoikBCtksfY(^cQEnhu~r=0fN17xVWn(4;NRo~v07H{M%ky-bE(5OfZB;@Iv^^^ z(Dd(rzQ8gSYv?AKSKAvPTAI?K@q5xG4h-o6$hMOHlZ%c$(cHmDp$}&YClG|*xj~3K z0{DmtSnnm7i6b%5vy&nAgqvNczIG;Z+%B+sM<`^Qp+#?I``iawQx74JZWGT-9-&tX zg@#(?izsurQK)B+0r1X{vsC0Hc#+9QPnY{J_ha?|0Rf@K1Tqns_0B7sjvxB)Pege{ zQui0~bdOQ9CRfw+JeGx?mL{_?r>H(^rJL}L0$Dl=~K8 zFSFP#d?^^4C;$fKzeD@{*R{NdSO`O4Z1cpMKkssl7l!fQ(B|iZ|0qSAjl572!B@#i z^`Om-HEBjNyh4%%e=%ahzF>(AVTpAKzOBeD(mjt?v>{71uZJ;yrlku1P%M&4Ao4b4 zOdlJlTYH~ffIfNcTMfqF%)9um4|-A4En>IKJ#g7vJc;c7iTvvAT+T+`|YywuLHiI zdcV1s&)|I)?0V@}s`#JqmE)`=S{`>8PNHF@<+a5E#G;msF?=*CN@!$aD?w_^(e%+9 zI9t86*PbrW9tjCopCf8ir7-8UWdgyycA5271jbi;%8!{5zr$u3GN;@=`P!afi^n_N z7jF#4)~K)40My|EXcFnT*h5TYcHVa|ORlviGQ9&vmnf@Y3atk-@90 zzlR7lOt$y_6-7Iz2@`b`LWy$^*a7;Zn_q*6t~XtT-vZ;0HCl9szhZC!9-%0AvVe8l1ym{K2T7 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⊂g0Qf#X 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 z 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

pKXt0}b=2ljw75M!&-`mD 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 Date: Wed, 7 Feb 2024 14:02:15 +0800 Subject: [PATCH 016/223] readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 25b0fb2f..c12e9361 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@

-**UFO** is a **UI-Focused** dual-agent framework that seamlessly navigates and operates within individual applications and across them to fulfill user requests on **Windows OS**, even when spanning multiple applications. +**UFO** is a **UI-Focused** dual-agent framework to fulfill user requests on **Windows OS** by seamlessly navigating and operating within individual or spanning multiple applications.

@@ -26,7 +26,7 @@ ## 🆕 News -- 📅 2024-02-07 UFO is released on GitHub🎈. +- 📅 2024-02-08 UFO is released on GitHub🎈. ## 💥 Highlights From 3de5487278f1eb74a4f9a2f8401d94dd5f2b32e3 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 7 Feb 2024 14:23:29 +0800 Subject: [PATCH 017/223] readme --- README.md | 24 +++++++++++++++--------- assets/ufo.png | Bin 0 -> 137629 bytes ufo/config/config.yaml | 2 +- ufo/module/flow.py | 2 +- ufo/ufo.py | 7 ++++--- 5 files changed, 21 insertions(+), 14 deletions(-) create mode 100644 assets/ufo.png diff --git a/README.md b/README.md index c12e9361..a309b385 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,3 @@ - - - - -

UFO UFO Image: A UI-Focused Agent for Windows OS Interaction

@@ -25,6 +18,16 @@ +## Framework +UFO UFO Image operates as a dual-agent framework, encompassing: +- AppAgent 🤖, tasked with choosing an application for fulfilling user requests. This agent may also switch to a different application when a request spans multiple applications, and the task is partially completed in the preceding application. +- ActAgent 👾, responsible for iteratively executing actions on the selected applications until the task is successfully concluded within a specific application. +Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend the application UI and fulfill the user's request. For more details, please consult our technical report. +

+ +

+ + ## 🆕 News - 📅 2024-02-08 UFO is released on GitHub🎈. @@ -37,6 +40,9 @@ - [x] **Easy Extension** - UFO is easy to extend to accomplish more complex tasks with different operations. + + + ## ✨ Getting Started @@ -77,7 +83,7 @@ This will start the UFO process and you can interact with it through the command If everything goes well, you will see the following message: ```bash -Welcome to use UFO🛸, A UI-focused Multimodal Agent for Windows OS. +Welcome to use UFO🛸, A UI-focused Agent for Windows OS Interaction. _ _ _____ ___ | | | || ___| / _ \ | | | || |_ | | | | @@ -104,7 +110,7 @@ You may use them to debug, replay, or analyze the agent output. ## 🎬 Demo Examples -We present two demos videos that complete user request on Windows OS using UFO. For more video, please consult our technical report. +We present two demo videos that complete user request on Windows OS using UFO. For more cases, please consult our technical report. #### 1️⃣🗑️ Example 1: Deleting all notes on a PowerPoint presentation. In this example, we will show you how to use UFO to deleting all notes on a PowerPoint presentation with just a few simple steps. Explore it to work smarter not harder! diff --git a/assets/ufo.png b/assets/ufo.png new file mode 100644 index 0000000000000000000000000000000000000000..592b9a5a95dc129d8ff0b8a6b81c3cde395ca6d4 GIT binary patch literal 137629 zcmd?Qg+o+L*f+d%cS=cvG)Q+W(hVZ1G)Olr-CZIjAuJ#W0un9_(xJoxB8{XA(yWvS z?*Z@UdEf7E_+~lFnKNhRT=~1MnKPT9tF1zSOM?pnfe6%8!TKN&4gv&1SHwmGu56un z7y|!Ly!BNSLAB#_J3s~9K|xCa1gcNNySBmrfzUv@nuf}E*Z&>pK*2}H1`c#=d~9rd zVsc_)d~$MpayoM0kD8H{oS2-Bj+~B_nvRp0k%x|sm64H?krnvkVP)l{=9FjU6yV{c zZ+=;?m;c0@7e{X=xrFn7p_=tGttdysES`SX%zBfaT?lq~(Q$ z2f<)fX;l+W%`8n#RZgQU0TWLnU9hf^iHVU3*doNj%EH8?ipR6W#Hd%*uEfsHN!6*u z%E{B$$xb*1<`kIX8yJ$|X<_HN5*Qc}5*PxMz!*=b2v|%^j6nHRO5mV)`BY3w%B-uC zc-546)ojXL$q=udwaZ%fOgTx($Pj?7WMt$m_$Cl9x{OA0e?ooYb`g)w=zd4&z2gYsL?EY|TW^n-HHNy)8mN=ZpM&-j(V_*qCp zFX*i5BoKBRl5*?YmQsG;**3+x4Z96&0A0auBT~w%ssejUK(|$+g(;xhhLWn@+Yne_ z+sbWBN>x?EZAjZniB(l?7pw|a($L#b)mz>$TGh~7)i8LQ(51O>7SVf91skkt*oMJi zy$x+yy(cN7D_K(|AyeBSQ@gOPuG_*YSl8f5RZ4GLSIA1&SyjqbAD_wsyR5_O^WLc64;~ z76#iMEgT)6of;n>otnBGx40U29UVVgnHrs%oh{$KE!jPrT3D#vJvbO&Sy)&YT{)Rr zxt(2K0m|s^!tBb`*>=e7w(IQr+4}mz)b7gqUD;mQUf*6{zn$GaTiD$OYIkLK>STR) zdwuF;d;Dzu_8?(*cX#$|eHR!RI0KG@laqtp^|OFo#5G1*~%kIrt&KtiBD*P}M`&nxkqg
s)RG=S~5b+#`t9=ZcMXgK>!{$nzu8j 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 ^$F` zcJS>{@aPdf;+*M5(yx$9@59RY)hXVkZCU)WQfij$pc!_kh}MJ=!KJ0^^LUY;perlq^_xPx@Cg zYc1gJ{3&UPdqVm@+t>L{IZKFwv}`!jU`&#?gn~ZW4vKtLIt)ZS!o$z}70lNIVZ~Wr z|G16WG6%`VMMUH(Mii|s;Gdw^??<<+8|9z$n)v3Jdgv+D$e-GNIp8}(v__= zjidN2YROB}>z9ZW9F;47aKj+u#%XB7~GntOfCN+tYVch6ljPNxV5 zWi_=Rd$J}!JMe9EgmFbu)&hy%x`P3h0KoB)PCW;T^FpD?z*-#M#G_@P)$;E@vH-EK zDAs8fIEpZx5|L#HDDdkv`VHyF-+CE|&SD^j1YjD)$S~p}Y^MIOfWl}FEWIrRH{q)| zK&kwE=NvgCj{I5npWBQ2;hyHX(GQ4DXx1L>a*oVfGj@iqEeFXFB(Fath2cqqoB52x zO4!c|nhpaly`w87dwsIz#FdHDl^PJsH*7;u7qgPkUA!>e`CUB-G_C5yiam)A3z5zf zoH-iZ?M!B6>5xB~+Somw4_fuWI+1|NaVEt)t0CASXUFy*TM={mBi$k zSsITBjJ{qiqMKLo!ve?KW}NELCd2WS!A2q8x0#08Jb5H2(qbjjF8~6_8Wo2EvP2wx zmyML&{~?FVfPt-c1?fE+`Ulr8S=T^c4Iyl^soLPgfu0MDZTLOLC^q`l025H(Jc$a7 z9yek6{azp$`wp)j>^x@q3}dDP?f!MdE1#T|HQINmx40X$DUvciS!HEI-C^ywuBU`O zkD$kd>=`YYkZWV_x%2`I@HXnY7hkF;e_L<=p|-JB2*QO{U%vu^`@n*djAzW?6$U*0 z8Q>z?KSFUH5#Y~&kV#Q%3dc>cUTkl%pmcC+lvjVA#hju& z9|l?L_f9TeA}|7i9d<@v9*RKSd)pXg1i8J%N&RB3?u6QFE;g!Vt-{XFV@>bdyMTrkT$y<8tnv%7ZeaZiHiqAHq&ZW=LLm0rrdPB7a)KBZI7Af1!K9cU&`Om z2sVN*a6Y)2n52@Lo{gWX<)8q90jjzX^qLXoyRCt8r^-JZlPcp!OX(PBt%EbYIvp^t zAz*<=#bjwQtLf_n1>K#2y9xZQ+XrCxDtt*p$Bt@R89@l^W!L00FUpBLq6UNTbP!FR z0_xL7&`B2Ox!(70qO||2zOoLm?i+s{u+a0@x7;-PVRJCDCjLvPdr9YChGw)u%y)&4} z@u{|dfxhci^;utuMqU#4E+nbQl@s-5d@44)8;bAU}&gXhgD-ta$I~Id$ zUs2=IFNN4vwKK6?N=N^!F{2*p0c2ibugSC9#EpYK>Im|pd$PZB8yb>qxRSUcH` zmJDf=VB+4X@?GzXog`9;KFs&iS2IrVlLz9aS`I|_%uDWb$}~#gYdpi;o(JY+B$i<<{nuArvYDJ>;lPxn8W{d z_0?ffbqb z&e?PBx##RyYwfCjuA((o2He?!_kPU$A19mvoFa4-(avR2X&}ViEf_hZ1eeP^m{3TL z&d72>wKKr9)qk*nFin}FI^Y(HP}u^RlMG7}H*q2P7n&;@L({`GF1>4BWK;gG%zw{G zfC6324aWMSFL%hg4iwUIj;H$iXbQ&OAs;oTm)Ubk2+vA@fU#;)6-ZV}M*SJIW_J(UD9ne8TqXk72{1A(wX!=ai7)lBfVB=?`>O9c)w=J}#}ig8q7E=HG zT6yGIR(I6|6bRXd@k#A4My0F7F zt+`w-+C2a&5EvWv_8PTRuXE~=-@aP^8W@O~?$K~)(UyJA@{^tx(p|MtIGB3ms%f$u z@9a>s7}nCvh{LBZsCkMqr+pb`h->@#)sR3Gz*87a9*iUCK}DWIBa#J&C>pFxS4f!k z*dD#}FeAj##3dNs(+@Ds#UzJ7%wlIF^a2h5Vb!8w%3-8mQB($_gn(t_~0%wEzzLbz}%ICv1UwJl4Oee*Mv(+J>D zs$Ec6a-Ti7?uXF6UgydqU+zpN_|Bqg*t2RR;jWZQIFjh8I%~D73e1R=*Rrt`p^2vbt*Y(1w#3RXdIJr^H(?z!YB7{z7lIClG6e z?LPx;p@8mG;Ml=Zj$_%bYn);q`4$I+XZ3zuoZOV5K^ENacHx(=YK)>$?)(`XQpsqA zQJ?#618O5%d+)}8`decHqEF(PI1O?*O#o{WvjIGPOVvq^go!O6`3X+4)-fzq7Tu+N z$WQM@hz1ALIJC!Pz^!){37!Nf&8}~X2cB?9^4iP31h660|B?igC16_#fAT3}99C5k zf3`fuuFiG3u6=aznP{fMHM7ETmE-Td5XH2KC@wrw#C@jwxeH>x$ou8g z9g5;g;B}5w4qn>Cy54}iybP92V&v)Zw)%E?+r3MkpxQc%z1_4>)hw+bB1tk{#LKdsW;|Ju(x zkN=n#N3$vB4~iW|C2{gdnZ6;KY4!*)n5hVxf}VK%Bk>hhfzLHLK+aHaOVQr|I;fW$ z=fw@*?4JGuK|(V&_2pJf21}=x3yT;{`+`;;{Wa$+Cm-JP3&x%~6;*#i|2e`61^5+# z0p);Um5A@RY<2AIPU674bz$i_L6D-#t??wOuu0ntN!uMB;u+_&B; z07Q;s{+PR7$mFr1Umj5iC(fDL*SM3RlceyMK0^?ed5AH@&0n5tNF|78rZj9wJ96xfOKy56)j)h8MO zAsZXE5b|EPSIwMCcnI2S+gtL}hyEGVp+o^$Vp{f;ng2%EsmrEF3Q? zKgR~3b^6Ba%1_B>XEAif#Kjf4sZ`PlQhSjrA%xE*dvI$Wq&*wz+id4Daqc(_GnC7P zYZuvs^#w`*#vTNr%LvlH_dQ-v0vhzQ?-f=qAa!^qZWb)P*VTOL|8#~=v>x2QiKgw(a)Fq2N5;z|iMR56S ztvVeAE?l8iwRpAx`!CB@Ls@=gelopyOHz*gqMXr90bcpr;#?M+3&^tp-+gYCu*^9S z5JK3%Ct1LKAu_wy?G98CB#QBik&^md2e)Ah>o9RuR*>OmUj|D-O`?HDvCJ+C$W$e= z+qB*HBGlotE?3so0)6hvc7Uon{%b;p>@rWitpbt`n3qJSW&zct5PIHr^{wx%2sWQ9 z%(_!zdA+UurtnXR!#wv_*P?kR{Ubh{_zOBTa>wr6_H z!Rux;F#)KZVRyL>ny+FN%P52UQWZm_9aElSDB}QQKRV7Zk1i#v$;v#c0`hg-EL)dp zhS&T#(SGO_Cf-eSNSxA^m&%Ig1_r@nxb5j)uT!EvG7T2*tFuH93TaWA%!(7yo(Ths z$^O&Q-iPWY{*<>#LVOAoTb?&pGBy%-ev5K}{`nR5(8$2)PfaxUlH_2YCXVu>Bt74F*l!9VH0>R}GoA}R5!#nx7b9WH$3m#+ zq!^`HluRw%;|vl+rVGKQQfbPT(BCexo0m#$($AmtyP2K{4@29rfhVl{nG;rbg{7L& zAgd{C!oq?F9jW(;PiQ6l^{Y*JVU!*6$kpF!5H?%2FkU11nCa5?vX9hrRV5;3_5I}^R+tCvga>VyE=N_AzO#8bI1ZqAX_ zVE2{()d2cbg3MEUlKxNrSFc5h_bzO)SwSHU__?y|TYK(lyL;Vw--_kq$!|tNzNl^O z`RQ}WB+&Eb=rW9eLrM-@d%4QZN^C0NnC&z%R7?Z%DQ4k;co7Y-P z-xA=pEPP!g!F5Y`t>vzZcmGjkV6Ba!ZvS$j;R7)bnmuq}TkJbJ!&VAnC1FQM4yTq1qvlSfo!GJv!C$#WKuVj@KwG8Sn##at8<%4u;96lnBt)1Z{VLG5Ke| zce$`#e^avu0iW|6SaBbI3XFH?ge(QFsFd4Dc{81~Rd0qj4~iqmKJR#BmH0D4k>S@% zs}1V8itH`Eedy1)vY7!h?m*qeF43pWOqNX4lSnFxWe{=~hK{-y+@U2ECaoyMe?cUS z(vG`=&?eJ;)};6eeivs^dh;{Qj_4tT>ILuz1WC2G$Tre z#^o#)fK~ouUI;bG;sH%?%xo#9~n6Eo}b~Lg0@8Tx+->-@I40#1q$WLr|C@( zllUhNIJBo)wa@-aCIC|^#IISAZa*0GUN{sAvhFuaMERV7rcbgF2z=DN8-LH{Lw^55 zg-ZWVj{*98{x7($2K;hDt+9e*PNxi5sWy! zgSjhVpf3t!Xja4`c67R&6jeXDrEsD<92l||e3o&%5U_GraQQEHHgAcs`G0)tfyUKN z8ygvN6b@EFP$8C%B*6OOu<8f=$QMHbkgDWw-GG(okPAIIwyfqs0hbFJ(k1Eo)Z(7@CaLj>tvd6 zz=6Ejj)`V{0)iNdu`wosa*NXQ!STli7X#ma$}>lH)}Hiw)E1z#1MI>zDLLAZ3(2=B zay0jDjZL$H%3#9eX^v35#fscq10iwGxI<^-{nNoA&xw*AJH3FT%wIXSn^2tdUl>nV z3x8EDYUu9ZMI0EtYjQQ}xZacy>L-ZgW)F{+3~0$zIiq~QCoZN|W>LKJi@j-gT{->3 z<0XRZuD4bi+FN!-aR>`esc+;g(1ma9FcH8L@d|Ts!OX zHA@ZJ4sLt-R)A!x+~L^573DzN<(PnupaJ5R*JKvF$s0Is&^JEcH?lobIaBYy^8N!B zsB?gfE>_Ot9S#q<`#J$XS5O#EIzb=G62{lcx;dc1HXMMX3J1$wL=a`B@_C%4%d&fd zXlx1sF7}(Zpz@g&m3>Bf1x8%y+qvhnlRog+PK>#ZQI6*ch0iDV4!@0!R}CkZ?srHN z>S)U*#!SA@V)fRoSPh7ASLECBy%y&Z)y$k`1Z%j{AX>JIhqXpcRHUsshX_d6(|G*@ zZiu=UH{IH~yIuD#4~T<)?V-o82E3F`;Ceh)PJRb&UXNQ_s+^twq=6bwR`HP^$V+^s z+50e*QmA*DaO!QhS1Fix-ENAwUu+jmUtd=2Q?VJhf^$EtSVr?$dt@tVdccC#O|hqU z7_ZXm=Ph$|rl~Y(8u+b-GOzEuFy>bZMh#?NgG!woo@;ru6ho2*4FK>2W7)rF2fa#@ zW}$tw-jr4$y{vs=A?^tHeK#qfxa%PEy(fA{`-kG-{-A(R*bFsy^-fp5)5QglKxg{w z>EJ}@YjF4t67}K34qDVw!rZ0zT+7nkbaqR_Y!3u9ZA<0|T~k4n4d8sN-LVB^j8vu| zQ=1Y`(f+H4h5X%}I&ewAtpuaTjnRF(`W4K$j8t!rmh;t+myCTQ(-Rx zsTv>>em1;UNsCjF&^$t&IJcqq$+&p;B6_%#_omzmiW+e3>vk;?1ST06CLB}CEH-t= zJxKVV*4xQ-KvthUwmY6RHrs7_L4xq)UNmgL$X8%QR&qOr-~5(x!~jVoPms(eUs-ue zctY??7IfnIM#}EBGqd;>vu7=MF{qQMYi{C~Pn=bJ?>6hh%MazA-)1)1#bSSdXBW#g z@b0W8yDU$fmU>Uco9BDAFi%NIKk6Kw&Y83!8=0jj_D>*SO&U`%pQ%tLUM-HKW3g}T z;by$ko+hHBm_ktVXOx1E`6+SA%RUE^Qu+hP+DIkq7nOyWaX7KS7DW^bX#9dKpEKnkjQ3qE*x@r#7g z)O};N3fI=-KDQFy1Eg_LW|$3V6U_T60?F~LAdsna^)w(3h~VLcZWj44O||}={evN$ zk*JqlXZ26E^4^atnS>N&0>-!n8I$jKu-d8qne*8i`VK8%Y0V_I=ZIY7l;Tk?yLowe zLM4*t$oHy^r``E61xv{_GvifpqdLl2R7pFyfZo_FJ?1)-^GvWhleF!bJyDt*q`)&pm1!)Ou4x7@?may{rv+b79~eMi`Xw#!B>kVjLSZ!6N77(5I{FkdXE#Ko zz{sa?nUMT3_UTPYZp|>>PDHj5HMW^pNAesaDf1%WuJntm4{L$I91Xh`<^rd5`aXiVSGaP2 z_&$6?d(7T99B?jSIt|t%dt_wxqcYlMaaWFey4|sOo={wn!Z?^G-_cJ~5$6)i~x|% z`5?^2t)APpovCm`Uiw8Z@Q)a?GS*azS+MeqOIBcD=h6oDsKlo)xtEPHp#X>k2+9QT zr5(AXc)kb;@l;{N@H+dT0Vc$Sh&yl}9BUkLDbrbr4#tQpztF)*J76cyZtr+kS@=9c zW^L2;#*DeRV#G!Gdwpd;SuHUKNQ;k@k8gn!6ycMTrPZ~hAw?JM`s`T>9FaOf8+PMMy?EN4^s|MfV8j(FSd>QkruY~DYT1#q`5eOmk9i zI`YGl%W|E|mME8NwrQT=*jqJwCTuhZuo*fC0#01su;q+dd(zQ*6#y0d#+sJfSbTLk zDeB@^?{MCANnD{}MQE>@#nL+Od_`M0Zuq(0y>g^1oRg2{{S{)vBg*rx`t>$VmBF^W zK4N94s8K8WbiKYg2Wx5-xeqIUn)c$t^5WcYaordHI1Qg5NZdu*oc^n%2gmr_8M`=1 zfu-fDu=lP$!G^l`b%VLM!*L|=T7G_uoBqjZV|Gf~*z-v=hb=%JP=*2=%Y~lt{R+zj zO|{~_%!bSl=oa86{7HKM&l(sW+_SY=sU~syM9a$-nc#+Gus~kb`um`&z$HXzMMwxn zGXlHab<>w%zSK-zt#L;PB>^eN&G~%|0SwLy^r~`gZp+fu$;?BWJsKN5%G09#tc(@J zFfyls6rO-xI9}I(tEo2GzRv zopJm~Ur}(@aE+pXsCAJ=m11N@{e-z z5I77Uon9-NZIG0x6f`JzH674|bUQH(lo2sG`;Fnjq|+3MsqYhJQs;DMhOqAjzdT-~ zur25m^8|o*iE2{V)&mz`DU#P=@2g5edF}oDX8ki%Vw)PE?}qS1e(~RFw|1Lnh&Ue` z&`Ld{qEj`Xd2zQTiiMdfkR)%;u99!2B{`AIJ?o+M_gT&Or6j1DS`y{7WMnb?lzccb zpccidrpL{q%OWJh^pIK<)DvLZf*93X)%w=`9)LtNE&={t9FZL< zY^y}{Tjm+b_yT{ern1G}eNQfG)-!b%_jZK)tuedt_jAVHbp#3&)vRm&et6Js#7iJ^wPbJt-!Rgz0+3f~8ONZ8iDR=qr}a>x~$e0=yQ_g!pA# zH_cZyT0g)NfpP?h?L}R=FR?HNGuw(UtA-Tz&wuwFY6&oVF~XKXFH?&nw61gV5gzja zx4b+xs%SR_F``-Ok}xEZP#uKfE~ zcIgpbv~SnJS}!U?7jrZi;UcCSL?g%+#-bOu?AZAF{^f5V>^Qs zEK$7$O^Owl8^Uve7e6Zpjn2Cue(amyUw-;2yZq$KxJJa9;QQVMt03VwS^iT>r`2;G zkUSahs1!~4RVdnwxsy;v;a6ohvLEW|HZAI|d)g;7C`GF(CI^-X9N`t!Fh~rBUw>nh zb}|yL&}&3>N?t|s=*dTwQOXwH#EN_m{Sz2<4&<*Gk6bwfQV%&*tU^jV(s%RE#QoTP_T#mm(&|NJt z!L2OmWmx03M|Wu^*j8{2aOdkCX){(xA8&@RaiuG?6OLz0?NwX#NnTeE(CO zYlD{QieVJ9jqMbKgk2i9#Hc0Cjf-X`_I@~}Rb2G1u!HU+i& zydi2`&+ubkM|dT9$cUSgXeURzmf>3Z3XbFD5J`1Y%}ZeYQEjzM{~=?XIQxwBF=U~O z9ZmCNzgg6u(cK^fgnv~pR*=}|PwWSAzKw%{q! z({6un6J!hZdp;aJc#u;CM`iY{ww>7`AggkSReM~$N37HPlaCsGac8G&csl@$Ii|=JG4&_0bfIz!x+UiC=UuYNZx?T&X`B;9Pm$m{F@ zb$65qv{*4lwD9tnJt81nC>O5lRWb(6G*0m@3#QMk4_KlT0s54Ljg}#Tmm=vPm!dV1 zS7GvzV~iL`ZQ)b)%fCMJt>ppYBft`3lEIA4=e_NwXy!=yy?k@hOJ;H&sWHN$(RW82 zzPp#_SG^Q34qDN=sXyGzqNpdAEoQxA`lE zU{>X8l_O@Mc%+1Qm#Akk(4 zQz@+AZG1$KYry{GDZspT+<1ON;|x6>pHhABn4&||s`l+<%DoyM^{!Am8A~g2yMs_Q zEtB5X+(!hELz-UpjB!UiS$ED+Bi)2Xc-K`K1njTi(ueeOwPNVin*&wDxBVGlsSIc< z84S1&1BxpYn0sS*?no>_F2qkLz8RSEcQ=TQk9<_|0OsX0rKlpVcZui(5+irmYKEYMH(d$;ARjr3J<5%mE>>_`7RH(MyT?lx`PeBl@b zqux)z4v@kd)|Af9V7qyUBFfC-`x1H{eN}DHp$IPTzHtNKz1~1G2-%8B*N6V)?NFp! z?(PlD@_gT6Pw8(jHIPv=P}s>w-xu#Du>5J1#cmG(g3mfq{WTdfL^hCM;h;F6QGxEG z8-e^3Q}ChP0)xAkF#7|Z9IddU`>61m%b;161A3YLvTNrq3(e(pzJIxH{vaSd(K*Ku z(IT0MuTsXx%W<`b=J4Dhq2jXQi244B^&*e6H_fi zB&qc(G#-T{1*HlzSy4~{;qY<9n(PQf3)czcN+NaWV^?fq!=Rt%Y-x()#LB}f~_m>W@?6`r(4{AQp$$|gN_P^5IwKvBV`-yParTmlJjozGzNhE;s^d59wo;1SjE-X`3mb51z)ZPtR`mf2I# z0NnuuUcbybDD?{-OM7?ainMw@PkNNdlu#W9aQAJ`z9dFq&Y>**!4@qS8`{R&e%yF@ z*5H$cm*m*`xZ(TNSB*b!DiR#hZ^*CD99fUOOd`Y{pOb)Cl4_7%nej7FdGbU!0|{m7 zEcs_&N0$1iO7$7tqo-fObDFhYAjtbAZVZi_){XOynz5~%BOxQd90(X(6+JKUd*@SQ z#}R87;PNL&6F|3=EzS6?;okba+~(eJ+_>}?%lsvajR`FNvB!a>%rKR;o+ZU&TPgf% zMC{|xRY%D7j+2$a#CZdI;a~N{o@bbLCFq3fKlpwR56DyZROK7QtQM?=^w^lGMzH}d zbOu8V&8O+F3fl-nmH^!EbHAbGb$z8IE!RFi3R70qi!Pp5{RuY{j``y637ypKKpU3pW4+dU7at4v#`iX;^I#nRSt72eKG? zsa#O}sf3?vP0mDLNO~1JBfP6PpHoNG6FD3=Hs*r6A=l~8I=wqt%@mxaBEL?`ADug-!7sqaU=QyB)%g7x$ z38ZGX52reS={~VCaOV4(m?`0pM(G@G^y<$Y546%%cNn-chFb(4SEHluO_5E;QA-_@cokak3PJCP* zCRWzxqpMaB^W&#;)9>oEj;tw2urP|LrPShvtq2!~JmMjz!d&_IRB>`24<6O9=}q%3 zW0^JPId&c3nte%PkN{x4>^KoXx?guB>x&le9?uolZ#T5j)k|pRL-%`5Am{Vy@)EuF z_oXCkMvc>#c(ncPurMw?fo69QudUj_DP3CJj`U9>>%;1_O&zw1SwPX5U9IG~(y6H= zon0Jq{Nq}sN~-4Z=~cBB5`v+g#hQN(KxXMzyg4wUGHz-SOq#eExlD#Y*fvrE90dw= z$KQ>v%B#@eoO%f+$tspkyJj7@yzA87lT46-O?GeoDjusz`TXkqXf-plnM0|XB-LkS z#nP!J_W9C=rGZ8Q)P*L*zsy~g1YgD6{NiIRcK?TK0>#znsMYi7`1r?yu)?)^M8-4SM_Pxv7QycrdYFOr(c4a~2CRSu!ET&k z!@p_&!WPTbFzVpC!G?T(ZP_)KZGuVY{=`%i*m~Sl+TYg?bIT_nD0yOVmI!c{pnaBu zY)L?vIZqKF-2n>%@IPD4amyT$aPX&_7%&xAe~Nnvpor}qC#2K0kUnn97EB-J^!BlB zDQZ#b;A{>y1U@*8$a?{5<$PULlz$$;cu&CZQ$;tO(RaK)afN>)}M34rb?;hz!y(oxGzF`D1M(^ zZniCx3lK% z&D)3$j2P2RDcf}x5enVH$ZYY4iWzHn&{BxBMs6ikB&v$&ioutgs z@@KhYXF&hH3*EI`*ZLW6t7!>QtH%OC+q}c*w9l} zP^hv)-(gLg>h^R~Q~2!*^UGxmMSv0+1s}lhovc=1>5$~zw0{C2aInf&bkz!m2cZhf z|M-aqQY_;hU!=0^8ZTKRtTEKqP+avtqc_HfKflKta9E&2gN6z3u+U5et9ivxQ~)5s zNH`$ZQjf}1Z%_Dnt$3?q>}(5OL>&6FTlZb}e86M6@9kxZ3`2!P?xv*^M%}CBcwuKT zKEIp`bYz~J@3)ixV}fY0<=^|MhoboIDfc`U@E6TQB_}ip08+6%JEFs5dS^*V7~H2( z?61hML9GB`QpdJf$_t=m_U}enTss-#TMxU2J*aRCml?|lxEK!*%J4DVa(zsG#s`Am z*`q24a8ymZJU1gen-YnjLNEuK`pJhg>=L5KOaeVtzq^mW_JL-ym5iDZCNq_N##>ZL&F zq~*P>ybD#gx$D6BlYIPDhWNvCae+U3VAz+X5BgwlMTIoNM>Q5GJ;92gNDFIsWSu@1 zxyWU7rAI{4#%@O8q>H%S8A@=YACPP@IUy0*@Q9c?kKp!~qe@pm8s`kSw6w*Hu4 zn!5tO#Ibh)1_9=q-5!6Hmh3mbF~5j2po4*sfDLZ|p2pA|1D;ml0p%6Y3*-O&khdu` zWLD`E)RDJdinJmkzX;pvjKp&m`F1$xh=G?(mP6F@=b5SG6YTWBz*_+-ajD;R8}P09 zi0ZV9B`#i^*n}>`=-9Ys+r|NnL`sM*@5=&RHl-yeU^k58u8;}_(A~tmR+!ZJZcJDN zkEDZt!q!ZO?B3&YcV1Ulw;hH|(tg>e{$R}icVEr9H#`hVdP;%yQQ}wevYvPw@a%Y6 zI=5F^-fq$-n00`}rbb$2gM~NFz{lk41FI159odKpZ$$WDIXAU9gZbx~h%lrp`wm11 z&h8|AU;W$wb}fKCPnU=Sfwck072GxS6h*H%zzyUBlw^oIw5K{!F^#4~2Q-1?FphfQ z7c2^qQo}JHa2aBi5StD+C@lY0pI&Lj4@lEQ!T~oAM`kO+0Y~_BmbBxS1BsMJZiQA@ zc!oT)=FQ#Elk-(gN{!^lWuMjjp81eK3;?9JOLkpo#eNx_%M92`WX5X+gY)NELp_Ge zSGKF+&UAkR9M7Ro#O>c-JTa@SKal1<7U(RNtG!8qrfQ3Szw{cjy_#E_V&m2J7rqNG zo1bcVSy%URYw>vUn6rPe;)!)^G7?ag%G)#4 zt8d)mlEI6HugjIjM=078PinZ$iE}Ky>vYdew?3#~@@?Iyv>yBtXQ)m$sOPdJ)(y0T z;yBXSjgF7_(H05)J|oSSEPlUEY7ala-CQVt!eL`jA*h>OJx}j1G5w~K*<-CALxqf{ z#!>Ym!a5=x#_vasy)VGJ9jL#VMN^C*7Mkic)5b0-uN0f3C+^sIt_eEnS@y2)rx-HA z)0wJyivpjcD~N z1FovlqcP6mBkaHx!GkwN!-_fcabhaWFK&?~#{f5*Oo8_67()OsINoi3eYpW*1V4fQ z5)o^$jIZ{oX^OuXKk^L=52$1@796-Jd~@hThvZpqZ4=?fJheC=DU#%NoD>XcQ~-?qP(>-WVd4V z+DSQYs46XXxbE%sGiPV61n0!&J#WHT(qWAbl;DN8nA>Y%D*1RAVT}wsTAtnfG8^8~ z0sE|UeL3o|(YHMq67f^X_W3A{^pni32pmG*BO@iVwJt~AQsN0{5=~fJo1_VXwAV0? zlrMcux(Pg(TWa0nww4R;(%&VE`#Xi>NxX@envh=0=)>d+E$L21Rl`&w8{>T93+#ZgY9=(!i%sQ%94%$>Ksj zE>1qvIcVWyG|h|f2qK~P7)PVBn8EpyAS9p615A?XSCxg#3TiigQ_LD*+$4_}Cwvn!<03M!kx zfKfG+(z-X_+>*k_y)dx{*HZTDlM$;7=1?aME_x6V!QzM9rPD;im`jilm-)T@utuhJ zor{?|Y`PT|Zz#wy=9Lg+`gLQXx!R53$2WhTQ2=e7A(HhrP^&cz;QI&tV2hI{G$CyU zhup#xnDKP6Xv@P*1_t|X_Va1p4e`)g+(npZ;2=A{tMCd(0V{0o1TV_(x)SIuq$KL_Cbvnlu#}rCJY=Gzeonl8Bsj3w-C0^L!pnCn4@SlG zyL~?F6+7sK1%Cq@SuL-OnCVN6ot}QWkv44DFoA?++cwTgx)iS$SS*}CH=&bErWgLP zlyOBLU=y4ov6{)fN^C;;rWh$f%gZE1So#hVLR_DBk%wa!oIxtvp~#=~et8dHMYB;H zDV#zU#30QjpST*m0}`5EV~};GntWyFW}qZ8vS4GtxU5}gw>5Ue=)|9mJw zw1KA(A7J5VyI>r-$K>M05eotDDCzA0=Ud}QXF%Ii(tyCqLgJLjfD_aLjG3OsDZi}A zpY&{3{^=*E0V+R_Dw2rytK^GGsF*)l_MP8*^mid&owy#DY%9E(F(Gm_#=LD><7U?K z(uVN4Cm zv@aPPLaz+TE;?kqQ!cr}RgrrfiEu_1^_R>3bD3FbY7i%UF9g^qiod-0ffwR|KC7JVoq{%H8_xmSf-pCv zrF*B62wnHUJNqnYzs5sH#Tm;?;?90ENrd;cnQ6H7y1Z=qmg&8WA+C*~LU9m&dc1#& ziO~nOt~3$F09Ys~mLrWx{WMl&iUJ6}HnIXza$XS|y`PH$LX>~voSP+be_13@NhK26 z`#3d6MLY4DyH*8<-J=!MG5p^HroaYNDqe50P~@*(5*yxQAZU=7TRSYt(xgPXyutByDf%@cPdDX1 z5I@A#o{eobd4|+<@EY+Uh~Hna3I00nL?W(>Q!8C=Y{QEaYXsp}ePcj{p(n4F^+l#Jjq>DGq2B2&H%Sp4Q1LWLz)wPJ7*ewvZ)6oPQr8C$Ycn0K!qz z_*+j(4iKl3I5B71J&EAAK>}_Mk47UyqS+YPlwVi!bU$Os54B#l31PET&>C%_-H1l(lR`}6^6!a< zcQuHGTBqb^+py2}cya*DPdV|oOv4O@W|yB~7&DNS)YQ%D)po{Xr5U?Do?;2PB==aooVN_RlEH= zfC=7bstW9mT?t{7*!zrs9e=-|LcZN97RhWKe5G7Myr_IA6wCU4EVM{|>cyKEW0-7ln;%A5O z1y1_0;#mRmUpA~7cI3E1u|P?$Q61MgXN2p^*1YxLHlVjnaYN{94iqsgzVL+mUb=sj zQ+2a1cos7J7!1}H^4WoGI(d08-;Q$7=z2)R_w`@Uql(lJ3rWnLJJUAbYr)hKtt3`!Bl{z5iLaK zaa|1nlaMfZ2G+k?IL3YsoUMP+a_-S!4zH~OSXjNlq+-(YyadQZ{}*uYF%?@{!NO%~ zSsAfAA(LkSo~#AbRzfBF!U~G^9N#z97Xd;K8%$I}dcu_5Q&v^TCH()ytHp&6P4?_eCx@Yfq`2Kdo z1X`-Ufo1icNjt_AtIlfPbX#;Q|;?Z*r#@%?w~?&H43iJ#}mgNJQ5+{1pRJA;vru>P|zOP-hBumyjf zASLd=fQ4ar1S!M4nAi`nD6A~{;j+V{8LemV}4@Hk}QZofp<_@@xBkxv}vz`;cu#lA*zo`&a&F zyDMCL>u=*k#6ny3W)k;}#i>WFVc`o3H(k+}?;kE>i~NF`$fw71=xZdjDUXR^9=dU*!JOv z6<@b39;fI-#i*EHHY~&q&m7nA;?CK+HUJdn5W{Z^PhIR`>#iO>zJ>)FBzS?#;iQ3t z23S|xP`9=@8^g_Nni6LUyDO%0%{I<>M#qc+?f1^o@xL(i6_w*I^K}kYQ4wQ@&F~hD zFLGnE4^^FiX|Hq{&tL)Z?BB^vB`PQi&8_bkUBja(*YwFcWt+2Q;SiSE^!|BS^dW32 zm_7QC$w{+B(+Av@-ta1}JdDRF+g^nA95K4(lb&~T8D5HLBCeW)Z^_+J$>DamEb8)% z4e$Z940sHOzlthU>OKqn0{m1W0NdCW tUCay)>|z8l9Uu|(_di$?E^g4L=XjU$f^5O9tIvRca#G5YRpLg${|kqs9ZUcK literal 0 HcmV?d00001 diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml index 16384cca..c98f15e3 100644 --- a/ufo/config/config.yaml +++ b/ufo/config/config.yaml @@ -1,7 +1,7 @@ version: 0.1 OPENAI_API_BASE: "" # The base URL for the OpenAI API -OPENAI_API_KEY: "" # Set the value to sk-xxx if you host the openai interface for open llm model +OPENAI_API_KEY: "" # The OpenAI API key OPENAI_API_MODEL: "" # The only OpenAI model by now that accepts visual input CONTROL_BACKEND: "uia" # The backend for control action MAX_TOKENS: 2000 # The max token limit for the response completion diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 8e619a08..1e1ae682 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -51,7 +51,7 @@ def __init__(self, task): - print_with_color("""Welcome to use UFO🛸, A UI-focused Multimodal Agent for Windows OS. + print_with_color("""Welcome to use UFO🛸, A UI-focused Agent for Windows OS Interaction. {art} Please enter your request to be completed🛸: """.format(art=text2art("UFO")), "cyan") diff --git a/ufo/ufo.py b/ufo/ufo.py index 7eea242d..dcb32fe7 100644 --- a/ufo/ufo.py +++ b/ufo/ufo.py @@ -1,5 +1,4 @@ import argparse -import os from datetime import datetime from .config.config import load_config @@ -25,8 +24,6 @@ } - - def main(): """ Main function. @@ -38,6 +35,7 @@ def main(): status = session.get_status() round = session.get_round() + # Start the task while status.upper() not in ["ALLFINISH", "ERROR", "MAX_STEP_REACHED"]: round = session.get_round() @@ -78,6 +76,8 @@ def main(): result = session.get_results() round = session.get_round() + + # Print the result if result != "": print_with_color("Result for round {round}:".format( round=round), "magenta") @@ -85,6 +85,7 @@ def main(): session.set_round(round+1) + # Print the total cost total_cost = session.get_cost() formatted_cost = '${:.2f}'.format(total_cost) print_with_color(f"Request total cost is {formatted_cost}", "yellow") From 5b3c6baf1cb774deb9b73091fc9185f04f490e05 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 7 Feb 2024 14:24:02 +0800 Subject: [PATCH 018/223] readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a309b385..03d723c1 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ UFO UFO Image operates as a dual-agent framework, encompassing: - AppAgent 🤖, tasked with choosing an application for fulfilling user requests. This agent may also switch to a different application when a request spans multiple applications, and the task is partially completed in the preceding application. - ActAgent 👾, responsible for iteratively executing actions on the selected applications until the task is successfully concluded within a specific application. + Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend the application UI and fulfill the user's request. For more details, please consult our technical report.

From 9e7b927352cac8f702cf95b9dd0500492d0aea33 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 7 Feb 2024 14:24:48 +0800 Subject: [PATCH 019/223] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 03d723c1..3e988e99 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@

-## Framework +## 🕌 Framework UFO UFO Image operates as a dual-agent framework, encompassing: - AppAgent 🤖, tasked with choosing an application for fulfilling user requests. This agent may also switch to a different application when a request spans multiple applications, and the task is partially completed in the preceding application. - ActAgent 👾, responsible for iteratively executing actions on the selected applications until the task is successfully concluded within a specific application. From 787b55cf2fe56a105996d4f2ecc7bf19ac85b1b2 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 7 Feb 2024 14:29:26 +0800 Subject: [PATCH 020/223] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3e988e99..57fb2e23 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- UFO UFO Image: A UI-Focused Agent for Windows OS Interaction + UFO UFO Image: A UI-Focused Agent for Windows OS Interaction

From 2fe3990765408655835556634bb1d3218d61e2f5 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 7 Feb 2024 18:42:41 +0800 Subject: [PATCH 021/223] support openai --- README.md | 19 +++++++++++++++++-- ufo/config/config.yaml | 7 ++++--- ufo/ufo.py | 16 ++++++++++++---- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 57fb2e23..a25232ce 100644 --- a/README.md +++ b/README.md @@ -42,8 +42,6 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th - - ## ✨ Getting Started @@ -71,6 +69,14 @@ OPENAI_API_KEY: Your OpenAI Key # Set the value to the openai key for the llm m OPENAI_API_MODEL: GPT Model Name # The only OpenAI model by now that accepts visual input ``` +#### Azure OpenAI +``` +OPENAI_API_BASE: Your OpenAI Endpoint # The base URL for the OpenAI API +OPENAI_API_KEY: Your OpenAI Key # Set the value to the openai key for the llm model +OPENAI_API_MODEL: GPT Model Name # The only OpenAI model by now that accepts visual input +``` + + ### 🚩 Step 3: Start UFO #### ⌨️ Command Line (CLI) @@ -129,6 +135,15 @@ https://github.com/microsoft/UFO/assets/11352048/aa41ad47-fae7-4334-8e0b-ba71c4f + +## 📊 Evaluation +To evaluate, please refer to the [WindosBench](./DISCLAIMER.md) in the Section A of Appendix in our technical report. Some tips for completing your request: + + + + + + ## 📚 Citation Our paper could be found [here](http://export.arxiv.org/abs/2311.17541). If you use UFO in your research, please cite our paper: diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml index c98f15e3..8dea64ac 100644 --- a/ufo/config/config.yaml +++ b/ufo/config/config.yaml @@ -1,8 +1,9 @@ version: 0.1 -OPENAI_API_BASE: "" # The base URL for the OpenAI API -OPENAI_API_KEY: "" # The OpenAI API key -OPENAI_API_MODEL: "" # The only OpenAI model by now that accepts visual input +API_TYPE: "openai" # The API type, "openai" for the OpenAI API, aoai for the AOAI API. +OPENAI_API_BASE: "YOUR_ENDPOINT" # The the OpenAI API endpoint, "https://api.openai.com/v1/models" for the OpenAI API. +OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key +OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input CONTROL_BACKEND: "uia" # The backend for control action MAX_TOKENS: 2000 # The max token limit for the response completion MAX_RETRY: 3 # The max retry limit for the response completion diff --git a/ufo/ufo.py b/ufo/ufo.py index dcb32fe7..a4ce2882 100644 --- a/ufo/ufo.py +++ b/ufo/ufo.py @@ -18,10 +18,18 @@ parsed_args = args.parse_args() -headers = { - "Content-Type": "application/json", - "api-key": parsed_args.gptkey, -} +if configs["API_TYPE"].lower() == "openai": + headers = { + "Content-Type": "application/json", + "api-key": parsed_args.gptkey, + } +elif configs["API_TYPE"].lower() == "aoai": + headers = { + "Content-Type": "application/json", + "Authorization": f"Bearer {parsed_args.gptkey}" + } +else: + raise ValueError("API_TYPE should be either 'openai' or 'aoai'.") def main(): From d2f404e14eddcc324130da14ac8a0b202d7b770a Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 7 Feb 2024 18:53:46 +0800 Subject: [PATCH 022/223] readme --- README.md | 16 ++++++++++------ ufo/config/config.yaml | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a25232ce..3a5830bf 100644 --- a/README.md +++ b/README.md @@ -64,16 +64,18 @@ Before running UFO, you need to provide your LLM configurations. Taking OpenAI a #### OpenAI ``` -OPENAI_API_BASE: Your OpenAI Endpoint # The base URL for the OpenAI API +API_TYPE: "openai" +OPENAI_API_BASE: "https://api.openai.com/v1/chat/completions" # The base URL for the OpenAI API OPENAI_API_KEY: Your OpenAI Key # Set the value to the openai key for the llm model -OPENAI_API_MODEL: GPT Model Name # The only OpenAI model by now that accepts visual input +OPENAI_API_MODEL: GPT-V Model Name # The only OpenAI model by now that accepts visual input ``` -#### Azure OpenAI +#### Azure OpenAI (AOAI) ``` +API_TYPE: "aoai" OPENAI_API_BASE: Your OpenAI Endpoint # The base URL for the OpenAI API OPENAI_API_KEY: Your OpenAI Key # Set the value to the openai key for the llm model -OPENAI_API_MODEL: GPT Model Name # The only OpenAI model by now that accepts visual input +OPENAI_API_MODEL: GPT-V Model Name # The only OpenAI model by now that accepts visual input ``` @@ -137,10 +139,12 @@ https://github.com/microsoft/UFO/assets/11352048/aa41ad47-fae7-4334-8e0b-ba71c4f ## 📊 Evaluation -To evaluate, please refer to the [WindosBench](./DISCLAIMER.md) in the Section A of Appendix in our technical report. Some tips for completing your request: - +Please consult the [WindosBench](./DISCLAIMER.md) provided in Section A of the Appendix within our technical report. Here are some tips (and requirements) to aid in completing your request: +- Prior to UFO execution of your request, ensure that the targeted application is active (though it may be minimized). +- Occasionally, requests to GPT-V may trigger content safety measures. UFO will attempt to retry regardless, but adjusting the size or scale of the application window may prove helpful. We are actively solving this issue. +- Please note that the output of GPT-V may not consistently align with the same request. If unsuccessful with your initial attempt, consider trying again. diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml index 8dea64ac..1316b7a6 100644 --- a/ufo/config/config.yaml +++ b/ufo/config/config.yaml @@ -1,7 +1,7 @@ version: 0.1 API_TYPE: "openai" # The API type, "openai" for the OpenAI API, aoai for the AOAI API. -OPENAI_API_BASE: "YOUR_ENDPOINT" # The the OpenAI API endpoint, "https://api.openai.com/v1/models" for the OpenAI API. +OPENAI_API_BASE: "YOUR_ENDPOINT" # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input CONTROL_BACKEND: "uia" # The backend for control action From faa095c8492bf094e0d53fd96e79b99dc7b04cb2 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 7 Feb 2024 18:55:44 +0800 Subject: [PATCH 023/223] readme --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3a5830bf..57bba86a 100644 --- a/README.md +++ b/README.md @@ -66,16 +66,16 @@ Before running UFO, you need to provide your LLM configurations. Taking OpenAI a ``` API_TYPE: "openai" OPENAI_API_BASE: "https://api.openai.com/v1/chat/completions" # The base URL for the OpenAI API -OPENAI_API_KEY: Your OpenAI Key # Set the value to the openai key for the llm model -OPENAI_API_MODEL: GPT-V Model Name # The only OpenAI model by now that accepts visual input +OPENAI_API_KEY: "YOUR_API_KEY" # Set the value to the openai key for the llm model +OPENAI_API_MODEL: "GPTV_MODEL_NAME" # The only OpenAI model by now that accepts visual input ``` #### Azure OpenAI (AOAI) ``` API_TYPE: "aoai" -OPENAI_API_BASE: Your OpenAI Endpoint # The base URL for the OpenAI API -OPENAI_API_KEY: Your OpenAI Key # Set the value to the openai key for the llm model -OPENAI_API_MODEL: GPT-V Model Name # The only OpenAI model by now that accepts visual input +OPENAI_API_BASE: "YOUR_ENDPOINT" +OPENAI_API_KEY: "YOUR_API_KEY" # Set the value to the openai key for the llm model +OPENAI_API_MODEL: "GPTV_MODEL_NAME" # The only OpenAI model by now that accepts visual input ``` From f9542d251a7367fac6fb5cf13539125b8abf7987 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 7 Feb 2024 19:05:57 +0800 Subject: [PATCH 024/223] fix api --- ufo/config/config.yaml | 2 +- ufo/ufo.py | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml index 1316b7a6..cc71250e 100644 --- a/ufo/config/config.yaml +++ b/ufo/config/config.yaml @@ -1,6 +1,6 @@ version: 0.1 -API_TYPE: "openai" # The API type, "openai" for the OpenAI API, aoai for the AOAI API. +API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. OPENAI_API_BASE: "YOUR_ENDPOINT" # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input diff --git a/ufo/ufo.py b/ufo/ufo.py index a4ce2882..1af1b8a0 100644 --- a/ufo/ufo.py +++ b/ufo/ufo.py @@ -18,12 +18,12 @@ parsed_args = args.parse_args() -if configs["API_TYPE"].lower() == "openai": +if configs["API_TYPE"].lower() == "aoai": headers = { "Content-Type": "application/json", "api-key": parsed_args.gptkey, } -elif configs["API_TYPE"].lower() == "aoai": +elif configs["API_TYPE"].lower() == "openai": headers = { "Content-Type": "application/json", "Authorization": f"Bearer {parsed_args.gptkey}" @@ -32,6 +32,9 @@ raise ValueError("API_TYPE should be either 'openai' or 'aoai'.") +print(headers) + + def main(): """ Main function. From a71cab77f174dd74ac51bb4a8b53f3b0298e4d2c Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 7 Feb 2024 19:15:20 +0800 Subject: [PATCH 025/223] readme --- README.md | 11 +++++++---- ufo/config/config.yaml | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 57bba86a..827ce8f5 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ cd UFO pip install -r requirements.txt ``` -### 🖊️ Step 2: Configure the LLMs +### ⚙️ Step 2: Configure the LLMs Before running UFO, you need to provide your LLM configurations. Taking OpenAI as an example, you can configure `ufo/config/config.yaml` file as follows. #### OpenAI @@ -73,13 +73,13 @@ OPENAI_API_MODEL: "GPTV_MODEL_NAME" # The only OpenAI model by now that accepts #### Azure OpenAI (AOAI) ``` API_TYPE: "aoai" -OPENAI_API_BASE: "YOUR_ENDPOINT" +OPENAI_API_BASE: "YOUR_ENDPOINT" # The AOAI API endpoint OPENAI_API_KEY: "YOUR_API_KEY" # Set the value to the openai key for the llm model OPENAI_API_MODEL: "GPTV_MODEL_NAME" # The only OpenAI model by now that accepts visual input ``` -### 🚩 Step 3: Start UFO +### 🎉 Step 3: Start UFO #### ⌨️ Command Line (CLI) @@ -105,7 +105,7 @@ Please enter your request to be completed🛸: ### Step 4 🎥: Execution Logs -You can find the screenshots taken and request and reponse logs in the following folder: +You can find the screenshots taken and request & reponse logs in the following folder: ``` ./ufo/logs// ``` @@ -160,6 +160,9 @@ If you use UFO in your research, please cite our paper: } ``` +## 🎨 Related Project +You may also find [TaskWeaver](https://github.com/microsoft/TaskWeaver?tab=readme-ov-file) useful, a code-first agent framework for seamlessly planning and executing data analytics tasks. + ## Disclaimer By choosing to run the provided code, you acknowledge and agree to the following terms and conditions regarding the functionality and data handling practices in [DISCLAIMER.md](./DISCLAIMER.md) diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml index cc71250e..a4836f2b 100644 --- a/ufo/config/config.yaml +++ b/ufo/config/config.yaml @@ -27,7 +27,7 @@ ANNOTATION_COLORS: { "ComboBox": "#D8B6D4" } -PRINT_LOG: FALSE # Whether to print the log +PRINT_LOG: False # Whether to print the log CONCAT_SCREENSHOT: True # Whether to concat the screenshot for the control item LOG_LEVEL: "DEBUG" # The log level INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation From 4b05b0dfebeb7a82e39aa9ea4959f430eb15be69 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 7 Feb 2024 19:18:32 +0800 Subject: [PATCH 026/223] readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 827ce8f5..86279788 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ Welcome to use UFO🛸, A UI-focused Agent for Windows OS Interaction. \___/ |_| \___/ Please enter your request to be completed🛸: ``` -#### **Reminder❗: Before UFO executing your request, please make sure the targeted applications are active on the system.** +#### **⚠️Reminder: Before UFO executing your request, please make sure the targeted applications are active on the system.** ### Step 4 🎥: Execution Logs @@ -164,11 +164,11 @@ If you use UFO in your research, please cite our paper: You may also find [TaskWeaver](https://github.com/microsoft/TaskWeaver?tab=readme-ov-file) useful, a code-first agent framework for seamlessly planning and executing data analytics tasks. -## Disclaimer +## ⚠️ Disclaimer By choosing to run the provided code, you acknowledge and agree to the following terms and conditions regarding the functionality and data handling practices in [DISCLAIMER.md](./DISCLAIMER.md) -## Trademarks +## logo Trademarks This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow From 398584062f601810de0faa1562784395d45d9f65 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 7 Feb 2024 19:27:46 +0800 Subject: [PATCH 027/223] readme --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 86279788..a20381dc 100644 --- a/README.md +++ b/README.md @@ -35,10 +35,10 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th ## 💥 Highlights -- [x] **First Windows Agent** - UFO represents the first agent framework that can translate user request in natural language into grounded operation on Windows OS. -- [x] **Interactive Mode** - UFO allows for multiple sub-requests from users in the same session for completing complex task. -- [x] **Action Safeguard** - UFO supports safeguard to prompt for user confirmation when the action is sensitive. -- [x] **Easy Extension** - UFO is easy to extend to accomplish more complex tasks with different operations. +- [x] **First Windows Agent** - UFO is the pioneering agent framework capable of translating user requests in natural language into actionable operations on Windows OS. +- [x] **Interactive Mode** - UFO facilitates multiple sub-requests from users within the same session, enabling the completion of complex tasks seamlessly. +- [x] **Action Safeguard** - UFO incorporates safeguards to prompt user confirmation for sensitive actions, enhancing security and preventing inadvertent operations. +- [x] **Easy Extension** - UFO offers effortless extensibility, allowing for the integration of additional functionalities and control types to tackle diverse and intricate tasks with ease. @@ -140,7 +140,7 @@ https://github.com/microsoft/UFO/assets/11352048/aa41ad47-fae7-4334-8e0b-ba71c4f ## 📊 Evaluation -Please consult the [WindosBench](./DISCLAIMER.md) provided in Section A of the Appendix within our technical report. Here are some tips (and requirements) to aid in completing your request: +Please consult the [WindowsBench](http://export.arxiv.org/abs/2311.17541) provided in Section A of the Appendix within our technical report. Here are some tips (and requirements) to aid in completing your request: - Prior to UFO execution of your request, ensure that the targeted application is active (though it may be minimized). - Occasionally, requests to GPT-V may trigger content safety measures. UFO will attempt to retry regardless, but adjusting the size or scale of the application window may prove helpful. We are actively solving this issue. @@ -149,7 +149,7 @@ Please consult the [WindosBench](./DISCLAIMER.md) provided in Section A of the A ## 📚 Citation -Our paper could be found [here](http://export.arxiv.org/abs/2311.17541). +Our technical report paper can be found [here](http://export.arxiv.org/abs/2311.17541). If you use UFO in your research, please cite our paper: ``` @article{ufo, @@ -161,7 +161,7 @@ If you use UFO in your research, please cite our paper: ``` ## 🎨 Related Project -You may also find [TaskWeaver](https://github.com/microsoft/TaskWeaver?tab=readme-ov-file) useful, a code-first agent framework for seamlessly planning and executing data analytics tasks. +You may also find [TaskWeaver](https://github.com/microsoft/TaskWeaver?tab=readme-ov-file) useful, a code-first LLM agent framework for seamlessly planning and executing data analytics tasks. ## ⚠️ Disclaimer From cbbd3857bf4483ece1d201b6a630968343dffec6 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 7 Feb 2024 19:30:09 +0800 Subject: [PATCH 028/223] readme --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a20381dc..32ceaed4 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ - AppAgent 🤖, tasked with choosing an application for fulfilling user requests. This agent may also switch to a different application when a request spans multiple applications, and the task is partially completed in the preceding application. - ActAgent 👾, responsible for iteratively executing actions on the selected applications until the task is successfully concluded within a specific application. -Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend the application UI and fulfill the user's request. For more details, please consult our technical report. +Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend the application UI and fulfill the user's request. For more details, please consult our [technical report](http://export.arxiv.org/abs/2311.17541).

@@ -119,10 +119,10 @@ You may use them to debug, replay, or analyze the agent output. ## 🎬 Demo Examples -We present two demo videos that complete user request on Windows OS using UFO. For more cases, please consult our technical report. +We present two demo videos that complete user request on Windows OS using UFO. For more cases, please consult our [technical report](http://export.arxiv.org/abs/2311.17541). #### 1️⃣🗑️ Example 1: Deleting all notes on a PowerPoint presentation. -In this example, we will show you how to use UFO to deleting all notes on a PowerPoint presentation with just a few simple steps. Explore it to work smarter not harder! +In this example, we will demonstrate how to efficiently use UFO to delete all notes on a PowerPoint presentation with just a few simple steps. Explore this functionality to enhance your productivity and work smarter, not harder! https://github.com/microsoft/UFO/assets/11352048/cf60c643-04f7-4180-9a55-5fb240627834 @@ -130,7 +130,7 @@ https://github.com/microsoft/UFO/assets/11352048/cf60c643-04f7-4180-9a55-5fb2406 #### 2️⃣📧 Example 2: Composing an email using text from multiple sources. -In this example, we will show you how to use UFO to extract texts from Word documents, description of an image, to compose an email and send. Enjoy your cross-application experiment with UFO! +In this example, we will demonstrate how to utilize UFO to extract text from Word documents, describe an image, compose an email, and send it seamlessly. Enjoy the versatility and efficiency of cross-application experiences with UFO! https://github.com/microsoft/UFO/assets/11352048/aa41ad47-fae7-4334-8e0b-ba71c4fc32e0 From f5d0f24e8ce569eaa085583cf4d068e2434ab56d Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 7 Feb 2024 19:31:29 +0800 Subject: [PATCH 029/223] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 32ceaed4..5893c6e6 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ OPENAI_API_MODEL: "GPTV_MODEL_NAME" # The only OpenAI model by now that accepts ### 🎉 Step 3: Start UFO -#### ⌨️ Command Line (CLI) +#### ⌨️ You can execute the following on your Windows command Line (CLI): ```bash # assume you are in the cloned UFO folder From 302cf031f4a173ad945bc057c2a45c480ac5835b Mon Sep 17 00:00:00 2001 From: Chaoyun Zhang Date: Wed, 7 Feb 2024 22:49:13 +0800 Subject: [PATCH 030/223] readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5893c6e6..ae4438c7 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,7 @@ Please consult the [WindowsBench](http://export.arxiv.org/abs/2311.17541) provid - Prior to UFO execution of your request, ensure that the targeted application is active (though it may be minimized). - Occasionally, requests to GPT-V may trigger content safety measures. UFO will attempt to retry regardless, but adjusting the size or scale of the application window may prove helpful. We are actively solving this issue. +- Currently, UFO supports a limited set of applications and UI controls that are compatible with the Windows **UI Automation** API. Our future plans include extending support to the Win32 API to enhance its capabilities. - Please note that the output of GPT-V may not consistently align with the same request. If unsuccessful with your initial attempt, consider trying again. From e57dc48dfd71939ee073dfaa55d80a630f02a6dc Mon Sep 17 00:00:00 2001 From: Chaoyun Zhang Date: Wed, 7 Feb 2024 23:55:56 +0800 Subject: [PATCH 031/223] readme --- README.md | 3 ++- assets/framework.png | Bin 0 -> 947250 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 assets/framework.png diff --git a/README.md b/README.md index ae4438c7..fa973e09 100644 --- a/README.md +++ b/README.md @@ -22,10 +22,11 @@ UFO UFO Image operates as a dual-agent framework, encompassing: - AppAgent 🤖, tasked with choosing an application for fulfilling user requests. This agent may also switch to a different application when a request spans multiple applications, and the task is partially completed in the preceding application. - ActAgent 👾, responsible for iteratively executing actions on the selected applications until the task is successfully concluded within a specific application. +- Control Interaction 🎮, is tasked with translating actions from AppAgent and ActAgent into interactions with the application and its UI controls. It's essential that the targeted controls are compatible with the Windows **UI Automation** API. Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend the application UI and fulfill the user's request. For more details, please consult our [technical report](http://export.arxiv.org/abs/2311.17541).

- +

diff --git a/assets/framework.png b/assets/framework.png new file mode 100644 index 0000000000000000000000000000000000000000..a788e4d8eacdafba98a93c1383eb5d61b9bcdf9b GIT binary patch literal 947250 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­uK^elSgP^fOf*-ZNm);TjxQ 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%0A5tf3=D@{kgI=%W7xz;5vjg&K5ZNP@)PJ?e zz#Wh%kAjX)IW`67TY>2kg=`u{0_Q8}B#*Y8@(D0A|H@9_@0o)Nhz|i-R-o$JA67sM zlE*dyLKLcRHez_$%QGmJ65Fr(8@eX&?oY23mUo5q@=^c!T}+#T_gdP13z3AiHpb=V z3&O8Lurr_f0Zruk1I>BpIro}!PiTg z?r`w%%yj+6Z(hB6*xuU{S5V+?Y~&kT?CBNaHl`LksF8x6fhCllFIRL*z)2!xT@OKae&96Sw&rLq~3*uw{JL!m?xcb3?j^lWH<}W#lv@EcQmRCcxeGI=q^j% zVunqJmJsSs^e832Vv44avSSIXwZ&1b;__526t%l4ilis_bTxO2hA1v3mG>uc)fg)V zfrQ^zVy9ZwX9YN!^smNDcm7&cn#dF}@CU2C@|PP~tn+Y5FBCU2qU7VB?Y@Z{6uNG> zY)Lg@rr9~;@x|zwnZXAzyg0r&03H(rX6~XG5nU%!hZOsZYILyZ2{PCs|D<{;X0xj) z(S5UC2`XX*5=J1mc3p@9{9O#sR8J#xJn#RL@-e!sfL;fWDFfaj8x2S6wK13Axd^-! zi3raR#^dm6ME4hX-l?>B0H_mer_`${jVxfgnJSbN&yL)=RP3j+U@qE*aW>%`ppU}y z6GD*5x~-_L7reP?YClc^g#5GH?-OA2Zt4}`ZpEejUueTLB_KfUX>Wf4v>bq(CtP7A%1pDBNV*#ZW#1tcT*&2<8&>tHlWc0@ z>jj1v^Q!S`8S3sJnIc8aPKy(#(!`?igVP^z3?;ZH9v`pk3Et5cCGM*C1S8XHfRwb_ zEsF%RPfrZB{3ax+GSKruvY&k#%oEn*vIC|GtUr5MBu>w(3et9ad3k6xrhOdd<>X$F zEb8VpG1RgLQS(~47iu|tt*O$y6SHV87(XcVF(lQc&j(5tEs1_aE+K6T**JNH2xbFl zZb^K4!J8VYl)C)AxjIeXv5%8hy2XlIl!l4&%=}7e7V0AiM8ncxE}h{Yf}iL=_G$2w za4|_1;gpK=rc6{SG)g;E}Br2%e9b*%QA+_sBWAN0C&_{kt4WZxSv?FjIc5l zunJ5sHUNJUP#Dbe`)X2Dd4j|R)MN|;0%;+j3~|*5Cq|Z#qG4{S{vWf+FqFj-YL;T! zgA^79jZ+ng%7uQB;Ajf0b8%BlsA^3JeppE%SGn3mYIR2}(or#JG@DH!^c03*9mgWk zlHs`Wj8eF+XU*O|-Mh(gKNkTQUaE5tiZkGTFf+@?2-l%A8%~w30aAMD^L61iFVbAI zM}@Xu$fIz1?DKEkBem6@?qF}_CYbqmtE|J^yny8;be@U+w>3U2Ys!kR*T$5$jsKf8I5JLbs&l9;VxKCm#DPKxTUu5~>Rcpq=&(Kr3nBeb z1lu3jeUV*8k5bx(7AJu-5H~rR6mD*XWMF5`;*1NlF3Q09+#~ZTT|R6&5<231e4btd zQklO>pXb-E8niaoj9$^oAbBav+uRl&sQ%9D_M9cd#RaVeJkVJj3vE738T+`g zEHo9hvAme{4)a3MLSsUZeYTKzc})Xt|6^d?Rjgc;FyMUV?Fv~@#W6T|DEVm8!;--? z%dheW+;f`{3ZkAgv$#D!_B*d9Dcmwos5?OZuaplZu)U z24buFm4DJG$T?);as5T=HQHeT24|W-KPW#~W&F4I@S*m*Thevsl-Lh*#W`H%{6%)= zk~I^iyj?-v^=VtGLe`*3kgk;zcHCw5lLI|GKivfPFw0M+ko}L7NtojtJi`Z;u}wS<;#jo z(nT(XT>XsKfu4+X`Ue7B%u9#H_!dLAR8M@%4Dc_ z)3+J;=7I36;IO}7B~${Y zisg6mp5;O?^na9*+m3N-zvash9`!V2Tlv#`$>4-WrC4Zp7>-80V&t@5!b**L@yYI25QAH;%)~UVYM4Fy8HlL2>I*RV zddSJ?sdDeWHzXK`?lhk|P$QRHB~B-RG&iDy#@BLu;@pyI#xd92@5*r)n)Bw^gNu)U zhbiCX;?bK1pyuD^^gdh!I^e3Aov%Teb5EzYMi9wp^S~cbWgo5`lm}%lyia(!1gak9 z&#TXQqRj?1ln+$h^jHt)bMo3)jOLL?aysV>b-KfMym+m6CTW2spW-u4@r5RGfl)^8 zS{A}1mPKj9X9^=$`FSJz+?+#mTVis;v^w#aq@#`*C)VOKA|^Y*xvVyBj4slk2c zb3@`~Oo)z*2XQg8V5$B?j{Q#aP)}~Y^uvuEXhg0~&qu32uZk-QKfb4BD9GJgT#Pyb zOKBy}%rr<|p-#nH&s`$oHAQmaW${Q}FXZ^LijeCgrM%IDo11UCdd67g=UHGU+O$SW z@YU9up0`@?bozMcrDfse9z&L1(Zj8yNAqxA%OgWM!wA7K95UI6C13N%pu)R9mKqUT z8OBHBTcAJgC4{oL#WM|HN{2)D3x~jr!ReAQqcc->mxIc+K1^XGq|Sn(Z=L!foi>)!#8O=k2oD*>zoyU3RtQoAFK>0ct_IN_}bke+}A|orSBKS8N8bb8)@dbiq zu;DL}x0$Hr%&O&w-FlC_>zQ3~#R(l-qA)x%v*ywb5rQ+Ky8EeU`WbMWetDKCain1Ne3z@)V={FhDm_Z8N)zjbi9Ktw_!&VnB#Vba?+7-3%^an5Zr)7Q z6`hpY=EW3_@Fwkgs?Agk0jW|y64fofzcHDlGyBdi-yUla_*yfb8 zF*tI_&wiA9)PQ*gd1S!jBHQczvHLW9mb!Gc|Ja$#l=3lr6`RizW-c}99I%mQiCp&zR6UO{6-PpXcRWf>W}=Wr@!GR8ig08 zb?7x#M8vwn^N%k&_Z{E+`ubXgJ&R5SkZ~FMu002UWhu)4iCsUx^%tFE2)l&)EECBF zcGI1+t9~uCC`)eqfWLO8K>-dL)205(Z*;TD*QoviI)|A4Ve%OR$KlDtLp#_57qPCq zJvW}TKfKmtdH}Cqv+6W!GnmU(I)L)PVF1q&aZwQ@XfDT*-PERz@EL%loc^U7{C$J0 z&iebZdfM5+W-7w4X$ra=6m`;YB>`F0me#LZCN+#(bh z@aqE(n0<~rwqV$k$N!VgYM_NGW}}mF0no4KWwRc;p)9f zWz$mnrf#9kjCJKlU5fpn4!aQR^w+4c#FLY`q3apXZ#%y?)UbqZ%L*HUj8X?A7vE(x z&$6Z____->Y&=N#irj2nr6}k~IpL-HHcs5|L|qDQkuAA$jNi-zZalS?7c2>qr42v1 zk0`Zl-5(|0^bOI8yOFhi^71{IPA99o7aSR}yiWxUm*P45v>eNo_fib++|T>a^Y@-P zK3D_rbwe9=#+?r4th0qX!!SMjA~ zI|HCpd-V|)Y%p>OL+;c^DCuVO81@Ys%4* zf0A&rGFy?5Ph5y80we4e=H#MZSqIy;>BH~CFyM}*l>MA?73r!Nft!*elS~N(X(zaf z9>#Mb%0uCmj!goF_iny89cm%>6r_xL`G}~6q8>?ip~4uX^|Jos9iq+k*?iVRIFs z-nA$Wa0fXE9JfmgJl#uM&8kLJvhjDWd?XJCyd+%y3J74N+f55tc@VLuP?2>9f>$+G z6#D+_0!bi!q|WK-k(ij-RWzyiS&)bJXA_RN4BfCTAE(LN+O3K_s0PRxT7;1K`H)-& zSq+$Hi1n9Vj}s~3&93{JHMkbGp>hZYUo?cT~BKUFvWv~wQZDYMXW zys(8dHz;PWWz8=`OA=^khEJ~{rdF_$T2|P2u?7LH*3@IV9e&tDBI{68MZFRo6h6kd0 zO03$U*L~Yb0&D^37sp)0zKhXI0Kh^(%a4{QqO{S;WPOg5(e~ljI_Dzj)Z`&ofU_x( z7(*=6*v*FJ{vB$TnO%RV*V1ZKQrqnOojZAbV5$1fp3ioU?{0eB)L08Qfgx^+7` zPU(K8C;}Xz#KhFD^_}rVfmbMzk(o8wSY|G5pql(vB0)Iib;^HY89YeWm z&}xMsx|p@7R@&EGjOb|kU^m!7%{x>_EZl*;ie|Z}h;F2P#<U@`5Ngg1R5DRiu0j&_ki8j1kjj^bqMM>gD5q}FK&x53* zjZFMddK^JJ>IU*#{#%uH0chU;Ug5B+74*dDzXTm1Q|qNC16FJS4+n58Mf4dVNjP_u_K=lD zMuB5?IpkPb2`)bQWt-lWFZ?M)+m;?WKL@S{{HZo4E4J;X(?DJ)Os{>8U%&Rba^_9H zFC%7tXd*6OqJ^%K^;et=8*4loy&Gf;l+RbB!yW)j1vxt0di@$%2=k$X7Vqmkc3y3` z?aw*fpB6iKZ8^s5uc@3(>_5HmziwN;R;ny zHOX6{r5Q#&;L)6CZ{P>Plx-2zSYR7w^NWkdB)`)b;|RdX6k*sxq=A&!zejja1uWRU zjgI$509=YOyoWFVRuFtb2tY@{b3eWS{?MbPM!%U2uror_<4mW z-LEW8GF6%JIe08IJMt}(_pbsp>YriNP;8sPQV3#M4@R=K;p)2~pbx|QN4c^3yWQ7! z1xASJ9Whx(*USuTP;l?qlJM8aNS^>v`-y4zpW}bX6SS2yKZ}ZsqYey4(9yG34$S># z33PB*_8&mPDk>UUouL;fgaVn=YDqf?71%>ypn$U|P|{o0?6EJn)3a!ZehC5o(z%!w zr0Q%ymQs5}MaC?@q`qo$vRtZM-uK8xcBwGwbk9Bu6yphX%9v0SAL4@JH9O}Qy^|4i zl>v$eq3`iN2l0-$=d9 z8?u`|NxSpyu?g(whpqLNaR)t6baaogZ{W9K2h3}qdn4Y%M%l=@qfvuH5|4S8Cc?U< zvabBicPHf;%FC7+acjb@biMaSeUMvP2jZIu6l&jCk;eoJbFxB-Uq)b-k*yVLq(ITk zp{c|f_vDOX`Tb^Vw`!#1;9{i*eNLn&*&y$>)!*p6kJqTYtxxW}tnm&#?mSah zg%G?{G)(tzkp@IH+EFoXZ%|<#+N)QuR{y8d0~Xw(5?n3$3fr{anA+={GJF1pNCT(= z731~swO0Yx#IjV}8~$SFnXDS4wEig0OVbjE8iT-MlEG9&21uPDgfdc`0ht7md=aA( zjeP%m4oOny2C<4evvQQ{uRnvs)i&?O=jtmmKh3&avL9!dgaRZ%!Z#W#HoYLV>4_jn z$96{wi2hRT^LIuS5lhH7TGny0uRzPC@lO|;0Oup0pP!%LEoAGrKpLP%^xoYagZ5*< z@szfY)xvJ)Yz-H~CyTDmK)&Y3M%?n2ypH1XqIa?MZ-C7!z*kiDJTyb|GfF$5XM@N2 zk}@Y-H*s#)1e}{slL554kd=OQ%abk`B1>&e24!!}fgfIcVH^?QsiS@;-I|qmT;&`? zAX^o>X~%2(bTp#P-Y1pv$<-w8-Q&&}kLJpONb!_Zjhey0Uy=ed+UrnO6UuMau$q1kk|s16~%gAwmJ`*)5nzQ8>ArpxB+b0{bZn!YBhPLxGDn z;{TjcV1w{eOqN^y;3%+>;sd_^jx1VM)TC}aX?mtXJf>5X6KX`3r!ldh(T{Co&U9jl zoF?>EH~wAG{j;KSObLY-oQq%ZFKcTQK={b<X6B9GhX{GH&;9R%k4mPhf zqDi2mW!zlQ3~q4M=*DXh=2Y-2_mYSt^HqurZl&(Eyy~x5!(+pKQi414BJdhfrM&gx zTxC|ve8>ekwKC-T*YN8WN%R6P=*o21NE^Gf-XA}v74!dTXgnwfhd>>(`z68}(~0ukYGKqUN?HSBLrCvFndoEd=hY2x@K1 z-+wMd1FVMtes=C-?{nkw?0E*``r*Z$3yvYce0|pd&BYY|t7!qw1EBryX-x~XYa&#U zM1FqHEkNsQ$i)t@0|85=t!5*~#b)=_O`rw=G;Up80rg`grA>GdCoVIhN~*JhJOyPP zw`@4^s@o^YS)|N+-lE?jjqb#jS_%f>GkmpxV2D6$SLJ)*_-l`@^P$s-KSWG-8oPVl zl|4Qs2&jf8Zm`ALGb8xI)U)N&b*ng~@a2Og8ftmnn@F6IL{^FoL@Oa(qZ3np!;3=p z-gf;Ae144`pymxABBa_jyQ5 z*Fi{Ei@<``9_}2FxJaf>ZBA5;)5GmF&h@VP#`USX@%8TnlWU5>gw~?=gtoFC^`psU zdWM}_9IiupJ%t*TwUJ*#JM2FSnFAdJH|E#8iylx>TQB7qTOS!2TTe(B9}k2CAJ3*a z-HzYU>uP@P4f3}kE<4Sx%tWjm#=WKmABJw;wBL*y5hw$#x`c>XCc>4|w*iyI;Dp zUp8fBodPr*1!jG3jzXB-2;d3ROJXt4I`UQ9 zmV0HYfzazv1?hf&(4pBUgILm+-hbDCAXPz)@?M8?RkWpbkYE{f3%M!k zl@-jwf^@ykFS>USgYi5hfhR8}pNBoH>rL*nlR||! z{X-qHD!LsTP(U{LokEN;_mK50RPn?zoj+3D;k z%`Gz|u={>+0*%3JP#gTopVR8bOVG>PtHtZ#ZqS%VSvSI~_7hGZ7jRC4fb>fZqU(HWEU3F zUkIa#U{pQtI>1noW z{ue-j2hRi; zy+>e*cWV+a1N-&nN}I{R{*Id^6VxD;F)VC@4;zZm(9MKS{g|X1n{3Cj5H(Xzn5nxD z3kE(iTY!)Y{CtGfReUnxK(}UiE^P#AYM1?4lXlDU{*x`?gtcH{fzWcVT!f5ACq$bj z05lw#th7t|`m%0;FHKvxFki9E(CK=eQEUFx9u#gS{1``&Vj@ve%w-6UdpTGfuAyww*$HA_{62S_oP~xw@v%9}d5!wR3tOHy8id=u z1APc;b>T+xRxy*IXECHBcPEzh$Z6JYe`fmP*Dwb?;~1};YwyJ;aUrcHaS|mZ92EyF z`dD+Mt)DbaX+h1H_*vFgO-)^wcWWg3Thc!pILS#-I?C=N>Z+-;^# zrRWIQKJ4b(kPL{nSncl3SyA?9mU|JN-+(s&kNmTEq73f7P!8foe5i;&rN};!skY7; zPytqt%4I{=9d8I6GL*N1DNgRK$oh;h=&xfwM&B=F^L`8vp>20OBO^enrVt39^m?ie zU#XcjZ7!=ca<4&bI(Nb5fl<6o*1v>bK@1w5TKuRt0BouUwy6Hq_lITIx#H8PVBB4P zJ~yoLhH>HNu3yAoPeLlwMbg63@1E9h8V%TmSt8tUHJ5sj2O%nzJNBbjiC(VR-B zYn$dJi)QLL2UHYE-z;i9PQ!tGd9#hsMU zOomjHy|xYMIu2^VK_;5bFB4}vxiI_;YEB#0T+a3Zu@f%J~))H;A&R6KzYnFP09r=d?y$5F?z;d7}KL$Dux$6)UAJ zw8xu048)7-fv-FVAg;arVYrgVH;XzM5uAf)&Bg24->Jy9OswQ$ys$ScDr|22&Zx)? zeeJdF#{T9`R~C`tF)Pkx)tUF( z%i#L4$OEGIKvZjuuFF5Gjkr5BypEJpJH#`(g*}jO7Ks*nT}LTED&G1V#(D-6nfc*i z5Z5>UK=ehZeJ-o8u4ku#MeR*Utgbeko4?rChWSfN2<>|XP&XF}JM)izFITzl*rvY)0;w00*yVCuX? zBcr@kgQ9%pXo7%mAzk@MhTZw9_&=v%$#gvMA!hRxJ(Axk4QGyqE^O~sDdR~c(@|{Ac)l$v@5os z#Upy74EeAld0{u?Xw{u^yj$C;%IudTrZu~9a>*bp7+S@eOwD%|J=GVT> z$bHjX=0d-76iBV4<*X!$PSGL zS%x&eP?MoRS=KVj%3hjt#A!4rht(}2b&;j>gawl|gk%U~GXy?HJ@H8hbqPK&W7@fq z6MHV9e%MVgFn2`+uall1a|^<@hC^5Ec(9nLZhv|TN(*&)MHt~z2q8j)3RkXA{~$Eq z^wJ63G-=#lCa}64uOOV%QNC!qy>P$3=yy!y=SK0o#Mftotos}EyqTv@ZU`C}0Kvis zu5M?B&8)eS`e+a9&-JLxKyJbl^GyaCGG~5>&ji)}X+DHib3c00?eBF5gqwIE)&BwSoqCXOO#^W+WM&4oYTWFXC z1u7?}aoQ1X0=%#c9R%@dj(xCWTOb_>wQ&z6`lvsDxzQTxO3rn|)=IEU;z^#vVlT^7CtIx?)=~Z&`Y+F6ZU3 za{M6j=YIqExGA4kp7;dQMEmOMl6OMcAvT|2gzi~TeDBAp?^p2>j+gz(-L6;6S<5>p zqo_i<))Ly3*GZoq6O0AUfEHST({RAEA@Np3XfYl9#nlwgaF$pmI_3{CK<_0`hb*>r zx1=8KIN9cV-tVpIKE>2;37>r>eY)H-zQ1&}S3W;keieQFXM`eWe{IX~w*3|6s;xNo zk`v+8KM{DH&gCpa>vB93m$N_N*i-|S zgF4#%@Tj#cfH+rzKL%a=+`t=M`CR0nWA$O|F2~vC^M;*tU!Y_&=Acp4`qpfEa+rV6 zn^ZRSkdaTJiYGVOV!T~pr+s~_+11stbG!sW1XvY7xZ#`LXG;kcRTzqc7TqW@q6B?# z(FMFPg*{pD(FL*ngzx#_nD5C6*)zfe1_xJoI4Dte^nx?}smX|kw|gjI?eOfgVPBP5 z=+KD_Of*L7<{y}Q&W=EbPk2(tLQ2;^%d$6m9}gL^x}5{Z zU^&z7en0cQzXz>ln6nQ6~Yf{SU3j^c!h<@qzN<;ehqXd zr7G_aGV}ytv&Yk}w+rTCkZN*Pt|bwRgUZ1!FxejsT=<_4igS7u2~L>ApjNUnY=XwC zc<~%Vc_%^_YSWdRsV_fcov8B7`q1of!^B%;P@wb0e?6rj0|_`mV-G%CAnmZxj)_7WCAm z7IG|ss+UD19*qUqwrEwfH{l?Q>;&-Wq0E=kgdAaF}>Y8g40qeM`@3sT?}V2nqZ znT2v2kF@Tj-Z7yKIoHGYKN(tU3N^!fzd7BzWqLo-5(QqyR}5%62uSj?c$#=jOuN`+&8K zhwnGOGA1QAo?TxrCKFd*`okcx33#f&)9n$i1w^?jFele*TV-)x_cUKd45=fn#`#j@61`Y z6XQw~-=!HVvik?+@uFT9%gzbDz%9M_>B%@ePJb`ilN%blS&-3mnN_?O%MiXl5boSL zjg5p5R>XQcCfKbJvE}QPxBGL>K>k+%>>99UDj)0nr1xiCUV6Id0RGmG%A}d=tBPFZ zf{}5$p5-z^C0~&+->7}BH;mgNP36TTrzWGSt)OkL#~YtUSE6C$@fJX79ds#*iLx9V z1>O8)TLdl;7uzPS%c(t)>7X*qPxOtZ+FZm5)8ETBT0d>s?JHsoXGDIV=Hrs^FDe4n z;65jAECS%aYxMkr;>b^)WT0t+LxJ_fo`(vFh*D)a&O9ik44X7*Qu(7u_J==v6WtBn z--*Qo__`ay*j%P?q2yB`;^bQOI+4&>WO5z{Ui{<>Gb>;m-ENBDa!ddG2=Dr_W;}HO?lb zI4>lA4+YfpnB>Y2plP6IJp@od?h4 zZ!z)Ry0n(IIqWCj`b4Ia-@RGB6!R<_K+4P9{6YNQXXBdXY3D%mo_{l0w(#sSFMNys znIHZ6^f^p^V<_)0NvyXueP0hf94Y4Bx{n8h+D$QOPWP3DGya&rmimpE%FMZxIY|n% zp=Z+gm5~+&j@wV{biBl~EQT-{nX-R}J!@lTX2y`_t~Np%e03%WeB)b*+nB?LH`_XM zlvT~JYP;q+QWUcuJ}jkn4Bfu1}0-(j>fZcJrd38AQq8=vN3*)@uO zzOkwK?NS*LMz`rdEsl64sEy}2GV!g|Ts%NIF9frBU!jhNkJQPmT$gIZqJkk)Lm!U% zhs-2?CQVa2s+K2)jibHA22vk~H`%}E9|!aVV}nglz+m94E?DfHbxYCSBeyW!`%ojg z1HmxFj4d#d0>ZTRut<0JiHHu=pdRgem4|E^9_74!U2uIR_MaVO(@&p_Y#baS zs79kkGecZmo>3f@++axOPx>NeBWo=#1&^1A8E`1S&Y#xfDNK6QWH}joqceAS_j#U2 z*l**hs}`U#LzlhR`;$%6GI)x*@<>pQ71>X|U4dXMEm;Ku1XRuUN?z&#Yvb4FKz$do;=KGgm4RZ(q{Og__bG$jjnC^moX=#!%jts5B>Xr|Id0b0GJBVVkNeBbFB$e9OcGf+l7HA} zuO>}k7UozhLUHdZ?@haPJKrnSIA=a@+T0UM?C$!jm?hVIM~V}@_H2M|3>AIF-8I=e zMGt47^3jE{3c37xNBu0BUl&7T;&&2srVzP`OV4pfu4+uiuo2VjBN4nz7&V88^dI~0 zK$N5J9sm03^=uN4gWZ!t8)4Q-O2R_bRg1MTTrPl}86vt!=D?d~VWcexosQWkXAO(2 zh6g~7`mu^*;OM2kjQ;wkC3JT8R6}|sEh6U-5bsrI)$fm2@5_u*7x@p|eLsABM_TIV z+rolWGeccDiEmcLkXQ9 z#88vt-~1%WpqWUR6Kba(1w%*4(JPYhM$+Grr&XYx1 zty?(7GvE}j%Gg(p^e}!Y!BRr&K0+=`Z~~vo->U2f7uj}q;#sy`oBQDeChdnN$PVd~ zAPdA!itMdM{T7Wn5xY5D0u6Hv%eFJ!yR;WRJ8B~qus7H3GGgwz> zN9;s1V%&=AQ!UFfO8eT=bx-OLjP&nvi?QJgwH31%eGX&ws3?kb(^Gz`6M%<2;u}lx?XwKDRL2J z?&Iidaoa(CczB%pwG#Syjt@^ui$*^$UX*I;tb+_AQ2wG@KE>>E!aIbChTz~1F9OKC>k-e3Ms<&O991PZ}=X;-CR)l zdHVScwan@!%Ht#g6WfkN6d{8;mFk$Ntf}i3&ZsVYxX663>cWE>(I<6aKWK?ZWF3wK z_v28q==@4}2R7IYo>eRS8yWpTnIMw_Vti0d{PCf=;7HVv$0M5#{0%@(r3#RjTyfPU zZT8diC0A^Lzd2Z#a@#EPN!pSi>+U&^~z*9GAbMcorqD@yfTWtyMrhC8h=6J3I{wobPKfq zTM7`fBK9Ya-6UXY&dy5d=*INP6Q7|g4W^X6^&zrL$Fv*fWq&XCE&V(lJOqELtEz+CiZ7-Lp*nv8v1YFvlHeC&-FNJfVIhC z<|q)g!C};os^MVuhaLd_FeAxi(VNk@G?t3;4A1LcCZe?9(M<{nRh0Ang854^OM_S?fj049lQ$Hyeel zA+inx+JpOb+yhb5dI-oPBQg$Fd|XOaGqbbhbQ1tF^?QL89AkH~$xzLnA$oj`&kQMv zNEEF;Roh#jFWXx?$Yd?qz}ag>R-<^=L|B2`x7yi6awKTG%KR3(>S8JbzfOu$*?_|O z7&UK`J(U!X{>Va*EaAEgQQI|w6xdv1$c!q`RZ%xAw@~ACZ2B4&TpHXq2_jmf_v;7R z<{qNXmVBG)=EHE2MuOjl`DiY)pR5B)rBRplP$jm%qr`7X-53r>wEX%^J{Br;Zc^+#kADK_IAnlfD?>) z8%Pd7lmIuG*)S4!2Jowoqeuqu{nf`RV4Jh_Q~6WOm1J#Xm`1qUp|p?v&{dmZl+9_? zk^R`ptVRdsQ7Oc~9kXk;*6fkdL5*xC8w0%!kqSa&?$f9hlSrJ5Bg;aK?RU06-}(p? z4zT~HaIkSYk$CqGrM(09Y&VsSD>}nndZ%ro=ZJDk_5;@wX}K`>DZwX7A;y*`)pghAmgX@Vvsi zc^6Nu^xdu|sF8_~Q?MLaIiaT{OZ83`;lJWHYvW&VB>!Amip^<ObZ@w10FNV2GWFa}?!os&*39eTG_3W8sfgA|^&Z-+|bU)8p1eUxy6 zZ!+zsLv|r>ErkD~p-*q@Ug9WSX^yry@o{75xpR_JZg5>;2!E*by>C!}e^xNMY>x{c?KQg&YFC|ttbjwk?;QXmQn;Xnepng zzRa;2d%(~)FF5j!O|Y%lB#q?sIHax<$!1?O3>+RW?iIh#L>9%SSq%Ow*d6Y$o+Ck) zol>GKV?%Cj9#*|a?CPiz{owwV{Y0j`TN|TRVTSogG|Ie&ZPnq0j>JU;@YS;G%X$p1 z4@p^BarxbZ2wBm;SSzpJYyjxHBk{LY)@ebzg-Tcz25@a&IVPoNL$rn3rzeDa$R=cw=%I z)U<-sD@Zn8_O6Au?YQ4c7;{fK;^dF^RO({}WX#>UH%>+2{3q#~ryXK)ibpBffcpxf z`=;%UNSb~qZSLJIQTv4zH38f7mZ=L{$`_}uZ5ro%iDK-3g~Yg2r62}Xxoa~SI6=|X z?9fCC$c|P5{~pF0!1+T{#kF9i7Cu5BFb zGV1XGq&WouTHr$aPbt`}sO^2pEASiVL*rY)k!+i#poCY$k@P4KX`2u5U`4oBLolZ2 zmZk;YLlmibRF3-X6+`;@z8v>4H8$f9M`{g9XdFph(B4r3s|rMc6p-nLS0EWBm!Bn; zhd?&>YKgad(Z)1@hz9zneZ%0CG*#aL-LDy1bjG& z3_?R|1!<9mL(+C)OGA>|`Qh=8q^4x&2Yus`b2Hujq^`vk?4*rKEOEFDd0<-I@{3Vy ziX){T`x6f&EE{~8d7QJE`G}igJwPx&R>UnyRVR_RXI_2a75BwY(tl+$J1JrfmDPFA z+mJ(jsH{$mWx#SGwQ1}@tJI>x3eq_weW{@8;BI5AP6TwS4JA}mK#NODQ_IV74-bey zS}rOmzy{VF?w_2@MvzLaeL@`YX7+Vz>B@V%jddFSHZmqI6rTJ>n&OJYQEKTYq=B70G(l$Q31ahH zU;p}CP$4Yi?}HwH$(5$NU;0 zQ{!i{)rgdg*0;M3mVjbzbZ)bMc@e!YE^c?1A}l<;=Lahadl!_r>v2U;URJHV6mLj@;D==zMQ3I#8 zTa+9rq*?(I<^k-e`0VM}I)!WyyCc=|^r+?I!9_a(W5pR4zpLM&QpCt8K#Gj2psM!^ zWu{R#_gh-%rBN_jTrJ?_1xuX^-3`%Eb81BbWaBj|CwkwL%fHKr`|rW=zLcQ@9W*9|8Fa76+}U64s3^_hS(Oz&k7P?l7|e#cv@Vti1bEWwLngMoDm(je}J zu=Z!Vnrh8x{Tf2Hz;4+jj-gO%ytbE2{>lokh9u>(>A=wlkJKm1hHO%bXy#-^X=RD9 zS%hx+O9nSgiK<7yU5M!8A1aRMKX!8wg`={fjqw6u?vaw76ODhTL}nv-r@9L?DH~O> zp&nOEKNAeXz36_)DuPt!QPP@V!#A5-FoMdBqxHt7xn43DJ)NxKQk)&7@p9(4HC$Ut z`h!d%h*6=w+;7g;=j+QEddmP%XxzI8$H&r^mUMA%Xs&!kJz9B+KYxxcH;&Z07Rd?oSuphE7)kpgn;iwg|hTy0^L#2V-mO z&#Hi$W5h8H>M`Ydl*|km3yd6JZK82uXC#NM&j`TVZq0N>yzq+u4tpHyOaPzH4ywM8 zP?GI<-+h_D9m0^QjE9h6>cvK`9tOJxZpL1dd^u86UV^brEu6j02SkzlV9ZX8w-KY^ z43%PpQCkvblU9~R1tnU>^iHSm0G!bK@{qI6RqXBg3yVhAf2X^}Z*N(9OI=Wb<#fV{ zoT!2{uxc5^lf9F^Z(Uw?(_058O7G@k7nGCe-<}JubJt-wwuv8a3B0|bnkX2&X`h>v zI`c5*uM>?X;v0aYzY^CBroQ-Ifi&_l_>eEZ6VB#XQ}XiLZ}D_pmEMRPeacQ`fm9R+ z6;)~QY9B=-_-}Vd>o|4e0q)M?3298sb;0BbN>4#-kBc07uckX?E(==!7H{yKqY-7m zELM~W58@^^w*KGS5%ITdsQrF};?Pu_FpL5TWMLeZgrWeiR;%j67Ke!+E&g>17B&i= zrk1p|oR|yQu!elF#9HE^Wm2L1L}{P;!B>m65Rd=ugzB-ghVSm{z>O_P>*6xaE4_5B%Cov-ASiU*iEn zJ@KVsiyJ~{Xz0bpr_Rp51-2$8d0F5jVmy;1o5d*!$t1h1w=Hri6XNRXsOA>9{h%Bl zX_KrCSBJ7z2l!iN@MS-A_w#Mr5+O@%~67`u|moJ}n(L|$B2o$HgkxsN7) zGD7ZH4NFUV>x%wKgn(Q_(5qcU$J`wC=g+H6P_AAlA0Ca3;TsWxE-Z|Gh$1MJjx zH!#uYh5gQ_KS!9ZV%DYs z&?sUxo@0CKx1JdIWZ{YSLRpw0S8VtFP)deAop|pZD?*IFciT^o-JOlbv@zZ5vcb{$ zIhY&qJ3KC7S4eNXscV|Bu?`oQh%suG=(qQ}*@*kCx>BbgWb=Lpf;LB1Yx;)@jgO+v zbXpCqkqlSRsYe_8qZ7esLqMMy+FXpIPP9MtmT7*?R|F?~VMI*e*3{wfm(AdfGmJc> z^W3Hf$s|pYYG!)k=(hrd;?bYS*heYUdFAIx&UR6gGQe5Dwzk6B#9&16e5TgSi%PnJ z|4+;3{-=jnC~7D&yD@#ic4X>hG~)B>KdR&6!=;FBahcXJe{WpjpjhIw*XUw!XcGYs z7Q|4`-TbG@&@6K^Z4g=a7IxD%8^!c2b`z1sDM`p#VR9*ssLl6-7CF!_`~JsLl$Mv1 zCnwXLT__Bu&BLAFxeO20yzD21C%WPgl85X|c|aeo%ZmU9B5ZMSaJBvzEQ&hyM#! zH00JlapM}DfeQ=ApG-xEqS=Hsp-IG0P)yXp`LVkL3S%;y@8j&)S-`MD6qD9LCEyEz zUjuM%VtVi$*#FfXsQKeF?FHB|tfco90;)J4`t2ZCaDhRT;vucuFJm3KGFQfIY3|Nc8@Q+UE_eq8(b@%xt;;>^+bj%Ma_P1h0iyf2iMfN{*i^$`) zKe3!O;IiW|Md>zu^Ug7d*E-%{u6HYq%3}x=E|`bP*ckW?ZNzl|g2lsD-Aah1aDS^P zfrEf~PxV&;!yz`;fP=dRdKjjHO z&zGAR^*&Q%yPx)JgdGN7=f0~s`IEE^kZS|N4ENtpzC@HaX}_-MfVI7rkz?Vd=Hn+% z{-rNXqW&-4Jz)XV)r_DOb0F`MmIiag<3}F`w;c> zv>7)}>n$A~f7@~mFs=QNg&NXeTJ0&T3znJ)Q~6ztNV4IWiCWBoELH zlpQ!W$LfkluWhi`zPj55M~SQ#8w;*3+U$_g`seF{o9PcCnAQQDR0EY_*u)Go?F!_` z!3jB6kihzD;Ku?8LEXW(VJ*bZM+rt6}>Hhu8=J)+E;S=SctNbNWdEA#xD5Bc{kI) zG$Hz*y7F?`t;YVnBd3VnIc?hgpRTk5IN3!FXG-khgz+)&?8puUJdLcG#uwrX-W;rF zq$LhaA+p4b^%s`05DzVou@H=&P|551Q4z_)h9u{H3SBi8zVQIe7Q7YORlSJ;S49P< zLDQd=q-13yADI3-;sE6@JF%DveLLQ558Q)APu0N78nwg=MjBwcs#Oquw|{N+7;m-h zx8TXU%2#LP?7TJ=qjh73AFwdkn%h{{#BS{nafpv%4vf~jJOUZi-nJv`QL`Yc)KgOR z!FCXTXM}ZA3>HaVHm4K@PZ9^)uolB_f44;Q%B?fq!ba0R(b~pTzsZlG5V+NKx)cS* z7+C=H2IQ`ttftekSHnW)VoEPOCs&_11zOBcKvVKF?yi@mfA;26eeHkvMl+9OO!-4zi<=IZp&W0}zzRnt{z@iR-Iz%f*y8AF?&~EpZ=95>9 zJnp0+%B_3N2;&}!cX!>4uE7`Zjns zTy`S@l^D-|bf3xOt>{uuiEYd0&nN{{_qw~uK3W&&XC-Yk_mms(^4K|{LE)Lf>})XZ z6AW&NpicHL>!G{0j~}SrmErO}!F65}4x!`iVGVu0wR;RW=<%)y>!F8TAVNBxhuy;v zhhnQv!ZfT&n)Fmd@)go~`lGjUhT$9Of%T+1<9pN)nok;?NZ8icYM(m_-*W$vtep@e zx>OH6GdH6Q_=OeKb@Yw?vf1@-(RURCxU&RCEc?DtY!4Rr2y&`2Bhna(R;&8TS$Bh% z(@ymv_FBIt4&I9{x-}i4pMc4;=(7>FFM6rcOiQJm43AU@QJ3_(3kg;doJ|aV@LNZu zN&d1EQ#g5m2Ov53m9L-er_07(uoMC(q|DRjNsi1byZFcIZol?X=o@6>{f`nC62B%CVd;hspWy5A;3@cpV! zoU;M`wt8Vir1EFNj$btpQIsN>SA9D!>^TWu7Q>u$Jg3lNB&W!S^_D-yDQ(dopl0J84gpG@Ile z%&WXToXL#A&U9Nc7iP!R5(&txN7;%=`l*S<^<=bor1^{^>dz#A7WUP!-6wfz?ez=W zm*tlY?AA%k$dIsL>UQ;~Xe{3CrKbZqEmAjIYxfB^$)G~ofBaZZ@Xg#bD@&j6W$l1f zOhu~`7z}a_RbR(Ti%Q4VKb|e7d7BsC-YW_8fR^cG0QcOx|0N4?NzlXJ)wMM-z|FgJ zc!(GV&zzDtZ-Ul+3hr{TrUU05rWNB}VF{sdWWd9&8N)(Ek;a5D+5^?2wbsx5seVN+ z8*dkJcelp|O=AFS*zu`Q;FSDnUIdp+S`81FGO*no0m^`wu1E zj31w-2Mx-k3L*;-oep+%KdOh(eO#uRij*=;(B-pGd-s|k@^Bp|Cu~;2bpcEeTh@R+ z!^d0kO)6Nn$^1Xq^_t5<`=So%Y#Gfb%7PtNukI0b?sUH=fz@%LtpFu*er}`x&@M+` zD>}8}%l1Vs#*c-@5;)SvThrO`S1fB)WELNyGLc!Agy-WWL4Bz~J<}@hBJ104f)Iq2 z^=PZj+9-_nO<1tgZc}m&Dd2cS0S*pe zuH7Tzx^Ed_tg_d7Z0wILQq4#`Dqb$0=U*jn#>D2C!ojp~dOJv!zo@EHvwi{^N36TI zD>nHjMAz5l}~hzxc}RPfa0s+`@MJ5nl@;;asDc^YntN zB9FN$(g)U5qP!!78AhbkM+&2ZlRyy{7ja?4JWJI2oD-cqis$NRIpgUO&)yGXO&!!1 z9JEI4dMZSFxRRUQ2J$x0M^P58|`Avl*cQ<#8vYSI+^H1~IFqOb103Jh8wNGxEH#3|BC znl4j>@R_)>RcwcjJF=pU?+*dzjtg}m9X^L2#x*>s4za97;*Z@aLjAx|rhAZo;p(x{ zE9L#*NkhsOyzg{df&Vud=@0zX0$51#g;Xh**Kc0<%rVyg$@(va#30#ADD6JloE}Ps zaDs$GEY^vE@gm#MJ3O!Mree}u!FVrWCD%duGWTqukaXr~ND7+e5MK(EC2lNDV@Lou z=i5NcQ=b@t6Fs|yvm6f>n&M_p)IX=z$f zOaVz*r{npn)-N(A{nAJD*FgD65|gB#4Kn(4H}vwNT#F+AzQ}H#XjbhnOl8Y$KGG|D zd;4S~-8f_mNCLokLk7_2w_yRF$A+WR;6=N(VES*Do5ei=@7IM-CHtX^lH6a`KWe{T z68VI4Y57S1%|8G)3%zEN_Bdg7vz`ym_Oqd;rsnrZF~9@e33`EteQ_YUO)Gq;hnLrj zL9M#z^oDmf-dp8DA|#P&SQZ&?SQcv?D_;)sFYQ!)7h(V}VEY11T&UE*B@NK``&8ab z?&=YWkQ-XKzi%k(;5p`Bd6J7y0L#HzAA<+k^7CIsbqWp-{S2dgs^h|XUcis)(xL+g zTF{&kMQ?ANw!xjzyT&D6OX%WK#9fw3nl506XlFo|TU0-J;m?0K%&jRiS;7rU^`&GX zl&gVZ(wF&DKmDB657u%Nx5Ce7)J}QbSSqA9ht3n_`|Fo=S8!54n052k&{9~Hq49^a zrnw4E5AoVR;iC!W-+l1!awm3wxp}fkCFUN!e6ibib93bqgsU+Bxq*|3!S9a%jcuzf zEJMo`#HhDOTS?H!Imgwy+9+fmNC`8P*~d<&+rrAG*#Rr!TyTgnAfT~JTUeU1jN7Uw zn{gF&b{Z%6biV`y@PqrI4roinj?84*)@=boqVcxd*_{-#s$xiQ%`J>|R3^n8k&Eox zcfG8rcIU0+XQiB+pKcMM1jCBlSO-pn2zlycc#n>2%WR2X7i++sZPg5*=GZOvHUF*K z;|>iJ6v!O7-gKTAEdfc-g>f4I0$r;oa)7knkZR@ zLoSmE$gY}9k6h8TPjwQkPoa%^1rVr;dEyILb6P^O5NU_9v+?z9NN3`OC-J=7QFi?y z9g&yq{%FDMTks$bn}rd{D&V3v^FjKHthoJS)v%~T3w6MV*L6(b+NQ2nyto;@Dc;aH z1I*PuK#uBt|M0!QzLNJ<~;H`({x|@q2?rLlp)Q%4Rd6tUNW?J zmQa$umt(BzC3YCb`d_-Mxa;cX|7z*zM5bwyv(X;ZNV%sSE98Eh^+?1prW9_4M=rp<)w7eV=vVyZ$L1@UhW?scEHMP!NG~-`Rl{ z3|=nY?rRnOF(HZu^~ctwPO#Ovkl51%fRfq52l$*(SaY=CW4rv14o6KK$hyyzldH@( z&PZ-{!Dk|-&Zz4}3XmN6ivoy?GxI&x4snwh{HS^8xuGlN-@vNiyF7p;W7ok;j?`M` z#2FqE^FmlJuNQ}YA_=RK=s^}DfxVo=YFJW$*x0?KmdL{#pbVG~(8!_o6Lf~zj1BI6 zlP@)sx}geZYLH0%z~BU{APpeKL1nd?eqWsLNk7(Bof{x^?DCK=(knD5VWNWY*5>^H zG4YR1qzN_H`wuMv#s|v2!L@$t0dvV@ zALlAGeqYMV4LA8{V1|yC*q%LN!$ut0L+{uA?o{P}pO}R*t_#pl9)0fY>r@Fcg^Aa~ zzOJVJG;FNw67BYUT!i*&B4UW1d6D_oTci6=-%UPC#d~(%r;4Wq;xjfSdhl-?$GDN{ z&IeT)2-Ph*ivu{l|GgZo`K|wPeYbsSiq<0@u;!NtO&vIZ2&yZT0UC`ktiQ$m=qG+?zc4&cq0t>-j4)*>jOF*|Wy>sSwRsV%5}L zAcm_?K9jtHm>epXaI-c=Y(ke+WV2I1H|lkJjxcWPoOWALhnu?9^Aw=KpXdGoMK)A`5sw2qu>X2K*7ld z7*1R;kR--Bq*PSc?MO%lPK|NLhv+S2b1+vIVOb`e`(ifPd_H_!PoMt&yVQbnrdkP3 zC+dCE6)KAoQ&`a;I^d*Yd~{J5i3E)2WFe__4{m7=q>0l9YT8Dj)h85yPJr$%^;#v@ z0buiSRYVG$Ub^*`S@(s>JvF>?rY<(C9X;&x_cG7_x6H+ z(cTM`C_pr)B6+3MLBa*sw8;0{WE^W?7n~v5qnf zsS1~i-b`JkU4Dx}6;B_f+FNVzdpUrPxb&f`as#Az*4GcKQ zDU#b7B-ox9wPg6bOD+wzf{7{eZI1EUNRa*zWyENbE0E;f8=74g5xT#LTU>jMxl}msQ zzngQFc7OtnhTGC6z}Ah*P+hT>fdxZxBEsUwFLA@4#rehc3VhK23-2r|HapN z^{#gK$2oolSL9*QjOfdxeT$asWj;`g!2lui?F*NHKp(;?Hx`!0ezm$CWUS;Ut_{H= za_*4`l-aL6$#-)Q0uNI-fU9p;P%82CsODIg#DeICTF+*~t=hqA;nveXe9EYa#ZFNA z0=wyw(WnV$-`hXU9#{(2&#z&^Z=Eg`on@Po8>_Gkw!2qdGy~F zq-|ZZko$0__39U$_~&@^5bkry`323-az-`~IwWMJ#`Sk)2!7+ty;L}3s^ksc;MNau zio>$@f>%FEx!FT|>kC6d=3;kye1NjoUG|vQ6Ao6^4$F5cyI^Sk-nBDEw(SZl~ zBeY-Y*NJrD=c=DganR1~#Z~FZu-@o?o;NQQ013@-w0Tfo{ z$}1tSB4O4m(7Kno=VL@7CP1teI9U3*?@0ii`*EM;EL>nPWHiV<$<3k0ECuAdzoO)S z_lY9HgdD*k8VR!mmddJIlQ{tE`b&u~?j&SDNnC*#>m6*uevp#uh@c#kIezS!lbE?*bt>o2}2fnsrD~W24IZX zQ=pUYZC?`E?`TJ213EO#3Cvib0!Bn2W35Vj+e8ly@K)=i*onyk51-ab)G6J6V8;ifOR!JrYv%iXe61n5PqZ(ojVIdznu8gv59&P@^n= zY{nh~v)vhN`egqJQN@b*T*8O9Q*`=uqEbERR8(iXMeYG`nR%`+=cjGL1_0gM{R}5c(eU&pK7I4?UY3?J-k)sshBxOFuy{!Z2Jy@wunG>CPcn`0oQ@Dj` zq!|sdS`wMR;+sen=;n7K)=xtW=1fRqg~pTZbMRr&4{l6jAsvL(BM~Q#!?MF#!?G_a zEByaWS^bgkFlBbqoAHWz5`vH`V@3g2D+Yk-*DZJXrd^4pUc|9lS}Gj{NW`K9;O+RR z88m=R?9xUS`OTVb>z$myn9RThl`0@e_>qbF;ypi2JhOB?uLM5-S!l3LeLw|{j(b!7 z>DkQfFQ&Ww=|5HUDv7nA?l6h3#^ zfc@4qInydaX?(N~H(~%|B#32$6UZ_hM2^z^@kRN;r%H~#4)zmjs))*_UN18QhZF-^ zsuvp(L`~w3LlN8mNy8fE@6ihjfzlmFP;jtTHvQ~I2lMPm3G>_`26KCh2%y~HEJM5~ zOHRP-K*o~zi>7)OU#*isZ;-Dp17YtbqPoc*Yn@v1+O(|NB?mY9L=5y|I<3NIOTz9-d1B-!Qkh+Az+5yBZudqCeXoHRs-;|>=N+?_u=7D za&o;Jx~y}b@q3zT;VKmTO1Ar)WEsZ8(4rwW@XP@0V2K$|AzyOXVwh|DoMGANO@}*d^#>s`D-fDF?-2%u?dz@*>?tt z9nqs_T@6s$G+r3-%OzHKzSuyrn>tSxyXcCSt+j@DIXI=JfNuYEbCC{5W@htXTh$krJN|(C_&|OZI)lf0Evs{lYA%u39XOdZ!%uN==_q zY6gVU+u+UQFXLFSS2bd9BaC)qR11hvGFZU+C4}H}0$MBGBpthC&mXH3+9^<;sCfmu zSMET~MoA1mEGmG@?&0V@f;WZ4TDlEWFua*dVAr#HN#GzFkSGrkid2M*5Fm9u&kq^t_1({Pt-8WZBuU#R47e@ZiXSuTA^}fIaxnIX=oKY zcXh;b-)zdykLn`b#wh@OE4=_tK@ughd!9+}6>PymgG*g^V?!r}qu$8NiKy(wnc;78 z5oYM);17FPeL+XwU>s;tepOc&cx7cpecucp8fQC<6uynCE-t|pW@;)=S$l@Vaau@y zOzAqb%-!vP&G=Xwo#q#HE#(FZG*t_7Lnm})@$Fu@A#2N1HEt9m zJXb}~=Ii`wIGa<12f2RndQft(M1C9C<^b`_VoJlLm!4@=Azt$Xd7K|QgnqcBQL?)bdM z{LiU9?76QoRwv$44GL(mWUJ@<3JE~A^X=9Dsmu{3Wb#XC(+%gQ_5YP#JX3cjLivsC zJKH=FSb15)rpwy|=~^G3Y#^$q9U zT#eihgKS)Dgpv!8-_7;IK(I&tyj``Jc^p6U6-;@dNdWti(9r(~4dCgHWqtnKh>0Tj zULY+g;Ti>zWuh!8BoQz?1L(oFlpD{Qy2RMa>5^lnS4Jm>4&}W|6faYeu8gHw0ogE< z#)udIGuP9S(DqbWq3p6-s_$Uc-QA{s{w$n({m<<{6!Ae|S!;NRLhb-j$=}^GagwBpHr?cPLLuA10B3#0?1eBd0I&#{hc!ql0}UFfn6ewbd4 z4$0;q@AH7F6cDOBM6OdD)Rr1#@r;1>RKz-2Z195al;9?(D+m^p#QmRz+JYaf^7F~$ zCgJF%@Z{m5DVCdaP75Du217e3c^Af{lR+{(+gIN!?Uc*^XdWc*zlBVzNA zhvi}faA9mCjwh#a-F-WZFXf+etVICMWY7S;&<3D&p+dCp8TZHn`~`}#ftI&YRsmc@ z=~CDaEivD>-T*zILDIAawU3nuFQwi=83NKD)@Cy1!}8UTWgM9ci9gDb+_d*tL*NuB zIxax%D!(uc4G!thoK`?0iUEu(7s;!-aXcx|nR?)b1t7EBXWjjKb(mKi`K&7)9df)o z8#cv=*+uHLT!5(bfa>#Zwwt*W*u`Zr)8oatpGGZUH>O+M7_Qz{CKadF z7|n*M5@}!7e3MyJ%P)Wf3>8^ytNxaaS;PO|6*{&O+?ko&+{bj6A3QF1G4<=$`}lQ> z16<7}7?|fPd1(pFw~7!4DG=b7>=Bg1_GD>>hk9b)9gCcC4nxLa-Df66s*2`2TVbHg zjh+q3e#>zSA&uS|;4pg5A#Ds7T_m7D`;Q)JN3c1DU-S*~!cOs03%7 z?-DRRf*|*>oAe{jQ>%33^9n_H7di6anl7vi>={_1rEXg)IfwxWih!q@Y8MgJ^e{0} z3?I=tRL^wRy zNTGPUsEX|2GtT}YUJp|A%j^~2|C_$v?)P;6T=X@3J7sab!_XXF0;s)YfQ_QAuuP+| zul0@bglWq|;?@fT+6nIXK0veDpqmh`rc zW>L*4!QV^3H}vwBTY$BY7R~FS?9Ss37|2 z)6`{7T!)d#RFJ&r7%vcgyK`4#6(_acf4?123LBZ%!uC&dMounFoVE_BV`U(ssFTPl z#psoNpd1^=n~tM|R-uI$K(V|K5oxaEfE*SnCn2{Nql*4>kG=(oJd+OW&9B~QD$ITe zZw>F0YYFeIlE@`Pcn5+8ORGMG6|L4)Dz% z^S-UFDEup&QJp?n{PzHd4h{~2l}n{$WWrnj#myjMywVSj?OhsyA3>jN-=9tDyeM5j z4|AUo#Pv0F2D`G7d@18KVK)_@te4GKFNd%38s-!^{e0utwr8=*5_0vJg7*kE_Rc!? zg#RlT;{pd`wk>w5B`TMuVjT?@U2TlWL)uYIb#vl&Rp9XJhOUab<1A=0p-EWp9?VR4 z3n!3YS5rgV#)BocqHKd< zU_tu-=z7bjDx!hw(1HFy?tAUI=Dg+=g}dIp>RV@jy##JTwo1vr<`MUoJx0$GHY0@7qUzeh z1`FS{m`LNdC-x`g@gBym>K#AcvQX1PSWIL-Fems#PJi(*FZwh6i3LDV%>Q%oke8H{ z^bd@PYg!_?Sezb(aJJLtVuOVWkY4(4U6shWf5|+bKYuxT8OnHVH$(2IU=zX-j^?zlw=R@G^qj}Raj=8UFQf~H+-$M5d0!& zSGWW*)ob5J-$W&^4W4OBm+^&0<@lagxHkVrlO;0O|1w$W%3Dr_tBHqU9fsgS1MjZ# z89{qhsW1qWmp<>NnK zDV$wV)-M7nuHU0%VKS&{&m1amlEc(bl^pm>>+?}G#(>26BONT?In~D0GSR=Yi&&B2 zo$Z$A>q}3?jSGH%S?DO;ePS z3r<9^U}i_A%t}gH2>0lmwX`JVuiib1EVhL0dxsW{+otf$I;A7t$15Wys_p(TZ8SY) zTu}N}2bwlb(say=RT^u|*AjMa+>DmH)AK$5X#qDfDyXiGmYflb?yf5=-VvQ!Tl=&r zqMk++m|rq$;JU0qPBKvh>1nRZLxf5LW@1-2L{_s>@0%h}1XU7z zWZgLPdg3;wUWeQ9P9TnXGGEolQbxmrmtjVuNs&1`Iz>o|R!yO4`UwVx+qrc8{Lu zk&_=2sS11zg5AN2XNY(tcleL4i5O6GG64Em!@ zNS5X2@{bgd{JWC$DIn-3{}v~Q!ly!Bc6QjFo}Ma42J!Bi-?}6r8*(S?Glon<^~%6& zM7zSZb*-WfVs_iT{IX`ytoVea?1dy%73gkK;Qf-|RLRCCG0^9474{&HEf>5`dzqeDoT=mX49~;|ONOF!4gBl_`d99SeyhdX@S#LQJ<(+Sf+Py=d?RU9I3+r~9&6IN)7XtLb8X z0=OSjKi=0(;q8#4I$OVH>I2(X=7`alEUbkHo0(CYIR7=bVKf<^u3YGT@M~!|y=c;d zu-&KMUp^EGu#g%9a|ALdnBse-??Jg{xaMtbB$0j1sdOj#v~*ao1VxzscZL!TImdYq zxx-bL>dy>k%#n=8RAypSpq^J4IW`GK2147wnMzM2ccA-)B=ob@t?dN+R_qguwj7lN z7pJzAwQ2Oo+#K#?h*^eR6C2yC<8LTov4GQC=2ttp7ostdZv{TTT#$vrGxN=aCuhEd zatjf)vCgdBzXVb^r@*xjIo(~1M_(C&h2!WQuz>joYfviDaoJd(DHcPYV1(B zrc)(CDIm?&xGJTGNIh$&<>Y-LgD1jn?a z6^+oEdLXbK8PF9XQ`1R^#oZAnpM~bGimO_S>WCq&pY*&*H%NL1w5fQIa492jit{5M z0lFdboT;{cq=XUcxfE>&k04??gTI54U%bhB9VJHC`~0_tWpBbc4*_Sua5r5Gkw~|I z@wz|yAj1JTBlfUM&ABL)u{@Cr_%o+ueS#$owM1epEZj0b{+|isI$P^TWb&dC7>_d? zCE3MbDOz>LA^&J&st$*_gES_Ct;?bh91#wXE?7{kaxqs&tW)W^5-d!dSFd1s_NSk_ z64~Qra<~#|F|HfaRi}f0%RI1Xn{eyTaJ-=^I}YE~d{izGp3Pq~!&7Lcwjz6KFN5s2 z316`FIhy2ZH{Lk(DhGGf0n?6x;K!Fo#TvQTRubyc`XeNxmq8;n?<@%1{g|9Pv@>#6 zjqndeX8!M~*)ei`W5cM<2rF3RrwA&nByZb}i@XS${KDV;?2ny%qHjFIMdQISezL~E@H;A+3QKaEy;?pCtHSpE zjF!_#OHhEKuQC@K;ebLi@5Vdtk#|j-e2YCdHSr!lgaHU$hPa2xh}8*cG!`rG1;ov- zxw@S>!AN^paQv2y+NGn0zeJa?i)=N#~Flk;PGD z{mo=JFr}VTakCQxj@*fX%D?)yJu2=K38<-8o~>nNSVBTVc&gyqeY0AWY*aQXJ(5RB4@7n>O@Z5=B6P{&cochF4b(Z z%3o)my;v06apJ;4w-=sZqOJ@fWADVN7k8Uf;O{2zOr``=hQEb-2rIL+cvW>gK<%&z_&MPaz1 z@b3H6itE=_@p$l7X7dBG&+&@8IB17DkMC)TUm7VS#QA%8mJ*aA7oeA-r#T{S z5kiiDgBbKmYqdf*xl|xW#^eRJ&#w`H8w&dbJ_f z?`GlSzQbJs=n$n-b1+$kvP0SyF^aDALxiTn0Nkq>{DJXNPC{$`!k_?;o)(4Wz@N*m zp%eqE71hxA>}QCO6;^;UBqNa|tbCUUh&v;lF_G@RAk7f!=C&S8 zm);($C>#v*3&*0MZx}VVv=Gx)=VtAuX=kHE5Kexpsmg}}+<iLg4vdmLllxlRR8Q38(ciOOVBj@+b5sw4Jv%hE7w(6D0{^u%5^LY$WS4IZYL-Wki zl28ROm&M$%3>eZWj(HX%{6kK_d|9T$6f6ziOCRB-4tHquDmh<$tx>(hrm} zbk3Qt0fm$ENU2jPYXs3x`hGIk=W5Wehc71V3Gjrg2%^^<^%n=c15iNhlU4i=0jjC8 z3Kq#TQ+w5EEq8o8nDNQ(QUp4xugke8e_PI3IsjWDnliRKc|TA`{+f1UBafCb~M z&L@T&&<82V6EsLqee=%0WrXKL!^^a1U(NdQdwkw)AG=Shtp%CM71OYRS2!(@gUL#h4~Z4&4xHwspg=9cdEQZ~93HP+zq0$J@%Zlt)#AnNv0m%u7@eRC>Ow#bAY>MrMEKpJ zQObw4bLhYML{ETVZm7^R#KT~W4^1I}{_Ks_qbG8dUas(DS+;ZT=?R+<1mD3pV{)3* z1{|6!$~kHGIzWmlA?hnrH^$z6(ymr2BVr6#HLT*Z9Bpz9wbg*A=8f8(IRw@pnJ8g0 zToM@UJ-UfZsRTKRDI1}Wtv04VQT`j1LHA311FS@-%W}}+ zi1~h`N1?972{I2Ab`)0XUE)^{adVEX*_fvW6BxCS(su||k&Mn8GEZz4W?`AEBFwRp z#M90;1BlWIJG!trlL_85w{_h1L7W40d@B)|;%tu)WyC@Y%&22kA@0E}9 zyH|t=^KOWA`9sck2h9I(xDmAK5B$&@3C}k-QbI{Qns3leZ3Kg~vaEM(1p?S213M`PA8C-us#%sE3fw}^sY-nV z^C6|b!2X?);VP*A>Fzi;enmQeGfTuk!h*-MLSHL8T+Ch?YRWf}laneieML=_K~hEM z?bV-yzY14@pDvOAqY@4RTujZ@XDXdyf0$f!I|kDbG@G)C7P#v+etseGV;z#7kKx+% zEE2oYP|m-iLI=#UL52Yl^Oj}hz^50asb?&GrEf|!_hthLn#y#jr^?eHh|L{Z*HhVOy2{}2 zLl5iSbli7pF=TnwuY*qrDA)R8jC3z~zrv|*$Q@g|vHp!p3D%FZIxcfYy=)7&zZ7|6 zuX1}V`WBa*Nxsj~Fy$hP@u=ZbY@A;``Jw;pve@OMy=#b7Z%kwpd10V>N9PlE#Yw~% zPitOl*nUnYtdc^EZC4F0*eI@1$|1Q{;cE?oxh3LmN<3FJ{ZMtfABB)-`|8*0NROvW zEryT^8+(lRtjJ-sq6ztR$^N1Nyt7K?$(*)SWf}Z0@ex3x!ETRp*wCX<=}`CRd{wo& z{0J=*@fm*eGOq}ljaMfV52hY4*&6WlU{#DPKYjf8c@M=4cI~@Fz;_0vABZuND$s=R zWv~#`)zm1K-*@UA_l$FvsF4MIC4`Z052kGwh|LU5@>^<mkliWP2xGj%;)?(Yl7Wl{Wf43_z zAum{JX=YV6k|?9f@{*GHVg%0}aZR_^RU?D-$PHPF*ZX_~QfI&H2xZoJTxQI%xL1)D zrB=tg-$IWk_dhzw0d2TFG+;5Jb_dgGh0N+I3g5)S5RUM%CA;f_y}a(Gf1-%?=fv&d zzCC^ZwL1cVqq71T-rmjrQHvQ*Y3A$x(s-(;J8`e(KH3=MkPQUB0s1^cz{g6ZnylD% zz>m=^kR8Qivh*?@;0MsGS%an2?02UFhr%sxNF$4z4IKM{5EGg-` zA}~QYXB71dBxbke3vzxr$iRXed`6@WIQL&j7%ny2vNg#2tgwPPj?x^ktjwQ%i17#l zyahjfFiQg7J8XH~mB<1(_G0BoLGo~hPNKy!@{HKg#$uwyR0x>|E@=Dum8Zw!VI)3 z3rOJGc(GfPZS^!2B{j5iwVf6y`!#YT)!O#Ix4j#HMtN*H%~AmCCzw2czEH6H%M?yl zc;D6~icScI#=Qy5$pALeJvH5bMeUWS{+3#JC(@=<+Y_*?2H&b{t$f^<)AIlKtbVOTGUF=Hgk*J`NL0lM6*KSoyB^wrcetVY zjn~yP7a!_jPlNLN=6db>80qo;g5%L}+{M-@_+s;#4HJ0)=AExNNWV{-sEQ0so%hXU zRN@ff7%q*+J~r>wDuk#$Z{br-IQaA1(}$<+tbIQ`@aXIpJ##RpL2{-#!vYSV6ANI8 zW58Cq^ym8co+Z;pP?-}THxCduMoMLqGB{{>ucII@>5On62znB*LHSP*1E3J@_qfgy z6wmX0b{4oUw|~b2m`t5BC22rCWkg>szxT^I#=ZD>kLZTM5DnKgOybBOd@25$^@+&3t-~M$?)@u?#VFiIi} zjBrbgf6EdBsb?|nO2s}At*xzAG?3aXAPKSKy?}z3MO^Z~A&iG={nWHr6hl`l{_IDJ zWpAY>!eX^#W!L0MbHc*&DVS929chM?(Dk(%&9eSlAkTKgnm=*ITJo&fYJo=H00Ya^ z^@YZM6bzJs4AAeBB~lM^*J&k0sx}j699;CdA3i&pH;aIJ&Fcu>&AVq=uk_^bh;+ZM z+FmQ^8Or@>BnH5YuiI&}{OeY%CKQH{*=j&y-R__qg@GPc0@ZVV{4IRFDdqGW2rGID zpQ}EhM?5#ns*ez;WgpfA{ST}W=H%#Y+!TMpbN*|SWhO`O*eofIWV9v!A&v|*8 z3;o9%3{@QbRGjCAB_H&%{wnFlIFIDDHmKHWtv-LH>XueZ>)mzTMM!#7N5M4#Lq_u8 z%=aEOx_=(E{aS!XPmj1h#mxJRwYJ5)W0W%l#c)9uR;COIg6w*wbIfIQM7~U(Q5PV8 z_kRf!+^zr`y2jp&`BE%B?6Os*j#%-7k1no#V$S4<6I&v#^oomBGGN^hS`M@PeV}uL z2VjIna-2ebGQ?K)xh?Y%Q>?t5Tz|YFvLzOE$KOgExswkp>pz@4toCiY8gg}1OY5|2 z&yM=Dys_lsYZU|zzQ*;i&sCN<8Au>)Bhz%zzQE~=;Q;z1pY3hat9HP^d3eN)U@v)^ z*4oyV0UNIZyBhBP|LRy~X(o=n6j-1VZ7FM%Zdd+Uw z40owMG+(YILeEE%q1W-Q$D5%ahG2)OAhh{tt~J!beLnKM&Q(Vt4c|HHXBYb*1tNLb zr>(Go-<~0|s>1E6Y;C@D`nV=H^X|~Y13u`-!#e1!r_gpP?Q zTz=`4z+tnH7PSFj4b#y!mp|XenRi7!_RCvAdTx;N9IwDX7g$2aJ4ch~5eGEfJlqMu zQK}aj>%n|OK7ib!5Q9}Vk>C*p7#WRUpAZE|gB>o-HTFVmu>lu(KA>-0>c)F$=8{`| zFW)pWl$hbcaX$;sA@4FOajg~_Amt{jS^e6ENR-VC^aenwDKo5uTU13szwCo21{9)3 z9i}m2q?PXv#AvNBb;6y=%sl){$%2K{LmEZbi6BqDGu7CJC#?E%kkdf&(zWq5zbMnk zd{>W9i}84>f>Rvan|p+P8Hn^?k_#hcftt*DZoaoGC1t>HJ5^ahO^cjfF!&iok1xDZ zXulRc zs~E?q)$F>ui&0tObeaKa-UxXt-@ijjPRtl^f|AV=3BmRM?Bjdg$}UjEO2kptg;9N1 z7S`;NNWFi3Qm2Kq83S@z7}0-egxlnxsT+oV{!1-DMFkHB2e#T3jPv_K~CUq#gLX@Yt+ZSt0wsh71$JcH2=ZZyPrfIYvCjslmDncC?q2#rmCHH zR_0mp7;=>svoPgV-PW?PJhSNZG3elf5%Ds8WtFxb8YvaWQAc4K^y8?9pnx-B`bWeuGg8J8r#?|EZyqqSNYLB00ZqchaG=13?r?Wm<=B|k;TpA2Wn=GrJ=e0lIUTf7&a0!y zTK(ZS82^|tFVA4Ba8T7&@`N(a_F9hDs_oONZx78?5T}8?1QMZsh;QGO9clP%W_g}o zi9K+9a`N!-ILe0Hng4YE+v$(CCB6ac*nb)kID+AMg?ON^3mCy%OeFo8MX7Il8bCeu zD)XNCDOsrRqgm1RH{FuP48UX8?zv8?WbuU?yM7Y|ioK)w>V+viX*ycpsfeWEq!IY; zrm!=F_kW)uP3i23RTzG#)Y5$a_a^rUhz5hj-OcD!IM8`<@gu_5WHr;(;WIj2lGoA_ zr39vX6%Ki%t0h%eVf`+krP?S<0$ZA)QL7a&8xQnO=D_p$#9Jv*&7`4q9=9t!b@($eM)vNhsr>(# zdv7S80Audb$hYTfEmQDpAuHd<`QK6Yk8@LTu^Ij0H@n?xD$QuQ<{%-4#6Kutp>53^+)9y#f!j{I>aLiE6g-m$Q;kUL#ocR*q`FCj4#{w5Cm|fS8o$+(S0$)&5hvpKVVh`zEp5Rl8psCkF}qJ2HY24@YJXJEUH*bM?Z7mlPyR zU1wzf3)m@o3e!jNdjD4hcc=`CYM9ASk#ZYAPytHmTLhT%Pzk_!egk(7N@k&FDdOv^ zWSPF-T1kcd$u!efTs(Jjl_N?vjYemvp%$Ya3~5m(r~pf5%m!Zx4$nDsOPx#@UesqN zXHHa^OVBy1(S7+gQI)T{GET2(SsGEB+gf@^{mr5EI8VyI@jKvybWXA_S>dH;{6$Uo z(q$O>R$@{#8Y^ltC`jaC&jlQro%$~6n;=fw|27v*=&yUGb?RjmPrk~B#N z;|o;QZ$9N$hV-~qBR_W!)vf3NrS^Z!4T0`2kdwVKHA{}H6web_eOQYx6yDf9e;@EY zdSVpJQc3Q6N@3ivxnF~bVlK}6GESnqyN3z{`}{jJ95(Y@P4_z|DJ!>9OFl5x6COGy zW>#%2A-^XQD^0GEQ6*|=0d1vFtey{U&MKW-HdStojiP10ct zBBXRKd<^r_$Ucc24CV|8Up=MoTI9<$hoqkftGr&rjt(BfLR{^taev`?ML4Y4N>Ig3 z+O9#@SwX`sU27#b5$N_N05WEaUbF6|CJQ%&8_s_OCo2(96UrLF-7kh^zKd5rKD_yO3uc@Oq3|-Kdoj zCPz^R?#1CfuRn$Lqz+WreWD|jZVd|b(t_u&1@x2H&v#Vr5-tysSg*j%wvy&Ie-<3{ zuF!jB5z5<)6Z$LGko{M1eG%}Ihd(-EgI(7~#K1iIp~-TL1P!?V&#ow*D zKfsi`Ynpy+BW*S-;Wc%0&$K|<+khF_;K1m|5W_Fx3p`x{8G3Dvkvh^thKxNFE~78M zGyoa~aqP;CaXzyREu{Kzj>l{rBgTXD3N8k#W+Nq~Rb^0sQ1V%;>WNsH0JzgeZO~ph zU(Se-3sVN8aBgO12H*erV$ci!-+K)BJ;5x{7v*|GH?tofa0Hyo8BY^Zmb9bTNRg;i zGswuws{b=(p`oMOkQTX~aK7KEblg#RK=rm2#usJ-fseUPP>{ENJrYw5q638=AS2h6 z2r1Swh19F2XnU}>HY9!4dWK~%=%LZf`-iFdsAC7ZH6>Z;`FqGH(=Lch#=zfs1!su< zutw=!iQ9;dvx!~UXs-qx^@}bu0lm9nvA8`V=vo)s@%8LzQiCmIJ0mjDhXA*v-(@+a zak&PV^M&QViKBr4IA-GJ zE05~C$9gx@aAPempT*`imj%)5ebi9Mz!@5QlNPQaqQzX7eLyfEUA43kAvZmyIEl7v zES>Gb@_n{N$aI@*5XD{9PNXx<#UlV!S0d#|9#NR*3I}#5^>$j z9C_?yB)7D+SkD+MStq%J9i>{ogi?|gYb%uU6{rua~+N?_rNE4SM`C->T3C$Smt z7iw*GnPAOFT2@mX7Q@G$A9(TTD?w_|Ji@MT~QmM%o{wA%Om`R!GV?)75Jv-#-n4s@sk*|C(;TtPJuaU_DkuIb6+)) zRf@SOK|&sWCoK1D!ew6Ud(>tZ;0b|zlUL4me2|DYiJdqpCa>Jh61DM&1Cq@j=9ler zBc@9V24Io00;^lH!sMrYV_t+gpnyg8y&j`A7Oe0! z@=jrGFLq56KPwgf+9SRDMO1J&pN=(ilPR_yCD1Pv zKzFw+pf0=e&4O0K%g(xiAI-ABCqyg-`l*io3frWdD;EXR9yoQAd;b(S4(>%a1NZH# zNS5e7LVkE;^FT+qOsPO&)CMU2tTkL_ecvUbb<+d!Mf#- zwv@}rcW!0NcdoK59e}#Ua7~dM*y5rT;vv)vl2$%PCBH9hIDOzmMI=L9#W9yVvJAxwY`ZcLNhHE!T+uyFG0?r*QtyJdhmx9 zdYIM#-OY8)*#t&x@_XOhZF@EPx;D>M4B0{Wo-N0W!ux40TV=b#IA?jsJWQ9B^(za= z0}@ulmU^^Y`Q~!n?(6=oqyyGYw@1TWpMb);O&>v}`0}Q!Nblx_aL1lLa|e3a$ffnY zBy;e~L7YaZMXh~8!vl(+_-37SO=D|mxkbk(iyutrYU%W82KrJevnf0YNji1|U9bTe zpV#X3YQ8dmHOqAbrp*lKl~?1`9tENZEwW0y@A~z+o;2}u;WbijC(zSrJeW8D7Z`LH z@&{Jo>aQ;TRSLB-lW~ zi9ur<`4Z@=JNuVH`Mw3$av|p=^Xda@??#Ksv*VN04@Zj&Ra+D&TQk1U)rW!Ii6oXE9rCyS8}28Wj0_bd{SVw=$wnJeEvNI7GTwZ8nm2nsMR3e&-rY=4^sK zEdwUL>E#Dz&9D#S(|<6;LwFyjeI`;#wGZxoxSWq`ITA4Rt*rW@XwXM?@Kh=b4Obbk z2HqRIeSu;X*HeU^kJoDvCiCic97B6SUeY{*C zzJT`oQv}a;(;C8Yy08d7g#aEa=k#ENeR{6wrZ{wb^6t6dRVo#Tt13Gz-^{MU?Jcz=)*iJ6wlTSCseNH_a-8Td zd+0xuid#uHU2DK1(XND@_{r2uwEdm;W;(37i$Iui!ve@~=zPyb$;(dAq#AZKnjdwL zv)nLpzR)4XP7@1!O*+=?gqHOi5ZFf217%gs23`8U>3<|rY!Q4T#{gg-Z)>`=-PQ0i zg#eHVe7-Ov?6yH~^Z8uANo?9hys2yn78K>eC-U2xYgunMbbwPhev6(KlBJX3B^g&j zZ$^T@)|0Gn(0D<}jII!WFuHtYL;Y!N`nhGkKa4g4dMjX)z5bM%P|9@hhZR?_l6KT88)vtT!~MOqXZ=5?rszYgPe za>6Y99RnN2H1bP+i|csc-MS>ScXR~(;+$mvr3EXVP*@Pu|F?L8g+dS;ec#NqU_EVc zPU6t0j0(CvvVhJ+Lw;AhwCPL0d?}~b3>?GM>2xX^f&O`i)%^Fn3SaKl*tvd8nE)MO zKOkZ%e=2hlJWJxbj!|t!h1{gYIbiM{olOt@&L?YMe#<}8auXeA+Wa>cFK^hfBd#oM ztCr2{k|5pPsD27?C<#6~38g0-l} z-I>5-FASi@n<#I={U0bU@m!~dR{Uo9^hQ|(!TCjwa?wB4RA|ox4|&ZX2}#8urTVW+ zZV{PK|3tiUAy%?RAKW=8umW20{_i@WRpaD%;j!RxAMo_oZ>noIF=~r**MuCkN(llt zkbJC}g(pISwE({yT?*Y%u)inzglyjE>wafx`)b7BFuKqKccay_l@M=ZYrT=hclT*{Tv2WWl@hIUP|gHc%C>z-4PbIUXN zn|?|JxWTcedoPFMh@s~PbI^@+9WxIfSD_gr1Er8S4`#M{)PX>f#^<)zjB~8J*eRS;!1xP90Ywad zzR7)R&FhJ})0wT@jQ|0uV*mCrAPsHP*O=5u>cn0iAQP}u`ls7^fZxPbxY;$qcqIed z9E4GWxQTz)4lJVdUnI8ay4bm!W!NASqtxeu$9w2+LEKJfNGE0!S?r-qepOs1A-PtK z-D{SvENn92B}a13+5MiIRBY4*JcRrTQ$lRMNC`#O3YR zwzw}*GJd19CbZdiA4{*8zuU<&cJmOe!}k9k<(7%e3tD?vtD)3lnz(5g7pHO!2ji_> zkryqQp61hxyTj_JiPN}%*(mEBxIcVOMmArpMQYOylVbL!RHz$?Li1$3AX!KnmZG3D z9R0V6137)bnvfipE&(DuFAuU&FY83C*njn)%YU2=o6}D;nm8e3zS!$)>}tQxZl4!# z-$fuSULI>G!7*u;8kzT%n*q?n=u$s0yAQg#&)bNaA`rN#fPUoM4r;?uU4FTiOmuqL z)kX($CR)2}RliZEz3Npp8+NP|$z&O6Ibq#sM8JyJv3Q_vFE=ITuKSl(IA)-ddVgWJPZSEGrYgwA%{ z`T>yPGWXVFw4Vg>##&?DDGW##0J5hJ5|vKv`#^Ff$LgVNZ*(@n_};r7cI0W-0a$CvG(B@h#afEvE--J{ujXV!?Sc0uF>%{h5#ipq>@b{l@Zg>G)6kpU z82j|5^Mh9r_?8|NI`SXdK;Y2Z@Mdo$d>xBdE@lKORwpkVsP)DC`tOqHq!UB&kIU5#Wj|iM6Te4sZ1@NK$hh@WF9$w`33^z@# z*}Az54Yy>jVMD9@6Jd`h`CYMhqq44CNF)dOB!|~ez&U!2gY*XQTVq8#552NUV?IE4 z>Ove7*JE|R9iQx%<@RrY{$HKnM@!&y0oi_O=-JCN=iL`lH?g-H;U5-X{Fcw*RV)$g zJ2(U!KZce3fOq`yEb&F!wZ!q2s$Z8pZE4p9odkL8M}S@v6QpfeO*2~M8!dpX2hgnB zVaWCdgc|VT;0MUZ5(~B59-(wCTKxCy0g-(qvKO#+CwCWwQxwYXiL2vyvBSx!)67)9 zVaGHojY%O$5F{6vibQ8GB_I|oXD-Y|95fC;VIk^)6lMKr@(r+~0){%OkBnh=IhmX- zgOU}^@ z{9Sxte=)vJM7ZdCHC|j*RV8h`-g`xGw{gM?3JD$jZ6ont&?4SG6vf(`K=@>`MG!Q= z)Kgo`0X3cN2;9V+?sX2F-_Q3{k`wMcyKJAuf(=n-E2#_%1Y3^~%H(4YLSyqhJ`eo% z@~I=|8F<(otxFHWx*~p3e?Nv2PuljFg&V4gZ7BYX_Xgp1n#> zWgDWLTAc>ZX5t8t6hT_(E3V0(YUsFm?j(q1xl@zgwS4vIJy?_5{7L`BP4b(!q#JEY z1cn=6n+WJ8FvYXQbH-nULcIKm_1=}g;3d%8Hf7Lnn7eqM`vQIf=Vj#ktgO!Xy}%B-f1}_P^Q2v=RnmEW+n{P9SAJ>`L9tJPJ7^|{$10X zcxXXiT+oA-wwD9^mJ}>4ZuP8F8CfXv`E zs?9~|zTo+7b>z`59olh6$N}K9lHmp~7L3sh&6wh|5U1eOOI>(IDdjvFWsr2>Doly? zfMrIpFZSYJVUPp(cu55SiVgzNkt0|`U2dR4x3yT7 zza)5%wQ_g4zd^)Ivyg$^!~)a1Il? zMn+OnQwizcR3lZ8>HBhO2$FMqLb65$X7%XSSw>|KoFkNxhL@ozs;v$%C?onHjLWt5o;N}8GTIvOykr99t`-n>f;D>rtA3R+K z&PvN&Zq03m0^8PnA%GY>cyXAZSBfG$$y83m|ISuKqglZw)8S_8-R6l#->Y(7X5A2B zs@mwM&i4=T5sa63+5P>fSHVfH0#K< z7_4^_521YqNlkFD;(7c3DxSi3r>adD{Ba-;3A8{B0uM+NImUr*eX4DD;a6zAbe>Ui zEBuf}b^hY^9zX3;iIN%pSgKSmb+YWQpR|d;-|z4jnfvkQ@ku>9+M1y7sGr0t^E~`) zme(9fr|Hv#C7A3!`!-~MS-g0ZFsEVIVY4qV^RhduhQKj z^1ywAy`whxz1CV1y)r(_j#(U^yAxlYJmd7>QCs!<#I$~f(9ehz zwiPvX>OsL0$@yiXK$d8L{!yhQ-%iL0YbjD8Nq3DE0)G>nn^(Xj_2kkJK=0~Ags6N8 zw|@7p5`3*Kg`ftr{Aem8eVz6uiBC0hAogKBrOJc|A^3^YS0pXv$sY3ueLN?Zf`JxM zDjTP!re-~T0E-+rt9d|Rm7qe}Oc5)l%CVg11!CV$8u1GM}7@SC%Jgb`mF>osQq2D(3mSZ6g01S;~QTn8Hwt?OE}I zCh#t~(>)!Z>s^_{e{d=jkck2d zeQmq<0$a5P_kV}=yGV~o>tFc!0I!=P zk!3kK-Mfq^slrVaQ31J{YT(5qRm3O_jHE$0arUUU-NYltg_)Hj3If0q=Gt~ExXD`wBO zZ3Q9#oKLtw-iORoYcx2^n#8R4O$=xAoUJ8%XC>X2L7%lJbtEts-#A%0)hu7vElwm5 z`rF|%BD*4de3_!;`}4dml~d51U8x9je7yb!-P-U^+OCvp{vCU{?Li8_n@zL2LwC*! zJ+zB3Mi{glmsEysDteH<0wP{0QA`ZX841%vKkqbP>&VPx7iKD#Q~*5L?4j@Cyasp^ z5;C&Z1N%3O81|PNkpHv&nVg(7tWyr$ga9+W2a2Fz2+0@wMa?IXIXZxv&;f*!zsg@y zn&64N;3nIY8LXh;f0hBkY)3A-JsO>ihi*LMX}`?A;e=q0I@bu0*bsvS^KE<*Pg=n^|Go}k;V5d=sN#pq z1F8o{qwO#|FT2GTeirhSs^U?okIM0{^gqxKb5ioUKm7rP zJIW@yiif-twlNGD@qVX0H{P1P)N0OzVLuCy=W=y9LBLRZ34F25as)8^jr4iC-JZ;-jDlhTnukfR9Z*K<(Jg(HcVO`PkoILWk{ zGtko+rRMRG3g5AgES79>S+5dab-Q65wz6sLf3{L@^kvA>qu!DZZ1qU~j7k{+rdnz& znu%G7xBb@gi8u#L;ke>W~+ zDIiv%Jlew;OQu0u4C8&NQVxFV1R6;H%rsF=rngdF&aDx3&aSsT5LJXYKY7bW1Ew_H zoRSiVg#`<*N4?IiPz4B+xH^dSc-mALJ*7*H2uUt6k+EWydgYJv1s7p*aF{-yMcUIb zd;cly+=Rgb28Vxmlb;tA75R>)MrP0D9&t>+cm5~>f`#>Fd!3~XtCPnH{flZJqp{Mh z#V(n#TXl&IYqvqbBk7x^qt40iq|Tl8(W;?^5dg4J9l5s z`BCl{!C?Ws@W|SXs4af0E+9kzxGfwjKoqdIK;9OP^irT7`*gy7F-tFQIB{qe`U=xk zdBD7cu9Jx-ezHGVuvX9*$Do(-?OlpN@4uiWVoyLUeHbNP7y*af7sHo<|Anu?w6zU; z4f5#u-k~I4<>chBt%kc;jSvAH)WCU*qIvkutgFFlYnP7CtyvZF5KRxcPGMEFD?m@N_!5Y#ymo^KCD=njPqvKRMNxRwUvT747b z@$~06jK2aIA%0}@U?(y#YWKR^%N@5W>g!kx*?j(Syg`yc*S8EWOW=bo0$5}D4~!yo z@i1UK1;m5J%R1hia3wO_=-{Y$y?l?W`i=q7%qiw=j^DPUoTOH$18V_XA<5@F?ypUW zQjY4dqcSV{H)Z0ogBb&RO_Jq5nrvI7pS-T)??v3r;Ff#i zYu2709G*j_Xb5kkj1|F9c7+Qd=uMn6?)X zL+E5xIr#1*2LJoSnw~mUs?cT*z zknZjQhGuA_ySp0%h89r)0g0h&$e~4~TWKVfuA!tv1VI`>L1I9pIiK-)zQ5l&=Y7vw zF8^UI2j|}RzOQ{<*WSCXo1+#Y z(0yxbi-nnuqCAAfI?*r{FxdqB=Vt}$r6%=0@xo=IGpX7X_X|YEdd0!8D zHX%l`Vs$yTUVrYVXtBeP%x>#t!IaH||9(>pK(d4GvR3uwAW8OfoNkhl z(GXAEur~>uN_~CKEFArUoyu-*T>KyQ8u<$_eqiJM{iSk&i7XfN==%`;Dc)~3{`O@d zuB4j+&(9P%-9RDUTBQmO4+-2G6Mn{P{9gA@Y#b6i=-p5mqg9;_jNDczX=_#Wc%yrT z%#G_xgAL4mkNX`zC^nihWdT2&@i{A1?d9&HPFA!%L=dT3>2ds|vv@x$D66Wdco(2I zNa^XTmih@O&@kXa+06FtUgvegFx7p5{Rjq=XjJi&|Ku6YW&VUobVB#(5K6uCm@Ls@x|ip)Hit=!kx%!448c)?Tk%lo6J4 z80iG^bu&Hf^C=f#2Wi%nty@+_yltmhV}EpL6y49#Lw=gie~61x*9ruNJ-KIQ2@`zE z^H^-DiM00x<~g8{?BhM?!nZ`e^gCtGJntRp>TmVSym*ft@#-aOsCLPJZ#dwf958Up z;+;y2G^0HVI_@Y6JX8ofRlj^lnjNoCY_*=r{`zS4(oS0w8&{gi|EHaWsMk{dAtd?aoM4sOp9F6i-dy{c1AYP-B4Xr!>}}yHil9C6d&0b z-%`U?>HS0-nbiC--~@l*@4RjNCq4YnO-y{c)AUSLnr_ghCYx9NU500Ayfw5k3LNiA zA$dmn$Y@;%ctd$C8!bVAW7twf%UI%^$nhdC#G2F=v($Pn_- zsZA@6op7`Xru=y37(4KLp9cIZ{ldvtg@~$M&0*OqsG~iAI{#vop8KfnHtwb8ZMwk5 z-T0P6WzwMGOI5da?EC;-Jh^3yTYNcr_k`$)H4DltK4%V!hnEMb2HijR7N72$JIhy< zptkOlY_{zLB*)D(CIpjjUA>r-v+&pqTgmGn&C9IF?Iq|xQU6Qb@AdwTB5$Js!qcRWl3h@Z3AnM=DG_BFJu(BUPgGX# zM`@%YuMd%ohrI;;j(9RccbRDLUnG(iaevE)>=zITjFXKm-M5orn+u>*^rwWL;TRfG zG!ki^(f%-Ec1Tb&R*2oPz{R^eCq5to{*M8uGDs*w48CvyV2j#G-w@fv|e6saE^HrGb}W0l+LY3esByge*(^?ee@B0p_PRMZ~nKeXH- z1q*~I7^T!b!8ojGmk#kERB=<|x3aR%e3uQ)zQF>HF$Vgc`rlI}_l|>BQRdlM0bpL$XxTQKrSe&|(TK(x}ZK@%4_|SCy zVJ)E@XUG*kq*to7pf2OC@;GNo04J@ilj<*6~o^l%{4zE5@Yr}`W z_=V4ZrzH|F#p2=N$rO3@znxhUx&G*PL1;SBKM@hEtgVTBp~ez| zquJXS=2V?Lo<69yyRJQ$k?=+08whA?;T{;B(t#AQiXlElKiZ~Gi!e}JgtcJ!4~SL~Ysg{dEWcunQk@KDC1WoB_#XKT-ItdGUQo2YxcsdZlm*4_LCBOf<7j zBxh|5Ie&N(ybK;K+-&4f18%D3c+XTZ^*-m~q1gPX}FL*HQu2rNX1i~s7w{*dgrtjP)S#OoKn zb*jdjOkJcsRHEcQ=Nih%zE_R&v5&0V34-c6OkkcGB+rV!S>9yC_~1r4BO<(oF#TcU z0w5cqkSqVZ0*t>5&GDDQ$v-)hXa53Pbk+2K0os_D7%6N9ZX4K;;B{=ox{*W$wS&4x zIK*Z#+otTp8NC0;P<7k{GJe$ua++*TUEZ$h%WWdP0wL5Ga#+FKBY;Of)1m@mB;(!x zq{$0lxA{M5QUUxmB|4CM`iy+RB7qH-$R!hLzeEH|41Y}lv%!~)^8e_w8`ZR*nl{N(q|ji zECD4GXR3SNqU2dV95&m|9UE)UGJ&@~1>W){qbrgVzquEa=_wbR$B zae&RlU^~fIJ9u)!q<-Lg;kj_DL2iR?%yO8`8;t)ilaMBn`@M#TbvbSr{?}mkR{CN4yakr`~MM8O)6`xoYzGAqb!t~yBaXb>|fVN20TL7mCoG(>Srl1@JJZ$%SsG< z)!YC%mv9x`2+^7wpwRL{qIygqzcmLO5Ht|)q&}sW8bV0}4u5DMzx8@hVH6EERC6lS zJ_|7u*8~~xja{MfCI#-n@E5Xrf_udOepgN%dde=b@Zep-$gJ#{f@5-+leDhFKipFkx6#8qSm zkDAvzYZN<>4?cAhj|SP<{b!N{`i$g$2(D@b{Qhj7sZJX+?drD5Eyr?q;zm(|h9OpW zI$%EQbCfRk=l2N+iQEJn%GznuPN!5m|CWxKS+W%s$VpzS8dmTSdRBupNaUCFAZZ)A8|XdRJ`mbGG2>&NfP0#(G%j-hrzC)o_F?aH35B; zMegMxHA-66uQFhmrN}0EQ z;;Nfpt*;|=i+;>!SVewheLvJLu?=T!u%Nb!@Wm|?-X$N^Q+-|lvw?`OmNDg(oFLRt z4VxL8V6{JI+q8`X0-DKj{JunkF3&lype}?3s|Fe7X56k~KsA8-K5T9SA)h>5qP_v# zF4tbP1ws`#w&Tc6rj!0ZX)S7-O`pM?%~YB-pEcZSRB|;u9!KYTOEBn#YF8&-$U+*L z@kZ7=`II}5TXBEhqgpt)uXeQmqn>y<_42d)?bSO5kB;lpMQ262Z%Dz!8)Gxu4{iKG2<<5(VAZ)P6C2G)F(&D6h-@apg#8ADTFIrpMxn3{}#FG$Rs zU^yH7O36XQ4^K=|e)6!>yX9Y~qO$^6=h09lyH|^pZY|pAD#iyEO(TlUA!zNg=IJdJJ8NmjW)2nQ7Sd!r9_1U z+KkF!z24c#*en684Q@8iQ(s&G+k2@l-hIwtewR&L z{&Yif@C17>C|A*ugW)xbbj~Pdyu~V`S-hzB;g$6C7&spNU${YMmA_E_@83Vnv_?nQ zC@CWPPixP5!4&kx-VN-^sW3OZDv8`~8q4ttO%GBadDxq(5M{-ttb%b9I@bByJat_M z#CGCMn?7#o_0B`rqDtn7aN^<>32#@U{sBVM7#66aZXohSXdbE1I~YWF4i8x4y!1xw zt|juWhIRMXMmj0KgqPGQrI93^L_S5texL}xiud8Z&`?P_3r&~l3fIurmUDP~?Bpg_ zR7CRjJDH047IPyT#!)n_2Ib<&$j4OGUnT>3_m2TQ0u1P;`MVk7A}jtqmV|oMVP~Yc z*@q~5T{kSTN(~*uBI}tR$y+YRXsMFN=e;Ced+sCZcg><)9NsYSUgM_`A7DaGH3#lh z7(fKQdZiqtEihwB+TN=DpJ#$Ar}dRCb>8ZJ-FH@oXX8CN@7+2~e<6@>mptvt62_HH zYk?dnVvn*ftMY&LeCT@p`qvvCVwe$m)WI&f{d7jsYL-!H>s)bTXS?}>zsl}^oCcou z*eVrGyu8Q5`hI{TE&Vc5W%2_ex9-W$RlyDdXo=4e2w)KGk+EiPY;9jtcNR@RGw;`Z zVI;GM*z5HRj(Hk_z_*zDl~!ZMR0papvG(_G7Ol%oAp=ol z5!i6u3-2S+6+<&XA&@l18Y|=Tz26^wGDQGP+f>ZhyncJ%O-1yreWDCRfnh&fpf)_6 z^^`e0#%kY7Y$Ub?Q>9aHdw$rNKa%l=L+R7Ix{|JftfHN-oT{Ch`wgM`5*DZ< zR>MP4SZ7dZy1}&Q4_;|ddOm<(K5v1G8Vq8d#%7lG%5yR;zcD=2k5kie5pKjo8Q2=u zHUSjTGLXUl#VfWwgG*hxE20-jL%c^ z2d<5gx5;L9VAly7VDlqLaa&$VUT-wQ(0N-w`1o_zybU#W$&gM|QwD2y4HF+4xqiR* zuf!ra&dez$MukLxVu4xoSKfa+r1-NU(u5_>upM7!l8b%7gg)`7LSt}chgT56b5(x&Yho-}F$?TotoD$%{WAK2aJ>@!8kQLHX%RmWP3{ItRZf~iX+IbF8I%u^%3aU_L%-PbfD_Lkgm1{1swfm&^`0Am@ zv6Tc=SVj;#99TR%LKi)(UgABAk$?^?aSGPou z`e0129kOlze^{JmZHAk$DdT~o*Z&r7Qys@W@V+AMtedI-ns~DJ-DG#-vo34+x1iJhu|;gj_I9J6 zJv#z)y?|*)$_RjDZF5@L;?9oR!3@haxIN=|*fzHAQQBHWYiaB9szmYU{jBPMqslc* zrK4ixk9cZYNn6V}0kP@(^{TH1S5|cq+Rx>LtsYM=C1l?DKVJ+iq1R$h`kY@r^m|+B zirO5p=|B(9w-F6sFRTBJ--nx< z(c$j37AjTkkvfDub0%h>=mLp=}W{1|hOKn;8H zgMn-`MZat~ic{gaeD2e+ryWT)2OMpyl2P{5!UNN$C0=)a1_T<_U+(H$P$^ zR&ik$=jIY2Gk4yWIyvuR;FAfmv9YaBtvUMN_D^mKP38u-?nGMB)Rcru#a{T#nD~Z% z^ZF9$f6%Y*wYmx&806#%vOl?>7UTxtqWaAZQPW=^ah`DZ_r{n&-V!45O_#IHps}Hu zv>Rz@j-!Y*#CqDy2Kw#v^!|CRTY7?7D6VK0uHZwDNXT))&$M+gWC$M?1((5_i-$7FkxtN3u6VV)8gk$%N z8$_9DwXaPq*3+32#sjtXi$>7z#U-0VsxnCy{lXeHIelB|W=Zm2b_e)(byiBg0PiQe zLp~dm*9ae6-%ZKELpH6yDwWD2*{7Q<)u=SeM2Yet;%vZWpseYwD(waH)sz&LyS|MU z{ko}1k2Z3e`KwKA>9CcT%!8jQv&@?0Ue;wxFX>Dp$LHxbIc5vF-e6_^c;Gf%qi78! zG$<}@D=5?8_4!ar#YGv)nfV3dbCQB%g4HR&qoStn@KV^5t{>st6C~PiqtiQ+-Yex& z2A@q)1-O;cyT8Jceac?pBVQwJ=HVy?JFJ{v*2WpchG*PMW!LBdbdumW zlQkIZ-9A^@;8U^ZkMI(>5>$KyY#E$=V%VxIog?;0y%W+rq7|>UA62*1`T%cm`LSV) zi`VQEx4|9>WDpR|^CnR~CUMR@q^7CSQ#K8@Fw85ZND?~I;#e!r4Q3Af;ZP5>jFQ$T5IiLZ&?l5sKd4@mHig*FBj4-lVl~a&dP2 zlP`a`cP!vI$M^@j7xkz@g_5nLEyazEikxF5Li!+peHe1uQ<7G;|ey9*>liwJbwS*erRa6;wZ4d_5;PKo01*c_$N4S$6irNz_A=Y z@8*$Emc?Z8lQNc)h1O`Men336zkL-_eg^li+G0wOar~_6o>MHsWA*_a(JZ3McdpT+ zgk**YH6q0v=_O*-iW{?lX#PY$wZaZ?C0yLJ64CPL8}lh|=iMe)N}0`A7W8r{exMDD z`;W#S0o7z}emp)SL-%YrnIk3YmvHKuF>5p}+f?CJ*-m6j8Q<5Pj|P{`2$nKR+#_9$ z__xYh0QYt^mh!_i%A*zLB@-aLP@4gJ1z{I0*v&`Wn}ktZZk8;`gB~cJyWx$g2W9x* zbI4Hn^G;B3oxb9auR)E`@wotqi%8$>HyXgZjgsZ)$Iu7U*fC=P8X@^G<(~{@I#Ufbz8M3~bpEusz*i=KlJ9<2 zVzXC6f~^u{7N6A#C(#M#1n?*~Ns(VJFpcd9?l+65Vh4qiBb67K1BUe)ILUHU3dzph z_CDY1%r8}E12z9##3hUdga>saZCut-VUma095>%ImEB!pu2Ll_n~bNWZY@%vfdGY1 zKm@EmnO$pV??o`!c(2VH!xSt;h_Qf!u=Oq?5=A8 zg`lrV7X@r8noMJg1t}q*hFYWK6zEadsJDI?>DBj{e)+BApJ@6BbLF9x%!N{>h8rg>a4aP6VE85( z5k9G(S|Y@M2(AZs4nFNe_?job1iqBI`n09K3Yf}rl_V-!EqUI<0Xuez3rz_Mc&_%` zwFx=js<=@r>bA2`14bnE3o=dvqlQ?K@Cl<84li{r3rgWmywvTKII zZ{!iEjRxSseila&&NlQwYZ|+Tw-wy-1$x;@`cVkZjjK+!PM=Dqgfxg^*tXeRbSWHW zy+6pIiSnN{)O>_nmR-EW|G=)%T@Z(dX=#Ey-DLKUB#kNWmwIp-~m#`X6cX9gjiZdNo zV;--vEmrbf>@3N}w`@i}C647~QoYlqLJ*>o({Yo7xw_1 zJbXSp3W=hqU=|c0?Ujs!k7%m~Lix2uwVZpU`UQi5z8WlIfd51FfvU{ws1AM?jdlVF z9P^~VyE@lKBIt6xKAqF=0{Mm=^eV{$hyXoeXI-DWW-+dgkL=?E8J0!NWQPJ8(h!BB zl1v|#dqE%g7@@o0<1$VNnozF(Kz(<&KeYsTH2zM&k3`2!*rg*-%LwtfmOh5}CYbRi z=o%;Sm7p%3V!2L1w4o!%#?Qxtj<@YZUzP>eGftGvhjg;zx9tK6Im)RP z)*v6q@)wR$+Hz01#F2Y=*c~RnlGvL`C8o2(C4kT*cpm;gs*p>{U#A64dBreCB_5njV1=S$5%bFtg_$4d;jOetX&m4KtaaL{MgB2E<LfL;Io@|Tq*=qI@VChiESnPh3SwB=z{7VnlaluWTwZmByOeBh)> zl0PeSe$AQF^+)a3zI{d>Tsd4dO zH+ESJZsmo@y$3md_G3l)DbgdtR6;l4HRKxe44g<7el7KTRuWUll6`@}n zCKanIF!Sv`-JEdK6`|)4-(jCI&Oimc?~ewhHJ3v6ykGLX`mg)(qB+ws4x%iIO*4$_ z5!Q=m=qEVN4O&y9n45^2z4(%W-kYNx|J5jYAK4g|s|Z-a;6WqN?E75NJ;KV44|-_A5P zLU(^81fTBDf2U9IZBU)hSqLKp=IQZ%_q_3*%hQS@z?B0yO{l5`N7f^JIT;_s3tJ60 znNUmnw;8bNmOuUa<$i)*KG8f6@>GL?oP-f}ae>7k;g9)8_H3S(om`v{#979)!TBvh zd^r%bD-KLqmnZHW9w5jv6RWRpiYY3>J>C0;psbo(8+>W|QYq!}GnzOkm~;4v&ockk zGB(p7vHVs1=%`lNgA4s94;cae;;2XYdB(<1HWgA@u|U?^_JG9P(5+O?`iozG>i<+d zgSI)*Ld>eugvgFVVb{P?9i(l@39e4I1f%&kQM!KLQN!}l;OXa0Py4Ahx3+j|pn-s+ z>hC>h$*|W~7VfIX?KO_nKq(?;*`2Ag^>%l^636yWce`oJ@qbE#b=drhECb?yAv@gv z{~iC_{iFx>5Fzg#@$XF82V}{E%kCq{doRdDJte5=zD2vp=BciC0Ins(c{0n{+`#?E zA9JDfOtJA&=xnc#nvg!&xsu*`TUBfHS39DKnR+}DJI~L~QNuU_{XG0`QfaG*OY~|F zkyXRwW_J*A>O0}Kxbv1Ocn??Yyn%+oqJpKrf+ntk(A$~~j|HkxrzzL;2mIa9cv01w zuB^0lmRYfBMZam`zQrzEvf{U!W6ckKV(s@ZxMxA@?WJ<5$K4nAhEgk3LFc9lrWjK) zf>Ah;c`i*QcangmWZd61Mgeg_kTCx&HUnnCEt#$mxk>xexi$*JrBAyWl>AYnPjj;e z9XD-8sxVRL(m%50yQuFibGWf9 z&g)-`w><0}!x=Oy?V&HLBwGaG*Z|COP01#>tH=OPPS`LK$m&rPZ2e#{np3%_o+xi+ z1AneYZ*Qj}fW;2}r>EyV=wi*z+eHkr6nt2fMBj1-tbHS~p4qLJE7H*d0QmkWKz0Bk z>%dHyQ}b#+xO|a6L!mJRsM(EB4Kowei%CzsW|k?BxF5MaaRzh^z%~eUL+DM^wr%WV z`@q>}BM?<}jKEbo=!qB{vv+hvL}5~nj*f1%A!r_DJ(6eNHv@m6ca*XgF=&W z(_L3{c4G<*PlTQf{W?4SpbAe&Ft;jOk@(QImWnKx4uE9r#vuAjHCtDYw{2t2QKshTWebFHxa#sz{HF4YUXs`n1WPZHwN3)IO%Y$G`>kQLk5G&h zm#Yr_Wu36OUN+#O2@Syt0HUauTOE?V;(c1t3}!FIyKnZRa)CZR>q)*l%K#6y@0?VT zZ-O*k$dU5rf;BENU8OA7yC&1V-quD`X?!i8=+lV5s#jbOu(z^sza^5a4XBi1U|)=P zZs~F0{q0lMxnFHmyel*se>Y=`Ra?al(nK2UfbHRnK@@#QkB3<)7n9a`-Khp6rwu27 zSwZy?ZDl0ARz2}6i$s4wT}h0Tz6r4fR>-?ng1T|}{qYnnh$*WL!`w`YXp)R(rfI(l zXi94h*f7zhfR#S6Hozov48cs`yK($(vT5EP3S{{T%tP^Wx7f*T45w{6EtY&Ifc)9S z4)S@OoDjv4^J4Y{AcE-8(wm%P0GcGsOOb_80MsxJwCo4Ys9xAJ z8=8)Y>osbcu(LCN3M$GGC0{_J{KpLCBY&c4l9@^fHW#?E{}rEPYiKl3&t3L2BO|=O zJ*8SMQwDHe48DakRO3xGVq4?)*eV7MN11TK^==y9SVSI}v1tL%bT;ar34DG^G7<u~!|eRX!&Bu;4zE!F)L=f> zempxj$6ezX2w1Rk^A!2cr&O#@i{jLli+JB>Rk%HS_bEh@Avxr4SJ4Tk&A$^BMgGp3 z0IEIX(wAndg?4OIIUhE(c|qeZl2RI@j8)Yb^yG1I<#sx*=Y%Nia)KP9o2jddO}Oed zcqfE)^#1`aF_Q8ZFE_!uT5>t9LB)A&pen{$%k8MFnhU_3Xm(1@`<3za*JOWF{4}t8 z%5HALsB&s!jm1-ZNQ0Tarb)46mWV1?l(y26yK$Dt0&)=<1zJ=AF%n=gkcAr@ZI)%- zD`Puf1^p(*q?^W~bO$V;9*TH!N)${{@@hSlq3L}DkJ;T7v2aC1+f820TmxpL@?P=+ z_-_PQ{b{-i<9j!fOSX3P2#dal&dngKxuvUy2n_1^Z-#0DLa1%prF%lsma#lNBR8Arn?wLNZbl4X+tf2Fw+G zTAx;CpIr@T=-FD5=>JtV5o1cI+IL?)k^5i~5MgP_UVcuh^t zeSWA-De#G`#%xg91StYL2AI*TBRL-MM`rSWj2>klXYqAB;sS@{RZ&DpO9RY?U z`}u+L;YthRZ!D~^_V$by!`a!nvN>BSRs@8kjgFjMfkzK)#2pyal3&e2?Q#r2%g=AY z^GDZ+;Yk4ltKkz-bQZ3t$7QqCI02k zmo1vrz*PE1La!3DozvfvF>QJf<*{j$dBPRv${q9gCpNY|WG^!-TkD?R=3H`V1xYgK zt^6$)|9c>tt|{0Pe78Pdef)tL2;>1JeI8MV5$uZ4XuJh3K=RqZe{2VNcO2=ggEsw_ z$Np`vA?VKqU8|u;t)lPk`k363#(ZbAbz51zSM8PY$nGF9>j_ik?PpLXHrT)^D@tcl zsnX%+R*S~rG@zfgWr(q{iLtO()3xhKR?1LBXZ^}|Zy5BJwl9;dpNo5^7Nr7WJG0=+ z|8gK3rpyu+%t`{u@5mr4ETwV-R_`eQ0tj63K{5+9P|BH;#4N5x(yw`|jbMK?)<7K* zHvmXd0}my5ubz&_znG%g;X_{0y*4~iF#T`13T3rH7$_wk@BnYavp#*)7z%NUlci$5 zmuZAG^UAC#;fZLE_TF}wg&!^15v!7r>fU)l1slk$;%oJzRyB>{kR>C%XHg={DiVpQ zoGo*{cGsx@msZ+D$xJ@DZpp0(7`^(&X4YO)V!wALSv1}l(AC?k(n{k9LL>6ldiCf`sEXXqv03!u3`a^3r3PufytP@3LXllP8ioGk& zVviA_D(d$pHK%89tnDsCp0@GsX2)+KmXE!dJRjH zeMmPqnKM6xXj;f?he&`|lO!$OxZdTLnoh0^#+Mb*pNYkYSMLsn#8>#0o<7ZQ^jlF@ ziX9&2>bSVDF8=oEebadia4UAc5i@&U{&5o%zBfMpK3--*Jbn-Ccp!Imbxz$_5RmoCz|1*eSzLhKn@~st6fRhbL5WgRr%|a^sa2`ktN2R+KFPRH zYMRv;2IWLO@xBZv@VJ)f&_k~wf94@fgvu*>y;9tKBJtiO19BMwRPL|{l*6A@=~{yC z1;XOy6capdKnsP@X(|wSs`hFUP%d_t+911rh&5|#Uli?10QQT?zYP}uHP|yvp`o7l zx|#`lU}bF@qhx`r?n(@L`Y{8ds1C~Q!x#Ld7C&h)6Xty~zKHXw@-~j|I>JY#Q0s=PQG{(8PK8(~ zBDqY7qtqC%cF04Lgaxg|#;zi^NfHqx(ai?EciN4xjFP|eFM=&K?zs;vCmcx&AHJDK z{VFCj?^A3_!UR$58mAHesze}_2FT3g_&O2|fGz-(kYE@6nRXiS2bJc{l1_z_!1kRa zceHn^SOxjDB2s+hq4OUc0YNEi{#=u# z9|airj#TeQZ)M;|uva^z=d8oI82|#;w2YVUamp-8eh& z?f2a;5Qd@%IxfC09v>M6XcCYORfqt@bq6@VBd|&F2E1zX<#aKNw^Sq!p zI9*b2(~kFNybE6(;Pea~IbY1TN*Sw$ev5D|2&DzMKO;!*3B%vKtBF#SWWShF0beoy zi1FVmh{kH;9wSLNPV{u`5MoLY?M>))@n4)IC&bX{0f$;x_I8c1m@_32UDGlIH<$9%Dkt8V$^l@_Nwh{C^3;=OF|(BkD!@8ggGJ z_|Gi{(}-V*0Q+^w!|VZ`RrKdnyn%^^A=bzPCZ#(ZeHdSQen8TQe+P$BBUbLXj)#fo zs|t20GbFRBUv*n~G*^8Go9=z239yL3?0}O1mh*Ojw5Sx5P4|Y$$Erhpj0m_NL`_B~ zMc~FRQdqP^_3>*$w{)XqPm^AgaX#|J4$zH}R52CIVpPnJ3Ra0&Yuen9cR1fxwZ2iw z+6k9(-o1X^&H8ue{SxGefinKq-5`piG@&c$?XZ%D%e^ayJ`xh9#Q7+RO-gwF!FNy` zKn(rUuwH&yq@SM(`1PM0B$r{eWIx*?Ok+bkJ03-}sD$@VZ)>1ipe80;PY2i20hi(s zC5t9dbUC8y2<#o?8n9{l*P-O?5fb!Lp2HQ3Q&m;<%wzcrjWpB>8#*v7lwPK>9{Q{^ zc4#O+RdwoxQnKEJ|M9OsUcU&z6U?;++iU9i0|lW>soS1*N=mV<%hz`tIsNtoMgi!# zp589Ndj4kx0H?Km$q8|9xN`^zNt+xwmjl;nxi4q}vToiV?_(b!!lLB;Nlr|GULc zk8r}%tocXI(JLRTy?W;9)CsGh{(W@i$ZBZ7ELKbG6Z_C%EI-ycbq{;LaV#uO56|%_ zI_#wC`pH?mZVL;CcQyC3Bwugf>x*=3xW>GU&^=O#!rf008roBF)S>)Uc)FD946iyS zI7F~c+e#6+w-VjO(N>Vi%}2Z6WB#uYR$D2m!nN^RaITop&RGGb?4y9yFBdvSn)h$u z8ky#mR;0NTgO77V3I>;PElAVC%b0`&b%&JJf(FcB#pKNV!#MH&*$h=>dZe+vyH4^(@vO zhH2vkx;i9cttZknYD*DGZ>3LJiOQc zSJI338gem73<&A{kUNXrw~CgHu7#7DLJeLPEe;RVlJntfB^*9($R9d`)rTAqi&JiMHjRtR2VlMZ8#Kad^pC9QsauN#IoDYJq7)egXVjJ*f27 z9x)DLNNN6bcVQ&~{-|8zeH((QV#~zg9J9f8ug(unv4~5#c)ao$zZIjUUd|(uoU;aK zsMEqz=z1=Kd|fPyP^EJWOe3xRD3lV+v-q&)QMb2E{9eiN5s;Yo0i)u7Ms)!}mME#3&nrfLoyOGwIK6|P4!+o#@;?>QmwdDs=FJwgzm_OH$gB%K| zqP!G5xF4PjDXiwEA%ys8E%q$N2XhPAD=kTOqiG1& zNLKd_d`oe^ekl@qk}h(+b1+2z%;X;@It4(E`3Dk(_?-;F!0NEad~)LL>e?gNn&eIF zcnryMz~UnfJ@EJL=HJK{>#*fV+i^Xc1Whf!Lq}Np39z1aU;E`1{NdEkuLedPi|sMy z3jK*T7jl8Ak06tPf_@_XIn>Rm7_#sVF!|U6a<$;@Y0y@eI#6E~$^O(CEPW$#H1zs_ zMNCZ3^4*`pNuPj#^S139_4g-Vh8xm_oKXaOx8J3E=E|!IOFk$S6N`vsFi9n*C%kl+ z<7*uWHf~x}W+5GEi~CeIFt~^`$79Xj2bxh_E95ohe70uN(%Y)f*!Tsc;(&xGDD;^` zKj!tSHu3YlrpBl>+{ga6P~K<;)kQ|b))CU0-Au2B&suJV*e_P zw9uy5TPEvlrgua7Sy>jV?lI<(IzUsL(9==j0r_}}g;=Dz)p`32 z;sDPn(2wMZGeF_L-o4FzPJ?R>sBIkx4G$$U$loX5g>mqyVI`nA3^Ftz=vNc9^>M|y z*tP`8g;I^ve8*JWIP7ojL8{i~1%q%l_0C-kKnVvR;)E{|8TNe@+lWiCnm~i2L1w8Ni zK+lLE?Cg+#rJX@O#K!XP))0f8*ia~K``PpY@k&nHDm{HDce35)M?hS=#mlQp=-Al0 z5^uSCrj|Ro$Ot1zNsFesSrhC(!B;~tecO5`7rhTafjKchf0uo2DK?Pf;jD;2-%_8I zW#jgnnwrS6Ouqb}HB;aX7YcNU6?>$F0z7EJbY>0<%U8*9nE06wTTt8(_hRFp5MM*=C&3V-OZ21s+d4~|XK9asEx7c}`6_hLUh!Dtc@QaU3k}J}MF6kwK z5RXiedL^g!VPR*jqDwAb0p=Xvrq))IR~5)F5=DL`U{tF#^FFn-{|yvBePeFk`DvVK zGS%7qBEe*I&U(HDxef)=OF5aPmP<5coh)E{Yt-wL$;@ZZz$_=D=FhVU_H!EPIa8|S z$z0tuVmrtZ2_XhT2b20cYpoc@+PRP?@t^R>3f_);SA|-dYNo!;jR0kPl9`r9HvU?i z_)~>G5@=K4-?{{N@bN*?oL7jvTE(-kQ(~Q&Phn#HV2b* z3IFLa+rD#Fv4tk%FK~h6BDJypGnv{pkkOIDC&O$>6b4}mJkbOMHWkap7lmJ66|R!N zL_$f`lJlYfZ-gU2rZRplpD-Eky0-OLIV!oLZ)xS?7ECRcLkk?W=kAVEs46bsy%AfCMPRdlDg#gSZE>Ve)DE@T96vh$S3r= zQ(!5Z#ac~eYNaU58$%zm5@7-_yK12uYWsLfJ*u-$^LP`XUzx97NV8o#A@=f!xW0Z5 zd;2ljZGH!y_1nr3S~W=)cm*qY9IU(J)zCfXtLHYq%Eb;Yvt~@W?2PoVJL8vbJ7|sW z#eMA2(mb$ud(8?w;;!1|ib&Hwn z0shms1Z@>g{j%KTOaM)s^g#lVw{8rju8A;p6P00gAfcp>b;`thwBD>x@Vc?F(FvG* zl#-nd&(5Y%QBh%rKy!#;fz1yi>%z&0`WcCP?6f3LS;(g=l|BR>GY*pn9jkDk z#ye-R+}JY^qExfre={sewB{9kX9-5PM?4Q3MV2g;5B@P$Lq8(F>BA-HV`f_1V|gjx*s zNwN?@qmSSd2xTWN(c*Q7O=6t*_;@EnfYd?X6#IyfGwL+cFvk6&vzZzC6{%=V%|4|` z32xmTX2Vs_6UlX0=5`G*AW)LP&f>!U-DAP4nd7OM@?8OO;P#>W9`iJHboxFVghn*v zl~RHM5_$GVE3~)Ic{Ht4+saBR5|b7gTfd#~%=5CQb%SHt9E|j( zEHMbx&GqJ$qaF*mJmXd$xH1I>g!rA9q7*N8NmRX$>h57A>WlPkq;i}sjWI0N@Ik$1 zvAnwHivr(aY)Y)~uuGNFcQSpP2RB1A-$^-iJ(MwPohE%H{cFvyhf3bkYTXee5@7Qw zJ;~F!1)cqSrpOqBS!UY1fqACU|4j@jnf#kWnCPNdy|8g*BO)SJ_x2zgTU*g7DJ0y& z!yi9pMqdsN4x--Tik4A4(v{4;$yf49-rn3~m1Mu~<>dvBOUfieOt9eU0fR_@9e$gS z2j}Lf%*@O@eS9+NXvu<8NGi&rL+6JCw<7@iyFzhu4dI~bAh7XC*gj&|dIQeUGhH4$JUr~{ZpxE(;Rg>Gr>7eZPfnwgYGlX9Ay6j|JZ)|I zw)OzvRxxO5jtozZy&Nfh}hqXDAKQ%sI}rOW%y18 z%>QTXCRnVD@F?!12FFOOF%i!P4Y|F{jVYcM`b5ibmME5s9eY80fCY4oBd<~EXn(iq zSg3IO^X=3fdkSy(67dZFB^3XQuD5Qh`itK^1*E$h zq@+tgx@(hC5(3g4Qqn2ijVRrn(%oB>6c7ZYySu?z`};d*&Ro~bJOKXLeAZg;xbN4k zS4!+~perD+&w+OxmJ2Uu8m&Jdwk-ABvIku!Gs#!2t?9PmqFa91dV31=LxT_$Sj&DM1L6YIX?tE6r*YU4b_Uz47>0)Kfc~!0e0xMx&810Mz zAJK2UzR6@kK48%~%mvzB5$*0tTs>h*oZ4BeAx8U?f>gq;kNi;dyy6zoUJ~$ho#yx= z7%0|btK_6q+(UGh0po?tdFkUwWH*W7!mp@mziTI$P)7Mp&)ffntqmpszuet_2!rF? zUfLv|jqPnZR#tQc1%-%+2nh*^XAh5$MU^jvgvdZQs-Y_pti{{n=KZ3AP$d?#w4z)} zMUUC`2RLcz^_o+*&Qza?33IuG(e=uhzbh+AYg-ok`k7l<{bUZMr=o{Dy}S%KuRbA10kn z_f)-E*CHVcM;+A7f1PuLOrPS~se44RMLv~edr{?#-lKIt+zDqIEGA?pmf1V6Bxii) ztYK>WH{O5a_+%<_y;jk3+zWMv8e;G4)F3<0c4EU+3Vrf9WBqYi;{8j#3hxEGBz>_g z(tBkT6gqE4zC;qT2A>RQUZp!%Fbu^u56#tKfl*KVRo+H$lS)#2EelLsxF;d-)&E3t zK~4uEIAn`#ob~QZy_pq)ufWyHEaYlOz*z-$UQS-^v%_Z?wS>!m-*?3%agFto@tTk5AF0^>*+c9$I6NCIGDjS6j0jIRBgv6kc@D=h4n zVY>&w9{jQ!N>VPI_?BFfytO*zI!wG^w_-_q9R{j88Mvkwh}1M_*mTbdR>OXp1pIzI zbr{g_XVr+^on&$&s{8J(VH$JfzKOe56`icGme6VkFWaI-}tOg9sAb0cJo&bST#>fqnM`^=hb&f`Io?S zqC3RA#dmuZHEUTOOF;~e&p><}Rj?R3;%16*yOBuR4ZU$>4I28Q+4Lt+l!K;JpmFJw#msXg1|4j9Fa-Ri84{TGGyITE;}^-;L(H$0iY>2|rWv#?gA6#0A( z3zNIKxmz!Iv!#GLjL9GWo90e!J5Kl*y5xtfrlnO``S($c9ox{&cr1BbK`-p;Nj@$s z#(Ayl%~n@Pc>(kp&$lH)zlg_15>mRS&qk-auAF9Th5Akfo>+|wrC5<-#XstHj{|N{ z_5S?%G09B~I)$;g_ex^rG6NTTA_$A5A7ZfmMrvn<@Z=cnaay3NKe%mQ3+7vN;?MJ$ z`I6Ozx%0+fT8vFp!|G0=!w+*iA@x;pkcUC4t8jY&Lv!VH6(KeGq);Z;Qa_O^odcfF zsr5;Q^$F$^f#sd~Y&^iWS%tl+>Dhr5{|mE@#0-9xi~nImNUp`r&FKyd47?B&)Kf%- zyqEa*+T7Aou}o4`HI9G~80W8mw=*6bW*0Ofd{qDmAG;VqNZr4D*-=sGF=Q)pP_=2Rva0 z_0rV$M42EV2nuf2HmUahvVikkV@6(dsURGBQ`stB{g2ZC4x*Ehz`4Nj>ASWNL$G8!4E_a?X>+Z7rb=dnBp1Xmg{hykrI zDEq24heDt{+6v>6THkJLvo3EbQYrr9GO~{R%wQ`$ zH9n(PuPQfDT%aXCY?#(F-`Fv%IE^M82%`FKXV z=6#h209JTRP0XQmS4!DmzUevZ;RV!>UchO=DlxJu3wWjdyvVG;NJL}`T}^-dlSSAr zHmuu{)zaeay7TTzv35(5RPF`47%s1Qwg<112m;ItM0$0I7K6$8Z_0G;eN_XGbw~`E z@a?o`?n^hH9}RzW8$1!$OxIHz+jGkIY<-1}?drO#A3vV&M7Dgqv#$)eMgY<`c-{00 z3+lE)3Q^pos0f0GTSj-^3(})Z<~zF^fj>rB3yP0?4nveT?oX!Akq}wsp_!bp3C$ht zZGtH_gWEl97}&8xUp@Z1hcaqqT?d_2fT}_Ef%8fuf@YJHHFHLfAwPoWPKCD~+xFh& z^I|dtD4WN+ z(8nVko|^2MZ<^^0|LFfKQG00jeh8si^1r4VX*;BfA$}|pbTssHX)2w~`&go|3hj>< z56u#P2-(;mu=oHlKY6shDJdf9=|g6drs5-Bzuw~pNfWP73T6}+tmiq@$&%6|)&w9_EPb8$_+ z1^l#EC4W2&T*x*0$`kiff;ECYfo$ca1p`df?G;W8vU@TW&)vs4Y$g@=vEDR9HUu1_ z9vndPt^$tpu>L+tZZL8h$5R`VzBaBMA7EtwF7Hsm zz7HRopVcTA&~S;bxT=oyc<1P{ohbErETP`~VEEL(J9|6EN`?NYSvw?5bcITKW=aG8 z5{60~3#p3~e5v}DLphf)NjhO?{r4Xavu$i~I)45)dIi^cr@xaKV^4S1->eUrn1R~h zhQln}Y^V&XW&|{a0)njLDa>eQA8?J@}Oa(G>FQ7<$Q+uTqnR@V&ZfMxura3jA%C!rzrt=glMtNjnZsM|CM~>gk(WVb18(lPR zn3cZjEHo%oJa`l0xSZe+v49tI>XN`r)ULY{SjXpk^@rvW8ClE0J>?Y!7@O=?VvSx~ z4TsBV)5aAz2jio;3%qdoOgR$&$2hB#;XT&t!73KBMf$tVoKRcbJ_bU9Nvr&0-pAq9 zOhr`Lj_fg#(R$m~p$Ql1k1W%q8VcNf2`o|EVOn;kE<$|U-^(lpy&Et|M_&;BUpvrQb5bh1pi}b{eM>w$5IH&t-$7Nkei5KSX@jC8VkT4EkQ~HVHqnJ zTLeTzw2X}MXhK>ngllUc0ECi#N)L=J85tRK&_w0(<8yOgJV!>RqotMNP+BOIGzv3; zvHy#^aY-mXadv0Nmo+cGMDKKqWZ4nBd`#x{oqn#D;{FX~)UI0QWAUYRhGy}2A1EZ? zt%&(8Y92pNOgI5w6~?#Y7UFeARbpt_dP}O==TH~3mnL&Nkt8rHRrGGz)30|=Zqp0- zPu};P@x~5z@kkunW=J?%5Xhh(X6)tKaUHyjY{|-8B#Liy4|=?~NezEeyyhp2#B|=e zc#!vtltu?-zz$8bVG^cdlqLPx{t5Uwp2KV%#;I{^@lu6IZzX{5w55=!l|9KGGAzIC zcj2}}V!gaZVmdXSNU{*<_U{$*9aDp{Y-Amp1>?G!KN}LPop9FOfbg=!m1}ZrG4mQR zYkXuQ<73QM_jpAX8#Zap7b(}S$7@_o*!DNav|QQZ-t5^=-5xQxlOo1W9HweGGJV~n zJkEv&xJDHT1@;7WB$*9($KgN$;-bJcek0>{;o2oV_7y!xFqA_iie{^aBZ^|Hm%Yc+ zZ{YYQ-ES*QU|$!0Ono)CWgjkB=6>_RPhK)it}qYRx732{H*FfN_KotY$r=VRWX9C0I#RWr2{Erk<=fcnK? z2D*Z_OGRKgQf}*88|PzJj$!D4LUy{~0=38Tb~t0sXV6%<6^>$~O^euJ-urD{S#3I26RuHZi_x&}QYMoiPn)_@`)wfqN*}d?39q z@FeyBKXb)ic}THEujsFigeN#_>Sc0-voZ}&f7pF6 zdDtMeVxujr2sIS;Wvj;VbDtS4;C4AMSI%%@Eq;>~d5T}M+T9ObQ9PZS;g3&T!+t0K z`NV7lOqDiHOX|)`jMU!!`1ku20s;$FWkrpojThW6p5&Ev;vjLXoAsYHhD96ezxARv z%(o<8@%F zV#0-y+e`xJP8x78)q8S!duqCRu&|B4RlGZ)L6@WqO2x8OK(uJp-f%dbdxhLk=`3+J zjwN7j5)XpdxynYc{@FGSTGS2}MZJ)w`?14xTZ>bdk`({vWC$A3R|6rAC!$4q%Orap zMF$}>4X5=D7Z@S9Z^y$j{rCFSHkc^BOq*W~hWH$Oa}L~=bRH2G%(ef9@KqIm}xvTB+Zxx_xa+KxJi-ejeXc^u;V+E`OWk$I{k?RC!Bil!lRo>AOuP)nHsV<0)R7wKV}hU@YQxMC7YRxii%v6 zQ@3{cq?S>^vb-I1B7)?kU-WL=fGSMfCX7OUU!+NHJ;m)b2(~vPN_+j|T_?5z79Rdv z-9}4M$1h&U)vcoBszanh@gyw`^BT=4#l@%I2xZO871upIWvm8NA?|IbEsgSZYCl#eV{ z#taH$gB`SY*0V(BYQF`_yQfMj_XtKG8)C$MNR^7Z`TmsA7APCXLa+{_aZm?&FSc!WmX$k94sVYpUFy z7O7bTfp@})bfUxb7ZdAFNHAWK2d`d)t|{c(OYOaeOy=K;DGM%MbyN=0j!Nv$NXr!v z1`Q5$LavNhHOyG%E%UJ&HK#0-0<7btUG3d6-8x=n-L0|F;#_(S!KBV@#Qz^FxlUwE zlElgv^z_dGa}T1Tl8T`EJX%a3b851K2<(1f)I?e8;o)J8MHpsWb1yHerA6TOjGyathwp0PoV$gl54-^CxD>;pVX@f}#MIst70dqE_uXHxzge)FG<&lj%vOeO zM$HH`8FM!UTre*M+zB#2wQOy1pOtG_c~e>b_2=xmv!u}~r{`d?y5rNDlSd5NBxLvw z?8gRD^qGGjP8S@peXm0CsWQyMzkEC7a!wK*ign#{9fp!7|Bjp6&>moXO-IwE;G69z zm06Bh$Lz2NRVdGk;JXm|>b?hQ@HD`0qvTwwPId{3k$O=>z*K>>mvMJ+{V-x&D4S{T z^;RN5fK-9)RQ|7u8rtDTi!f^vFAc44NI3X^eFqzqT7op5atWwIRihp=NE>kp@ zO{`c)rQk^sM1si=W62;NIFla8=uh`y+ge!-LpRq1j>hWx6+ie0P=A!zijOP(a}ct1 zsk+x^tipZVissE1uPL7VJml_c2=$P<1f=Qiwv6xt2K!p6_wA@;^9CKtH>>;apHAz{ z2D_P)DV%;{*oi#G@Mzbd23Ocs8^nX<@8lcUgGr41=oCK`2su$T6X5k%Jm-BWV~CT<>w{ztCmd2z=6%ead|HCG?~>l$cV%q|z@iL`r?3hhA_da@)0tUxu8(&P zKhh1Mb$o4}y`^=@&f|~qE1#F$uXknb&d||Lw|nV4FX~D*LkUU^4WVyJOdkezJ-0jK zHwTg0$jRajJ1r50l-1&e-IxA>UCGAWmLbpaz|gh0RBsM4oU7|cA#_1+7J5Q%9@&}6 z0)aYD=IoYZng@?L5-%FW!=`c`!sOzy0lR-b$lAY~ToxlI|ATnsD1hWFbxA>*56O#W zZf!J2k$gk?PsMYN4yZuFm)JT5cS+vZm19)3p}f2~<#9!SRD68=`45~@qf|2=o*SNT z4be}HF+Proj7f?Df-eyf_qP0kwDK3y6I8+!yiI*pOO`Eky(F{SB(QRbS)R0fS2Idm z{90S+hv>kq)V9j-WH-*}ZSkM9qeslWgqD1n4o9JID!O4r1x`p94FlCn5~;ozEO>0! zMuUP#)5yHhuev7I(c16$>V_s>AI?35GVT9raw`hWKlnT^d6?Iv-eB?Ka*IR?7b*oU zObo=R;_aJ2lg21A6Q7Z9yHi*!xmYiA1u!n4jHmlQ*03-9AF{{bDA5e_z#tnB{NI$1 zC4!~s-ShJs3JdA=LXtBwqCxbGV4w^_BWSgp+T`f&COZ7_@bC(Ef}=#3+vuq;1lZ+k z_`a6pPxSOi2r{UHu}dBW29O>wP{%w;%L>84NqXMYmADbem7#Z3cbYtZsoaHVVJ9aS*#3>n?6+ad-F(JJg7PvR|6lC&x}#H5 z`ZlTl_*A%&U{#}TRrg}EZFQaNy~x#)=D0$c{KdF7ofDL{^fo_o50`agQ=N&2qu&-3eL>Sr{)j7p#d zyZ%w>pZhSX94X=}w%=8l}-9Z4dVeeKhV-B~vXEd%@9HWk%~x&4R&fY;iyivNs% z;AEFaS?xHHW|2u`op2C*_GZou7}$vVfU5#0(8ZkfQ@ka+h5R?qBCW`Kw8;qbY1-$6 zrd4HdKBle6NP z;e$^`l}H#fgS#is5Y@ds1x}|v`%S`Q!7kmQmtkT&D`L0S3+2I{XonyMT5^NwKEn3r zrzQ#=dWD}O`B6@fCMJAB=LWvegGF0$8mJ7`UpyJs^~I2;dESvCR~nL|d0dNV>709z zfR*hXOdq&aBe`CDK}i`YV!b#7g(9n}sycoAn7ZbkL^PqxGBY)yYinUqWRNX&PDr@P z#K|tJr+^whb*%BeJkGMK0XSLz{DG*bN|{P^K;X4lQZZsb{z}=P;^k0W&!VED0_*vZ z#zsC61F*Wb_9-F)#VZfNyYplai=_A(!1Y`?Ai4?J*+H=x&8uk{4OK(%=hW; z`wlLPuU@`X)oZ`byW`X0$L_ejLT*{z;%@O8_`;cTa)a+$cO8%L_vsjG2IcW#pJSx$ zkqS&fcO8FTr*F#_skSrpLvM6V6}rrzz-?Q=>ehX?Ix4}lm}VWbsuy;n z6BKmNuk<4|VMkIv=UN*)NKtar&NS*Z6?W~J-!@Vf`*EaMVyDld-|;l!NTZ21fVJy_ zb#tPb^&{;efh^H4mS3i^G;6wHyzfjQ!J!2H7**W86Sj>9W{}pM;8#h05!MQ#Lh^oH zu;lafqtO4e6+*_Mm=Mh6@x5`fKn>d!hP_Ur*q9iJxi2_4REbt62+OQbB9LOOPvSPI zDB_ML?1H6&Z|Dc}W^oC>P1-4ZUX<1W00Ny>+FfMAP}^#F`GtZYqcG9~*wo$Q*A&m` zFV+vHivznt==s%c?j+gXSF)J`HW7;*BBx7BY|#N@i0sm#lA)oppv&vC`_K^#Xd@ia zHDg+pueXO==eqwT)FVEIY%s9u)DRyYdSkc^R*{2cKZ3_%w5XAPaHU^B?%>>W2f&cF z+?#kH{bg$UN#m5Cc35o5&z7T_QtS#tr|2tf^bw4qcJSBZS&^UT40l+o+RizRA*BE# zKk{%HGekK``V$L0?qsi%%VmG{U#go2bjHp!-|q?Z(yVP%#|dNc`_eM)s;CNMiA;4A zp^kFw5d=s6|Vp^pkkau{ipL>iR}70oXj7G`u@4A!7oa zERC#b)mQ>AJ^rNzT0J?bZiE03&A#lF{vijprmRI-`LR_^B<~%fgC-_7~LT4eg$Wer1Kz_?Ns9oE_g!6ZkgMGj4!f#RXOEPi{kp2k=Bh zq#&+oF{vW17sxM|9q6J1*{@)>*ASN7EK>hpQTa;fvJq^O%L-dApojZM$h%;JN2;Vm z$qNn@O-f1%hlnT)Xx;>irPl>63PeV+Z+GPV&XE00yYi}u_y{*kIaqO-H=XWuexyd+ zl5tnjPRdJ)oqcBrKJxmDK(7XW#H+Ps^GGuhQT3UIwx!`Pa)|T9REm!D|D_$T;n7?(u;Rs~H`+Vc@Z7 zkYSgt;B~L@N&<=s_H#I&hae;0KuW3}B7S282c6q7BcF~(%Z2R6O-n|MBtK>&^Br4FrIsjHvjj%-ykwhtFcq z)!2tMm0~^a(WP?U@NnXS-ukp@v6en?6}C4wo{NggqNwUd@HU}Citc;@MYKGI8~8HA z2B?ZPytxa5HmK4x!e|Dms(uS?P`MN1j0*k5HCzzSVcKtAFojfLhB4J+GjrMSLMOa= zFsgV4C&(s|=>_xr%L*gJeq9h>W)TE3CB@^NF1=h@FWe}IffY#xBLAmI%HxC={^xmA z|C1wGM;kDpL1hE}!xQlXrMY1P@bpZ%eSBo*`9XAsrU+Q!1#xm`lINkJq4l|%nkNcp zScV$$V|kmUJF)MBwJ6ANZ~|9WjJ>Ekkw`6T!3)P!0jPEQe;_mwsLO7T6k1E4? zl~-6oFY$Z@s`TUAk{RJ#&!>PyP1dF@pKZa>G^TLbA6k4ZK2$r2KO^gwbtRwoINEVY z^{0lJxl9qAR4yRTRE*{7C+GKY7C}^XZuN*5RB1N@l)eI>joXSh^bz4cRAc$;<;mIn93Hg54!qn-w9*fS+d5wPq{WQZI62aa`+*IwUKnHsVnxEHJ=*+@ z=B8h=+D^18Zq7TT5zDn+uoPGAXHL{kqFO9u=HAWVrXgYJ9(;)RaXD~$YX(*jluwBA zF@da(;n+(O0{)UhK+B)T5rv&gF$(C=x@{!LiJ_a2o@kU_HcvBn5x`q%p?>mIu{U8} zbH;0h$xkFI>Jj-GHec}$Ln+khWvO#$$(kcy8^9q?zQ*%at8}($XLl^G8}$3*e)HlN zRmR^#6Z^Hm9nrYbCEB!cgCSllBnC*l#PAorYBQcbGp-4R4vgGjE^3;&CbaQKd5B8ZHtJH|7?~? ze>4%|sM!e@>9oUF7`a7@On--hhL)7)taew&`agW~bfDg9B3csb^4xxm-z53^a^B32 z{w|lh8L0d5V1lNvoTd-wrY|Pp{iqf$@81I!ZNbfWz=xw>+A7utXMeH9f^q@^!DLy2 zZ??CW<_1K~kqAp(ciB9+-lQwEY&W&nJ+6>m1<^KUS)#a`v}i@)aVrCBMJ+y8 zhAsXB0)lCOTRW%2VcQbcnodN1k2lO^#?$}#sEUEq35;F^-z3GmT>8ygk+1D?X#(Sk zRL^^10tb&2Qy1p8i5N2`Gg6`Mnv&x^o6L}|=H;VmBJa5&gf1Ic?|Xm8mDr=)!>7`=OPxcKYff{im(75p}efx%EHZI7!@dz6^@Q(_n-L8F5PPhThpD zq88C5k^s(EJq&NxZp)7-hr@k2QoZn;t)ElRrhZYdf#SbC@@#(j?A%uR&lq6PTEhJ~j=Mj3H~TqbHR=`JgNpsBhRE+F}NFk zph(*(PfJC6yJ9#r^h~@=v{aJa$z!;*{-z!+%DekwVFzkc60x4QUa(%cUbJ4kUZQ5i zt5SiyA2oxlwmyy3_14!U0WnGM8k!xauIYGsDHp%5+afEg z?v`4COr4GJfm+;RH@YA;YG$AtU5m?Of%1B_dlp;VtZsgz?AyuJ0yPZ_%R4=NaR@|t zVB5$ymRqR$nfrNZWIEsaYfs1dPe=#|JqCUjW!(g_SL(hyII0|aQTpJE8P#$tEzpg9 zWwWQ;@vxV1a*i#dqy(jg=ZO)MKn&Jmf*=MKSrkFWMK-%H^_- zI=FOt4kODltIZe?#+g$S>Sy7!LUHBUC{7#_M6)4;#|jKhH#(vUVwJK7Cjm}Fo*;Pj z`KsN(8drUhZ$ZTx!gndr1N9IGNYG76Fcc?Z*!1uI!0RVOAlXdB>R8`-l5&G2O%($CzP+Rc*Z|<3g!x=biz72i+*wn%^j+GO#VAh<4U=Sxn zYx0>+u}L`3t5ZOmCBl$dDzx`&S4)Cgca?UOuWXLOB$Vhh^Wgw969xHUFvC>x_=os7 z7)oizf$pC%&aPh&Ew$!WTW$YiWpZM&P&g|0pANZE5DL<6#br zwPaFs5dFzcH3T(+FDycg?3Z<3n%{J~DI^uF$n2p|O z4agxnxXqN0$vV#Ged0$W?4O*ef`^AMJPH2IXoG^e^lHS|;_2a5NE{jP6kvY0ySRS& zxLqdSub+TNN69%PFA=r8yzM&t%g4)00KpqN=j;jt9a^#LKLQrojPn6kF77&DMDW3) z6pNCl@+nseTBx10?S;;JEXmWMij~%?=)lc~$}nr&33%a&={K1k1;?)ytK)AFervd{ zLM3Eg`UlEqu7juT7!wX8mX!ii36`^h@r;Wvs4Gis^i87UM&Mi(8$1 z1I&0CYFXh-oVIb?p_f>5YnEV_b-=~Gj1=%eLrJVU1l_WS_@A_ZwlpIC1`RHs^<>^{ zge;#s4MGjAa+FAQC{J}D0!O$gM`+bt_B*OG?7F{^Cp`Qq#*+Le{ z3c=xqkuy$zBcEKHssBFkgH+<+l7@yxr0|<8Gq_aZ^x8fw##qwPftky-fYqDOp*MrPr_F{g2JUk^3M4f1 zugf)kX1+whVCb8yvrz%pQz>+m9sgA4$d@{#G6{mHkT?0gHU1zCsKwi8lXtttY04|1+XrEl38sW zIfdM+lLM1^(87AGvtJXi%-3hdp(!?Dw?LUi`}^B}QIqY>zC%@f|8`@qXVX0X)S$b~y-Utt zrp(EV6gAb-61Vmd2{h5L6mnBYQQ|v@xOj z5^}T7ngeEJlkydWVZ8b*_1LZ$Wqkb%d~2fBKX5*4k*#P<&hl%$GuBR}dtZLln*`X` zINPQaurI4s0yg>i&#A!`vjj6n?g~QWaBy*HYUE_4;8pU-BGGtv4O#$V)lL4~JFh}_ z(oTtPVv?ZQMoCmCJZ+MoQ@xiQ6-3EBu5NBJ7!|;{@|a{iBgQmzbO<_zAK!i+4}!*f z9KUrZ*^*3Il+Tk4~x{;42(L|QQ zh2)pl>+bf89hhL>s#rk^V!PHvSxySZztZ18R23wZ4cMgm`f+e5LRM-eWQLxDo5c}s zu5*^$$anKc5;iPhC|xW(N=AXE zEOodFE#zG{j1+|v(v*#h(mw=^IZFP8;%7@G7%U+nMo1DyP0Zy*RKFkD&V>_W>c=Wv zE4z|doLh@vwX5W+|Bi=U{AZ;AMfkv}F8rrDvNOexI(9-mnqP*4&GQR+eebZQKI=6sj z*B^XB1{jx@m`+Ykefu9eqPeq%r1|ok)qj||W)D)|V>8=biD^j#|3)~Nr(!mbwV}`c z70|HqVb=WcCH7kUh5$7(^2hvN1XQYr2ZWQS@SLcpU+kobE(D1_GUWemyv11JsrJby z!y%Ks!2(TA+{G$ck*j7ev&hzu(#z5XHnks)tFCcyNO()_Qh7gNg8_EiFFU|YR7qGV zP-MS_d7rUm$=89!{=w7)HC*~Nz3|1~2U|Rch=fJ6VD#D< z%$q@E0bHz`;)?E^54*g9@_q4J+Na@#J4R$a%vG8{+iWmi3Q?cn?&}T0g-cB@%=LrpBsbmMoG)2e+==*h&0wFR zEhnvva4H{oog1`!3tDmH$)@VcInc(nd`x9pi|WSFP@2s2|TvtU1o(YnzPyajo23#55FehoTRjwp0O9v_nN&=#tn=H#+9SbIr zb1zxA>uDZ5Kg;tX*0+g0(mFKy+iElvgh{_TKOV`*7T@c_&@Xu}`2#2Wh zYKo2bF8o1UpmxEt0xIIuC;q*K_45;}ao;dlY!b)NW z1YjESQl%aYMW_HDNjXQ8K`gm23V)0fp*9X7E~GqKsU3s^=dGzR9Im;qBQd6YaFyEQ zj5`t72^39h(%mqNzBZ#c(T)>dszL4Jj~FB>?4=ll$OU5!hQB+j!%_e+W{^WEyJx}x z?AAYQhM{~;eH714F}1j4#rg)?5UmehVCQw$o)3shmi8?*x%ujn$K0c5IT=L}E}_-+ z5n1V{lM2FWjQRjKnRPj5WqMAUUSt)Y{FAh7N~2E>u-K)4)m!<}$_eXWk70w5j4>sd;A z#uDT6G>7~ex8sZ%um#TBVfmstDh08DLuZ>XPu3oS?l1a%VDgF=&?G;sjm%r) zAtb8pTzq`SmxPU`AZFcR9*$hQVAP?SAGl(F3SINcK6Y4hwfFn>?j}(iDJ0?}B_3Qb zig5tWNkxtKLdKvNUTaW*y5M_8W+03W`$HOF>%U0AXhI7{lT3 zmckkM&%7C{zvNsWnwQ8l_b9kaexsl7Njc|o6RQ7rq~ZS;lo3`1{Lhj0$%8BG=n%OL zwoy^X9G&vJSg!-iXAbRkCl1<+yF4KC{Xxrzw*!nmdL8c7ta|Fsz!+>pMnv>7dI54J z8Cv8f?vR7z4CI;VUC>$1XUARtP={iUnW|cBZUh$nj-}_Wp*hy}wi;`wMm>#3Xb>u7*ZuNubxjj)2!7Qx3mE*k5Z!V+-`#JP5nkeJfN-?kC)*w zk{Zg6braK5XB7|>zlJ^g?#MEamdGXj?gBQu5zFu*wcM;I738M12xVOIxJhc*hB;c0 zX+U%WgvoA&VPsUXO74)Tok9=?ki64R#@|Ew<^@hg0*dqo4GQ6RSp>4is2y8bmkG9J zJKf~COTpfB;`Nx@_rK@tY=d(u?g&HVgLw^lIAUBfN$y(w5Y(IhW9@K%w?M!TJePh%Cy@wuumo4m5@^Sr?vtOeh zcibm>F2}zG-N4RrQefZJ6ub2Cgn zw^qEwd1%D*T4FM0_F_Z#xq_H>lwXZY+GA>WKO9Z_p|RT{68Qn!sYWgHP$7Bwefzr$ z{!6cT1+lo{h5n!HCy-R~u1d__am+|3YoY+Vh8Y8J!I~eFIy5@jarB5ei*b}mXG@hpS=_q<{O8{P|9<0Teh| zNt#}bGh8adPw6dcGIHUy8`AMG6Tvt@v^;nNyMb(Jg^YG-NtGR?de3jYUijmC`(qwMu1wE9J?3)#8dE18$z{cnNdCAyo8NFM8zx zENaGSs2^njukHbNqX(e~B7q519OX@xTKxR^EqPd^Gn*02BfLurh*pQ37)|H^E^zA=V`SCF^7&5Z5!(S2GR^Vcz ze_h>vLdKZ#1K-=O>fYX-iM?su_Ipo4GsYbv9iT@kc3XvWMQ3f8j9p}fU31`_R)~!oqzK$Ps6RU?tJ{;;^NRY?WUtppd%#*r3lF8!X zt4$taM6Pw>$Sfu4(@EfAz4K5Lb>;Am1LQm|jmoYWDEIL<=B4XzM(z^2yTDp=`pn&P zFvol=N1|aDMT5CT^2iAqPF>$7i&YIjnh~>*4!2RkKPb!}e z)m_K!{J*84In*iPhH$h2xd?X--^0W7Px^q#G$5SkNa{rw?$2XF zJN*KbB_?TIAH+4XpNU%9A%!varTIyDXOWT}4qT?H-ZYjuJh0vSsU9ExYRj;q0yfexzS>QK9fK8O_G+`e2RYEW&fLm#^d-UVn4N!5jEEb z0gB(%&|r_n5`QY$cA;jE1_2}?tfWp|y@mWd6DMEJ?@96BrjkMHtYrO4Yq9vDV23`; zifpY_4gY}qo77%BmTfCkgV;DUJ$wB6*5#p3ozf753ZbX?W@6&`1DL@dLJ2LZm29^6 z>ytf+IG4K5VrLHs?qBXgUpiy(%H`UulTCJEsm}-0B`&y2-3vAD0JS*&nTJ5%V<4rr z;JdYI0kelr-3wtmEFnkH7M<{BoRK9$WaSWF?bVv(!nwQiJ{eTM7mtVRq7@qIp= z^4&{?w^>@oT5!MEpmj;7k;d~~X81Rj1E6S-vR~Hy!R~W z2+hn8iH21aO)NOXrjaxbze#>c9+;FA7Nmcg@>5p=>I|)mON+y%mW~;s*=B*YY@!d9 z*0JGM`T$M+|BOED|KBq+Di&5&i$rDf|BJ1!@QUh>zNNdnhmdZhW9SYk>24&XbLa+P zXb?n7N{|Ktm5!mLOFE^cQ{Y|vuJwNJz4h)Nz+!HE&OZC>v$xGBj%vDfxH!~uxEPd} z=b0bTt{V`hha2a)yZ`q6`}f*Q(#Wp5-xcJG?Foa%J%CkO5AxK&oBMkPT3R?dIyxm4 zl~hC^+X-laQ!+9lN{02UotXy*VkZboh&BLmcxs>M4|QOn7Fde!mAIC8X6xDe-k4(c zKO<&RGYEB9nDh@l{)bb0^P%pVpDwLF^9J7^dK=1xJ&=yt;)ep*>J5&NI5KOxBYanw zF=rG$tbf+M5bwC__zH+&Vs=XHwqwak?+e4F?mp;qJZcn!1YRVJLF-OW0l*CGdeF)P zy2vy9@a!ASXF29*8W8MG@%+^Sa*OrV;Z$7H2{tMh<3Ev^*noA`PWYKAjgrunVx+Gy zq<6I^xOFdup0H`cqRAe*$8ye7-Q4P=VgLlv&1i*WB~68gEDxc%Ik z$N3sLMyKY>0Db}i5wTFaVyhY0V5TX3m0x}CNej?|35)^)*v4OvdV$HBF7&~h;%O=t zT)M(XnGd;QOx4i_4o?sPXUn(1^}K6vKhFeHn?;0=ag*nD5bnm>dhs$BQ(?mG;o?^i zu8+Vv;Tg+)d0k&gWp-%x~E)s2pL&=%sM4Z}kw;RfV7O;UpY?o?(5X;KPUqvSaBd$a}q z4S#V|^pqngOt&u-_}9TPN(7&&MRe@M>&ZzHWHdI`Cue+idaW&MVrcj7U}%)5v>W5= zYf;$w?kI&MM3*r3)td;fG6jhT-N?*9S%BnTHrtDJ-=1wL9HDw5SS&g6T`4mwlWR;V zYBjYBE!>VKGXi$e1enN--bNQDl92s!jw}44NA}Auv5*=V8j?URyu4JwhtsK0I}i}b zVD)b@2JDspvs8N)){CjBt9#=JYbSvus{sStk%a{uFg|GDWqoODd`r@VV;O-XlUT@8Xg=>L2Uc?^_?EP{RX%* zvGgctbbe|0qhJGAQXKEOlE=qN}@68XxTBfTRXNSmGP;hsy=f|%3(RW#kUO**0Jf1z$_$6ml0)N8le($4#%v zZOMP4XJ^8GbVnD)1BD~IANxtH(2Ozt+HeFsDV3Xhrs!Y2ShUhe#s2tuVSQPSxk~w@ zKcz*pCH8u}vs^e*zMp}f1Bdr;>*Rqw_dG*$m{bAOm`^tDoh2|hJnq%;Y-Ir-QiBasPJ@Kz=qdBg5O3qp&5&Zb-3>JU%)1d!?k-@-Z){~zc?6G?6xwtkWZAt%{!Bx#(v!bz zKQ~w-QpL+lnaCAi>nkp47sh(14vj5p{oy}F2`_jgB4$<`(JO6>BsF+r2HK4s4D~;bJY)_ zlS>M(6{HB5VePk_hdoToQ0`R6S_^Y>SM3se$))4|7JLML+u zJ;&yJ1t@A7^M>W3hjv$LRuljL=1&08C96ONHI=?;RZPgBzue`xTD!2DPQ|5suiE!_ z^_TPMn4Z|u^kL+EZcy!K0r-{w51I53dkd)b4*1rTt{It_p4W3d1py|h5ZGP;jAu!v z#t&3p7WAeSRbsvuCis5C z$;QTpRrQ)n_ks{0mTlQ*EzTMZTOLa%On+4jPVY6;1^1AgzSV83_ZeH;+l~NyXmG8W z)c(|lu<230bY=S(xW>Enx31$_9#mTDK&r#0XM8*REt~FcGoUR#E6GZrt!);l3f=Lq zo$xsyIqkEL70!i>0_>uRAd!j+N?nR9%3zH_2@Pg?HeC+VXjrypO8}D97zmtwo$-T>6o)wbry-me6v@ic?i-H08gA{14S25{&sp6j>0W3$$4DyU*TOlM1b?Dl!@DA5} zn)*cXs0)q=bRj<^jT=er5jJP32&^xK9-*TekPCNf_YO$~E$(F_eoqpm+o)yN#_^|r zdi6H_?_NYbBK>`kX5AR&>u=&(=V@a5&EJaL8(tc{A|CQ_*2!wV_Il2(CWA!t@I}DyK1Kms(sq5~NU7G|TPJ#&jp}c)d zsZ8C5nJOixIIuP~*3sKr@zrW1vid=Ovy`Dh(ZU zm)jtpxX0YX89n-R_0OY{NBWfEEc2k4@^Z3mB~+Sce-;U@+j62syr~dkG7FV>{Eyf# zyS}>a%)8hj=La>jtds&?e~cdB)jz|$7>eEjvS;p0ImYs+vxu!3QV_beES&j%z!fGY zJnRSj^NOv;MDrKdP83q_djXfZ$SqKatx3cz-Qa*W{zM4!BDDo%2_@hEy|qs`@3T=q zanb6NUKJX6_jVV4For00yp^8eC$Xr#N>V%(z6b=qaGN#9Gf8G~`iJ=s_4n}6=?S`I zR%n9~Z`6RZuPSXVLXOZ!r455cSmOVQO#_5TKWzT2{4kXR0rBzLG`3_r&f{yiK;{ja zltg7+!6uS%3cm_fPux{505&iP^T*Y$0Fb*CpmI@|;_t=fJQbN) zxFMJ``ML@ab=#y+j!rq{qWJuyeCZ@45Ge(nCk$&9$VKc3nqBW{T3eR`OUf|mfK~et zD&ZHHzg=7W8##&&w5yna6>hKZ*N@Eqg>wX#15Lutk=4`F*otB2fcpm*@oB*lZkIGB z^^F&HJH2#eVbPQhIZTc@ZP=8y(PY+kJUH!hG2v7I@NrpU-QW^r|$aA{t5-;|~fBXA=t?X0Dtl*FE$*0^SYV zF8aUQ3zC=xxYotm_`BA-v8OkoC*o_asTl)W?9nA9>_a%n02jTg&aFlt>q*QeIDYUU`$aDJt;?P1d0iwC#f z(m$Y^>a44;Zw7HA8T!bLbGx?D#ucy&99l$gl{GXJTwS>+C@3Ng-Z(iqea*%Z61s+d z#krCWir*+`n=h@KFDrCh2G~5hE9HDiz~(DCCx;E|qZDqxhr9c7PI(BIc{|mg_IoZ8 z4uej3kO>oMpO8&G01)2UoE*{P z=|o4Q!Ertf^|XY~P^M#YWa~Mpbl=LV8fW~f>!M{MbN)v*IKB(0dT_XZXD2>c_ha)K zpdj}A&DFW63ip;Q(KBcG&@XFgDY@PS6&$!pUFeK-&%?ppG`Ci0ebSdTRjA7n_>n=CWm1+A!e(qlU8jkf-n(M5!@@MMe@eR=Hk{8 zY|dXk4#s0^BMY8~Z|#u_q}<)(;P8Njj2LY?#er>A86FtVY4o=&W4HjN*;?BSj5j{P zGaks(*om5R0#c?rsNMoE)t&bH<|wu{L{*xDzdrB)p`eQ#rM={)9+Zg}TE@nKoL!>^ ze2a-{4=rt<2}DE|4ug29fz}r=HzrhgFE)G^bpPJ7JE)+w#56l~ab6<)QK8EkgU1sv zbaj8Pr#x7ZeKGB+KsZZ7DJ(;_=QvoO!NS3o*3UoiDaYW+a_7YX{(JLs6Wu97aU+h7f%m!xno^>wcV6dKpOZz(^{ti8b;?dH z@SIwl&rO)dR*-|eiL^^)#qU0ds@9k2S9ZdIoqYbpZi7)^VD8ELy67N14mMT=68IIq zZ!%ynH>elzZJVRs!sNCb!y&!iVGt}zn(0b9Q2qV^SGnb^v0!tsc~b=~NVHawQWQy3 zQP2n?r6s4mE$>cs$XXL^1LNANiuad71P}$+g~4RhRPFSOyCG`)k$1;Y#DQv zuHf8`hY6y!*M<9wu#fq6b@F-O)uxZ^WYy1Q)n8`vVxpHdVmH8DSd?nrWj5^jjttKS zXFj7hSM!lZ^IuOGcGQQmz7T8MhEF2TuSX?nFCFN?{P_%Ej1T@s7Yi3A!LlMl>k|Mo zEYYqT<1?~!L+Y9T@5AT9`K-wj36JY=g1>J+z4|y8ii(VkJZDv!PMV&b%_7Xni4Ck& z$UJQU_C6c?4{w~)8~%_DoNNr&V7e<=*G(ycK+%N^{p-b0$)3GzVR$R4`iq*$bldFaKjyoKM^^`b1dGl`kJR{ zkgMQN=_7?xAQnvXEw*&JCv7wGjg?Uab+@ey$AhlJu&1-jOyy@_W5be3X>| zWu(#(%Po=sZCR*vyp2c9Q%_1HiN>u z9$6?hvBD@HP#o6N?ah17GMqH^%;;uP6AlIvQsKEx+hS*%^;ll3OwZ2LJ5^BeT~Tw1 z36YW;8q$w5h^f}Pek`@YKTC-+F=Q&TnzZWukGb>=RM zzgA3~r4@0mB#ntvNYao3B~6LM7fzIp?bejTJintE6#w9lc2DU~WOc$%a3ZLEitJH~ z!ssT;VB;`=?1NPuT>g9j7-mJbDX3H(*N=IPQGj$;UQ33WQ*L1g{Hqqgx=0shi~7v-AKzw;p^xM0Cgsv`2x{u|{nT3%Lp zII|08ch~^#Fkdp1u%)AmxMu5P_axd|D(_3h@3ORPUn1P?iZ60QLc$@*)h4z=vk9T! zsaa;=$S?<76HO1AnQ5vD%TDZ(LG7_C8h0Xsy zig{nR;>U1Lq@dff`NRQti}zE=lzVQZn!L^D?pwvj(Gkw7pI@r-##%O$&a3{Iob^*v zgIhK~gN{QxY!Fm-cS2zFe&K4g7}lW}$Hu;^Q4qgPpf;!_ghoVQMMagyya%e<^7sF% zP(R=8to^fX9J*RV{ngO#;a0s&cAb*^Gy~s@EPXks?xB(BKEn86)@AhT)NT}(6RfeX zMiupfMc6*?7wUc&YY)8Ldu?bX^|PR)w+u-O54RqcBb*>X#(S8z@h? zX~cWkf~$9-Ou{%h^Ii^<=Y?D>QEl}`kwN9URL2t$O!KJkr9iJ=zXp=S@Ka}5{EtEy zTPFgdMvyL*lm=z|)F{H~3D!xeFmXE^TKwcxt`Sc^uECB`nS(SKvcIII=Oh-Tdhibs zJ4kw>=(FI#0H^joTLQ1?8lUijr7vJbO*qS zhfQ^To;v3Je?Wepj19d@wHob4a@gTY)Hs`rA`q`M$iyL4TH|PmN|$I(4Wxh&B(QW$ zVR)k03aI1ybCG7A4Jpl5lw|ej{3UO~^lQL*Q4Gbs04!W|1 zdGUH;P|af?YR5szxCrK3sqCR2JSO;S5Unmqa{&m6qhHV|zg0{PuelMJzGnMkQwXh# z`o!)kwX|K~utzO~@JS<1F+@(dp8@Ad3Z=OiLD`|p5R-}A-B42k`*ysG|1KhNW=wY{ z8JCNzng%ZhauMPVL!CR~x?52n58K$Vdcn-hARzD>4rM&T^PUu0}p@ptx{bHN0^ z^7AJhUtV3^)rOtR<3HrteTubN)+SA$kVFM#%!fq({UJ!d6|qs)zwu#*Pi$v_ka^8Q z0934?zN@V;Q5Am7 zY1ja7$R}zvndKzB56iUhoO-<1%rI2{x6Kx|EvQbYcRyM@TL z*ZC-CvFOO#F6C`R+`WIpunC@aCDd$Q51h*pHI@td1 z#!7}(hvHH%ZI*8_JdC{= z#G~Gdpe4Hd@9U0$$e|@eEqj7aMqajO3vy!MBt@~XZ2-@)dgaA)XZ7FJHoCpDg95mx zIxn^0&&)iWE9(7w7%wnp%X5u1P3RPjf)O?B`RQ5e;E(Z%g?DptbJNJ@Jy?*Pj?!xH zr08eo8PU&;aha^I>vZSyhPu{63H=P1!KwEbR=a)#7`D@p9p3O9!&RB6v~(i}t@%|9aWO_#jo zzPx`V&=Vh69ZdcfijX5D>LX1{*J&!2N#&&?HUX%h4dv9p3rm!QI;}@?#1*&?3US3+ zRbB;9r$HBO`dqb4Xt-19r>~Gtb|mzotz=oh9lQe$Z0SD(ch?vZAjp zGGbgKo&^lp915pm7+-U=+>my@Y{MvIO^h9WBWEWq!S*KIVZ!JtjPCg^J+ei~#CabG zS)b|X@cPZqyDF=v6DgG12&(8+R#l}oH-2w4;{5v%anco&zXlBnFi|RciLyxBasMdk zw(;p(W67S}N!xPZwe`{`Rxet?#>mLy;5&zykFX zEjkbe!A=K4`T?te<5LYyN1){eDOqW-Bh(M~dfUttVShbx5+vR##-=Xs73nP|=PK`^ z+OnqK__S51GjcqcZUKtEntsWtld2C#BPIM%mOir(EoFQSOAJL{GM$kQbQf1w33Fa; ze0sF_j5!mxZ-=vnN*(dsDYkHM;N0#$0WWIxqTxj{b)O}W29uJPmsnrV2V|LJj6-*J z?C{niHU#>uM3$D8zS`~ECnhE$>_*(tgn=JPfgqj|d3pJ{*^+kES}0&3?i5NBpqcp( zH@pQ-2>2w8m{Xt$upZY$2=YoqCfMDa7>Kc&hn*rQNwVEFHkNG5N4$Ut9;sr11lE78 zVFQkX=V>92s9IV(4@patOX1c7uQtAPv_rdk5<|7JL6rP5*}->r=J<_voYesz>cw|^ z#z+NllICw#Ya*p7u{KMm&8+(+qau54D(oIqk${#7EWEYZ#({i$WBr4D<)>&Awlw&} z7hUSOofh^rYVAADnRF=h5$U!irP>SO*SXbF%n-RY)(05E6=UpWfiOxRWw~qrzN6|R#F;Cb5=@Jxxb#pw}9-6_JjnrcKwO zh8?9H3E3S1SSuLPBJD}^Pk;m{`z^gm4xhNp>d@RO)i4X6^BPsIrZLLyHrOF^!Q|Ta zzIRSf<)ErL!tMtl|Lj14`&Aed56K%t^l261Y0l9(XkQvR=Np6|etv#5Wykc|S%DNz zP!ux#TEvI$Sj6A0`5vMYUrk22$6_Q^UGbRp`b?p6`J7f%a!zH#hOvEHnReRD}|Xq(X*)^>gkH zc`vW3=T{M3-q27a+odTq!-@ciDfFDiiHo#BVg znc;SSQV#n;a3)=wu!KQdiKWDiLU0xe^P+u0j;0E4RUbMnLtAEIVs2L(WZnp{44f_R ztUgF1O}j~9+tGnu(U~dDwjuJTrhVlv!OwYTC={M1>_Nx~dVsg=29p%xtvh#6olU&5 zb%dcN;wauv8KU0r9?Z_f><`d^{`H%${t*QOP>@hS@L*V2*rbt($%D>?u^vDXT3K5o z!%*Q-ccn!FI+LvUk?45dExLJnuC{rfP{l`RcN9yPJ|mKlN4zcBRlpP&;gjNA41h?G zc2SRV{~Z*6lqy~19So2jPfzX1_?)Yd?sqASi@VSq?(TB`Y}5|(!oRa{#80Q=5GT<2 z`0(=aVzQb ztnQ#ULg;6O%T)0n9;DqQ*SR}&AJcZ@SmkMMBEVa+P86^hx8M^0@IbujO`%a5zuG>` zo95hCUnx4ZdX{=B6`@y-$+CqERF|R?NmzEX}UPQ7FW%SZf!!CWZ~Dax+>l zwHRQL6NIhz(DS&e34aV^LYe|6M0|09_wdl|4#fF?50Fw1PtTV*^DjNNlpL{v+RMeI z8XGP}wCm{Nq*$ySv9uxT7rAATXUeg2sMISo+h?%rfuow_Yq7rGVBl6xeU97A`_-zw z!A6k#`%m!!t%SX1ijmsaR_zf8PDyMQqy=Yfx z$is~y0PscmaAm>Ibm>h}?9r99@hULfD8$LZ&NOk;axpIB_?vP$TrgG)Nk^;nQ{epSKw~3h=DXR za6sIivwb-w=2pzQZqp4xW+PrxdjTz@6#2;hCkDKg#?B4^^Vj^g?ya(q13;J4>)=0FJfPnHZoxBUV5L}%RmC+v zF0Lobe2fRk`Q}xxWsO1l>!k!yQYX{b?HUjloS#IKeT@h{{zQJt{Xmra$ zafzi~L~oY}e!~C!C~>3;m~hu!>)}jo?6aAkfr74!KS^X5Ma6$s*=iUI6HQk19gjh~ z9Y+mH_B?OUH2Aahrm9|PeFX%qn*Z%As0=C6(G&_6~WE%bV^X2 zBoG&Zln;Gm@$iiD3uvS7_f(&e2{m9v)9PkAPdUfkAes1j`of_Ju9 z>AmWB?|t%RqEqn95qRCfR&0{~n3d1)^K$HA9`ZgGFLz}EQ zPPT`Gd%94TlhzFd8GX?+0($DFIGWnZ$}hxLfCOITnQbnhY5TK5RJ@)H1=}GgCOg(f zGC7_gP{2CJFGL^mW~W@NokNyLc>ARHe#D}Pv#_yECPYxg1nruYwXk+cJAeTt{f$X# zW+u~N3{C3xGq&FsD>ATfbp`Kmo5a@fWCer7 zuNxS^b;k)SugAeJAj+DJiR+kI)kww-%4%aFWrR{J}Ar=n8Z=2-4^Mp~Op)%R%sGfRf|A-)YHcZ=$Y&#-MtI?*C}8)BzT2hOfaVjQJ zMig8}>~>buTUy*_(83LR=|gNa`xw9>?4rpKcAAfeY7bbDF{EQy)uggEbmM+vSu24?2v$IAQUa}Kp%+{JD zSEmFRQeD}+6kKl$4*r;+!a6X@=o>NoNy{ecocG3waNzlayIItr-Pycvh&habg@(V; z5);|^2O5)`VasMJ|*lFVvYZDg(2ReYhL7N#QXSMM)^K1GQ#Gvj}k z7R)rU!%;1^$OFRH=$z&@mr2e0K&V(GLv{u$VO2P?fMyw3A|3uUi+OY;PW#i_H2p#` zE(kb#rFy`=b3*(DRo|)nMPZ5>B=sIOvS6b3j`C8vC|%;B>lDA@dV=$6C1>IuT=Rt2CgNnB7bJ=Z!_f1be`vs8 zrMzZyHSWC9aif$4b8UWxyG!0gz?e7T(XEvx1~8O4E$WlZtU$jZixPEZI$R%gD5V1x&c3^#Xu|0*E5!c;wmH*`A*(=x^H}+9wQX z!!B8aMLkC3(gx^5s@ng)5sk(Iv8T&+I7h@J_I3BI8ggVs|57b>?4Gb@KDiPDStOeo zdX-)k&F{fdHr+i=wH=^T@ZWz}^7lKwxxXnG+(v5-zU1tG_mKro@nTrvx9@t9?V-eX zsn1$Z_%RT&ETDl6d3D}v<^xr7LzB7uiPuQ5Wo?>`bd+4$9~>g&1rWVnCdh2Lp=A0ov%&2*fWSDl2M!P%1(@wmS>YcEU$O}O;v zn`NWEvvVe!I?8k9+IjQ8oYECqMOD9SQJJN$Oe6mSBU!SuSUwQ)p)rP9_1}(EjMF2r zwG`0gY9+m0FgKS=<|{h`kjnR*ai^(d?y0x)?QJ7fg#b|aIVr~9ijdwIlf|ayPf(n=IQ`H zTHk9Lj+@8;lG}lVd1jOhqt|j z4GtgST*HnqZeXdjpe=DjK@8P;Mwp`LVIBd`B3u2OG&ugv`vbXgc`Gm;-fA2Jd|s{h zLF8qMhO_%|FO#C6#C+WHfav<#OdKIy-bvz-oR=N*WPD!`K1(DmdE={|%?mq#EH11` zXbBJaph(ep5<@UB0cStmO(P)O`5iP9?l@hFI4KS({*b&$?FC z!zcEZc#SbFNQCZkS96i~l4ar&tDiR4oA)}NZ>&x6|-YJi_0vUgd z$QQ6#B1Ov4PBP$`4f0q9^-=F`%m?cv`~GKIw5W(APCFmNe6KN#db_rtP_+7M7hWV_ z?Mp=~vdU{h3Sx?hAtsiYQ3tyk!rllE6EqA>1B1}EUvEA*zLf{m0l+S1J4x31F=DA- z3C@PJj!~)bXA^kupklJAs;aQI?-=`hb~%%LKQuzhE**m6eJPHC6|WX`*MN=*(1{f4 z9k5b(h;VU3M@m9eP+E#Xyj=qO`BTowh=T8B!+bDXq;+FsqfCh_{xM=(V7T@Smby*? z+}F~36p7H`f7FIpdcJvR>p96P4~p_*$EqZf7%H=gRsJdmXQh7v4`322ZU+YhZvOd> ztQt9=#5gm%5{;aYWw|z9?egi|nke7K<@TYGTl4ptLu+=$SD{A5q;8)~;{L?hRc5mD@!DV@U#L43kNPw(p9 zTSeGFMy1rb2<=xbfa#03^|tmdGC=HeeK)f_9*_*3RWF1sk|Nbu!_QN!C2(*4I8h5j zJr)86^VOI>>a|W0nIOm0F3d0ZH)m=Xf*-TGF0BM6MRUg8E~$PkTzWS*$hQ165?%1U z2XEK~na?yF3nUxnxpsXSaj|geQL9@4bVIB^=~Ipt(3`qx@q65j5VUUi2zMDeS!%=Y z%f8h}gQIa0yUSDD{oZ)+nL)rb`Hu`Vx$}XlYZYEZw%gLC=5gmoqr2aSP|bl9Z)IQ# z0idbpYtDu3Ke)B;4@`8F#=i9OcBnavq=((!WAF~^CEcPf@{AcK_-k<1*6S+!sZ;|05+riX;N0u$AmQJnJ7AL`W4MC$8_n+ow#iWl8vAx}>rf(TF+0(UCb5lG# za{G|xwJKS=zQDiEAckdR&~nrf#UQfRjy9pFexT&((d)XaL3nw^&Xace+Ylw_@4)+G zY77GrhseMo@!xt~Q`fpyaV|7I)T$Bs1~~CU`%xCpkSH18C?@`}f*>bhjVJ)oHv9gi z{rcW^!u8`-o%=ZIOL%&gg}o!+M;v{jSB|Q~2?SBV=5n3mun)j!!sCL)PokB5HkrVQ zdoRCe>YH=BxKL;n>F9c40fH2rS+joV!_8Vs_r;jb$C$;*KWgnMmriwHyvosn?|2@K%Qvx z9gh)V;&^%_2|!7^2asgt;`LAsf9TD0v?-%#M&;yckT9_g+~4wpK5{h3fML$Y2s(gF zLbwEOyCuZ!onh@5+F#w;Jda4(?yCbqm5N(u$oLx{xAq0 zuKhE-&vk`9iV1vQ$}oRM&1|vB3xo%RBQt0?|?B} zFqkf#myCY7r(0gEU65p_(_A%}EUlx7;w_I2$elLY8%O7^WqCDwtle{$k?xX*x63Ok zq?MK9#mUakN`V{3(~oUurI2Ana+54Mo8g+2M_>?`3`glUYhCwlT%_$U?Lk87zo&WR+}*u&^&U8T<)xdbf6$CCxn z&8=@Khg4x-b=fPM`PIV^LmZ|fAmh_(CJ(yi-?;b{-ARpUiY^CYj!qHQdN#E=wHZ56 z`*<$p>qgogt)Jd~xt^-xey~Ld=`BWQ*L;T_nuazGbQxbFl zbF6P^eBh>yx%dy&;Oynx-2{lL6_Vif97-S8KxiHeLvvjQT7DH9WkFHrCuZ1*}n@Xrr@ zqljnG1_1;x+vfG01(K8o$%G>a=2$Eb-~Tr6zr!|mJ1yE)ESrp5^BhRZ?|lwPl@u2) z0LJY!qE=MT{%gH`1FFV33Kx$$ng)^E?D`GOe8JA)j^n$!0CC#g_5?w{?TY9w*Fu2w z7}UQP;Q;thD7EbTugmPaEl)qMwOA)S0$E&gFiFjiTdr_fnW#vv>P3B0E;A_|Pr^3` zZ?qIbp&Rrt3>%m|6HL){#T&C0YJz`diFG5L3@u8ff?+h^6K27qGKWLt)-Hv@c^tLj zqM^G%$%X z-AXk*`|mz8V*R|lSq-w$Pxvpt7XX=ERK=sm+a~Gv#tZj?hMpwlZ&3IQALvyUe#805 zdTJ0W_8WuflHz><^N@e_aUcHQ%cuV~{iJhgM#H3Sr2S80zARvtUNrgUg*^<9Dg!~k z!$A1MyWWpImh;{`Sb;cE>z#FIRHw1stWO5b8lqM@3CWC=GX70e9wjIg>My6?(EQog z(W@xX;~OT{oST(3)kF6V=H;(w9si&a!Nh{|Ebf4!$^`X-_N|@wX;9Pw3Sy#S{L_|9 zo<2vvnbW?U6xtE=%IVN=$*w`6SUL?!pKez{UcOIY95qb*?Ch*9R04}LjhI%b29A~7 zKla_2jFb)A_XxtZW73|xpce;E>xaR3TuZn<4fg=#RQhldCv73eM=*7!1v>_LC%$o5 z{JF7Fg0uc8b4~uQnK@UHTz$bLNb_`e{hN$8Abf(1qE89^L^=ZNgV&{$YJ%RcNe}v3 zz#HmEjHHBUx$!LuHf6-0IhXWV{tk?U_|tsuj=o*@S3c|sKLH&O(k39?e>Bu{@DZ_E zAgjm+_^=PB3zQ*!wd>ZW^99v)TJceDSK0`@y|J|u@1Vk4JuUyu{U}$4M58Xd+E2tN zLO(ooIV{nHpWh|p*4M4BVlQXWf)3BwMdyF(Um248=0f~+E@e%rS%flq5DL@olt8Uj zCpsuh5YSwHhHjPFKqoM~qY0=I!V|tpwqss*Noq^*7WPtiynMN3t(gE?af0^kd-@9p z)M2=1y)JL-zEk>rd62#GT6F$tX->V)D*k*j-Kw1*P<#{N;>1v>YR0<9W=IiHomsxQ zmWK`07EX`}2?B0rl+03KL5{?T8c!;ZZbGfxG(=llk(>;b^@rHsIG*m8@BT+SbRbCl z-}vwH0}G4n^{nVF=Fba`OvgeS-&_HoEAZ=rMa_RMW7saf=o;+I^e zf=7WUiHEz86CQl!oXI@0AL|av0yDd*H4)20mvqZ13{xg9*!5YJ>%n2y^$M?Jsl z_+wMr`5Rif>_%bISg4U6g12mOONeL^7tWCNhMiCt7)BIWRaq%(Ys&~E1|!GDfVYaJ znA$Wm2TJ{6KU3(qn$X~ROWdI4o$CcEg;3*sSkD!M;e7Ai!*$Z!A5?anPnMjCaB_Bv1F2jkwG31d4M&J&2{()>>*(aLM91B#j=RWUprG7?9^yz7$m>C4LA&c z--D>%eKqq#2D9sJj+}1JS!ZVQbjf}Hp4{F;!Jzo=C53FM=h4nOs}#>&@dX`7bQ~4< ze#p-zm}I~-4sLx;B4xFFBdEvB2+40qBY)-534cqmBC({eDw31|qa902dB>9yv4s)o zHN*Hi^-%z|!3XW$?6Fw~-u8k@(mwa+qh{KbT@I#ro~ij_0kvyA9kiq9zq$NQhfHTD z>3*xarFfw?8MlpTzDasG#QC&)YZebOPXm?zT_5Shx?hh_qW`O~EdX9!pBqExcII4D zsq}Wm*;EAC*DMra>mY(JyPLl@LV*lvgMQzQrcXG6sIfEa!CP$Tl$VbeO^YBl91d7U z{myHFeErHdKLUak*Ne9^QC!4(xnKafg31}xX!JPFIZwaXkxfa1?k|}T+5Ik1(gP@g zUyD26Je{1_wY9a^0I`#k(}9zZhlh-p7r%tA`{qGn2AMrKI zc4SOf{eD3DhsIp^oD4&z>L2yADrI!r5MpGv=KZvB*aPukYWrmVis{Ct`zbLXaHkRetOlNc`uJTu9*U zUIp4iu*A=Nar7I%ggCp*#xmypybrZ|0CJDaTLd8lVNr^FY?|{;CMHq=jwn+(^kA1G zmt^)WmKv6rs#+;H2$~x-{IAow=zI*^9gGkj)K-CWl9H#I45b2&s@jJwT0wB}D`_y* zchNc>)LXY*oLe^lh50deYd=?%gG^f$7^-0?1i(VO)&Le#Qn82^9fmeK@|qsPy)o)V zT3w@GE1%A!d;uGH<)Rw&f1gmfyJ4;SzeJJb?JciUgdu;D!~T4zti36aiM8kQsv1Cu z5glo$>{~({@$nvM>gMwg3!>gxoD#)02sTI>b;S@yV#Ck*EaP56p^|}ijfWy;v6Bon zvjH?_YQy}(GB$ktF_6Lqcch#@M}>xVh@+D~tklv<6Rwq3f`WqMR#qJ!1boJweZ%?} zD06D%%2nA4^eU=B2>=!(Y0|Ec3ks3|ycaYzHQlgJ0C8tB@9*tx2Hr1lW%MeRn}$)B z18+{3rRze*2=7|GxLfReBrUFy16;u0NXH+n=)S$>@X@QiR}z>Nw&}ieqxwtFr=|6p zL0tGB2W1O>tv_cm3}nXh+!_|w@$vQ1u=WcLzkyd#845UD;mBe?IbMAX1C}7r5&3qr zQiiS<8oBW(Nx8qc&@?qQS1cOBw_W%iq?TQ-ilWQ5-JagN%C zNT!2;NQzfrLaWB;I_ozz%=tO-Tj{!h(CL*ZEC%PIiw?x|ax20x9I~{!7N2#dVQHC; zi{pQ@*{DN1CUgFU<<&>XNb{Eg zlL0$}g~~R`cWa8U`5+a(ebW3 zhY9fOEy|ilZckU`=n&0CedWRS=0 zuR=)rnleO;DH1}LwufJv2BH#x2%1kSCDG^qi>tTrs)GHZKk05MsY^(AOP7Gs2+~M* zcXxw?N+Tswl2^LBTT;3tq*I!C@cqurZ{`nREm+)po^#IL`*U(>QiaXFb9g5iIcJP^ zfh$QXVmIoqTlviJC~7o;S`E$_(;;Eyzk(jx$s9;ih?(QrT4+mn9piwU#C10xJ9{;S z2wKIF#%l42TIePp$P6OOZQpmrKZNxcO-hnC+*G&@_=7Ff8{d(Uk)o0c**8|Gr|71$ zxfG!IQ0#=XQ#2OCTywzqZ4#O06@^klenmzN1%{Xin~&|1CSc1}C~56cLgJRFAjrT2 z2^uE#r`f5|ERF1xDs9V3h)aUa_E}I4b&fhKUDl;+je#LQPd>`3;}|U2r=U#EcJE-{ zN_WcfKCpQE|COPT9iyO`TE6}yMTYMxluY?>$cx;Srpjam4r4&kjn#5)mg49bBq9@K z4jkHsShtzOnzFTsE=a^U{4L?^(g;F~Ln{?24^*p!GqPebB`8tRDU;F9BSFh2&YQ4& zMcQj$&uVDx5i9dWlc@(5g+Vk;7s1UHjfd@F+*XtUPH4+EWNSh3>yxRVJ5T|hZbvwV z1=F6xud1G{Md>&`b`*}|75PU5H+L!_B?6)MA)b1AByqW`C|Jr|c-yDiJU1o!6Jx5eMVQ!M8e zVTnDNEYGKpz^FZBccH4%Qj^S9=^GUb6a(?MGY&UFT^U za6DaFEQ!Y6@t9X(ZlVHcQ~T5VP(955kJ;+<6^6QimXtb>CspSiZi z0zz){u`V#48INPG=fG?EOi;ql7>tQ0WwsE**SL~REs!4c#T%^*3lQ7#^or1b#8t*UdhpQi~8CxevDIuD_EGFbN1FKSC4!qp=-Em)zwsuihQGg7luW5TOkD;<~ zC9Mt%e-A-2GADA(NmK@`AI_$U0C&dsx^T)nLrOk`>-7zMWnulDpg!xxW1D=e(+*oW z@a#cOPparN?;3x>V^@0`74gBa*GR9QaSv$uvms}U5g9IAOWK;LrLRz@ZTXbc>9KSt z4@uAcR1Id;l!xYj)(dB4;4iM@K6(|#p&x-a9D5Xc``Caf2yEYW3mI43#sv6+U2UZr`K&I1pd6ON+5V1p}uu@&NB6GIw#i8 z;;`ZdN{NxV;&UWoHI!WrtP5`=Fo%_w$0 zMJD=tafl!reER*N@uzgGeIwL%`;ryrM>Zsv`k&(bwmzZUzhqC_ z8k?|bnP@zHQ*iozA7{xuXu3q(R`y7E)sU$&V%p258f7b|ma?K@pmy{BvjMN($$ja) zD#qRhV|0S}l1x4BpqxN!O+C2bHk#8!Szv39ne)*wV-=_|!P|no=pl5&Znk(M$!-;6 zwX=rdWp4vvhoPU*RW7Dwf6qC|1$7z8h2}GU)cq>ymMIrGh7;Nn^-GH-Vqw_+r})z1 zi(YD*y{D|ujVlvRAAIgF7r69`xb;<(v$EW@Dt$N~P^%%;3I!6+TxVKj0*G=TwthNU zZO_v4ZN>J;a(=myrRTw_$kIt=8nE>}94NLPgQrxoZuhvjLsbmwNGGahRztfk?6{93`RtLX z9!EK_8s_`Ofk}#-tu73`GoJ|@u^41u>rpwMno4@z-0pPi)m4Cu0H6ILgYRXbYI-rY zvs0RU3cG%IVG8!L-y?*2u?qzy*f<*>-tQ!d9|sSQO&rTxE-C4qR-I85OaTW=;iyCN zy(r%2x8GP5n4`&QU(jw;l(vL_AhtNa!oT&siZV(Syw})g$OXZ#68i)-n9c(}$L1CB}1Yy*_1NxlBbMV=8 zKE`&H*h*i{WqX4tdF*mme(&9181E0Mb4?(hpl9oOJ|oLErea7zsF7Y~t+u*WAZ2&m#{ zSXUe^w=XtB(kLNMy_*$;w#(gwg6n>0B3(Bmre}J5E9onnba?cpuevG0*YEXuSIbIA zYWD{%na&;`dZZsx)ZY5vY}f!d5fAIHV!Gk;#1}F&QtzgtIWSi&Eo&Pi6ENijCt>+ntl<21WUA)3k=#7- zrhedY7RL=L4%n%?cilLyB!W$+Uku)BX6xyG2K6o>r7$qzP`!!0c_HEX;X=DAb;%>t z2fGS}WZoc*oE{AqKQpAWlNw0fC_&c1atkcU^*2o@-?vs>amHGX(U7pnUAj#9Np}AL zTZDv;H&Xez%4#B9t+sZ9R{fQbM)^n2O(>NlUY3y;YP*EtCq>;lDWmm|bviX=`%SrG z1rKR8DXuJC8)`pDllEGO45T-2V(T}zkVv!#e-7AZ+Uo4B21-K$qCe8~p`&^#6DPhq zw*)6Y5cl|OfxK0$u2%l=Lhd+kQ$%hs58+REIFh=?yWFCB;%h|2{-H6VFYKS8X4)RB z;7n_fXsTOId@0$4J{9EozW=8{0gb1q3pEI|kz_mrKKAH1=62e396h|hZijG=m(4pa zrnSCJy0a9L8I`}$OUrhCkz2PdNN$Dt;*3kyv39WSe}bvArL0GZWJ6w`>&fnq%NS}bS%rJ!S2KxVo>7FFRYRgxy+7g_1 zU3i8r)QIx?XdHeHvYn-slCP-Vl#~(9UoAA*CH|nY=3c|#32`$)Q+LR zMPm(T)BoFfYDPWp+cy+#0fZ}tP)$=t+m;f9`aavHz5Bn(>jn6a)tac|l6b!ahI z_{L)=>Q~_}DCsL;=KX~QIcE=;Z$!M?17Y<=w;y+v10?iD(Cra|Y!d4uJ?#^k%e*xhdMM0?VV!z;3gyX?EFF$u({dycXMg7KC z{=@opdI?GtBqwqdBhi>uR6o*S#(KqnEtl|1xICF%O30hJI#E)q*8K4;^}M`l!jzc3 z@np@Af<x_YOB&v1pqsVUG{J_AQ`L1})01?6zukNa^ z4pI}byxiQ+WaG#>=4)&?9hQZCFQzpmaq8->G8|ev?yk?EMqNnYROHv9qSs6!v&y(1 zQvoT-(8MIfY$(}iYdG!dbcj8+)=Sx|_rr6^U+zcCvE$<^YqGxo_L)PGhh4p*rJsQ* zq=Y|G29KkeZ}$v?NYj7-(J5M94wsk^ec|&PtwZ&o>xg;i@v%1QvC)f@?hggssSdU% zY}7*^*w%;2Go0&#y<%}7+6iDDJVNrZV>*M(|6gV6{F z?8sv6JS@mIuix3GEKtn6UjfIFn^5E@@8Dp` z;{mZkR8*DDehs83)p+^U=wkNP=+EVcBI#uBbajz+g^;OK_dfQ8qeVG{n^Ew%;)lnQ z#k04iMXiH$DsYsF%3GM5uVp``hl8CPu><>z2EwhUb*I|PYC~L}2yA%K<-iog&&&Pq z-;aYKmcHcLGkkt8%1H7T#*n-t5ee=7!gCF90x#KmaN6J%s%PRi**DndtCDVtn1h2u zi2V_zIpTpnuCSV9$Ec(huBhAgXV_quUH>zS?LY6ZLL-etKl14YkC*{{#W?-gO5-3)9NK=uaOR?viqeu<_0QfecEJr=waQ8BTBwaWcaR*it}EdED_t=&`51Ku>e2jgF^UC z0y~c`Runv*N^_!uAy%}}vfO@RZQ=d+gE<%bBIZazh>DPp6nQd=+Z)6wrs<1QN8RqJ zBL>;}+*XR;zX@Isv4v@>3tW1?Gs3)8;u>qko&3v;fSwbt8=3JI3u#GtrQ+%8dEvLwSd;=nFMjTK4Ju)Up`PjNR}F5xqI;8+x_WvA>KYnA8Pf(6Y8DSkT^{jv z7ks$k-8YNl`}x=e=ENsqsN-3)@7?j%!V&t(EUdCCvabrcOjTp4PE}lsh1EA!#lpcq z)}>l4Sb4pQe1b6D&v@qGm}ke0Oiu3G#AHue?*j`_7C1=aK~zXfRJ4BcPxK@y-&z^b z`wl}5jp#O#9oyf?u`04t!?b4B5;YI0fNe@v4 zl7Gje5>qhgxQ9Re7~(31d+L;5ilr$}>e!kCTh>sMV3Cx|!;9_3 zn8wgQDy8qnI+_aWJEP|8V&XT|?~(ubJHyMrxQ!xaNO)a)qVD64Jff-=JRDr5>+aj; z%Xyo984=>YOCFHJ)?53$%$h>qF|eNUXuBo9h2z3FYCgl7DbtMr2SV2R^dB4t9tr)Z zhR4SGa-|{=iuw{6)ez8**aNQR7rnMKWfqzXeUDoHqM2m~dvQISWj|J86S(iAo7W!G zCjHxHG=nc<`Eu#$sdL^eod7+(>{I;1VfXGDy?>Oo`%MLktq^fU&*g6|#~p=uDN#%R z11H2UAxS8Ts$VN5X&7pUf-q)sqI2sYvTY1gtO6VBE4%OMg68iJL79ygEd zT~BD^S7+!V*x1T0}nG%CyvI1xj_pF6P2@sJAI zVrT?h3ZU6t!Y(7+9OHeSWHEDK*Gt4(T@Kjgg+1kLpNljsZ9#(Wiitj8K%pmZ6&r3s z7+~Y^P8rHU<&B9RL`zIgMoWkf?(DP)jJL_b4)%Rr8BZD_dfF&1iWcL7OPW35Km}n0 zR1-yf5?V^c4v}i0)zB_L7AzzL5_Hiv@!@|-ixYbATm0CI{4z4n5MT2SSBRcq-}}4C zw&Wz-7m=}>lHbmyEX?u}qBE6#hB&|d<>vM?ZC;+= zIIG;gcYdQV{eLA7BoJi+Tylk3y>Y^xR#O=+WrZUj&LHfmzT zcuMwj(i~WOnYQufLbSz_y-H?Q=*ca@Sb0W8|A|Mll*zJfzKiDE7u+N`L0hCGzZpu3 zr1WH1_wV;AHw{JhDqd1gH+OQo(a3vxPo9TI#p6y@{(vc+Nr%g|b`QML z^}ajvirf2aTgHB{>;v}KoFC8otznF{vQIw4%5uX9x$D8j9+{d^)=C2L zocQ;LbQ&`n8e80@Slil7`p$jinsXN`#Ub|RiEfqgS=Crv&g4&m$kybDxadz`d4&GH z=^ui6jAeb-!QPfGHsh%pAAZ)eY-TD+OE?q$kz<}vLPfiO1)>fzZOr$?kLnk*CQfOx zcM6L#-;0YoZZ7r^iz1*(zZULy!1b4o4p_|n7{1w9X#2{Y~;{W>a9|u;j~3ls@k!Ef!&w=mw>c)PTx& zuh}@$U5#bb-Y%Tq^909|mBjT!$24KHU(%k+^}H&WA;h}oD9*^pnW+_DqKpt^B}!LY z8{Zc}9g)*@!e@l@Bc{vL?o6DL=_~kF>lR1t`GOMZ&mA6gQQbUi%AAXzKgzE}HCINi z6^)*TV9rY}$P8Kf7%NEh!-b}c59rs>v1-uI<1HjmDG zIKR8wHiO*yZ?EQmx_+aBmgn^4t?Y7tZ0zj9^w?zIy(5qt8Vr39 zPl)gQ3jAc~BFO%}< zkKmRN?G(aI2Ch~?R7dPudmAB2%__flm6yYCaK>7?VQ!tguc~z!>Nxl6;)SY^ZMd@; z++%6osPn`_{cv{j41Qqx04M*MbM4}+g4_6rM=?70y<&<=3492#O?Y&jvMVMa3)3DWACXjHC&)Y(<5iqT7dPG)d*S7`Q?R?E+CY1?arNH&rdPL zlf+0Nlu2&EmtpS~G%qGYmYUnBf#9cd4Su$?z<=f^ORdwpGQ3?b0bgTM=yaKCDtH6c*l3UD1epzW z+lAJc7TKp>j3)Y-m!~)QKrHXO>z&Nyop3M{VG$~$U#8*W)MM`uS<(l%@PKe^sr)1R2 zlR`nw<|H>XAHO@5dVa0D*i0A*vjglYwChy@_FzSxp&Ih7f>%_qPfE~bOyE~?237b0 zUU3y%M{4v+MFc+CC{AR3TjL~kHnm>Jx#Df2ubUmQ;7r)sVmQat5sJiIt~d*@e|e z)?3kG>yMmq{5@z9+V)Ik7+g|K)7x5nA!iP_!3I>sZH5m5!H(G6u$&(xxNp*L$v5+w z-v|1BVJ?!gvB$)>qAmI`B%$g`68-Fl3Jr5ufojy*zQ}hmU=(W1DDjBQj#>~umuM?5 z$1?D{An<>@T_HV4@aync_M)foJ(eidZz2RBkGBW)=h6oIU%!4m-me;4-xhmpm;epc zLl3)ukkdwQ$I6PqRp)<&jN)G*BMcJ$pr2v-q(GJkx?I8mk7DJvU4-Nv?`qoNYiIe!~T(c=y+Fc8AViBGoBNw8H3Okq&e)(=&L+E4}QW)#pD?=VRr; zbhgCf$`x409^oUhY+XQ(oyIz&FJA&HfE<%Ci?b3e@v2({9txvzQ=%WvB|V^$xm95Q zRZPR1Epou!q+ydqETlx_`;uVtaq>dcsks#Y*VaQzIFe z9y9dwU+1N&W5;|4AAG#LBH9T=t?urZA>SBD^rPQD4%s+#4J~M1iPY1-I>H32-?`c) zlFwPbgaO{J9^L<=rMKmpZrc!W*1a&IBc)BPv6=P{J3vq(>WNQeZ0?)rfIW^TpKHWXt_ zitw!%K-pwCnHgE7Ro_5YgTG4lN27HYBiv9{Mu_eJ|Jf|TIhCSxzbu>F&>65ICL>%& z?r&V~XB-9>L`4F=vOU}sj)M*jJva+`7S$6D@x zMvv%qyA|IvOu%&wOiaYzefKnYo<&Mx_9UUzBU+eb$Rj1s#W?*8ix}%1l(3tD#YLew zj*TS_xjsxFYic2QNsxzc{1t)Ja`OAclqs29yB#$@uf)=Kg6*^D+>@B_tw3a+l7m-Q zy~Ab3%~M(|lj;Sj4CE2(UzxGRtHv-%j$Y%QOC(@3L6Rmb_ZR70KFjPo;D?N|s&+7I z1c@v=vxu==O!}=)X^HVgp`IF55FQGhebK3$YbDdgvRHp*NNAcLTMr7p-u=@y!i!8zX-m z|0MFyFF2fbJdj2j7wgvPnsjbj{DL;t5%r)wUd`bcC4g0`U-X@b&x8b2TE3TaV0pPS z2N9aVw~^P@9Mw^($j~}p*1Yd_8UyUtd42j+nhg2r%kQ}WSOo?GzF!qoa{B$Ucn-=<(Dej9)2w9A0u0jGK2m|A=T<0Cn{RZwa{|%$$W*0A+ zOQdw)v!-(~=e%Z=(SHm3{j*uoFw3ikQsSiF`)Jce%hi;dUZ@U94_A zlFkc9*`;Oi;&ENGt*7GQ2)3iGA^zF}d$n$ur=~jKwn=P#`|rcNrN97SLAH-(3Wc#t z>ggw?rbc3m-Hlr|eLQO1qqsY*3ozWiju-JR-}UU|JZge?toX%G{P^@F$A*SM+4272 zE6qV()$zjosZa)}-~Nh;RAA~cFVte0OF}5|``!7P(nwZ0bcbZC9Lzj4VKax3sv zgLlmE1!)@kYvoKfH{_@PM5BRZAZM^b{nKyD!-KZiSj#+Or^@vhZ zbU3~K59{Od~d9i{bbu0wwcv3mqp#lrCXoCIp0&^tp)BtkL}AXou9zqUJRdkG}7=(BwwHp7UMq%puGehFs+BAy^R5Cs;>)H@-zEFVYoE>An9H8sEJ z)RH+U`JrNqh~g{nB<8boF*F^g*`A3=*sdrir9c{S(_~rxrhed!T^*o?BUuBHhyy zY?TEAK@1!A&cW6O38#9bn|}Ja2$Y+C0uX4v?l)T4%&iuVKcL5ULQMnO!|3AcjfD7t zr~a=9`C99U5{?O_u~Huxb%F2X7#MY(`y+B#5K7wiYhm00F~ zMVU1TK|2ecF*h`&%}dYntsEHHnX@XP-mQ`Rj8bsVhYq*|Fp{*rj5QJ-!9v3H-A6?=RW*XSt;3HlLbY|ks_lfu({g&osk0&3#H_Mu5G(Ao_Te z2Cm>!x=8mAR*9v9Cj?V`_t4OiKVo(LMg>-n>dwBR3c9i}f_VLM?2szjJqOs~L?mNi z>&V(U5$B$h_-a&}t@N_mo z2lA1Hr?E;>#@rUdRSq9N=cZI>EzagfedS$-IrfuqdQ#TmS#{4-I%;0ISB!6zLi%xL zBJ>M0Yk%X<55sZhMog(Algub&`%Jq|#@rF`zuZUAG7!_tM5GeNYtLJ1+yuNiiGNmC;2^PZeLV{0atw-D+3 zuyZ2)HWdxu^EXh`{?S1hJG-*uhZ#-aSzQ{L7U~{*B}U}e9v>Iid;fQ3rR*8r>kSWV z%x;sstgbn+fDiO5cX(>cH+X6**Kq933oZ|5J_bgo@&SE06UrNZv9a36{QVv3e#DdV zV*!VfU;2Zo^+ZbZ#onxkO^MJ^qdbhy-3e5cSonlj;c6)0cq+qSEv-)5=kHv@173i6 z*3Imr@i4c;>O_YL!cL#Q$I?>S-DIIMQEUId1YFvC@Gehh{PWkU+F7tuy@0~4EYKTW zj`9rG7URf7=f1$pL!~3+kU+F#qN^SNBXUrv9<4ePfsU@_ITJymZPo&Uy>;-9cj)iz zM5d@t#&-Kigpo|~wYsjZA3v=X#gWnDejtrJgS$>#}x}|S= zLvvX+k3 zs{Bi%)GuLT_p8Be3gNRmc^L^v;*~Uw5+=xja$Af^S?e@DRnBSawZpY2z=%PKat=46 zwd`5XA5zt{$eL&@YC++1ZePY_Z#@-6!sefOpLd*^m~c5Q6d<*~#TuAGzq&y~2h|>2 zUasFi3~!%aF*yw_3=OTf&%wT&-!@Q`l`*eXmnv^%h#pbZ3&DF+^1Vb=?`<%cj62{q zL$+di%(yy40dN!coa!^Q_=6(q`A2$Ku@~dWE)uGsokThP7&GSyS|)<1*%cH*DoB?P zWRr#}#jRm7)A97Mn=RP)rJHf4KK%^EPB&77lC98UlpjE4Y|ciheau8r-T>_)Lcgq# zN?+{=Gos`(SXpK0J)y3L@mib`%hGhzZ=VWyR)k5ex^Xti1&(JJVe__Woc(?AFNyq= zfY6IFQ1Eu0kyVY0C5VGT!tEAFA!L>8urCu3=H3)sw;Jnm?b)g$>%+0tkWOdJkKhO5 zXZ}B>v?M!*;%#2UB9jft8o7Qr0oL`EcOeG1?f0;V14a!wHT~vJy#itkMK_$Fqj<*E z=Ov+~3bEb|Pab1RO45*Ljw|1INhX*Gred9oVg_?Bg;+5J!4A+*MCJ|j?fq4LL#a@l zed98!^%zQ#S-uK?6d{2XYbB zKp#M4Yil-*zEDcNV`Cx$JV0lAsR+K=PuOMFjG0pv$uT=%Tv@h}yM~ix>@z>!^4XM|UVLEBW zkt9U#z}7#s5unnNz=n_wmkI(7QM_cfY44FlWW(>z9VwGAGp698eue`fjI9neRZo7G z(}HYdU&qAH&!4xF^pFC4#jFQweI@_52y(A?eSIw%(X^fA)9BjSbl8gg%;1*Hz&^gi zIi9Zc*t*MGjMY8D%861Ay=f<_#!o@$5`o_ssz}@`dM3#1pn26Lg)I`wYcrEm5bhVb zg||7-YTNd3v!_45J1TV4?GW%t-+VoyH0;LIDOaIUdOT%plS6n*6I<7ke}LnHq$?tS zoNb1D+}^bmpyhkgL*#UK({&y%X!=*FVrL zEt;)4x1-O=e6-`*Ac%kc+-H!(#)7VvVn9l+6;D$!b-caj!sO{G(8Fmb5EXs6+G`3R z`ZR*^xxF8(3@h4h>jG923+w*D8(+I@vxD=b%BW^P*=drFM(S1~G8P!E?9O)X8qQEK zG5ZQ1AJ~ze!{#NRo}cWruX)=18G8A{kdv*xF**kUIw!w^(aQ$ye!1_$WaOQ7Kx@8eyKK)As%gz&@pZEnAZ_X8N< zQ(yd~O)54jbS31^k%K$0bUxOz!};R8*l-W?)oWB3SE;7m*3alxo&Q5W zq@=xCnI-}=|3?~G?`a_fSINOUQw*~URvuajNLMBoT&0JqURze zZDf;w2cY{2aB&iHm-lM4!J>01<#e$mBZ^C~h>LZr1#}Y#-=m_)0BLbhE6_ADp#)5Q5D7S zlPy^MjQsSAIF#n09HPEun)BYIq2_}Je2~tNT0K2K?Wb{{DJdz%q-XHxWN|7bwwKXL zC0Le%G#Fq&jld27P)N8KIW`I-VbD9MjGln^ILPwEFZEJMlD&?{IX&;e+`qYlT3wTV z2|F#*K(|yC0oV;vn%WczuL1lj-)nYjmX{1))Ca!gS);Uu;!As?7kiR@#G~v|27k?q{~Fe8D#*dL8<^$$ zytHXXiFm&9))B@Q_b|i`g|g6L(pohXu~&rGrY*tW7J&fS2Y<~Q1CSp3ba}inZ4lpM zMsZTQa!p6 zxY?RmmbFfU`*B3PwSplek$s}1e^IBI|DX~8>Jvpcjz}z0L3j3Op zoB*&{tJXKRy7t;Ne*+ENaRU1>THr@yd@=N#j{GNzI>HR_-r$#JULtNHV@E}~B+F&x zZFqX+c1)nME2RyNW~L$(8_1BL+6~oaN(K{Yu6z_-4H?yUkw+&XB~{ga$0#9+*7S5N zL-xdNJObw0aL*Oi@Abc4bx5il=C73iB?*7k`g*QrxJln{hkN^xY?LPEHY zyH6mKFBrSs64^>*jz^&*Z*XrUhU|?pkK>O__uSA_5{BP8Ex^@6emp$f1}h?78`kj| z>Dvj7=NR8IKa+sG|Csrba1ND73^&V}Corv`(aS!UwaCu(KCu4hyfB|nNMjaTvn?=oP+JA)(%4-8#`k2y86D*547nEfJz40 zg8ePJiJA))i@_YM4`K5&@-M;V3Kn zk_feB1qsT^>Jb=+6NdVXpZNMZ4onlUp%boMY#ZRUQ-BJl@m>QN&e!*JHvor_0+sbv zVa!b*gop->LCT-PbzM_V^R9Rlb3<h*V{evTSAZq+8 zYIOa5avJ5lYY9gv9mN~4SAwJHG=obg^7(VMv-4ltnTBt+JMdevu3s{Vi-ud?pBVWF z1ESN~RKCtP4<0F}3%GLUe%WloOfgKhT$lrtAhafxAmxuyxsk~*&s+b8JsD6>h_7wd zsosWO-+6abFMiTTbn|9Rd`_#fnIxsJ8bKE(=Q#$rT^-&Z{6Nhd9T`db|JF<)At85e ziVs4-aHE5KH*!SL8NeT5V%JVo8DW4jGH~FBU|pf!cQ~|9UJ% zXw^dORyu`r!0+!;ME~ncs#N)_udjo&?k}mZ)9#RxzgXhKKsGP-^&HTT0{wiC1ZQP` z!lYCy?W0<^PkD$Qy^RpNTfDwGFLe90B!G3hxx>%L^&fSAx!8d{vwN zz^I>Hd>ZhE-IU^XKu$#W$aU_L_?CqtrKNxs{0R+*B*ms$2_QvroqkEKpnVwa@vnHx z;#B_ZW~G!O+;^C&KO)4FJsny|R#oa!c~OMH$i@3q%_ILMVH*X@^(4&92>9&h!x_g~ z8DJ)Y1_q~Lzx)5wGvCjE0Jd72;GlgyPxau3nKAQ41*yuKr~Vm*uYXHFUV zJ?CH(F`z7BQQZ=X+YDH~k+>Vj7fp~H*GGS+DJBzChpoyw{?Sa~s4!r?hUU>5!w7lY z{LbSV%WNYCXpXmK^*6x`yK#6|3~3T2(`eWnQ?s+^3GttP;^C*@%;oLOt0M!=b5ROl zOhNQhLyHoi2{^WKccjuk#mJqiYEW@wU8gPzQ9?}N{1U80n-mcIx_`sqT8WDb?_qsx zAHZp6#W;?|HLx(qNa(dU(zd-{j6VDi>l?EAta|x3*6Jc+PBB4|*)5~_?FcI(mv&RZ zkk;)MJY(s-Yr*e@r75g|PgZI3(Ugp|z~N($pgz)`=0g2C-(YYm0sFpNlM9xOPa3v1 zs`Ob^4992v%?q8JFkb6DFFrGS^D~}l(0ZzQ>1s#N*o?xx+c&0CL6uOjj zNsz@=Al_@VY{{4)`S`=Vvu~4f+%=Z7t()4aRy`i4Hk0~PG)^!Gk0-z#X1K~%p$r$5 zhY50`lf-jax|2tk54^WDw+k~@!j=%-vL%Xd^W^6dikI9VL~{e3Y7#GXV(6e<=~K!4 zqq+G z_=r*%pC02nYPeL0fV(8jEjBr4x%{2nHb5N`!9X6bu2xVm(0Z=Vh`yDvR-B%qv1r%g zea`Y$g7Fm=EwUMoRcMdS?dml;xEWz!WPP?SP>>i=$Pa*G2H;wjEq^<5hX@1P^{p(@ z+I`CVkZlj<91&;rNCF*O7&tESp)u@>I3=ye6?RUqyU(7!$0)+)cew2Cy#E2&u@i$l!X~{)X~-XU{CqP-H=qO;cIkqv=F~d!{X+zdm|vOJg4at z)I08v?G1qLn zB&i|aXCdP!z+BPm+=cF$pER(n38J+wM&2>&FjTy6|22yBWv@Bd-96Jvi2VXiP2fey z!uWyVHoB%`xOP+wgRx6tZiniW5pVPf#ZL|#RXj=%=z4&A(M9|!udb<0QgoCg$QQ+Y zXnU?Ysca$9Ags4jZYufR*Mde8ka6ww$u1VtP198Z_c7bpm-mj%3S@8Ibzd!$wI>8Kp?gD34iu|dXK}lyWSqv6`>4ZJs)LseKHb` zO;J^y)eTipL^CcCkuZ1B$f+j#)xj~kxz&$z+nb2;2wS^&cB7J=$2VQJt zkYR`y<}8)}g%W*woih0`F_C&Yyo5axkBC7->W!zOq9UAaL2bE4pfAvzz+k__5-2)X zjSlK63B2FtUJ!6XqMm+?U;pXbO>h2J2lNqiim2`%)v!#HqHzGH3il807lhCk@P*t# ziEvKj_XjsWK;OwRMNm7^BTxNBa$$5CQXTje)lvoaVsP)jI_d`MXbwf0MRzT|C0b2e z*mAPB3>{$LzW4@^xAN5}&5Ys&DUgKyZ)`jD`s zG8DC0>B;I@Dn=C{l>?W{D3|!I1OX)|88nqP!Db1}HaXyg*jA(%&w}2or}SBAtw)Tm zPPgmgul=i-zv5NDad;x`bD~}cHF%VwwJd=XD z{*p7b*uI>T%1mK1khIln#z7|Ia~4Jd|HcJM1k>mSkboy36LeLNTuOa=U}ra1YeMvJ zcS?%4*adUk@!lsjDP}#;<>3cmm^Zz4JE5l~B*! zB!1}Z77Uonz4z}f-Jep*F_NM$(9aO=EO841NOGqXy?4-kB*vq0VAXo z!wEMZfweDj0!NO&$WdTSp*F`HCO&%Iy+oqr+RgiW?Cwe5}!v@g5#$h^&!sO)T5g6v*M&sy7$~j ze?9fJH9D7IO+QS-yRpVu41+fEQfb1BtsKlWTW=D@mqAFjGS3TWumhx-dZ`Hi(kQ^0 z;;eQVr1B$8>>L~(fi@cJ*eUt?ODQZ78p$tb@+kp=qSr&R?#4`9YCl!hpK)@kz>0Uq!}o6KXNxRZ1hG{@%C|DMBhBR_?T zG{Yl%Gj4YAVr#A8M67*&_>g^nx6H;*;Njs>Tu@hMsa{{KR_Jb(aZBL~$L`7gix6GlUuwVY+nK6_X(<)_V)jflnyM|skw>~ zbTgGqI?55W4wyrdLS*EO)m-J7prIDOqWdy!Rsw02YUUiPF|e`(j!_hXG*$4F5b4m* z7VGTmR(ZZ)yosoDfLkZKSE=8{u}(RPa9*>A{qdAbKke~RsrdurTnCZr{-}}*oR@!d zrtB})S_QJvhKO(Csf0_awBjFzn{Fy!6)3?EMr zObKR!p4w!|r}@xKkC)f&%700Qm@aDfwywig}2c(ZF93*<8A(T*pb1+AXVS5D~&m25FtgvT9Q`r8x6h-6? zqh60I^2@?1F^co-&0!`Zs%fdGRKU2gitDiA4BKnT0u|_=F}&WpZl+w{=G=pqE56EE zTPIeI)wh!iI=}`Ob6LpBG}(2>>~iq1VM-7u~s~3)0(7pJ;Q z*ILcggletRbjQ_IF%@46^B@c7Xdj`BtS>!nB|{S8$=6SS1+COA(7cV52bR;4sqEF~ zB|@6- zxt0SdY57|f0i4gH z09OvcSC3>h@Q<+;Le@Ju#xV|+F^SmXB9Fhm0v~|wu?m!fS9a!F?|*PucF|9+?h&Ds z)j}R;Y^Xu;GXn`FLKp~M;yTgyZwaTOaaj_pI(Ysm1b)%?UGx{^*w?d0J4)gz9r z)L(wMj7f(F{J)f|eLxIyA6S^<5(#Yhc%SJ%ROm-~SXieG>=zxw$t9&BPn34jU|$Z_ ziDyrgcCA=a|8nz#;v}$-7*RCCJ?$7J=VpCu9>9EZ8fB-qaB7f-ddwShJlfK^>ofFr z#1Oo6hN4BVYpjolp^>$!FkU76($BSUS8%`UN=ap}`r)d+ahya#c39eDG{re9UvRxJ z#`ekT0mUZ5dh=gR~GI*khpG+m<2G zc-WAgmOlb0>VKhHpIiT*7H}-J)q8%1{FsBtXNRpa$x8hLWkm?u>>b^ZKC zf+Nd`ksIIN*O#44y@CwLDq<+&qtA?p6BTk^k^8F*?Q^6yslXuw4@<6_n$2n< z5)_djU zSu3G>{g$gN=)02jfHdiPUATjBG;hO@YTw(IY{z7{iKPp}_-u>5y%ol2Ov=F_^#?^+ z`#sf#TuET&@%I3zo12@iGc%Znw<}Qbp9f!X6MDkC$hUdS z_{^~_RK+CI0XV@-0Q^JOcke$&>$ZHYh2vUKL#lfb`e}UWM%grQ~Q!XB(^EEzYqlO)IC7 zC*o#?Iac!}t1)@Wz|zWaHoLI|QL0T2$RR=m&ISNa1O_CC=L#h zK#?7=$}TuLDrtSHuY9{?9~bi|ZV`blXQyIo9IBj8h9yS_|4&(~vz66PS3qiJ{M%{j zgabH%*OR>1{v0mcsWX)E0(imo$B*O<-ih^$t1m}zfcFPbb|Br~FTVl_d>4y^XQVXj ziu3seiVEssf6ZpM1`D)1a%7N?aN=fMCZZ=*YF&8@-UWP!k_z+}UOxl9A_)aXvACLF zdZ3~89F4d8#{oAlI|FhZ(+V|}4OtwL{g)Ra;7a|s`S$#H+t|NhUw`CrC%1tiSr5pE zrxP$TN*MH^c~*VQj2cd4v>OP@BLx9q%m)(+l^$_!jibP#&uH#3>j6?eyyu*|XvtDc zi)?a46v!&0C1F-F8rjtK+-Vl@$m1%WfRjteb73P zw^jE5-i!khW>mK$A-`DOmv&)0{Zw(oU=J`i0!9TGkKijO=CzgWP`8xjbN=cA>*tn5 zoCvQp@t&{73d~#P1o;`_-GD{$Z!)mgQS9ux7|YXt3_zA_j}JLWtY&`xj+*bZs|S0T zbaf*+Tpw3H=fSC-KA2yf`!F6IF&E=o8QduZ-(QaIn?V78w=eMd@zc7WI~PCi;?)sw z7r_8LviZl~6+di~Q*)!^qa)CWjf&_4hkaFdECBOE9Z2WtboU++kGIM@sQ!wjNSr#N;8n+*SQ_Lk5hl%24D@>~Gv;!-$X0pEtfAbF2FMt*X9taK^G2DgV>JWhyoV=5`J5Fd2X$A>C`jmQyE7AFq8uqFC70m}C1Xx~w{hk|A7V?v3f&lWmj z2`Bk2-(gVGf5!z%w?LLE>rx#Fi_?zoMmi028gABj~Xf`;bvw=^}_mo%n9W~O5B=7h*;n!O3AUD}8Isx14Fv{ml7UJ=KIAJ#M z#b`4~=eiI9h*Pg<{npU0BANafd&%h-u#!22p?;co=F~|*7!xoC6m?L$#Sg&{MfXR{WVt$*;CiKlj{m6;B$z&8SQ&Fvh!nv zw)>q^l_6A`;whp)D&P@!e%NRa(ZW+c{Fh3qu0N4)@N;1bm^c`JFZ-MA#o&ODXCL(& z*dQntZdkjfED;(k)hyBag6*>KY?z5CILVnWzhj9wruT_O>o-tE#Y&!hhM9E6in-_M zI+uXiGKR;{!3(SiZ#!Iq1W2uDX$aQxEsppfHzu>J zs^%TkZ$zYY?3M8weKOFJ7sMr*H-UV)+6+Tc8vAcZqG70#Iv3sJYAgGq{NI3G1O6?hO!`pvE%|Qa?jrS+BLM_{neJq{7O) zQu?O{^H-&PMXVzdc&_p=say2f<=}yPFiEbKN-Ebf3|da3e!sUJ#eZk=HgtY!*7azx z8Y@s~&u-hniAFRoH$Uc7^{-{XRsnXZvmoGTO<=GF2{ps;3bDjCzVp@@8LE2|2(t_; zzV;`;O$_)aPdD3l%6wnHxV`8G@P$!8%7UYK%T%&RAvxdco-#TKNx-e+a8xw^pvVTg zobz+(-T4FsbaO&X>_H!22%z9dn5D=7#wY=ILGo44vok!-&AuGt=Zi|Rq{kUMYxPIs z8qp|0G3V-;ebp&3&A+#(NuPBQN%Z$l5&SMujP_jj%3Aju^cpGY%G7bG&eM3DP)#FX zfjGLtvLXRtL#m-+TG>wmyx)hvX$JwTkDPnXeLqr=CO?Q1b6==RvagO-Cu16sV>>7D zUogWilnwkClv-WJt`dKap(W(Z@`~h%-aOl%UG@5^gQlMu_RSGD&MF~Yv zm8(m|BS&7ag_t**X@70WOH*BgoZk5>KsN`%X8;{S;O&7(QKaYd6M{5MYNy6rJEiL= zd3LCnpzu?S0`enRJUmW4I>(bb0Sn*^AaBQE_gIxo>+z7#3%dhLv5XqliJsAA0&vP4 zowOrd$otYH$+LEJ`3g%gUkv_t9rF-F9f&kNn&A~u^<3BBI+Ozk0ZR9-#|2n&ooaWb#;zK`5Jsbu;%7`IR0u#>2v!op?qN1Q-H-_E)NyL+(+NWx!t?y9o|Wm{V@38K9N!bKMf zS}$5gpxe#tv6qS?REN!TrQEs{Q8$_newqy&H&IR7789Pb_m>?=0NnR(Tqlj2ZsN3; zIa0LcuWX%6_G~bQ*M@IAMJRU-JD>flDv?xu%i(e%J6+=V9S4)bQc)m32BIbVjv4g{ z==l$TY=mcxdZ-6$acF4+Xt?Z}ireB&$1~eq#A>%78LGMlT-{^~R^H@hXo?T*{%&43 zOAI&8>ppN59$-fRiY)eJ2N4yuZ^^2CB`@u?2~6_zBI9>H;%0X~h=?{)HQM(iw4>sZ zjgcZ}8Y{5cm@|P( zS+7ii798$bXG{vJLzG-A$HFj90G0GbV)j>=dizOF$6_5X(j_;`J*x}}?!yt^r+RF7pj8*uYsrcz3>QsY= z{B3T^CM`j9voOEdjxSn?Ewj&;`(yIB;MMj`Kp^Hl(+Pr{?^JufhmS5r|C?W-DLy9l zWEH$lasL4K-7H0PPX*sZu?)yZDjL4HkrFreB4UD>UUkR4NU7hfN=dnZVYgcx#|`xh zs)$Uh*6r>`j7ICWjU?oIr?uK9KicpZYI5Cl%VL}2;V>a{RDLDr0q6Mr3ZD)IST;Wc{^el@U~Sl zbf&JjRNR&Fs}g%nBo|w~t-CzMVCWbb82b7%q%k2#po1JEp4vnz<58rkOQX(fZS!NtUB)SPTE~@UE*nFJBSBN923Fd=ZIEo`0T? z{psyfK+O}8gM^cFzyux>W)_e@Vd77K#RtM+V2`Yf)*q-ddbeQim}a#`00LrXJf;f2<|`g-nrlX4QO7ZgbCkQes%`b9oxaZ-&<}L z^ti7c3xI>ytcGcbTYk^e#=ZH(X!8w;_lbr1`5(-e8_?hOm${BjtCsDL?OaPkJNHXp%`R?!ch7JCj`9;vgkcY2xC_l>bevRk)cm%k zjdb@Eb)?s5&G5>r4{c=O*gvb#Yb}0+r9%?vjrKn;;G0xIA)$b~=x6YqP|l=SxvkAj z$^TY1+eV_IgJgF6c)u?UKa%!JdVRZ%nF@jcml;-){#@|iAlk|~%|IbuRrZ674_)wp zMwt6y0PaDN|Fe7R)_YfSq9U+#mg_I#-=%dxx{>9eAx;IvLsBcs;lnJAs@MAqR8M%@ zFyDHsu3B5d*#Ph^Q1=eifzguvG!d1$oak*iv zpObofmW1K>uklQ_3A!9X$e=Ln;x^GRd`t*zM5+V^ZTk4meG~l=m}zJ839%Ajcl!PI zq&@xIC<(?`8tlCF6oP53S%uuK+KiVFCn*~bP+%#vl}P_a7MJhaiUvhjWXgV$17w@f zq3@8V0J9#TjT!FD>4K>8=6pavzyj}n&cyp`veCqN?Ch%0{C8rKyU|grrV0YQ`&;+e zbtF3rbs2_B#q%$pyyLk^KM)5?LXyV{2OX*25!4^h*VtgZ?~_#EgtKSBsP;j21T*OE zwfdwL+}dq69x=b+qH$u?7kEwhfPY}%`Y{k5{jrh-w!$d?V=_PfTbAlU%X5v2=l8<- zfkQzER5Dd1)31N_O6$_b{=cCzViQ@zcc{|Z3MXG3S7-Kxlk5X?zt&%RCEcInHNW)B zJfPV!3jNK3kvA$;gLP0j(nc-F;rjLvA}_*3J4uvT0g&dST6mS)@>J|BamLVegFRzt zi45s17mk39;;uUkVG-KhsOnrjx8POfXf4zgF@gV!af!Ctls%}*b^`E=AIt_M)l*|e zwo%cPTg9E~0A6JU;4|I`0U)`)wU-weWPA~uKc~!JLisT8HbEe-z>$(v5)UP6Mu1~% zJl-8ViK*Jy)K3cFo7{=a%~3PkRIE|6D#R8{uGxQKh6dvb^L^9lRJCSQujt|L;Kg?NXm3&o~@av3a z8flMnf=XlZ=>f#W3bd2Pbsw=Zf(Dr{af4ThFsXs?gVg{ycIj2HfI# zTMDdXLz>`Wep>?~`ArNt4O#yWQka}xk{B=mJO%g7G+dT}{2+$zgVbL=Z`|TH=&aXc z04xbLHE$=UNqF7aXUnx2-F-F=|1>nP-x{7sJzXZYvo1RF&9=XsoLy{!we<^R0<7tY zzBdiHi+j7f8{?mFFVwK6JK9UcAA5dvb8|Jz12G&EeljZx16foOfx zPDzhV1e720HVyb;*@!-NZ~B?iapz)_f)a>|L|#>phz~0+Og<8E+gW$<5nDo%&-m!T z1bRcAs#imdz>E15cwszo>!TkLd2dDpk!rVyGG<8hL6iFiU_!{k>>~^Lb0HS+>udDM?1`- z|56nnGddw1wf6hRmCl9+I$GcN1Yn~383h?}Gl1Bt{q9}RdYnvw_@LejW}khIG0)Z0 z@cH?9SMn_j5V@u-q)*{^wh)A#Lk(|ult9;acs`}Q>aWcoT@&zAn1bAJZ+o*lim!VD zeQTaMqGoPA1|Wo4OA>M6i{df_UQTS74O)s|Zj2aOS)~Hx=ep_=CYxmgvc|EBlI_lt z(d=w#y8$H-7S)LyRJukMzk^f+#2rmJ=|GT)$3(wFL(u-_RP0eEz!O6U!gB+l_Jv^F z-d_s=M!2MPl3#y?Y3Ol*czLt}AitBbric`j$n~uus0yL55PHgxUku6`u=kFwrdhN9 zMG%!?JNt`3%>$gMJuK&yF1SocMZL2pC#_TP2F^Bw*vEMsBoM6Sl^zpR&KIGoM<#9-da*rq$#0Aw6aVhBAkPRL@Tay5Hb(w@*OX)W zi+DTC5vfucQj%4_SZJ?tgD~HKsz=Zqm zi54CaQNXPDz)NP@RK3z}ZuPW3;psjz29L=aCc%pn<)Qg5J8sj5=e<|%&&#@#`z48T z-TiZBLGu|E7dSLRKU^(W;vmh)EaBo`rh|rvavI8@YXNH_)CW>o-++G>MzIdWl_#tC zvNyqL9J9r`V;Zd>4N9(s8ZXp>jJ=u}OL_Kt`{a@55w0HOl)F`(Cr94T{w5|?3k2bf zRULm~M1Q{mJ{;l4^&4{;K<;O#6DQ=NUOYPKc@}c)O&c9ib6R$p#dOlV?A1(zY(Nr- zjpzn7SfQ=W0ue(Z8lRM^Zhk-Tl$3%)?(QxvH2n9b-fE-vo85rAtwr&$kc zOvcpzCr#9bl@f%i_0ji)JMKce_)7!$)GgfdN{Hm^ji&i|VMkk1ScOExCk-ouy>E^y zfZq5Yz#`G-Umr7ox1E!njjxz)s=&s~Y$;~UWm3@#A61RvU2BS&|;wIBn zV?{W}7!V+;qqG?FqX38~yoPEs?{1!vGX;S`YhwlDGjnquEnfil!o1d|C23N9|I8oR zD~)nLmW8K|mbV^lMnj&XKRGeskc+9Q1MHWUvkd})Ya+)7WM?4MkDQ81_>Eln8iLV# zOq_Z#MQgRp-gtVEB?vXU#`^?=pS%F2m{|}XmlE_YECFGMY(Kd2Ql5v12rVnG_c}z+ zcq~02DuXZGW8)WL9WK=@&(PCpSUI`r^M_PB9t39>HMY*k$eo=4S8D1vAT%Biu!zF@ z$@r(cB4(@d5bPjJ!(mWd9>NQfa~CQ8E69+T^QY;NU^yqdO0WX{kp`0#G$#PsRD|$| zw}0n>g?TIl<$;BTg9jwy$*F1vSA_~ve%RYw&oWRM-2u8BBcRJ+sJLN0W>Xui8~+3a zoWtU_OCQ@G^l&yyyL)8<+(NF($x6(W26`h?E01!+J-rC}6eo;MT3zwi@l}@&(I0sp z&H^h|Vd^Wj-I8OC<8oPlGCe49Y%kS-gp|`${O^eZg;5+~Lp+mZ7ni<&!oEp>KCsrpR z56;aml~?96a@w=yI&f5ESoQP$8z?rv1#bnGoqy;Vex7yUPSuW6VV`cL(%VSzx2RjV zms@tSf0gqJ(E8<0#2Na~H=1OZDL5k|uF}W|RdjVAtqilAwc)UbKI0(^1iBdDE5@cAg~@ts76%8Zy;~oRhkS>mX^hcuKiKB}F6dQA zM>g1eT(1evlra}B<={8B*9*4Gdo^7Q=sBu?B=SIFPIDrj% z^(k=NbS=?MjN#rO8C0F!PXydav1ZzcU{6#CyW((QPto+t85E`o8RAzGgR07om9wQpi*OKqsD|x+ zLcAY*@Ej|Tb*C(>SSp7-qn}^3Tv#0`tzQiVsKhhy{8>2uO$3it)RG5DcL0{oT?ixsJ{Tf>Sxaf#Kd@P$7Q)*GyCtTBVYX zFvhmvM!P+7U`~4`3_S4K-r4z=Da5{`yIdfoB9L};+T_IEC*}Mesa-RC=+B{69D`f| zxpq6mi0hFihiyXHWOZRR;UHg|W(yV-Ro)?0b0nY_J=IuH_er}~OxJyBG#e1(@SPK^ z%n)@v=@Tx{igs&g${y{63{kJwomCjuZJ>#BE1$r(nJ=_)20x=2?g{5x38dZZw`HO? z{{H=2mcC3zGd5~CJE}_}JL<`|IE=T-u0|Mi7(7S$K=W}J{b)!;QUg|Ubd$-djr<`g zJH{PZe^At_V3-nw>#g7K6Z=W{as%@n9%pgIZ8Tz-)1UJdM{Ljc)1W(RSMKIt2lC8$ zb{Eg6*a>F}y5*&aZIhq2!>&9J=^T!KWQ?Te7f^z#a*9>ZO2Y)p51#+}gf?U|21Ra6 znRu%8(?lsezuW-7!pPm%7?ijB^DlKSS4KBh$!(|-ym%hj`E3a40^;-TG!T5p5&bRD zhAKMlL|4d!4t47GPOPzLrYX;36;QOJp_Scigu9lkc!J^KuAuvQ4i3a-X;rXOn-~@-(nw6&iuWb>{T{7>kwxGk?TRGFBe8yIN&0)5FkA zSMr&*>rP~+N-F+T)UOG zrJ^pX0j`5(1(lWP86FoA@%r}5aHf9lI-5fCH#>7CRaJ*Bop2Vz3-4o})N?HbkpTHrG8> z5MNs`&wSx*iEZ5ScwS_P>P5C~#J#f_a3dpw&4i^1g&T?Mm0>`}sm$jsw6Jwmz{`c> zYt!~tiQ2WzhhhTisbL$sM!Z^theD~3{6e1Zew#&Y&J3=Cxd)j%uswlh>B@`>)a?G} z{PgMea}Xpn>;O8;D=>Yn*DYCguf4w9Sq}5PT%i4Pbl$DH?G&Z~D0WB~)JpR%BvMETKw7@5MPf)qL~l15AKm!) z+RN?Nw4?hi&}%Rd)ZVyqW4Go{eeqD{Tw=}VSL?Y64sPyvXk^&!0Fe}H02f|GRq8o z*x4jptv_gOigWK)6hJh@yKRdyH`2s71o67HHk@_I!kd{6@Zsi9Iy>vo?H$&X1-V&( zwlKYB&~TBVi@Kz@PxeOu$}nLaVc$J6RWJg$aQv3RCq3OXNA`R5W^LLW+&;}~j}_D!cZ zo|49cK3B|VPcO{mLI~rJ_-CEtQb=D^LM#*_wCd$AZ_i2g#hF!6A?w+BaL~J)zJDDw974GnhYbOZg`Cj|7 zBzN6!b`t$DJ2^S|OYdmN- z#RXt9<~#l`3CZy~<=yD>&bHKft4JZNn;QpMKKHF-G+>+8yhy|T-H+3eX=7zye>+Uo zcy2gim9Pos#^7qKpjFT3;0nbO$DWv1kK)`2aI`JR+?j&i>S=TE(ZllXzIjyK%R;iH z^y#(d@kyFL>*(P^P|z|asc?3$PD(`{+CDjt^BVLpAy2PmNptmm*agzbzA}c8)Z`rW zIG%arobRfiQLwX@D8GtG>-iYcD(P=OWA5;3{=6oJ* z0ONpw_|Hi4hu~4~ke@`mW6g9Ac!RNMtzydJylPAFE`+`P7gMIByh4g!1U?;CE9=IE zkb~zCgIsZlk(sPH52_Cr-j%^w?16rpD!0M<h)Z&ty3B5P| z|N1egrMggr)*QXBHWhODv@pBbU3!WN0r>o$C0n5r!$U|m}FTH z;xX&H@CH!_$V|4XF>{-;BIfh3Jq##6egRW0$qSpqwB}MedlF`#;`XZJ`S01 z{0RoyP!;{~9-c_}%5%SFvs`mV!$HwG5sHV33&|d`J^KYdy?}<-?GCt2&s?zl-1Fi} zvhj?6fKfr-w!WV#B3-H=I(ABUU{1s#LAdVY2cYb7+MYgf(A_&S2S%7PmSiq}F~QSv zK5&?sna%o2(wV!bF+yK*aUVCnxk{E}KxokKF#}J#>VCx2)6=)5@ipbwf$oe8Qd{ry z7ASh@?`q-_97@0XICoUV4Pmaekg>Y1)3=ou=b=RcOFo8v1vI`-cYCX}$OHT?&!bK~ zPVRiE+mqLBSP|QPi#N5xphZ12;7jmY6z7dBHpCsRyBA6$hE3#H&mt0SN!<*86=_}% zBK>N9XB`xgMlBf864Sbb>i`rq%hGo8rF-W0D%oT5=#MVRoWmdWNJ2$mZ0RTIgeFVE zW+k#LOzNm+y>u-g4trm=PcMaM$gJ2^UG&O}xe^|lH{!%_TVjv>ixwjBv^Krlm6ta1 zb2gL2F9rG~`x%A=l<{q9rlc=*qadk?nb%8@U^T3}JCx9nTLyg5#&(tmVxw3V{w4~> zM%gXY%3`x-Qx%X<_qx~O_tHoXizq#!FT4gkj!(4vA$LDe58U@GC3L>%O z2mR%ko)fkwvz0nrrtK>MmwDir_E|jfW}+z8& z2@fi!bccRICr8jbTC*PQ+7g8%6aJp*P8Aqo$louzv)oIVrF&7Yn24$_1B*)0Bu}7p zbWTH_`y!b>+j&QM!Czh?ZJW@T&l%wbHhKa8<4V&TSILYE#ey+iEDS-}f~HA*YW>p| zs~BzBLanO3tnnI1pU(SpzKo$rhbGQBIWd)sZH4jfkr51PnN&r_l`o1v=5)?Hp(R~{ zIZGTE7(aC{oe}$>=k#q{DI1eHfTdHN>|r!C?4A6N$|i18)6m-uXI=~^lx{_|s~1j8^7LjWa+obo~T8;E>n z%vSt*QtmQ_wm|+mCdH5L@{QwJ$dg$%U2ZBOq<-uiFBVSH*DPeHwPKf%9=^6##h7r}**yAI#b*Hem# zKp_%^$n_=&e1${?obi*j|4pJ$bl&@~=Nv}Y2(H!yLXpj1GVM z@}MTG=*!W7877{^ve7i}%$$tVovoAe7g z>SPwWSa6uAoGzJHyHS#ve@5!ro_*f-mW4Meg~-d9{G zijZxhnzdpcl8R6WaJck#b#p-ZBtQnQoRM?I{Qzdg#{jPQnA|owk*e4(RAS=EvUvR~ ztU)*j#T;qd>!#DCG#Yis_xS21?|<$?@-2~axF+N{wZup6FUm;Y^@Wh13cxYfUW)l= zRm+3k)Q|e0Pr@G74_Yr@ZXg2=y~}SEJmeX*$9ZG}tWdsJEYo17NN!b3b0dT4pKJ!E z2t}00XWN)+F44<9bW9E))s3}bU;+SLAOGgY;qZ4PFiJn<$r`732kBot;I0jz{=7SQ z?=A~h$938!gUIiAyd0LFZ*()oGk$^DuWMo+Xq@hb@3hACgyryjO&SmkvnBn*Z7z#BZ8;T~8e6qG4H%x3TCe-t?|=3vQgW`?v! z#kZM!5H%d>;8*rfB)f37m|Z%*LE^u3i+Wx3i}W*YjzaTcJRj#UYdu1(CwTGc2W9=;O>@(EV_q@ zYWrW?epqhX3lysU@gAw~e)nFYMDR=bsc7@aQt@UheB$6CwBh~v-B4yP`xMW*Mm)wX zIzC`bxttTDS?x0G!2XlALcdasgFr{RNyiR+vz2UE zlI3K`#2=q^-6u!_#+U9nrfCJ|2j8*qRw{kfvw||Av6ESGziD*L(8~IGH_o zcDJ62?Ht1FWpx|d4rqxeN+OKAl@CYU3ygwxGKWpt&0N4bp<>{vW;qIaEEzsT@|&kt zr29mI?&Ie;YMI#w4(pL5=0lDo!ibIzofclRIxK#Zdeup9Xc;~*#t41sU%OjmN@jSZ zsE&dRFZx^ka4h$IETwRwAW=|82sB*8gmcLrEUKl632;g@a;&IT6V)ve-rH8b2ek_H zaR|*UGrJ#STRgbhoKK{}33y1H*1jSN)!a&8n);=3J|i5jxL@_P80uSVt4C~+NI`Z>!@ z--Zyc*wS8D>Pj2U@3S67yk1_U~2^KZG(%> zPj5nA_G4fC!s8|2Z$i3`@SyB_Ari`a7^^~cV}??CrS#I#<+0yKI3 z-fWD>vM&0h!V;Gqjg@xY61+3MXhQ+ZoEjs1fwL_+@|SYx84>a8-NBb=0vg-8Si3u0 zJvP8tI8xgoGj?a!1jsA^@zB7?=+E33Q(BhvvWSR?^ZiB;(6a$;8X%kD?Iy0DoUEKy zdpjPVocy(84u26uVLZSGG&w>DYA5va?sJ53U*&!Dj}O+z69OY+w2*yeMf0X9e!q-* z<@*FE`l65Z$9xFzHHl@)a7JzIdN~Vo7BRLybC8c&f+bZNs0XE47m3Yk?t-T6Y|a~> z7JIiU;w^j5>=LrkVr^#J>j_bi>a;`4B2ARTj5sg?73o*~Hh%?0H!fgI263URX3*H?v$>h&#x zF_}}6Rp+A>Gz03kNWu6l^1D!v$Gz6>i>~m3_3Q2^ld2k+Weqp2b6^#NC?v$;I-7f; zuXX7Z_WjedP&s){B#}c1iVDOW(&5Fl~}`Od;AmM02pN($lv>Dokh`;s|4ku}vO`=YUNAAqOw%N2E3qqc7 zFGUp3N>NMUiPhyjoKD-hddKjQEihR2j-u?HoNQFOzXOyqA+U8+BqY8GUr+>5P@)$4 z-c&bXesw++x!y3l;I1e3-!SNF6T%#PXqo5mUwfJ#rRG5(LN?u`p?V7XgH^RL;^>i9p>lSU!%m zabSNvJ^d!RzUlL2-XxI^N7}E8r&ka=v+7pDhK6~r41tp}g_U_FB}BmWf%O$afS)KH zQLElMzAenDz|X@-x-X!yl2&5uj!Q_9gwO>-in~Oq1lms7>G(kwYM7e@QJ(beA`DBtDaZlhU+({^T)SffJxq4UK+5d|?v^ zX1x@gvV;Q`Oo_xJpS7n?!13N@$$#p~kvmXky~~X#Ab*Lu@o`{KO2!>TEeJ!VWggE| zbF|F?KO=qbf8;MtpO}HWLRHd>5%`D$8tS*rkt|`6?!uYwp0^} zIYF`u(n(r`3t4mN>RBWnBY6=M`z|ac717kE4}6|odZs@yLHoab?rl4$;VKjpsereknGRllc_&ox3tEPL{?~*1uV}8; z^uVg4Y&DDB1lKPDr%}aHDL^=IsQdP}WBBRVoZ3l2Sj3RQ(g9?F{escqG3KyE{tA(4 zSk0YOGS?*yPOB_f9O(_y&Z<{QBh=W`X-x;tpAHPg&`Qrrag7 z(a1NvF?AZmzhGN8U1d?84*rNrgj@G7a0=8sl=V^;(TiXqvc`TuHtWIF9u;zTmybe} zOEU9&jH#=sSzm6nliw8ZMT^)LQa|sEMSBj8_YRJ}->OG(yjLhCwk)sd57vW|9JlQv z6d$|ip2FsXY1GZB=elij?HK9AbY#<#pV=@xMe)M4^2ZMu{{_n{#=h_89J4R93eS8S z7?u1vqcv%*YZVDjllvkr5iS9?X(J3CcO=rO4--GKp}hmLUU_~aN)KGmI=`8pGsG({ z7vieTp^5kL{ymw%5CR-vn+WwOO*bv_i{eZ(1QdNhbef2D-=58)s@KXDXj9Hm@y;G# zH3;aVU}PZv8(_$8w;Aush#%NU@TPwS0aKvNzth4(#w&KdAsK;(oYOyH zvRqqRD<&=_DrP{w486II9gB$D{*8T5T7Ykjd0>_W@oQRoy9N6K99GmZCRz&9Y6$5VmZ;#dXE}L%ss5 z$n|6N9Jgko*08iD-g$>2UYbrP5p4PEi_uO3m+_+#q;EU|#2dT8YvW%Fu^hw@JXwc2 z3E~W%3>@*?M*MVj4wj@3v$%L|O-(@%NCl+x4KU~w$5$1{Nc!-#9Z1aB%B1m1Bs0JfiFC*`7W#Kk6Nq!xZNdIM7m)FuC@y_&?1Gn zogFQ!h70;e-L1Z&0fbDOm#%j=Q<~5S$ZcR<{11}Jj>4V&YiA^(2wV9&qoSak?Mz5D zVq!>K+!f-DCfYJRw@q--7MjGxVjK(ex8szuF^8IVA<;>wJ<*FMeT0yN$lVW!F}7RARr(Ikgh{YmvkLO z;t&b~3P^`^OG-*N2M`IRTO}o=yFo&_ySp3SKHlFO_rCl7_#ERKLm0x@d#$zU{7Ph1w0%mS9w&YTxB)1op|}&9G*SK`@9)*iOq^Pq(!#} zmqhDhBPTV*#Y1U9`^7AePB6Q%9Dk|=r~6vl%*u)l%3*4w4RR|E`rM)2rz|`CZ1~oq zygS@h)3vX}Owa5}3SI#VUH!EQl}va_9=1oCf(ExCMUMC(f%EQU(B-8Y-~k{ZL@6Gd z0YFjgrt}Lk8oGmh_Pe)kC0;w5_YnGh%0+)++a>$Wdq72zL>Vl*zWjDTfJ_W&&M>@n zQBX?XlYYZE#G?k7r~n4&B_8u1>Js>8+0st?k~zi^A({``7dLyGJ9hAFv33IC`Diw{ zXzHfFH-q3(3kk6Y(MG6kvvvt}>*KkHRR(gO$kooPj0zAU{I0C;wzdLSZf!Iu)&m2Y z3KQs7?`WF|?}WBPCk{AVCGu@$a_HLEMD$-Lirs4boGpsHk~Akuzsa6+0rnE7oGu&` zMPb8vA$4pkx~?D@WDV?FDPCUswY;S5%+9eq+LJ_B^i5Sk`AK|O=s4S(oaKzdVv0YH zBLv+~^WBs{ox%VA>kNJjL)3W7>?{?CV&8NjmGL$=6AV2LXY+?MG%^ZO%^GZAM6!R< z(#NEzEu0k!mnpD6iSP+au#ke%uZ^30^Fvb9*1G;*a@sUZR6?`cvo#F0pTaBB2ez^o zZ;W#oG|bi5L~^am`Z{oGtb{PXBx?N{_e#e(|(R5T>0{DAacI0FxIc`3qje~KsPcP?_Vg3$ zi$9(VOSqV(O7@-?3?X)KKF_}F%jf=^C`QWAZ6{IRf()33?b}ZyMA8~GyC={#F{LxF zj>~!Y!R&{F8p0fD4dbstd^w5ZW^w)nCd%XN523JMnPhDPe}DRoXF9MYzc8*d*u}j^ zT!iZ{(@M=Mq7EDG1_fz-b-7D*aqfdsE&rBvIF-n|+<8BGGM8y5C{ijCtf^cY{ywys z?M`)BUvBZo?Pc<<;BLK3WnZ6@WDueayc=Hfenb8}Mc4LWpJDy2kL#Y_o#FZVqvVQ$ zE5r?R;z>e2GO;`86!Ph`L2 z6NB}HZ~dXxVcth(lk_iC|7_LcPtGApr3lm3KT{a=A>YQuA;n6ntxu<#eah)CaE(Fz z(^H89d@j;BdhfrAS7J&amG+jbq$G;U&|hPBU-jp_6m>W)T>|f5;|(1&3Ka$ek~ez0 zs%Qe#_8-;7rPBl@@Q94a3VtLY{vG|<_~gnj$RAl_jK|XpMo>)k67e!b_pSYu zxeMH(Vekg-NpdPk(S$iu&F>9?Jh}ai zvrUhR8ZK~l>uh7gPhn;+nnS(oPN=45>ay0;1kz9YA+T$b7Li!u6=0=VC{>@6x~;#_ z5x;l8K&jPp;zR98FBS>EVLpKeFnW>E8{{z+#p_)WQ&8x<*OQj2RdQA&5%Eq2e+@_go7P=7Tf#%^6t|*;8l_AQxY{pM6@&xiO%|`D=Z2w zMSm&ECr1=qLj8EEAHKXK5?8|A8`?96#RP=o_dMowZp1C2(wq}#-Ps?r5CPK}jzHK> z`4n`=?6kba-mZ`*!kJ{i3UNO-iEF=>98H(L3tf&95Z&g`IFGV;4=|*u((0!6{JSgZMgUqlP>-Z#Rs_-iCo9+a&cdsig)7%-`Gog zIIylLA{(Dy_YDZW>Qjip-DEOdi5@TfOqRV=A$0j~gRk2K@c5FfSsA9Tg1^j$>)n_3ut=`ixS z?`GwUnX5yC$9}==_FhAS-IF){#7+~(&2xtzitwHIWadGVhNP3D!cm;<$4x0CJmb>G zZSjIpi0W0QB`8M-(q%;HDYyTTHHG``@ zG1udeMBx=Gg3VUvu{4A8&8>^zFa;?st$x0Jiy@YZZ?Q?fh`Y0gz+oUAnUZbE%S2XS zvAAq5=sJMG$5#&Mgg~sdej_00i5^X}{xZ_cwGNAt@)Pd!JUk>1)@Z;pwYI*mu0E4I zU(LEXSo+Lmr)gSXuKmX7X?GvOuZY)e6d1dPR;@wY6}s#ls_%1 z#CTBnBue{g9xg<5sfu#TLl~g+yPfzn6Au}{kG4wVUF4;AR8!A!rT-5$l`l(*kS(Bx zFjx5B4=h=n>vp83h6FP`zzM?=SJOVXr#)DaUoW49m!@i7QLsk_M21E7(^HMJcH8|F zG{H~GC+cWWiKY2s1i#2YgnlwQ9+_ zk3&THBQ^sPdg^yRgE!eu>nC5Oga1=?3JVfCAYz~9>|jrMJ{i#2gb4yspo0DIueLO#XEsYp{NHE#w>$jp|5F0|d zx*+&|1x3}}n`G*|X`q?1eHF*f`9R9;5-&-tW6>ng;1YdH;MO0Q4{iE0D!PF!3QYu^ z@d8^`{e@qR^>i&E50yI^fWqmj`!whzxbKSXxbZ*7aEjfV{5H^%E8?=(c1)_|WU*EU zr)WWW0&QKr^F(v4MClWreBy0BjDnq1R?)u8+0bO93XQf#sFUgIwkmDSkG_mIe@tN1`Rw#U4`=v^Q@b+d+MB1q=io*DK?<=)~h zJ~KRlHaaL(rG*Xw5syL&SvJpSN~S5?9#Z6@S3=wSA5K;V5iydfMYV)q61Y zQH$Jq@wm`D730zYXabdt{%_h~YQ^4o#NwjLNsJi8iRy#BQ%4wQgU^)=(;}XZFT#MX zec{X4?L%9rc#@EVTAkzAYaLZT={feM*dQvxslPPmxW=v>b#z?d)rb7cb))6I8H5^o zM1Zwvu+BKm1C9@pA3Tm*$a5WGr)horx_6IF1WJ&Eb!gDc-qUh$n7nWr>g)Hep-hi z%X}~9=u1}U7#WR>H_+@rFE|#S;kbAm#xAQ^!i_pkgtLveB~Fsr$z|p~%KYio4~$pR z>!zNsay?(7u}Syh6JE4OVw8_ddTv*DuZ;c2Tl61=-3`lvF%9qg24Kjn@F`|c3^vvw zTEAs0&ly|9xJZG&zb}yqofBzhgo0(0PN0`U)RwkT_|7f73wpM9oWqC7lT<+vqi~UC^KhQ{Q;Zz7@Xui?b0;6#fYFRvA&2`Irih0co;~Z+T>-^ zcsmsR&veP$_M&&$xk>lEv=8&>l|oiQt4CM&UtxUonDcMJ9ocDCvn|h=qPsEk(r3hg1jJD zog55?X=-ZP?M@3ZAE)gpPG$hd(z@Pcml*GhNE3Ujj`9x~l8U+vlxriphze{eh0}D) z20(J!pF+_*pBWyUgSL z(=1vcnnx286M02N9T!K_6`fqw^Ned(LSQO(Bl~ASJZ4`<_$$P7w3YV5!T`5TCn~B9 z7At_Fq-kz#E$Q@%@-JeU_S%j`^ud#PXyW6dDC`M|wk8FajxRr@uYA0SLv69OrOf~Z zM>l4^mUvGK!f^aGF7u-~>`(16Pl4a)h&?&Q4TARUwLj(X#GgKKyoy`7XU>aa_@0&3 z@RmR9^7LdJyFn`-c=xg|TAzV0k(7sdINF9~HdMKJrUk>wwou&rUAet$&+97p>S%!l z3DrSFFG0h-N6{isBF$&3Hr}?h|sv@3}jO41#baTVbE(@OMqnVl;Ygi{mXV1s{)} z{Ln&y5o6^prgcx-Lw20g@zV)nS8X1*xX8ndzTn}By`!R4+Dp6e?XCC z;GG~OBm^p;nj-TU^Cfi`TrMQRA`DhYjcg3B0mG`R%ru%F=aKLkId;%PCx1njy`W}> z1ou41;Q3Vio|=nlKkWXskxvvoH49~MzgiZQ*IQ&GXw>aW{$KqN16J<5IXbzvYHI28 z5{8%2h6AUv*AheZu{yD`_Sm%aoD&q7`Gg%Z9W}jYm)(U%;H$V^ay9}=w*T^E%PB<< z6EL$PLLU!NpYb55dD$N5dM((UMh1r2KG43#H?9dN4gRb|fplT5M59W^^8#mS(}z;S z3;nw!ziu#>bO&8-GoVf2s;m~5N#lvO_N+0T4P>y5h@ zFj}-y>FpGKPCtpBUkZ}E(6CJM-7$#$b$eOy?$t74ai$e%lZvYX34hhv>EtSD&Js?nQtD<~RQ)cO(5h}5N~7Rv*d zsdsnx^~%xqU{^5|)V`C@BHqSEEY1cT2P{ioUW&JSG(%%)UJvQ_k$)Vg-528hS43R0 zw*4}qZM7A6n zyI7~b=me6{hb{Y(d6L)8_|_MX1!+dr3F3YH2h5}b{pp0b9}%t)3cAEyDRYN&Ah*{d zVZc_Z_i|l9)Dv%ET`6yfTTZyJL--F;h)k$Q8My)m0~_@@m4Avf(zr9$yuo7{osx*2 z+9)gN9?;Syg2r(x_p9Y=Ar7k!A$n-MFr`;VmHmqh$jq^F<@`LqZzbi#y*st@8^n>*zW8MaPeQRgCALWQ&mi6H! zGYyCAq%_eT^j+N{v(ftWD${hU*SdOp+t>8|L}wa3CVQr0x+c6?EJL|{y2G;$wt4a* z8k@U`l*F!LB6oEA=60(gd*WyK561G_gtWAzD+hsOMoio|Lii<6=GLrD^wDa_q zhAvrE$M^w6f2aBn6AS(wN5w%ym;fdmLG>kF8E#=|nZ2C(>zB&3zzS0llR99j50zQk zpxN}7xY524r_f=rE0*zsG{&7EX4?;V_%1Gh59WDFf=Z~uA^6HHUcF&PvMzX@t{hCZ zH~MXkzn5a~L)szP&2(SO1WbM}mW0Zm`t$j|>0y|QnJm-I1PADU;J*;V4~!?+*x$+O zVS=4M-CPj{sCu^rUc|OvMJbI`wAbr(r_@I~H5imA0jN+%EBcGHXPE<*I>!47|Iw1; zJdVAmXJ)|dm$w6KMub6i$mS*)MP!KI&mc~U8Oiq|0ebH_rv3g7?~rQlXu#}?PvoOA z5bXR_8s@tGZSBS?-P~vT<=A4eMWT5{og&M}nCTZx4#PbhxLfb6-b4cL!FiW3aZu8b zekK*KPqQ!N2BX}(suE5&z;Z9dJt?ZRi6XlPl5u%816-jfCs@A~ht{QzG{#wodb}B0Xfr5$7BF-)SP!voyZQbdq84)HTr#+F`Du5{`K0N~ zUkS8~Vf43P)$qX_8G+G8x;D}e%3sQ~{rh-t0PP2Ml)eQqhUJ*-M4^S@4vrRFz&{Y) z*$}O#)L;Rcq9-*s^Fu&SDA(|Fyvp0zn!S=)npo3oOQ}PDt^Dr0?&f4yUsu!DlW+U$ zPk4-L*5}hRoovD;p$*p-RE9=N#^2KGW8&360k3n*Yf9^eH@cFo$0b2jO@Rn;$-(<5 zjUDLw`>!X7oytX2)?HFkz(d48!Xplba#NSSnQNf?E z!e%D4+;Z%Ln~>#be)L48Jsl2(;HSpM=R%=NMS%PT*W42w1;x+Vso<&0?8jU;93+;o zh|)PGP=@p0DE{!QL-ddt?c=4v(U%;lP4lz3dpw>=-Vm1Gc~jX)g(y zxFT)8gD23<;RE^45|T0oc?pHubvXYPJ>97`*$7AoeB*T!0~Rvdf5Q7WYa50QtlBgC z8>glq9f;J|z^^+XYrv{j(1xOF>Nr{W^bChGq6Q7oh;(PJ7S2?zue+Y$*w5fGpW8_c z=ez=wfGM|1Y zdlo@dmJbNA3KlDVWrGZUT|9bzaSa^avzHLg6eaz$$0aIE-1MT{V6c~4XRPdJcU_Bh@0^2?M^ZM z{7kc~e(qx^#{1DZT1@RLqe4bgLb&W-HNiTttxCF@$bfFo_fNOKuoD+6yIZLj_OSor z!Mu90`J8=~B0pN?6EwW1xVu)iTkKSb0&hzxpd6k-D>pWYuDBO8$#0H}0)_+Nz@?jR zB@c0@h_35;(DoB2{h#-{QW8@X^mqSNTmGMtMSRM$nRC!@zoju@KZy1u4&+fvs2u2b zoS*xb5MNvSF6`14DwK##Fov|A|Brw8Sg{Tp6m zZy{zcP9BbstDG9Wj@*L~F2Xa}z}0V3%HbY2Ckpf=y3bX7?2{hp{F;tjJYfR8=RO3R zUCh8_>ygqNZkF-;jPKv&be6cm-s~$`3S2@;zb**u@ArbR3_Q=5Zu(@iAMfa_rs}b} zy38vzONk#_;1YUjbc^Yxp76ITy2@6BITNh1l7?LcMzmE}*C=aiXXyHQNg76s%_gu< zDT+`b2pq5}{SKC%E=4e=wzPwC(7VcR=45xzqxQZYv{CCN^Koe^r)KLOK6ry-RH>mA zxgK#~#MpHojcIag6foK|;*WaN3#Dyrs5Fl?f}6EPzTW11^(mFxPLK9Tf_Z|ySqep^ zm6+ug9F%VW1^5FL;N0BkP>5Vw=VQC5^j((BVsE(5B>FU$F)}uN*-khHg%)p#IIt{1 z>dlwfrR#UMQ@kzfzDSeqdf2j`uz;|L$Px%iY$La=^)VmHF#u21E@HLIMy9+6mcj(l zkIzi{l0xoo_PobSjL@GwdzO{35)UE|kl>(2UC(o*uy6!NEVdD;RVD-7oQ{(d()FDb z14H4HpD97@i@yuo3YpK9JJNRdD6&3Q>W%FQ3dm^eHw`YwtV`ZZ4zd#Q7e;fHV?`zZ z#b%4e%L6=-u0k$u!lY}9028M92I+^`kAWL3>pp(gQxywfH?=*KkaZbl2s_g@HZB$^ zi$*tN??kG9?Nodx2{&4d4Kgs=`qbV&yM_AlS&pR4Q&+P|Bg47ao6WL*y4{X}1*3xn zcq%mmUtJHpKSOaK)sq|Dh*6a3_lWrwtqTrmNQn_+lU?6~VUll5&5upjdJZE}g2TcH z!btk{f;)2i8gZ3%tCy)_kr9Y~h})pFwAV@E-V&Z!y%GKu%bA6RijkVyZ{IR7K$E4R z#!OED56x7^hICx)NJAg)&_gdeIbYKxi4Ez zYPOPNr$U!_7Heh1_D|{8zo2PFmr`Fctd7htl)kTV2m7!UNxp@$NjTNKB zYFL7Ip8V|I zvc_|12n96`(xDnemk7orhP1c0bKKPkwQ#*u`fxfe#B`c^T1O?m zK_hx~&FXq~gW$4la?xlwVBDT8g@CBowy#d)2Pa7nL7=Pm()UD8!`@2f52TuE@$-IJ zgb*e72Ynp7p7LL%3?ue~nM5yJd6FYTUhD)7Q@!jEJ-wB4HJMyWxaq|@U;XpDWVPY0 zrH`|ry^yoMy&56jmh{eciBegOw;xqm_gB7CEFl1V2+>nsY@Ecj^aUme*8n8lK|Yl^ zPY=6G41{Vl13JP^P>g`RtK*XiuxV`g`NJ)zUgXQ+z%))$3;y(K++W!=d;|h@HG9e>)$8S)4^`Yyp=G(`ofi+l6zW0#vIYwa7?>gcx!%|S zILtqZdkE|t$;m2$6gauLz}|r+a%KiT4Z!{AVZy2<4<)t)z>ZI**1c;KNnCugAB8le ztCwk!*vIoer!KJ#w<_t{B|4*cy~zPRg3m0iEW9SBj?&Fq4! zef#JAcO{s))>Z^na3xIG@Ra4V->qkRwFo(|;znn;LF6$Y1PwE09R>O*+%vW}A{dl_ zIC>}_UmkrI+;|1J9%4OXKd)zMhr(pH)BWk83;-O&0p18RO!ingOBN<|D0i%^VJCN} ztnvdui5{$|sMv=*VW_=Bs$Fofn2iTAm4bfiZ|5{CS`zXn<`wTo(O!aWY+2Z;NS^-c zcVCBKOo>O&Yb(pmbjqk=-h&EY;6)?GelZY9;B}n2F5F%S#s-qWjfWbC_C^vn*O+Z* zn1LG{X2%N6SxBq8vSh38tS6zbb=LGK> zYn)RdDlizaBBZJS-DVBP{43-}jBh(0V%at-{^%6;$j&9=#V2dr=2x|NHFFQUM0TR; zN66s(TD0zdq=%!4Y5Eb|NZK(GKCAg;IrxmHZO^`R=nzCyx>B~Q(h`!j35V7O;>g_ru}AGt@r5*sF0C5*9Qk^fOCX=5W2 z>1`?QZ`SJ;3oj7Wf4^~23M|kb6h_eec-|8t!@%4f(Hhyx9p zu=W0wkf3pqB&X-s%}PV_h%@vs!-&>Eu4AcITUS2u@sp$QD({Tgk1r_%NR2vP#_n~^ z{amY?yoXXcck#Siqwmn{?1s#3G_sI0V%-mBG~iCw71WSQd*OOQXj}KiqqTyn&Bx*5 z{PGR0E-3T4oGW<|<Ko?7@|HV(3B-8iG~RLmO<5nv&UXUCS6SdnSM3+55@EG!Hl1 zF3ASI>T#}qm-2i;B~Lq~jGGwxD^{CVZFJ#*cZC5-^8V+eo21z|kAb{VR`tTz9*d%| z%sbMwI4jY!X@~v8!)lW&UgY^QxWxJAVXuO*u>4$DBE|rCtMXi`Wr7n=mj*t+-4g@B z2^ty-L5~QA(=-JYxD&7?x9FQdQRyt_Y@$6#rY>8ix!=@RI3N3j)j+1jJcs${TeP9y z1Z+ny#8yf=sQz7X1y4_u(So_~s}8X=)qVT^sA!ejgAsuvWo;D}k)>m_vYFscGoer- zCqcRc*$&T<_ua7@c8-o4af79bDWVUtSf^N>39|aETpm+}2$h=9eVlUEc68i+SB2iz zCaqZNyw^0vqt|F=e_P1wM)YMRHprxNuyk{Ca|GTsofkEqnY^4?efbMOEEV=E!0&zh zC@nGwH-85Q%P)kWyK5qk&>OY*;1#*U=*JE{sJ(h5p=)~kRrD7mIS?>8^u!?Y92@yw z21s(SSe3pp$SeVjo)xbOJ=A@h;8Cz=8YY+#T8&w^01b+V+#KM{5&+9rmS7P0uPY4b zJoOKY%X076i0HUP@e1pMz62ek#4K#4Vs}_ZF%S6N&@ZNqo$4MSTXs2|mTl&<{%#63 z&+qpM!6emLi=T|pPA8#FR97##|Fn8_&;diaUx;OBQopu;TqYR9%V1THi9FUlWoy%; zZ3W#!Ejz`?b_=8T9WjG`OOkkOOD&@?&eo0N*-ghAQo;bp9 z)Id<5&>w}!OVDhAZi-iK_rSpy^2&_*;ggzsBwAOE(|yE+x(2d}Ju<4QrPXLaFWRVi zO>U^^hDPN18x=fmGs0XrAVpVPsp7~kneG%>?TtU0KgBd9a{26yZa_fW`RP@5rS~-f zHs!}JhZ*ZkjEOi$7H}c-?t3Vtq={yhTU9}RiL(;fDqTk}`}LyN{rsV*V!z+2I+Q8N z!VERZiubf(^@3kMnJW1kI+haOf}kJSCUjuScKeDGgH-&%5-=;8u3bkXzY>zlPl${` zeB*Rmx|^&$=qK`iX&ch|x5CPQ?i1klt4^L3e5AcN5oBByNmL7L&!Xj}C(Pi^eUNKG zX1{>k6_+7KDto!V>7mB~O8{|?gVFrqS`r~Zf%SBf{B)^M2 zy3b$xBAUi4cS~3G+gOr!V|~8 z9}xyfkpaN`X-C94v!rAzfOJg$=wPY1#HsNZo*I|jZZ@2!c=dC)_-qq|r@~-z&QzN? zwVpTo+gL^G+thi%yzTl^xq4~KX+E@5>*h^CKUq1(Ct8dqFhzx&0@;XJN+Yl2Nreq5 zbUlsuYin=pREBT~R#uMub@MC zyLS=r5UiK|kjl^9|Fvu+!Ia`Yt0fPUi9BpBHt=#|ys&%pRsqKLW_+I~2I7spVka#z zh|Dt1)x4X}L1HXUQIlY)v~dSq2POwR%tPR^sH|2>Kh&fquur z@AbuJ!JodU;`VM|>su8Bi{*)_s=Kd^80x3D_Hy7xrVJK4Vmz0XqQwmB$zr?GL{|j2 zWYCn1EV6lK2CJy{^l4zka3`#gt@ylZ;E(|S&ii<-AAl(iah_9RS-Z8Jr7+0dkvK@r z?O=`kmXXO;$i9j6l_UK+;G?rYUgtg;O(4IIY(MH|XgKMqSE0*v6(>wMNj)9vx%m6n zAzb0+r|o)tF^EhxFp93*3d_S3MT{DOX%8IEHPgS!hxR?vw%7H4$XzPVjbs!E;>wNb z76W5Fv=tSoURnAqK8-d>>Mv}Y$UsZ_Zr!}G#K?K$-oe#tjHIX)ZRKJ41qC3psLXjQ zZQ60@6^Vc|1#&JO({raRolOW3Fs%y_n43SAmzo$7a^1*|-|wVDAOn%M9Q(ZPuI7xo zVi=gJ(ZX2%-(Jv6M!KM@GMt}*{;c>&5E~GQ z2|}pAZQoS1UhG`J4Hh;J2oD0kM+mTO*Xpl;X*kEyb@O|!qnA=T*Gt>a$;n{>bGLSK zQG?vWcs;$%^78y{VHu0~R^w$4GdmRHK0tJuF(><@!Q16czF-by-l>oo{>-STzq09M z=)NSp(;{{j(G1)shDVI4>65Ke-TZFa`wNSqMyspm8=w2R&94cj6;?(J#EsWI!g{sN z#qd9?R1PLq`OECnFhI-8fe59eGXs#NVg^E9`Zzt>6S=We6$H>}WtN6Kj9@S*4s@}s zvf||BmgZ*%G0R4O-$TMFCL|8IRmJI{g$AL^Mm5=(V~P)-xDZnKzQG7K z1%srv08kpp|Kn@>*P1XDlVN_>&4#V5xlNqB_c`kA_rp4UwVwZ~zIowN(>{`Ml5U%ZTE%f`F`dv_UP`HaY5A{ zg>Q7bug(su5bkZ`5$|c z>(#PKn|`4s0rtZ4SKmauG7oF%Kg`=r1{FRI4Z6Nq4Vyhz{l>X#`KYy&J*cFDk2r{v zszvB{+LXF3$|E?5u?wC8utwSa^?COhS;_43E2uzVk)V4V`ddR1>q>RU zf4wJHDK(DHCT2j=o$_Ba#eg5gV60CkI4nfc+@ASI_s`cl%6~Sphu;jR{mRFmNSxSr zJZeS1yS)dvV$+%;Jx`n z5K5gt?^nT?^U?imVMyK7AXd=D&k@NL&z#FajK+3vRDzqiCe2WxAnRY{P-0LPCJctX zLy)os1YuwauwLl+A_XM?!0>Ind>33r1*C4VY5c>5P0P$FDu>)2l?}S`Fl=w1Wx5nV zy*mICQKs$xb$lQRU)DTJ!N9z6f=btb<|euaiZFY-1BDoC(rT*lH9Nti-H5*_@1Nu|nX6w=2d<#=izVcWwm}G8H+|aTBVE`Pc29|4| z+7#lJPJp{ja)_!0*d+|N{n5Eht_czW$fllk#~3mZ4f#EHdyiGE(C1qaG05bz%P+wz zD7ev68+0yt6{qg3$dRNoQv#lttUWnx03KeN9ux3AIKL2onYp1=%@vCrGp&n&#ua`_ z_Tzb0`U}}k%F4>}#<~Hf9+&(U7-)iuMr813a~#0qg3&Cs)X|*Z)N}asMoYHsa z{ogfSnxD4pkx}k{%QQKE)TqhnS>Ea{@mFD&>zCV&19vNPk_whSlD)8QRyydr@ z4F_??CyArL^7TLGrtY7S$T*flT3(iyYmxNGD)(DC}UMpjCVsgT1e?>1%f zKFDY4@*HG7e~rLC`P);9OF;o1rRo13zY7~JoC|*RIhTb_)qJOi@+`8kcSEVseT5}Y zwt7(27cv?7jl6GSg2wERu;^LmlMi#dl)}|Bx5~V}h{XPe2kPpG)SD?m2crx;4>JXr zg@pydAl&K8OXDxJ7kTu9aOr^UVqgI2298I0dAa{uI)gBTE=%Hh5(Hm>^8HboCMKrT zNgfvX_y{Cuav~Rkihy>h&mc{a`P8wtfj2&GuXy*rd5k6i+6KTo%Xcy{-}JB>qBI0u z{agO%;knB;1zply?FK(-3&Q`I)v_lfAVbm0H_BbTx^%q9baH>>;a4}G4D1;F9ekW8 zT6cxkoaI1A)pTd^YUWvyassGu^kx5$dzd6vj{9lTXkYQu*Z11I^Mk{m!DLm%gClOSqm*$eo3Y) ziWeyHYWMsPx7PJ)-j@VTqff4$L);=ba0G2(SEi#*DDQ;P{38%pyA$rSrfshpCSqf8 z)cT6Wb{Z90FwjpCDS#Gyji&pofpDyyk{E^SJ3Dq!d8?s;0vg*?chtuNRF3KW7=&=z zHvQ|5GMM6u@6|JC#h??+q_T2~GAb%DZhNGGH2<0b5T71De$2(k*On&XH_0yk@$mij zR1Ji>E3LCFF3e19u6yuvnU0y?kGI^{DG%AKa$^jgKkK$Ev0OpFTWKm^Zv(pd`Xqx6mHNk26z{`T~F(9jwES!Au z{3S?Zv;k{Uc!3+3pqZ?*4l`R0{uXzP@rZi8bbFw>e-ZCsx7tg3GA#y<6hnp0T!5Tv zjzUw%JSzq(QdiOQ;3ftSfT(Eved2N5&@b``#&k!*i+$(0!IxB8BF%^gcL9Vd)oz{u zpI?)}(LrM?IyYz;iIG6g+sT9=Cir9jzbWBCDaG-~(1=gb%R#U=`dLoO2`< zkVuPE|KdOszzhq0oyTy=#L9`k#WBQuk-$6Q2lm79K|8DiDXkpvZdf5*_2|Ug{{f?_ zsMc$&-Q0vTj6N@r;$r>&MDL20+cfx13X4r^9x%D&%vS@K6SH(O73pMC=L=B*#Mn}f z<<_^82_mRrs7-&HAQI_=vT||~%F27e4Wz3U%d4x4bs*CE{9uXOa+J+0IC2C34a*lR zz3uP(?YEy)bcu~8xO+Jl&JRj4u-H2$`3_un-s-(f$?}dt5NWrTgsnx-IpYtqKQ0#0 z3v@Dlb}*-E@46u+m;%G2Jpw6Y3Lhg|20x2>YbW-Jl7{9g1uYzu8n_;N2vV7cG?rD! zih6Kks=lRATocVtQB;>+B7Ms?Tb1Dd&>CJ`P;k%LnlQM^75nXvQnN1*r8DeHrVF#4 zBJ^&>dxWL~pa?G+-Y|4c$cD%@E_5R~Lq zJE#T9V&V4!C>!Mi{T-6Lf21@RbTW%t+uIi!R5S;55ABhekWQCNoC|X>o^#Sqck%U{Gt2nO33q)*QDWSPf>*+#sZsgh+)t3o~s*> zOB~g~Hsoqx{*3$n&eWd4@cKbzP`83*18@4_*Xwz@@nUmU5O-C%MCtIh5a4J2!Jy!Z z^~|y|zxB*4AWY|JJdy)dSr%W#KWmvnL$hRA5(<6?Ib&6L3{aJBnn*dBn^}v{^Fn$2 zi1Ju!hOObDp8;{{1BV}O4C~&QOl~#I{u_&RKOt=a+K_h>LKrxY0&Ml^wLOgHNn`F8 z0Ve#=pa~t^;5v}j(>%MxWi>;a9qc!$B)2~ZR%tqLH3S2jhewGysP6AWFkbxa$4=_x z5_|jzW>a@E>YRFHTYq7am7V>44H<%QoUEG5LH#TPb8C!2H_ijwp~ce;{8$)Y2t1S2 z$`{w$j+ksj0{lmf_Um3hzB)247Sww%j4e5Wt0>{=MWn5&TmI_{@K#Pzmb= z*R5d{@4TSmuUIy;w!~2jWwY#Q`WrS8e`rL$Ci6!nnqhNbYh`g#VmG#5%DYXYv zVQ(?&TnQ3?Jjr{LEM5BJ;hOQ|35WH}<;*W2?54x#a7g8FFjhIxw-UQGNSaQR3pIVQ zhPQ<)enEE-u%%HR1VluJx7QbyI~7xt>=yyBdv#}iD>UF&))zF;kYCxQ# zg4FY%&!yxhbtfFVq@pj7v88fPCdbtE+_5+~b_E?)^W8RfgIY=G2@+3=Ttwtx08o%E zbtpCi!Th19+w;SPP0TL|X!-BLyv1&63Bsf1CEZh*=;hN7-7Y8M^-cGJtHHM8AXo2~ z@5Ez|q=8FYIagEbm`3HTG?)(vcch>zU@@Zx2(QcxT|xLU$heL+`YW&mFZ)rtM8msE zLy0>^^@D-I7yk>a%hYAM$bYDNIyeR*oU*cM78$WjN`E{~9qF!$v9FpJ!)_3-x7BSD z{fd^n^%?zjniD&*vCN9hP$A2|IQAhd4K1y$>u*?XQ&U=E#4TLmHh+13&99K7x}eabEU36Q*Zj|66Q=FRXh2d>Gf1XsmrV8LgI z_OvH1DdkU4R%FDHPdzw#jd~xn5sx?^{dbpri97|tkw4l4PeNRG`1D>T=0|&+uLBN@ z?)do?025@Ky3bGAN|`K0BAP2yJ1s?gk}8%uiPFs@kryL*Idp(eE`2O<@#{+)%hrX_ zObqJ+_;X8kk4cMpn#EDI$Le@rKiF&!IL&8x?Tn~}eX4MiDx;KE(c%f^NQpB<%t~=G zKtG;5m*aWuEH4iu8&Zgdeh#dhm-RnKqwSp1s{=7;xYMlFsYB#32w&d^9!Gx!&adX~ zW^FF`evVPIGd$iJEo@QXtoJWDL$vMup5u53eIGoM^7}WBe&ao6?=++OtKFKm_zdQR zlXf-|a@4nzbMCdZ)R~G>3E&h%yn%!jTalZULSO1Z_}}`gc^fVcI=LX5j?zZp9(EM z<5RG~I-iA8z1Gmi!P0^xOt>~{uwSG_Qcgl<90Y;qVmZp#Ru<-A*C{Vm%U^O3m|Z83 zPjOCjFURs<-Is!Q%(vWm{E$54rWi664Um*E5u8JbK~!I&Aq^!+nHH=;3WDu7$C{h; zsN%(XgR`ZcqE#9O2109VYp^hh2KIl%?H}BIz42n~>X0gDZV#FrmZ%JwUEjZ!O8hdgK#yNT!d`pHeG# zL}KVG@fP24*>Rx>5@3<2EDozurhmki!U+W#4Ljj)Mx}otzED;;)cps%l%uGMCq{ZZ zAR|Rsc6Urpw81&8mXqrV{He~RUE9)j)<)4{U<5{& z&t;$X>|zw?wRbC2L`({~)A7FWaCuK6W(XW8$*?We-I_hv2?h9;;q?xuR^%C(mc<5= z_`2SIh(9w{>7U!(0OLgOlEv#G^{`FazVDNEnj@i4eh^U*o2%(Wsp91RmK@7^`f9N{ zzrhvfEqzXvE15L05{(}H*`nNX@cW;+N#r7ql<)OKY4nCpl-UZuVA}r~))7T~&PY+! zNjJ>;?OoWnjd`qmI2bo~k3aw=n-NScnvV{F-;SS)f@bzU#_6Hzo>&VP>KS+iUi;_r zQZ7}LM{lYCRGi}i4AN{E+m9M&;0ck-!krVR)Q3xD$D& zNe|6cOl}4s1T=-~%$Z-F>>$d$0S^~#)}MeQnq64e{Gf!I+Q>tcH#Rd&oR+-g2E|Hiw3M&NWzS zXV1&e2Z778i*wLx2w3%04h){=b``AmxY7F*=HSi^S4U!Ks!lK?^xWOxwa<#n#SzMZ z4iNCnYS~qk3;cfds)(vSK4kMY@xlY6#WQt$&tZ`G@M9_r#v&35>lO)y$twtlz?kCc zpHV{4=&z|mFsxPSt_QX|IR8!P8w_~`ue6ROJUuji^@A+0sH7AubwC)q z!<)Joi4^M}*%8?vh9G$un=qMG3H$v}!VsT2Q|xU~oR(2`%(y-Su8PM|)(L1cf`Sjq z5#9VMthNagf2lEaF|dt6JJyTpm8`LT`{X}7SznU5^qV()qeV)smPHr(hwo!ND!Us- zPAis|*3wcQ5x3n)X~Ki;w&65WnnOteNE>DV_%)O6J8C! z)TD{V(*Y;@L>IyK@Fvz{7)AQk^R7qC7iRcVETTz~{*AK!?&!3`J^x*@9SUL)?8#uR zaV-L=3;m)uFKbe#j2rJ^lW@I8JbS)PoPAV3>vgrm#ltP>WL&N&C!>dm1$8SRp@q9a z<4__wwWXzn+kUatxyL-HTg@f$OwBRXw0lTNJR&xhfXEYwEVf7t(*Jtxh0fSh;4}@d z2lUEA0f@L@^=0#PAG*n@Pq7_lKy-OgAI?8sFxAkI{2uEX7m4P_mhM5~zFjZ7qxUWR zLwo?04yr4r!Xi${1&lP%yE>u_jIu-*yG(VT>*&=m;jl6Bcr-kr z2H71sW6G}|=qEaEN%R#Ge!ZH!1(}9rkm}Qewg1XA#Jj9Dx3%T0e<9SYh>i>L#GK_rHcG}|NryeN7q zApSqQ80Cnslb6lCeZ*cgiy}-d>v;dv|BWjq&~B{8qk_lu7`uXa0wFG2AWR#0hjUDU zMh<6{gJF{UEG_}~oTM9?(Xt_n6Dkv{#6?^CV8p$j3%jW<<4OoTsnKw?q{rpl-XN?1 zd!S|iT;Z@}>NoOnok5#-F&@3iBE;}W3gsdl0reP{_|C+gnhcTUm>0X+_47MH&7N zLx3Ot^1*SMnuZ3d$Bm@^7XCff_}Am^RDmG{4cp@e`h%Wyt#$xK*mg{FlSIyzWb_>c ze0HaP;Mej#x${31UVHZ>QHxADvD$02$D|?1eBwJFNiz!zwf-4C3K3^)_fyKo&r0G5 zci>~5XMMyPh-fj@>y>yjY=9(F<9BuPt+tUOtNwcMsWHDSMN4JLXRbTFz2_^-7?ssb zzL8sxy2P|~1~=zFNjebguhJnDEaS?oaiy5-g>W;FkVE5RHIOuB+qV_*rZ_g~b2i>aU}!{Gv5bnC_I$ zO?Rs_o9-^@20;nw?hauCl1d|`k|HG?A|WlHAdQp~o9?@|zjMxa@5iwIa4_`U?^<)t zXFg%-&a-yYOT13=?*DLLlde!HFl%M0hZVK%WZm~oU~8{pel~R>0DklroONW^%qs9n zj3hMcBxlB_A)V#FAbu)SN4Mw8%zR!~!Nc;g2l42~6bvHVMim^up=JvI z#++UHDCl+Vrg_qs&rSM`>5#I%K1p6)p8Hn5Uz1rZyjdd7cK9P?Jr_2+{=F5$e=i6( z_@Y$ouDPUn{8P(P7JYA5=g)9ut4qRtO38QAo%fskVG&75xG>XR0gW!Oi+Bk|UQ5nyQs^hPy&5YM8>{0`FV1Vg9#E^Kyi?6)>ndSm$f zFS1*07_kWz&ES(-C%SX8CybsZC&ekI@JaBS3Q%R2Hlhu%4hWHDvfAF-(ixViXnu>z z^l1QFo40xLEb=$B+30Bf31*U50_O&+;iWhd)dus=YkCPD1jiThb{M+j8}>+($E#tc z!!vx+7?_h-Af|f3HZAghSVK`LDGxS1X#66q4ZiQzfA6%!MnPPj|k?Qo=wT|rqtemzW`L7K%N%?`<>%2m~I%&Z7nGrB-r_pXYh-)wO30EA2ZVN z#)!kO`kNr3Gv$ns`QN&cb9c?OVb@zylmgb>Ww%|IzuyQtj?pS8E5CSLj_0r%8t*^ zNpQv8t;oshy6qqtO3!(A7*n6z^@m59*>)1kMA%JN)M=lNPKmwLoi$zyRZn-S3nu13B?GuLe)G${%6z=C zUaBGys=By{MCjM=a)*5%aP;^ktrT+9K$}nIT%GRvQUCO~-My^*%))xIw3E@;9_@o4~S({G+i}=CY8w&pzrt-pj;qJZF7@@xhGB>taLf_6(AYI@1~%P zmkffKF`;ZWmW)H`kIeEL=~+znoZ_Tqm=zX6 zC9|cJ6+B;tY*X@plT>7}m2Z0{xLlDqwmo={zWd z7QTTdA)Mc3#OiBwTmRD3{m8xImW$n3AqWhVdS+xES6|sB%JQ0|t zHNPUi*@uPo{9*Mq-u1`Zy8*_{+ z0z1JgnhSepmM4LEJ*LuRvsXuvsg>oHiA z_BSQMp4@9|^gHM9c4D5i7d`tMZ6>HNeJn<-ai@z|=gpdWyVSL7`_0sd|9QUO(ZH6K z^$*xc-HQV#OF!F+@ol{o@A<^WoEj7b1x3LB&>BI(`J0t{S%`lz+hA_#=-eM*c`z4C z*P|w;PvysTO`o!edD?n6REG4iYY8NVUH&b*tys?$w8L<5ahXvDK2p-QzDZtp$2$KjD_Q_=@@gZGIacNForXI}X zuZ}L8$TXND7wBkA{QNNGDEl@<7SEN|GZV4Si|6#QFltya^Uo2e3J;iZIS^K7Pd=E& z_@>dk3+sB$*BEO0uIHg@*ND>pC1vH`#AzMzA9inO#zJ(-GHkga4lt-Tu6jDJ6ty>Lsv-5d?8`W^P)1IJKk# zNC2Dim_HGzeAPvxXH;DihLJaWrs4>9a?M{>tO)dg#fLaDigslhNfOQO@qB}=r z=qjEi;(W>DdhNnsvgmI(7@@z`pGU#|JFg``D{1cJ_`BS3Ds8mfrpi?E3>O0j#9agR z9>td(@MNB6^l;zz;!Tog`iC8WOgaErFM2(wEgsMXgST4UhcT?5Z zTy3BrnlM>=95_?@|8Gu^m6i2B|K+!!3Pm*T`}C(oPeYv9SZUt$F?^IJ5D;ICeIYEi zdKXvVb{O1xyHswD zK#m^)0m0wjbOP=SckuC`qg8Qf7ra={nh?|a$u6>>-VFHTJ)NZvswA|pULB*`0(Up( z68v<7G9I*meNE_luv87z1I_E*zhxG}y3DGitPCA^`KqX>$hbR^O5TDv1#%Pwv~Swd z(>+QS$0G@X2GH$jAUX3>QSe*#a;B$e$V?Feeprz)rSUnhlL|A>#q#dRyy9d6l1KK; z+smDoXU43yZYL}3)^Y8eAtqsT4ek^kQ3;>eKhWN;Zct$ygsVg=(<_+F|&vuZ%sswp;PLVt>N; zD}prSsqg84d!FQ)%Oi26rd);6%Mn9&6WP47Sg(R1K7c*0nk6`Wy| zx-Fj;oRRjYw9%maT^pXy>33VYO%=_NxKBPfP=F3y%9z>&$tqcC`XNlxJa+MP{O~xc^cZUmV)AUs8j=jY zuAR8x7=9%MV7=)0DU|3$HP%jA6=L>y1v<`Mr>=dqh1X(gjcng&`1 zZd=Utog+>%9b=D<9Brw5Ys(jjOa?P5VRDa3ILu2h^1Z)Sw}|j z#`ksG(5SDvja96W{Zt_cTw)#dx01Ao_jS(oHU z(vS~lZUcc`PyXONi}83FstVul|JKlk*OiaV;Ezk&5cO15P%w)5PF%suByvU`pu^Na_?77GVCR@|2Y z4<9;<9DM7#rQ4^IK(*Re?bjyut})weU80>&3?XhCX=}DC#CGxG?^)5+7jQ3P@=lxk za}WkgrV)Af|JO2R7sYXn7f5kK{&4Zv_NRT2RG`xee-kG?%0p-E^qi0x*OAhst!H!= z^Y>Y3oi|>1OjKAQ0Uf3$Z$666IyH*KxjSG~^bT=TYZd6aAI67wm{G<}k3Rq`!nUze zd)j_yiKEU>>UHh4-~R3_O@xe}VpyP-CHtOaJ~<>WNB`J3Y~eueb^6)M8AZAf z#7EK48&N*Dnie zr|V&bAu$l64?Wsu&2}TRbO_geP>}f$BH9A~tAIu6y9nPAU-K;>#T4|tiK=UAQVt1; z3Vd+_c~H8svAMoEx7%*g)?L0Duiu>J zuiGt!9c}L2_jW0mNSz+qVZQ?8xYTsQfOKh)vm3KulDo&sCy3vaQc%};9GR9G|EV^<5HM=Rz!I`hQGbidEU2${ ziKa;_5ku1-3F-bsRYBHZ35$SYd6QBJ_ODgeSgzn#gZ|`0+2Tj47(*GlfeB^tHc~SzcQC-QGCUDS*L;WvSfU<^_+aA_P+h|ucOqBs0~^=MXI^iSzf%J zre=n?A`~K$=YPB|{=NuXaHHuG_Uw&uO4k(Rdhf3Gp9ckr%7G+y_%AQK7hFEy07|gisR|-_g!WOAVQHw z;Lna=cs?=QF76>=*J6<7CrnGzb@w`tEd7X?w-~&-L65`^vlazW!Bz2&l|p~t6A!L( zl#^l-2b~kmx1se8PeRDgI)NumbXpmZX^pQD=+p2ABrk}fcaJ?bw!BVxeVx0101bUH zEfsRP#gK*shQIEi?zp3DzXiX1VfVG1g>vk}MqK7V~FQJvIJ**Ca$Nnt7Pukbcw^z<E-rd?PP#2i z>QEu|O#4jEsU+Z&;OevexT7{#c@7@JYr%S16kuwaK@f17T+-ez&YW)Gj{T%(N*!I_ zk66UvIa4|5xA8o;#J0R-i_EIrI8VMmH%R9?43fIUA+*jIrVBId4I-k9d_w8L{qb*x zxj)~l16Og`!H?#&6fsL?6mR3jnqrY9m`HU83!JPEY^)2hG|#8T#pRACZzPx^3j5)W ze44F34nHP40XyE6!I}t2*bqRrdJ$Bs?XE^?)%VHoKvhi%6hi(m(Ux?MMa)^gRmAF| zI1@I8xrR7s(gVGMXtOoM4R;^?j-ozS65834dcKYe+I|SWM!M7#1%o#uoL#aN7Ik%LS4_&=AlJ045bbZLA0T@@gge zK-78VLi9R8*NmW_h#;MW=e~c>tps!9cbTy7?tUY1SZ*e8h!Y96it7;LX1DwccR$y{ z{m>_Hj{{0@wnom<3Gbi$!I{<`iu1v-e&B_yPaoEyPt^g6pg1^E57M8ddY3k}k-s;p z{vvh07lh&_ahX>RC$O#%US)FfAc*O6dZ3*)`;eq?d3)M7{^FUM}hiQ{>KGI`mDkgHcKQBxohkoxq)4vUU1`*2k} z8YJAV2nUnSaNe!Bm;51F(`)WpF{wAMrnNh?6XQXyhIL1}j6zf#RlA!68SDd!PlEB{ z$ta5a2&_4M6Z^?%uBtYo8uVxh=}2NMYsn9)u?^7ZSVVphp}3GT9%1@CNk#AiIDi*e z^AjHJy^>SDIn%D1kd~~}RE6W$ED&!#CkWvHN^y(~*}rx$XAf{7HT>lMq7f789-a|q zu7yd!H~=CB?$W;1MWT9N{J5w&8)NZ{zG)G()z!4GUqws)v0(nUBGrO2`-bvU1fX9k zlF4`q+taA3ND|Rjq+?Gd{+1d$jT?R_@I*sVZq3j$H9W_gfmJ!!k01RxEYUe(@X$6V z6b4m;a8WM#tec{?eNZZ@Sq!-OOnUz!evv|#P zjEyTTr^gY|>k_pLmjX%7Q2~)S{li2U4C=83({_4be8GgZ3=G?^r>elMkR@~=9@|Q#?tOPXd7Jgb_(s@8{p14E9HuHz+Tpw}2YB4M8~+q<6V;`KPf&XEWsj)gIa;S7m+ zXZC%H8+M)t8jk&exs~6mF@P>ct|Ry>MG5Yqdcp|2US>odHByAkG=rbMq#^NO7Xv&Y zJ;1LP`ixDwaj)Bkfz8@bAn;R}L>#EyU?V?`otG4TXorbN8jGY={ja0AK8Q1vV{m;C z**JMJOQ$#12M^);K(@6O9);7X%O$2}@k(@V%{fDIPU=p3iqj)4^D%M)nT!m*^&6Z& z5+A_yXCP~f{rdR`yQmb&KZY8$$=BaH-H(vtIUbNHj)(rXLqIDU_x~N3qeSXmvOeQ9A z0mhhwnGxI=zno7tG8y=c zX7J(g|22FJm0ra$G3W@&;?Zg-2cUaC$q(zl?1S8e2ko~ik2QO&EB&}U%s%{>4wIeZ zyA&`Qp~7PxU(xBWDp0@Rq{Vana#y4j{FxnzP*M!H3nV+iUke4`oE^t|9JxRjmMMumQr9Dp)coa%4zw=rSt=?c}Wkm-%iL5!; znUEhWn20~L6E(^8-BGDNbJpjA{=fr$QKEOHi;8&6T79Bd?JWd+mbzobDl+{(#HYt| zF*a|FmsgL6g*=QX;=s|e0SSFAEuxEn6ZdylV)%V+=evR^n?S@uOk;UtH22}x;o-=R z(uY~KKf=$UcPJ07@{_ByJL9pZ3w!#h9t!SEZrQVq`ID1Ca;p^D$5&4RXXe&eJY2cv zsyvgm0yn56g^tPEFMeNNEN36r2Q2ViTwD}2HfA_b;7w~Hj`sVBE?kg>C9mVofsjuF zaSvx12{m#I+qr5$oVe)$cb9%N8L(pK=)4Hz3%*6sv9OrtzyHRF3=F!I%l_E?NPLX& z-iFWfXJ-G8_-(kIgiU)O?EYMgHs3$97H7$pLVLark7fQv-WoslV^-?=-&)770yXU~PZ37Fbl~cT=rXR<;rNDf zQHoa8_35R3e?d|_msfzDc?rt8uW6O_ezBZ2UaBG5j0j4_IM>$8&*DNF_wrUCtTo`& zY2*b+58n0A8r2?|3Vapsc_V$(87Y-oNwT}sT9^#Gno;Uq)y%@miSc7^|@oveBV-W(QKQ>-&En7u1+R=A+ zN931LS%qAZP3cV`7IdWP&N{DCgl)#hq%Lj`LYJR)WN_NuMf{SMjBKkT3?JnWXD&pg zDn#DdwU0lCccH6gA#c9Vn5j|JTw}^{3&7X^vIGbmu3I5@BUX2j)zYqt94_@@GJ;0U`Ll*&2W2=WilHBKQ!I6?lIAhXxf&wL`4fe{jWcdj);(zm>iTRlwyJK zS?4SPgcYdm#XQ!~K#nsJ9SN=(rX!C@JvslkKte*vE1q)6Gs$x3ZQ^K@c6&S~eON@_ zV8EA;{ue_Ohi90D*3+~3hlg-kJSl&*58lUk!!w<|%Bh_bAk@CHD9@9^PFD5H;jxIjthz3x9(FCp|2EG|p)AWPy zYrA3&!i+J@g4pdHw!XsG2)=7*d)-_dskic6ipG`>rVMM{&G=5~0^(B8D^Eh7ch1in z6(HXm=(L%yia?r1i5@e;+DaMry|k$YXNM|A4_;pvwP80eAPsCMJ=@gavXNNSHt&yG zj611SM$sgD4Fo)O#dmZuhyIecNgR8$@f-YpJrOYPP~B@OLH5$(S@fe!QEe^*5hMyz z#01yEz*n%owpK+-pAD{6I`~vy&qZ(0 zvlyB1HHZ_<)8hO|j&(sgA3~lQNDe(|yka@S`|ooNL)?Ve+t+_rb0}Nd0(z#FNWKVn z)_D@V@`R0`AR$;J*Mdz)QDyp+h_#>17Pg~^wt}MaNY|F&OXxp7RZge2Rcf%#wenxV z6_p4an*^>FG;UWTmRtte+eFX_EY`ML_U)YMi1AZ6+^y4-J)zS9#F#0|%yd+P@2Kor z+*>aZFVp>m5hBt?_Sv`U>@I2kEu&r_d2cZ~!N>B+DI1GsSy$22RP^?KBqt}Q5JS%y zHa0TyiVlCM?ap}{XDBY9UG4XXkFftnOqgANKNTf3wC(Go)5f5OE{l)w=pR!dcGWGH zSdRXh}y}0W-SbRhtG1}!x zglO%Ps46#}AAv<-d_#i}Ck*go%zpBozgfoXKDa;eyYV_SUVQkRYri8*93u&jX0COS z(~jOB=S6T6j&rsCYAX7CdD2_tGi9VB@=jytYI6z_dR_jYvOPJI<+sXKJs-x6?3!PY zx#%H%G~N_{^>6X|GFavNj~^zXY%6JQR3Q|m@dBke0!otBUD8>M3{X)H9xf$MHEJLPV-jam8ZLF(m>wSHn)&{{wDt0$_HH3K ztmsoUKD$<)f_$GYxM9_G)t)~Wx3yg-3K1ng!XEm{&ymr^EGDP#^)N{)$8vLH=#`$g zN^#oDH?QCDsUpSwx9;JQ2^9NovLtQ!R3G>ZB$+( z9Rh`lcPsSoB0n|bkkhO2Nbz?y70m%jFo&a;pTqObvdHRM9IXg0f8}=@m&Iv&ueG_h zYUffZw74gN$q^Kjftc-73>QM94Kl#WnvCWnMz6RA7AF(lAp&(0H~?vDZ-~gzE7CD| zz~Z;NFU(eTj}EaV@qpMqXCZJkH5Zp4_w!n6jKs_84x8tD zm=7hwa(*ODG{U|Z&;`08G<<^$#^UIG!(wQ&W5pm4Afn8!P9^mw|7FyyGeJeI!d_e1 zUas6+bNkr9sn(p-?bsq?-E_yKV`)ucWv5WnQPyephe1H70Je^p%?$pS3d}r0TC+il ziZP--yBTdtpv(QAed50^m-vnNPdw5LWDhE}>-efSIMTWA>Rf7ZlKkTT7}yNCk!5+d z@v8fB7SBn?!|!C<*@iF^b~>00Ku=8lI>T3$+PKJQp&B55)AwZ$Loc+X`fb{62CONOtY(EVA>zX!Vn*E^U4YmgOHz>v0q>75{EfN>ijerW%(r zG$Ylv->6lb-d)1F1{`0cD7Bx`Bu+4&bFW|}NI^f-21+|Zbs98qq;#6pqzvPtA&;H= zyC$5|HcmNz-}!OfeULv9ysrL%MTnn0Mf?-wWnF?w7+qb>i?GB%M#X3}JInrk;J296 z++|64{8fn(eXg6MlKKmy&-`DLa88&HUsvIXs~>(3Attl+gNjI94Vsq(&AmF&HDdqm zUtiuKSaCa$JgFe^A7ZWU=kS3PDa^xfy^zB%pYMCt`GHlWc2^|Tct^y}Lo3G}5ar2S zBi)7p2{^;g1^sHYqh$c@i?9=_&TEgy1k|~VqAcc#ye5Y|0#Z>C5fR{I@poR708`nW zh1B>rcbdf$&cC--;kGAa|3;xf7zDvzqkcpENdW?s!WG-4H5~}w7m!S*3VrvEA5g`C z2SgUY@C_4AMdGWNF6)4kon`rZ76_VQ$cA%~LnX7NE_!NKh1?A>neDV#NBSc&TLmYz zd?S*F&mKM6<*7>FswmbKv+BUPeHEa4b09}E;Z6Rv8Z+`3IZ46V5v`8VI87_n-L|Us zL2_{9w2z4v@ur%Cx_Y$lOjXi1-8 zlUXA4w%YEry3(o)6>2_@sjAMdY+iJ@b#U3i(pSe6O$g+b6vD{;(OOygA-%-y-F+np z-3a;TFYw9*CsiF>FUA*hBGpdF)dXrWXU$1Q_g)> zRp;5IcZM*bJlA35k&RhXTbapqe(}nlvizVJnBBGmkTfv^7$hlI=Lvze9(W)YW2b6R zo_@;wHD(7nrAuLQnB!&mr3QIxw5m)iZN!B|i4@R$S3U6n zY{#{QnB}$6p@$ZHmkd0-yhq)rgyBj?-!1R5fB(o{3ipx$IVA)m#z9Ip*$EH#X`pIb zH%7P?LHCxniQkrz=V>@QB@_2tv%lWOKgoHghzK48>r2Ype}zT5D22DWx>_^V41)abM%`ka?U z&n8%}Dgn{<@u$aXjsFags)<7kO7zrEbj{wYKzC`LzuoAY<- zM=`pnm)4GGzzxg9=wuSDGN7=<;&zU}xxfBV4`_fV5ZAboTmIGR(Z4Yyfa*NS4g<;pzI^b8$~$E`3l7yaMD zAi@S_iN5pYFc{!Bjqq5s8FUVwAn1iB7%W|*Lqkdm3M^oizq-FeNLWbZe-+y^&5uGK zns&=nuv_(6gA@pbR#(W;xG_O4M1XZyz1`+V-hKP^Vsv;>+w&KuqCS4_EEzlb;=fvTzJr@i_#9Qt&+-{_ z)jL!n+=vOZ?j9?2W(u;ih4*#Z(dBvjBTxy4z;0P|RCdsT8rGfZ_K2v(%$OIQXBqS0q;LET6^2o2p(14 zqh0UdkT+I!7^0mnMD~vShL^%Xq2W<0rF& z^UD^NQe~dpw6^&b`;vOP0`GaV)G$zWrKM*?PP1z@lZ1H3Y(y#Tr6eWwwFex#&sq3= zG8_E#n=tGGHPpPx+|^$)iKJp|<>be4<%gPqQW*4|SMGalS130U<{Rn}e5k0NIY+3Hy40jg2ipy!<}Y{1X8r82;GOe_cxQ?1skwqAI)0 zB|-uBwf6%-cTtO+l)0acj+Q+n{GAC#j$!fIU6%2uZ<>3ShN#3^TX(s0Y;u;mL0fjG z`DK3I7%GE^G8MS`vNK)bu)WL~Sd<`s{c1x#8*!%tixhC_CqbV(4;Yx8=$6Jq-)_kB zUKP!JH%vN(knL6Wq>b8wT$N{SrocjG?i;7aq~Rmf9YYyo#+7tr$^m2$w|Cmp{Zl55 z!8#vHlRsu@>jv)4q0BXx%-EeJVC~2PpbmEx%o6noPY=tnbMvje6vR~Trtx&V;8)eH z>+A=U-DRN=I`AkukQ45AJ_`(S;^HRh=;*wREYTw+%}z4l;MCK;mQ7T9uVels`Q;y! z=;*=j;UzMf=D&m4$JwhN1Ekj;o}TEZY5(RMVE4*$7Y$)v3oP3^gZpThB!YEFU+)*H z2q4WL8GUt*q&Rmw$qrf>oXtHUL0)-T8$sX|0Psh~-DbOn0=t|};L`h#IuRlZm-P$` zoZVYQSJbdt#>z0@Y=FIWVYtJpV1Jd0&63EH)G+=P6Fw6Dx->Db0D~B;QSM7>(_ypi zf###qT&xh@wR4tpQQldw>#QvNkcl4CoA$f zR}(XC*wsNl`=$?P^tD$JTI8+5(3C>q+i00CnVBbZO(cHi&MJ8xC6{Pojwex+><)I^Y=g4s1dF+}mU$ZmJ0%Ku_DPD1hc z4gh2W+26=iw6vboR!Ip93tt@e5efq0neT|Milva-qUa(JCsA_Lh4*!PC z(^NeG!hZJL%8a-}aa>|dX#YK4kXVSoSx&Soy{xp{=p!TLZCsv5lyT3lS>4}3%AuF( zq`VqoXFif}Fe5;ZeKdkzD?;-2u@j^kYd=+Kcf1@d2%@{cbRn31@e{+@3{wG;qUfQD z?WEuf$_3&_>jReaiD;+uw8rluzRGYpW4HtFeDAlV8KAMn=u00t~m;Uz?i2){}ZpX0WnilQR}(fEN)of8}=|_sS`0x3(R3hPT2{6!AHc(6?gKy=mWN> zhn4|WhhN#hBOodC@S#srmu_Vt;q*CT_hwdUz(o~EWLdsGe#=3vl_#0-k{P&n{!Yo< z6SkQRg4q3>uC=}zowKJ8I6GCZ1q-$Zn{9?Q7HtJqLD$STEzdh>85mg~lWBhYwksji zdf@YmIRt7tSXQ;bfj13&>k*JPpcSYH7p5`8dXIqgn3ylA27;OP$p0Y|I1&6e%ew^HxuE z;KKDK_n{-##!QvI?f8fDgJlYumd<#+)w$T_W)VKCP9Ciab9z<9*;*@@R=)TuP}%Xm z2XcB0KGBHpA|!R+beaxaADne`un8dyD-my{QU~HQFmTsu9rXcxX^JDW9S44fjA;KhHhGQUR5(HJZ?#7bx@IFC6C1Y3$duCN2>Bs z!SV1!o5TU0xld+-6#X^w)0voJcL6L-bUn|AcBb6m7}Fo2-LXxeUCY_U{B*7BbDsMYRTQDm7x1g^wi9OQf{G2}ES)Zu z2^(F;S1V1TZyO9TFGIQh)JlKai?xcLlfp>pkES}V3q2+c#c=J?1b~=n8%)7hw;a2LKOl}-bc*F6M zD%=Y`K)OL*Bv4zY5q{Lfcyf9&*<}?L3_k)^LfKZqk)_T*nP=@KS0t_n(g_b*Wwxmq zY@?p%4!%!s!4GrW*LSnfdp=i#&yLAnADY+(!VcnkXEi+u)Kpc6a7!t-3}>AUHz%EY z2L{kTKK<59VHK?V#P5IFgr|tHu(f}*9LXR?jFi{$DIIYu z=We%?TCLed`#g6m?H2YzFxj=cnWim z7`Xr5PH-IOVpz6FAB5ODI%dBLHXsV&z?L>h0Cs9ea+At=8Yi-xuYy@vy9e3-hz-R7 z8=V=JOx{Z(8dmIe{ix!_UsKA zM)Sn4V)8ll7_Z||c;t}R8M+yeCeASnuqKa5n8LmVbWF58#LGyKa*07j9+J9w5aDD~ zG4x>eI?nB=0u3CZ@~fWnm3IhQW6nA5C%d+F(bzCM9n+<%Am(LYjjsaxtqt6F#^l1L$DDBbhD)3baLM-;4!E!h}Wlr-afu!U^98KyQOmHW< z+!co1iP0|wam?1gty7={FWlhum+5H|AUFR{Z`9``u-Khy^A5_gTN<}2^zb7Q6&b#l zI`>V$4JkRFRWfoZ+sa%`$Yf20#;8mQtm&6S^0LZZF^~I-yCs?Kp=<-CE?ki4ZxDX} z*M#Xh(;yN)^G+Pcgf|xq4o{v4!;g|e)8%+TVJDXi&=TqVZ?(+4}VDa_hB(~5Frca4XK6|RnMs3?s72YljGb4I@ zJgQvurH&M86+v%%6+!L0tq~?Ie!Qx78Ji#SCBXkqBhv>(HZqMcCQuEUe)x#PBwhoa z#;@_}H+`&sHj;wa6~k1IvL(V_5Bxha$3ABSdta2I@)dN&M=nNsKEU_U^5}FIW=5z{ zg0FTeHnS?8b%Zhg8KPXRy>3tRB;35#S?D543c2beG0>eFm)CHp2Q3z4F9^ z=-&&we7VRyo(!8&@P>%u&;{ZX(@^SGdJvy7z4hl8medRUwwg*5dq(`z$Z5IArlPZN z!tT%sk6MCCe~Z7TobI#7=1(6{F|h~KuPs)L7dR{I7FGWDc(cr488NWwSLJwIBvZ(Wk~txIn!Oy z7=9pLFQg+DM;?fW9Uysx6hH4tukC_t!d#Z^7%*N^!o-rEtaPW5_}}ysEkQfie0XDR z9wh;>^?OOe4c|lXv|l463bB`|6V*KFPd9#}R#C}llxTRaZr~fYAh8jI*GsNBUpv+o z!bA%WJJN^(U;IWhRzgcO6|rXm(ee65H_qGYTQ zLtjaT)qL?~-*ynnxhxX9{AH^}_;&yxR}DM~GI^I@?VlDKZf-}kCqCc8;sxp1KQv~m zK--_5ah$Zgmht4lGZ> zHI5|3FkNTU=NSg$eC#|+3P}eW~n2Xv`Y+h@aypZAR?6ygpOZ8Okz|0^+hb2i7K-m@|_-J|UcAOWAAvt|nSbX=^iYHfmg6zv^vt+#eEe6!6GML?Lbq z(>gcYNgv*8{LRaY?g_W|OkUy0b?KWRXkna58-|9eKT*y+y}&KLDoo7|(K4oJ#xE;D zir!$7C2qJ%rQOtwW(_0r$qZJBdba+ygoOe7hvj6v7miHoCmLW~u;Q@G@c(($P**o> zzP)?AnYFp_0y>xjJtcM&x4ck?8hu)cT9d-WGH0UjZ3oIi8*aG|6t;T}d>4ZthWIF>h!D0M0Oc<-as0q` zxCGXZ*3aHQQbGhq0f$ z^y$5J4jojw{K`h&WupFyiLMo8^PYN%)xGY6R3=R$ae00;rsKmu0@dcp<$MdXv5hro z-`YkAJx8k8uHKPq+O*9P`Tt&QrO*i5PBEc26pNTLnpH+D8Q zjI69IENtwwFc3@M=Y&Jeepy7r;LRLe@SHz{OC7tyRB8T9FQ5R2GvJDJKwDjxqq>0e zK~}yVPe`KP>N3`?Hc3%fuXmU@gE_gJ_ifD6>5ia%az?rq>-Bre=f8Nq17tPsX$B^%5m z4{;__LJuGN#lETMWr-Dr|9pri|8F!lh9B_^pbxC+nDPt^lW~vmj&$9hqO%b=#ruDp zOAF@7#FbdmgA;d=tu`gqIU6?Pqyt8lQQt^k66^n>=bvKSgs(0xzAg*m>F38MC&y$a z^VTf2B!|RlTW`kx%@Kbgh5^fubwgE75Q-Z^RVp1R^4Jz~=Mg`LBx~I&7u$h%bUs_( zf!SqQ>sASSA+XWq8h4>UuF&VtLt3f0mjm$$9|eMrsGVLcL`iGs4dh>or?#{u5E}hY z>D6$Mg^L28&`JSm=`PTGWM&#_oycw#k0(J%(_s{e(DV!i$dLzV0n>x+pE@wG8ZurU z_9v1(aY%O_Helerd2MFSlr#*?-K$%1?3MxOJ`BK@&iNvzIHk&20EPe4~O zhIu1hr67eX?ry80`c9%L*s6F0H6Xv6n>ub#pwIl~;&A&0y{>GDtC_%Jwh{ zG}rZBCK=TQ-af^n6hrRv-sK%8|9MUudDanIWC4>U>&K(jawu~>mu(2q!~z3F72y>= zP28rl@XBawlECAK%GNqWz|L7muUD!Y5wwK3{2s}{WzQu^^Mtoi>8cXb8pR_QB@R07r2-e^&kBPTX-%({^Y*sSd*x0h;#GSG{ zrjLpDLHbMo=q(3^&&C&iCCDOp>go|0c&ml(l-8_iYY|nX6$h&IdwHaLDJu1A;iTL# zAH;YDOjmE;*nel_%=(+1DNAQ!9?BCFMUk4yM5~r)|9;D7Hnm}+?>nJDBRZdChHZt; z;P*$ckcNPEO**Tr?{WbK`<^ybv$vcBOG$d>foPOi$9`uRy|&?aS;4@nFZwM?F;%Yz zBUNreT72DkY(*6+?Fp~-eZTqt^^#yfg zjoY50#-_Z9<-1ib*(*BQ77NA+#LJI%iyFi|*zAQN+ld;AHYPta^P`bOmWtIRKZ_VD z*(e)a5u|+R0|1C$$#4AVyT^L4BV>Dkj6=@Xmq0|#?!N-f1s0$j3J`R3^sgf$@>*Ic z9GCuO+sxG^+ogFM@>r@+(h^vUe|kti?m8Q`!!QdZ6xc78v0OTVQUAYIQBXftAoQg` z^$V=WZ&CIsRXyNMq}Ti-)C7OKSOy}vH|0A>J(e^Jtma66l4q2PR5r75ez0&z9tMT( zuNjq6K7v$X05+Jqr-(mQvY#wiF{Q2Sp1v_|3q-|$<0a7;oq7Sv<$#P5 zlqeIqWe}yjr&}JfQd7Zm-XUrzb#9-AQ=3E|$aI~CxmM89(>H_eNB6h>`y7rw^QZvR z7lqMz4t(Q$$jQV{Vg6#98?<09VSmaPjHv|+mpOzS)y3y*9O$$Y= zaCBQ^I?CgJx?t^Y=wgoPD10bDQkrXD~o zH+_Pc9!x9dk5;c+|F7NT|G#zOZYf5^8Jfzj&PWml2&dUvR!%Uc>K_| zm^V`!KB&biNX2=484(Q!qOUXH3-vBRILkf|A^MIuZMo$%eF3LMjhFeIL?5$1eEFRp z?+gvS3n&U}t!@dQW>hdQ+3{t=J~+xCXl6?|fY2oVa~^$nmU>e@)N z8`Y_}3@VI&COK76s4Zs2e=EN)zR&w5c5t+gDm0Z*)kX1fWF}?{%(bOWadNHALv0}b z)UA_$3tVp`9FrJViVW{jlIEoFXByh~e+e;@5)f+L#Cu$6vCXTISx=3o^icNt9oq1> zZrLx}!qmGyxSImlPW42|>ay|iLkRLb9ShWugIaWxPelJgIYXhSbA#5CT0y|XQ{ z-_q-vn)~4;I*}IN;T4(Z-%Xcbc!b&oujD`CB7+yK_JYJamp~mR=bsc}wpjF^QdYwW zib~fjxkqH2w7tI5Zr&>=_V`7gBC6>;bb!-UBPAQvGIPOv!|oqm6XAoX&ZW>j9nn@n z^QOg`mmdwxwA=N?Gx6KE@Tmk#jeS~#Ss9HmE+5Dd&fPQ68)TWwVb@ViHqN!Ud-K`f z95c(8sk8Ni?oKUJ)Fesg>SN_$qt{Eqz4FCbpU(@uEO|n-u;bs|CG%|Hbt6iVc&eiD zwpS&qAxN2$xWC|X2g+BG4{v%)@x-?C2tt|?v`4pX)Vl_uMqw+sQ`^Swf5li`jzlU| zk4RDo6|5r?GvTRj+^AAAc9c_;AQJ!a*9fDzbQU>W`fi*O03n&o3?h5J&9ew>@J zs(6wUACdNAb$SLJgvA6iyyU!8nIi0;NgAqFM}yx^b=w>l)fr0!;G~zN=gq#^>Ptkb zq4`1`Pa~x${A;!Iowg7OFWR^Qlr8!y_?{?7{^GWu;{^W)rDtShw43m(2(mmD@?rARHPaf;)2Ly+wcLrJ!wo5Cd>{Nw zHtPq-$9oT^aw}lU9u|+sBDMty8Oonoz}bMh<<;=`;^%NT?M=Q!zlzI<#u216-<;N* zbiEM!VOARvR)<+x<*8t<9e#1Z_Mei`puSOeFN6&e5)#rgILMa-=g5nPb0EEN2`Q#P zNJ(^EOzy`9B?D?`)+9Dan-F-x{boLZ=l#Q?RSLXVj!XRrA|qS=vLZizqm zb!>eO_~ZX}CbexQ4ScP^X)Ox8=6zgZGCDjmL05XISNO*%WwJRIRtF9fO?ES`#M6lj zpv=5!_x?TPulJ1z=X$ha?g}w6G@SO;9OsNt3?GfvN#t?4?_)5H*r{W#dkn_KIBFNdmVBujrow zXI{zF(Fv2q9X%|G516P5+>h%z< zx~5$-ORXy~5wiaxCa^!>-q~AfdDjw3Bx&H$9? zU_=7W-dsTVF%|FP!eai#@rKLc>6|Z7$G%-wZZ1<*tA{(8AxDa^s3?_%g@yC0SD_Il z;(IbftszmVo$iX;JF}PSHGb=iCnp5v4$p`J{@f`jD2OCjOh3ny7L&CkT3u#<93z_< zcO@5p#b*p|36e$^PuJG>iC|V_^pf6~{Sz-*Chc8^U8!-TyZSmABP(ZNdaOx)J>OWJ z^b%|07p(fS6b+lbC6Oqu!&Av%-1Xeewtdx*%CfrbxPQ$p|2~A2c2w9}0t@Unl%`Ke z%6$6p2mv++T|-tCAo8FuDk)idNe@!_y?evBOYAx2(~a7`lpLJLk>7>%KQ=^oLZrVu zFMksXTKlL+V52Fq$JbAc5p7mMx!9bjZG{Jq*)%x&a$LD&+9b}BDz*c$Ev}VNEZRgO zD8ISr(#B`2=jmRCT2TulVY7dTM)%N=_Uc)o3L7aBN-RbrAtB*^AktdmN>%xypHL&S znY^7{0{}Z#Lx^+Yn{oF$)2H;&XVPJyy>FFQxnWKUa2EU2W6k&_ApAO_vN?VuAN=JF zaWA3J=*&pY;}r9O_fBFiYxE}s_?;f{f16YO=&L-EM9|)wx)=p2)0>l`&z_+_6u;xk z6FAV-f(bLvC-!L!(X)ZgcqVb{F8Z~4uomnIC@hemQ5%ntd7v=3oz+EEEWccONi$)i z+8Csj_`w58c~rgPApdb;xnSEa?SgpOYQTkMnn6Us0$W{8-p7M5a_qvEMYz7ucj}R1 zT}3wUjqANdWos#7N>;J}?G47wZ8jC`7_IY~O@A(T$Ak>#`XV*?gzCd=?SAvpXR0M- zv21q{uS(z`e3104gN6`Iw~d_Ba~cA#}qz)Ij% zhe|Z9_*S+pND|%{|4R3Kq7+o7cd8;PHNy?9)f@9wlwBtdfdYP8A0C=5)}v_h+nNh9 z517fkv2Gtm%UCSx`g6aUw}f#XeoWwVzQr@Hr86;{uVmG6K(aBMj|GyMj`E_AIlZ6` zWsBX`_W-R<6)-i;Hu_Q_5D3dS&oQwxP0&f}(P+aQ0Ox94?~k@U{<0%nXL;yoeO{-+ zLQu%=glx;%B7on;jp)!%Hr2M;FU6G>Q+-YN@+D-p$&V@% zEDuj}Av@gOXIR;OzjT%7ZdffRC}jVO_DyJX%cs>3E)T_;W+cVJVGP<79D{CuXH-l z-RM{pk^|#qUt=&qBybb3oXDoWr8D`D*Z#3{gGdpgb!)Vz*&hp74RdinZ65E#6E=qDbQ6Q#~qLFj-mhz1c(ml9hZqbtqKj7f?UZqQAu*B~R_4mDHih zB1%Rr#NNl_XcOTi_fHu)L+qY3(K!ozpFyhh{}n+PY1?@D)5nudCiNa~<68Nn>tuIX zmzS4Gh^f)Bo>6UVYyue73Y0jSD3 zk0XEF$;u1tZfdc?aqhsJw7|8ayW?;gblMhg4aq8Ha55^OBS>iOB<7SPAa*{$d1pM- zDbXHgx9^ITb9b&~{?*5R`MfxxMZdSPmC>7zLu?wk@hcVsIM4Yx#;JW-vn;3?@66X2 zvf0??X}_7SAMqPxLDYGN$UcO|XJc98$nbEo)%GMe`$JD^FB*w`a_(zff76Y7Ea(1c zR(bG#y!$)maXDy!BEv7CzR|?w;J(5m#i}s=W+Fc=Ly*T>D5ol`kaFP3qLmD{_EKgZ zo5CWc!!pc#+BPyP|G#lN7IcbBmP^i;OEzwsBNzbd?vQD|EaIp{roYElG+k{quJrRY zcNFFLKY8KJ0r^=RG$`|%8d!yJny!{8E{{g5`+x!Ob)1YpI~5{+WjRR;+6owLqpBt| z|GT&kprwa8wf10WpGWR4aJf;#m40*!md)rTN8Fr@Y8iq=PE<6sRp0S#K$fjl$P!cy zeCN(>v=Ef=+zydA&Fm>;98hdkp2O5Mqoob&($^S8=y{fn{=$aASV7&>XT5))?%Owy z$yx_KpL2$ACCw*IKd(yXi$gAMt39$S-7dML{LAi%_&oc?qgV8h$Foe2@RSk>|M6$s zk=9TqNYK?A1+JhsxeMAVv(ku{j-h1F_$&v&1SaNy;zPs`2f(XH(g?j}|h>E79+4Vi7zsh^v)VR(AZ_U8t;N%RZVkfq= zvZ>&T;hf~K&xHGM{gy^wN!3pror(#X~BvbTrTE4GLzunHa(N}X`j6?JoaVKS;_P| zx;h*6pZWf)Yv04K>)cU*Zi1yCPW0l=Mwo%E|hp%ot!<4*49 ztt|gZ1UQ{E$-^O{^Dr%Ad{RL{om`9TX`N%^t&LoT3vX3sMAvqK3ZsvvjOM(%pxLSq z)GW0R`>pz_jDFHu-xkv)M{Yz}-)=9s=M(!6RoX|58#Y*rJMQiPZP2|OR=p`CbVwaqQaV)2aOz{@Rm>#;g zRB`0wU(<-oo3dYOb6%;i4tERoV*QpbW4a;+vyQcO0pO@J0CPkOz5;$e=YL^OKsM`` zsdNB#9|QDtv$Yj(@{4|0wVySneYK+i&{8A-)FN51NLTf`G2JT4j{^lZW&?yIPU%8o zZD=^-j-JsEs9id#%v2{;X50IYHtJ8`jwN99O4~J4i}~Qb=QBjvb@Fvy=@6f7xW1Dz zE`p60M_gef@b64zyy;Sb<_X?e=a3yFs^LP3oko=$us*^fh1(@zw_#6qlzc+$*2__r z96$pynRPvASPm+oCwyBt^(`>BgW5NIWS~!)0)0|*5N(ORWI%p_3E3+}FFytu_WAB1 zL#v%A=THlUJMd+zc!k6`(t+!8B~!dayPLNSM0O&jYbNPBRAX{SItn=PIM8>g@MKJO zR#AS&2ow_RQ@qzX6%gR?`oB@SIBA7df`yjui)gOxK*nm{qMbok9E9&i(2qA11v`t7o~ zWaIKKBl_bn&R)?FMzuk@sh71gSRfc3qxhpv~ z{CM=A{I1dmV}_g}B9!k;e^q{|YPa&UGH&p|@+Hb?;o5adt1`z>(tH==&&rN)ZPu~0 zs$qnw-Y~0s_QgkRh*+c6MaC2u-W(c`jA!N{n9KXY)0bj4*e0>}z#PAhfSy$ZN+;?E zUE?u{I(_Q7d=TMU_Q7gcMR( z2x0v9c>||o3(v$X*Eg%y+ZzZ=<(!>4%A9sxwr1~g8#XDiUs3ZvX=omIy|8vsITzUU z&+;;hMJHzajnt&&dzVxaboy2-ckF7O8~YNHefu*Mu`w2h4oMPtcBn=#>CQ-LAcBpJ zFK=m?$bsPD=3|F0ubavhTD4cm83B+7r57`I+XoK>1S@fL2a4>sV92=<1_1H7kgdVeNw{OG3;&OK(+5HOirMe$pSi#LcqugGb zIO*&ijt({>{JQt-<`HyHZf_)?PdK~|_+!QcfBd!2|8)0LGxRGh95ycdeLCGYY;eQ4`Te_-@qSt#Qm6;iq54XP@eI8`fx$N9I1RPq9$U+B zFGls=Y&)nkRqz2NjjXCWpgNNH)@+H`N!1a&V-krbW!*X`Gv>)=qsPc z*^qFiuOp(30(vv6uA4%`YJ17pY$>$tZXd9=Uhesmx{KU`8iuH-&SSY3;a&XtIZb}o zr8n8~NS>V9UE%T^%LL{}hcp}|D}r&d?Ld4O>#hkkSiJ=>9WSd(wfiS~`B4VtkUWca zWh6!P_hJ6aJR>JUz#v51%1xj;I_|oxwb=k_D#p8i!m4ejkQ!>wiy56BYTC{Y=!2@k zf@`+`y@qbidYOCm-M#1H!mOWm3nx83`F=QZ;_??UnEmxzS*x=$!j<2Dob$T$f@*a)51JUqmc9T}NjUJf zH-8Wrvj3?uFM)wPE^G49O2M;;-RIPyoJ7@;wplMC-<4h1xuP%Nbl=)COur*NuUZ*+c`F>M?$^sQ1 zBjs$ZgQ)-I*WY*;kgr=JZA4#b7m5s;EpFQiYn(T^zJKRgWN`^8N~MyLYGiV8533EK z;5BKAEbM@0v-(9ue-UwtRI>(~Scy?R3ayZR z$Sou}7P3kK?Iy`{?De%ROc<+`ajidISX@q5iV0TLtM-TApEjY4 zQk8XFq(|{vj?e><4})K*mi$DJl_Czd@Ha1!4pC+if;3V{0_uU=)`H>bPu!?mmKrEoaufyZorH(aO%n!sIRh`C!v?|V+7}% zYOvbRUi6*qg zBfssYW4}oI;?8`XAzu6}moETs!~bsd33ujq)`V{!1o_;n+CxP3!`4$1Mq;tT~g0@r7Qt=*$oy%D`Vz2D_b zJs4koekBfJigeFOPl*U0!lsrIXi4l;*9LmlS2M9AMOu)m?z+bSsatc;?HW7Zo1+S$ zaHlgMSJ%GX539Sltd^;?nlP=Y^$jN|RaaAAz56Jb_EpjQ_pROCRP|?j-H`11<$(DK z9iwk7CO#)!U+F}J+j3u8J`Wvtn$B-ZdCm-S&N9B-Fu>lIcdUI75pyJu{TxeEv!fG! z-?Ve-;FB^5uP^0tWc+a=J^knK&e-~oX&?RQ%V*rXn4}Y^$^sytb2dd{FCeEO4 zA1)fNAs3>8Z}?t9o@j2k-PPsr5G3g+$ZBIZz;70Iwoq6F)r}jyslwv2+pc&d1w4DX zqTfBhY7C1}1`TG}cZAZ<@CT`y+`c>Ie2*~Ax+*18*e_UH#Y(HQUegtN}%bnwzXyA=eWX1B=SS* zJ^tSZb4`AN5o81|0<_Q%#!3(MK*+z@<4T1S{T*R3}@=zGfuQFdkd6{n9M zvODd2p%9%eL8Wd`-W|l+ePE~sfkL56!mN83see!1`{xLkL?RQjg-GM0sw6PZfa_2k zPo)YyQxa=sYJ)&s1XLbb^@crC+0@HbDK-Vt*#rW>evnkjYNIbeFfVWr7VZz7*@$U~ z*a}gMYTGQTh&d<;WA^I_0wutj&k*vc*KyVW(zvgYx zih)RvZzr@UGOvwgQc}!facT7eVE`NZI8oCkWo^$Msq{tEk(AC|&&t`oqji`hspyBS zw2R+cGt9(SV;_q`WPIXUMqr*U(;_sfb9m0fJVaD%;$r)WRB^njFShdVG2sQj$*dajxdBNc@w} zE_AlM#z8uIYnDTkG#iqyZ~@pA{0??6uX_k*gISGtr46qtLI2dAU%6kcf7aUDvC9olhB2Vo|K!Nvi=y3|1{6onK440e|C0$$= zjtg|UVm>HZWra2NOr3?wy2fJ(1UZANT$K9#Dz!(3ku#yX)YGcWhiCxUCSQzC%j6^T zYZ&ZC{i%4QLz^63)C#-@tTU3h31`0!gucCrN)U$A&k;jt-mpAC@Z;;Dyr39(Bmu_b zA>XpFAT-RB%x?w*PbQn3B=g!rAS7*&{-xKJZ%1E2jqNg}c>K9;hI!kvGd+hsJgay$ zQ)$}h1M*{QCiUj}LFqZ>%FEBMdbSVMp+0O-c)da@Gxj1pMBSieu3Zn>IYS14#IXi2 zDu2$I4*wLlzOGy{QOWrw<0g1`nLUz7qBMU4Y{OyY>ZEhu5>@)G#5449o!_x>lSxgI zw{G=AicbR@VDy*Vln3(oeP_gl9LJwz<&=7lczh`OiEq`V`TA=N&$-e8(twoDsl8u) zLJSK2_v=8$QamD}u%aR=$DJJubH_+u37;Cb--NN*wZYlfahAI&bA~m#bfarL?UVM$ z{FY1H`1H~kexaJO6G8dIRr4xUD3rooTLO-xKKO47>#2=cd8$aV({MiF8z}JNBf8uz z(IgeEQAyOOA|t!Z2U+Npy=klPz0(KR5JG0&(j7|HN1@iAuAm=ec+}4kWF6jaq$yR` zxm6pIa2BK>Dj~_%sx2A=IbWreO$8IooLlTKCW(39a($euiwmo};urZG_$Ht1=H`Z& zjI8}Ns1T-L8v?S}YQl_;Ku{sK8g#>_E9x&h54Mf~a^wgQ_QkV1JKX6j%fMq?W_X0K z{d;RNQ2#@xBkRmS5zq@Zh{#S*Bqr$rObg5Gk1TcOlZBNjJi|tp`(0W&aqr%ABlMbe zmKtR{rPZhWRHqudBhRVD_wO(Lep+Xye*SFr+`?YceNTo~8Z)Ldt;Ds;@;5uZv^(aN z68pi~sq!O@vYJL@$fKEdi_;nyVwgc8hP8(hbh_ST2s#(IFC)Et~baI}&`I@5yu>rFiL}IRpCKr6~z1e*LPPXQuH> zK-`5N49oGoLrj8IVB0s1@<_B-Sx1&d4J|2X$PK*qn-memPd&wGp0rK3kbgXT7>*ky zEB6ZoU;g0#`M-Np13!Eq;kjk}Vj4{GixI!b3X0ytp0MbPGpx540WU$f)!Fx{ z)o+V&GPl@Z5hU0j+;=YW6Zz6pynk=IF&dza(W|`c6EmEv z5zahfmvHZgdx&t3L+xSeGUG=YkJ<4PQY)n9Q~ROs3h9I~cVtLGU(-G0GAiIdE%n{B zhQ8mx!KyulLCkrD`lD$xh83A0=-og#3nfju(Wg@mHa;0MDVg`~8rz_URH8t>@BjfI z093*ckokwW&_r-w<|3B9ep*>}SAf{t4=O;6jM8n0j?l5Xmwri`l^I(ACBAS}s?^Ce zpPJ!B)vI1*uJ{z5RCsaDex^m*bL5?SeF1a+mfA8>k05^LJY*U>``mq)oA%naz z1G4!bunO1xys!A~^9-v8hhY@^Z4vXXdkg?pO`r+Tv-?ZVWD@jgKgTO%Cy+<+4I z=c8G}D?t3C%IBlpdnr3_0Bi|`lL1DN1l5-vNIS?e*yL!la1~Z%X%k;N&f5j!NydE$Vc7XzzQF6E zsPRY$_Xuz0t1Yz>&3_A%nClk)^jD|HFQ&ny+CDW*Bc3kK!Nc|Uf`KI*LeUY?tw_zP zQ~Q3?HDP}W5A0F$0qo%J-|JO0_zniR0IqOW|FSvafv2~)daigY&2N&F?>)n@9WV-q zJQptJ-+yKwYRePQy2z^Bsq|~BrON8wfpYhY;-a4o#wHHqF9K7V-CL8thPnLUJg&fj zCclzPd~^K6XtHQK%rxH?VcNb{tk=ABrdwdKoKyL1-(NvVq0ixa19B)Eqe*1=4X8Pa zvjKL^jBuh}&^p06Hkj*MT4X1urx&X}GJc$Ii1|##yWDd)3OFV$$Jr_(kYL-AC!ERu zY)az0;TKxHwepq=BXxe;E7U5N@gW>Ra8%q*Akq|m$`6&m$r&LuckSr%xZiT}Q-tFLX^V zrpres*!!FYit}6PVQb*i+}zxbE$dt&YMu0Cfdy3G8Kg`F+($AU6|~I^OyGZcQ528G zwZhn^6AmT+6qgza9nnol%y|8Xne8(7m22>3@?D6Z&-Pmoj3LB7gx{--zMvREPKx2B z)XzG$dFf?mILrBkyDBiQ@*P@IV5Ja~2%QQK`cbgon)J6_FbjAygKwU;6$bw6bKoWa zkLia$nq6L3drNj;Q0C5$k9+)|zjW?i$2nhI7?sU5kbR~q?h5?UK2)YX=4F}{ClTHKrJ}DYfVO6NOY$lNV7$BW)B=npV7@R*J z9xdiz2N$3Tc+1++zPhm@UM9hY+!L*lsBamZAW~ITwWOmBwcu(i&r4TR2DW!#p;nri zpGnC)TOXHc|Jg}VYXnl}w3j*9AT9zfhK|qGzCR?dyK1ip8I~#{E0ALR>NdtJ>0A4#M4EXk3XYDcR5NTr#Iu zn+t4VZ-=3?^_|`nbV&^&pJU3OwWRad|7sKZ55{K=2_-<>4e$||E6&_W4U4? z>G?wQxiicueF8{3q9v>x96r37FWA`J?CrJ$N9fN`yUz)+sikG!#S9yp5I#zf+`-{- zSXe5N@m%8qn@d=B61uIyH?NZp?1`5$EhWc~EC2N1IL>{AeE3pr-g@*kt=3$eec(xW zmEOAfSb-6>fCXk~batp*eo^k99#u=UdQ(^z;yPDgL&BU~;*=pM)=w!H3>Ob9x&g8* z4*wL-Y1yG<0b>tjW6HjYkw*^q_H~5RJSoEt8)7FkP!uF{m@A+McBQ#Rr-_jP7e`l( zy{mxD8OwLmFQ`$E%e(6aBrC1Q@IQ{(vH zztM=v>5*>Kj*c!Cad9I@$1}vB6;0@{@jqLW9SgXXuI8kEL;InC*4OEhBbxl%hJ{%c z1HGF9q?8R}zxe=QruQY)xl`ZksXz_NKgs1leSob9>&cTiVcny}l6W}wDQA*T$MY8o zyw^#MKYi?+18}?J#Kpp23BY`07rx zLJK>+*AAZXD-=Q_G)avho~{-HvMGm$KYw@#3XEjG=a_Vg97AKr2Fr)@?_W(mKcQ}H z*k5iwtkz-u{XUIP_r)SaRbSE!?~;2H6GX_zRwTVd*d+3Mc@2>wvr0&N7dzVk zPmb4w5g?uy7NFf)=o;3m9rnma-j6F3^H*oTnsk5IQzR?{Y};xzmm_UJX-Aiar4veO67Gi+UpocxK|BUsqZSQtEuRw;T&C>X)KY-eLuB|pAI}Z z2H_qGZT@UMs{RrOjl3k zEtwVNJYfJhI=d`E<;Ie=iZiw`8);fb`r<8&!MFiV5x^)DVscGrndE$1Yuj#6W>}A- z{@C6MsL#`?-Gpssiiz5Fr(i^LRs1KCk|9M z#2pj)v!Z{=U&Us<4zhY5xr|RILzW+G-}Nv%3`da4vM;MM4H`gW%kzZ!ht+VTyCtki ze_PaQ?)~oMCo7^eda>wbkh#-$O6PTANR?t>aBy&<;H6MA*^=4GfZyJLj6g!3C6<$g z5cv}wU0oJ1l}QxJBmGh^5*sANV9I`#YrSqAwL0R)%5^a`PLPWZ`Mx9SHNUOYE^0?MAc)Ys5Ko(#FxV~D3K|kpEO{3k9Gpz%H-r{I8liB@ z1K=CIpScgKW@l$DENx?FJRu7wA@{|cPw>C(iNDsT^R#HibpmQOdaL&X-3u8ZGE4V~h8_h2%Hf&**K$c_6P!4eaXs zSSfx{y>pfAQj}CM{Twuhrk*7v*rnkq?S|_ePN{R=c|&@5r#Vc&@rHfn@nxmcBM}ZgCO#Je=RA!tS423l> zQH}lafgGE{^%g-+Rcd6H-f2ViN|DOTj?hrG-~cy~MaqDyPv;1)csCqw(}V?0UdeAU zW549URgn)eLw(hdm#|6_@o0jW%{P=qfS)u%=hH*h%O_av4fKEe-3qYmxY|Gu-^}}K z!%BNDde{IMeSa9PTDE&*jlI0}t=$Cc0TyQgv-xQ8Urh~AJrZyjF9Y1C9G;fN=|D$h zB2hP>8-Gh!*i9j1)S;#PDJcedUtR|j_q`6^cMy@SC!BM>`tDtIcv>IoA3rrMVZM?U zQEXCC#c{3uG42(uutSJ?YDFYL?fkt*%Fhjpm;IQeTYJM{N;-@cCR z>%&mx{UQF$A}&@GR58}?)rDdKt5+QIr17>gzaxKR5k^Ss@bmpGv44T>QqmKCh)FR% zKw~N@_<$zDQcHu~mXe?ULC_u<+J=<>>uZU+n(G6B7jvVnK+x@cIxcP8SFLMOQYDVrtth{yo-R8XcK$vac3d#v)C;O^AN;qfkEr`ii`_m-F70b`OXqgsyPjyTp#60$aKsPvyQe zd%jZCl^BQJq8@%UbWa1fInWZ_dxd3|mtxrVFkCQP{`CtnQg`_THyP^Q^Vjk4RMK$r z!Xe+UKNyUPKbD-MCiu$`rxT$i9CHw3_ylnXUv@brYLPuej|NaK$gLcb9 zF>DECJS>^TT)Gs@f|WjN$ny~|0C?l;H8M|y#l^+lfTt8+Pam<3?bgUF%tLU96A>O6 zq3ESR4!=P)w|5GA3NHIbgy3YQJJlMmQHV~`GsJql%f_TFHOMf@Sf+QiF@*C`RrSyg=w-cl;wBREVGEznSFE0QhRj_-pva1s} z@>SBFd4Moyj0^TV-xdQcm~z*#Hm-0%+CzX)%P9JEG_fiZxjL0if z^`Pem;L=B6i|KWD!ME2K!_+DCrN32T(0VpuW?lRnI9OK~gO7Sqw(RlA_u=L`E= zYSr&TgrRNC%`d|(`uQxXL!N_KooeBWKH+%wH>Jk+&2KZCtiobz+!jgIp}$;J8W1X~ z7OJ%z0Y%TJMPu@^nprNLU0vIOd4Q@)KRh3`hh?RW5?iXUNdn|xtU$tuX1=&|s9=~mc97lAM{WvC6 z#R16Ly7hG$8xJp4>v9i~89J6`4Bn~cCY4Xal`iVh@0wS$!P*hP4_L-N?X;Tw{?+bi zbieJ&r;0jctKP2n!J$`612yO$w*GFIC{g2JJjf3<^1i&ZAv&5juu4vYYIGm5|->cbj{BRmwy-eI?lYBUf~IQq%KgH z{pu0tk-NWA*T*2*18G_2P(#qwnAl3Kz-1T!`}$Upym-ahbd2|Kd*5M~E5!c_K{lg!;1`IS^d z5fUcJg4zj@@-d!}%Z9gG`K3*fLqd_O+w2WRpx_pr4n6B&b7{n<7G!{R4YqMu_-SS} zq5~SG6EKA?2ZPHsKFgHRni`9nn-R&$cYhtxLVWWOH)VXABJG} z-&<*@Y?zRrJ!BfA>mosMj)+pQR-!$MocDV+_Le}H?g!tU#L*yr3&HE)J9{XBnKFt` zev`_gNTH(4YcsJ>stm;A=o|#SIQQcK({TWc8fuabeLS~+3LB16_*Y3dPZsgUNVN3ELMNMEsvt8#2+?d|4yX+HSd{6@REmg6jU)9&JQ z!psUl+(#ocn%$%AWS`f$W&O%2R||+`#$SX3kko2vFDnQPnPFM7jPjN~>RH z@qaM^Gd6padgPu|D3_n3AlD1aR<_Lde9!V1b^vMe%Tu-BtWo zimme3PBG;5i1#fCZ37m6Sd5(frdjf!+P_6tl&4(eN8g z>^(yzD)1~+OW#RiGD2IACub6%>)}LK+jxH+_BX|WU!UrV2T@dnrKhKN=!p)-0j`ZJ z43n3+BI*9Ox6Ur^Z@y-uMStgZ`BMeuHExV)?;f=5|A+=mx@1VoG2%0&& zPbb+(gsAY6Yl~%Ey%_RSPycs4-tx$iJ4wpti6IwiHtzEt)zADcYpCCiD~%2L=&J0y zq4ZK7nCqZHkM???5_UKvorn1>0_yx#}R5w*rR25a8lQxW!EhI4Vb?JHS>SMtAS2=mj z8fqGDHzTlBwUizy(UQ7;iZ?L~)Fs%ptN23R!-xLBH82^UiBt2UD4Q!dbg=njBw{s* zkCmsMh3&kDbX+yadE+`h^Q=(~y7D>>m01x*H6F7l0x`H`jJjyGiT_NHu4YD(^#L1w z?G#)y!@?BnZ$HZS7Tz=JvclyEPmXiK)OGwBz*T_mtEuKZ{t>;}FEGCgJXao^x2HM# z{hFeV8~kaR8TlZz>@~f-IQOO3HAev>t{SfT!u~c9o*atnN8)t#BTm zwqFw=!}etV$hthiV8hVSzx|*~lNfh!;H=Yk`17&ZTg|7-`Ef%vyRsT{Hj$0v#OIQU z@EsAZR{I%JV-FNwarLUJV4B<8!DrWd%584$TVt(NR^2Owf*B8WbxFtVUn=>P=k(z) ztCZ=OeW1Z4WMme}^PgW?r)p^%q5X|TpxhWbp#3@4p!SM$ecfzkaeTMl@=f%4>+2Bp zkV_Gg?Lyf-+6VE%5m4w(prD|g6BR!Z(dxOC*1 zQNDF5#=957Z>7nbhlz(o?u>6gjw$oybr7e2_%>!~UYwzQ!|>Y_^&~I-%$ebxu<{_i zvla@RgGnmqNYuO$o0uG#A!+WvKhh&jd;)^Qih$oAb~2s}WC&Y0INbjOe3ol8eV;}W zNvFQz`3gI^}*rtN{>M)f1>gb%=`lQ2B276NR1-dC*uIDr8Gy%%k z#DB|}N-q|(2RqNryxv3ixJU1b+y;%gZhn#L>c-?5+8SAJ%Z&!$>7H_`Wu~(#RGC8A z_VtetU@bka3cCErp%91u1(Z-A@s8KDSo@DQS|A9=CLo}gY2e2{e*RaJ)DXLp@Bd+s zx_%L5e15RQW2>PHebNdu%M&$21KEO9i_DAQ3ScqUVn&GD z%~`*JFO_kQcWoL57vi>DqBQomWz3${=#|lk2%@a7b8xk-sOsv{R67;3kIz=Hsmb%$@)*Wd1-ggoB%# zxcaWBzg5~_6F6w9G?fnn@uhp@)+_l)fyWm1FO!n^-yd@iK`I6bbKF733L}(RYjNK! zm{^t4k|009yO*r`OfjsQjPrO$-}=w}WS*>$~Cy0q?yBNGX2)`|q7d7RPJH4WC*V*QV#-jd`Msm zN_!uCjecP@)wbJ;S}PR7j4tfH2<=Ml?%K5jJnf^E)G?eBuyRs)V)#PUIQz9MgJnBEkgEHNHZ|^Uz ztg!K=m*A$QrR8bO2Nh3L8i~`OM+hPxbCfsAEu*9A(6j4%%mO4~arEu`yAsRS8K?S@ z_pR+i?FH9be*7?nuGY7<&!LSz`#~}>aO_@eqKsGWzaLsI%CMRj2Y;&@>zRO;NUw9| z(j~w!I{rH%XXaF)e40T2Bj5Bm+cmYIKWTKdW{1)Va*{gzTPzxQPKX(#v8l3&iJC7s zRF>Ko6RB~k3+yfmyI8sI;@EF)F2Ov;IAV18>@tU7ahvwNJ*qhJ7LoUHlXenv%-`&I zDHn8IG7B(2gjXie^$KYG1R^6)gQDN($HRxjKX46WndAU3hgZA@ z*TE3vgTYj8oP;WrI~p(3ly$vsk`@J zsv8qF1v{YAm!cnBbQY_ilL#HE3XbKB4DY7wb6sxYF74yIzg_F1uju_G(YK5w*8P5n z)vxD^lhr0-nD1Osqfvv=Z0U)!2@BTILiVefMZiY@UI4~1fyC17=j5OxM4D~+D~L=+ zbGIo@0+lRvNiCO`NEpbX!h7t3LzG#>gz#_Wm=DhI0+Tuz-cycy9jFkcR?M{l{-x64 zk44%1Cp07(@FR~RO~g}x{YP4yi{85B$;#9}W+pQa zxW-przs*-jR|c}3Vb_b~Pbbt8syA6pMTbbz1~i$7ZouIPyU}0at`blS)4;kOb~;-? z^VtVT*CplB{)~x7AsqtTMujn7Grw7_H^DBBS7?A#0PWn(&BD+*_K*03oz zUOPBcnTdt#iSezNg|xP0^Vpcsp#)+1Js@}^BKZ47{zZf$xx{M_$aUGpJTC(---dh2 zGxEf{%;D}Q%F(WOEE{0N5XP8-4z?6u{_k{udAW6WHb}A-*un6p{3p5Q43XlDT-1=o z1@6t5J+*)FgfaUQZQ65?A}{~P|F^|+>nH!Yf4}2{m+cSr$X6*Ae`Wio@%y9Fiaw8i z`RBB}=GWVa#qHqth+j+@!cL(A`Q1Rz_5F*6%e)uEqB6)b>|tznoO%HN^ZR_Y@8Tk9 z@L=%Ixcu*N>4TX-?+t!S4F5fGn$wK0oidl2y_C!cc#ax47`+pyLlo}L z`JT4pEbc3)sYSv!OZonQDAiJU)ahu6GP-Gu*&*9)cC3EKkiU0Crpfmh9RL^GbzEU+K^xBL6? zfelis0Lfc{shp`RK*(vEvsRW{L3;Fu2fbm7SgCL?C7cLK(=Zg2Uzg#Ps&Wl4&__OA zGp`q*D_)l|&spNzZKG|6fF%V^j4kWVV)XhtJ;EwwRi=zSzm;ASs@+Y2AvPy)yBpl) zRovVrX=_+ePHygmsW1sq^!Rw5Uq1q>LvXH2yVnLX^-Uk=ANU!BTKp1rlMc3KLgoRu zx`u@m-gRS?>H4`X>T>j5oL=k|zT`P$#~On#GH#`8<_iOo>YU1mF>FwyJ5H_W-0A$l z@4Bd_kzJ3UWXsbP3{>>C({P}Jp=xIzXdME+hTsPlBB5Ft_u)_?t0JD33mQBD`!iCF z%xZi=$}-|UBc7CMyH%emc*fv#%uH^hO_A6i24BJjfG3K%T+#EI)yIa#F}8o7r6+y- zxQapOE6?&nEWi*V{WC!9e)+ct4D~komATT+_mCV;j>(2w0U$cYSPow^bfbFK$yTx| zl*Jx3Rb^FyKRh5lF61vr2LyBTe&;5&=aK&(S8oASW!r^~qI7piZ5l*U>F$;i0qGX$ zknY@sun8$?Pyt0k>Fx$WN$KwHKKIt|{r_{$9%h_jMuq3OW36jl;d^q(d~w};2X(x= zrN7gbuGCuUh6HpZDeJ`HrKtaJQ#67+w2B&{5&RJW{}Tc4(=9ONzpI<^zJ79f)XzCm zuj5E5_!h~3&OdJj@sot9QEuOrI`I0C#I|B2Ko7^E`l2O={b?egU1$DAe`a6oTI%#^ zVzC8CCy0Q-Qd0V~7)3-xM#^11Mr|imK4C4@L$*zCKE5fds7g{hyn9Td>d@HW$L+Hx zWzG90a^H4b=hZ|Vc6y#-bauJxgi$#(&?6{6|Jmo~*)dmoUpiTUI#;^e-@I(;!aT!S zp~lclkccU!GdD9?w19mjL79C06>4wvS%7FesxcR5(xw!OS=GhmS|Od|L@j~)i+f8} zPmk5Nady$FGz4$DQK38=SEhtGajgbVQd@Y@%nMPB`bZsf$3ELakLzDTc_d)@aJ1g$JlSCEe2u$2 zs?NSh$Jn$~=)}bSRz&u^f6kM41Nend@}wI)oI|^hsW>X0?ro$d*G@NL%7IhC0`rxfw<@q&vhu)ILRl^5Z^W=7#?q|{j4_ji{kvmg|C{-FjqCc-up27g`~CfkyXJsy;3UY{banK?+2Ez+=$BWRf3_>| z3CJ|78nwp4G+!m)B9n3&$xK(-A5Oi_PI|Ka@^U3njm!7K$|``g02fz8^I(DfZu$a=Pk`Lm-ykU5ES%}O#1RA}%@4gbRg zbO=l5{O%FjlSXrvWPI^HY=M)$od9mCN_<>f$~Sp{o^i zJ8=uXQ}3_raW+JfDMoIap!sRfZDyBD-(!Q?Cb~yMFQ_F(+|Kn9`yXiV@X(8%xPOYG!AmyB4^Q939e96@RLOB3R$>~-Sv0~lffnru zYm6VxoP3d59^tuW3u+(#{v8L+a`!1=p9W=jR{EOdD9>nA~seXPqpL6=>-iqS`c9I3)@mW{p9`P_6D zH70*IgsD-A2m57CE*QA;2q2^Vl+lnN&=hIITUkJltVA@R%EYH63q7geX-aP6a(n<+ z!exR}MY}{dQW_OE*M0ZTs#w6Qjo@EvG3oJS*%56GZ5UE$vIr}aPvqTqlfSvY4Mx)Bq6 zooUJ?B#wnz>0>e)XjOQ5%g@@MbJOg24@u^Dg#iMioW(U>a$<}{hbJ*!=A?6mhljVJ zE4}sw>XFqx9}NYWAJ!vuK(Kw-D@zPLgN2~t<^#!)y75<8WPGGvT7RGfUSkjFOtu%s zPr>8NKDtdzPlrx>?3=gbEMDw;aDqf$-~9Q&+#0v*63-vyPjgXL&i6#|RL`ahQ%mjU z#K()Fa)Z+*2PZE9osl_;A8_r9-n%rUuPg+Awex=xyOkqdieLD$KB$bHLZ{FXAZ9XC z@)LW0PM1e7%Spqxy3Tf|Us9tsUo2rBe&z+1l>cswxcD^mZKnXryPBFpkyC z{?y~DA8Ifmt5BgICXUY#9PN7EvtReX^x5E zXU;G%>!++np>lV)zP=~L^;ct z^2pb+_b65_SRU=6VZ*}W5(cN5T1RJR^RpDBQE4dxc0(%j^V11ar9eBS(DHy1d2_{?ljI#l`?~wmFV0s zZ4kGzl*jeczB-fJx({fhrgcAUglHO1?up<3p{C%o$G;DM$xKH_cK{|jIs()j1~uxy z9>G`O@9IvMSl`>++&sX>>5%4>-$^DjRV$-%N1ilEFDPQUoFq1hVdp>@=BtUM!Yy44 z3Lz%=^j zT)FqR-THr5Ga%`s=PZ^)8o(y=0z?;`^z)oJX>A^g2_`asE@?)`32BGs(2jvbURMBU z2s_W7jBl{GS3k+l?*O?L=-FuC=S)Z zGE964xZ1Gs2PFIUJT!GKO4lGEG05E|fn`zq{6ztS!&Up|)Z z8T*S>cTZAK6dfKO4v&nq0)Y&-%Zh@=h2*v2e3Kvdn_moe^G#HrKYzY)(&Y^$e=%Qw zjt~NU2d0csdALeILvmUrRdZe?<&*Bx;s^kM*AG znQfg+p<#USbp`@HLAiJ2=MP7qDzTbB+z~4rCJ4G7k}CIyIo zSHRG>^Le+>rsKEHeEqh0?P7uLiTOc=9<+t;LJ2RBwekdh8oH;5UU2b$S`O!LoQ zBq!XIm6eV4PYxSaq+gu?*+;}XmGIcugq8d;MC&)AQXyA1ESEK;p~3C$-=PbYr@&Ty z(do`xMi6T7MKa-?U-Hw(-InMFJ)~uXI12ue5}xFE$rwls4@%l3e?BDwc}El}pY@q3 z6Sc+RVhh&j6$tZgkpAA&T-2mxc1kYku%~Td>S;J_K|@>!HOmh&oRQ8jkLTD@$TW-? zuhcCXxi|*1E$A7rxiL}9;HL>-yYa&R9K-E&gSIWvt*orm>MJ;CJit&^R==qrVr=uc z$qBoXnhvY_`MZEIE}3NUjp73(3|IBk?6BY)J0i^K?-eo^vDFZ8r#$%oK}G+r7{GOq zx<^{M?4<2vC!!tSizCx*A88>lIwO#Q%F!@C(KjLl007B91{(dPdITjPIt@sAD|t`( zbP9xdh4m=?l(NxerE8}*wJ-^#n)Wc6EHky9D;5;HJ^Af&?D~?MRS0Qi;MH_75m%$Daie0iF;TbtERj{sXwBriM7_|bscbF z(f(${JW!CwBaKhs$73^sLciwFB6&+=@V1|HmEy}s%6&Q>&JXL4>n)0fN}`SboJ;N2 z#Te0CS%+Wg4UW|6bI#QIkb=|yi18bBM@L5lE+%jr`@8z)LO)h$r3(F7JXx-vv~__@ zuO`4U@3aA?!!<)?@#K2uLQGY>7WY{sz2>uL|5mvHS;n`$R&7T}@Zdxr14Qx(_$!@x z2Z;Xt@f&3XLs$Bymn&Eg8>rOd?iYs!fn9(vlWIock;uVzX>&60IRn7xhp;76pmTz+ zb)}7Tws^U|Hv-00q0#=wa zPKa1H57t@ICh4C+SU8ZCvLDK}aY=hZ;!!3;do5^qWqpqMGq|&jNh@gwPI&+E?i*fvUnF3vyMT_~RoB#iuW#%4$8a;Ij z*^oYG8#qd#AHXo6(pq?Id5EUe6iDec>NTCRG$ORBcBrxw^twd3M#E=0y9sG&kt?BG z7Tv=1;^Rn{+-h+Y-(UmQ$_z4I^c)s8{9a;m_XNU1|Hb9VjZ% z`V3^RPsj!5xXpkotNdXM;U`FBN$Wv%a?4Z)IgZu%f%CD9nSltPdam+aD9q zXVVGLkfrn4waG*Lv`nc6sm6%*s>5?9-GmlIm6O+zA^weflJ^Fd%ycfKSN1zj3vcAu+9&Z2J6NORIE16#q4A;>V8+8KNFW zMEQju_&))WU@p$!h}VKAkkv-G4yDy>Bo}D*9hSJX^6F6T)hq{R(Oc!Y&vvy{*%g0p zs%ZL9eM9VXwkNNvo9e6hDBNov{{u&<;-@%nLV6o@ZCcp;eKs>LLKoX(-qCg(or2q$|xkD{tS5RQR6GGI_he}yK z2qlFwXSMlGIdyBS=?e1)yuO0VaD@nw674g8^eA${vdBPK?z%E95eVjcFPWNmWUA(%?) ztS)USxSm&K)({U5k0y#?;|~%DsyL-fsMD<9M!+TPsH2h(Pv`qSt4-5yk4<2B-ZF7W z!Z36O0u+c#8G)@;12Dq>JAMQAA0=4htvQmwOSn|?h}-Q8DxZS|T#T>c#`L&I{UROY zSrr>>Msu4RjMPSh`z{Op17Ezdm|P)nh+|=Z%suTzMHf@Jh~LDId|S=Mpe%*=1YM>u z8uwXk8={J$5htT>bzkY4&S&|h@|Y6*xtk-o z2WEeLNvC}9&99<_LAsP zqHzgPS%aTa3Ns{&Dy9_gO5SzH8O8Js!jR}IZ6~_&p|B3`$NRY80gpbgVemWrWqGnE ztPZct>!}s#KIF*nKN#lcNl?2q1+)3~s@?j2B!(|r%1cpQgZk#<8JA1g&3zSDFY;Xp z37@^)9+6*dcpPgw1(AOyh@S7M1}eJn zoc57(6ntRVAg-yY$>qK?`Q4Ut_fMsC59-cBXwhGJ&{%ZCjjtyvs#JFu7BkyP*_aWj zkMypyz#L-z!{YM(J@gViiuSf%>P3xs7FLdAwcbL+PmGKaF_EG5(TpO+oOHje8YdSY zEL8-RjVV+ZKQxYRjMJT$QwV(G;`)6B9w$)vk2muHrgDT2GRHx?zm^oY(*8$}=~A~m zm;sUi^4hMH5@7MAalW3i^eMmsal3#KXh!~L>6_iy&>c0weWHbk&FEi(?!FcN{_5INe-Nm#XK>#kd^L7B=GNO6D$|sn0Q6_W=DhRawP%aIXJ0 zX1P*V;Pt=!hIj_KA`Fv-lyFm=RybYuxm8>?()$;VNm%+R8c6p4%J&G+Fp!LCc|vGx zEUpoyQ5|ICjN)fh;BU@j{R<;eo2rGjUERQ?Ux$6g6I#2G41K|;sC%~#Cu`uJhSn7& z`|%L|{_#^nWOU^5Hf^G5>iOUBE-&J@rg1~B2?z-n$#$Tw)Z>#IHvqO_DW^P=!yhp~n%PIozJ*73K15u}X|ufij6wR`s9Ob?;kF6fDiB-EHL?iGSa(!X2a61pA3=v&Kp6;ERic1n?@ZEimk(7HbAI;py&``@Scs)&ta{grSFac_&=nrC zNe5lewFok&k%h`oG3@533x3(U`HQg+pau@n*SqiPE#6Uxo}|Rb(?X(0EdCbk(I-1> zx+q@Dp^f-e(;{tFul;r~DoBJSCRZI}zPZ;4nA{-f3}P>kPzDC$PBz69DZEj{&ugEd zEpI^b$hVKEG~}2=l)WIQaYBBYK}z?>3R%kDgO+0f-Q{W6ydZcUod39yA8-}L?Ch7z z%t8Bec>I&$(oBRNp6gQaZ~C3WPyBqNZ_e%x88LGX6V4obq# zHmuHZX+1uQMfInb0n%Mnl59$&;EDUS={vDjF(gRL@j5rt)9co*s>nW}7%o2q{!%ow&3@e~Qpphk>}# zeh^pM#N=9Ta^!fiw*9kzupTg?Je~F*s7JY6BVmKqtPpc?aZ$Il5nu1Qztn6vgP*4n z(ufw3ACJR0`7^7Z@=|6?sKTb7x)!b0NXW!o*qTa<^iFbn)V>9@kJ<9GHj-L+_nft~ z(pwKJRFZ{h769)=lJQsB+^*%zB{H8PmJQc~Z8?U7EX^hm)!yz1W1Lp%MLZ;UdCE8< zAFbWI_%pw|gZdtnK7Y}?R2>c0jB8Nzw+v08d)TQsPmZAJi#{(Co+O!W7zj-@gO+{* z_>c898U>caVog{U3sUc3e_~2o;ghLHifHHFNRG=fXitp-wYp_l&h(-Hya~AJ9X>?| z6mE>)4O8d_?hp*@-Y%?eh693;7dlu2@UMKMVYlTJAf7%tWF3(=GV(2C<QxZE!lJ8O;xg+a>f)JT+ zdfV)GB85O+04|?@R?o6(>}b@l1SuKRskSL6$jnJH?VR@b)PtLp6gPi$7OX_7&RM=38?HMQ<*`0MINcHj39%U zEo1lzzPhhIElrj?vAtRf!KXJEF3$(nR3pP$7uTl2Yl8zL<&DHlFqb$*F>297Um|3= z$OIT$DT~HI{5~O6BwN?QTb53nAdp60?LwfIcDSF^d8E9jcPRO1nrUj^UuW23&0dgF zdnEY_osLr&x7u;8D|N&?6he6lhYC~D*Di0Co9}V;sHSs%pWu_#xy7@bq^l|v==Wn1ZOR)aPgdR|KFA@$W@+tb9&3xCmL-u>21l5l? z<9&xcqJzpRzsOQ^D(_ekg%v}`G9Op*Lkd@HJ z=}u-I!QTH~TG#l?+VeMbqouTe-tI(?F`qjB;Xnr7JFH=p`y7Hx2dT1H;X?+9-#&i> zYHDj%hwGPLCtABFbecYbfVdcPYzE)qV z?aQm-A~kK&E}IZXz`f;Fr~pZ{Pg@*oCsUvMQZ-+xCVc*3n)82iaL!T z*KA=JB=>|;GW-&-d6F0uM-;+BW3S6A$4T|tPnsn5CzLr?^B z4Sgth961twt;|SEY6LNqWY^lY1#S_4KQ%4qFa&(>aSR;EuXimrB zumV!xdK;IV%vALnjB8x}b=m4ir)%evYg*?$jeNH;ovjdDA3|4QJ z#pm^TQv*j(wWBp*mE#j-y{BS)^`b3uDL#`6Z&ClmR+rD+kzAE##z24< z5(yoL5YCGNl}@-@zst6z)O|SG1SF(j?-|1WD^?^B#wtJT0uRcL2SM2t*pKGE9>}ME zSY3Ob#_O8Qa;A&cJ2R*s_4 z^i23Q8y|F-<~@yRYkMAbza5zNLTC5i%=w-bH9BEKTf*swD1Dg#V2zT$)}p1L#4X7U z60p5P5`MR5_O+4P{X#bad%O_Jx|L=VP?I zzQZTn+;2bwPA&{@PAFsP81C@sNj+HPX&2RdB#lU99|crqr2OR{`Xc-nI;Mqdw!Cbz zX#%yCs}rz0Mw$i_LjDe;24kgjCE^4aD4!;;E`(G!WFj0vVyLM4<{e#fBgjl%kHO{n^Y5d4x0aY~ z{16qYyECsw2a~^8h6!8G-H26GSR}xb+3iP4GDWXWoI5Js>#XUS zm>_j^=#w?v2;Q)>fSaro8|Nyn}89* zC^^D{9V^@9_>SdV!4+4!L79e*$`5aECqx}LAoL2A_UThiyRUh@_P_pxu>ssk;i%kx zn~#B!f%b_gCc$g;wZTk4L^^z4>r8aHu?#!7oG@OT)|<~CJTM}2HR07JGe(FM;S-oA zmZjddb2Rxj=$5ouZN=mda(-V$^pq)7*iVyW`yMIQo_@E|d(sjRi%|~MYzRdvCBT?6 zFq%88Q=E)4xaUpfFUM}WpPyJ=6Sp|P19Q7vnrZ}KQV8$BsX-J)v2HEOY2}Bn?qCZO%ZDMfthdj^0$Nn^JTvKJ43{VAdGSwlbK%hkC3FcO%b;h>;|CplcIsi<^( zsQhF7t2im@QcQX94>p(YnfFfJK8F%Nhr(R*Mo4&i=~SM5wPfLZVJBt>%hM70Yt>n& zyCq}`%h&xW@4=1xw*zdz*s|>76G4FPV&~dlB2Z*z^{i0Ot$_go9iPcGWRtB)eAngy z;%i|~FP~^8Q|}zr7rCgnz%*iUX%A`(n=M<;ARMQzgq}I0?lkXUQ4!)^Tp-i&zGS)@ z*4lW`9U6+{SyxZfvPtr5rV4ZcBjYermpySI3&fKh!o_FGmZu`X|uyI%-9jJ@3eM*wX*E4gJk zYVWggjP4I(YJo4kzYlL$N-2Diod4|^^@hJ68s)MfY;T%DnoRF2w>m6keyPyWiy^aC*`D_2ab~0OXqQuD<$WfsR~m_Av`f z&<|IhSnA5|(IVX8{BG=W&@}P zVAgYlhOI7LostctuZKCz?i~D9OCGkdz+q>9#^YcYt}ULH|H4NZ3t|$z`Xkf%GKW+o ztA_#dsg>K4oDxcR?`h#9Pd~(na5qk%pklvhvm1fHY24A>_43L!9Bxkuckw@_>+No8 zyv8FT2uD4qj`$w=Q|!8U=DhE+M8oiH<};KZCHw79+kfa4GZ@PAD-M zPXz%WgsW1u8NHymyZ!mo+0#pYmX6DK`443@Vfb2Cxu%n+ts}k*-UXJ@W|}PSNtmP4^b{Kdm}5e_R8-Q zLnt*{R)`Z4;vWkNqH#ySDgXFQT+Q`jQxN8v!P~Yr#G%xtcJycNLZ+SguPN&nk^EfI zeG#SNlD^fFY8Ppci!P8+P(-7NyLKp_(G8kDh!RPmnfEI%)=0l`3+gueC^R4)+>gT$ zno2A9Si{#^GtrXcU(cg5Cg*3^nA)==^vKv0+YGWrvvX7!%I=*K;kw3ic@AG=eBXcy810RolX8kWs z@U!;ErHo)s{{T+6>XZ~Gc^YJTALd` zM=)E%77`Njr3QkC{6!*?7l-8{ z-(9q$xUP9FZH-wYA+69b7Z9xk=f6+>b*u0yjb{aZ&92EgvlWbKK{6N?-yImgZR$>`VDQGY6*YcxMl%pDj$(^1CSungH;rYv&{L-J7bY@cA!1))l) za`^%@D7AAV3dd;jq4~HX#gwM6t&rt~eUOk*=;-OC`CP$I4_E2@OwnYD1}_G*!8Pr2ZdtP z3;boBk;BBYMICcln2J;i%j*(_RV{yM3le{_6Cmk*M8dk@tYs{dU_SB83xVU&#xsOZ5@)tm>UDhAI2fVS! z7)o%IHO1izFfbq`55?9jS;QI=nD1beb>SE*mmiX!s#eZUQ|dE>>pD6^rl0REH`R;M z5kAqeIHS#hUIe!hI_b^%aXzq3i1 z|0Q|8s{^4O@bsmda{#azMr;2C*ork0e64wXLs3q#!M$hbBVgV^hC8575GV>YchXT) zJcnQ{+z&kBQ**wbg0yLf=j zA@YBUJUgAU=7TMle}qJ`#2TX?39g`)0P`imb6h*cUH&@eCv z_J4dQlWNS_mZ}gfN-V(iL%Q!nXORSeVmJ4kjSHG?H+%y7HM&+y;a_y@VY_MU zoME7?5Sb`3YzNISbJqRsw())2Vmowo{x6O$p`j7!bVnWC4a+Qd%;q5BXn@j!tdD6& z6ziEu%?Kd!DI+xt8vn)~wx3bv{w>=xW@41*(cWGf8hWp+uP><7Kt@3q!OChc~1l3ZF+hH^#iG!1j6D;B1s|EGYv?nZYPKO635t*i7T=vSvhos^D>F zx7WBGmVoqkq@bwSI$3Uh2#}WLXwD|MV`+R`91Revrfw-EIN6msyLa%0bPJf}MpHR- zS;mYi97%qM0hY<+mR;bWoJZMxFBMs>FnuEik4v5_HtxLuW#eApD(bhgg)-c=Y?YSp z%3iwOw5Z20dGl6Donk?=ps%o5yhkY<*_uCk6>vgevo8gS_wZh4tATobivZuaZo zq8va|)uq&W)!u>O*lvBwVs*mi7uFsF`a3XDXuh)!C!(qtBicJ;DFT{4F|A0UJ0*aw zz(rP%D&u_Lw{$Whrf|qcVz)A@zLhUET4jV_lZ(h~kDqgy1XATM zyGtW1Oc9hzJACdAemz3FW4^>$ic>rzpET3@1OMoBd_E!3R;F}$0nYM3TWcDiw_W+f zwH2E8?NOxIQkx+@yI`#DHlu=T1`JR#^A>;)JRH<#6jP38oeE?r6-L86Bpm90R+~== zcPXxHgeP9}z?PN>IyxEKrltrz_CJ{J&oQTROG7e+9_2fm+w#0wLSbiT=CQMmv;yc{ z)i>U&bB~VEA_v_cUAWz`VUqI94`O3C503kR066PH-BU{HK|%sXCj*nqf4dME_R|On z8NcWE^0I9G^%R-ku?sDLBDmZllD{h^F(MeoXI~uJjBizFI88KvZxRf#P0M@p;@Qc* zWyq>)hOxCNP#~K0cC#NGI5O7IStaZ!h)SOvJbtor+^aPBZ64K94>DJ5e~9=6tK^`os($Ef*fkKoM4#>t2V z!0_FazY_@u4!>{&qgs*>p4M_gE{M7PGi@p31rwNj77@8Le1%gW6MSgh#ZRQ>%a21( z$1ng^sQLK1uypL9VcmJ_uCT{t7np(qP|tix^F_|OU3B}^d0G1sZB^|fbG5i{Eay30 zw)J5Xc_-3lq0&|`r%qj5Rk5s|!JjE9IkoB(oRP+KXNK`6b7H6iVjHlqf)`~wnqtXD z1Dy@a<*AiF36*gs7iXj$L%W;ip;B|ikBZO_-tvWpEOLkH+Dny8Ytpo9N_MG+K{*v7)Uh-62X=001iZuJn( z?bYVedNxEt8N9M90Jfk0tlF3vLzfP(Hy!si-VwnIo34B0bYj(u3T-R^ zHr?F~SMzjxDI@MUbGMZs*n*i5{(hpvIUi{lMBgB$to25$N~|_=`)my@mel{|nT?va zCfP$u&i372o6uA?iO>CJBB!sy%^bbDQKNkFIBXZpFPV4PsM{yHF$Jf5)!@d6;L2l_ zJjYaABcZ0oK}AJ(nEf79RV9dm%h#zUo(67fTkAJdIi}K>iO_$np7YA0Jys4`ur zicS*>d!Q`-`eZHQONL9I&!DUOv89WN*xmh&nVmh*Lqqe2;;BksnA&GPeD=d)W1D$t zZ&o)$h?w@~`9XI_WXZ-zJ9YD&O&EN#R8wAi;L(cZww;#ePW58c(IkBSkFLp*0_u+b zepL6mAB`7fgnB<7gFqPV6fY7tN7F&MdvIeUqut=Q#qHIQm5z@t_L@MEat?t0qPKH0 zM~BTQmE4}c9}d)eAbn*oHEWb+R1*78z9NlJH_VAQA8_wCbycXb>}aifO_4D_qc~}O zY{YhXkb!)GHV-ZF^68bIAt6F3ZLe&X9^OlV^xLPD7}mA@8Xy3c!5~2$wCL};60)*5 zGPvfYVMczrV;?^$dCC4qn%odYsPn!u3)#VywKEW@vYU>~4zP#q`xoovmS_bKBm+VL z>d+9!Q4uSyO-+fTNkpr(ymo4}OVf1|iT~~lM0z-h1(Sus}Wad$o1;C7zA zn5rJL=}dy5^_?>6=$GGcHp9{MJ{2&uY#En=FJLdI%tyw>&*|7zALiOoD5%PrzW}V< z?5EbKr@dN)=vkPsS$6v4lF78TfjJV%w*AqDFLaj&YMpboO{qRDR6lUho14`-%txl) zvI!+dd3Bp}Z3l{zP`R{E$+x0K_s6RhO%2yp!K#@J?5OEy7P*dQQZR*s4=Bb0YA18P zf%|K+hW)n}KHUH*-LMM9;T=ppHHGPKhYnw9qlr3^z{xQG`$mY=GAm6lw8Oo6^>Az-WVwg*sIva=Ur{FZnNjreZ5>_nh^RvO(x|8v zHjIG6W_N)!_(4=+y2^vwtiya~(iB&@pT)xRu#qc#MC<<)oQ6+bzniY_MPaH@F9nYH z?Ktrf2}=N2z3>H+ck|d7n(zSiLfjtJhLA2j2k$GRU@NH!sSQ0ve@XnOKQQBxUj@E@ z=j)uB_9CL;M(WUK)t2dlg1a1@Zw92@$PxEOMVtP&WhBd~=a-p7$zi3B^=#0TLlWJs z%+P`k%2$sb1EBuziIn;!aOoz6A;8($*~tm5CGFV|*mz`ybsITe$588G30ytB6ZPsw zJXD@HX7s)ek;Va)a-~K%WY6S+1zknT?b2|yOV8S`PVXjbMj+{Y$PrUDzzEJsV2iTz z(7PQapjdw$`tqx9xo0`Q)xbeZndwm5Jfd)ggZ<+^(X9!7>CC#%c?L@~yEeKA$n@^gynfl(70Hjbp3RNh536p#Th z;bCKN;c&L!rQlYzedL2}EAy~kS!>~0(CU5x3Ga#iUti~0xh4Z+givT`zDB;B<#v8} zT)@rkiyh-R5;U*073qj`O4E!niBYRD0+}sFK;k&LIWJ557=r-LdMo~oHt25?lHaXHOUtbxc6!Y$%#5m2 zIxmy5=XW6e4TZIn_>`iurSIkT!a9T|`-=-Y8d^)Rtn%>3%b%>BEN&D$?YO+#dCt*% zWIwDaaJEnvgBeIk4Ue^y1m~W+^sUu8{p7uwv*)rIcTfjA{T|$`W(y1WXgKIeoVivK zZI2>lf>X)%YT=QL8jc%Fx$;^pL$!KR(`&SRidbcxvt-ka1E7CmxS3@2b?@m!Qk$U) zJ0=Ub2{@ZW6e-!7o4ZShGjK>q57>L|;%L2xtb&WDv=JJILQ91fx)v*(YBp0}9%Ju> zxXfX9D%9xlhDX+N)TerdZpx)P=yZ2pZ2g_pNA9ubM@B!7#cZ>M=-=?H4y1YDPziO+ zUu^B>9{+Mt#xdy~(tKxR6sWPUZF*B@#c`2Z<_zijX5ZFBymLAB<)Lq!(d=sm$ccy# zppmm+Uuuv}hTqnfx)yc!20s>{&gk%ds=A`qg?}$o@fs$dXwIsKQMK5Tg<<-h1f*R5 z{nTzqGjHLa%)A6KE8C=W$s6=Xh)>wrcZaw8%S?ih?=R$^?$tZ;J2VMCnlOB#C?@yL zY2kBvX3a4NssFtv$7dDJc6rEt*pq!C)-#04YcOGdL$CgeM#BJ?2;a>(8*f_86jQy0 zBflouP}Kny=i~e3QF2l)HPitu#2-8@lzb#;NWsdF5_|_t&LfXcTIBdmicCEA)^(1` z9p@FTEA4M&B!wOy?A03@97w`wPjp>&D_Lh;lnJOkO-Qr6n2`4ymP6Y$pwdv)9v?h> z{7rk1tK9?vQ#Aa|`Zwag(EV~DPfj1F+A4L;7+{kmP1b-^O=d%bt(GVuPLj1phfOa+ zkbd9@dP!D5cH+*5ucf*rH!c+9g0aRdw_~Vxv(uu z&A(|cIOB!a8CKgIrY`x$XSR7Ih$B*`3R=;TWe)=EsvFxSRS{s z7yk48`)u0gu2(;Qj+!$N%j5(Wadd_#`u) z`C;tLi%{(5n@?08b8os0Jp`T3XCDSh&}_uaxTU-`Rz2UWp0!$bfl)Y=E&SOYAQKu5 z4Kg?~ZOdt8G6-mV7$9`7MU5FQFZKfNP{U_jpWM|hxeXjKF0xN_bIVfAhl)3F6Wlt0 zFf(K&LpLh_)33&hKJ(W`qx-9s>yAiL`DXp1ZDp&(zo%52KChVn6rtqsN6gP^BECQW z4UsXtGrqeaW(1ci{=d!^byQ*xr{`jm?2#M|z|B(b4$>St>RYWYd#YRz#L>JZCS zja7>}klrlu-;;$13R6zLcg52W?lwmg9HL^lnoRZ}aI}BA5F~#0O_$p#CNQ z(0RCprR8F`_?`1b(;46ccPzI1EhDyqheAi^$9zJ|?`?-oOf0$Uy4+}hxOP#QlQ_N+ z%1hwOhL(1DVef%rl}b=P{w<{7dusNFvy&Gel*g<2qDy7T@E>6 z)#5$<)_sELlRl#RK9+SGYc#z(PjsC)qbGeJ4AT87aU(?4&h}^8JMVpRBII|4U%n9h zw3qqs!*Ml??%lB-DQ2c9rl&t`TK?W_Rq2_LzaV<^^(@DXn+}0P1Au|BAbX&jb~oT} zi}KlXTMUb*E&el%6|zl+@g?ZHmEwVeBoKTM$cK|&$G<=wlf{XQBUDA&RR-l zo%+DqlU#RRt`~>{R?7-zeh5Z1cxYDyv-{_Cj1Y>Mz}kn_VgU&-HL**qu`&5FTOE2M zuTKc)v+Esh6R$4KQANYCAP#NM`HR46RlI12xSI~7T7X+lMpczvNEndYWjxoZfVJYk`F{BmTXd+q&#SG68;G~P6L$Eq#E&a@P}*E~xJAaPJ%B}HX-*sbMU!XseJ-!=yDyZG z8*Nk(5>$+bUe<5y+KQf`iFyA}cnO}Ltb&-#khhrH(P86#1Eus{6EUa#tBzG_N5P*Z z3(IaklymN#i;h3!%vuJej&dd5ys>NDh|fPf&b}AfIzRf^jgrfD>v+L%@l^dn@H_1L z8;RY4Ndg#Wp1l~(N^|(MLj&E`_sDYduB9Kpvz=Q}4RyeIyZI#75p}Z3kD2;%aKDy; zJ{c=Glw8N?8Ck$pzj%CB8l$7vowOs~2NjZ=rC1*)xBFbtlJx~sezUfY$2WJk24Qn? z&y`eL3Dxd)vGQ=ca%`uf6CTtYFEVo-W*SZ|%tU|lT7Px2C?54KXgRgE^PT>lf2gre zLY0j11pdXb@%@98e){{jq>f6;%FdUoDe|)u1e^^A!42UN@J~-C{*{EjmnAX}2_YZF zk1`Q?uw}o!HTQ3d&#tK|oDBDp6t$Yt{#46&UH`GlF%df23g;-g4nan0&lnJ?IcmHEU_Ku{m{+p);mI~=9JY76OM(88~^=kCTA z;p7FAe#=Fb4jI3ambL6rRWomhz;{H~3A-Ni-SP_dp2<>*-#w0{q>bNuTv3%JVZW=f zvPvamwMNaRrxn|LFPb8*4Hm7bz@<5wX!4AEItolQIhfQ~rDJDmbF#93P>n_0MFuQJ z8E@OrmHhqg&9_}Q*932410y07_A#mGX@X?SzEBDuWuzv4YYUcowl;G8@f~s)lUSDW ze$rZD8Jm9eK%0TqxYn^bdgG<^BWATsxtI3zSZ4@gDhCU@r?q5_129sOD=wQNT*s2Z z&hQI6>u>(=b;f?IH#VMovEF8Gkg59_VsA-rTAvNHiJc2jVympcHI&1oG%U-0S?Jd2 zP0+4ByPf&w?0Hr1<9WURUK4}6YW5wGy*(8RTXC3?ao{)o*;MiQh>`ps2Lj;xnOXR2}Orw&mO0CipTcp{ z-NZ^&N=2i4Vintm(yDH$tcMg@uny}0v?R0;wG9dw?m~MEWa%@7W7JjS49`hG+1hFS zf#QN?&RZ3`R(Uaf?Wg#K-t<)+%g5GP(e#XtQjM!`3=W&c-_`Bh-Ciwce%e2nj)7nH zopB=VdvBLE18ylMi~?*`yu#?NYL53%5B9dsoi84WN`B@?o6q9Kt-e{}Fc@=G7eu$#btTQ_4Afy#F-@5^%oyoR(mCyp&<_YJVCHPI@x!h{iZ%POub}d{ zyVgX14!yX#+N|xn02Z}BVM!#d+@`p-z>-+gMe~E#t-;6|=RYtQ?luPJ?P%eb{I7GD zC{YgNzUcDVxG>^63${M(W5+x_&As=k2AHqPihr^DNhi@0+Vb=&xTR{;7rdI2o=3|} zbOXUBV%Ix_qdLe7y!LYH{E+{Lr>l&LYX8~_NQZPY(kLC$Aq~=?bPwI#A>9li4bq58 zcef1P!qD9*-Moi;|M#5_^MSRPnKkD(`|Kz7e!LgTU;du_ayoO3V*4Gn=mq{n!^k6l z%O35?tXpnvrS4MDKb7g<>O^|`8WCIWToh`LKORPPlVfKu627+f&H~WPVL4qo_J!-9 zr=gxK_dRx>2HY9_edt*3ED=XfwlHwJOcYX2W%sB^60+MkfyS+N zlQ(QrJh#7S)n=xKXJ+I>W*{r8bccJ71N#dcZ0yEsY8p_A)Z;Z&okkzmyh)Ya=_Dt)}-`kom86 z6dVWZc&iwxJ%X+v?Qqmn7NBPo;hhga-_Z!*}gyEt~x*!74IUD?^-Ow(`Y zR_PX8n_npjZgs%61yco>2{V@a!;GX+P;2pvtCDhIWD<3Ah&stHXUzl##D2q;>j=Lq zMqb?jcc5hC{;)o+(KH&+gMBlFzdjprwNoNncdI~A@p{HdGAAaQ^Lhn8UYI!{5Nbqo zenzn?7%1pZLE(K+S-d>B`Sh3k{%GmfxUm-^0|f?NbR^}CVQ??p=A?0ypfIHFrf)L3 z7tOz!SmgfkDv#x^pZ;6$JGI}mG?5G9z}?_hdxz#=Z_lcQ`$1vB4Jt&$b$&}E7H;hb zGzCO%i^HjcuKe#9e{GhI8th=SDXXwQUiTRMt)$@qg}6mx3;g& zggu7F&)AQRk+S&%n@C+;`b7TxP9xO!pxpE0PMDk1_GJDCr^TaX<9=7_)WYr}aYi&F z#pzmBtgYx9_)Rf2Xx)0hQF|rGf52_MdcKuY=n82GYm1lDI~BE8pZ@cS68b~B2)p%L(N=BD4K=ewkuBNs0Ub8G~|bZaEXwss8<;lH3&Ar~ui!J!-D{-PgPkQ;Ng z>~Em|T#JCS&XX@A+yqFxo(=^&;y3E*>Fztq^duxCuaUPz3+s#y`Gx4@$JXPe(TRi? zdir`RjO@_KjaMgUmJK^g+bdQzt{PA7pw55SieH-zmG;b;RD_)ixCbHo_6N5G@8ed@S}Xi)V6DRh0N!8x+_Q?e zWM6|@&)@5@I28ZS#KODqU18KvMX}?uj+Pj= zmeW|Y_32N>6GfQv^L}uNBK+Zhk3X*`ZBh(rTZas&N5+mUvECT^yK>DStZOJRSnotS_gL}ELXVkkxx>I7b8)9iAwB8vop76|tDI3;*+0FQZ6K|j*6>(q zW1*n&Dgj5c+a73(Y;gzIP;3vD;L2{a;TxA+jXe~xVJ%6|yHdA&6Pvm9A@#fo@*!(w zqO-}yS|kMf@ldoaGyVO-w{;o@0I+e*z&fenNns{ za$G^49VB#4jWs3P{PFkcSA^wf`$)FzDMF`TVwjH+b$BA}20^B0es|&I?N9HU%l(I9 z+eKD;`pg$Rti@Q=hcS(zKYc9f2&m{wUl(qPeQHKi-nyh7{T8Du&5a6wV^Lz?QJD|j zkWSheV`sp|jz4>5c=-1D5;xWZRGvCM4TpIQ-movx7>Dz>vCv$nX5fY;y>iqvAPMtF z>6gZ%8ByLK21`LAZd+e#JRaP^YR@Ta1iryXLVJKI%69ax@-OzxF7Z5lC}Nx|Tz}(U zuVUrB0`=T`o~h{Q4L(tbol;KBh*yPO?DMR}OZ$g)cH4#Hh`oM5(hKv0m%U_1XN@64 zE1#ja_w+kE-T8an&WO|-r>+Yj)HlAu+J0-2t|0%hHwfzq5q|W|?GBG2(OniscNW$Y z%9)#I#jJa*Y{U~F7$e;GyPG_0_q_rzS7H*^MVV7}qcyx>G0GeICSKs^|8tmH zX>G}oa^9jCMo`1sYbUY^XbdZ9<|qEy>Q|sIAHK4z%}f0B^wa?WRaYKaRX#UPo*4g@$2MZgQ&ENl$Wb1aRk}3TYj|>LDYmy)YJ)Hs z*c22c8FlEf_g2X7W{?S;G&v+!90MJVRBm~~^|01$!669W{eB`q8Z_9cHo65q=)sZq zu7Yz&LdKu77J+T%ss541do(^%DB4-QA&v0rX;bbor;v_V~K%5(ACnf z-hrggnl;5__HA0xDF!3mpr_QJ<|C(-UQ*kJBYpvIABR&Ys@D(^M{wIAJG}c+T8Me} z`-&N379w;{2B4jJe7JMGzjl1o{I4E8UzAqX-x#$pyGf%6ZtSy6;#32}t^^Jw`?V}9 zEQ0D?Q$B4QE;Fh{Gcid$4B$aNc7;@Kse;u))GDCw zF>ca{k<(|uO13YueW&k!v;1>do}b25mIMl}kRjv(y^!(gY3`hg3Ni{MWI8oU4o-0y zd8V#9+gE@K2!hY3t69?*+32j0`hKv3&3H>5KCCFI^25pJ-1&)vS*a!a*23;{jX$Xz zZ*g&Z3&Cp*@*@R~@8l`Ux8z9(hd2ICaA->h#%#JK-6Y<4opP_g&+JF7vB~60zLYI} zQ(9g!$jaJMhLBD1eN$#~fH(c*zEW@fEl2$1K&ldC#<9S1kEJLYpcICP<-o5jJw0Z5 z#U)7DlJX%Irc9;Zqnp``=RCT4plY)oKRJ@W-<&$qwG5eX&9*V>P@b)uh(jnoWde!khvd7hPV4B$#gut_`?*`lqwvlww-$iA0o-iadDeg z&aPpUtnMd&_i-~lg2sL2AIx}~wi-{iBnX$%ceaM1iN&)Vp2Fq{^n!kzP88tY0-Ln5 zzw`0((MM^CPHfg6F}LIgJG*9_D}9Qvj+sxulLDeX_xi#d-1wb%8mJn^D1tv;ITV_8 zCmDrl980t@5++F&TKu%{3GlshJnzHyV~Kp`C~*I+YWW*rE?HsjEZ2T0X>|Rfqo&I1 zu-e~1IRjYPN`NipIzc&cT!4D4JR;@!@uc`}>s00B>aucTo+N6T(a1hPxwpcWe>9NpH!Nh}(sT>m7!$z=M|Nfhf=s${1i~ zx!7{0pOkOw_jFKF=M}t0rJ1>2W<*@c+WfUqI%2<+$&Mx-wjAyUA11BGnxKAvw!7Wn zv+mQojb%90fU+aPtIePHp}qXq9Y)urTC!otPjsC##h$NDnYPcEEXW$9@8!*G*KjE8 zMvnOW3VDK8_i_&WS*J=)jsO|>PY2C%naS%2S6W(nLP%(=(Gd{BXEnsi=7iUXl-0lu zE&q+K!M`;>8UOWI)D-NSeb24Jk9Dk?>@${;^tC$-E5DGR@S@Rr%rL7XghKir_oiMQ z8yc9Xsnlt-EOF4E7LwjV^XV)8Uo4T!-}52iG6qAzD7eOLiZ{DT{_o2F!GKf~?znGn z!huokob9^vblF|syGu&ec0>WU4dXd33;>THEO?s3Nkz*5I7~{{+m^d~(1E?A;n54t zuJuo-z_HU>+ufqai4hjXqbs-HLxv5@({<7PZM{Bb49L4DW_i&b3OcG=`D>7Va!oE3 zVStJN*Ga2*{TR2%v($Y=4RTufyWI5mdY#YX9;F;1ru`+&89<;`{cT=0U9W_~d>^{) z?)Nk>0mdapF1xIGq?dwlp=6hxDnrO@XBI5+?x@L{@bUb+N6X((f`|xD21e^G`nag@ z@bgFDDg%g9<`|V6_k>5?C`&plZHs2e#oSQ;+eEi%XVOF|1GRBN=V?A9f$UX(-zo^AZ~QXTfJ@9zBS({|AL- zTy}0&`xEIM&v)3#1U-|5JvK95{P?QwV3B3o5$4l-8-7GGd8s$Xm0e%;tGjPsqHLzNEV8!eHe5X} z`A2t&2s|m3HgQ-=>o1i0uG=I%8_gdW?(W=DE*qNKW$QM&Kel~3bfDS+TW^_J4JZ}- zugd~z18U;|7o1$h=4p$HqVdA9UM99rwb9>1Z3nziH(JVqz~pj(Ax9h-6r zhJzOq$$akH2tkYw!uz!)GpgH$gdlIN?a%H+1^z25K__SBi}UP;AMPNF?%Z=QV3VLrHW813Y$C_qun=DPs2V( z9G`%7fuw<7Da*+JBgiYrJpda;cz-28cn%yr=JCTMA9-7p0wEK;CAbNY)HuN)zoXDO zL?*2kgcLnDt*PU%YbZF#aN$}Y^Sl)SF9uO8KTi_$%BIOeQ2D~lrV?qKjTFX-MbBv7 zk#rCDcyglbbKJZf(Uh5ezd`S@e!-(WsQ*E=$w0~KnRov6_U+qF>&a!_{EeXNasMYW zAfIQ2-YolgD4i1oa7&D3#B5A^{P7#>ASI!}c0Rouhs_&gy`=?Dw8kOo)7xO9vpWo; zNRd`9@~FfhSh7FI|C+IwGG8J-b85SmhsRW4oU>8Wmivaj@&CIpLhl`MtF|woU3GZw z23JiYE<>#(q^QVJ02qc)q7nKI{r$<_o%*FP6mKUIeuvjf0w9V83R!N#hgRWhi!W^@ zW$xbX4XuywW&|sVsWmPH0YdKKX9j-^B&TJGcwh1b?)Tm-`q9+Vw@1f-D8jngi3Ezi z;Sc#&MQp^wkvqqJd-Z0ACR!$fymV%&24v=pJzc_Xyw+oK|8V@wF>nC|f&jo%Jrza- zBV)OABXN{;=oB_RIik@4Qs{!eh)fE0Uk1q&v8A$sJK{J$3?dM+4=gJ?JjVH7RX!RZ z_@Zt4M;|fn3Om0rin}|=U7(+QcruYL7G^HM-ho`cyPm@@T9?45=#2=LoKn= zF(2Q~otB?}RwViqT{3iFbr2E)&;j~}E3Y^`zC z99r(+IuZU)iN%gDlSzQ6@j7iVr1-eFkZl;aNsgH_V^Ro)kBlf{4(HFnCnY5TSrrm* zUVj6d>v8P1uGiJ(|=JM}x4WCKbOE>4~ZN{nMDc|3bOGe|?bHI2bdIwq@aJ`mf zOA_n$;)ilv6KA<%3b`e?#E-s~N^zU{6BgE|r_81a3T#a! zTyD9o8z$@L<9c%xm+d4GsTXWK5i_zYV=5O%`lEMB$T64F=E+Yr_e#h|iq#KIhLwLe zUZ*M_yNI@mn|&8pNayW>ABLh&&q1oS%&SKNxbs}6(5=LtDpM$H10aRmKAC9iWx7N} zy?VkCi#SCdg%50pm)&F_WOth6>o-g&o)vT(Ve=%cwWXw&!EmwEm9Iw%#2OOC`xF@i zMSc;5+~RzK4Jhxw6OW0CIi$qXIaM*l?64n@tQ&`~{|#?Y2l|ZvhqsS{$GDJ{j0XpM z7Y*B7GAi>TQ==aV+{S}xEtaq#E-E8Dg8qBcVRc%^{`XbeRcrAw_FtHgMtAiC3Yn7# zYm^YsQQff0>3vi`sn6S_xWLK&GqMqgWj=xCvGMKY_2cI9p(C;TvMUej8Jgq43A>LI z)vY}x0K~y1@kor}A!I?6;Yxo67FElAJr#0P-ie}Kd(u!%K30c)T$C`?6r?nUB{ z7xQ&|6($ic6X`5ZApRz+@zNZQQ1Ub)b}<0!0kH~Gv6SMOL|lClFX73E#+CyfA82kb zs`HoMn?tN&!sWy(J%569(Rs>9n8epvLw+5z#X0y{mbF+o^n@v>vpZ$S-^N%Q|h+pW}42xxm-w#irjV4%`is|*t@s&w^Ab~oxZLGV!O{)|y5 z^DF1*i14#nJDqZrxn^h04+GN&rRyZfjg5+Jc7J7C&Y zp}VV3IouT(roEOH716(Q7b18+vxSHsM@*!=@lh89ZUR6=&t(|$*4#CpfiwhFHv4}q zl8iwF%?&ScvJV;WSS-+&0_~Bng|#)fHN`)TM07nlnShIn>ts9R{rlSDvNF-nNgo{C za^`Ut%Pe%Yv|>(A-+jePp%y7e=Cc!#=NG6_J(pQ5729LMpK$vXPf@;VA`wTyI;u4G zCPoQYd&#o7(DFy^sv_h-^W?C(TzdGjQjS8}1<~I26Jzl9nI$=g8@orfWr*GWM2mc# z;+9=&4GTza-fZI1$r;9<)_mTVXLh1q^n+NH^jfnvzVty@s)oZg%c!atLW4}EMo=^rJWr%%%Z9V62`RVJ({(=HN6exD65Q=h698` zM28&;yomW6-eqki8BPwsl9JH~Gu*1T3hp%TR%EZLFVEh(ciPLsJJi%xr%oN-Aqj1lB3YedJj5fv7xe$pIJ zv1Asn1xClYEE`A8fxO*A=;Lue3QOFIIhkFD66!8v8O* z3O*#?WEaUA$9Jj?gKOv|fbP5rUzDDy?5BrIPJ()wsr_P~TJEbT?%Maunk#?>zGT84 zyj#maO_aDb-r3k+Y+nBhY?Z@?4~q^@5M_w_6qLN^dn`U?alt!#xN+c2?&VxxT8rU- zx7~g+`Ls`XcH7Dk|FE1L_6*KuXJtr z$lN^S?SF@bPU1!l%x6&mR958amJa95%c}n`DNdE&iwaTtF>%#Rj(UBZQMZuJHC2y# z0^?qtoyKTt?O77MV$sV# zr3-30fy5bj@M(to>)K)BXkZ1OefEe0>;Rlpjb}E zJct@lQqzlWxQY_*=H>;)V6Z^tViGzviaMK014j_JJ-_NhW_0_rO{saBVDn+k+gTmY2HjAKhexh?);tABllumOq z+EM28mhUrxV7vv)CJ52w8Q~#lpTnb^9UG-Tf9AYAKJEZ=@ovB|0GwM62Q*dSaUSbJ z#vi`W@&?D{UCDcM<9MYo)6W!4Z=D_bpj2Jkd74+t2sK>U?>7=Po&GnRu@ zf5%{EF14^*>edO^!YwWJHnm`So#{I_cj;7#-fsqo8!Fnmp$j%5OkSieX^6#YuIS8M zC46sf$fVNgOS=sxR~5&zb4?SHrUxXL@?B?ZBDb(*ouqT($LaRF*Ez-a`)DeCs~;@! zEE*@!=M3awZj0lzq$bfV7jISf6E<$9IJ~qeLgK+P+>+7w@+w4$!{~d+s!eQ#sUn2V zks)B&N+~0S+RmToi}*nz>nKb@$1aT-7Va^@2zZkMtIb&sN0z^&2+YKKll z`{>2RL*I^Va%%2taiU(liWUn-4{-{+PGwM?BU;1Dh~zCa!||#x`wGC5A=*r1Zp^(P zho8D*<`wfna|rc}NT!AOx(Kuz6ae)|y;fooU;XV27~Byzs}#XJ#z*OgY6Q@boS!A` zfcx`kiG+PTrjBKedU8PPH_))PR-U6!qxECu{2TgMPXoZL7x2^Z!>~k-)4N#0_DHKc zMmFDjvgwg0@^4S`!$kaSxAx_1h8-`M4C=^AhfALsDEjG(e1Zh5_%(KdwuMTF%>XTl@zm6?XMJyDezNZFNbdkYfdvL17} z@6p8gct8Whef2iO4$_1~{;64)R#AX7{xrYb|fHWiXE zCJ&yOFA_i)^nxzn1G|`oPkb&V)Y7pzKYyaO*>DaBk>1p+#ZLvb{n+zZGFdXL*_M~e z_2S61tX4Tt=!_S){l~+@vh}~W3zu{~_+9h#@-JNoHL#%;cdyS$^)3M0q zC8|*UlVIM}jPs2~pr0b~uK8p7f?cFg_H~Ghp5@c|)A^u5I?+co1OxIWrJ}Zd7S8Q& z-tq^vDJT#TyN$UBt_nV}Gu-HKOE<4c~(0MP9NfG)4w`Rk8p2PZq+ zIelD&du;x+;v=sZ*hanG3@<{abm25`^AeftvnHOS`@pf3++DZa` zok;QDC!5!+RgFgDI!4OGxw6#QVTeF9hwabg+#v3l_%icBSM+I{Z^0a~cBNH{kuCZK zT*2k^<%21M3UHWv$Te@hLNWOp@m;XjSuDtfbj;#16r6LVuPzE6u)XTaIJRh{YtT!@ ziBw}&9r5~Y(wHvT3W$giiDsLoCTfCJdJ9~v3Oe$Cp>XO*4K~mDNHP5&h<&eMC9Fu> z7>3WC;HCUMexVytr%4Fa80v^LsVX zJD$wo^x;X56;b(o)bTc37<`vc}j{M0Yo2~m?O zpuuL3USB9gp8251@ajCt5wDT3jiA)s*zSQq-V)Xr0w3glC}BP__n!40yZfcCuIKNh z>&yCf@{2pw>*c3LGJijh7X%6|&8@)m=&x%Ce7+oA!8qPgjpMhuA z(i#2moIw)peh+Nx!^8|MOk4Gdnln+apDWPUuCCW~is>ZcFUEhrhYwv1&9H}_^DIf3 zZ-?By-ufm~>aj7t?7S-TBswFd2Ne}BhjNa#y=d;HEcdmW=y3tD<LKE&(>(ZyVRE@qV%3p!H(4ExX@aJ%!rc1VBiAk+sfMKFA7 zg_9o8K{lmdso>33kSNgj$65E>&g6-Y`cq2+L#R6}x5_l29-uF{cKiw`ad`MioxA97 z7zbnYnisB5x@}6dH-G0z@}=@khU`w-rV7qRYv{8ZE_ev_#!P|_G|79Tcl&pcyUwJn zXSuLjeeg0^JA3mr8T-zpV<#krLH!X~wu7|EDD?!#XIEBIe$<)#HGup2g-@ZF; zxVT%0oL-K$7k9QBD2I6-y~4MCGF0z!LckN7`bc?1q zyJ;d398AY;WP;Ns;8S0j7bzc_Trnu2wU9p}u2Gn(n{b)pM`g9}R^%*j{XzZRw29e2 zG$wnMS;5(YJeI|nf|T=Hgf86~lfC6Pu2>1sR$BP3`M2-B?3!|C=w#`Bx634g7bU1l zA}PQ9Sn%70Vu^okKjoLpvl(_F1E_f-f?{cKY;mU4?Q{p()mLL#C$}HIcxv zfrPf|xYbcmE0&cfX_kko6=7AJz@dl<-Gbl10`)EV6^q7S6Qw>(=JK4Zw zNmg^3{&l-jGlf&E9~TM8!L=MBPFfn(7eqeVcCLBJG1Qmc+JhMqZ%`2}wU_i08Ddb# zb&3=?&JSp)?QN-IXk{*QYlLU}axbn^(~aVwp(eQ2xc2bYV2Lw!9SB5ih>bnEzj6)^ z*P7GXxk^4VsTQBWDwOt5?_BSEf>qf2m|QND4=^7VxK(E6>Oww4u&ueRl4${7H}3=r zVJ5nC`qT(I4;irye`5Ua-gj7JR>a(HW}Yi+9Its6Z1j|h!fL}@xvMyx3q}TvJi0fE ziArSeDP7B$UQ*s51t~Bdf)CXaue(R*M)_Ze?7y&%F!YdL!(w?F+j2a0y@?jY+c{I| z=zXO-rqb7|O1MWfg`VIq6Rh0Bz>S|f^(k7_8RdKGFyq(;bq;C;Fg_`rg%K9|;1_*h z?&g7gPMA~EK=%H<>%D(`k3d#d*1coU2rYIM7C_4gtd;D@v7IAiE50ZYuxzRp_BeUt z?Nm$elYp3oAjA5i?Wmt*Tl@5Hs1T-o^I8QA6!u;cz?TX+%i_-BoOO1yk=A96bbD8Y zC#Cie{?{Y*?IDA0XSP0991+L98e(ZhrpspgKKnY$k&O^wtO7jVB?+6XLAu@;3d9n7 zhL9gQII2&!+aD9rIGWJj;K>v@&a`3~4Nj9EjA$*Lz!ek~5v3lnk6j2Z(gz9H&Ze*7yB8C1_%{_H>9UEYoXCiDxwVvd242ok7uIkMyq>i+oA z(O$&d{r(}Wr=<*lsU7pxTRBx#s*fnF&plt?Z;J1e5x>gY_);RXx)(H3! zp|{#gyAb*^jNN(b(O=0fuSn9L|M~MC_?QHRg`XKvKj-A+z;zn(RaHkBawEmZuXY|S zs@p8v^(2=f`qXHJDS&oQR_VxvuayULrj6E-xTa6Hz)R^T=Th3eu#Vo$7?P1&437Oj zC4V%b={b%Y=W`eDh`IIYV`d!lQrbt8TkDhi65@+2+p27a@3f-jiAkz2ikHEY$EHRX zBzy8p$7TJ7CdQvrnMSPYC_vSI8g`~x?iz9>U$rVf8q?}Xm8_g`bTRqYTeld$&rshA z>)+UyP%PI>`h7>v{gmadRX)^Fg}@Gr>5!Y2%^Suk z%@6aAQ$9k%kZF3@{VT>o*RK6a%eJGBF;k41)qmlvVv`|+JvI>`jII+NjfiI{rbbH> zE=-!ek0S^6PfPso@3N=B^KQ6q2POw>l}|I@#(VN5@-IJs#waeel>o0(_&HraJ|JD!i%ryvN8-Mal(<#@mrK}K!)oniwJnp@ z9Sh*A`!sZJVr=)N)sBJ9NHjM>PM9FLfK|eSUISv%j@H=)=ZDE=JD=k8Lr!?7(ZkzY zAX5CM_#B!)EPw_LN_1#)h@`pc%N~*h0kU=FGAG4FGK$4XE2I@elqCQku*05LSxy$E zj$Wj&8nFDUR8P$3`5?x9+n;n6yj{5rfIqabo`;4|RMLRpI&Z|V{bVLx1Z-BbZx~t2 zCC0L`!hU1;Cd(#x_8DVJj&v51q4r}hX5smsa{+rr)WfwY#@SZ_V>!FZG^T23u2*Q@ zF|&e8KOSgj%L$Gk%yTd3o>R&SdbmrcDGg84HcF?Q1Z_}!9L$5T(OfBS_2)s39Qwl$ zWQ9Evr>JMU1aQ&`QBZ_w`on0hRwjXQG^~1r2qBq0O5krMFOj>G_mFw8X>VnmLo%X- zsbn3yhEHe&;Hoaq$vFN<5Bz6Tu8i;k@ob6gIVE|2VJAIaQ+ABJS-H+(_Cc}hP6B_%xr0~*K;hOm$t9{ zY+p3;g9Jm#c!wz(viOh@;O?uf6%-Wi8(#Mt>;m+9=mZ#1$Sw2NC>#KRGP8i5mbG(C zmIw&$@z_k#I2jYi0%p4Hy27!k0lOy8ibne_zEliJh+ebXU;C?De!iIm$jqT*>Sk>B zUe`A#tXGsb*G^-{tLG7uy2bHd#fj&^RYM)*Fh)+ko)!doRpVLJajo+c_MB&cSKxfw66!yCI(sTB_MJUcSSHPU$!X`L>ikq!%WZ|-I)}sa_PtTiEB@ahwpwzQ$jXhWvtcb6E z2beG*7>>T27T|SeCR_Yjq?> z00!cN1N(OpmY3>yX@oh`+~lPr5wK$lNNd?&3zwFGEmpCPrdOY7S;&MISnPq9c4B{i z*MA$c6UmvkD*MW&ML$aeB2{hxCjLO`gGZv#FVx+?E!+PQw>=?%XBZ^h0Jy z(R2dnQl#gIq%K~JL344d~V`pLb$KX&yB3U=et34|1AzFYCduNUB9B&cc9TgRmqNKx$vo4gkf^5D*j z>nXxds9lXUC#O>x9y8?G*F!;{2GJLH9ekv*AkK)TukwIa(pix2Wu2anEaHrVwWWdP z;s8cFoWIn@sI~@jWnIRtTYy5>J5+l>h#fN^e)A?cDP1%TeF5 zMR)JiKJyo&XN-)3f3QIEiU`2P=J~3-l z*RbMX(!H7B!2c?66uNqHGLJ4gIbcgKFh8ht3Cs|0ZU>F=c#ik`A)w^#bO)iH+r}Yb zQFO&qOFNzxJl{ai3&-wkDq|a8lXBa{%>aIXpv1k--PS!{D5)vI>ovsW-b!bq*NBn) ztv)o$;{?bpx~J@n(joOF{T?%gp@k(cys-{at|scA3+h)Fmzw;-u4wHUF<_K(^^3V+ zEF#_Nr&YX6prZZ;WfLe!hPlI~x5}yPjf!bmqWFJf6&|9daeja5X1ppTFTY+J)uucT^+En{n+>VX4IeJ;_mL0ud;VK&W#JMq|Ov=0a@fVSn*OKK_=C?DoY8RQ|uQL70+EFG_AL%F+ zoWHVLYnR1+T_VT8nVga_$@<#a%QZZ`KAa*;!;tl{cys#Ax0v-Lv%A%bzjnget{){h zi}BrP0oDLS|4Z|ihyPG|FPU&QbIQzqrJWOjfx&F-bkzF3wa2l^*^l+E#or_0OP$GT z$0qY{$>|}UlWoYC)yl`nN^*m19@Vy8rAf(>wFCmj6+*HxwkTS#5!i4MXDzoTnf}H# z>W!?Uogo0pzzG#MQnrM z?e+8se_#0z@p5bT&1>%m1yon2O$mhX&q9Sp2fktb<(cU}od-44BPG2*ZO92inLNJF z1pzaSz+z)f6Cep}whVn}`Zu^$A;!=b|8@`h9+-?|L`n~2s4SO?cYBvkj_V*#;2pOS z^kLKGSqWyItzPBvN2u@qlD_xOZwMGN+L-A7@)F)laE9KZ?O&1Ym201q<{CWG=d0yKAak2cT^JIxp7xDLKr+Jg~(1#y{%Sl7~Q*r5=uN zLE;Xz>ghP`UBfjEh?3=OC&33Vw?{LYN*sG0>n__!B#O3w!0*Zo_6gJDP#6y(N?BVq zU|@iRWx~?JVhy-AtiKT54j;SoJ12I!%_E|`0#-JV111gws$BZNUab`VKpqj8qJak7Ir9Llr*Miqnn`Im3e~A}nRW6@Se}ht26e#xCc-w)zveQG9q-R&9CuZhvp`9} zLUo7`D1l=pHTNARSZ;-3sh%5r+KfWvIJme2EmLE9i}J82z2HIG+saX?(aH|EHvsXn z&Tf(9tWI`}1F&Vt(Vy%7sw_n5z1J<_F*p7}_i~UcLeqR8cwk>l){_tLFZE%`TwVaZ z*XY=p4*%Bk0L@qY8|9t3h#Wii`=4pZR@+o229R`B`lm0?Z2xh@e~{M4k4h30c@U(J z3s~k(R;lm1(#uVsj1wirew9xpMwT|S}97J;s?1(;tvcm z@|l|A6c*xVCQLYCq98>^MyM(l7b8eY+6*Cwe58T3bSbl=qDIl6M#g0W(eV0|)WL78 zsa`V~GU&bVectxa_hb_y1!;Bw6=3Uh+K}|#C*x2e&MJMxa?M)}L zy%rl4j}h9Sq+rFIEK6QZhMd$84aw?Za6f=5jA~%{y;4zAh}Gm?3DLpxh~(B;{iw{c zQbf8eRFE5&2IeuMA#^LWDKE}X{Av;znxvkL#T%XgdM*tRWsc8{FDm4Asg>u?*aBN2 z5+nTn6utf zot-9Q*v={pDVjAsQdFzVmL7gIGi#VVtZyhFySRwCe;^K2jE)u*)wod?4p`aGS%_`Q zXR@|k9HbDxT<-|D1c-Lo=bOzgIQOiBPCoSu=;<1Ie-Gj(0OD}ovI6iC=&qD0fiaLq z(FEC`tM~nyYwAWSmH5Dfl%}%b8dIr*k!W9FNEuVf7#+A?0WuNV<{b-(^Kmh?mwOc$ z3t63Hl4$j9qPYYtiom#t%zEU^mjp`-$9Bwev$vU{S;g;0yLZ)muiT$iU(SDBLlalx z$0!s6ZqcB2+HoY`VjUdDnykMKLhFa1DoiY?dWs z1tf7v1(NETC*ukel!-}G&JmaUo$s+dVs`^ZY}gg&pw6R_GaQoJQ< zTI>p@f~I3K=_--3>BVudhPP#euQ}3W`lV|QsI^aX<-P(~6$&i2_lnQM3Sv5Eqv>Z> zk_I#-u1hw(6`n>VMM7Y_$cEql7W zoQoBvRm<_cD3Ia7r?4Ge46kF&_^V0J$-B$=9s_k{OEhD2U10eJQ!1J$AcmA@!2513Q?4Jnf62?#7t@`t zY||JP80X_7B-87-2Yc({=3=ZgN%1x1YqtrT(X)Phb1EbFc)i~6)OP2%9>cS?m0{QG zd$klspY4Ie+J4QE%%YFlDm7YfX{t1WRSQ}J`oe!{LN6U)qfszKcrH-d@5~#}P{3F> z@S>{E^8@P<^iQEfOtk>FgC!)(%2?i!!D;4L3B}jI5)N7cBiJ=vqPoxg?$JH$zA{{I=Cp5QUqz1k%pd;SokgH$Ip|K#MQ8rRfeoVa@g>m~ zTa;`gG48_KricY^tPfF+&n?vn!PGRq^g5A}$i-MNaT+Pb5FXx<^zeL&2tTj-PZ93h z4vQ6aBlI0Z@pTbQ5svn)Sbrn(1ERQN9U12{H8t(nFHKlmYZpljkIkPY_nky%w7myX&G!@iDtLdsn;z&8NM|_ZZp&AX0!lH^N+>7tM zrf>hSD<({LdWwcU#JYlTdWwy_#V!NamA;CFuu6>*&iX~y|4R(**InIg(2}l*Qwz;g zpCq?6mNg_Leti?{&Rv`0im6KxVzZ>^UPtq4RYB}E7D#Pg&kmN!0?Sg>Ay-7S761&W znlLV-I$4g_R*8Qw6BndN)SR)yV`>p%Fa}a{d33sWR8VReQV0D~86RUGoPL7&ewq0%VpxV&)I$`Of z5R3Heq9d!oo;Q{@T0gZJWyL(KyU)HVQhp-&@u%cQQ;M3^e4kF*g=0Q@YMiFhwz+p) zqAX?Ta&X2dg;Esksb^Z!F^y3VcbDY=yO1@Rr>`1R`1IpOc+%C&0=7IpWJf*QD2$i% zHK(lYTXw4Cv1mN(Yi~Tg1<>!|M5!l2VFraF~ZDOc0%`)U}X6P4y5+z5Tnr+_$Y_C}Q(Z7`dNupqOOPyll zKPGkgA;8q#m%SOsCI?hfrL90LlKO_Cu5vFl zibL;W=ChUaAM5{m4MP4sSu)F5V@uWwocGts48mj)KgL2mKu<*RGe=Nv^nA0zq1YHp`as8zbo}N0;gg-1q2KbLs)i z;7OXZJ}MOHXgYQzLNA8l?Mho%4b_2iuWI5#z8nxc8wY%)Ei8vh*gg^;g@N&#?Cg%| z`0uhCx#7Zj+TY4$#|HDT3QbKK!?;xld>wvB7i@?V_*TRM-=T~Xq~e7HffoRDN-W#r zi*5wbtbr_B8Q}x~2E_~t71VVPnF2&!e#S!nFWQo~n2MU`@q59{!zgm0Xaos51wB(6{ci9ldh`vh->tY4?jKJR2tDf@*@#-%k+u_Zo` zODHEoDJ`YrBtZN)9zYu21_h;JZW%JAP*BVntm)gijppoeg5Pm6I;pM~mQUFmR5(cn zl%(925>!`LSHODN-R67O6$i`DUw`9oaMKr0eP0pNP+LhOeIX{ZB+R(0j2Sm!Dj9E=y0YmHcmU7woQ5Zk2}`zxuTN)+7mMz6=L| zMw>9r?DhGl85DjfghJX>i`GeyPxm@^K$-HbFp4aSY~Mg%;H;rk9V2PdW)kn5=clE} zRtJ;2@Y*NVXPw4NZYQYV;sPU;9ZX=?yiS2m;U*50;C>-sDgwQ`teJSdS4qs$GOgv} zW;6nq-iSlzFEISoHR`tnk&|vRFbMHJ@<#r(Y`|#mc{x#Kj12n(OO8c$;iP&_~xbX|u(Jl03M`pSNCy34vU z!npIj=(P_60@43-7vm5=2E4z#-$(FP@LJ;vy6B($?ieXLI>?d~6n_pz1qj43+b?!# z*_p!qya7szytR%z8%A}WW3T$t7@Vh??DZ*ODqk$GrKL*lptH9yaw6Ju0p@``_Fmx%p#w}nrqec zuP$A}nKvKHfR+2r`dtw-Gqc{)P4(m|JlbDe6+NE=*q?0_p~p{Wz|emYAyFse6&u-IQ*)1v z>!Fmr>MgfOeAyDrugXjlpS{qU3fhQoOwZTH?(%;uBgwa+TnOP#7G^Q32<2Rh)A%Eo zv$pR_lJvgrmA3wyc(0%?x}^%(iMlCNI(LQ%DGzv`zoTQ7_Cvqvcwwlp_Xv5~2cFW; zw&GXO;}bar_^MTVqOvnYYhR)S?1%;$dxc%2gjG5kh4nG!vvs78=8J9JO(J&GA~N== z!lBWSOGozMxATb3%RD?bqo{nG4dFOhY+=mpoDg~7c(3@+8ey{XTfOjf*$wkhQ1iLwPKc}?RA7AVr8WCqej3Oy%vd~noEtM@c&O0$FekMnf z*!!^}$hUL_Q@4H%UES_3I@m)TlFjUL(8_cfwSgO}Zc3-f;n;v3m`jHTNaw83@4CD3 zO3tzL&YC2%`osv7)`egu&6JR@!v0cUQt$9@XNbZk1E0imNFJ_8vX{Iwq^RRwQG$eu zV@2qXAQfUnN(mm9);fbxwR`}?y4{eaA~Xng5|=vq0oH)c7n)0lg&X~gu|@&_0?Ame zcx(lcucmZAN0Hy89(b1zCl-7b(p_b!V>}#H%qV>?9GEI$4C>_fmtP;lHq?b*{bb%> zJd7zWg_G#65`|#U9j4eNcM3-+tB_XfPdL}AB-bd@e{&3`|}0xW8t)_-uHMuj$Jh%a5*+ZwR`&Tf!x_M$bV=>H0~P;su#5 z+t+KX{)NQUU*49sma;OQWOzrBacQ*ger^Xy*oCm@L0rEOQc=3%*-+Yj$s8Ha*HAJc zG>|R1S5{EmQK!IQ>FHvl_102s>Z|=vz9|{bC-MWx->%5tS8R{UicCzzbdud8CYE^S zUvHK=!9qw)M$EUKQ(J1&QJ+-@@pN?-Fy~f;*M-*z{dhW(*e@JC#Pl6l`gdLM(;WOi z46T*_#lcUrP^kHqYJRVdZxT<3s!y1)o4{J(7W(Gwtfu_rt+-AH}F4q6zdQv1-?}BVB;^oO!~EPqs&W|A(1e zZU5c6U-)&yk+vn|LP6d5Wy+;2yvvIGc=@K(z8L4YPFC?3ugp_!z6F>2p(TCbRrz2mmC8gEGwAug{E#F^kc zTE7l2*N!*TPzrMn&0^%!3kYoAlOtcAGHxDIRCJ1<)x-Y&0g$((x*jZP{vOZos%M;n zLMkNNadPsm)5TS5Prb}M+L|^G@>9_rHjHGJSTw}l^_9m-&F}w_WTylG7v_TF(T>M; zm&X3Z)#YmUFDh`98&dvLy@^Tn7@%W6rB|Q-=T`^|Lo~1jKz_sE!gTX`#}cf{d;)cj z{cb}Yacq;TUhiP9V>}H*A|A^hg7(E0Y#$OJN66bP zfi26EWDk5&ijgyc17avmVg%byz2htag&}5W#G({X9YnyZv50-ZLht5=v~{UXkeGV9 zv6~&MToPW#__udr-K;NEpV*rX{5?&;NJ)poX9S;b$FoGj6IJ`ZpR8vF#O_u?aEaft z4Rryvgh`7sk#%8B*z|h2PEiL}^n=Dps_oZ2l@l`=eZ9sewLk4^hq(BE$qZPD$%@(y z_`ekb=JIO*g^UbiIv-gbGsMXZAF0YTNtmUkJ6_!kfLpzk=4**7mbz?^@i{ zf#V=3&IZ&6=WcT6`Ep*DpAxV(cw~qWVI+6a&8*iOFi;B~;A-SVDDR+Iat2`Q>!M zN=UTKXEvVUXEjcu!c8O~1A4Yd5Tv9%8veX*)I4{;liD3AJJ&~e0ho?+x{s|?MlCk721X^y;z|PlaE=;iC_GXqnL_=Q=5`M z-zqINtMc3MdyyHh809Gf3kn_S`Ne)?mHi4@t|VIfB&Hv`bUW|lew&uRe(|J`kIUoO zzCM~D0feTA2@4=L2or7jay%=rLRs^c$Ja>w{dh?GdRmu-K8k*Pw_<`EJut_jdcC31 zG=IC5pSt0_u185jlh14DRDy}T^M9o8W>pqK&k;XyocX&Ds5A7IU&PJ$P4+FWqoO;H+k8^># z8QA(S2oY}3fLUAU88h0%W}-(jr+w-ikA1Z;>O=EWT=8_L2X%FEu)>OZ`Y7kEbWpJY zfO>Lhs7FFh9xAfeM6z%`Ro4#6oc9@If2Nl#rLuwe=;=qJmIu1W6?0g&eb=PaoT2-x zy+Wvikz>n^Rm8e!(u>AVT=rTT&++#bS{2tZ?`R3UX+4GSHta1u!Gi-2O9(KbEG@M*1%1%roLLnMDj|Qi zUm@g3@K)Sy<#a^VblRfu*geY02fL#6Lhn@cUBl6X?5wP;>DK$i|8G+ZNbutcble>f z$N$IUfQfK2gf<73NP@xIH~` z>>abhD=o07DV7Zs!s_*$@;JV5_#xStTv#N$enM&kyd^b{ z+tksrnZP>EQy>S|J&s?&cL!h8CPLIRf?Y*_!$^JNelRH>FFA&aXdf^AaR%_N>e2H< z(58BO6yv}Xce&01W`td?6Z`DP-1m{EWjKEv2WlVJEH5_A51@x zol+Yq(qZuSfLI*)A7iwjg32EObcKX`#wB)<2eL311^CwvW@x;rbzDjpy#zKc+(mes zvD#KSAXb^o&EoO*mtktjUhW}Ojg=JE_jJ?-W`}B{6A`e=EeU5xu>5Dadb4a8w0f_a z(@jY0@_ciU-(zM6d9Aj7Q<{~9tD^Dxh-`J7^*)Y15!VB3)@{)I-=@QRPYFVJ;}y**#mc>2aHr?-Z(>rZfDO-l&Nyhrs+ zceyX-t0_vh@|M^*fxF&R1CHk|3pYRr5a#k`;i%_|`>0n*jGjo|CFdN0|^c z>z?0gT3imXk5pVgk^ji|rR1}WK0Qud2WDCyUgR)FRrjr`xmz#Z)0vY|%NZISHICrt z@VjMgT1WC;32B-Z+v?%ZCw~XB{6|`cPhAO$t0BR~VY?yGLv7cGhE+D zWL-G_ZqaFg7Thp>^?Ngn9&l|?{{yg!^_!{Q=sL+HuCDal2;5qk!UCWS1N!z=L4~?E zl}&L$#n1)28`+)l*EUWA&9QQ{KhA)DI4X(bjc=CWlCA>WTySOI-pKZ|oI4oKpE9Dy zuO{okex(BB+$~S3rWahOvF`1#qt?aOwYfqloI1G6mw!%LTHD9h!EYE$7J3?q_j_~v zzTM~vEfTcjDWDE|Sg!*nCR{uRsz|&l)WP~X_7?>!!Y3E&?BwzFUl-^Jny<-G7xlB6 znXmfIs6h|_dXRzJ(s9Wv@SCnZm#oq0wCpCTsFbev=6yx!-lweT6?Z=riQDdFN~^~v z{=edue|yO9Ph6B=|6gS%*7**0#$ZfRJw42?6;^ z2=Ee5RmPC|yp)T8dnv-RrJ=>ZR${b-t-*;4Z;=PX{&O(4Ga8e_XtM_vEHsd6ZwI_Z zRy7PgE<>&|k!Pmsa-D(WVA?0=K8Br)5NuR{(|}*k`;9xfPuyb1ca>wKO1E&h{I1bU zZ6co(Sf5<-qLekUm$VX`bF?oYmJ8&Kj%7n?T0k1^^H}*x3gnDbR>3-xR8B0?i!E*< z@Q(&Z03?q&3t&1aq#q!rVGTXWBtCKVIR!rgM`9(6L#PxesbB>*amajG>jV4<exHZS^G|@hqH}_vA8#+aGf%w$!K;8dw;j_J+2dt2Z+mnr1B3DZ7(n*B5}@Xj>X>ee5I6rS5{)nmOQ zsX>fecrQsQM%4|11F<2?FAjd_ORplqpy?lWO*;SLB8>d*PpO{l4cAe?%&6;32St1_ zCr#Rw(AS{8ljXBdwrf${0kyUmzc{;WUp7yC^)x4|BHGU_1daiv{JqvP<9nj?VK?iv zVjeUV$k*td9$F%k}N^qMgQv#7gQqZ_ub{^!7ovZxytZ6$;&vidjI zd;oP>n(vB3?I2Z`fA(FtzdA{pUiZ(~WOY<|=sawQDJwKURAp;MO9Yr7Y4NrHsPnA4 zeHr@x6zV?o_RFASUx_kDTs@OW2Z2F0k*COC9J?`wYOToj65-XVjc@jMoo9I+zEaM@ zPDke!$7bV(QcdZE#8Nxy_&r=F+@@d$al&uph#~w#J#H$T!F zL){+Y{BRraA%)JXIsFQ}v0T=xrKST)GiE`+e<_kP+RrsTbP^AiY+n+;BumQq(sZYW zk5BO1HTnA6$cpSs2>YoOK;=H%!0Q3e48|v424Ecm{d9KX&L!2lwcB|hzk$P zJ0I7y5s7{@`_WK`3%J8D{1Cpf6KxsLt93b#qagu}*RNUj#N39%R|5}fMF?#omdjh7 z*3K}Y2UE>p#?;&OJ|>1RH_u{G0JM)G`rag1glN`mDb>HjY3QAi$70(8J-g7oo*2D) z2Zh3-lAb0^CC4p0_Z7dg^@WwMic!yQBszGU4qsvfN}!9JaIZ1H&Ox1@D9MU*WBuWm z>-xW$ay-_%p_+S^UGKkX*q+daKUxvQwtbHY-Lf4*O;_jDU)Op&P4WdA^eqV(-MPuvIz&q*o9o6#NN#QATmaeT`mRe7O92+nm~S z2&K&a(&-vlJpJnj7r{Mmw_Q#kPr7Z~%b@JH}B0n62Z%doRGJjS)XU zjB4g2V?w>2KocgUI`YvH`&FsDC;ec0pwj!jvf}k7=hPSy!bI-DmXY;d8qmyu(o21` zVhl;5+aTDq1gPh|Hqw*rC-dJ$<5(a^Y52yJ0Hga_{)4G9!IIW9bxH$9HF2OtwLScj ziGdH_>OgDMZs?tlkFfLWJcfPMhj`=#*&Y&jifj3w(lz+yK&GSG(m;SMt@d;a1MQsM z2YI85FtryZ5GSiF@RS%#&P#(;M`lktpiwG zMWv&LK`DE}#%t+SQ7%-RlNE@#T^fGMAkg=%i*AymYE+b)_R-t#qxFwzCpmaEYF|f7 z)^gr=2oe}*$Ar>#e2{^T1wg{(E3lWwIh-LO{uod~6mBi&CpUWT@fh`NvfpXZmYR8O zzs|HQ{Wxed%JP=>6JOG#r38?eARW*1q!H)ojK^UNsJOG^GmLb)4`C!LNGBKPhlH)~ zW279+vrTHLF5YjBR{si0{Yj{BY;>4CgB(~2fTS4!3M%eL2Nynk8+IC3=mAI=uWZCrDnatHmH!=kaA50#?Dc1ro_PAh~+ zfnrDe^^+7Dzlj4!VkHzXpx z`}LlMW}bDsI4f7|+)3;8R_kM@WoeM6>$z9)7C65ggjOE20xcmJEPa#%kclgQVsgr8 z@(W-6PI7DeHwM@##hBDB3Fla}T%}>n;D4G*fnCHk{q@x{8v&&+Q)#`|{p1(Y1_q$9 zT$=tFHEA=IotG!`>wJ54eJlsH*b(cv5E$ECzs*(p)%q6Q`S_8CPYza^Gof+hjioYC zPeZ^eUD{o_a@ZqitB<)T7Niw-`WPB<%~QIChIzFjyKTj@ZyS!Y%bErMkM{BgcNUozQ7%wax9OQK7 z^{cD5|55dIWXH~xuS>=IupuGY%I^^_eQ+4*Ea*QK>(_HgWnic{8K|^T?s_2T#uSc; zA|#1?Fv!LLK5_|%;|RB@St}fmF<$}+dmv~A511{o(_+?;EI!u$+1wAP*Q=p{-Y<34RT)fjnYuP zc8JVAL%29-X0O7)rup&8UMYK-V~KIt`C>aHb>u_>hJ42)6^)wUg!NcFs}j1GnZ(Za zAtNZn3U}s0@eW~(!nd(_T*0&FcT}6{ot9;+=zv&%bM~uD70HsX0OsbBUP1 zc;JpW$db@IsYrXoWZ8^zAtR==+V&b-NVZSTGb1Z3DZ=g(Bb~hy{s2d&iT-{%gtV;( zz(uFUXCgqT83ZCI(1F9-_gV4Lv(bMuI^`F7vpO;gt?Xnar1~ex zU3S2ov}P-LNF;K6D(-tJICr|&){<{rJ@qHMgdf{`>q@Y^fJRPOWR(vzy<9c_iIe0V z`TKn)?#LMoGtdX0{-GQ2O zx*E-Dv(~brjGW%*G*x1HpStdw{47w#4R>|GZ?5|Z!aGvGSg)Q1_BwrCdOB|?kYY6X z!ElnwyC39mZV=0P(`zgzQ&+42$Fi>;*y1f4kws?iYqEV1;$DZXM%V5hw|tu zM+0MP9(;bq;!&yGtH49=P(VmlR8?+a{!o~ed1)UdO_QD;R4edew49zcspu8kkNiOH zpHa5W_v~}-(M<_`<*JZNTnrp~gMpUQ5p$g`27m>cV|~m}iAT6_TQ=p|Y}-)WzeP1O z;v9G7SYay@O1P+~Ai5FcAQLk4d2EU(Q%5(LBE+ic%Xfy4^$8wYW1VnMWiK(|KYXFb zHg1;FxhkWOxY`l=+&g(SCp|hGFBBXjW5@?Z3p&90l1P)K8SD(oMK|7>jN+BMbvuEY zD}#(Mkj$S3`h}wiWv2&NAQQVEFhy<{g?N4x*Z4sJ`rr%iRcLUA=uG7! z)ckiiXBMx{+d?dIQHC^@i-VS1Cbmb9~|m;<*nOM zIzD+7YHS$0#c@S&Dvq*g**!4n`CZcLxh~@hLKyQ~&av#9{w9Asx?p7Je|+h4Y0Ih5 z*YRLs44)oln7p>tdHh$a{$fmgVA{%Ka7)Bv<{oOu;U-K4YIiN!XyY&hp65Bc7ED&Q zwu!)O(eU`+f)t;bb(-1Kbx~nz!7j_q{jHD!85<8Ghmv9;-;2~IT{O`STlBd2pB5H; z*y6jM%O`V4gxd#S??7wXN#uYD4Q<8Yy7;ux2#B-vkPunlrpA^QB3D<~txxYa=5Q2G&HqDkKx=;`2C3KEFkVT~aA zVg)SZ&hL6aTl*)(nb8y0ao%7Oe-zn`Z-U|c=Z zVOKq8R6c{6F=W9FONxA!$U=k@?V0vj0nZp$AY8njCa5NexAxhPw#@VU)^HZeu!^Fy zdi)v*x~el6-qKJHmMO9D=O>Kv)9a1uTkR`P`B@ly@IIsE9ZbT^*$I5YFe}ZX*(R5J z-$|-I&BYV0bied?&zfUu&Zy1OwK6);=yW*y^V?g6sF$+BOi~~k!R#ngr9IrjeTiPD z&hz=52n%LLZyCJ#H&pW$So3vw?4X~n7*I4!{?IF|k!Pf?lsh^i(@JvU{Zx~tT&QZ+ zuJRUH(yL3qoyE4m%PXwkesM5-;6F88Xt_Jn+Df~#Lwk8826{Z@x)iJ#M<==b}d&n($e?t#gz%kHF?B^_^B(vXa1b>)9Tf*8b{bg)| zWK7=445?EZn*G%KWwgalo4KHOKYQ1j_$^rCHN(_NYk;GNWiyxGIJlw=cur$b>A{FT ziu2g9(##?eVae&ZN#TXBtNldup~5~9N;5PYGEu05^gns?!qM3Dj;c5`_62w6%1ny1 zi?WLB(Ir8m-=|>lNsQPrtmIk3*uEHBaP}E4Q2j_q4oQP7pj1}PX74N3ezI*O;@fhu z)Jq8-W@ksO${;;qcSc}5g=8(cXkm$3m22Y>_eoWZqU@TEmZe^v+)q`Jhk%!xHqV(@ zPl7?+#93=s0V{U{o)5nM-w#w*S?x4Kxk@$S))Qi$PbHM6;$Yy26K`%rc( zuMNccM5t>#4>|wp1r}x*G(pi@H$eIn=uSaZyXrZ;ftEI|jR4uS(!GKTe#yg%2(h-S zwOlfdc@WvU+!>A&EP43LWKCBdZvJ(pyb~IF8p&M@ehJb7we;?S0(ep`-N$#aRv#}; zcjc5!@U4q%G*lNfA3T&L%0N(XKJ%rAo^9i@L`z{ZBnBy>g!z*AEbT43uWPRa5$lf^ z1a=ZmR4(#1lvFO!J`QqW)|tqTs3>L8>rR8mmc3yq?Ge6#r80iq-1e>53hY+oFK>;F zjt05EX^u^^ZyH8YJW3mElr|S*=pPVIvjL0ONCa9A81Czl+(I~Iv=4;R}G^rtD ziIqJBAW-v{SzopOc}I9z{IBY5OYZC$b_PxMvmU_>O)j6Xw3eOZmaYi+jL-Ta0~a+w zdOiMkkK6X{>WY5*efQ!d%WhAPk*{Xshrf>;uK^2uD8sea*fA0rB{Zv|- z`GSLl9shGFi-bJimoG&ceW~=6lFU-X!7t@2?@uAwa%q?qlixc_{~Wl96I?*FtC<=y47}xSp8i!JRnD(68i4P^|SlFQ}C&lXYbrg#YZu5 zr4YWVs->|BJ40p}19JmCnKahi4(%#z%W>N@^`f(myoJo7j$fH+f(C{vp4h4;!|oZW zXwnWl>TJh6Hg6RBfyY8^6Vj(xd0&SVE0QcEY^rKXhm*+8Xuz~M=z~e(ykY$46Blz5 zIUD3?Z((#Xr8N_-Bmoi@RHL}dDHfeK{Cz90LSm#x3jvS5*PEF3$E00-l2=8zGa_)hP`U1viMNdnojFST@s$3I=ki9dWtdLg(eIxC zGKy{*C@o$bHmBij)hZW$pOBy2iZh*HR49{(c+Hp;pEZ8)adPmQrNLj+O{e6Uo)6Ov zlranKhedg-AN$F-XMjN2!y6g@MO`W4Sos)QkzxBl)|s6HSgRNaTNYCdgWUcHAZGjn z>3}%pU#<`FKM)TDpmoT_0GvkTrF4IO<)?>x0_5$~%caTR*pGb=c%rmC@N(8Zb{3wo zK6bulk4kr^%6Wk3&pPP!WaTk$bBZ!>!6@V0{Fd8g=V2m4^6RV+m;L-T=_{A=0l|j` zsqzkZ&1EWkIyBpYy}>xao|yZBy5+$#P=cgPFnQXRB65$jl(LCPg)?oIvIqe!@XFSx z9`T`>28>P*3CU|zf)4_*PqZ0a?r>@J!_s4ryS(kfblK>_cBvj5kwj_vAt|DRBmt19 z_a>!>Rj)S1^lJH`dJzo#lZ+^*zrA zj2W7y-mDRt@BUKoF%xZ1H}g`}n*2mt>G*ghda#e9wR~VkKNfli7oLekZJ$Zgq@~9A zMDkf)ev3-|>GsmxOFcgs2JMQ;M8;OyBO&4RU(!8w_ceAnf$EM}iR;jX%VYBO$wfKi z^tSZ39T~Qi*oaE!rvm)hInA^^F?1^i{oj+t(^!Cl>o1V}?yj6wB4f?gfQtIu3mL1m zE7(L*zYoTG^0H3L>$oo4dy5w;Dym&yPp6Hh2DK>ooJp_GV*Qp!)UGL8um6@EppypT zL!oUBbXWH>!4?3~tC0ep&EFcj#uet1R4pX}^B@D*8xX~Y4HKPo@n{Y&SXoDhda7hT zY~Ih4JNZ>7@oTitc28XNn%p;=TWqXFz0ZVOyC?c%l!R328c-!nzcN~k+bTDmb$-gv z*Qb-2F^XGwfU8iy^#;=2q#MjpM)l6y_eh|rLL(4TIbZS5qMF*M6`E(sa?Oec(FNfX;?fT&5{!I*f-R~`p%3o zJ2G460JYfD&pUNq_wcsiP>?ur)HY4k(H@;pHjZOaH8EjI4tQE#>R=gHShhAXIhj>k z`=F-SM)S?|MDNSDpa_~u$df&M$kCDb=H;j2rt|@cToxYr56bKXxz!k5QQ1gi)xvt5 zEXMG5b(~;l@*uo;1I>4cJW5Z@Gu`{h9*_fp^XIqI9Zwh*uJjT<%1j|lx^w~R579TU zClzY=jnB_tD@?n@ z!b#XTq3TUh)$yR)v@V24BzxYp?we`VH?|ID`UwKDWPdgl-unqrl)_Wm#DUUJp*m5v zsS-n@DfbZCCcNc5D%4plGcNDD-VsC+eh|Jl7_NoW@-gJRE@701pROl!A$WXbx4U4Z zpVjSvq-{N@<_SXv=Lw}wa&4BKT2p!2j*Y;k1q(wt*S&mFKHk4nxv4esd{%Kr6ZC+7 zosRc~vtH1S+xgp<(Qf;(9E!ny-|!sXJf{~-9<@`E@YG$8`4|78+ZA*Oz`qBh_sxIL z!7$xztNH10TfaxOpi3~U!5@Es#pCNslI*Umd0QDlPSHw0(R`mm=!PUJb%FVcg74<3 zEcc!6M@bY_DJ4(#o?c(Qrq1WI>b?+3GjtQk$uA`fg+K|RQ1T7EtW&{tv5mP+D$+mX z?a3MVu|t@lV|Zz*?>!6el}q1eJ~T|%IM3SM+(pKebu_$32);!226k6~tPzwWay4)i zBxSR9bkq*0jOOe!-Fx`jJln~him)j)$|Q&6w%6YA2bknSAWLa~iHQwhfju zbqo;C9qa6U%gmON5BkLNicyE_utW$)Qxr$oId1PSQ=-AUhzMujVT_CfbfWj6%s;bI zUADd+umEL0;o~LD`r<xLehemPd-mX3BbQQQ}a%{$+jZ^h?AbuY)JBE(9(VJFp}^71~61(?fRj{OMg&X?sX$u~(xVn`GF zO-xQZS#QZ-GHATe>DVCllm8A0F2Bsl4sgZn=jb=q=d0|`~<1KdjGi(KMyhEbF5h=RBRQdzC$Kt&@49{;ZL%>f6$b~js>#8QB zItGHFc)FKub5hF?2mVleac9wDh4ZC9Cag9VwMy2Iw1Ti_^|x}BFeI}foAS2yjX?ug zMdNsp9qlr7u+7obA$4j>7JM758iiEuJ~8FTM1)T|?mV&MFsUAMmbqp8=VDw(MNC`H zq!wbGG08SmMZr9yS@cZ?>Q#75W%=Zl<96?}J`wgA5$4+knG5$slLzH7GtI8bFc9au zqN+{l?}m8}1O>Tn)2=WR#ze}kS=Mgnc_2<46psBZ5-8Z4tPH#hm_J#1;%z%oj+%dt zHyf3-o2uHf3JJa{)oqyFU&E{y&CmQPyK(dGdIXRY|6E+s|G@EF?*BN87VZDw`KmEt zGr5*tBUIbw$!ojMUDeEd6k?5(+{3~_Jdy9-{EAr2jta<-h$NKuGFTV0 z^%DPDV+OJQ@x}S7u|X}b6kgXR6R;~j`@hPDnSijweX?D=<2B_) zi~yW`t%}>1+h_CDg}O<>e`c*LKc+@8nGic|VrpfB1IupI*W*-cyEkuDXuK6#Ye}U1 zxINikHfAmW@Naa1(zR{FePapRD+54}DGQk2g4&$NlMzTg^OyGgpNx_oc(0i)jTTu6 zo+$FFMk#h~kdy3h9O0rkFJ%Znc0A#=y_~JGZS)&I*oHPwqxtnH5$xQ`rTclt0#?8%BfK_WTvx>{=9J{!;|j%Z zbl>Sl$|&uBkK|rzx!7I7ZUj3f_GI+BXO}mNO1sN;&&V=8&nX8H-Ym5aKM5NrW3W!% zsZG;D$BP7D=;m_|q^|2{ zHqaHhOwJGshQtn6Et*vA;qcd=7+oTFD4e!_ZhPr*j31p7QhD9IK2G*~Rx-B#Q3EJ* z+tG6naCwEmKfO`^6%dW9-*k{kLh?Ekpfi$uTR2E3TlrPgk^AcQp#I*orum{!9FK7-z$xzil!gLXFI|nRYvJb-nITH>8kMo!#6E15v6URh@Y*k4(-I!d=?^YgTSM0->{^q-g(aix~9_qll4rJWBYHeS^Q*TQ2DpIR?f$ z?R&82Ap1A845)vDW{4W%{z1#}Eu{YrIM1yAL(lP%kNPi?j(_1c8>GCM3BdU4%Q@pg zVM3nXS>N>ymAAMYqj4nOwSLyaWB%)QRN8b9?oknsnFNu(&T7wA$Vik z9v(N`$40?`iakKd^z3&Z%5v%@hpLFA_kRELiT-8qNlev+Sp(ym!11-)T9%Y$VVRtU z1VhuVt>7d6nPV2Nt;ZG{hOhgOkQ&Z?lxU)>rhBprf|jdrHLxbIM#?5c$|NMRWNY{_ zqlgydM)jWJlzEnwzOXP0>k4WB7q#l?1>vLn=p-R~XJ0uRBMpA$%qW}>%Q17KvVL!o z0~SZnZ;xB!RoqgFUv9LK4ta~f{~C0g+n64fjipRhcDeo^EEYUJA&qFgsV9< zjBbjRX%LU@$+5szI@hJs8E3J5Bs!`pQ(zAOR1-QmYK{v_$U!=7C%vS}d><0{gtx*k z3(xzt)mZs#)FzCzzj~I9-&@1>uTvX#D2y)X6%vsMG@N+WjZib#9iBCyfs^>Q7$j#A zEM*ZeU@Rv=54q?1R}fJM)(dAWubHu}nU7v&{_~CjF&xJSx;TB<89{Ykf30;re@R8Q*Uc}5R~c&8Ykt?*YS$YI#om6jcUo?dgVf{PEyd?iEwBr8 zVABz$*YdVASQ;!25BG-^hcWokYjrIe2`nzj-P|JgmhfP}ywA*R=5bV_rMoRL%`x?t z84J=(_oARVM$G%9S0}Ui<*QdKz^4DsA9fnXj;epJ*J@OMRx0<{NACf@;9PkZ*vA~S zqFdGdGPE`7gMV9xgXGOfeAeg)ui2)}Wv&fck;(e6l8sno()CgA=$hdqKefKMcrP=w z%w9a)N+;H6@C)AHkHxNTz1Jz}o|f~hfb9bcfhX{f5cGnv*foEb;urrun^%kS8rN4i z6yT<9av&cN2v)3j9~%{YpPY@3`&cMYuSr9raL|%lboR-r6p_!w$$g&*;Ec;< z>67ym=mP`1#9d;a#7wPYh5`6jY3Oq>$ka?&WfB)xJU;LQCk$?4mJMS|}Gy-0NcBTBuzfrch>{C2_+Va6<8QdLl3CB$*p+eTe`3M9L1Pf!!wx`yATG0Hn8HwIx6$1<|9<5VPW% z3M-JSeyh{;oqnD_1H;{^N9?^m0z{Jztc#=d7#pikxz2iTWvcwnjtMM-eX=%ZL~tZ5 zYJSAn3hkqrJ~zd94a@qoBTYlao$*61!DEH7Ie3ODaw!dy=$t>AuAr;Fzl~9PE z9PbcMT|=+Se#QIj=AS+;4Ddo?+=BxHf#VyiBWu#U z46=#*$yEBHbL?lEckD&}2LtbT@WtD5^Fj}%8cQ_GOCJn~b9T(x$)NUEByHzjg`L(W z8C`#sRrW3jjD&Y{-qF`8we`j$A?IHj%Dc_!GZL`VsOPwr2q;d5v(&KTsZpoFe{~pH z)%6r-{`81U8q;}Q$5h+$tw-fnW*ec3pnnWY^kyq;{MwkivgKIH3{?eYrHI82AYKmP z7zj&$dG`_*3j^%jE`Jp{%5pD4pisTyAxSj;cc;ZkQX1-{Ftv|N8X*CkfLw-ON#2Qx zNs@-zIpkH^JyCB|3_gt3PP84*aZD!i3}->T7}__}j4P^aFRD-gW|F`fX?OI)%3}Zt zX>DU~>z1hDJP&)4bAI>k=JfjLWek?xQI(^iEEc(IIz@7n+Kg*L5MBIqGd?jQ-B$>= zhb4b`k(zQwTrId3_@Ii%a-4FAT;~T16`eonu1JJ4lgqe4BXH9od9MR7pzzwLA(Mf~ zNBTka6HL?$N`w)%`iX*9Y=1E{(rKS%vXc9!>#kPJ8@)1P7PpWDZ=KaNaQM$XxPn## zRnMz5IVpHy+LZ@811*7RzJB8RPwct~PPv+X&jo|kcydpHW|A#rb%h{1wv6eFz76}g z`UOKuw0RU%gib)$@9y&=nY<>eQDp0c9$=(->NLuqvf7t2+&!v1H_8w6Hhh(1(jpC=3h+HtUNpx++w zQ=e;YW?STkR0}$3_~LORZRCr9`cwCt#p$A(PfzgSrHxDEnpNhHPPQA${R}`+%KUG9 zIg0B2qK*_oQ9132oESZ}FV3i(FiNK05aA>eW?YMx;9Rs}Wttl6dE>}TlKY;G> z7(J*~vvO)5#Xp`$ zow^0>OCacKnb+vy<1sIzDIezG3P)1PreT_gCYe;~pq?fpdU@|71ArFjKJ!H!a3{dd zMuj!!XAwDcAq0HNPF9Y#@{)#DqSgyxpeZ}cEd_B#8-6_|3lq|bO$m5CwJw$kPvSnr zhZhfWuFuRg@X_WCJTLcCWQ2RhpaYK|H5r<%MUYQZIPE_rSRa( zbfLyqh0yj4ER2Mq-l0lHISaX%wl*1PL+1w=6c39PVS9CJ>(j4r(VDx#8*Ze`^XjRF zG8;V)UT#-^`olz$`o?;Uhv_bB5A2BB3=r$~*|8&;X44mW(li-~5qFPXT58)o8zSTY zmW4uPw@-{+{)fus{qp-pgYhsrH>l!{Z{pk~TNS3dwb3{X_1Ig(a!~f!nsjYHfyH|w zx(qT;F7AhT5o79Ffq%YYRX=@dr1tj7oVLzc1M#wtF}Q;cz>m1T(g1EJUdE@>#XyLx zo!aGo!A&%^pS$?=SC5C?%%$y5ujF*kiTbwQ?|6ua+^)Ln)4c=u=Bc>V96>_re)px0 zO$>x)LfEO4NV#x5X37jInQEun?|w^OCL7e><#M4Clf#H?=QxA?E0Vn@VmLH zKaAkWsTC(#xVZj}+IUwqdPC0SxFhAhOs;lKunvNc3bg618K) zy)?!?vJ#Jb(;jGY9d00Y1GB#v$e}pc@_xJ+Lw(RHb+IB2Dk~3nj)?eKpPJ)zhP%<= zI?v2kPYx<;>fDckS@OL97SI++)~goOAsa#Si7Y`BLvg+Nx5q!6=k-!r9ohXPJhCJg zV(RTKdg_ldvEgs_d4Q6`V}Ge<@x%l8MJ+^JkR!{?132Sd)Qv!vC5L+1RRbyeipldDWu-v#h8SM-Y zHAA1=UC>+pg`Hczl!m(M?t&sp+5o0hIbZWrYZ%W92_oTNSLulJ%*@8JW4{v<{^PzP z@-CTVK4*)%@8j4I`UAvQCxU<223^NWmTGqI+h)ZA|G3=aE%C~&hw%;xYd+`0Y5wTnJf7gRdG_;r?TE$g8`U+|=9<_` zio6$f9byh5+grp-BbC`Lg?BP&m**G$f!JOa#u?+Tvu4R{Ye#)HVaNaON0K*CTpN3# z-k?*z8fZ#)+=VU143$Y~iGe|**Vjdv9oWH1`2PqzYSV>XQ(Fb(C4C~rup6KIXf`xZ zjW37=Y2d$8D1rfon(P~g61;6$1v~ze^}A_c~m{BrTViHE1?Ig0NW7YR?f4=tLd|k9z++hP%mmi+~(y^;a6< z?S^n?8m<`^mXudss>*Glz%=*2a1bwIwF3b6%BbGx>8$N$&gvogt}&kQOC<>C<~zxG ziFl*9@0N_zdA@#N)hii2&du`atugPMd0vja=YxKJYYkKd(KP`_vbQNU?LHM+nIQqp zD-GKni;{Fqh3*W7E=-n(pPuckR>n@5QPE_iN2q-)*!s?VwmAK_0RwR;$rux>(%n|a zJ9?RUn@qtiNO_jc@RTo@pF3huh=4od5rK_;3UN{F3+um6W>R3#_qwE&b{pryuUIrI zj~ywBdrvVn-snZ%y@2c=v94d@U4LjEfhRa5q2GuLz&AeD^ET`M;psczq5k9lBSPVv zE#u-uL{>H@^OTU3E#t_Ry+`KRM+#+yjI5BAy^j#G_vW(48F$wIJ=+wl}S-AQ#`9}Zloh(>nF_FFQJfXV~B&P7g_ zrxE+-$iw|Sf9^TA?Jk+!N5%ZJv7kcgGOoafZ{I#@ca2tA{_*boj%E{{_VRpcSnGVL z++-=R^wef#Rpl8BCVRxAk!h-lokZB4H634NHrC%jEjdoZ&gHY_)=QGJ<%1PNURm3y zrB{zM<`Q-`epE;xykA?d7$3htA5mW)PjxR?&1w9`xcEt+)rVP&tS4erZSHK1D6*cN zt-hVS(7vsAU}m~#eUZ0WIFkPTZYWC6Xu$m0xtz@D1k@{g#?|Xj6E$zM9&jprQ%UvN zuzdRd^0!OtO_{s1vu_s!u81+rbwpQ6{OE<#(Nl3}{##wePnw-{v1CS}ax+#rjhlMs zj~(tcIc>$Q$p*F-%?G}h>c5-)vXR%T^x)778;O2#&~#S(E*d7#j1^X)ghamBCixq3 z23q>v`Ox<2pi5*Y$!sOWkwntWd$mxM7i-FYL#y0{;&H$)o}^mqs~fc;D;*YSvz%9< z-~8_T7ESY-6zK!qzSXux8eWh1?lADHT-*{cpvdl?7;iOs5cpF$Kth^kG95NK*2*4AzYQz>FWu zo&d7T0!8|zAYq&bW?=kak~lS95aqWL4tt&ef?~~>&dbRCzvbrZhr_U|v0<=EA&@_3 zDhK3>4j}#>#8|9YkQkm8>pr8WX>KS;W7Dcw0Tz_h8BGxBi;$7cjwe zF6kj~nVuB0f5;(-7G+c$CvNFC3}(w4L`L~xf|V#boZev^4-w*zOje@N z5fPXjs2oaP`jSfon5uX2(oGz(5)u)WIJ{m_&TcP&|D&ojJ@nLC&RJS&pj%;l60V+r zdMZ8W@m$zPQ?296*I5aVjX#Z_8NgavE#1J7UOG`1zL#+nj&lu61o8=bbz=0(YicXY zv{Rs)b((~iDTHoJByM*zDA1qb<<_sc2!j(x+*c&Nm1k_%$C)Eq0%FptSdCdl0L|xY z$aaCLlJz$5t0mjMl8yKiqCMzo!I{^G3VXNbu{B^0V4x4nGcJ92QyqE_$N4z^p40?J zR%AiEQz(vvy}K85xdWpg0$ou|sh%Tp*veGAKwWKRQFzD_5pnwt6w*199^+>}9-zAMH#fRd%F%77zWK3j(~)r9 zyOf}2MPosUHYS=xdc>NTF4j5Hv?k)vX5z3-O|AJ6yaa*u_D@3Km{w~Gwu{+=vtfKJbUb*3SQNE)QO8SAYmZDus$ zzuF%8;HtB-(`9WN_k^b?K8O61*Vl`8YPAi`8RS~4G>Fqnj{pU3#oYc>*joB5)^C~z zdZN4SLm^~;s(R!}3#N03@%vvH8$3A|8wy)F>DN(&bm@`#tFE*gVA>=6SdvL+A;5-0l8*?$ro5}BCL7f#x zS}En6Y)~tQuJ=!;hg`AjZY&-;VKP#&x1>-)u?>k|(yYI$%)Rcnmx>{rl6s?(znH&= z#_&~T47q*~va)%sQ%h`~g90^NG%nIC6vbvn`JLW+ifJeHOKD?Ef-q-+95{EtOC$rP z+pbM>dj`#5*dsfzge$Q*oWK1TrsiCj9zgwt2o~@rp93=4{HU{hr#C^!jc(~}i6Um{ zh}38!kITNCdFgGb;@aS-#F&HRqpNJ=t7Oq94?VwDiSZ{dd->|xZ*K+Sa z4~8t)*xgcH6%5&Q5>WG116QK=?-t#xUX}oEIXBdG>5GWED@o6T2CW`3CulkAZDxe> zM0;cnbo}JyoJUl!;TZ3@u_VPdqake*liyQzspCX9L#SwJqrP!U9#@kEWf?A1a?o5o zpF>i{Azv>jDzLlo6{RmLyWOpT$cA$+WeTyUl;5K!$oe;tX&DvzVjntCa=89yaik|v z!sV3oczZHB#=%B4CKj&uMDSeJZ{cSv4Qx|(VRMa4PV^1$F}SQX!u8Z3RLarAF>pnZ z+0!Jn^iY1r9JIywlP$mQ#|?u=BE&F*(vT=W)o+T*u%y(u)U`W4dd$Dl#IEl!)a$&V zG3W0`!fBXlYWf{xJQ<8wP;gzaD& z+90oaC;K;aq3Oeo&KB{^f7}eiw#M*)^)p>Vo@~gE{#9D!WZ&Y$!dNuRaOY;3r6Qvk zv5J|t9^VH=L_9TZNI$`l>OM;0gQf&^W7YIvwSZrUM`oRO5t^e-fH5_DIicK}`Pgwj z?56MW;@~A8i=-DL;5zEAD|dU-Dk+79C7{fAG?ZcFW@cvAqlKS3eH`5~9-Oc=G0m|C z)~a_tng7MODoLY#GkwnimE={iHLUZ)wb9wh=|uu+>&|5D7k|2*r#+aNa*>VEA|#y6 zyJN%Mf-T@Yu;B30?zHS=*ILq_N{TP_{SNcn?3ybD>>YRctG!$d!&+hN9lUK|(gIuq z3!U(pP>el3k_W2^^3D+_zBCeakAC>}8-HitW8LTK`Z48NKZQo#QR9o9lv2rz_t#Ln zi~9BJC5}0L7bo+eGuz|SeI#UYbG1l;t0Gh7@voN3ziD?3je>Db?3kcAIO-AW{id%7h>6BK1$J3%Y*v z3bPy$3X59{g;DC?@n?A)20MmK{7`^UH+;8{OLHKw24NFFTs)6Z8yAOsU@E)w=UhY*smD5*A#rpA*FCz+9wC3nN)tFg#H zryFCwVThdybw()!_a%!zQF?f~iZA+(^?FKdbzEK|bXBRB5*idIoYSXr_R~*2{fXpb z&ne1ZF@M?zvgW_>#iV8i6F*cavkeg!^YU&R9w3<`2;kjIV8-o*B#Tu%&P;1TKL08p z6H+XgW#b7u8yFz`21 zrF%nE>GFF=n&+*!W5u6C{vBpm=ESJ1#5N)4Jh`;Ai!#3|Ih`M%)}>GTjMCyXja_W= z)9mXb`#fYLMF>4bfv?kLjTmWO0%$&w*-!;(C_I08VNn~O^un17-ME@^yr_tb|C|vQ znj#TOd*Y|ZRk|FsuG2CJ^|Sy0UWrgQQ5Gm9F7 zLICK8mecC4dgULl7vU7x#v#A_cHCD|HeVWDIxzk5&a6S%Yg?)Ew#ty|U} zYzn9CR#J20OWIq9b|z%oN&Y<|P@Sa;x42T}Bv$@D0k3El3jmJj4~3m`-lGmD{qcmz zW+3w3HV#ZjA2;%`f1=(BB{eSpCpF%cCnCa;K?N4|OPUoI4~gf*4&|ybyecsmHTS;~ zMakia@&w!!o*1xXpM2wRJma#LjSsq1ytOcCm09JJzNwz05?jXOOhdUPedB~;=d|%? z_u8c>extKyQ}0r6q(Rd#`VW5o*z(5ZUP=goRp^>3K_YL1 z8GpCgrdAND_Gb#Fk=5ZUJ#3?jIXm0<$nF-5bLODmQ|@~+O78_{oo{VjoxwSaDNF_z z^FIn+M8QHS9bV8JvX%wH&HBs@!soit?urmNzamh?1VR3c*WA(h2?#)Y(03T9$qFJF zz*?c#m5K*zb{C3G*w4&DIRKE5_n`c~CI<0S9|OIwkMg&#)4)J`H~?IB7eH;%gK&*K zMUa2N1dVuB{?1&Js?DCBcRuq;oqckL$ztkcr2;!;|nK zZQOC>`BbOM-xgPF0O<3bm1Xu- z2cH|0vx>1MA%vRrpRf)gd-C4+#7#y~SDG{<=)xjR^v98HiGcIUru%LJ@ynBNN=VmE zx^zOdJM+sAV(dU%xg0zcK~AYyU_wPGd$CZ{dZ)=TV{f=?zW)vZa|3u`Ew+UMHf7x# z3*+rFBa$fg8XhK*+QvEy z_GhcLBetJ;PP2kpyBNW!nS@>=oF!95pfM0oNnZ4uUX_@(A=a?jlp6D;prkZF&O&G6 zC3{#6*L>J}Mj6UCZ&Iz&#i(YQDtRMm0lj0HIb5RIiSslR>aF;o`q3SwH6xR)&s$+3 z&>3d{#-;5vQgWXaw-2#1mjwoMd;B?)$5RIa_%Grc#gvb%`ZNat^=HQU7o4}0*+qp3 zZ1#CnHD_WRp7N-wKUcAJxh?$n@90(P$}dGFH*R3R>YMH9MtWC0(?|j4t1*5NwY%l( z>-&-4kbXeskUYchpvUj9gGO_qCqJWuJJT-xyh zN6$X-T9#i>Qc~`n93i8B-ho|W5Ya!Fv=5p-cg{c6sf9B)5Y_!iG*K@$|9T-W^BXV($wREZEV5^`#6zxXMBeZi<}D!oRY0I z>n1Y3O70HHFrjJ7HS!dG7N{seO7=VQ7nHLu5q4)r;e$|L+qEo-7a< zfb+=wIf3fy|7t~%Up?sh9kAhEK(kOX2`Fpm0hl>f)xqYrztTDpj1NGP-AKzVsQ3Yx zh3!`J*C(}Sc=J&exjqxNI4#%er611lp+EZ-x81rU6I>K5>$7x++*kCmpPi^e@*U87 z`i6pU9dCC@_k1(Q&XAL*)q!NuX|J+C(1WZwXZ5q%>4ITKL2r_-zR1qv`|^4fQy@E8 z&KdAmLdYdM@QyXV0y_a8z`TQ+-a?p{?`Q@>YR|k8IVf%!v07+%Cq*QU4#G2YRbp<8 zn8Dx?LBJb;|5qC2_TM(T^yYa~X%O|Z#MpVwQ#WmNE$w(eY(9yw`4LHgVNt&n-AOIB zotowRt(Zs67i4;fuG#ossx9@2yo~&VM)rA;HFP^*MeWeX_|XOe=upeqWwGtP{j>fS zml~>=&yZlbyl-DO``R&880xxySolsNpzAffs4b;XP&g1vll7Eu<^m5j@^Eo+&D%X# z86Y4a_^*uaut;8}{MwWdJKaS`eEy7)c);3x-pJg1;d*;JoRC$e+nL8f63Zb)AshRs zUGwW%0nI4_ONM1}eb%{NA5;4tK#QZRD|)YLBA+DhyFA~ZzNIN0f$Oblot7hre9E&i z!C_Jx_)ZI5FJRmjb_lGW5gxj803`_s{~b<9`xuiF@gVe+q-|jK4$P5lPk)!7`N#)Q zS^!3YV*cC~=ND>^9ZtrpF0{96^0$w9Lw$ZRP}BR|vs_cLPu~i!blxoUUoqHXYq*Q_ z`O)@ItO`4_>UabCZ)bEvoKODt@qH6muZ$T&rTA zsN*307kystS}kz={IF~8A8bN$0Q6Zcq|DMm@TFMjJ?9V)Lq~#$8LIb#6al0z!)(2= zbENxZPZTW3g3!_HAh1MHA%I~FVLY0klk zY1oy;#UQO5l`O*=$5Vh!j#fI(N?8GDKFoQ!>${1t{@Iv0*WRu5aIn8QCO=n`3uEe+yWjxtd&F z@MvWd0Ym6`u(%@7ho!_3f6tQIaKB3cEKX_u+%W(BYk0j()?YgKJfzHGpE`zFn(_*J zMbdbQ3DaPe${PJqGI)@mWILIw&4B$kOQLwm8tjbdGCS^@)T{U5e<_w*FbJpI<|=(_ z(&*^)AFQOljmM3T;W!|c4_|dY{LvI?Gi>$Ugl*=Li!gRWbaU_D`uxK8bzUP8J@&&n z5(pyU_`*xNC$iAQ{}9o1R`l}IUEb{d*JlKJX)dF-@$J>F2E?#6rF5lTCgwdnd_Knr z_j{buZ(_WaxqlA5C3!d!xuoRgX*--3+c`ieY!Y};b@}>#7%~S(#V13uYlQddx||(^ z!LWdcf|qbfzkWz*trqFGHQhY_?7A)jV&TNEVGeAduB0!wsY-SfSD72evJH}6$Bbq zVpRLt0taxX<`&c_HNsjy9QuHd{LN*M-tta#=R`=o z)Nrl?<>*BTD1|n?ius(dTy61w+ih_sIleb^aby~)L+@VFOHoMYYZQKzh)9c=9NWKL z7b6h{TlQ>qHsIju1C5tLLO(Iz9Ni`fCAxQSgzo?xFL#jO*+A&$+6A2e?XUxm#$M2s z6i8{n7{#xsYkC4HmH6vO_UCdf_~F6MD`3Jpl23hC&yswEk0e0fAs;uX{YIV#n4^w&ugW5aI&|6YNs*xWOLSYJ`9*%@1st96QZQ_>LUxx zhcZiu1aM|3u3|J*PO_#4ox20voMb|(6(8kXI1LMNeU794G~Rwt@i3?01d8tMNYfr?aCa(bX} zP6%FEMcvbsBeJ7e*(u^0G+tuGDFPnH9-NR1V82u=%1(O=3DjQKNRsRu@f@rn@|4$8s8!k<9-=2#rPgL_KO{mP-1G){K_yt7bxI* z333f_%UFGAXe;mGC*pZ{GokKr%VX-3c&dm%BI=tQ@n89A&fCE2%;66*sY1_gvG^2+VPTbu1o~K?e)U(wN)5U*)9;^|vka3RY+GLvJzbm2A z562+@24rDj;j6w1B4KMew9KeEO%npi?aN8{9nfF@9te9O5v zBsapOn3FC9>!CeOY3h8|v3v`z0Qvbh**s4S0kz6W)i!CEU!(c>-Qdqg)6*HHY!+}9 zI4>S~oEiG~;Fjz+)tZ2QpXZEn1he%XXq4P}1U;nc$xrdrEa#lAg4ad#g|EH`N73;X zy2H-;etO}*=Z{v{Pgax_S&#st-G+<6NFagw8=K&@{?z5O-6r_>A7ddujFUvatAeU2 zDdmn_!F3-x~8+OiXG@ia!74&~WD z)S{g3Z%7$Vf%xj2`P#}&k$(xQi#37&y8XKN7K~T7DE3Pg>)xoiT+6_KNxGYclBWQ! za|39p8)@z8ie)a!binoM{BP09ZgUm^kj`F$__Zv|e8=BfO%`j$hU=#APXWAzzH2RS zqJBUa3+$cc+R8w+LPq&x0Ou8E1IBlEGvfvO1H)jPz+uFrl|Z%X;mPX;3J@ZZ=OAlM z?z(!_zQI5ZObWY^Fcn}rC&+I_1;#P@Hzlnb{wmZ%U;hgSgsmw^uY8W-Fd1+DL0jUM z=4`l}3PceAX`?+KjJrN-e6e5mVhW6v3l?(K77WzCp;PD3qVhv@Z{OtRyDJKyv?28$ zkug4Y2T6hCN{nGAD?p`nV{^XS*tOHz($m8z%YFN&u|jzpKOF15JWMjE%~c1$6D1DpzOC*c3%G>+!{_<70hX56y2M~jFbC<(WX{CNW7JDNqtn)y=I+mLwd%;W|L zw0h0~^T#<_E$2jE{L(XOY`&yH^%jqjLG9LV1qML2`LF zWb?nQp?aR2L_QgJ&YOU5%C8UY%;%gURszV=DsLvzJECm|(j%rT8O}f~uh8PF6Zzz` z(<}3zT#C;o_7M^(pTZjJPfUGPxTz5)i335!#1bcXWlDFxH;tjQHs7 zGlTdHG9N#M+BV8@03$fS5u`uvi4sTptq{RDx3b_cmnF6e>}|z{M? zD&ET;J7u@c1!e2lEw7;%O&ny|6I7#O+LKN#EV$lvmhv-ARPobH*W^JFhEjlY9CY*S zL}X81NtqrnNR6~&{AMU!*Z%;RqQSiUVk}Q7lG>}#T)*LT7HKUTD1i_AWop{@?3~qH zcEb6g$h|(McJnkL=R}?zEg((MX}$URQ#tve$B#CuOtRDLaZtevG-WR2LHawn`yE4B z{v@1T_X{J!J7AoZ2_HTZLIfavpJf3Yv=yc)hoc=W($zgtn{%gi`d!kCLgCXq}HGFX#kBy>HTR zYie`zGjK@?NlD(PORvK|IWjofH`14;%NLwyt1mpT(k?UKYmVCpU6q#CSh>VcpKH;Q z*}p0@pvkPcV2;)TiLXNsF>}kB zbbd?nhW`hHII>d_XugNyCsl>RId@gjhi z3AhGKStvl=SH>W89Wjd8kOPIWZQebz+x`|7Zwt!+Qx(c;^Up?gIC=VS^>@Gu{cc!Y zP>VFMg*t-(#03biVw+hg+Mk2)11{00sUNTlfH;?6N`E3q2)Q5a*A|T+Y%-C-9fqPTR<`RWh65>M~ zs3{X1dFSOq9oG%!#u+NA+FR^dc3|2Hf*sgpN;3z6;@d5i@dWN6kM8?!jHSk!%yc-$ zfLnoalhFi;Vu+Pu>pmmu@KwnKP@wjTq9Oj)=Po$NNALNQotK1=gL12D2jP5yJ;#4* zb^VSBNZ|B`2YioOT&eF($b?XD`9BDQ{e`QLu=Jyr9i2nxud9A6=K+r>{iPX5n$tsW z&JVO^B)P`V*^0fC`lGyLawlHKg}7SE8<7uxT(MNWcp7&h5qSQ%)Z(!ACLp<8{C~+! zB|wwCIa9**ScZ~SHms2(4smjcu=U1t^Q6IC-<z5S6~Jr3vgqyiyHPEgw4P0wyeBdC-sS& zi3ATP3Ju)9<(N?(p|0BAbb)lfl*!rt*eh}D(9jdshjU$bKInMLG7)%#=^xX?$CS{N z20Wj2S(3H3B)7Vwu`DGYt;1GH;b*g@;hisNbBUVm6O(4U<{eq|H$$7))%I$hmmTS$OP)7VS;fS-cCFAd zcgYs_UE7M!+}a?~x4znjYyfvO3U=^7%5y6wbb^TP)X8`$$|Mj+_i3AVy?$#u<$A6k zMC^(xMDKZxYM|+qew9~8+qI+xJ}f@h>X%Qv(eY0jAW~D9X^W=Vsy)BSD6jRRc_ERNve74S zc{m|N_+rg#IbFaYOQExn_t6JWX^TRgAJH{)xEsKvEG_QP|A}s0-%3LzA|U^6GEH$B zd>K8i8-f>9hB-dKmdgRsd9x)3p*c5*-T?v=f6@;eo8D%DWUu29-Ie72jB45|h$3YS zl>0Obh-d{vd@zcg*W}5iqWWsOo%?kP3!3LRP4VOX<38u7T?I@$jE`-k z@tRV>O^E|JCmp?~c5QUnyMbhZvCUuoi~Swjn9gPQIWN-#7!w(Gf;XpVPl-F&+1ce; z;UAZimBgQA2)I1=IXh;Z_)!Q0!R<` zUTdM=Q_M-y6bQWTK!l+1uJQZpcF#4sp;iZQm;&ca!eKdVEePa^tK$JuBUuiaHFCjz z=iqDys}%!ChrscZjY~oLVxb2TKbA0Ux$zlcp z={|*0O7#Hvjj(*g$9-~zPAWI#&`Zu(4+PlGyV}S|T#} z22Dn4zxHw-!P`CZL#mW<^5!pS%|j~D_aBfaurKod{y>%dzMm&`6nEp`iUxOe8?a5o zf%rjO0%~SkJo6=J2K8HDto?)rzXU=_Vwg9wW48$*jW^TxHB&@XI#UTDV{I(eY5xq9 zt(Su%_Ya5OZ96p_;5HvzEL`A@&%SeKwnfL9bZn}d=sKg&kU*A`Sx=Lu-r3TGJ=M>` zmM`i(9Q-c-t)~dv+^)8t%Vujwz~dHoVS$E583~{YVo7%I6-+rGdvN_)y7T7xh4gT=9x|sF6VLRs0%>d=moud?J z!htW-8Yo?JGz#w_tMt(7nte7^rIHEgq2qad>k;hDj{+vEUxH9Ts$lP^M$Y`gM?Ayc zH+p6FxHFoey+8JZ{eN#ZF!(bNY3i1qF?xtKQ-V2)Vx3E_J+dq`tT+_*Y6bD5`Z35q zMH%J+d;qHzX^DYCH8D_GS@BbVe3UDPUFS6EPA5Jv19PcSBQn=(KMPIj<`LjSk4&aM5kkW((U4sXn9Wy>?<&V^))WiK{xQMxAQoAxzq zW2FBH0(>IJ_)1tR=DiQH%0sd0C`KaoKiR{FgG(yRW*pS5RlRUV-EcS$xexU6 z-uAbKvV#!cfs;xB{aTL*cJ9BxPO}g~5d?F(v)>th58{ryCm^Tv3kS7vzfo;lQ;%@I zcPvTFZs&N9@(-ob7+>I4>N3h$<5Jad38`Lmo`3-d^J|e!)FZ?LO*E90I;jD43ITFT z|8u#C$1kJcsPv9wV>nf2T39@W&nt{2H1!Hxd;km2-GMJQTnf^cO1=*(IzjZ{L-ZEC zX_O`)Rhy0Kk4%kcq{(lCm=Uy+Vh=)^>p_0vUTs#5Bz|MR+C58RNY2N7IZPWF2xqZE z<`C~-$S*UHc5S=xp7U}7Xn6hn)fV&>P!2ivle&>|ZL@yh#+f^j8f+6%JrrjorLCXi z9=^{^vioU}`ua()rNsDKCd#YEyG)7V909okZ4EcUOOQ~(`Fq+c?b;C36QwWe8W_b` zo+ zYx>>ueS!16y=_wJ{Z=6;Oob6a3+3G``s=KH07}af`*lVc4$;I_O zvH#ziq?A}$dR zgovsdbTEpBY=cQ>fMrdOpQ!iz!3M|4)9vB>7(m<1E?6}7C`uM zrWR>aotwK#=AY6e z^@)`(ZDUDC0|`#*O>1#1uT*Sp1Yo)=Ws)I>0{;?_r&WML@^@MnY<%|zR&HWsFCWy! z$%Ih0R}48a4m#5g+B_b7^M6K@bl0EgR=(sLeEK=FdHIlr^NU4@`ECDGVv-haRTTh@ z<^m{apkNRwmN9i))Pl^csm6BQk`u5W=@J=a2r^@jKt(GW9MEsg0wMapCkqx`0crhx zZMZ(g+OPe%z7UE0{>g0;XIm?JjV;ND4zHE*6Ob{U8K>-1;S<-b)&)?5d zr&uq`drNx61p-(xmg(;iN>s0n4!!YkS-*NjX14KrGiDZe)JfoTi%H z`;c;L!kr3<%4q%UI$7(qfBTW~2l0os#c_z=c#8_GAbO zFAv;(V?WT{vbI9op`r|xc|ar&yWBegq+^wLr*+$=JMKa{_>L3~SUk7xR#WEJm9&j!CKJe& zw2UUHyL(xr~?cTLd{})&Lx{37Uwo<`6sV7t*?fN~$O zLyCT=Z9z$grj&l!Z4Pm{g=E$>pI4ss&(AUwWK6+uHYRr{6kqxg3J(t_xZk_O9hVw6 z`=-H3t5as>Y*r$$^)zMvOv$YVh^wa{R-m3|md|9JY?4T_I=ID-)Q z@DxHwqPC;v40N||Vk7uhy-xOSp;^Jci^I&-;7!~PvOzoB;_0>vXesN;m;B0ihllRC z0C(K$wVJQFcL`};Dgp;)k2aWLD$S|uN-~2o-nb5NJ8Av780WSY^1=1NYutwi=e%hH zQiX2JqcBnQvQ6;e-8uPKF894xIII0;D>k&^l`muN&VawruPX1RzC-IXUqe6aBAhZtzu^q1%YU(PEUhMzj-lLg?adjmF$6|6@LC6aTZEsF#2SG5XtKOsCg} zQowv@>HY@MdbW~A@#W9)`2uqj@d1xJeR&@g8#Bdz0k2S;8Vt> zyJ0nQXRl}9DA#Wkd|Vf^T(MLCBG#T#zC8ML&drXHkdW_E&hGioxBXbP{|je>!9Zij zN(U2g3+y)c1EgR09j4vj+LQ(&+IkfJm_!=k{F9%{zP=Q~X2nL|>SXcDMc zk*D2^9bs^&*kfv;*2Re1A?_j%5TI?i_vh1%}P zZy++$$i}!k^lUeUh+!)ThhMGY;s=X6`Tpv#W95`%T-gyU!e~20!b;OVwE}#0>qqB) zMv-&H*)x_aSGo#(N!L!6U4qyUMJl}yhY!$5K}fa6T3`+V?+`?cs3Zw5GGBnpwXP;+ zO)ey#r#fv9biL$KSh_cLl;a-^US>Blc}YEGBK3wA*XHgG|{fd z854j0Wyp@B$l$Q+qf6{()SD)a)80S=9}+%=%$81G%zn-DIsfsbkah;ds~L{xszwn{ zBku?b1;DsE`r9W8CQrwG38!qQv2(lpFFIS zczljeKOVOP7N*-O%<*XKViY$Mj$@H6G+AC_h4~RhryKA8wtJVQu)1N}IOaG|`i$Ri zWXYB27I9HxPIR_qukP0#yLW{zBCGrhbe4(zhHa=+erR?ssV55wtW}Q2qpRKq%t&6R zhf8ye2W$T!d3OL@kT*JAXwdiwcDBUKH(niiW%@AXO{0(gdEl7e3a8(H_gJ>{(*O{U zvqIB@#E6IjYr(ljRddKe{gzttqwn)WU(nYk0vK1DaNYaF(htD{2B(GPcOVA*Wiu35 znd|~aePsSyb7ATA9)NFfm(1Tfkr@y4?O+pt#99IHIx)arQh*p%Kig_21-5rme|tcJ zp6P~10ogl!4oFYxs}I?Hv5gJrp0K`lQGHh0^`6Zr63by*;5$n9 z_;`&B!#VgkNQ2nrCl*-4i61Tr`5e=q%LZ`Q#Y%kRU~@nk$)mwf@`t8k2&I0J@6o3Am7FfpLy zjARK^4fL+|p@-)g*rtwV{ToOBO1Eg1KqX{|z(QIPYB9Pe%^kAGThr0)=(qz3LNHj1 z4UnOkSy);5*$m12`ci}xuXz8LZ)pv2qwmLxL*kcZm5-{#UN!U_YQ!OX_jhT~sO18d zVVD~u62#V)RU9Hwdv)V@dn$zW-)Gh72I5p2advhodabNQ(mSLoW$$hf%J?tt?oc#S zyxB9}CChXN5*M2UCZ9!j_6#>E104t}2YQK0PyV6}`9mr#%TmRt@h{XI#P05cOhRp; zYS2?Nzen~Vkhbx&!a;aLG{eg^Z_`a|?1Y$mj)7ywcAUBfo2uSYSjs0@#NZ?5wH=fo zNOq2WeEuu{Y-O&P*;J@)GTEDahj9akvoUX*>CIe+dhYXan;eIt=G0?vPlxG-%FR<^ zcHRf%``{tfIQ1t6F1#MOmP;*v8YL=EZcuLbwq;%DZ@^@{o}B5`%Yh((pvN5VO1^UT z=2Gs7(yO%puefRIJP6Sw@letH@#~b^_LuUv?61S{)F$>nr{aHUPhYgg$`Hi0Wk^mZ zBf7*Gutw*gxw8wzt3q93fN}~x`^abJEXR0=(MIKTr3x&S#K|qB4mA$i?!0h&BTF2J z<8QgKeW^wBi~Itblx>po5FcK*(xLS{=;Qso3rhE{_=5Y4>19gOC-+n8I+Y#J#csNE zET7YVvHY~0{%iDl3lV>&ht->a0CIdpP2dHU$5B!CivKueKne&7u~2gX=7}ysUlcjs zELw~L5@1;du|C!~HM>(BNnzrrccJ^Bh=uqUZkQPgQCsP+K%?fXIu)R2YV|H=tTA6o ztM)-+VyRVM8b!UG5{&ot_aK1J4`SPQ2OVaF`=VuY+E~Y<{rjR}6x`dw!ivf0h2_lp zET43hycYQD%@bYAvpUS*T$1eUY%G6HaC~BA@x_&nipI|W>?w6LD`E9(&C?IH^T@}F z^>YG00oZ=067YmLv1UXtN2%)snFA%HC-!;-x^BYn3f5qwA2u`aEh8E^|J{!Oif!m6JFpBYvGB7gONI=-rCw4XH~{3E_AK;B-r7(kzP z%DNCjrWmt8bSHz!Dhus0STF+UnM%0cDiw)g*a?700II|DEL22VE?z>)=*)+)4cflQ z%ozTOSwRSWpB(WPZnp4^7RyovVPzS}87BSO%lP%sT6QNZHdH1iVFKA9%Spu1TOFr6 z=nNc|3@K;!N5AXDOh%?O%iOk;Ra~Hi-ky%@>7zm)~FJm3mUkuctg#kJ@N zU~7)gjqym2h`o#$Y%1-7wwQCs5+178`rc^c&#`abLSCsjR9<}e`ZOLTr$87? z^?lpd&z|L_*nOxhKZWnfR%>|pRG zVHrR4iMNfrvNRXW>59wfH)}@|COW^8TE#pSBo@zm*8^F6Q2e>clI(4+K<7laK1R4+ z{LN)C4;!u-&UZYUa`x;~+p=Y*@+cRj*HQAo-o#lbx~zmtmrr#DN5vR59<2dljs5Oc|# zix343`q>&!0i9BV5J;e7*sa)9>&=3au>{XXVHaOu{1UoY-*tp6-!lX_``>MMj^=pE z!?3=Y6U**QN#@>wZxy#b*|m?+`xG$=Mla9?vK=A@zHsgEt=aTOzLDMo&KmH#sy{9m z#)u9}@%BpbjX#9e=+?hc1ZK8tq^GD?xBjo>OQ+obMYQ+i9j$lGP(3^BxssBb0N|D# zNV@|29uYm~fiuvJGoIljB3z5;5)-BJ7CX)K%cu)RJSV* zaHK?GVePZrRK4Rkvy37+u0PT5mn$7GvO9uxaT3TlMS<)PF;=AU6Ozwa6(g|Z!~Oei zECFQc;hAvM5PHaJ#*sYZL)6eugpl1+2_Op}lpk2;Ass|Y33_5`-6F~X3D_eWQE3Bc zeHZtj$(7HJJ7Jpw6*W`V&dpzt)%^stL58OIT?b$uM4j$+Q0V_I3qzN!^K;zchL@Ml z7{O6peqYSV`snfP z@>XyJ*=@L+DPuOF0{9;!n6%kcbg@aE^pH%c!1IQJ?8Rv43f~3QQZD}}QHn~vQN+7@ z!TvX?wtnzmRLPN8kAnusXbMV11c?#|*f%_~t0E~#;YOxJOCit%#=EiVi_Q})pWgQm zMXJU=efd*TjEraMIN!Q=Mb80Zu~g~*Y!H_DF$U-=v7HwY5gB#%U5>rWh`q;A(a{YT zvg++d=b&Iwz&IMHu<*@us3wa%1}wKtk$tWg!mtJm$l(HCNQ*qbLg&ncuEuF&r=6+XQ9 zu=+2-Z0u^qJHzhW9ZVt6bRn*xN{X7hqFO;8Vk}cWG?31&UBxEDd?`?}M{@ruUjC*4 zdsNqeB_(6^>NiO^)w|E6d7gHICgW&~6s`(zH+6bkTHws(Lp@%t3mw9ulDP z(-Zc>q)2O8-dLv;IxcFGjBCIfh!9y{J@}BAvCE~ePqM!}(ER{as^U#3n<3V_NS0pmPXYroXfVk;Gn0O8wKR?X` zpzK?q%NI~25}*c}C*4w}UvB0BOHXABff51|G>wL_EQZ3sHfM$ex`UDbEheCM zBm=Obh2xVlO550Y4-%@?V*z&)aH#lyU7uv22XvVvT%SyUfl6{8WO4D3kwxMVkTu{1 zc44q=Kl4?yW4-OEpUh{VEnO`}@3>h9w9z#zAi6&D;r}lC0WVi_NuAO;s^t+I_n7lCe?isHb_kE}&3>;a$54ceB z_DZzb?NBfib$GaNA>u8-tT){_jO&jhi)%FO2S#i42!M}GISIF>T-o(`-ILc_Sw+HlY>GQ z*Mr6ycBF6Ic#qI^O=-96hhH6E>NQCpX_45gs`8~k>oGozDJuG~|?*969 zht{;ftgVbV{z%08O5JEQ`&OqebsjHYZo$`^HFd*A_EUM7r5Du(>9n=>rK%5#`*JSy zUZHsv!)Tp7uNmN~{cZa4M&+Fw;&{V0?si(1v1qhX-w?2LE&2k3AXnE0q;ZAQNT4cT zCw^R=8#G+0rn8@J^sZD7scO3Rj-i+ABaY)!2Od7xc4e^cw}=_SGC zl3l^1N;s~|0+O5REgn#B9jo$V>+!` ziBnGNd*r$pV1Pu+xb;)N$OATNdW-Wu7-xZ-W$xz;72z*{chs%lbF5{U5#P^AxFLR@ zbt&X4CtQdsvHSNGL)!X$r}r0hh){?wAhRRLXAuHxA#@u&oDYUsE^-*K zv%Dfvp02#A9YS`Z3-AR1b&TCBDxjJ>DX@6viWVxs^Rhcno6r%8Nx7$0O@@Ms{?#Ar zEolVV8DD>?GI0y4tb3%?+f|8{F6wuuET3_t%bq11@hX#ec=2XrSrocjtVs^zY&ga+ zOx$t+Wq%Z(47T5GjYKqD(*$^;d0; zJVfDf!7ucyZ)v>f<-!C61)o2aSYH@;9c}eQgipDIy;{{_j7Vs**ofi{IeEw#YRqQ1 zV3kbu`HQ>_4L4GJ-=)hLHBQr9vqWbgxUi11=o^aA;J7pkYpavFiRR_GY3d;%G2aFz zZRdWOJMERa%m|j!Z-fc#!2duW0#{ysIIbH|Z6p8wiZ6(A$RB)Fk&G6$f$`+LR0QzO zKe_JUIeslK6fFXx@SbBEPQjvbDxW!)isXCbI>8FfJeNPKQ*`H>zX_Fs&|D){M4gvKQR6z z8L!5pKWC4_M2|lUQqrZ6!>>BN zKFGpboQ=3<(m5T*3hL)L1u5c{jlw7&*2Vj*8Kgo?^(S0mYys7gmDN4-=`lkXL@DYN zYVIS79>DxYUHh zo)Y>+N3?t6&L})O^Tpa%RAp+qzQE96AZgn+rFV*{`5J24Mc{< zE*wi_XHN{B_jNRkA7xAo3HNsMu`T#{{)neHGb=AWS+8xQYlBO+Oi`?z5hnh|({Z8d zk3cMFP5UQ3A~8J4@Xc^-f_zx}@;#wkuG;nqnnHSRfuO)fw58CoQn{d4i~YXQeRfZ4 z*XM<@ln3W3=5%oeIqh7R!@6XHq8rg`CB2S%E>@`;L6wae4h3Qb8U-#rryVMf!l|c6 zaJfACt?qo%Av=_b<$#C~xt(EK;wfim=k|Kny$M?gd`Ey1e6FATY?-=c!LrO z?2Uw8-BQ%+9lIwB`1=@;Oy22Ci! zp92#Uby*R-cZx!xc&6~Zk~Q*B9Wz6LV& zdVGB}#u(=!euA#}@bJPc>EZ#mdEtXlKS({d|IROY;+Od8V4I^rlMsK^JE3=IyM6Nr zK6&L8{|2g0KTQjarKN(+(Ic=PmcWS~IwS=}AD2`Ql5{rfal{V?Xe?`a-0b_Gk zqAEc-ktmC>vClPi85^rp3Ksd6S-Qna-jBWcsrA-y4fA#L^>t>AwoA>_;DZA}qq-l6 z@672sejD1`+g&RDvxC1w!e!=rb26TmA97jzHV?V^n4GY#l^^b*jCK=}P758-^g9wthq+Lz^joCiES!iQ@PeufsjC@7f z>#CEX72y1HKHI_iq-@Z+*OMq0zhi+PKAM-va$IK`37QSOA!giR=7T?_Swm=+C@+)T zGoI~D-3@sVRqxwIaZ$0tAlB`*SD=;*%xbl@vSMsw!*$qH<>DB7Gi^(bad`ZiizfY9 zbXUv6)AP4ULIoVSfj|)XLFqvgK!ZMnMx*fth;`w#Iol%Fy+j4tls)kfqn^wJ*ISTh z3j6AANm#95qE4`~9jhmjCWk_I7eLx#;-5MDa=#j~%Sc@c6O&A^f#}YXqg(x18#C*P z7-k_>4*OvYA&w)d`5H`G8uh`gCKnmsG9v6L+cv~iy{b(PR4FM#GM!pU7 z)dFi|`d3(3&YUBQ$s!>NBa((=qW!6W!Z^2G;xx%A$*1A`pURDCKXP6Gs>jaj!yPw& zO1qvg8 z@H09+k+JL@`P)4n?Plu1-v(M%9@gt}wh$9lLeUjs_BTwR;_T_+G2AMLYTlyN`jHcA zz3_Ltk~FOi^-$68Iyrm(Nu#VwRN>#Xxm~w)4`~vnsf(9-Yx$!Kxv`jYr_9miRA6sDJz?xytCo?6DT#pHCmMi3T?NKr0pA;QyF*p56_?goJDDM_Gh zP1T)FX-ZFY7GIdQ{qR}mwhaT(Z3OnZGg)5CC>bcARn^jV{F7Z7^EO3E|4i=C^jgQ{ z&`p5Oeww>A&J%&Ll&rXZH%PnL{PdxW*Lqr5P*7f7eH3b=8UUQ{LI8aO84nbKI_^mEPr5pcz`wHY zv^Bo~5Kh?7f<_>p3rCJ1%P;07vU6lXJi5$*MAG^ExP6b><#bBvRn zAwRJ<+`mlBDz8W7unN(vk4>{8(}8#|(Far#!by@5Wq)r=X|4 zvKpK-gsnq-S&*l)@n-1DgA`THp_Z)`*~hTA z$R%lSgwAl0m&)xpr!4ln`{K|rAg_1wO9+>gA3|lp#B=`q0T=w5WTn?BrNS3R{x%ZJ zRTTEKX?Z+W<2NY}6+9ntcfG?LH|ifkS{PY3G}alDQj=}i>VBLB$t?@KCY`C0KwwPW zbv7WmE6f6Sw3HRET_rxAA5hhMVeNy!n&pl6y);loiyMMZBMTA`n025m*>R9UIU;Ew zqmOwlW9%G~Z0eR-;2;6SVmn=#4Vr8hVEpboX|V3efl`2GG6PYD=N9WD1VL!>wt@ll zhcbl&=Kg01_b3<>Ijz}lTohH25z%w6kZM2T9pRQ5xSn&Sz+6wTBBw8S{!P-Y59_PZ zH`*sM-qt>eIgGqFg6Pg#o2nZrpH9_@9dhJV0(T=sH@(yKN0_CR)h}+?W4`~9If{ry zB!Pvw%EF~i<8r=DzIPHxoXncG}H3J!JC^4B$*t8z~P!` zpu`nLL8uu8gq5S;b+U;TXI)tz%JyJwtUE(j@M|F4$U{(QhP-=6fg}mn)wXCR_g$iVdPyRuN_0Pw__eDl^o6dk@hDlQO)y%z-5J~5;4 zyliXQR9lMAoze$hLfLgo8-dW9o|aDC0Fk<@ zOZYFBZ1xUQ^}Q$wY3wvzqdJG(p}hV6QpD;O`GwmbL2G#8=uSO`ib2!jKtFRYKwa6ELK(urCSrA#OB*Tln6Xh;55Dv2%&boYTn;Hv)a*HClXvw zEH^QnAlhXn#31~l>@B;pDfy95yM$OC?L&ZB>Ed$DZN?1}ff|-XU32#Bw&(gAaee890u5veSOy^n6j&EH)-Z){IVJng+yiyzz`zX(}CvNCh zTBzO47_{!O!WX}FkUw{GM<;S*L%!U5h&z|o72B=9(6JZ>$k~&fQpF0>PFL3~{!C7| zaVpz@zObw_l^@>{n);O>pZ|PBN^xndJz06ifSAaIUdW0S{P0i+rbAfq5?{YPts8sN zWe(V;kEV5}enbPo2P)7IFtrFVV#EVutj$zjzEah!{XTe6Jbiyo}uaB{1gl?kh)x?zGZbqKddvTprLM&4+*mHNisx=kw&^L`=yXQ>3KD5 z6ZIC&M0B80mydI|4!(t`It8_Bn!#BE)hT(xZHbrnHzYjv)Z#qerH7SSQ_dlEh>Y(W zK$;_Pvt6@J#>qS&04@*z&Mt6UDJctvZ>HAe9{F3}-7?-+@7AdpKcthmi}Jv3QzM$( zls;!ZmV=?%tv|wz&D71?x_MWa78fqQ!tCuVx>3!dCrf{Aq)chl6H>AHpB-^CGXwH^ zVsPq0ieI+$?(OM8?HhMf)9^9UgS7OBpvlQ^-MslTZ(*{Y*c+-MrIgv+jym6nqYfGQ z#n-p>HGP~ew-q~B<3^*^FR;ZtR!`@Y(;Rk589#ajOkh;IOj1H#uN`%$J+(E+p;cPk zVbf>)e@@iqj@3@cQ*}v3Y2=v}-P)8qbcWnLn8yP$lfii*ee3ORG<};cYQ;J^fNTe9 zkIY@ZeQ!<{6gUaj(QV!QXEp|GG20T5k6B4U=z)RQ<8vVx7-;JzGozL*IS|F0l{?Bo z8XQlCD<1+SG%*2SOCo0vxd~bEiU&)TS8JZ>v7Tj~ec$)iOrfXv(EzE4-Mk9-71&0f z1BGIZgP|q?U`Vtdh2USTt_l@iy> zOK;zmMI_n3vme6D%_Jmjf-=N^bm)|iE*w!-gVbj6H~*hA`c4Im1I+lDg)a? z%ef?WJW~cRNg+!3mq7^&giP7-eO(e4P=jT`0QNH=)g-Gw<-GoyiQfF%=?3XhVBUYn z`0Gg>z@Ep?w!x2g1kT`jAoP;=@VrO&-k=L1)dgD!G)U@|GETD$laU4ej3SaY%m6U$cjr&+1GZTtkY9S+)$RAZ<{m$G<36TQ^oANqHB)surs-UoNl(2}c zor-k}f~Y(li%|dKilQSU`)n}f)Z@);e}xL4q$R|B=@d$wo>XG{`44WR+ix%VT6JjM zSiEqYrvgRuSx#Km@tLmi$9WbM-}c?OzVMtR)pXx#Zht*Sw_Nf;^DS=IbJ?fOYCPlT zH=n;?oDIad&13x5ajP1;rS}t*R>T_*)PbQUPAo@-CIlniOLD@dW(hcRC4nIr*wUM{ zB-4^m`LmdCH>q#irg(d-cGI>=YqQcNw>Jz_Z>i?1fdO-2SB`s$=$gji%<`jkQ|i2< z-fm4sT8!=ztSc|^V#Jr}X9Nfbht}1-_;saQ&2^6S2CU08it{NgzT4pBy1WYOskIy4 zvd`!trKuN`FY5LFM+RLsG*VgyM9`UH0+*SX%4Z6JwE7?=acHI)%D7B8N;ED1%{SfN=*d&LL#f|4?z1gkU+sGlaOM#oS-wSVK#h@_~ zyZL@AfAdn5S}S4VEa0%B2NEGh=tAnYo;B~qaA9mIn9)^-pRalNIg_l`)qH+wD%c~q zg05#Fws7e=csDF3Ytyrp;u%N$?=H8I7MUV+({UQw69Jw2lJ2=rvJPw6(R=MVeT9+3 zN>FiV(w8r}hgHws9%reeea)=E6p&0F&qJ(ycKxP`p33O`wSFE3BrTn8tV!9SIgjJWv0fAB(llgl7_P(`ZI*KC- zr;h6%iIpR`QOA2#&R$Z=)cavGew2O4WrLxAU;vjxK}LxJu{qPRE>=L+1;^le-`(TK-V z+F(?%gaCEt5}}&^?=W>z{I9rm!A>t$N=jspkFuEcCX&$vLyye{I9|LIzvj0`rekXPFECLTbv9r&id*;j^xtc-~Wwn zGkAY=ZiE~z_;45_v(YCS8p|*j1zYsn5=%UTyIWc>A|l+~1T@RB3u+_NmXs9RP&f11 zP4+#lvFJWr^f++2PWSG^?TVz<UlnJB;Zle;lM%s zNm2>po$3QHkB}WGv>{_;{I-~!P~qdecG{{Y7&6rD48|{)QUUbeWHlfO_?gS1M+7qd zkLjk^^^BbP;&-&EX->DvPB_MFdYo&TY*F8A(wm*!Vbkka6F?h3G};_uXPK|Dk%GZsTvG((6mP%XjLos> zwHkl9nYQbu8=Nx!T=*KAI1T9C81fe9pRiM02&$ePxugpn&*J4n9Q|28&@77zuC$N;E zfpLPg7a{bD^cpSg&ATn9oIe|(z9dW>+mBEB(1#hroB%j?pFf-PgPH2HmC3hJKWh`; z>QQ!sWCFrbX`LJ#EZ{d$Zq)hOfvLz087)Pi&-A67fM2rW7FD8pVpeqQy=L+rH*&?4 z`viy_>UNkmTFRx51Fon|FJ`MU;7zU+Lj9^?=kkUS;?i^DhD>a+rF+g$BdxB1fj8x4 z)#)&V)gBk8C{+UyD+8Yuy;Wzqr7qSfk9;+JJTbsM3E;p1FaOS-qnesw2N zps=~eOIy6`o>|SY1J=y1JTuCe>6)toih%JVb8D+(+GgRub40&wg zNuFLkVX47Dqt)^@y_ci3*dpr+`aY(y36oDUb>yj!HFFG?y3my4%Far=^4){{gsHyYq%H#QcsUScjM6YAt3qv)|H z;2w7kA>2H~PA(rpxVIp`O6YV(s-mQ6;u9z8HbjI?Sg=`QvV%h? zv4cikAbst7-ATAd_?&-Qu1m-~JT&zC=j=UL<1$W|XdY{MAcYGPuW5{Z0p@lhqw%)7 z%a3Z&n~AeD&Rxy?ZE+7IDAjnFSs*=D?Zt3-w-mON*IidO)DBkX_bN2dEwUlsQ>$iq0mc4FSS(hUspSI_zfM`!_y{W7vsi@3@fbXbX3f`eZwMhibG&d(cnN%&bjFSuP`NbO}`XU(lHBQERkOjk4C=n4Np z-A+@v9DMo*PorJb?J%xDCTXu}6E@7g<@q^Cuix_Sr~_G%P>))Vfk~cnaL5!Ut&Z3s zbwE}U+WDg>q@CZ~xxX~B;cqsnx#Jq*rn?j!2k&6oHuSpZ_M8pS(xSS(w@IEIkr*jMnV-VJK+v#ppgTuh>byvMiy$xg!TSDE z23qpnd!et^NPJyCC*Od}>mz>13C>{F0u+5U9VCW}826L`P}Eu_^b;wXBf=7fJ; zxDHFNEkNXEZ|C17dC$SVaA>PKT%O-Ak{I6&A>1BiL}G}FbH6FgV@*L0i`1W~kN6@n z#XLFZEww8lpa0B!CZCe06l^qDEVR2zu)sMry9c{@BQ$-_lC%Lu$wcVpY0x@1Ub(eg z+2emB&>HNLYb$az0>(?{Uo&1op(^l4$n;QMd8xUq>(0lI`Oy{3nI~ zbKk<;Ns(q|V|2rRo8IoS#Yb&_!r$l8=Oi@?YU6;z#)YkfPN4r8s|(if3m4~91ic|&Y1>)krXJd6lu-3XNz zy6C{ZTt`>86+FM3Lojy>o35j}t~7$@HvgoYAw|rosUx8E81)3q^EIi2zGWX2Nx!-j z;UWKxm?Ka8Ms*Ju;B?%aldhm#VfI8+Bf*|%YOW`BL@%R+tYwd0N2=^GHpSua8`pyv zDo0r4R1Vy5r#YT^dbsQrY+SQItuOSYcuNFq)|$`t=g7-QfXF$9VmG+Viyg21!Hj(8 zXN`~B6N_=)8l0Y3rud`uey?ptJAj8~_$St%IRWYG;wSPRP2aG(b(DnV6PY`TF~Z5~ zcQs9!2pohf1g?!&{nS=_buJe+Xpuxq37CQI*2+X$4Bc}!*&n~(@GPahp+2n+D8(0r z2;QS7ts99W)6%-$vv9MPc2MgyVu_49Q;lp&a-&W&2v6tPuZ~ya$)hrIHPwH>H@F5N z8lbdG55B(b!1ewOWcZtT{pT(LkTJ!J{LS#8bODLT;c<`D&!1U~ah>X_ZXwnpa?Gf^ zVd=iydru5$x0dQ^?DzWXYMaXVrX|?UJ}}0HTQFFZZY4T?>6(pxq6#Ui95HybcY?-Z zIQWcr&OCb^P5Buj9|eU@^Tvkxq2!DQc=y~O1&ciRm$^mZK z0TwDyWoCyY)s*h=622QOYJw4HjuYmj#awrRGO6p__Yq;rux^}p;Zq1~5=+|jDW*s@jja+LKT1iy7(7-*E})&g&*B`XKj6S-Z!&ef z-xsz({LGu1{QTvMx`vi^KrzK$+QSST&kh`AP5%tBk3}tUPauLqS>PsNoKZ1@Hx;uA z`m{|q1O1`>>A#SK|H^(V7!S#)sHnA^zcq+TO0{*hVp58-#HUWl%yy>j@5aG)7cj&# zqbSWqSCoYAj!U~50c@J2C|kt1HK8+DCl@heyQzV3UMm3~8?q{>6lyj<_fc8 zowdbKXB(ivx;Z-;wtaS1;L*ni51W}oZ)GE4Yi~9n1Z(k65P;FkHS)^fv0$MLD9lw-3vS-rqV85B*rqw)MqofMjO?UtIT{M zlQh5yc>*CqTeQo0L#|nlF=f%=>LW8V#x@$BXy8z_!y~P8(BE&3EEcRTe-N-RM|z<= zypFDjh)Bxp?pQQoc{BLXlzhKP~q|MVKm`At#SZ_e3%{d=`$u*_R&o z$cBmLgL)X*+*L}~6r;Rjzd7O!J>0Dn>{13UsZMT79pik}wEGM()s=gTpKZjz*Q=R& z%l=y-!{ZiI5I~x7THVcZ;$GE)x}%8|7-xkp{jdCE4l zS+)8y5QZLW#HRg=lK+!dAvPpBY%kY#2rZDa?ia;QEfbAu3Kp7{BZs&&i<2~2*0j=# zO8V;P)azX9ckAnRHM#T&H*aikf$l^Sm>$%N>$6>?vCb<*=LF0H03-Rzo0cZ$`p9_K z|FgTS_y>M7KS*XfQ>1j{he8@ZXl?X-rCeUkeuWqp0TESojJh)s!`MSZHWhG-J@JIx zAde@f95b`BfQatHY$#YJWo1pTWl9{bh(h1*i)GK0kh!`tGA%%4v7__o1yZQC7THvu zxR3Hu2u(v;Fm=zQm_;Vfy=Ny=FqQa~$1OGwWCOS7}e^XF( zB-_;4$Le2@C;Lyq^6x+*@#CFz&64NPXYV{l($kA{0NY4(baXSSY}oaGeDD`qjrwjG zf82JiTgeoVzD>wL62-+X=piFA{pJYLu7t~HC>dTWe^LA$1|SPESNFW_dWmPx^Vhte zbLx`<@2G$F9e#)Rwn`9AFP5)tCdElm1Z8!Lb8({gS4V^J^Yj;fYMD)&~Y-~4BP)qcL% z|6xbKp>+usEH2}^v{I;>8zP+|Vg;TxhERW|8b8`CrD?wn*1|*WMg2of?WvC_%+1a5 zX#?jRLb8e<7V~IMUs0kG!tjDC5H?4hg_}1W1{NKCm!|7n-H?vMbtEG+RQXfM$DQR` zlw25>#&i6d(N3p%OmUfW*~^17N0&Rz<3Cm|{$0`h)5cn-yJG8vC$?BHCC)JxbpDa^j|!L$H+2*|xl1bN%T? zqI!9r^H2JYnTf2JsY}YKf6>jh73s~T%TqfGGzPvl4YWb+$)@f}cPfq2iZ;ra9D9-! zwe)X?xBzVai87k~lf(9Rq{vj%d~u1}{OzjtNxY8ozu|+!5dfbgDa%{8ZW*(?B^GtH z>eljT|GHW{w5?28^gZP<@w=1`Rb91?t2MDH-CdHvLmbWPoF}6>8<#$^aE5};d!34k$cLwEX#I3GmW^Qg@{NvFKYFs}p6{)2*36G}A$!*&& zsF5x1%hZ##buAz9SN^SRbylnk@Q@zJpkYu;lvr20#@T!Gtxlx>$!D+v$uuh>*8zRe z>~R2DhJQ}qlYl|h+_dZQY3Z@KgW9c$eQz>y8S-q_%n+pr1w|AOv;8^8EA%fLxK$cA zHm@1|Is*3A)f0_jIJsWoKLrDS#eJWZ(A5H<=!$a74U%aLqJiu6_h&(qeB}f&=H)86 z8i^%+5SND2$2)zer+eo~=UXbjclR6}AqydK?SID0mlr?uQu4WBdlj>lWeJ*VwUtdv zr)T9s{)^vlN^|3WuS{I-9$xU}#%>*aH*evLdNw0e>?5%^dajUmooU-RLJL>R`sS!S| z3!N5wKblx`=;zQ>VpMCja?zz#p%XEZ^@N2i`+i2(O>OW3Kc|+i*?}4{*mXmB7D+v|M$NxT%2l&g?vOVi(&Nc8nTx=dgiN2x<5!nt>j=S(k@P5 zs2aQ%Lf*V_hdVZH@-fc1>)XI|pWFF4llG!dOEQDWPts0*C~2d=td>>|zEHRvD$brT z?#jwG^`p1+oGz=C6zseu$i$4fZTHa8MnvEr`}+8a172|t7DC85Itm{np?L|9G19!~ zhHn&Ze=%yImBZUK4a$kx2YKOEHgihJN(@)=D=yi#=Yrhg)IM4y5!ZaVQXR!``N44f z;*7REp^H>0;Z+HLM~8};VPrB?5u?QK`}7)fnD zgWUAj8SkE{nK5G$SyZPi8j6-ZC(6Dww z>U^c+FZQ~Y`r&(bRom9p*E4itKKjn-R@S8JjEr8$cRrjhagn*O?Vo2MC556BFb8(X zn_jcV@bpD&;_t5J);^mHF^Zl3#cVC}Ohm z7X)>~$K!|oKf$=6W!sr%^$)`P^n&H?wu3?>KLz(ydv-1Q5m~u!T_2Sw6r#l`AkqEm zQjjTspJud~@od)l73r8|iZYh0bbInRETud~OeLh-Ik&Yr)*^0S(&NOj%M_OKc1pOz zxLtZ^_jRz%(nr_JcAd*(Y&^zm_U%byPjNz52uvZNK^l&REv=8hH=0Z~;GDljsflkP zcd;Q(m>j>kow67l9R7LeB$-kxusSKf!dj^_D~A(rpz!PS{!=kdKajmrJG;LzV#hbe z#yztH)0!!t$UN2;7T?>p7TsQ|R86nUXnxD3aW2*s&)%7)?hWwE3}!O$k8k>)IB{wJ zWO)DQqQn)wF3z>u@_T1LA84o2e%@mGdSaZ0&D->cloK2(O7dG-IgRzWA;WdX_uN{^ z>Cp>U9mM9^jri`xuM<--`TM;yL4@kg>(zNnxK*{VB1ha;M{%0;JTd#}Gc|X@1AqrD z+vC@l=dZ}|d2p5)CAB*`m}?eU zXuddDf)qq!@Q)mj-6Jc64a20)^oqsx7<$HpNs2on#n$vF0-<(pUZv5x-Hg;=^XR`8Nn?_*&Gl_~G z(sEsWeey;3gB%jpx9RtePBf^=&L2x34WyD7DY57sy<_%Bj$mD|VmmWC85TAxPczb( zj+HYs40k1d!Dcp4cnUT$L&z>T7zVPJubVQF>(M#sUouo~L62^`WmCk!^5 zP(8@I_G!RE%dLx?$oCdL0V4QCB!W}EtMe|9_CC!dDEKhV0LZ}{7q!Jl^zq=Z^uUsMFGx$*jCgdw=udP@4jDE2;MerSm%JSyjyIqSD>VG_se`2kY>*Q2r zI8Y(L+kS*KjWvgAh>*!IWNh4oRZ@~B{4TPFuiv}t_#gYGko@?n+Ed|CU;J_ zSBBs$Ay~Y^-(V7!<-=?^8-lZ$AEbzg=)#Xm^Q^Je2=; zSYauQwsd|xVQY69xj^}Yr&CvSP-1)S^5_@^PJT$!=r^rl-#6>hGVdD-#+{aB-OHg6 z8FLP!Chsff4R@)|FU_smQW4aO%vqYE#O`9x!o{pYE@m9f)|vY=g&_ruCSghULF#UM+)5%;_=9Z{8=LXHWUEsuU+*90zGm_YS+*@ENcY7Y|!|X-@BBQS(@2kT!+giv@C`eL&2svop&>@FS+f@ za?3|1D$L^QM9OHj+F;qryA+)KKsb!9b%)Q(QI=e?P!lt7SuyY}T${rQ01TL}gGL{;82mdwjxZevi-(8rL7PC4!^Psx#KIJy7FinjE~WDQ#YaS#UR_L8IQOSav05`wbGAVbT#Xc9pD+IDU4AJg=tOMhH=4t-PCC745WH`b|B=%*=Zmt2YunZ?Ppm8)fecED)QS zYZYs>S;T7}MzYsPw%4ppL~*7L{(a$s4j){J{yC>G>W@bDn70O+fHpu@Bj50*I+z<rxWk6s zkX!bSNTL?LGfLd$oD2SR+1TB%=116m%;7zTuh0P?iiX!GDS-+K>)9l4ywHW=Jm;>K zfdXJFxIe7bkYlT4sWVTLLGs7#m1*=OrsgqOeytWlEZ%Z-{MOE|Tqetq zra`Y3R%&B46i6#THZebEy?%!o<+j^FJ@q5D3pm^= z+5dfz(a4;56EJLgap#8+yZ`G$N!=Ml+W6;{&CYkSA1xt$JbnX(2=%2y?UtrKUkj(U zKDMgU^7xd)c2`qZdYAPtj^d?;zDw#qevI0V+YS+iDNOsPKOx_7+n2k#Wo2$kG8k=$ zKj~7G@v<1@a%y!SzaWt9IQttk_9p+7UC`B_gSwi;pQ>mW6dd>jV)K$d*{e=P15shCG|jwtCpe}=J8Q-UM%&WQoS{k8%6zJ$JGMMPihU>wo8`H+ zj-EahS!PtO6Ir78kQv3N-~7s@8GlI)EwIv>Lx>f$-Ok_7GoDDE$qjNY2J#rF?2}7v znP>0czyC8?nGH#-yNCZczxxqtgUY1V``I7GKgYTC#Xiiz!^cyeN>UPpg)BY%Y&#zC zjAV7XX~%WhUQsC2gGGW_S?8C@Yn&3t+Eh!Pf-9P>Na9WRfPPopWA2Z8FC_(^55Fw+ zRH6A1ErOBUJKe#k+or22=~R4K<=ZPa@1U}+)hV1jWq(hW0a|!ouf>h=_aw19P?@lAY(`I-Q)H z+?``Wy+@vRkp1iY5Ecb)uQwGGR5mhl2!m9iP`g1ZKi0^NtpYGGcC{aA2`)+eQJ(A{ zm<7)NxfU;`qDAbG)fsa8QtVQ5Mfy+3nyu1hS%1_>{?(KI{2ICE=JFGKh0@%aq~FVq z;xMIhUf<_!Ooff8Kn@JA~yb9A)v3A!T z9lgLGTQJ3Ch=hL5=Syr#_-g;VDKqTB*UzDQMHU~*5F^Oo$+KJG(Gn}m{njlbfda5C zsxz%M@eW;1HZI$^<0Pmiw>iW=?~SUxY+OMRA-76+BMgloe^D-`^EiK0UOzNz9wqw|h-| znaFo@baqim()@!Q5-*u7l>!f&C(BeW{} zwN|<1%`r^n;2Yct0{G+=fDg$O2ar8-qU+tdGvY2V&q*5`%8feCXn!E# z_Pb2yg`4B?ZCAH*#t-b;96x5%QsUNWpvww(`vvJAm`2jHhztJe=;-LkWbVNf)ikfX zJOP+YCn5%Ab-A!%=cty1Tk4}CMw6~0Xu-(6Nl~5H$D&UJ-3}5F-RjP7RqnehU{Bc8 zZtP6Ux5D|k62*-+_bzM0y7qsAo?)AT}D3qhrguIcn9R% zlan;ioTF{>753$St^e_HGxfa;D;xj$;CcMa>|#h&*F&lgIVJ-?VUx=DHfc(zooiCk zv9AL?&#FN^o$O8zq!+i;3qO}Ti%?&6Wd*?3=UlAw?w!)9@2S`k|8#BNM&6w_xs)_C zsks|M^Sk%+k_X&y44M@>2GodjNoF7IHovxlzC2BGtjYhSMzbtc7Zw0|siV$>`Mih4 z_Gm7x($qz!M-&VUfiYrE73JjzfkT(;=r-uP^|e-kMAPPsZqC%8p@s6WZrpltXj!c& zJb-CNXl(w;kV>tT^z`mbL6tvOrc^hRs;BH{2PW-T(>9iWIH5+`TClQx>(OY3hO2t| z`ZHZ1BPzV+eH!J}R#83OT_7S(SWzz~?A98tuOGKpjs#tFqT;39EISF)wWSIKPc#{D zfow1=_~MAGanDJV+e(6PkMjC5gPEJe)|^SUdE3FzY^-|QuQr^?0R#Y*06xqAxj8*W zcBn$zJ&Jd@{MYDr99`D|n_GI|eK4Hrt>=DaCTw~QjJI@*%QV3Y^E@m}h0O`hPI`qe zb`BHP=iBn4OxcAms><-PW-@Kq$jmQut7V)6a4yI{jO%w;CWAxt9E2^Ucj*GIG}8sI?UL)Ap}d+a0#V{AZ~>9p-bohNq^yvkY2hoNi5m z%DXj9T|g8+9k05G6}bl9`EG_1rj!>6(bWOLm%|yO(sn8@((y@WqVGBlBA~H?NJ|-eLH*5B?;>yNLfb`8H7z%hsYUunlR>{18MmCKUSq_S*+Ob+hcp&{<{7kT zD#QpgAPtmphtbDH-I$&BjlNHa7J#c)ds#QzXi zWXuwDzTAC<^6T(Gdf(Hv!n19- zBjk7ms1@;x2YVVqSYSs+tc%qTqF@JPC)sHmk0w9vi!hRoMu&EXo{M zsbMFqqkbaw<$j|yqsok0Wyu^lYx6)|Q`Ub7Kk94H81YR#&ZBVGERvk}!j)XD$@1f< zsy+*B;P>wpTc4)QFOGyl=@1X>k*$TiJvK~i;oatiu|A#|w9_WK-Ql+eiB=))kL7!k zq$UV(@?VBA9FNDxLy^hH*An(|ZPyk59CREiy>yrAqT&bl5~qzB6GZ=ViiYR>5aPmq zVkbq97zR=vt8WtQ)3?}qhXfMKJae!nO||x2`C95Z(ogT5$mBMdHMv{}3S60?-NQ;* ziidF0mVFu+GUZ$76NeJCh#b|8>-X=HH`171#We)YF(W@t^qy zcgzIEO(hs(U(owo6dG^jy{j!#WoZdRIVnojYB%zWi>XuD zPeX*+`4)*P!Ni2Hj~$#KsQ{+HS`L+%m6UNUmzYZSnEsymyGFG%CF;Y+Nvl6ed*iN= zQ<7rD@kt$fEv2Aa|8p>4OLXc~<&>6-!N~`+O2;GMQhv;prg-r@%3COejYnc3s^h$z zcHj+}$s3GvfM?t*lB58*mThBWI#IVb)@_SHN=h0h#-#2WvqaP_sp0$w^}P> z&g``ck6X%?3+FNd-B)nLWkri_0S2)xD7^h_^yI@V+Y;AX@~*qDAlZa%1yzfxearMK ze=_TM)MmLtrYVLGg`?N}wGeA8ly|wdl+_A#_H3Ni8&J(b`*X4*O;$W$x?)rip6tns zP7D?Hd15qqu6emv=331S2Dp&R<)*lH9l5Jpx35`hCI6x#tiUw8vbp)rkn(MLd87nf z?$&*886bypJ8h%2cT8(T)BSX)?$1gikzLy!f9(`oT~j9Un3X3X5!0nw)ncr}U|#&B z!NGNc0ZE>kf8d=;t>4Z1__MbYuFZ{q4ijZ74NpuI_N@uu))I(@sv@2dxwwD?&YC1T zb$rt(YG1t_cVdzyc8rep=RjF+2C=NTDGT8~KVm;w!!6LUyYQW{lxI(5>ap8mo$m*f z8~#FEoX*-cYEICZ$zozka^|xc(FLt8sTz3)WrG;~t*2UMO)eG^u2~HB&+Hi-C!zWH z$9T}(do6(E#qV{wAB&#@hwiE+>0w|8+(_S#*XV0cQBZ!E?KlwvRN7# zpDSk5VH>e`S|d@uOCmVp|FQLzVNqyp*9HbHpmYe5BBde?64FwlG$R5cokNF8iFAW> z=TOq!-CaZX(B1Rx@jTBt=Y8LA{@^b!hQ0S4Ypr|T(OElq6OBFu3> zV6jvSSkL>X@E$C+USFW=whNJTCV*6Z^>_~mj)MHuV3E)&C;K_=xO<**>k+Q zK=j7;8y_>d*qd(?FXq7eg3~X`3n(|*;Q=RL=jlK7U^M{4lU5UI zfI&-b3p($LE-zkMfGd9BG9PzzpobvoOQTyvk!fIX^*ccB^FhPaygBh3cHKKR=|{mw z2ns5oH~vXz+^2>*RbJk^EP@x(S8+O9JNP7Lzc|Lut2*w#yP8RVQfkho-WDD}Arvs6 zOP^?TR5^B4btHcLP7v9d(=%6T;#q5(Tr~?;yYGS`TjNrw^mETIZkO|70CWBK^VFmb z=qCZStBA_0PDYC-gQ&U)xbEBUAYKty*b)%ZYZZ~sl?zytViK_F3|Hz^BTe~Ct2PxC zrv!C1^s5k~=6;GPZGiJ2IFAozLA&FfcqWmMWsT-{p|S1cWA1#k6}Vw9uLGcC;=4Gc z*#U)NT?Ejq4=I$6N88>4PRH3@l)$Q7lw2Ya@TIKJZs+AaWuC9u$sdH#UrNC_zd7`rTJl0_;3Rbx!_}Pn-i5Qe+KGE zZ3h@hp#;dz4cbx*b8v~)@}@10Do1^^@^M^`Q~cvQt+P! z)5m*t^1QP7Fv~9s3QC%2x9|WZDJvvpKo4^ zMl3&_%vmH6aJ=>eN>W5*DXh5I=5jI{RvA})(;u}ZV&hQl>2Bfp#3O%g=N=j{nzoQ7 zN3f>*$pQiX5$ELS_0_$8^ZLh74J*yI%j@6=9S^|LYKQ$WS3{7iffvP7#1B34cm{rD2 z%yrQ%j(Omt_^l%F=zhM5EPAmkWOg0suZ|!WKL8F^`3E5V54LS%0Mpp&7)=?F$v1S{QH?iY+BrW4M*cc0 zn-%TTwOVme4wt9s2P%1*VCPsb zKz*7dSil|+yBwx%YRg5t*aPO9mE$uS}MQ*-$KgpJb~}4lsx@FY^!-JYNDuw#SB(WNCqJn_MxX|9w>;OJG;KB?Zst7p@Br zW1psewYIQeoN<8kN)(j+sF&$qgxUSltrtQrq!2>BOzDzDM0V93w@z716(~YNP2&XY z2!F43ivlOCT}`zr=Qels>wP{@pN_D-1-LFsV`l`IUesPB>4;}pa+P2+J?-^QG{$Le zo2DOD&~DRm6%gTYZPLtK)bdffRpz!xiS@*AwN+TJ9@f;9^~CXwEz~ky)i-7CH%_gw z^AJ86)&;A{{SG@@hiOR9ETnF==1v4`;Fu>KUg556%48{}vFo)zaFGYZC@}N>Cm+O) zk8?YpH1%zy5*!f7FL`8Ub8akNm<14*uudHIN}>}1!)Kg>#a_d%1JxjVyx)z1ALklh zzq~j!P|ntbgS~}_oDaVR?;;UDo_GfW`mUwp{0ITNHX9>c+}OyT#eiqK-^0zmu-qIk zGy-rTEcuzuVy*xe$r&TDgUWBP*-3?(ad8Kehv~P8XZGn_N?$<(oFGF^>q4uC_9ut# zsOC$@ET+z|{E*)`i#u_FLTC83uGc7LxVRV#9Ml`66X(g!2XtrU{G(gvmjbV~R@8TB z8O`_cDJgwsr)-rkzL1<}x&xsUUd$^x#GjF@|KyiS2cY#itpRaexB2-#{eykJODZR< zw(f!_U~~1Tk;S5%ze%58f76$ihRB@vWjE9NVqy6W$JN!-5z?9~H7LH>A2F*|T5nF?DoHDrDK2UwKAo;8-hTzW}2wfHbt(I}%pi8ocQQFGDXJbfbBk)%7lz(WF^h}}ZxfwmLUSh+Y9u~O?E5PM^# ze^(#8^BZ6?qTf9F=WQPe)r%Ulnc#Ad=GU}-AN`u?fvoD|(f*3)ohK*OGZ)H~xRsU; zJ3;`x!k~YwaB;EVZ};qa2FydE1d_i>%(!fBWs1F~myP}Y3rd=3^5(#9JqLDG^NtKQ zWm6x)cewpUB9OABUnk{{fa8LZA*?fj54!#h?CC&6*4Acb5<6d+%0R#87E-Et$F}oY zk7}Y|jK4oz60VU~fOp+@1o#)O+Fn!PNKCSRQVsbB% zyOH1KJQ_?b?12BFSxxvxKRoO8;JQcq!R&06PDp-sZT5C*72;xpDbyv%2+)qD89>g* zdkOqBxOfEJuEyLXdg2F&i{`P#O(GHlPmB_~Qccm@xL(|;e8zjLdu9)7%bTsG4!Jsu ze=^VJc7_RTGTH66HBCW4D#G=0{?Cj89-cmb^!*oxoywH><0jg3^g)x451ZLdCGg=53$%$+w+hg%8<3Vh zULDX!u5`y`Y_qAgbw%d08xFoKcQ|e8*c#fiwK)DBm%=w$jPPJq88UD_Y3+$wo2=oo znySdu6>SYHOVZ<~FY|x#tIWg~Fq(!k>SKTp8K^OUK;3#S<~KLolbXcm0jQ~NOp~1Z zjhZSf4^+TEfPrWOn6T5^@8QCkVI0w8bQFWM{+Rt*$oI{X@9WvUZ!K+K>DuaCuk3IA z5ZuKRB_tR2^b*)DL!RJ(rSwgSh25`nZ?HzWnn>9^EfP1Qw{GxS})S2VB3aIQP& z5jVZv${2W%3a@W`a^5D8Vw|sz>`SoL<{}PF35GrI1+hOcTEHYp8g4L z*J@MmXp%SGssB;nkeDxLkF-Myq8#n$7kwD;`|&i3Y3{z+ksfJ=Wj@)9ay#YubsTpe zclIN96kNEi1&-_gtGJ%ZEq2)Pwb}@vy`X)oq)+MT#f_tRi!@bLqdF>y_k&-7E5i4m zD*`XKB#5gzRDcj*<>NYRYAR-E>uQ$UD;kGe0R~Zcix+#uC+xZ9P(iOpN0leL&~sAI zi;t;i)PXRRqUo8vk@_X{F+rN!o1c*llTfna2qp$$y4$r>xifcmhOW<&rBzwTrSw1E z|EIDU$d7Ro1=`;bKZ2==s>keZOg0I{_=*zRkCm7XIOe;Rji_+jl2(g3?>|!|EwxSP zO_AxSI4@deUW|mejvUA4&I47_+DuA5=@%X6YW-);JwsGY;(i~@4}&Ois04qiLrE7j z$Rt87shQ4pG+)UvLO8I1(cWl8K^~yIIV|^I+MlCkT^Lup@KAzK+c;u_!9z_WEsu4U zXhXNI!mN@fmL%dCB3pl!Z%(0@)MH;9WA#9QNLwQR%^3S(hB0y3F)6*-=`X0(6|d`7 z!kUm1(bHGko^HrKWK1d&*g3Y8npPvC8^D43%r|*2QX$!~MT4!-pSqvV=8HvEWQ?>` z&W0d}YtBjObI16uNwmf|Rx+%8Zc?qdfdAuCUN)8+52YAA4*S7)@$p}%e=D!W+zrs5 zm|5K{3PZEDKfRNJ@L1kx&K#DT4p9gq0Wzpu2YG!LL5r6a*8YKxidM**^W{)P#3(`M zPq2v)i*B||oDns6yTChSd`nfXAt*-HlBmRRN4VD*mD4h`4bFT+NH!|B zM6$+o$}aiie25goyQfo(+C}`Ykfra9qiX@Y>zm#)MT_01bUeWIm^d_}w_iOyUbg%g z6T=hc9#g7K`qCZ>idD#)nia(RlE52+LHieL!^cOeqQ z`0Mk0oYx38Z#gYuila^^xx9;l{bY{GBvxgjseE|2n&*@s7v z?(=K5C;_L^^Shpcs5uspCS(J`hauPdb-U)sJ-0nvGCS^zNM*`Z_1*WBh{XJB)iDn{ zNkeDjRWIbJkXsw%dJGbJ2nUvuZGlu{$3Z_BopkWV29KNOiv zJcnCXC;{o>n0lI)iODnfhq+&=sSFKVFH=vai>KLQ%Ib%>%oh;frxjsh>louTt9GzA z8y#XjcQ7Lx;aw2yVfNgq-O6|11~$i^iW=-g)C2$?3q#Q)!}??fkun!vBb?$Bvtf3fWDUz1a*MRt#? z+~Hhztw7QK^3-Q^u=2Q#Twc1y!v)7o&>jb0 zk>}5d#`7aGV!ebGewTCQ6aKu1qPWi)yqr_x&h|nV4&YWYu9`OuPCTkAd8!;16Dr6R zKw_A#4KMX638WNg-3`{&S)BVtoSPJ}ufDpm9+(Gr%$Qn&6YcFqaXQ6s8|TQfnvR#> zVb!Y6Eh+6jDCfo^;~;fICQSQG1&s}D3tSleJ1&HrY>Y6AiHkphNK$hyHJxgf*0?kO zR5AO3*M+O2v#BAr;dc{t@Q{zk@lI=8P6WRW&u`YG=eOkw*p2KUO3I1}TWcFK!`l>| z=Q4qB`BsEj&&~Zi=BLrziVe%hh#<24z9=3dLDw_cR*B6xejVM_pM)$^^FVm3Zj7jO zI3RR9+{`iCiJ1};)dh`+FW-a@XWdplY-Yc5v7RxfA{tE z-R9_iN_R!|^2-BCAy+@J`q{`yLM*HXY$?(@F;5&0WmpeQmiliAA4c#-oaJ>A4c%M% z3CZO`%h$mePU9>oEUpy-qi-Yy2?4L)xVzBOWLdZm%PsTJfYc7F zYqUA(C%iHl_xMED6Gftud}R~e6KR-_vJ8Ehhcr($s>uW_vsEir4#O+>8wGwRjJglB!lCUYANxUbd(uR7_k z+IbzS%d$v^?=_!$>C_*DSB{)Z8l9{JbLOzSPH3xa-&@~mEX*~CPRi#Zfa2v;r%?~Y zfSg736>An=o6VmHF0(H%P}tLZIV*SthZRIc5r?s85F%HRmsFR_Y;KAO$n`SBhG9+5 zE2LJ63VDLOo;|&oMdrzc@j*8pic;0Srib<<2tlwr!K=O+lSQhMQ5s~qAy3@AfB$~5 z(jDy%dObrYF|jZKm{!$?lbufr3PGd)%nS`0AxgJ0)nOk%A}+P<-Nj`J*bY_6ZXn0+ zPvYWuT0$3EpT1M=IZ4qtzc7E#iJ`37RGLatz!?<6RGKxvDsB-mIykOcrUA2n62fTj zLn#p{Jc7STTxHFWUVo6 zKk1%|9*a!XgXjw#eb;GhY#iRvSTN?#b418@a3rVF`h8kR&9bnRiF$2PJ~Z)l=iU>+ z8QyuaD%+hm0I{=i7nF|3`vKDI7Z%uJd$4ZiY=K(H*eJhk-hB*KkM>MY(EO-(@Dj4A z-Q{9)8|SGszF6{IVVPQ>UM2Xuo5C9~xU}3)CH?-9a#v?(E#1pZ^1e5(obxd6Vzbio zm1hV9k3Q!u%&-rlTuaq8Xf9}kjGmOCDp^V7qogqrA<#GE&OdFNXy)c)BvEDE zM005;h89X6jU=%7xwyACvDu92N}(E9!_MpBb#B!O3HcH%U{b+0QsN{(UFq_b2rPwlR9YNO^4-!N|Hhs2y}$em>#`?s2?( zo=Q7FGe2Hzh&pF>*GqdWDnZSYD9~qLOV*{j4a!$sJi=3yJ3!>ueQN%Jw}F@ef6U^Y zzda)q)%hI{?~8i*e~mN`>PRI;pAPEKcpn38N`5OJ z@p2EX0uToKUQ0_8uIJCrrO1+vJKbRp9mEmZ#*CQaUVyH z(&s7&T`-UG`hJe$y?Z$1!;WvG6#*b%HZJ`6eqN-4&(gVpp&Gt+av7zL|8+}qb0*@P z+}Kk`QjK&!cMb7Rnf# zQh=$EhGLT6d#04YS^)iG!565v=0Iij@8_G0W+mqeCa)$dOoT$`?(jLOcs$I>oynv= zKV?2@#dch*jtE0D>7H~U>ba2rhH4ontD;OaSeEPPoJCz{azUV*v6k18Gk1vy+mt^n zj3j1v!xWKGRxDjMDRLpn0KFhBKsIP<@aBBd_tZd_$P&h8CblmLHf^mYDpe^Wc5%*uWjd`*N%KS6(X{5byNfPas zCN2oxVcgM+4C;4$>?s`aZ>y6apA%BP{)lM$U`YHVP&1ByQa)cDP;kDp4zfe?9_!q z`#Wq$t1{I02O%}f&$5ii@(hhfGRpk;3A50bgRbP{KD%iOjoF=7KVnwNnSZ!n2BAN? zei12O~2|6Mr6IbG~}7((i%rv-%&_)sWdR13u^qK zU7%`gDDXVmrvAiz?*!Q!&P}3Td%Vr}+E_RYs-@_P1UO>=Acd3Nkk|IRbKj2tNk>J) z4es6wRc4|?WWwzgCK6os_Xx!<<`3|g7Rx0Tplx<6Olo7*?tT5b`%lqU*zS;#wKZE$ zN=cv9`ojoriO4+NQpxU;pe%8P@CIlnZkpd5=PCbX0_olB@@GViP*HFcd4U1OWc?f* z`oOBoDe&%UZ#IC<9E94n&RHeBu`|^!zL{%pK>6{5-!`3^bAN~Th;*^pM+gN1Oxzaz zhgJGhtL84De6O2X4t(C>^u~9dI1iYe@^{0L#K98UYjVy-wjJ=0bkKz^Z5pU<|?k@b~ew@L{1!EF(PyPlVncRu2vovxxKKP6>c(18NQ0(Flw?L z(M@q)_GipBAIqy@ge3jyu$B*ivT7JSWYWHCJZ4(&jXO#uQy2k2@)XcQpsKM?NbJ7o z1-dTXq4YzNAsU+VU!YO@Z%_5-r`{baYL`eeff39Ae}+EE0x$o#7e;o(9$6as>PNk@ zOia;|oX%=k7!g@Gd`^+Hp`UJj-`5>Trn5g-@h@cvBauw}w%1bT6>`HnUrL1S@SIME zptS)XLi3Hx@#Z5XVCUYi?h-w--%6K6fFHF_*Fj;fCRp+u6g|}-0^qC7qw?PJCtdl+ zx#C*O=B^@=ULLyK+)mWa;A(h6TiV({ew(mRF4d(xq#mi(*U+p4hUis+3H%N11B)TD z(h)8oFG^hC%rf;2T!04l+;ExnD2n7*So;MXxqi(~BLS8NgoNC~m<;$m;?+0=}my!@RL3BYU}g>nZ0oPN{AB z{C%YvS1?eSn0Y>OX<&!c8u!|f z)OU6z0yLe+UF}7V2w6i_&zT}GY12Ad4-s<#&@B(Cr*@BFoE5yBdy>PC%6`*V7q}>4 zM7jMb-St*kq1~G^=@E;$Iciuq6kZL*tU1S0V9=9(3|<=r6*R>9G*QR?a;eQdPPuDNWclk34wrmB;c`{sOB^#*nmvQDlYs&3IDShVlH5(^0*!_PbH(#pv|`9 zV0V`MR9_Bzx$#X%OXqd2PangawcdtzTO8NZRmDxZxi(H%_YzxoD)KM5u3G!m?am8FP z=*3Y`6tuImq9pQtzfT+b$ff;CGzf#l+Ow{9yI~Snc@gBwNUT@$95+8H?*17y9`P_ zV2>izs}FdOdQb>BbD0&AI^scTwe85qLVoi8deA;#sr<6~HfH0@z?V%GCIdT&GEAFH zB7pMUh5e;{F6k#zN)ei_j{PmKKG7xWw7^M6n4%Q{#>CEcsOxt(3(F&WVsniEm7&it zi*0iE64?4AXqoy8nPW@#9*a(lS2du3eZK^c)xO2zQOHU7v^~KM8;^| zr!1=Yj3)c#R{C*Y!}?I1g`P;HW;eghxa5%;&*71NYY;AaFZ)iQGaKx1lsO#Vu}doL z)m+nSbFD1w{`R$?Krqw)h2>f3drB36MfM~$Nho9)yf9BzwN*KdY`3EU^%NRMYy^p^nd;!v zz=!xAgl5P#U7YNc#D{Q_^V*>4jBG^tZ*w3P55f+ zp1oh#VHL=KK+zvL8UjdyPydhvf39G#r`b%k4`t1HV-sJ!UWgxQ;{1aD`h=@cha zBy6TR9ShcEscN$?@K<(5G&W371hB^YxY+LPiq`g{N>6l-5OSH%Zk;7ELQv|X*V(xeS%2`rUoVeY0K`qnm^S(Nk3jFek*d}->motK z1{KLbQqmrk7eIXvE_OH~@&WoB2 z1d#79G=uij9QWT0PhV~Lp$jFnd|xy_Y%^oYYzN=|!NpzO(dJ}LxUEst5BJ~R9Tg_C zUq5nkFQN!!HiG7s7M=6%iCs)AP7>yz<*m4B#dKR^ka(~#!;iXb4@=FZI=Ih3<4glu zL~bzS>?be7E`8jB+zlqSjr8I6TS6D9i1+2^JM)wiilo$5^%<+A? zlvS!#cmHlztY?c+6hEG#EqE^f&D?+e#FTvCB^$Jli@_OFzI^ANgk4znsBGLvIszE& zM^SU7cjA%L4u!jhe*7xS! zy|Y4-x5A!pXB--6>%C+MQ!1_h*H=WGu4lY&CsS(I%N_4+xO1mVxh>JNDwi?}&*iej z(cQ;!7W-Xa(iBg5cG9Gm^~7MHnSkRW&}XURz6Ct??Hb1umC5t$ErRpS+fEW(P!}jK zPU|piwC0;9sjSr{w%1iT6;LC1!fIp|3PViqqAg3<9MZtN^;q!tp99f>z2iL+fzg=_ zRbRhv#ip|)k*rA2C#d2tu`Y@q%f-_#a_no`9__aE&!_AHgaXy@9Rr!g|2iQs;fCY+ zGwfw_aX33iE4Bk>c*{xf)B~5z@b?U6YAMM9%}Zi()&n?pxLsz)1 zSNuvd4mtHog94Y%b+Pdolghv`-c%-Qh<$f5nKvu3&-boIwl8BKrhc?*z}`b zPnf^vrsTKJEGf+!%IHh{5O=o#Y9a3^Q5w`3MOATwO3=9(3~wsriA41p=iK}GklDQi z@#>3lF>CZDFCg=0Tpfa^dRz1wbCgk}$5ksfj8k#+U)L_VIP{>?-5Y02%Ns+uLhL1g$;yYLQd6%@6FH8OP%8r5~g3h-0B`<2@m;* zRkI8<6;`MhBhRW??t!Ak9j-#q<6OT{M{zRTGM}v-QP&tdrr=X7u#nG?WUxtF*+DM!)7?GX4-78ppga-!cn|?&RIkRW?bymZZYwuO%_s)MRe`2djp|=L z>EQNsh4q)g+((-Hm-u~5Q~RBkXnIb(nqculK*s;_3b&!kA=U_vh2 zt1r_p8N84-5~G~j?By?%(=fS$C@6%ASqxyT37w32n5uK6ikSs)=yyF*HXWrXwUzTh zm7}6S_G7ufBn7k6dn*w@E&-dw4)t?cDus%Jyr5ca&oomjlVC}04KABP(=@=|{LO(1 z*Jx=LxNFsK!<|Y{{q(%THp#W-_3#hpZ`-lC0Yj)zySL}kKy07xbaVSp79x?!XB)kr$6jD_ z<=Dls^kf+T(f+lhs+F#&)6o$CqZqgBfHM{i`pTKZyKN7U8F06tOhWiQa; z1V_Q0&#!E2WBwlKj4Tcgxz1|ce`lPZ4+Hk7Ic*3LEK3f|r#Na$EMHEP$};wlY2H70 zLiB~jr|90lO58Mf=@y?tvNBJ3IYX?moyGpwDwPM5IMFG0omCG$KTwo_eCpm%4a*x4 z!Cqh&jAU7?1TT=o^jy~Y@>CH4U+p+MSNpx%*u@~JHDeF#t9u#MU`(xf{%?j0BP*{8 zQ)$`7M#l^{ManN$JZn;7Dg}64-~0^!;4Z=FVlsV-i9y63_KGn}!(E2%x57$|#dFJ{+kZJVLMlpbX(~am*6&Ozkf6t3v45^Lqwt zs$4O!L+VP(p*GuT-6%f;Kn97 z{Ov^wIT1QJ$xC}~l%Qese_}U-W_ux2^BeOq_VHScTo~c7Z%H!8)aT>O-9qFUeBv>a zA<(x|wiKLGhhyJ4{LH6=6hInz*H@R(3N&x*?9M-msttGD(aZs3fI@;dY)4!MfO1== zH9aM;ruoMsZ-rbXm!-l&`SDV#OHH^72hd@{4D?LVlUNVtmP5yu3L`9|_)A&8Oy+X- z#`9&A$Wf`}X^Up;I6f|mlM$(}QWTo5zT|M+w6AtPlSZ|?FaD}q81IEj`CMI`NPuON ziWzbgo6{BVF3|rDY|$6H^S5bI2oqn=<4bK@g|@Zc^z0gI4Qg>3sd}Jx&?~F-+`$O+ z^PFL#JF5{9(?^Cg4H;jAJ_(}Qi{6H3YfU{woW>(<4@Cvrm5jz)+bu1u6t8EhT+XY^SEC--fSEurpcqsrXt*0tc%yX{F*vMyr zAihXghpQjymHQ~OG%mn;Yuf`a{~9vq%LAQ-CBt>wye}v5vx@9^ClYd#oP!jDoY6`6D|vSR|;P}TQZ340Y*PWQObme@SaLO*0u zQ;n9Bc#;$G2p&}hD4(U%3L6@1NnQ6%wy`#4Z*kSstsM~w*d+C%CDc+1bQfY%bBQbh5*==x2&Bs;_#BbBwsySB7*SyVQ%p)*%s0L% z-svaFqjXIVjUk7J?VP0;?(9XCT(A<7m-T8zr_#R7SacU{{( zSdH(xJUd^cXoU&+SV1SVL;K0&gy46i>1{e%W>8%vXn{+fh>!^Hkmo7O%KDAcEUq0r z;pf-9Fq~Y6A&otRRi7j_ks|taYvr;I@1L~?1Txc^Bd>2~Dir?eFpg0+<0E?bOcNiV zLM@f$^I~*i0$8rvj+&VhR-6sf^hFKkZ2qUH*KfjSA z0~~(}M;L!2PPp|u4(<}fmHIfD=vgC3;>Fr(;=N;R>eUa=L@;v}8@){1kM*8ae@Sx$ zm=+sgc2kaJ^6QvD5U_Iob(Da`z(uuHPUj(TxHh2@Hzl)f+!mk(#=m|#b_;GkDjVXm}wXctrqN`5OQ^&_!=Kt?40jsW>}w{z?s;eMFq zVvw`7JXU6)d~Y;;hro>|@J^w*4Fj{9GSJBRXb9yBc|I>uZycQ=sj!*=gg3$43)yBr zP+&n{nua#XGUNElyVln`Xav>iz1Ods4mWlArT1i>-qSat8JMe&_-Kc595&LV=8`l9 zDHXk~sa18q3|NObO%$;~^zzHdMFo{uGx+nu_|ZMD00fP;%$yoeCGG4#L~ru}_JQmk z4&|u2Mr3S0DUVU?IjQbyX7x7XR7vF6hcuL48x!cYSzw4hW|e_74fCZU%MWGx;|5If zJCFUyc?f~_a#Wo_U+AyD@L$g&#-J}g30W`9j&l}N5#{d~@b>OXKKkO*uqw2sRrgMj770QAU~$zX6$!39 zpo_4msaWpHz7LGksaqO{ZjH)NXe1xf>0T)g_!e6x$y-w`IegaL@jAzjnYZ6Whe0RX zx#bbIal=QG#@|@c1IuuoZ;P-yY}ho{`Hi81$KTgNz4%KK>RNzG_pfWQ2%aCe<1<44 zm{Kp=bTT=@j8qZKM=J701|uC;xRm_$sZ2u;g7Uw1+~|&!zH7qkHYQr5%k!s+k)unX zBVq}ysW`MbW+$MGWKXFptEcdggneke)>YQIK5tun^10 z>EkmX;LQx(nGpb~LXy>@nKX0@wHK|*Yy!zP@TZ!Kd`GEr&W~Oe$8AX(t0{QZ6Io=p zudI#W@6U5F(5$l60vQxc#fiq0#tjGI^66{rmpG@fgB2kf#yVQ^@%#;7;Cy~FyE>h> zJbE+#x6;<6i}zF+iI@BY*}wZ7@s$wicJWW`-e{Jf1e>t~+v5+!C=erLfp4WciU7Iv z=HNPX9ux!`PDI=!D=tP5jk2weM-FjCwXe2#4OhE`O#9>}YGdrQUvBX!ZmFoBybX{K zomnIZj5d*Iq<1`_Xuq+IwZA+61dD_hKX3nXB>vroCYtHA7^Sa9nYl5HjtDhlh%-ME#Ib#{+-riYe z{&DlRw<^mSe~Ki&?HFav{5(Nw6$J7W{XBCj5#4rsCIuFZ>WLT)Ceo^jST$-fVtZ~2 z#!ins_L~_Rd$KR-{A*iPPg_x9aU|dLZl70%TP7*}r)pC&4T*=0S`?y$TZ&Wa(5cQ^ zF>?E#m2r2QT81DsFGBZ9mtVZE!ihu8eQ(`YbPP$nQ)6AO1a6ahj$a|*jNz`$t*u5Z z&myNQ^R=qdOC;lGtN>P55xZYL7>Sw;n1ya-$)$2$SFsWB!fS2~^PRTT*e3z3LAOm; zvF5V?c(mg4$!P^fBcxjlqjYu|8iiKa`(6)4K(GwG3PVqOpFP?LC{R>UPW10XmAjRO zO--frs#Gp>w20_4^16QEF&0TqoZT*oqpY^)*Gsw)OPxgvG<3a8)ihE7z-JvbRvvFo z_yUhVT6Dc2mjg^DuRMatoU2gRjU%KCU7P;#%thu9wI-YkfQzPNwZzX&Qb#d6@2~bj zUi(IDg)f?)t9G6Gn7?KRqig=Br}i-D1~5&%>r2S?zD>8bXEAK)Ou5We7c4{5L{;I| zf1$yQ-ha+_`62#p;aM4sQKc~3@%iMbo~4m=!~t$+pw1KVMF6n)AbPu5A=d;h7oJU1 zY>;2a8rvUc$_-^UrvNUx^+#=^54>;_BmjCIQl0Q&hjD2E=4H_h1nz(6W2K^0JuS?D zI`ITGvfwfco^fNlE)Ev9@kySPPwoN4b$eLgVGnCXrqMM}zbn&zbLO};H%EK%i@l<= z+zXe=6L4(C5e$vd(&WC7S+ zpnH?M@PTek5xHZ88_#KwF@#=)j-83Tk=E(?1t^i^O(0d*}g z8Ts|;vd@48<1C1bubq1fj07o^i%={TS}KSN`1R?_d};jd>03;h8ki=;Dls!BBGuXs z>er9aq{KyE@(24Oqs$xp8JEgsr)?+!UHK+Yvy}egr0KLn9hWg>bFzeJxzjtEe{|oR zM1o1P8f(=2aw6Gb5M{wof$@Itt(iA1f>k{k>y^oLDysXP_^Tuh6a90{RzDXD8Sq&< zUsQ27D1@Myt*+&1=RT&hV}P<(y(>vtLbFz|5QbW;czU9bki7XW38waL)zvF-rZ%05 zRU`pH@$l8#aXYSYCZwsPI2WthhwKA8xaHmgohjy@zs3Y=&sKkqybzF;##ARnoOI(C zC|0>}r<+tH%M}mCBhv2Y#(SEBx3%bHvIYR!iG1x&tyY8a+zZZ5(ZTvJJm5 z3Hq*0l{z@+JwC1qhe|7mORuq9fIFafv4RMaX0Cy%KRFdKuTh#5Y^`s-BLB4*lLxM)uyI&ifADyi zkESu@@!E_>ekY&2?GS@BqfevKredF;HIbh%Jz#R{cF(hpPZiw4BCNwcmp7?5 z;F6*k58nXwv&9L9f?GP#G4+-&5cgz-rY%d_<-E2ek*QS;8$t9Xu!y$ugYPWsu@za{ZX^t#q ze?sD#{Y=u`;K>fPgd9-Wu|pB>mCYwK;CW~c#O71Q&L0hSF!I0NT6_7Kn&wlyDyIeQ zemiD~qpTV_vLC;IGe(j=;df_PjvtB@lkgu5MSHRq*AiXv_ibJ}3tGCvh@M;&;2euW(dK+(cgvMJI~)>7UaZs)@wG2;DhMQ`DtC=; zq1qG}baeN0PuGu_Q!eg{>EhhyBFO#@E8KCu7ha`qoV*$M?|@)8S1+uLo)gV2^nOLN z^DQ~44TaB{_re1x?Xqqe{w{~{iPp=tSJDFJTVGz;ji_ZEQ`9ycA-IZR8Tr6-K2fGD zo_=*GEfr#wR|EQUhQ5~ zA;DWpgQLO^@qMK@+h4|#Fu_LZ?2>DK665tLq|;HWuha^p${}U8-h$uda}Am513Z1` ze+&CRVPayYEf6fPdel9X<}b6|u9a+a=Wr8F1x71Hn=ilkkqh7er`r#=Sq>wl7^#MH z;Wxn6r?FQN4(${wCzrLj;n}XF{L)Hhg1dbhH{Sj#Z5^kg*O3#WrI(NP!ilSV?3T2! zQSWy)=NIOjuj*rU3Oyh+HU2AZ44q?>DQ26r(C+w}n#2X=OFA6J9bm3d1-uhw?`B|7 zQ-5x0ynQY4h2!H>eiwHjiT+$<$|Ug{84)7r8IkFC^Pn{I+mq4lq1Y?jf!tX=`>3Oi z-HIfKu2Nvv5jq*1a`+HH*-nBg(yq2Zodnb0kWBP;cr0qAgE2T-9%tDC$^)1ZYlVf+ zu!qqa3lankut+H+SF|%kS5MYFZuEX_J9;2$muFyAV`4S;B@4`E^R{bDT%d;gLFPjS&4KLudoksry8UVvv;;XCza~tys_A?W` z4UdxOaz5=g!d0F3Z?8}}M(AOUR)a*STxUy6g1uA!U8>b*S<|+J6l$@yi)Y$JvItnH zOs$M0(hZ$ys`Z4!-|zwl@hjxMD=YsVPLr#jaKm%XkH$N(<$@}>LMV!{%nUwQDoe7} z>L0UqsfD{-@%dPlk8WC0v2n2OA-gr`dp&R|?{Y1l2uHlo4*Xq(`>XVeKX9Nk1mggb z|H0}0su1+;KyxB`^y^5Lep`kobA8avNcD~KA
;Ct%x$tHPvdpg=+a)V9O`5lV!{ z1Q;b3pP?HtRU{^%lEv0J)YLb+2^b=b+{8V&iYO|ydw);N@rdN>__)yS;ra`xoBk}M z+WwnCU&125K!N8b>8*oD^<}(7g6;cpVOJ5M=YQQ9#Z4cAFXQD7jZQi#Cr!_(yPCMr zw!FkY_SSm;7^K%wOIc!-1EVyFtHYf4+ac2M2%RdglLbJJNaVbtc<@k@z2oAF{}m47 zyByBeT)}|M6tSTD>hM7-Pqe3i z&L(f@O>52Otx7ALZ<{jAQYyWm^ZhM?Ji4_5lozmh`wBXejiuT9R)Lo=RvY$)Ge7X2 zG?c%im3g3{0i@5i80wMd zhN8>ir4M!ZvCna#)*i5?DtOug^T+bF8CqGHi~L5v`vYdLC|2pL`o6|D)^1sE^n?K- z1XnDLC%f$|Wwj6zKH;!xv8mx2eLOcfu3YquZ;&+@8|owU>w`?XYX|GjPKVuyLQXeJF!6vx{s@-kG~9T>DHYfc72@pk+6+2&K!qE9=?$`l`HKO`uI zC_rf?qi&JPW^%P5oHLk6;UlL!Dq?i#?r0*y@U{omTltoM(~*0jYmDj{1lX)UGyFWD z%THU2+w_v4a81GX_&(-&CBGhd9hodz#9K4>(we+TX$lj zUC3bM$~W2A){#@ke1(QOnEXe@M_v?M4&3$N4VK9tOZnbWps#jNFD`U z3CSVuZArE}nO_Z=^o2dQe;+><6S)&9in-0AZ=IfOvj;lglkresMP4S?QOa@S3f3gb zz3dVH^r?)j^q1C|$use95{ZNDiY-Ky*LXZ;Ood!OZk!!|A1=*OX(-<{GOTeY)ZjO82jwvQ__42DKU6P9 zJj-*IQz70VV7;933+?}Qoa-??bLKR#uuRqfNjbyvJ~Z{v&VKr18R z^S+-Nic-a5-+B80wkHR$Xy72*CBfq@d=wR^t-PgIZ*|;t(7)m_4g-8pB|eGrk{KQm zq)C3nwDX}{X*E+WwGX4xT8C*E2*A(DV??1DT9jB%*6VuN1fNU)-qj2ru+UH zpc}8(%saE@7Znw$zT=R(>&uc>$tEk)B+HUgS@8YF7PYdwN4-;_3OpI)-hrL1yhwRr?EqM*f4Ya{jC!!=>(IuaB2|r&K{pX z^XK0V0TG*{%NZT2imgr|-IAU1WHT1SBl$h!dT&$?W@QC)>+)en|*V36w=eX)RKE(x_pTTv)N(je?xdR>~q# zpw&AP2%gD zOm(~;0Rm)&elOccj6bIQ za{@~m@%xC6k+XDVUzOdKzq3$NmFQ=?dT@%tsenaG#*cSFaXlq!?p2K5$MSj(3j7mVw^xxMvqH2Cf_%)cF#0F(4L;(Uk{@3q8f_T za@Exu6#nm=WN$C@(p;ky5EZ^+g>bq*`)lRG6$aia_bb#{kC+bT?&o!_mN~!DX!uwe z=O}dm<rou*B(Iw8#qOA?{bYmbIX>Hsq6&%SaE`n1tML8%YVyNI z8AhJ9HD1%$fHJnSf1!C1apJROIG0zgl{?_Ry~hgU?$6k6Qnr4F(u*+U;IRB^D&%(Z zO#7bU7|I=A*scAt(`SZ0Yk~sudpysT^~r`IbP|7CmE+gC z!;Q`E{X$nXIHdGoPX9lxp$;ppgs`+xpJ$$|bH&YkihTV2jSrvw4j*PN3cL-) z`Q3VNWJU1}oYyv!#kfMAZ(mWh&U7>j-hgGuSKvLD^Jq%6*z47~r1*W&sdkh1EC7eV zrOfUGwSDb9WaFTC^x*%@WQ{c#&iDdl40wpH;0*ZMGT>wM^pc_JtLdA~{$US1zLNYT zy{tzfQ=w7jq6zJG_UFdt?tidWF;um7yR1D9zN zZ#9KnMSqT!er{5CkLdgv#r&Wa5)J<+3a4% z?VsQ)j*MLI?Cy`cB!tP!vDUA*3Hj%$17SM#a`{{h-g1WoOYu!%WcQPH-#{P=3X?I7oOle0K=Y)kLb^Tf`XUj<c)DSCksNCLM;K*vlTYoID`Fr$h{(pOfNL@dK8CUj9Sq zziK(T+cywalah&d#>1Z$|uLbJ7a|$ zGotXf7Cy=%<_!p2`lCJ95tC~=TF-TMHd#$rNrS}-$&F2b^)FXH|G%a=WYb{vxSjLX zKs)u8mj*(Tj}b|u^{)HN*l8FHzw~%Fn*J&{)@nkqbtRhyxgO!RKd3`0931J!tyMu( zAG)@C6v!yRLC+cAUFPZhbUd4&Tt~LCt46D3P+VtzCZkJpl{EZ*5k~ zmi7g5GW4}DuQ`|M{ryj$&v%9KxGAf$pVhHOkNioVzGuiHWIA^tr`9DEnij-3w2DhqzT?y6a; z6yQq7FeLj=JZho+@(Uvm`gQVT;Pk=wsR!)C-u%}wGPtGkiK%a#X#ZG!aO+e;&8p}^7B?S z{XKsbJi7I9VbOzKImPckU?i7*gRd85!>>=dWB3J#@3PYOx zi6%NTRgDHNf~;D4r9rEsVf!avvgs@~NzE%NXaye47%Z>&=gBt7j9g2?!*963nngS1 zAR6%^1AIx3^G%?O8khQIvHXw%%z>W^^`Y_qwHikZ$fidg9(8B|L(G!rj`!IUyyjCA zHhEB&Qge)Bk-I#oi(y!{Z$cEVHODu~Fi@x!S^O`5-!>Q{8)Q$p^l^IfiI3 zEf1iLsv)M}`BdsR5`J^?qg{N-uq4mH!Ze9L$sXQ;TiYUKv9VEiBQ;Csa^6sI>V+2} zrT01PMCf+J51nDATx8s-Ugx$eqfM0I>su5?!An4W`8~aR!Y<~ezyykQ>6%f|1O^4E zQ0+U+v)`TjMQxnuKJbaNLuV0UjHltdvE(AJMUJq)7V@z|6>FSmZ%X#~;|=ae&^`hy zClGGW+~vaqj{MTk(BxwOZ@)qp_QdAT-!)+tO^aOqHd)BdKbJrXYHl zs8T61`R`+@5_ZBZj+IuD^Bsv`=GWDBlOlbu@x0yOfPj)TXuwl-4j)80sBEo|Rdg{b zW>u+m%VvBnHY_&(wJHL`A3^;&ANVp6P@taueFOEQ#xf4U3E@IXoar^I`{}&xVyqQ# z-(vwoVX%a}R@VFvios8VhdJA9K;&xfWViwLVzDqi&q0pgW!R=jA=iH$?#-ou3F>OQ zzPPXg+Y}k$7i#_42A`PqN_8&;?+e7!lZc9c1I{&e$|Wo)yRN$-C! z&-O8JbB?fme;q$=w%tZsIeK0@x|@oDTwxCQe@}y;+n*_6FP$@@F`-j~s-hng!$c{U z-@gF;D0tg9K{Y2A&v)4=)H<+{xP>7Y_a^fj*X^{8wN*hYoMnJT;Xvpkz6SoVWIxd$ zVbc^9$$PW@muC6-V%TB#=ALA?4x*{2t^@R{o)H%O5MQ5BjyVJOI%-B7S5lvHa@JLL z?dG$7-23plnj?(pEyt_3Y|7fbt$GG0eq0zC@JdWK0aEnIwb^%&IhGrh!b0urXx^KX zI4ppgT3AWJw&7kBz5wRg;*m2L75TtmEzKoHf}Wbnp4?ljT5B1`WyTtqI27+kS?v~~ zs?gA@7HAQHm~Bw&b0IKpk}dWp4(KZlBkS9$^Qgrne~$|;Cn0Gt2Q@mX_MjdxNnreG zErg*ZzXQz!yS|&>L*o7Qd2Q6|z41WiF1tPM^>>uPnFcvb273wB3nS&3WCu!_UWNk} zJ(pk&1rx~TO-Q-Qq7E?I1nASs&uUz#1>X4tWeQYsSBGCZtUu9d$@#=%6Jj-5p)G{4 zy4z_padOA+8b!gH25irjYV~NiEypfW2snN_z=^V5=%LQ%$?*F=o(Nid08d7F$_;+P z5^!e@LlKiZdKGkKsK>^%&Va0WqJ{!FMH$9-4&6W&*x2e0D=aaWZyyH#O6=KEq)4Hy0M=@w*fx->5M&i`>Pd`(L?X#;MAhgL`LrYtdk zNIZJA{pSvJ(B*$*1P{r}U#<$=WK)+(6fw6?I>DVyEn|O{e#uL#x+4eKYLxJ-iHUL5 z>(mifCN?{oFRoFMaL!m`!F%uEqbR!6kSZLt&gPLCN~lx+-ui8{otR86c`ePKo`~6*UH=*&aHM=l<{yid+1x3j z>Z-76z2&7hq0MVKb`5G`v|IE;s7;?VHqi}q)3l5hmpVT-4P-t*nEQ`pw$ZRh?(p!? zQB#%fPe|^fJqLC>=Pw^Jzj+N!kL)%D68`S(TF2#wZhK3}8J!qZn!j7)+^-axjT6_S zF;;nca(3`SqTCY!h1b3}%Y&J{W5WJG=ma0mk5n34=NDD9wyIh9ybV~iH=`;fI#@6*A@F0R z4_5L#y<#JO;eN1S*}IWQ^e#pXcZs<@h0h8hgzZ{D+$8#q7RIOVSzrd zu~SvWXLTPSGZUDS@cG0^;QZC}^vOM$KjXqDiY#Rhmf~`Kt;?6w^kM#brhZ=uyYUS* zPUCi0%XWpai09yg-hPujk+_cmZ6jdZkp@0KYcWigay;YUhi-HGyYU@_)eJWNdh%DI zdcxP#M6E3$$gJ|B0^olb&UWxzWqn5Ox)Q0U_-po#?|QTUZ&-hg5XSO*9|>FB z3q$EFZFv-fOk94je8b6SkW86CKQohMhZ#@>KBl*)elc65#pf1Gd>;I%gm(IK=E-e7 zCYrcHz3xco+dSA$1tTiuW|ls}ErJY|`vxSa&-qU#nr5G`FJLpQ3YSlLI%b#LDz-Xy z${m-MXyUi<_-7oTNn2P>5Q))W}$N`YZO3aJDh0- zY6BvBI1tBzUMH89&=wboXB`I)99vr^@L*tn;}%K^uduuVB8*ZXHx`>%Sd%rs}nKX9(3{VZa`iBRfGA^yiPN*`7z6x!7>^n&^wN4Boy*au#! zXAOvyhm7U+bbFzcJ{1N$Q_B?bH?F3#e%g3;occUM`2e)1xjz)7f_^kusm;r_kzqso(znScVm3Md3b8+Jn+*XGS$Z8JzG?F@TZsTkr>m4NOZS3pYQJ z7=klpV`GDsc%3*FUAA?&`} zuk~zld)^LKvL6MMeoVB}Y#J3$`PzYqDW1!@{u@Iutmgcc(!3SdUl=3q(ooaeU&+%f zr71(BotO8lUaj?Ec^?%ZFI1p)UzMjw4Tn$E*RKA)4-MsV|yCJKSPC`{}#d9@3-{zkDwZz>MfK z+AoIFE&7V-&q!x^=KGgJeM*U;F;Ysg=K*ey3UGS>hAs|EvccUu$e<{zW9&n2=?TJ(rRZe{+0q-N7bolNv7Kz(3v>Uc8=KdC^A8hV8Yimd3`xL1Y6M*$8kPAp z?eX+W`eR1p`IQU!3L@7m(1c;P+5SN@ADh*Ol}vW*hdqrC5HM!W>Lj`1DfPe;bFZIW zoaZG{nrjIUlapE(9bJ_Z#Z*T3qiz&8ob47$PdKaQYpG#yDA7ESEE7~Rn?w7QO!n&G z#-me-AGT*rm-AzGF`7!C1c*@rRmA6RUmRh^{pZbo@>Vo#bN};yqbbLQ0X5gcW3w%(g0TwI zzT+z(EA06VPW#6Atx;swL`@i3p27M|Qk9phKI`sja*BDDz8jy%!Bum#b#lG4LYD99 z$WQ*p`^owmNb=M|3U)`F1g1!y<;NAf>D z33B-!&v6Ce)hIC^T4#U(jIUQ;%catK2nW1c{T1=WYvU;YB-9Z-zw`6LM24$21K040SycDMoc~-af5~(G%!pDPIc+-rFMS;TCjAFq?FWEFnFe&MxR#;9)}8LW}^gM))EX}i9$ePVT?Vg z(y@p^gi;EJx&gv)R49}_yT>o81;)PL&IPynduONamJ@ZipqZDo=hVK4n7N08Gg9R> z{kg(-7X`}K2qoOXX{J%Gl^|H@`Qnqk$1pqoTc#BNyVu(dzp!rdM@%Pn%%@k47+d?u z+Z(|PhU|l{!(%5E{QYeZfLx;g@O%*C!GhJy^5dgtm`1CM(Q^p$<#Tf* z6!HTQ!2F;k+#n5OFV8PG#-Lx$<)PuC(5Uz<9&&=12%^iT(j@;5E21M{vGg9cX{PH~ z^6O2@=bH}aD%Z=6>{TRSh*z$^t#&4;cv^olR)u0=PqBvE8x&?k<*a`v;St~G6R1c- zVA&ww718+&+-Dj$*)=J-On!WOha0z{q}}opRx}SRoP6E-1#tQvCe1T1Z{uE5g5Gu9 zT0l~N4_X?K!l|F?Sh`q3)iSmIiFmtqPwHyrvvOv$U+?Vlb+WOI#u9k($CtTZhoo&) zk9j;TEjep!miP?_&XHIyzu;ZD4-YBU^v+~Nz9%(?IE*s~zO)?}@Ucn#cz;H> zA7@dRw@J=S@r@_rqTUOgi012Yp=s`VOaEkE=B$f*Scha&FJY-z|Cwzi>?t45M+#uC zjtUXa&*8W!4)ev5A4c*y+#Ff%g?%;jGT+;5!xd-hEF&S7Y z#z;0(gBhkvRWg6P)>q7GeJhw+t%Xlvor;kO#=<>@B&XP-o`OhH)_%MzMIcs3Cs$g7FoaIQ zOJv8(CLN>y`dhQ4CK&Y>egY3Mehcx1qrtbyxv{WB70hU@>dH}m00CxDCycI+ADXLUn``k19Ea7&cpc=eEZ4IoT0FXA<>g9${6OZ!$}SZRLL z6^}YBg5iA0r6%_Dbkvq(e=;>Ar4~u`%J?tKy=QURinp|Zo>h@l|Kd8i__GiJ`fh_o z1?yRU5;Bta#-2yh&F^moo<3D--+YE5yMK)L=(WDyt_$g2{_}{)XO-4I6^{2(zcaM@ zd3dnhyvus)_HDoI`ECpC;@}B4Qn;Avx=#`MwNCODPtMCi{`N&K6QwjK&nTkC>s^GQ zQ*Vw!K2FVK_iJ_T*v)t8f@@DrOF6 z2vA>Nqv8;dcSf8>g3b5&di`mZYB~1V{GCyZ)@Zf~^;EZJ8s41$)NOgIv0D=rkJIMp zotujtUWvgQ#bMN|x0_0|4HuD??FtVF_8}f~w7GX!r51NJbAMYot@R{%BKR(iZj~(o z{61yu8_RWsrdOtd9{QLt_CJ7wyzn>+aLe0ohN5A$Ghruwzj8!-?LlUR0~ zVyz-uoH3yjSoo(Kr526xtim7)N z-MZY6Ndz2RTSbhb^->8sOAX)uI%QwQ--0}PyG_2xeSgtr%T*dU87hhW{J)N=VSO2h z7BHR}bN}4^9&Z8lq<^wm&_h0ly*#wfj@@j>E$D)DhbJ9qUM@cQ4)*gO zS{0TbD#{1?wShCiSR0OiYwMW0!5`ywGP~Y#sPi8YWL6FoX&jz&D_@`gE7tzVSLYQP zrJ=vOE$t=%tvfJyF5Yn;q9xvwZeUi+4?N|#Qiev>x&NVTu%39^XHRTb`Wk<+0T|}X zJ*4|oLOrokRK)DM61f!=o83Cs={>^{x7gIl01TZ078Ce%9L>C)X%zEs2IkU&gKr$! zbERrKVz~(qQcRYCUT`Y9(Zqb?olco@<@Sv#x63&f$XeDj=pLnuWwKS-&*oGN27}nu zI+}5JF;v8_#QBwvz7)q!dAsMU zhrSoWVV;$H<>9|w1&EjPsvZNomFou-1v;k!^QxF<9g z+IX$jBXxK%4N?IG4=l&Uqh97mjG~8)P$d-jh5yJUa6h4t%?##pJYtzW@Fvqgq`G5L zmaj#$pO(go`z2gCwwCJFy9;=qvbI0028-!Nw`x@|Jmw%giKN6#Fzu!pAe^Fm=Hw0P zd!TxbN{B$!Lld?lr+lwJ4XU{s(~G~qEvQvepN+OK*`1c?i}{E3LTeL!I8$~1S95c- zJT~L5%!uXBq6-`x97{N+VxWf4F}TQthf~bGAZDWrfiWwhqQc*ilUsr@x9uxy0iKXs zh#4Zm*Sf;TKNQFZInvlXGcR7lK=Fau7B>(cl;J4@d0QYLq3?#}kHE z{`&o-Kj=m%Mc5PQHszo8$+ibNl7?rim$JQ3I7tC)1l(XvAgUh}43o`j%k(FP8%gG6#_AfIE(`B4c*tKANOzYjPAA0uzJ7PY{w4}ctQ4-nmCPxf0v+iZ$dIk zPvnc>-G-8}%%JdDuE0F5JU1&4Qz?#WwSY=WsTUXI!Qt)mw1;`rkEt5JF{ca#I|c~s zDdVwx@NV1r{mFFpSoSHFSlmfyq=Ec^BVUcj$CK%$sW7Ki!R@zq?%h*{D-p+P#OZC& zFh3hV@BHj1Vk{VyO%SjBa{!+4*>Vd4QQVt8AwIe7ZZnQquc~E!mb-_+s8KlwLY1WF zeoEb9)l$WD)H}wUHV$92I5u{!a|?F=%1$!L8Ym*7w-yM4Y!e3l*6{S}tp<(78YF+V zHC0t(OG};KMD@zwG&-g1aFPfnPtzm$J8X!K!oZner}NQcFVfrlQ!Bw=8Y+jDZ0E}G zajn469o?wmP^XAV1e>Np&+l#bB zW`4_-E4yAB%4__P-QQCsdTYkXR%ITCLA>=zIP+ceI?ZD8X{}1NA*NRO3hHg{qn%^QLcIpGo0xcX z^-NZH82e=pDMtTPTf=A z^OI=LjI#l#q?f;OroIw2v*`gIO02!_R*~BeE!g`$)^0k&G*yQYxHrNp|FK+=XBQ9W zHmCaI0scu^N@2J3iU#{#GKhCef2zy{Wf{ZLs*Ym13uzt%Lt1^(n_0_(Hj*HoSHyml z@6(Rh83pvFw^{YxJIk3cz?n?7oa=3tT$m`uhX+n>;>xICb#pT>Nz5H@e=moJ1`yyf zScIFMVe;Db3X)pLjlsNZ5g%FiZV)57;^4HS1#1knl=%Wo^A>JfGdS4z6cICA{$tcb zjl)FLbUDecf7(eZ&u9VFE&Wq6<2Ldrz)ZU^bvynYqk8q55(O_??wZ_!m9$D5JrnL9cUKWa=hIpR_ewfnaIpu-(3L$ zuZPt&%{mRdgK%5b@#pxZkxqmU1Wc#cZZc~VRXEK#N9?J!G7+`VB8{Dp;CT3#7=~0ZGM0n83Fd+*a_^U{TyKs=T zva$KTu)FJZGo)x(9}Q!Mx$1B0le#Sl>nqMT+qD0&!1ln;(~41aJAEq6bi8Z*?ceV! z1D6Zd>X+nK1!}YOhvi*cFiQ{`t}fFN8{^*%5q`IGAwWI;C%HBjN$>Y5Cd{C?HXp7@ELn3HQHL)fA={Zwi4i}*9iDEDFwfT} zjMXXSOXvoZ^IXTh&H4>2Aw@f_x8k{7$v&1_;@UKLV215b!il+B0l17WDgCzuLVPDM zDoQ1?TF?)^RWgD3qZMf{W|uIDDfW7_&>6q_RCN*9DFm)F@2rz0?ddw(hS-R_e4$>z zV9@jQTNHtg843lzsqkMCen)+QUajBLNk^YF56Zr-;!cffg9L!AwS<0p&7hFykaRND zEJ?!ivQD5|4UKeps(;8lzaaQ(GfLMG>@RFFcm_Tu_#-Bch0O z_57yM+0No*clLwhIW?b$3A1)+8OnW3{refQ zcJql;2Cbx4ZdoAU3UnJ(%_~zX!33n})c7Bjufz0{_vriZo>be1H7@cUH>xnnfI1C; ztxiPHTBdt7zg$Wz&ImrHCguWF6Bdm`$di~NEou7Z;rpwz?)E1AwPshDlrqjD6tnn+4zt$*xUwSgU zSgV%|KD6vi+wJ_#rB-7z{KIf%^rmU!#cLKL%8BcDAK&wvk4tgeS&N%H z?BGOj16{`|QDPn+R?83F2h3iNZqH*`4Mr@N0|6|)h{XLDe^#uoQKPA+CTmI3KRXB3zST(nqI%zi4`-}gADDO_SY)$E*T_jBA%6K?d^v|Fe6*1QNd4vbbthXdw#rDCPAp`B0)D+0_crxi zo3pR;g*74_PWFP}tNHLgAd#Dnx=j2iZK!)7x+H0+Gd8!8?oXM6TG%H`1yKaJn}YY( zCoP0&?se#toVF$SS}fp6$&AbT*G|$CGe&;AfrXldxx?_~zw)nu1q%#j*6%vSWs@O= zs2|rDg00BM6tkqVeH;Dp7kLjh0AtAV$Bf4VOHAeF4z*|0g%6nB4WJrFwE84HPGrBw z^Iw5fJ?XV@W`>`hr#>;=)+!qyq_@Jsd|^^otp1#l!0xNn=(n@n0s!y*A!)2`2d4!Oejc@(Y5v7nX$k`h)`3@2_xvd{^C4B?UHl)XV?S- zDu)-N9DJ{ug$ruLCEZ|)P4$^Ut_+_^bRB)5@C)_byIIKAnh7FtwLp!(FzJi-Gaz=FR6B?_x`sVKR*^D zI!+#K7(g!#R^1^D3>`F|Zm>%DWm!gL=>5wvS3KI)_&A~(q7=q2w4YPg@|GP^?kONY zudJ!Lb$+IunI0*(2#irOLS7q{3+suV@d)vh4_&F;p~(odd1>Nd*+0$k<2p5!U+b9S zhbL|b>-Iw}Z>;lU&tkW?;tH}^Ae}qML;}*rH{a(@&QK0y^6Z=C_xq0xyM6zOvlM8! z{Qz&f1A^p|f4z+-;+Xu+y%HVnyX3gcn?o!ul@%Z@675yPI9UEkr_5O!VyXmi4OkcJfFB zmhJYOyp)g#wg`C644$I^?2gG=QbcvqD|9h)2;z2%UZVSl^Y zEJ^R{kvD)-U4*G1{BPYaDsvXObj9y(*zgZrW0p**W>6i$m8ORMUp+H2oD}|B(z-7t9KP z-O#gnpv)|cMT%i|)&9WnvVPKO^Y;*`zDu;|@B87|ag+NnJ}MbojI_cXjPX{1 zWygIFGiK(QgjmZ-dK>DK5_aR~e0)ukHw92&sp@}}Ut!2jg z+_53!;fFkJQA=g9w^TC+q;V7L{vO?RiLRc3Qtbu5*zGdz52K}F|rJ}+IT683}WuQXT|U1b6-mS|9xT9K6WfKAU$sJXrk=9<;w z_|;YD)p}t~d&OUx{GvF^Bk8(2K%c!7GsTlFHg6qpI*reh_mGwLwez=*LDT+vuJLf@jN#guzbS_;^H|-*!BtWl{VtWZcVY}NXXghV;1G6pcHp6vi*!xcnyd(2 zTRK4lwh^2HahKjW9~B5%5@Hd_9dns(6urW~)1D0hqL02Y^AOI{{}go3;axsXQ4_4w zuGawoJYEeP_d3Y{4K{v zKA&A~qV7`Xi5H5*Mw6*;5xsO=%31MI_+4R?1fs)R#g5Byg|c+_jj~Xip0$;ndpd*WqW);G~>2>sv}Jmh5JMb z2jxf>_2mlcVT*Cy=}gm&yvH^ureWt{|CuI(devf*nw1Ri{N8} zdzj*$H3C8VEY0#=4#ZI$z7D?R-L_B0V-~2A`P4!-9l!cPng;T0sebu#=uK9=+amco zX^>I?pNR>n#rQr-Gok!Togr1hni=`4oYf1N=PNsDNQ* z4Ci)*pCC)K7O_Rlg6*u}y?a{iVa*X86;!!ZO-}-0){nQ*SN~P3q-mrpLD~~kfP4wW$$m^KpQj)}Fd)c1g;gHXgEfJb)B{k|n~z+R`Z%<=brN8h}K`UfH+I_47TS(FR;l}4Av^wOM(Na9k zpjhgJ~pEOAxznO2E_J_O<|qt>4#m(`XvU_>>K$1s`((UjmAX{JB3mL zbdnQfGoQ=ls1%Th<{2g~uohYLT@gFP_I=)$ZuWOIbuY5^-nXyh=Y|;&Kxic2y8x~Pl}g|=VS&g^%(F_QIFgpPY9mk4;A#CZC^ie znRLB?iVFs7taFlVU+NB(o>jb{!(>T7uhay>9gLPDItHT=u|O9{=GTP$f?lM)fOh{Q zjq!mips*n2=?-Lp41(8VbZf-z*IjhMJT^8TuF|F&u{KmncP~uVTIIxnj(4em_UM9d6M9qYV$7n^8eQ zMsocSP?V9w+q@9dT6A|W#QKpx5A&8Sd1_cgOB?cfno&7DSl5-BpIq~d@M@1=hAfEz zTVBk?0CEPYxgg+OQ*V-&N1q&j5(;J1DdT>4b`pfcE3o9CWnyr_ z?x_o<-))uxzijWW&-z|ZiV1NHIa)gB?QO+Ah<+<_n91^eO*ovS2d=(ZzB;{%Yty4; z{yz4>>4eAm14UD5n`dH2U6&c|$pl#nb7u11V2UBwskk2#*@J_crDc2+D{ry!js>Y@ zhN{wM=7}OxAxn>lj69XM>hYg&6E{CHCSSQbI%E+Q86MmX&$v`cSGRC|`z{UZZbr{l zi_6AR#;R@pLS1I3!d!&|eijS)V$afSFx!k8Wty}<*f*3~1iVi8{=Ll-fYGoW%!~X9 zgs91M*AiNw=BwW&zWQoq0FUiu)Y0HqQ+M9zT#~;Su>MvIf1h7aR5;u6>TnT+AWc9P z+>84z!0492&GA@yMe{avB)0W+@6*B3ORf1J0#%A#y@T9sZ{?{BlGB{@H+muj78#Df(^ z>iUZOGa!|aeN7?mF~|pL$wh$7r*`Lsv}si7i1zsRy7TgfDd!pS=V=^u+CDr#MIGi( zkq95aw8VRKMRY%}woI5>B@SNXn!kJY1Y@5_}I785>_0paPSp36SKD| z$XEI1sn}51lhd($Icf4dv|03VtrC-A--w$wtV^(K7swE4S&nSgjE%T)8D*TVd>p@= zFIExt(f0DTEzb6|K^BaY%vqHcY&?;;QBrHg(UJ4PCpw`Su1nn){%_0QSG`7f9k2!at9$XffV^H_6wdng8~NT1i}E! zN*30PqOhjMfc`PE+9{A|gS&Wob9x8GXwyA0NuZuqK*s$0`KuR#DISUqkGXc&#?SXd z(Hvl646z<}&t7l;!5~2@BZ@nV zm63j6Wnai|eFGKz&)pB;Cx~!4 zJu0twnVNUbM~fzen^z*yEhO?%#0Ufpb&A{sVpG->C5&_(LCUKO=ueLIFDhje0>qSF zjWQx~Hb!^Xtsws{0928t?vMWd{D%<3MKy^}_Aham!uGS-+z_8nZfiBplW&%U`U|Bi zCM&(G+@9)MGnPA6Q6vMLX&H}*^bL*gOUWU<13%Z@i_}|;j6$UhK$}RHm z>=e84=&@+NHKPz{?(e5^B_ET2i!jp3!uUa69V+C<;TRQQ99}U*`$=d>z5UKK8v31% z_;$p{*Fj}cY_CMw;{On$W_M&NBF4TQ*+2HQZzNPEBnc;UGq^x_HG;4NPmGFIh?*`E zmqAMU(OdGMnTt>R$cmCH^>7*87uTb+E#%qDQ=A{B!8p5eq5e)JY9 z`Vyk8p3d2FmM`6poNC+g+4O#&N1`&*p(j`D*tSAFGO|^MGHwP<9n%Mr593|*adpE5 zB<{0_S!EfU+QmcO*8!a9gU#uvlTg{yRU7YqEm+djT~7IKNNpYK+dZ7QJM=@=5x z?*kCCk$3vQkoqcL8^wf?e#oed^ryeci9be00!t8>TCz8;O{cX0^QCwfJgGq1^#p)V zp`?N~m<)ySN1;2+!xO<2yh@qVcXv;-H>(N6L~5Ou1DA&iE!_WJ`H&6FX9q>$rI{av z9-j|ibxlkRWBq?*y=7PwTHN+)D*_^e(jh6G(xr4GAV?zuQqtXul+p}cBdt=>IUrq< z0z-o^bV&^{44gIW=Q;0tt}|cumwoMx<6^CU-1qMmK-q%?aIz>W(UPi*dhFJ_t+Riu zu8LR3?p*J;B=aMel>x0)WZcpF$$Bc_ALquIk9Wc&8?@5r!L!U)y*pm~hoA*pNOneg z9Sl|2OS_3`c1BmFB}s-vkw!k9I*Py=oc80_6<0(++x4B6rnqqYS4T<(m*3CzW{H3EP#p>dk%=i$-ik$Ke9iBS}gqokmcds>H zmxKTW)TW6O+2)4Gw?D}62WZWkY zj~9bcrHAy^>r0*LA%(f`r|Xi_UnSk|ef zG5F0`;Hw9Mx~#buHLoVW+`HFH;8A)FiVBHSWCNC4u(v6w#0q2?LFdi`Ox93GLH-H^ z6$=jP-vN%)=X2SY>R#~gdgYY&k!;tvK#ShW9kCn8#8_%{;dNj(6)_3)rSR&6Qir~A zJ7(i@_Vn3)V}mLQAI~#-hv)ZLK}QI5irMe8-roDyhwDMm-0uFlk7e5;Xvmpvowtj8^ZFFQqzWdS5mIsYMiH)GCkJ)K&`^=+Cyg3>Vi8|-ZgRPP!h(esbt}l_ zpQ>qgse=J^iukxhH-#oC-~?((8wtEWA;acDt-~V9x}6gMresIM?88{$M{OOv6WxkC zgTx%I$)MSEqN0%hGeq{9AOK_+1cFVdl{^S?J9yhIFQRCVhA{kN^zI{5;v7&{UHDKr zW)MA^Bz5Bu)k1EH=N*UJ0;Y>Y`niVA=tiI^zZz)S8h!^GBn8`(uouoWS@t?uS zOvHCRhj)PSypx=dI_`g-sL1({k#Ud)zKoYJC878;Y|dMAKiL8ap58N&D<@R^!c^7f z+C&*edZd&D9^)rM-jkmI>IAT#NBhfc>;~14Q>puf*O@w>j^!E7VulKKpYu~?UQJSY zJ1>$+<3VPFSAhMQ9)szAB85^?A)x#w{vdiO;eQ@Rpb7R1t-;}>V&*~QDpsp&_T}%T zPQS_nh?O6@x*E7|de@O|$Qq7m2ooL!mUpw`yt2F=%~`cU>%M3XhA5OYRXuTB#9W=F zpF*?MQtoe1E#^ifCAg?`C~N;Z!4zUI4^_nfq&qH*{h&<69S-BtR zW77_G&*rzcIR{gNhdHL6baTN(UW|L{P09-w2)LjO0SwKnRV9r5>HsQ5HCh@ry=A;l z!eQZD@P@@e)G{dXTj0lo8ai+n%1}rB!T+nUi!Ca#IX`cZI#rU@)oM(bcz+TO<2!8e znEx_9dW%4eCHRTbo(h{dY%bhs{_qe)LEXIq-djH4t#KVszjtzSmkslbI!EnZUx`68 zp<0GWaTSxTkkcZ;GuvUNo&y=FXE!kWrv3$meC2CO`i|nwA}~?JQp{ z?IRdu+p&O?*h4MuAJHN$|84c71l-uOP0nkUB}Pz^_-HHggi(34Cw3!a3h(HTx@Up! z?pdQ3>7O6?*n!^C+5^iRHzAhIBJEPbsIJVRYLpuo&XD+>;j5HKLv~De7eDK0|5!rC zfA?&7>(y%h5|}<-LSIW>gk{jnWhw2A)O!@zPJ9yv@{c0BNaoEe9y#Oc@%(X?cYnR& z4T-HSqXj^XppusbB#_lG5lAV;uUL)8ZqKLzQ$n_Y2lp@4tB39nIGHdB7lGb zfdUW!@L@i{mZ;vxWN-F`<*;&3ajsba2n0#pS>qxub(ag*@Ayi}Y!}9_OL%4(92=)p z@9K?#$&~DRc|u%-pReuimyz3FOs9Vm;`G~bl6fEyxqO0Auaj3L~~UI zco}XBb0Vdg`YdiuM*W|Ihcc47emH)dH-rnvJqH@SDwuv!5J|EF8^=fTp4$`(3LQyn z98VKQVqyk|4IFHuzgG&Hgz}#yYOYKtDp@CobVtzAcn>yL2K^>oD}KG9e3%$p{;XTp z!HDG))7uRm-b1&m267Dw2Ct^G^^we)mCw>={Z!RL`fj@e)+unO(CoZ>{_Cx`5ZFWL zSFL}`FPL7R`CRE6Y%@XQ@)Drqv7dF-K*1&gnj3=ZlFQ)C4bt!uDg~a3c&tZNSPohj zLyxiM98lR<^uGQWIbdW1U_9;Mp1m5pK)0s@t}V0b@YlW3x*-vGQ~Kc;oMevOAd`Di z6BotJl0y39e9PUOAwSw2!bze<2Bk^Z+p&L_uuRoh4^k;N&n|wA{l5{UGB-T>vSvpz~%5WJL*~R|P0b8$g zJ>?Z~+qpxs>=)gGW&xQl_2{e@Nq>{eHU+@wWgLI5d+m$Fh0^*UR`#js7rnV~xIWN2 z5cnQEa+Dtz2v4rD=4#U`aGhF zypEsx&2)oz4#XiG#C;&gxw)d9mGe(UQ#V#JUL9 zY*Cb8SlAU4?fMoFXz?iotR$-L5R zqeN(VrwdSiNO{b%;Ls5EY$u87kjd`W#V1Hh#G#E;H+R!xo`5{mfc3iK8WsJsoa5v? zWU}Qb_C5X2S!})mSTaECBjS6$&nQgDNz!+EJLK&dsF6}S)UM3~#t+Dv(6}4yJYAo> zm3A)55TL1rCAHwUJ5_dr3X_6{a~kurT9ko&IuUWq15Kv<9|0p`re;W`7= zJXU^3pdZJ|5SC?j;}Ktg!cS!Yx5r$iE^X>KGL_bT5AtSPAEO8jiF+8qZ|mr^!tVM_ zM;ZSYcjgewCThPg9Oyg#0zfC$lQa`+2i*Q3zYquN7vHoaxwXKG(qoV9>0*K}tSkSa+KJVWIESWjLq6IJe?rve6DE#)WEHWWL7`K1Q~TfK;ue6-yA-_Qewy6 zXDDbG4yBekinR-Y932v2HGUtZrg&36Jz;62%Ew`*4(%2QAnKq(`0pf*1~IQGa=u@1 z>7uWD{uwI?Hb%k>W1j1;7xOW8X*dWA`;R}QpeSs(h!1gP@F?PSz6M@IHnvb-1q!%D z@m>vGT^CvzQ*NFzSa$gTIXUs8U_UpUXUheBaaX#h!#OxSp|cYfput7ieIFRW0J~Ka ziO&)gu)<5F5(~uu7cHrPuWN{jCs5FWZw+cUS&t9!W-7ds>maxRyPjx1KQs6t>7rou z_g}2p-@jD%0J%Ho7=ts`wB#YSDlZfNsVBD+*dE(DFn=3p~P3`=i!&eKLB$gAHu>6WCxz^L5@MIzF#v zDJ7&82WOo+Ac^Hd{Id%Zp zptn77c{U2HSHC&K2v;n89>i&@+2^m0S)>a&SP`=8NTk7i&}txt9`1)GR!%B@E|E7s zk91NwXSe?L1E>y;{m@n8=J?oXyMx4Sl~&=rtql0W-}UJ4+oFsS!M-e8V*HFtQcBy@ z!sN^MA9qP^8v>Pr9m}Z$nKBFDSW&dzW!tU-ag>&d)_!3-bGQ<7AA2wS@1MM?DW#0A zKT31l3JELEr6k#p9pMhHRN7g*h!2tl+lEBkb6MvXcT7a6d#L2UgCN+#AY}%U=W#k9 zroP9i(zPxg_@xhyLPJAsB{5>wmh0u?*~jS${d;B492b>;BUlpR{27laYeJB%{z#8i z7r>_PbK&Ob5~~CF<6`VfcXajADa?N+da41JgEM@3py^y@s2f>-mA{zb)gw~{^6qjB zgMR>KfqOmr&kwh|*rdPzv zo6Z}H=Ii$!;Awn%hF2;ag2?Cve+@%_>8Hm3AgVSI!&L@cwaFRia+m#}&`?RaXAZ%j z{QAhxf_D-#64f*H@$bLG{m={n(^psCquywQmBG{A)T>^m(|vmm1eg3s!3rMOb`Q?? zi90-&5}%w+D9ccLWl>b_RVkl6&U=-#C)q0KV463d|F^(-PwVuHX|MmzI4b$SnrR9A z@g8S1ZRX!$C71B&K>%c&UaMm_d4=TEy$?^SK+kd<#DO-G)@FLll=+;)gVgzOq_*hg+wsS~tZZG`4x5 zrEHlNy~Zcv8+wwbtVLa$33dQ4QI?xSf0+sOWoFgeK(MY8z?RYZPnT>Kel+;E>YZC|5o8*Y5>mFq6#_ z3T4hwBv{($ z{Cjp-K$;qF-8CK@m7^%~jLEE@c(D;DVn8du*Vi-7v?bf*a zn0!i%gGs`Z-e^ug0K4K-qd)2KyH&vGE$EQ9dkTuPOw$qM_xx#{-WOi@t^ny`u*|>r zu3hX+ae1^i`pV2?nXe{|DNp!EkR$r1&gb?*=pM9^`k{sD6<+QW03T(^7FKTLZx_uS( zMX1pU_-1W@ZnUrt_;hOQtLcDs`(_mxRlVKZ))AgmIj+~&p`0|FrS;ma(SX(IGQQLp z-1b;Rq+~!zReoh$*@Z>l>+I)Q5GL5Nh5d(HZ(ecf5#J3UB`7kuTQo|B{#mJ0+S#^t zn{>D+L4?yhN6cfHC(*7qS!LH7-^q5aF^K0W9K3l|woW#^ub#2K);l#)oJcfY~L_|b64Tk#NW{jH&T~8RJotzU=m!OHiJ`aMp(fGXR8vZl0H$7)Z zR~J`tmlzx@tcDS7SZQxIvZJdD;1}-CHJw84QsFV)Bm|WmP%9heQ~83~fxsO+${X^Q zTt|x%OMWo{B&?c{O~hpckTY6c;Z_JWywe2yn9e^*L47-8-ZU}w8!XM#;p+EQo&uH# zAOuhX$s5yjtfGVk+pCr)3^0g*4v@vXwV-0UpeGXu4PW%fEj!xn81~)Z1`3YOZ7_s{ zyZiA!Yad?YmzR>5f#2jYpHRRC!g-q-0d{IzuXZ8fBf}>>wuO;7qS%fHtPz>EV2mC` zTBu#%M7rlNLm4o*9YeZL+g0W>=&#QeR?Z|SC^*aW7TbLa@60zx@7~2%gvhay+?f=u z&$9WmgT*@l*{+hHE`3G9q07EQ65)8`(=AFvXb`O4`^0qN_|qQH>ulfq&tQ-zS+_m| zq{JFu9i5;Dhx;jv(Qq~}_6wf%@kfB5zTcn3eUZ%A5YObBp$|!prLa*?(ZXRi{2O%9 z8Om{kZ?QPE$^FM0PEWAFGajH72Nm5L=->gQo0FC_!*;agNSM&(dC1NQi1l7#w;f+N zk4Ul7s=DJWT>ITjb)I$bueSx;---5~#ON-D*S%*u{n70o?x-$oZQK;i`QvFm@)2|(8=dQrHiVPP+gzw&;VlReUe{KJmH^7zf^IB01W!8LVdgb_Kk0U^08 zO+zLQr-!V{(ljI9=l$!qnY#Bd=~$XepYEA&;;OXspoTIlf7jFEk3>EH|06a;-X$jf ze;u(wC{Z)!E}oJQ%X@*cegMS*L%h}zn%Cy_4R4hHbeJjAVsf!f@-Prg zN$D?S&kWyO)mt)(#q%e8UlN(2NX)6Ei|AJnqyYR)ToSC86(QL9{&^6~Mn){d;owj4 zHi5L7_n(xLxNM7E05mv;hnMW&3EgIF+O_il)CF(-mx^tg3m6F^+^2Ze`=WW%!^G}m zZNo$M+J=UPJ02b!JLC+WUm05N2aiaxfHThrIX}Xj5GG zgQjJb6Y0vIp9NW$*v~N=72|X|2nE(cxqfb~Y0c)6S9k844gOp_aXBiS8?=jDR+3~K z4n1sm75UE5>F60*5@pw8=2w*ABwdRD=`fY~-?+`W#3YJZwpawe()Mt7uo?LgADDei zx9joMymZqT#$xWaJO-uk-jH03(C7q#OHs^WPVb;?~*@4cTvL{}@~O#7w!h znAf*9o}*sho)LFToSU2SkBECq1;6dbTp5h;LjyWfXzCNpuiPH1*YF2QB%B|KwQb%Y z*2=yg@Ibt$Cm~9rT;ru(i`4Lk#BnAW2;KmbD!cjHmj0rJ+k|x4>RM5%`?NjJ4w>kw zybdlx&0YB#8N)jdt1AS1g5Zi0cn_#V%*P@xs+sg0<+@w5i>5AD%(I}zqGU(v#8evz zH4N4fbrDn5Pm3lcqZEX)x*FAR4CVu(&P7d?G2YV?2h^@e2@kA}uvbK7A8V;|vK+kl zC>NY)bE@tnK&AH7JnqQuVl=#~2&)p{5s+k<!A?DoYV()6WKOp81r#wR@AET*3yA!K zF_P3nNxR>Te_G2 z7BESxlZvt1HPO#fh81TqerRrdLt7n98Z5aopj93DMTOZBOZgD?g^D0A69&qRZ%=ZL3m6uL=s!RH-8WUvtz?XQ;2j~o5sxGQ5cG}Y zBPp(yPrmb-Q7S^Fzrl%BKFh1gpa-u$_RQ*5ME47u!9@2Rt`S;LF=6AF%YQe)(Hcdb z!qD(`h_iH%SW5+vfYyS1YyI`2qs`LhEb9Y-lV(`T)03A{r_D3EAb=Q_e>F9T*R!9k z4+dbEd{K#{U{&f~;SLZ#>a@CJ1WqcIq!R=f(zJ;lDH()R=W)@R-u_8v{}_u;NEoOy z&wRN{{!QG4OD0~)Kl;$WnStHw+Fgq%B+^_ZL!ghLCp3CrkGou!LaauRFeIoP^QX$T ztk#F?)}3Jb($MBq$F_fU^oZQ4%H46ZO^1)AljpVUKS8bfP|xLk>>Cm?aZr6Im}#*H^E zY-^;2gH+-N40-x9l zF&`8jQFHnY_4y~uzF>Kn^m`f<8Ch6p=xVPv_!^BGJr&`cyV;fWI1+f&a8oCgD}7YmsO7E7j8~EX`LnES5E5U z(kjRsxT)y;;K1vlj}*j70Uo8YLraT!wSlo4fB&rb6+Vn@mvPCdM+o;3=f?>Pr^ZZG z8DS~xB^p5zLmJACbk2{+)G=FEJ@THOYUuv07mhGDjbg|jQXVy>q_L6by8c2(VzR4| z3o@XKEJ$LPZYq%HN(rp`Oe9hHOKGFrH8x>x)1v>vNv;*g)VLss5i>G95Ub8KTzF}= zG&bFtdHl5kRp;3Le{NKBvbu+j{A4=^18n0Mj% zb^r`1-SohE3evMVJ`KZ@reh&QByqMaQd z4H-RU%%BHGm(`VG1Jdu5Nw@FF=Tp)A=+ZL&{&{Mnk|s#6;j+C~tJD=_lR^5TCE9wS zTs#sNVW|sk9sRhRC7F(H2Xd4896bJQgjMimdDw=%gR+8OMKcEXNaTS|CrNGu*O4yg zkte5&-&<6SDZSHDC%)a_|JLSmi^=|?31dnJPj>Hp_tOaR?HiCbe}FMpWW&iO|v zjvla-@c!fv%DqwWhhjKvA^Tn@IWEQCwe<|+7eTuzkCh}HxJ*7?k4*iJ5mY0lUxFU* zc55tcXF7n2ozvMhjsQ+E&4>(fwfqtpIcE2oNtPq4rWhXnJJ$~GO_lOl|Li1-0z(5_ z)(OuNhBxE256>1OWc|tDOe;MC=FRH~74I}&$+>lJ0vDNAalFN$F_$eWx&oq>j9@WU zY(9j1QxKApLu1Tv^bf1cR>jwf{OkwDvGM`8WF!zvbvs{0N`shXyLgRRN7@+xl?2<@ z))5P*jmSHCFNn%=rPg<<5;D*+(PdudU{?@dq+7Mr;{;%cBf5yamiIYP_rT zv@WCL189w%rM2V8bLw@Bzv4?2t-7;8r6)@xM$2LG6^Xm|8GXL{O)UW>{uE-Fxf3a{XjM?u*JuSriYx95gL-VFYuWp2-iBbGsJo_t3gV1Qr zv)F~?r(G;=jdQhxxb;Ue)E>>1!MWu$j2ei(B(5rB?EU3OjwEjxv0!_s{Vmy9>~W$y zJ7bq!95P3xpV+1~QoBIw=Wh)h!FcaQwWjtW2hJ?xE?OIdolO6YvUJ}B)TSGG;A8_= z;pgXxn8jLm#^J7$$mVZLan%vg>dT(I&Cb5{R(p^E*j2(vY}@v10|Cg47p#loxJodHD~Td9L_LNbemy+8L+m92&63=&WH=Q8UQys1S7ysN zK!OwLO_1q0eonAV8Rb9Uo&IA^`r3){Z-3D1TJ5JCrlfI^gOpUZUY{FjR53_tDTpn@ z`___SGmRfFosdU|>bB}qQ(Q((_nW30)Hf5{27oCXWQ()HEb|d7h6#h!KV#05DgIEE z3ch!pp&M(zC8iI*lcQhRa;a_u# zR_l)@AiPoFY3F&=q9DO%xhJ(mvxA9+Q4<$hNIJ@5j|6YxAVEutqUkdMRdC*(7%+a~EY}Afn^!%uCE} z7&sIb*qw9OaYFej8%S}5Tvh~&p9#0_5fu!5)o^iB{jk^MesEvLT=#m>)*qS)TVJ&l_oZr zlq%%}7vdah{M_HX{i=XW(6~V*!6@4{kFRTT{_^=!esR1@(x?RK8N=$srt4X{jpi(wk{$zZ%Zn1VpuXlP zaQ5&9JmulJ+}L#PgM?3_%G%|RQKL2{}?S> zJL*eRP-(BLI~Xd`bUO$AgWps}{Kg=&-&O$rXY?I-%cJLNFWRPOi)-Xvrj3v1*$oZ@5m?Om&a`n|)Kmk?KU_?yI! zmggdjqW7oi-;Dp6Yf@f%RGo1A6K-y}a-<(;*x^fo<1_ckyEH{SK#RSlpbI=h|GmuK z&a`5*rns%GxOqm;6JI`kD|S9AdqFQBsRfJAAiKCg(;Tji(ZH7XxYwg;d$o)5jcc*M z0U(y$J3F$CpccJ;y(N|j*OFns){{2hR{h*%`HPN-OAj;|NUX9sCwO;~4l5LfHBVO3 zjP!fbgB2yh=9bV*$0FWaLO))WLQ#{*9jbemA71)SmS}C0UynXe7gfREnx4d zBp{}=r++d@lg?7~$oDAXVOYJPA67Lp|<}bgEbJ!SrwBf%qDH(vh(|6qCI&Q@9F zf53fJ{A`j<_*9sf)A&o+H>*D&NUYfN_E(Fs)DyoQG5)NOof!q4;1O6eF^8PW>>ZnZ z&-KzhA4Z18C;4iy;I3%CUiO;$jq)7vVgaOiE&(^lZ2!2N~`AlD;b5uy{I77oZ}+~C!jAGrho>)4>u|+ zO}wX-6yhEmSRB@L#m$?6_S}o$UB_E-IAU_r4ibCx-*FQF-lC2zVcgMzAaYIyiq?)< zf>@1VUCIVLt_-o$C#&oxYAGdZ{<#JbDn%dO-tF!N$N z-}DMTdPCiGywE7B#I9mFnG3q^)fF@62ef`gMx}&6Yge2wAPoMeYvN4~&ZPhl`W34` z|1*FWfIa}-qJ4_ei8QgR2=9v!(CKn=>4rT3vzz8#%cz=R%P5A8dy&joYXvh*)uD>| z-FrmIEVF)ggg1QCkLo*yi^2$keyVZrg{V4 zLtS#VoxGD)(&PA0J~9!`?Q;wZ6Ft?eF*cCy6m*+*_%>5pk@~Xz;k8J?YrkxtiB&Gkt22HnEkPOJ`Mn0dLlklXW3 zGn@SaF*coRr#PWet|I$hX{PAt<^1xVR&pGv@v%U`a2`l*3tR2 zZ4Vz&W^wwe+8V6Os~|EJ{4Wfzpb8o&U^5YYKNJ69F|U`ciznYDHEu0iVN##8>0Go( zC^G_FgX>IPKN%TXy0UM2V8M+iw}RT*&=`CX2rn%4?BS>5d1#Dt)5ln=IS*c9jO*)S z`BHxasm`ZMlx5B|Uv$3Vl8~rFt1T|E#Ny5IjzVjO8(AG4=*j3~&D=Dt3P%a=Fiy$W%0waX?!kV@&nklI zkc zJ+YuDZiJLCAY@Os_7ji{07U!uhxT*LY=3lhP=q84PP0lz$PdQe){Z}iF6D1xA-dEx z`u}rQ-H}NqL$%h*+b6pir{uy0K`Gq$=QWCjKM()W^PdJYv^vTZ30)Xsrp$WvgC4Wv z2u2?ZI+8_w$9j}y!_73BO|?APy4*S?Jzn>QK4#B*-+ZSpTJdev=ouxUCSs&5df0ED z-0i%?zVo1ncEjIhwD$G`nhV+KPgtpvj10{&NMtB7t{~P3{$jmq@_m(zmt=F9C@8B< z?(aZGgT8f_2moGe2w44K+K37I5>n0BB7Z$kvM;gtxsuWseVsVFBK<14Q-3F@3{A-0 z>9G>TJ^5&=*L@;WAkKp4-Hc2Xhg-9iUEjqQ_J@&-Wy)h1g{TVKV`?y6=tGLL#CFXR zSbT~9wZpUYpX{O0N*WS9&wHVTQkMNvIe*e8~|6U}JV%{=^}y~}<^(0GgKNEeDn zmxI|a6OgQwWaJ6rK=Si5n3lQXt=K6G`NYDErEbA@du&a^Bjzp>$B)a7>-o`7bAsdd zMJA<7)oj76{A>TiM5cn6V_mt=ZpfqGKaRh0gddeJVh^&!e+M~Qh4ua9SygJs%*mbG zr#0qpl1imRBHOQs=afswpm8Y}n2kkr82I%j>;>C>#%gV*#bKy^o2$PE7{ty0&8Y6l zUD@Px3WXc^dN0Qc=AWD&y+(PT4bAzXHR^2aj%GSMTawuKStyMlpB2;g0NSzmuz(|{ z?)z_reOf!^?oafT9HI=i+!5+@Y&{nV61se_Bc4t(m(EQ~d}&EaTG2*_EmO~8sycPb zj-i4gf51Q67WLpZKVgPau#DZVn)~=oul|OArr6_&^4k-+6%!-lpuxc;u<_IxJw55> z=Nr7nuMs-cv>!14f%|Za?;1!2GM3~M<2Q;^?N4id2&%k%Sh12xUh_6sPzRslQo@oM zSa1Tk^dpj|j{fHRM)@TB$q87E+yDl`muM^pH$DS6=?Jh%(@?KeN_DTZ7D4VCsy>lj z=YEK?{ZZxFAX4y3EQg8i-JoAYWm^S%gHB!1R`AG^RR+HDZ!BNth^Zndh~W{7zLNNW z(q;}NjCJ~Pu`Ws5Yv0oGr$-xAmdZt9rNw~4UfS|5b4;KEg9 zp)ufs<>Ky6%BvQc3N^>r?(TDkB^FOFZS4kFF;Z<#9c`|Sd3^Pznx5Unh-j|MKX+u1 zizExhZVK|WW`U9v*nl(x?8RO`IhYz*1-4SwrMe#p?(AL)jRd&n&_vMX*qIa;$j&XQpsiH<-;=HY(A!x27gjR{+p4zDn8iHI;c zvuT1y^gvdo6|uh-dAq8%kYQ4&U;b-YP@@3Zw$>5@3(bAoV|BS*b+1c>w2*mWFZG_L z*nJx1LjWb=$He*l%bKT{B+!J-p}U9F;oEqo{k8=)aPi$22E>~dW7z3{;Zj#L0+WG( zU7o@!BZ|QpI5h1UjN=KoczbdusKDrrfT8)o=E|p-e>Ze1v8}!OILN6}DUW~&0h;o4 zCbE8ftgND)(;zG1zsMU)Xj<&+BE!4}Avt2^G200|?B$#=Afc%__r!ioALN=sIGNPP zRQ;Uoil>g8kO~8y&c$=-p+WpET)cPbT&P02tqf8e;!cqfD+qJyj>J%kZqi)Ur6Jok zZrD-Q&(K4oPKUV?r|v;JvK$^|RLzzx{8Tt)7rJZE#@)qk=V#UQ(jQfJ%Il+OB2mfo z;_S^t7g_%vx%oI+&X{YGD+Hm8YR-WebvGrR@t$Sy2L1KhFY|l*x#+^rqdKF(oxVPZ zp@?6-jDEGO{;P)T}qrq-?|Wej=6Mk2Jit zDczD$A`gHHc#px?PILRz5DM#QyN~o_CmDm?TsA89s(M;81GwIj zboqDz;mh95jmY~6h2Vyqx6Y&7T(7W97WSbIl*(E7ksd%cr7B)?|3$+Cqkq#5mQ^G9 z{*q`>prC*EO2WHTo-+aD4idY zlah&d0dX@li)Mn0qIBkEA>xM{@v_`B`Y+9`b*E|~h#SbHh<}iBy&q;XqfF#nEPI#E zODv5}d{1vy9yC`?V^C|(rN^9$DDj$*CMI1Uv%a^4InDB8UH;u{xqVT#eEiSMZlXN0 zE*idThi^;bus&uw==0K8{ooAgLldVBTsq7yiq(GtF46Pr{+2$6Ygq}{?Sb+P2!j4} zH~K^LE?SXXT0sB>LgP)*2+^vMYA6MjPJ6MOg69k9XENz-Eg*WQ4n?SpU-94Ltx?

p*(NulIqEF?HR3K%Z?{yJmEDF4@F4p%AYHI`z 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

m}-elMg+#R6oxDsdo1WFMtWFa z4is6^rX*RAd43m8Nn#v97ZpvtEa-Q(ubwH>VzMH^54{hk5TqAWntWE-AANZLoe7DZK^I!(&%n)@uXhr zlJ)eB+IDqUh<9Gi440xrkp)WC;0&+bB0v2@>d}Br$;>$PTgoJE)Z4E7=Cf-CQQS_q5rJp!QHF~T1wt4>gI*iB0BjCh=|_af5{{eH z$)K%{ev4+PLh~sAZ8|vagA{h8dx7`n)bc=&7de?6o;I4I>T4{%UcPA^l}psp*=_}v z=hRU#_0?5q*enXQd6_dqwD7XR4^+j_C-ELIJj_-Kx$AH9uAthzR!qM&oVT!G&`^BL zHT`3ODa}9?VXjkagL&P0r=x@?T|28@j~`FTNSG7(eqBEvrn)!1LRV_Nui-d@32x;Rf# z|o+kv?IX!(x9K9JQ4rEJT-O^uc(a-U}gih!KD|~Jn!Cjs{frqC_ zS4dUU#b+(y3=JI1Wv&P;uN;En=Us3r`vC;!qhn+9udbWSYtyxHmlRjbC2X|!UcU?S zZ-Ss#a(kvE9+PhOeu#rW+buVBs58Y}IW)KHJi`gCCyUaUk&dCFLUEd_Uo_8tY6%yJ zkGm*CE3BlywaNlPFjRUOOO?nM@HV29R)__OQ|&%9$gE+o7?W9FpMCqj)GosRNs*>g z>yvCeVX3I9_>|sbF>XRZ@Y#&Omg989@@hHOtn>TC0s3vqJL4_BrH)@JB~kiT5(_m) zoR806C*n#9HG{}TsxS`SGho%FzwDMbE<^psY!@R~R+Me_sI!@mo{5XUNyslSs|@Us z=;&~soze3rpC1@9h8YS~!`?@CrdkgayKV{7mrAF%Rz(!(UMgAPrta~QGog07|I|3= zO@S_!I-2O!^o+cWmW&TQoLlt4t?JBv83tFT73L#;ax*VTvpW+w5vtH+XS;ue5+28q zzWRW?4Do({iB+!gFt@4FDfKBY%$Yx42-d{(1C~*6`_! z%a-Ptjc|hkQvD>q(r`2(RUj8y65#9hXR~oIj3kC$TZuQOxB8HH0}&e~zNs0LX6`&7^{-0(R`|Vs)dV zY>V{dGuSRbKfP5NJ7ZFBOvRLNWb1{0zuTIs&rrhim$WXkiWj0ExkG9LmTQ6jF=39J zex8CM^fL@k>g%&Ac`J_&Wh?kDA_|NH)|MX$<)9n`ax8?9sx^$0i(5>pd{){Zo{!NG zBpP2jM6o?`!gDi2UL{FoKy=k(a;MiJyqBSSMT+R-G{q4 z!{yy#dIm5@K5qJpL>Z|~^s2AujGF9vyeTj>XxU>|FVtQvE;Q5tS>WtK$wjA%Ta6EU zP-RWnofW!n=`J&g=6DzpsBfu?MI#YW>mqO?9foLBvPZjq5rf^Te$xl+^OvsG=L8$B zjLNbh!sW<5x7!BE^gzDQ&!aM+!8-oiv&(ko5WS;V6eM18$)L7U2iAFrddKWG)!*%n z5$JTfzmat?TOUX&obR3L%cDOvw(8P2IpubQEjBv*JM)`F{OM+Xd4GJyM}q373foep z?zN^ki<88pezQv4^!8`PCXy7@`wSnj8Qygi(2VVK-@!y>3zO~?;~;tE4=}pBN4I;h zfe<1*+zLv1g5wjjp1a?TNM9V`X*ca8uZz>F5qrGgK9>0HZo|PW2pk`}dedVG%Chw; zqo_wVx2iCt&1ZP=mM*!E@uomUN`iBRj9!yw$2Lix5-};&EM1)VqE7Fr{K!M+37KlH zK5xx?-}{EcoEM@wuMEwR&WZX6^143=?7ShWqL1ZwhvyAw#T%`&4D(oO(5vQNKv+`M zRbm3OZGeT4jNS(Qh0f!5$RaQ)FlfOE9{B>=C`rdxBIU8Kh!D^{%MQnS2JGpUi)#Se z_QSa@0<%_@fGRAvcFv`nsd?{_STk>HLvZeS^$2N00(CL9^guHvWnb#;ftr3cKLY%% zT&4Fq#*y!3xLBW9Xhix`=UA1ba|tgDvDPcJ6M53rF(W@W>ilF>^6i!|)8L?)Gd9>* zSnmLU_ZeanFa)~|-0`?$Kn;)=#kd^ZqEpL%48Idyaea4Z=d;QxW(1SzCHg1jZ-g=Y z5xchF>Jq!{H%eO;t0VKhM-4Hync~XG(g5Y9Z%FME4!*hn&!qusw@60^!oR-p8YNS2 z+}gz0_H$i(#^gi+ap+A7L&rQkSgY#|5x^?5YZzaJZq9w~<(}Jg;y5g~+6TIB-kety ztc?l;bix(?@Wz;9R#BQWUu5s1Gub&rN>D~>Xt55N488I`EMUTz;6qo;ZFx&S z!u-59Q0#Q}T4z?5eFrZ4+Q-qxY6r2hE)V|_J?H%Et);1UBL-PxC;6G2 z?vBs+GST$}RQr+NG=J)-Mf*$>zZ-3m@s@OFve+#sJbzxw*=sQF@<9ocu7+k&yzy=j z^yPES^))^<7qja9cImqHT^ZZ7Rq$vh)lmHvmHO3^2m7i%vpg0|TX!D4H!fNxr6Q9% zadQ_ow#J_oq2fHyI2;S-oe`2&igbV+7C`XqJ~^RrXEsR22ed8~Xw9;ehx zN`Nby<%g4Cf9!UTm`GHle~4X5eZIkQT2gTFcyA!u9YwtXIc}2ljPQlDkhn)-ot91R z1v9C6?d-&Yw^MV19~CNgvE^~5Iz4S+k^b`X_16#J)n|DK@=cj1bC;~;a)^EB(W}Q5 zj=Ry(u2YBU2fJ%}ttu{2TrO9@gF>zEU5HdlGgZW76LOA&{(Ex!lUn7E75oF%i;|i& zrDYi7(@ZVy}^oeSPSBfm$E zg3E+OP_Q1$H-ejaf_+FI~ju$ zOEu<;Th1bEU=t~1`_sh@D+e~G0ahB%(FO4B5NeAm8J(TFB0UrlU22*%l;jFhh)|l3 zl}l{KW46C~o#0XW9ZG;1Nr*ktz_wVf;&1)LLp0SK+O_4q>Krtcs+yOy<@*__$`DHb zJG+2V8At>fNCz=2h4j#CWQAPm*wAY0tV_h*Rj0u;4>OWbFN`;O)aRUe16(!@U;VMGrlT(N}gQg9;XUj&e1yr;>Ena<0{>lFB38)E6lpI;+0853ulFMOB z8x*goRC5#RN{YMk+I6iQA|_J z>lFrkIvAI7tbpd%A>qGNq*K%wvLQXFhCuYE8duBl&5NN@)euLl=AbL_X(3fvU{o8t ze@=droCtI1xIuc+e@C?jqw=vBD`qomLiPke*lbHA`F}E;^wQlp*%{L;Bro{QUOO;j z%663FYig*@*;y%>rV63+u6r01>1%w~`Ur0^Cshu8;&E;-5ynd)9s8QO=GBB0y{S|i z3``7Hlvr7{ss__1NGm-;w#t3dLLxovW^((etG`k_eC#;$vFd*JqICcagAh)VH;6yr zgT(g_RPLv(5uQ)JZjZN>-xX-62kUdsCKd}t-SIcVV;H^V+YGHAxKK)7s^ip%Ob(P! zRzuD7@?oI3z%1yU(i)f$QRccC1#V4|+9oGtg)dx=ta;zRx9&nZ6TVHjC zROZ(?u6v>H{lk-+Cb&3{(06n7t7%McpYwh-!SLxb?bdw(_4iOp{>XK1U)WlhVJM=0 zLKM+Ex8KCqJ`5kZOZ$irosS4E^dN9^zRXG!7w{IX>2UN$)X@w6d|@B#>M zY+}MVr#(T&pff>q2Y95L!t@x4D5vccOG0sO6H43|d@~w;4b`3iyh#7}b(>eEwP2Om z7Hcte&RLP#%_8B#V=+mB#CsS4cFl)vwT=>^My4)$Jz|mwJk90ZhXu6mS8XN^*wjh) z1$qWJkB*LTTJCNSh!vPkavLJyl|hL@9kt~_iPvs#P(qI~voF^`Z`6YUPV%<1OD8C* zFXGOu{kaBcAQ`J~LAbTK$-jz84y_Ln$KA~$wXxbdnqTI-{gN6b&hj=6t`-(YUgEB-XI1KSbQ(PCOJzpXqPC>NXjSvKccI9(;ed!7oIZ`tj>?ES1oCu-0x>9E ztpF9Iv~qWTgcc>EK%V7~qE~uWe$U8&h(eGEIl7%%??lRE$F>C9#akGxJ>L11q01Oe z4Ap=Bk8*;Hxk}_48FDz}FAdydio)wA0Qe2&16Av?Y#13JJYt#amFy z{4DhS!^*}(ItMVxsp?)6g^s%bP1Bt48cePEJn0@efE;^E)qh?-pz9 zqWI4jiC?E|d&14sJ2r@3~&t5RW-=X~wO65b~95&yTEvuKlyYYa4$BA&8NN`-!yjW?) zVq1r=N!a$Mo&km%mKJijN>zUEOtXEWJ3g^#KomAm)g8!(-IqkHqjQ!}4 zB;D4>1b|2&ybLJT#?#SYB%1!$o~uRn+)2tRuqO9Jfg$j%JE;7>EYz=#3_>R!NmxRF zX8fTLf%H4ZRvPV1dc`NAx4m$AnOc3JufkImg5SD_euV9ooGKhbcRaZU8v3fQ7{js4 zR$BQahx3x3Pu7R}NWCA}1Dx#bf414u7%;YYf$nlnA@9nOe+9>X&j%( zASg0i=I*swp?Wdsl!A>k$&#Q|)-g1Uex)IPMdY2305L5SYOI788SNS)NrC`5{dENC z$86lqmn0EMyY&R*`0g9`&=PRjE4WNz%Br1mC`o2OQP)~7NvAC1s>M{@zGsd#W0?k3 z3>KVMVG?ZWYdSZ8^8U;1$S;hROgKS>w4kuE1jt}CGkT`G3ADVMw(4Sft*Rf39zb8K zIL@4}4%rzEF*NNr{|;{`4Da7lY-tR9OLlf9{5!IB_>tj_X{_9BS-!GXF&s=OeS?TW ziy7)if1XLa{~TU`GpquB90p{ zOTL*1*%29e_fp@Yl#D24(nj5X3O)s4Q*x3sUQ>+b`i|WXw@mb2HsySO0tws6d1Oh1 z@KZqhNj6ao8-zH~faKh~{s5?#D=R;?grVJg|7k1U0ZfYr27BBc%o3;w`vde>prm@z&q7{N@X*?S^&&pB;A6H{=r- z94=Q`HedJ$7Tk*!sw!(7n@J-W2r#MOriy&P@hF_Zlfgb8p@iNPYalI3P4r-@5cs+ita90a1u70CB~4Jz@)umC`U?+!PxIyf=lqGra@Y- zx3L5GMofL~pa$II#a*#CM}tIf&->7M4z$+@!qN2*AShB&(jkJ2fPmUjM9OmYt5HRv zrb5<-9wdxQe`)DMV}LCu5qod$zLf5|EcOjHIqk7~(=8+x)*N3_nwciKu@xiVme*a$ zy*{mnN21qMk?&^Y(wFBH6mQN4LXXHb-qo~ajorN?nvrF6+t9CSvVXc78>%C92t#5U z1K3ee$}pnR2@dtGT2)SItwVZE(Wlsa}<2D@rRZ4GU|Bs6~5foC( zpd6GUpL`wsm2_8Q(;XuZe#A@2Uby}YT|%7dbURoA&*09P*4utNc6vABTl%gXX2_ zBIEaReLSE1CPJD~3Dm~>)CDPF5DhlbFcNiNNwnoSJE@R+NXu^e|ef&QV$K< zw?s3muYmSdA#Hf-W5IFMo7Ueg{+UmVkPcd>#L>eE(k-30W>1_1lMX>y7)^L1if(T zA}l5f);tUtDtrtW%7e^XiY3G5*4E}}RyxznK6mAP3M4g@vbDG89&%q>)B*-eHKg<# z!n7EP1|amq!Y(Zy=zs9(1Py1R4E1NIH)^^ZS{+J@)Tw#C1*XaoMyBCnoHH=si_@Sv ztk35qsW8zmkEMe~oszBeK|5no02N)qUz#q}z`}YzO@%|LRs5MkLr!@^cEQZs0;iye z4W+eMH9}7sRO*Dsg3Q)(15cQJA2euNn!dyq{^$0fq^FnKXPtsN@fg%ndLbMJ{c<l5ejO3syLbp;24b+g`n!Xa)A>N<6mNSP>1w#1 z=06590P4aaiU=dyTvUTOeD3LpC*{T6Uu0&s`hjwFbwglkko|tv3xmPi9Ty`yf8~zW z1R%#<^0hOXc&M#Jp)#$pEj2UlW7V}sY>Oi(xK>3~?dZa-2aIYu?pqOVbGqmgz#l`X zjQCxbCcbhnb`(G3onjIP$-sQ?h6jdCZ)sKYjEa05DCDPG)gs+3O5BO<)+Tu&%v%9( zuQ`7eAQ^#p*v1C?Fi5qWHhJ{ZO!{&o56Yi|ap7J}fS9fuKDb=&373QwRHHi3rzlG< zn>4*E@Lmdb)tJos5ME%ao$;Cv6;saDNHqw&uu`_X?cTW0F-{BK6_pL;gtCO-vHU&= z544aI^`M$-SooReYX~z-s!{LW*orhgJgIeb1_uHb_UC*OjNBk3e3yj0Jrnr3O z^FWEobbkrRJ0Jl1qnQg>{c$7zDmMvaHrPxdqt29q&b{+^H#P%c(TM0O=#g{UuAEse z-zMxYG))WDi>Tb%wYQHGs)(|!uohfc>{g@M`<8!nr3iBc*R*&1d)Y}XEMK9Qb*6G74S2=C6$jzAjJ{EkLB z^S28hSPm53XOJ_$XpCDZzCe9dMsm5eZndXbN`HVX9MM&7ZSQ}iGVo#xN43}sMmcSg z-w&<(;Oa%no~=(N4;(~d-FNZ)2<4eR?W$~<5Gi8#(M0=$Ai9YveP2)N^C>**u=McV z;=+)$2x(GLadM*SXeiqunhb&a;3)X3;>T;z-NwT3KP@r1)W~s9V(DU2oUeGXQwxoh#8Qy8$p;DN#7AgTNeiMdN?I&yU8&#?_tUM5(ipd5N@p??9Lk3%@H_u67p3DNN zmxYTnX9$QX5g05E>b0z^Fn@Z`@YyJa+-B^(5f9}y=aYYB+fEPXFMo<01~O1fR(5_S zUX3Q{=|RQy$a(>fLMqAwkn^AvQpUw4^HBZit9z<=F$Ko2KazeuBfk%Q#WV6)f<*5n zmb`6ucd>@_lDB?g0&smi8J+LIr^+LS{laRy_zCnP*p{7f8J`I7QK2eRPR{ z8ZAdjL#KU9Hk3ysiu&h`R7TS$^xfP6jfZ}@*26hdcF9n%(!0+r#=XFWQcU_!U-dMj zNhJKcj!pnFOdnQO%nv|A8|mbF;n1ZzUJKD*T@?!N6hzQsy*&l&ZRoS_%#Wk52oiN+ zigD)i`8SmwhfB-_%ba1#*>(xsr3H`#;tLL6x?|Bjb%D?2{0{g;TAL?>p ziZAz+SFHXPZSzzhfEMq9u2EwYd!BVmLPn!=OEeb;BL4`s6990$u9E)@<7jW5;jlyW zbV?`LsQY9N9o`ae;TYltqix-!!9YNgM}dX%zIp@>VZYRNJ?L-;#J{{Qzes*5RnD`v z&<%?-f@k=KaCnt$s)2cuHZip)wqeSWO~O@v#Wn3^m7Xwp-S(}(Ak1#OHk>6Wvs;y5 zatO0QjZTc;gswzJa=w)@rT=)z8u}ooiRwRrvKZHCh(>h^l{ZiTjm6p@vHTf0PPV_z zUheLGRvmLx8T^duw`J^qnR+kcUfms`i$uYj7m2){O%X{GC3|DJ{!Zp%Ub$5^6vxt! z%iuBST(Ppb;rK{v9n?9VP2GTMpdjRMG8t;j6xRf|J`Mu*^TyCun+E8%WP>s$oS=_g z1pXBE*rn;|l@GtZC6@cC(_VKV=XcitKQ-rS;M;3p7Ruxg@=d%@5k4y_hr5IyPT0t{ z6~e1BKrj0JLCzv|-3`A0CnGAI9IHF6GjtY7+EqBId>6W%av2D87I%uQ$`bsn918sl z_^$Oyw*k_z-BOi?FR)ilinsy51$X*lzF1v-B)1lL8=~HSJ2@vq75B5|&kbFylJllEISnXF`=OsnPGCAspbWzeY zJ2KyY1%P*-PHO}sBEt#dJ>Km+#{}~|8G4=C6$fkL2OuHGX1_rN9FAn3+ke_o8kAq+ z&OtxjrsT7x7x`q|EB;CDlHQSi!Gn5>{89dtdUp`BA`v!V1M)M3UM%?A;!E~+3!EEx`+Gy(jk`7+a ze41F~eJKN-^h`hA4o@J%aVYXHn2`4)icB73r)&r@!MAgi6J$tTU4Xmdk|&p$K1ZW% z>O^C9RO;;29K(?>Nj6YGE}X0h2w_7hzWM*Ny-PtNSO>0gDy@pLt-YDCF`d;9&j_>_ zq(hn_v4>i)>Zd4LZ8|9A4`vU9;A?NZ5a7x zJz}XB_f6A#?1q^V%}VLWc{9epw!Ix4zzafP;$^-v${QSn`FFDzo6yOdQ?y|@g27@R34N`y%|i2;NUR%PZBPSPx91fvay8(5#h8#LR#b#*PM^hddPadw$lIT&r}iEKoy z7fthBg$dLW5lzKxZR5!}M+f?RW#2K8bLY=*lJ*OQ$%ZKciZjP*NU^I_w~~VVi&dEJ zRYUfd2O=8dX2_l6Ad)h;1P#pYSVsAG<)hjRvU5DEjZ0+!i&;P$y z3e_8pGda(@C^qK0(LiLA4_N(UQ=zYJxzkL{&VC7XK=LNUk{00RCP!O}0Dg5zMf;8b zw!p}04vFueBPhDs2e)iYm`U?U6$3~j9#fa7f$S;d21gDl@qsz|63Q~ZW+n)Yp@9rX zo&Gl~)GXMOn^_j65AtoV~+!q&Sf%)Ff;ab6)O`{Nd@P3t#2XPs^#zpHCJ?$X$B+>#?!1 z#g4m7Jy}}*ysnqPu7{-gSL37@6el}MUK%5PmeR^%Rm8`!3 zod)ivil^Ir9AS%EG5uT)rns6~IJET;SAl-P9}xP>9no)q%G?8^9ItrAdy=Q{F zBuH_Gzorh>d~;NtJpSHPw_Qk^r_s1EO+nSyFE=4ym&$ng*yvOq>@;LRcG29}pRD&3@=SYTT>%!luGG%aMrs*Gf@Z9y#99PWQvm11I7#P0Q2yBtLj!TQ4htI$oR z=t>KX5;J`+{q&IDU-#bIQEnd?a2>~#A79OiGun4Qo~b(=f8=+(=@30{qjit2d|T*T z?DjB+NGOSih-~RY>Q2GZ4b84IG`hU9vKSblnu*&Veqin#%|x|c{|f&|>}^k25LSUH z2Q#??Q(jM$xLHhdg=0sFp;3%%gGL+CyfvGH)YOzk@S{a1mdUyqK1~zvFWfeMk+fzN zi@UqG0!Aixi-rqSg988U;UTjytcw(wNa8TPM3Hvo2A9*Gf>Youn2ZB&{vwdY+@Pa# z5Ocil@+#|N+xxNuEVy*x+R_6G)eaaTATr)oLy*nMS7Ktwu9A9k>r?Ez9L{T%{z9?g z*Q|BIh?LbbQ#It9v&FE{qzW4?WFs2HnRz=f?r5$ah4#XGy~@;r-m9e$+)8BA5W>mY z$MQ<-1oX&%_8jtyHJsoRFkh&Q1XN-KLcXS_({6q!Hf$$^MD`*e9qK@ZYZc5IV^#B> zBFe##!*sv91BxzSIzS8RNAb>^pcnV}@fpC-%am9eJbW>TheScyIyFdn8wyZ_BaZ9W zq@vi~Y;3$T^%W3Mz|^R4yroy~Bb#;8ep@e72)1PbbFawj8pfVXO#sIlmS*=b&kf!GrIqa0YP>OBay; zm^m1iV(NY1+f`_)zDYiwpZ}24aYsfy2;Lvn6^ROsjPzU;c6>&qn@5NsuW2_k{oV->=^eg5M_f*o#A7mG?pM z`|nfo_W$)p4jc8@PKTSn`lbIJqDJih*Sqz_vu1jTa-;SDj^hW!F;Np8pbiB$7SVtF zj1(&EKWBsylss_mtW2*0H-o{r&S8*mwTE8+=aO<8_{6y{=ghmX*)=*JI?*AI7$Zl~Qo)c+5y7 z_ch=?5tC`PMTMZ*PoxrSvgZ0D^LK7u*(ErY9D_-Ui+l5Dq_RO(Or31c!{5IF#QF+i z{%c*rPnXr%hIn43Y{5)GBp03H<=yg^t}}vFO>|A}j@SPwmdJK|JK2{4Ph(97g}d3s?ou zd8{;FoWA490!{fndh-t{>%SLS97(fgkiYZc-V_<`5AUbnKg`k_-jUdlwVeHgF0nSo zCOW56emrT@t_Xoo$6>iuveZBSf3wT!0RQ*m5>R*xI$al_g8dHqR$#>dA1C4Porf2R zgD5wFX#HK$^G7=q=*+|(ns<_r(53J~D4G4txnM^&sUS0zWgeTGmW|7x+wRakakpyZ z51Stu^FRCL|Jrb39#Bx7;5pv)|1RDDc~h6z4O!Up$-1(j!x zf9Jq0h?9V&?h}Vi{xXha-E(!HYNsIIeUQ}u^Q@`E{eJQ~(2dGRUPpw-b$B^HtqIS1 zp*L2YDEMXwr~S-XmX0HuE`tS#LzzOMb5=5yIuFWv z)~(VNnnA#eUp@8rE~o-9I#-kB8x5T;n0qLYm|7r1oOAo0;up``1#|IsEroawUYy%n z=!>W070~DW`|(NQ_&{uwk;V1X*3wYgVg55}sR3QArC^gm^nXTE;Rc+$DLaghni{~w z>D7Eo+T?|4(GG7W(cdrn{nC`Pj7Gi_*%hE~wz-yxtpzF%jM9=0$ovd;Y_!u*@$+Vu z|G2hqb6O0{6=i}&!!Wur`+#k~on7Or^_@sn)qd$ORD0kA*s<+T|UVE;K-K=u=No;a#6dw!ae$n7CS2B&9@&fq z+~w9E-P4u(cjKJKFZU646-LZ;lgx5|FNPHxpP z2l@N2b^w9FbvanIL#R#wpzgEe<{+^I2) zD06S>?Ob>lr&&XxQvUP~6BAQ@KWY}Ku%GsCkB-aU9;p0yX@!Igq$I}PlkFP zrQCO9Yx$QE2?^7s(=ZJ=S2HCZNHx92TYn>%6!3<7?Ir2#wdO!8Y{CDr?or`vxq;0i zNZ#a5hW;aswJ3lL%`N9xpr6dN%Q&w*VDiG!R@(G7_s_KUp$S>Mw)5=QExG42Xo>;~ z2PVXvwn&OhtqRLX_3aGX4dolHzXt0IWJwtZ4f1D2X*OCn;vvBoyj&Z&MVL?2OPY+V zUQsJ@z~(-yvvTdSa`0UhA+~WEg}Q{MF7tz(D@dy+?F}l8Xd5tWp4QeWztz%y_afJO zkk8LfLW2Z)kFF3RX7p4GV@h1Vz2?_By|AueroP}7H86Zc41gWnBkorsX@MS%PXBIw zmPwr?(gzzV?yY{L=S>DbQHx}~AVo2qN*>Rr6Qcg@MB-YiaqAWJ`Ja>9e3-*{jQC;0 z_F{V_|9XmmTq(DQ7g2n$qllK5rV}iXZZS6D{u!flXXQnB5-<)Q2n7`WF6ih85XFg7 zlz}BjsN9}bZAr)$e4md&AAh6&vvN;&qbU)GIyY4$~K3|HQ2k}0IW#ZFTazt)E>8yg%M30TMqzQlXXW4I|XJJl_$ zy(DFaCM}J27`R%u)Qc$6X2f+~u8s@(*xS%LcAMsNxtAaEr57^RCi%<`E+6jU7h6tw zDLnvfx_^T-OOds6@t0Obxa4AJHs)Sh$;j~1!0{6Dc94?knVi{S=DVngrPgza%7&sm ztbfl+52|Ij9%NVbUIn4sv1?{=EAJgGkYBYRUm#a*lwP9P2?&^&@_9SxZf{j=sfiu7 z{%yEq(L@A4J-7g`yPZC8fZMvTjLT9&p9B6%W)0EwSY`kFaZZ_j$|pfYoJml&PCGi! z=ckMBt%Dy=;>hM;-`Cy1(@!vb#w@2}IoT+i|9n7}y%2+?p)KS$3G4&nu^h45l;bdc z+^rz(pBW<;K=C(N$zjZVrtJx>N-7BYpMB!Rx5LN<|M;cISw&Vx32xa)eIt zlaAjv-Am_-Y=wLHpG${?gn+}k^#`x;H1Vd`VcU;_J6mLC9>aoQ&Ysnn>JXT_cWY{>J-kOF5rl@?mRI#^*Z%PMrw|~NfILsHb zor$HcPkgS=^GcO;sB2!D#X32z1b1L-vQ&xJGz#cx~+!&@TwcZd%~lJtq%$ov_8JEat*=glbU zu%TPdlZL$HE)ux0_CPg!)6#DNrF?{PH<}}TKKTAzMB_HO&Uf#|U6ZWqo`XRlDqZTD zSuaHI>n^j+-XW52Jb?`eOqRjv94Ef5St@#$jMEA1g*a{`mYtJP^R(pVHR`-DkgG$b z6?-p?R^2mMI>x9#o;PS>-C=*xHWjRr7A zoQ}^!E!-W>NPSM*&yL@}0Z=^DVIroZz`-nJb49u3Bf~Ng)|+9c;cuV5+7vKD0q6bS zU>#b+cNrNmkX*nOF@yzFvGCKUNn3ygxp!sZnn&*SThGYOyGlHeiR7!GB<5*1z2Pt5 z+&kNCu`Q&fT6r)FE8*yLKOa_aJbj5;xFE+sy9tOl`xS8rELe@m#rf zwMcYrYz*H=F8b_cG*6+LROXI~7o_=_is+#&l+`tqBD;}1W#5~{Mec0gW@*UGV&l%e zUu?HdK_MBPN~pCyL3V}vo??dE9U_+`ii+$R80DRfu6EgSC8sjE`i8jc>^<0+X?nAr zQ);ts5nZSa2ff$*gzGPR<=KUuLbJ>^h~5P!OAR==h+)RU$#PDwK~msWngEfUR;W=y z&Uy<&K__eooj=*$9K>#rHKw+Ony0qDPPE=tE}s(rA2*oI9?xXr5sdO=|M8efOzcMJ@9sR% z{mpnck>CVD{Kxg+1@U>7;*aUXtZoKGb96J$T$FVBF0s38hJ{|h&b)tE!PZHs(i`O1 z%R!OL)kd~+KhR*o$(n7iB(^A>I?6P>T%W#;?AJ*|bZ-{omu&m*j|A$JvPJwx7jfe# zb}plP^M+rNT;+{nU1{oF-LaT^<;d}zsi%w!i+{k1F9TI^^h-$aeL9*kTs%MeA%}^^ z4qVFB_%f^CKXeqbRB@eoG1wb~g8;EguG=-8(df7~?&q*WvPkT3~=rdj&mAV`Qk08oddrBj8z3nHx=uhGqi%YTErD_P4GG@8_YmurylaYD$st zVDkLV7#LcwFXg^s0kk7Ti5VsRnNbkL zumzx<)=x#3k9aXwR<7GSr-#}*ov-;(B92bbGLt~Bs;b)iA;f0~Rgtz$haJ~|W1iXM zJ<;}2dZ=|P=qJnMN%4oQuC#xV-g;90UeW?08Yp-KuAc@iDevYw;@w{)CtW~!fq{W- zX73s!F*au+Si+dm9$A_(KrX9*GW^dx1UW)eHk{y=c~TJpO2j|YAgg(LO=}*za}ax8 zj&iCR7SL=f%9IX5D{db4-nUs>O}sl>lcVXPxsmY!D-5m-pZG&nHy!**L;IFVgSR*@ z-JnP@%ow;_BA%srMff)z<=EVezvh#rD4Ua{jJyf*Frd#%4_zP{(_xJ0&tnY;3Hj8k zH?K7C!`a%rjo@Lb8X93m70#xJ?z_eaRFy(q=9PuWLZxPDFc_*XUR|!@p<L*O52La_(du_j!7P4)kgpZ7e`6GUL_o{_c#{kIxn_t@b5E zCCCz-rXa5F-^4En@(b3dK*OcueU4rkRm&`AQzyo}Qisa{NjG3#|FZ@yM&WQihHTAJ z+xzM_i>CpfH21xX)?81*3o8j3Pf{391N?PFgFwEDeB6h(Sn*NXADB?`Y6!OkFv4KFmKOM)DMDz=nZ0ep zOoIX85UD(Eg8IfYNiB}$T(7=lG3I6Ugs^hR@7?=YZOtuW;M?JMSbvdF_3l3IPID53 z2p@()!$OS{{Mf@6m9(=D!YVTRH!iKBMi>x8_~gOB7sP@#`S>`!E${VLz8=@J6-zB= z6#+1Miai|36sfg{=bVQQi_@owBH_YaKv47J*)Uy{ellh2IGWwMLSok4IVp z>z@)R3EPEtb|&i)5@t{%TikcCsa6`NFM6gIssL&`WIA(iU~3sRj78L%__Ur=_+bu& zLP^qkl91Nb))#KX6jsqYy1dyP?4f|Vzbey$K-~rIjCZ)#7YV!D(24nM@x-YkTZivG zg!CuRC6w^Vt*3mWBQqBY=`@^EPFfzyCscMUv`JMye(iaBz9WVa&QwhIHDd8~AM*oH zzn6M+(raR_Kqxs65`v;~n(3SEX6$f!tB|Xs zgihPDqcZ$E2};+ykvqSx8&#f}&UKHcc$}GmK%CV1Hz@cJ^|oUKkmy@o%^bwhs$W(s zhm*YpY9nuIv)gn(l(cuy+Aou5ecQO*Ks5h*U5M?IWmM!wHTV7a_Tbg0hD)AZ8;h&o zS||QCZK1YHo?fKjbH9zK_6pG`7i#WO-1(K9-nMr&vZh|{NQT@x$6o2zYeq#n+Rx;~ z^DN!6$nDEJ`Kra=ml&1VK1@ghVZ_Y?LYCGQy-grFr62XB5SIYB5$Lk_r*(FmG+~Zi zy<5N2)%y6jtfsO?Hw83Qixr&KM&tD^W$9|Snt<}_$=HhKf6fdUrr|lL)#Tn!Hg*K% zv6I`k)0;TQg3SdJ4uWrFZmVHpsdAO0 z03Cd_YQPGE*|`0D@?-UgPsZgezx(lz4J7X8=8enQR1#fWzmvyM{6;ECa*BFp!mA=1}^p$Ma zNNTg|gK9l_@!q>lYFd`z0HlHf&2sYV72#~VF)F>pYRg>IH==tbn2nm0$q@BJ)t@rt z(BJ9DwL5(`;u~ObThSW6Mz7_o!WaYo@|J@r1E6Cl~ZTL{2?x z5@VN5fY0&ru4Hea-dffU7)7t~x^Cn<_;IwsjWPoVvYgi_VxeW`d@o?Om4_wKR{422*3 zG|;E)aE8|t-IYBmfF09a01K739K-|-@Z5iwjKrAwf8_gV?meu{TN1?xkF<83(Uu8 zKJ`n4(C~Wxy3O}tvjAsg1VIOv&U^g`42z7JQ!yp|L1%4quf@)i4`X9&mTTd&_mM7- zz!`&C^BAWWb_naTVzRaIDE6UOzj}Oc`590o)RcuVuprXZgoFu%R=4gtja%!a`qFfY zTl3N!`{f^PJYDHRPDBx&C!t`Oyc#|?Bt-+~YVxM%;b;B{$LVXgc;igr7-Nu-973i3J&iW73}BWJU-}#B{fjBgGb-hd_?g_o=F;6& zC1V#hZ9-*Fr)?(o{zw|3Ek8hsSd#gLN9_D=PXQy4R+W^(`Q)T*!BbTe?FDhn)d z*L|i7z zxjO4KL+d8WI5n8p$cfeVw!he7V1$+M1PFS38o8!;VZ`u$wjn#lF&uJwf<){*Ab%8Y zr+bqZK?4;+spDdREC}a+YMHWCk6GCoc6$}i0gHTQG?yjgn^Go2c63SdFVoZlEQ7JG z?5nN%a0;Rw)<+i=YG4r}#pF)t=De9akW+>qor*+zZq=X+tbB$#HP~v@D`Ba{oWhY7 z6;JO;AB#nf0d$x*9NR?@Ny3ZSBE7DX+7V=_|-{(vu(47 z`Db1}RO*X2q6piTg&QAG+aUtz0NPMS=Gwa~(eRGsFt)qj7uO}yrWG_;YT-eV=dGh> zN3r%u`%Z1$O?&XmgV6CC*m?l2g8+cE=*q2kF`*~(Ya}7)F&4kTC-!j*aYW$6L&C_| zrQSrY?1oevr`dR3sGQPv_qN2ZQ0}{6sIFJ@J|nArNo$_^~-F=B;p7NIAJQP z4PZ2PN{uEWPvt|94R`JRBHF_%R*a+J+UnZXxvJ z-;8_JzWJ~p;k$P=L*wBEA9(dRLFJu~##q=JpP{znsURHQg&TlNAz2@mTq#mig<#}p zj!~?VuPOzY0N)p76V8ff^ydtKaDyoiRU`!63$Jt7SQm)1aIm1gf#SCU}Fr|=+036xil3p@x zy{i#7xB)uI)=0yQ>ZE^e%<}O7YNM1R889*QX7JtfN99pB ztyPXsdJ7=&F}jY);yq;17bo+@MA1WeMXfd95jQ=M=;_^cc8Pc7rq(ew>_w_xHLi5s z5Q3T*SleVk!fpI@$+odZ?EE)nX~tPsV7eY*n*{${4%a4*+GIrS&#aX$%D-~+F90m7 zH@@Y>&mU2_`{@gMI?t2IUf*;Fgu=-leWwWtDA?`BSevdsGmUOE_gn7f`eK1*VT=2<0jkd-wfnOF z`XZbUjT-NfpyZL)Dx7r3Qqa{w`dS1^dHHz%Qd?DeVb^Ym9Su3_7ldr!n7_IB7shj z17!Z(^HQGKfD}r)ZyrakS$4SDPLyLvhX2^->##|lA#IYw$u3@n*|;M3v9obB9*UsE z*=w1;qX}J<)*IUd_`lbca?jgjD@4<`|9^{X*A;y3ntB{Y=g)xQy5(R(84kHSkS~VL z*gelD1$}$V4HFNt=1+4N%ZW?;18}fx0C$_V3NDc9>E+WQBQmyroxyP!>tvc1%Mqfm zZ@_x`nWjk(yp5r-R(H~$ZG-k&RV}mosA`?|duOVvMJN(wD zM(7XIIv4UuR+{5A?i*5Je2(D&IbF&FC5+)NLd@#!CDS-0NYmlTuVjNv086^MA01Us zz|Y+v^tlGVmcG6l&7rv^mN5dM{N3B*z|7T%&t)}T&_}91fPyiN*4TahI~lCXr~B-B zj<{b?KL%w_7)UrYoK|-m-&E}#ur{_!$;M?~e-x1}P?DXIJn;UO6JbPGgr!2;!wfbK zC=$4;3rB4XWe2N%3jF*e^GtYibn%^D^nhE7Zbnw5hjp>ABz5)DmY*5LdSzSW!M74i zA6-3NPo&7QL@VaT8HALV4tbUkO1V<5I}-*u8rSNZ?0;tOQriDVarF5&z zov)IgY>y*-E371thee}Kl-Zy_`1(RiLywFzvhK7r_DHJpO}jsKpFFzL>HedcD<VDGErcBPAmOJWl2oLqX@@!@d**5|&+4pNzUA5-niY@?fcQ^`^*+ zsh3ZbrA2XZ=k(jfJJKEBa=ysZMjIty0*i{+S4@8|XNP^9XOMICs@p%F-~`{cxcGKt zO9ZS!44pXv_kt7q%xWxyY^Z8$KnB70VfFbL((S%Tx*}K5H+Qr)#cEH2i~ZhW0Qg4& zZnn7b>`72h<(M!-Yep!n9YW1?Q!F676{txnX;}na_KAAc3M79{VUKu!`wf(usk98^ zduV<gF7rN%XbeNUIumz&}s%^rzgcZ@Q+U--8z@dj`DiRcl=zwfH~4NE|mzrX*UQ z0i)-k%nQ=&SoW@4F|MQlg8V{*7PuJ+hWTs%a2Fn~y-=RS+b!+0$nN6E&g@3>@*u zCGxEeuJ($QVjAO-`V;r*+XY^xM3NsiL;T;EQ$u*z>kF#1k@_&3c3PE|x}(I1NP`PX zQb3Wp7!54#0z8cHVZ1$@O~R++r|s$hUSXEU+S(cspJf);z>r;Y5oC0AsE{6PZ_kS9 z(*x4oHXvXcEPKNbVB!`46TfgtP~~%~Z$kLoi!q=0Ax#J}7Ait-P&3Jq3%Lh^!hhl7 z^kB*|ZTPij9m%65de$!$Mjim>W6TQaGo`(Le)0=mptxx0 zmpXg#wuk=h!Ql)hYq*e+&9JeM8U<;4IK(MSqG`U@cf0*OHrPDGv@P1cJ z(=}{=TRJ2Ca6pVXfzYC>L~xo?uPq;&Q61t-gO+eOL4v_h{%x5Me#Fl)&@;0~x$;s*V`i*A7{x!nZZh;!>{qW6nDn;`Q+=J!ITQooiX1{s0 z?bawKCocY;A9U&B9qkD1;-x25*T-m@UkU5oj-S;XuV(TqYrR%~AsJ2{3 zB|Ql0W{&G~?9Uv;!n;4WcjhS`rVQ`UToU6KPJL)! z8#b+kb=27`Q2RG<+ydxA*{X0P7m$Y;08+!=WBag|wJ8mtjxsL2_BBarA6<(qCn_YE z%?f@L$XQO6y^$9%Oi63!rhG`o=OA)+d9Dc@!&m-C+e;fTYYO)*KU}w=OCm1Fs&1e` zbJ@h!fAO~D%j^x7Ai|&fS=Ax+TZ1GJ+DN^_v7H|;nKz7+b!N$mudnfQ<)h zPJ~_9kd{yr(x)qUaka0uaGV^c1~~g<{IWa`d-b|dQZSJ)r}yl3y4|VxX3{QsO7}dS z8wYK6*8E^c=$Cy>R$qU~mSOV_65_N`_{v6)V6QDoGG382J-plzpSj~#>x9m14&lv8!RK63;O1(Qr#kDV_{cu)dfSF>6q zgCY6uP`~Mn|Al41Y-yZL04T=E3E;-Gq|kZ8@cJN?!&rw8Zijz$jChgR%xcANFWjO= zJjx!1`!0X+>{5w(ol9d!ZaxT>*&;Rkvi zM}<|iM$stZrFvTs?*VCic@wR--^F#FQ|IFLjGHFZkc`LX!BZ`#=3e6lD|`n0p%n;l4DImbo;C=#sqU z@?*Vx^$q-+*mj)MOQg1-Ujacu+<-rf)COf5MB8nB?xm*pgp1-MwPGK=bTXsa#;#)5 zbi;SgPq@ku`o*idBjDHY2*i56v8CWQcv z$GNb5&AgTb)J+7S#Clv_cZYHOq?V#@Tm~>s#Jxav1X}`nEUBn7#71vVzh^|NIICGt z@Y&0Iy+R*yu>s-M5khSEj(_P`%#)CGEiuLc5Xs3|PXG&5_Y{eL(sitp9oMDz3+%wr z44MY7tdF-js8&ob{eSK*7Zq0wO}?LN34hcxV@R)zA1ERV?D#?@G@%qCH;mp zv}H{qc(7ELCi(#9Q}x^dur3a1c-^p?neDtgpFVaAyxvYQ4}%LBv>xIMW*;KByV!HP zL-m=-5z;*XKC@^wY8Lj=4F-4-X;yE21Z0av_CX(OlTm-8N%Fkd6a+1$8j}5vHreTT z*5l9<-t?XF&2^g1hpkyzX3zo|u>j#Bh8ycPKkQH&pJ)|mD*)x(Dviv}w;E5BLlp>9 zuZ|v}NN!IlpgSwWM$*|w*i?~~ZRHq~P2vuDSu_eM^YFWTI8$Q_oc%p-ur4Q6yw5$Pl27I3e}$j^K(V{^e|SVvB>H?UyNyh&EoAej z|I*)=q*|Bwh3UhMI$GTql+xD3PUy6lZsobPTE#)9rO|waVmnE&9sV9y4bwQM0L!S^ zGaYQG=OPpQEMyv2VvEPFnG8h--#*@%>&#*tet=JIu_s!JCCa$G7GAAc*;z{~JK`-@ zhn93GimuJL+?04BWUf}=&#v2l_sbXbc$FemsboAUlMbM&vGd1zi-j3pT4UmJ?mu7N z?_^G^ZGVm=!y*&XBx5n>)#pB+;#}G?sBzp%P@Qr%?Z5Jw1x|vtg0T@I>HC7Uy23zU z%e*B(>|Ez~DS0s$*Q+t2m+fkWn)-+=1+tWygK6E^(fr{-)8krs%6ao&u250^^|^@K z_^039uVs|bOvkLOg{6~Om57k(N3OIhCxyPoe(* zNxXEf9(Fm-iu=R_lRL-&{Qm>Q=*& zlb_WeqenggIO6k?QIbXl(H0QQGZx?A#Dgj%qP0FCP{Rc5^k7v;$nHruf#p=gBN3{| zU2Nx+Rk7rxcK+AAPOkGy-O8F~hG5Eo#JZ7FT)yu8tQ6#u!#jNtWep2l9)mB>y`(^$ zzCiIXUb$nW14tfATxZY=B@G3gPabGRDdXWqeNpENfLDUteUrKW>%y!_X9PC9 zwN3^#!dRrYfNL)?uYP9?0E}%-U&Ef;rR89iz`QL0x?CQ}`=qY`fvP;M=XeR&R~67} zcsY3F!*yqhwgZ0IkRAzfhg@8uCY6}pX=uCxoGP74p32PI2Z30xUB3@gJT)KrZp~qu zkM<>rTsoWOK<>28b(cRdlqI~(gri%!D};NC??X%DoaeYEC|#GnfZ;qX?P{ZWqj%yg zV8z|H7@L`|!=?k@}_r&CDnvF}pEu`=|BL+f5O-n71l2G0SfX)HZeVX$yxvU+LVg;a4lD3mApcIZW z!mb^40L~bd*JAh<>a47YB)vmqaRqeBI{fhal zM8P*@S^H$rb!W@4T> zYnRitbu1bVkVSXL(*8&gkOLX`y^nVl4WFiX%Swyhxo);;7`}QVFk8b`Z#`AFQ%gzB z2;JJ5<+nn|Uu2p(bn10f$ydY$gJRiLen!4p04|yc9DIDPDGIYbLHB*zp2t>Wf1IK^ zrJk#hESU-D3Sa8q8?lCDnMr6s(EhUN%6bxV5+M{fu&W-D_*^5uTOB2EIzM2|(`mxg zWm+~q;8!VCa?J_4o@xqf9_7VKIbIG7?sbRY%6^BcRvS3^1}u!0?NE(6n18}GMwpLVhg{xGa${5suQ=^*x{_2ka&dTGU?v#J z_6Q4s(n+$fj8hR2g{AY0!Z>&mlC<&3znqzpYDiY`HccR!a!R&MhnNk?%k)U! zpp?4J@wnhyO*vMqazsXWl5kR;e+tLi%4Lh>JHEPLe!IwwIK+c?iPMc4GB1(F z?l|n6@(m4hR3wBr{Qe=lx;M3PV$H}J>>%qa71LQk+|UG}Ui@DgCIIW>;CVybO(hoz z>-i9rs?))UGJMuf5@*6T+Y@d)O&kr`#ICce(9OJC0_7=}-+s1(<8+)HIc+6n`%h*1 zeX=_$ci{Z!YW*XDUO6Esi*J8Li~fz=3O_s|nWm7gv?5Vp)eIpIP0UBDXmA&^8>8L8 z2?}g$xD#v(B=UvE;4qNgmc~FMs9PH*(Bueh{p>HVIgetg7>@-!&cNQCBFUFFSrY76 zM^o9_G>M$nK0x_wo;^c@IM`_P$kV95dErCNGDbW8<4cXWrM$wZOuZC(E&wea0%2@= z(&YRI5HDYVv1Lt05Z@M;-dqPj*aq^|V5~ec_yW@SSa8>AOjCSgB9UV3BHzp)svnP* zghsUbVgM4FbhijHJ#hbPCvg}ZFPp^s^NGoQWY>y+`Bu+UZQg1>U7df1^OyZMIeklqwUq$i~8i6t$nZW6MT{+9JNS23mNwoGkbUCJYu3k&n zkYmMGD|^O)+&sm5#614`xcKxcc8O&F@|Do3HnSBARJz>QqO49A*Sc4TdL!aC#ZU@( zNxvrc2sE)fV9*<#ufBXLOSv+C>wIt|I~3Vyjnxe76e@tQcl#fiojLF;<|0eLzdjpp ziinT@3YxWyUzF7v&ikKdn~6=wazOwM5%LRYlirSq^d-Lc8#8AWZF`@_z~yyIGfr5#rA;VX*Nx*d~)MU0;SmK!X>#!mS) z$>{-l_1eeY-dI!ItRa%FCAqGb1y+cXmCLX1UT6C!h>N4wf58>_s$I$D=zc+*dJ`XS z@P4=cJcZ|UzP8wpB0caT$I}>}X*XoW*v)|glns=poZSJZ4zj4}3y*W`*LPLxHo)qh z)iHRk{3l!u)0Z~4>6(P)nb(AfAG!hYZo9_Mm-J8}AScTC)1WHoBE2SLZ&7Z1@K@}9 zl;yQJQF_so(!)0cRif&xOZ<{WiAMldqnBFa=i453cb}|e z(ymTs-H~xYZ$`{D%u!;Ya5rAJXXFCTc~+d@_|3+^u))VPjNk*wvsYO=IU2!LVD)4w zs+4GOxv!klCr*s3m)QQ~w_+djOL^Uc(>|RkScmIAgaBy3)cRS$D8X6c3u_(9{>;EU z=YI}<9q5Qpj+?HnhQIRaH{U=NT#x9H=vaSR4FeW8H19vbA9eO593~-1<>R%{>x`Qs zK)}So0IlJBt?XG;o#cy^Xa8Y0W_HiPB(WgQ!O_L(VE}~U`w`E2<%&epA3J})58NyN%Xd8H@5Wd~5zx8TIEHdy z;p0W_ZPGq?{%aX+?NvpQT5C+)8EtwqP?jbs#8O>)lqK;8-43C~q&_@*vFTT#6U!#! zxg)00SNF`RIu}HPq2lFtB#_cZJj9kXEQ;_beEBzePB1e$4Q7TX3rd0SKf@USq z!K2IyL^dFxpAlZ^GaNv)johaA-QO(e;e+?^p|@>v{bJCCRnlAixevO&hfd6;*1s)B zpanU|{6tWxXtb*pq;#{J%eFJ5< z{+fAYY7qi&H~N_lU#?g=P@AE&Xn$rd6gIIR!$f3VT4tNMQ0Rs9{tfuem-vzqB5JM< zP48YtfOZuk`T&Wp{F`f{Tld^JEw&s@;3&*mgf75FQt{QkVp4dfuAAetNkd#93MVAG=4T6(oQEmj5yhr~mYcX2e_T_r@_cMrR@# z*sf*Y(U>L=USa=ouNq4c75f*Cm$g--JoB@%zOKj};WWAjj4O}cl`7PRsY)047ivXY zBn8Jl)ABCq+UFWKnoOy~PFz^}It*YQR36dWK109u_&)p=$P{QeaM9DicN;IgkG6K7 z?bmlViyYU`Z(37K9$G`yX@o-*v4jW%h*_#jB5m!*wYec{noB+x#wKLCWk6)-tTq_o z$-*uphaats)-7L@=*DrZ$mx<3d>x*>>dIe?Bt#f~V=eZ={lkyl^Fj2?!4H13`WJhB z`EGB+`qV(Q+W)7G@u{6d8OF?&u@g1xS$)h|S(T;8R300~{m`oT3DK%jgQ(bv>-s&9 zN3@dwXc(w;dzIMu5Nbl6MH)a{{+p6!(Hm5TKy!oXu+A+4G&hd{w=)B)F#&hY_Ob)J zu%h(p?EE>OuwlZ3rex&;FRKl2hlFuL4t zU^Jo(8@$H^ApWB#Y&M;1f2aJ?UtAzA^jt+b4S z#B1qjzIVeF3d5E8BAF&9%W-;@Lt%)@4Q7>ZO2Z~d(aEqH-=33w=EccswTtOOa8*0bj=s#~QV6)SoY&KWvSXmUp9D-#!K&!HFxU+SCg&GlLglJ zGMNj99j*|`<7Zh<)M&`Z>W&TT>E!bDi3E*p@qG>A*>9Ctz98mw6_ANJcr$+Fp4c{G zzqyr8^Jj#dj+*^%^AqsP#ymh-h`4y`W@vCM-i<}bR{g<{pyc|jr+z=KmY%8MTVQ~C zO`d@bSToPK+Gje+X$vC#p7Q!~e0GI}|8gfinxdIQIl?o22EwZ#uAf69*S%~r2Uovw(YU;nb@$=ib;uy(o>!uYSn=GBuy_gYic6NP# z5T?Viv^S@ZDw8(iA*T_}g=%_6LTp!Od#ejHaxPx33ha2p4!s|?)+g(C?x%Lf^8)~K zs%q!9Uh-`U_KoQaKMFJ2PzSM7tu*Mt7{kh=i1NOV5e!(KZh5Mo@^&MPgf847Q2i9@ z$y-G!Njwo=H-J8~!Ubo0fxvg7YhU^ao6HtB*Nc__rE%rujlDbfLFeubW~iRAa}{uV ze!8D66hD#S)m!EKeOPac-?=f=03%$cxxHI?Z+B44Dmv;%gERFd$ZbPXU^r* z^Ts4K%5`qbFps9oq8P5&Lnxek&4bgd9&!d|NyI}nu}e_e75t7mryZf#r+V2%{SCrW zeNTzC26J@ifnHvdS^mF==b5M=gMLT%4|5{2@Fa)aH1t{(fpZK@U>+D`)b#=)PK9}a z4-R1rgQ%70O137q-$8jf6dp))zMe9NhvaV!@HgIxCv7E`5bTz+6$*3RvUNb9-pIWn zAOSBu$;=M?T=*_>UJM-`y^r;B;>w7sHEi@+wG6 z^0n(fwSv{CMku8*v(+3h(_nksUjKO95c8{YJb3bXzJ#a% z>@j2(QQ1XqAp*b(`6J%xrmG{?!|fRo07H#?{=2KsZ>H9saNsz!dY(i-X1KvQo3m-N~Q+UgH`?fy~A2m*<-qz;;67HK{(G@;WUCzi{aGE}Q z@}@AG?(F%Tg3Fj*sggYS=M@n&Mz>uQ1gy?jPSlSErEfU|%@!Yb{*^ZCT#ug2l0H}8 ziul;JqTkmU-i&pAV`ap8V=>ZlJm*y$Lr2|1@;6ZlIJr;K z)EFCatMVw1v%=`}L*21Bn`jh=g*%|7Dhe~K>Cyf4Pzo78YlmO7y#of`R>$b)`a@^g zztjHpHR8gJKlj>>ScK;zBtd`vzbiurwwkH7bH!t~^rh+!_!<4czvfKkSk43Q zMjM}~&nT^FekfZcOu4CKGPI8;7$-LT&f zssCMyqVKcZ{_FH2tOm4ZldZu1snqw$Wx{$u?5xa_xGIJp1N>X$s*4CKC9HX&XTMn7 zFkjtc|2MG4|8X7q?BnBg8HyyUpThbO+5RLweNdg>h#|#t)^anAPKx^J8?t835(l>v zrmek0>^`%^iqUaltSGuy{lg;c;0}DysdFdh+!#?KF!@qM0b>wDw|x(!(K5svljWup zV6XxMJN(Vvkc2UdI!EZOh*Z?XS{0N(ROz^^prUf8GLJom z_cwLVJ|(IYh6)RxJdlR8q1r95oNw7$QsQsS}8HfL@mujJMGfRWhr7=O&;x zEgtWJvcjSwOFhvZA9=~nC}8aWO9=QR(FKq}s z?p&S<^Jy5Fy*0WilrK%K8iicEaQO&_;NX{S^_9iFXdhfcbL~wC;0O}h+)|U8dds@^ z8G>W0@_t3(zf08FD&8}Pfc&`B-FWs# zV{A-}A8X@;Ur85FVml-quXLiqELatmHxHIFwf)veVnms-pgP&Vo{ZMj0E%N^+>v8$ z_rAArO}QlX2`=~h_5><1puGwm(!B|wvEe#+MHYq5I(JLZo#2pH&oc_H z*Lz}!hN@_KobR?Gc24U&qCF@*hzvXA+h^*JE8ybWJwPN2q;J4^HmOX34p_aJk6VSz z%w4C&JbPj!(4JI#e}RO^->!%2OKKZ_GM`f$SYC$$9$bR|8t(=PONJ84lFscsE&xgQ z<$$sk>B2vQz?cTSQ0l-~kqj`3gWa8w^`)e;`rr$ZFNsqTs~Q~4y64)f6;QAuaWpB* zMNJjNtSernWv%gb9FLXH^#Aw*%Rodh?3=z57$jRkJgw9-Oi>IZ?NPyx(Z1e^01Y_% zN9L#4so{wq&G%wnkMR$@E&2STQMq21!2R;)wm|Zu08jy^fT6ozKx3JwU72GCcTV9E zE3${VXIh>2admTr*lmni9c~CeFc!FA!B>Gw{|Z^4kz52dq^8+?M<~ha_>Mfn7gAPW z7fQ}%Uckq|$$D`*K9{G}gxTYAN4-D`U4z?ftS8;nS^Sh1jD^g3o)@ZqMkVw=&%MM& zdW8(NRBoWT9K#f970YDHcM|5L@_*ub*-<2}grD+$^3zPzoYc?HZ}#TwJRfgxS^Kz? z9hh@ZcL!rWkGA6D^SY@yl9vy1p6vlU$^UL6gY3VHXYg(e-pPutH*em_*%cbD|XZ1)IWBSD#uJ zTb1c*GzC?>GLipbr9~>gO?fVE?Scu-(r4`sw9KdJ9FJdI1hOfHb*Rwi16wfe3GOyi zkJ4~eCYV6w@_DJdhxHQP!?`8#bxeo7ik19km>rR4w(#F%H*^#g8^D1L6ciWy7f6$RG?L?DmT3r zNpwt}&(~&7(c>3gNY_4~&R8sU|8BnYhCGE6#Y7RJyqk^c8dy@U35 zHG}bFFo|P4$o(`Zm$qB#;E98+>)=~T&Noe|6Qj~Ht)Vgb&#PpeF03{5Dp{v5h--AE zGs1np+;#^&!Qy#$3{qgK0@K1D>&-Z=#|^;Bcnp8Dl1k$7R6^Jr`2r7e;4`KAcqPU6 zFxXcjR_#0xWsf-I*T2SLI_TB>;Ntkvt3-Pqo)=GmF5`7nHv!%<{l6!*0C6ju?LCt0 z0P|gymAsP0IBKxF(xP{1qP|EgJv3b#rGX3v=)&$uW$HC~nv?a}nI_}I^hH?}CI4hM zTj_nO&x`+jMW6eUg~M;6&8ZR?N`DGT@@AQOnPCP$o9_ctvwhJ<;#t|hPCogqsx*~O zsS=+Uo7ZFYUjop-9nJsjvV>K5eRkPP=5dD(oIPSTja71G>__V zor50p^072kCNV+-%Za3E z(E>p(&d>`U}8LCqAw+st~m?#d~UbJI=*d8Njycyfy zLc1sF{O(08E-7s0Zcd#%)qzJVm_Ho;sE&8kD1$YhfMGy7T{tuYSE{ z$aP&S(0L4o-vRcsP$d^ag(+PyzF__i;R-&!4^{&YSzS&TH(qRTV_=9`x9VO`2&l@dr`m_TQ_Ka@XxrU1 z)r3F>uYa8cH6pTz_#HQ!Q8T=EPr&@-%a{0WUtkzDGS)L*7kdFn<#B0IG_ynqMQIU2 zSNax?MjzQ2g8JH89vMe-u7yutQ*SMA@fp z4O%(HutoNzTo==Yj+~e*{Ha#7-Dg19wryB9+(ES;E6YP2B?Ir|HjenpvUF+ayIxP7 z$eo@oo)0U+MISZ%BGw=7I1AOBANOebY6UTzZg3$0q3>hyWGw?#kg!o|6Xz<~be)4N zvrdVTcIPa-33za!n`gKlAbWO{EZu3dtPn-0R{X!rEo)&A!u?;35R8HQr}6bc&kwtT zZzx&ojy!dcVMl{+MedNm6`(9s4n5=3UHwN>wC6mDfKv!^t8Zv;*GQ}|_{^zu&m!Bi{(9-eW%%^vj=uJ;DEGZ7I>Pw<0 zY#KnrRPb-$3C!E=^`vXW1@MHQ^+(8QmnY8FGU2UPw0vV0zRJOmQ3ITpEk)umd`3o| zrVqsE73Kl#LL%#Db}2q!HkuNGAC)U7Ch6)wrZm5z=PBVs_jJ?WonpVKwN0F_H zT1hgjPhp=bN^!MtJm&SfYl9gF7Y>>Cz`(oc%60HzhP5NwBvJO4n#|o8pn`18*QwJ= ziozeVCU~qtPVpl?yr3W#j3(HxkC=Vf7$iXnH|WCD`ugX0)qf-iN|~9)qQ1`Sf8?_C zXjsPpDmqxaghn14`gFA zq%wa`BJ{axB+&J`gL{C2wH=sjRtkchfYE~IlVJH=SYX~h?>P2BV4ypb#FNCJswDH;#_ZxJd_`qIy@_4!7mf}~Lr`XqMLIcE zf^cVNEjq7A@fVkOv0A~ROH>zj=kEk7QxXnrcCJtRz3k8}D=jDS{~s*wH_E(=ZIPb( z1@)MT{t$D@712}?!82C9qCU$k{^q>r{#a=;vfo*UO*2Gd5&(bwj;&duiUSPEW#w3@ z-8BKPC%)^4Q}@@eyJNBy>DnX~;}#*PIUYb>*V4WEawycpG_H3bPO)!IoW$$aCjjJB zx+iKVu54&JyVZy0*^2&{YFg1Yt{`qr#&k7tu+F-Z*jc-**P>?K~TyW?= z@S#cr8JGYEkg!Us+ls*54PM&aD3G*p$oYIUk4Uf#2en(N>K7hYTY~Y++HdAP>UC>^t<&PIg0f|ZUvlY`pp`hPS z5uk|_M%ilJ`NvE;4@ef~^{&t2ex^Mo9sug4zn@qmu7qXg@wB(uPf%^n{;m{a3VUzm zF2y&FJH&zq1H(_XcH7Q}OKewdlC*0W>OE=3sT>$LCi&bS0$I%md=KAD6ia*xC=fVM zTt;t!bNs^Pk>mK&+0!F>a;o7{bg*1aSi8~g4VY>G?y70PF%CeSQaY(vq%rLzm$RgS zD3j{!5QqH{vkI%ZJH~=&BMu2w+-?XlFneZ4_dSCexGLwBIG^lNv9puUPmOM@r(IJ3 z-pOLzy7e5?3&7=Ub=RDG#9{(VKIS}f%!)t#4I+$)|2;LBceUA^ur2({XA&hipl4>j zk8pB-3+nFvY}$p+kE&Y{mBzA;a}~PR#mqnxW7;!*S#FYPcEoowSJoJN`Riu7bb&V6 z2DjyiX5LOK;Q5bSy?|jbKDjw;`}vRc8N%=^93RB9qf0LPs)VGhq;O-qeMx!E-x^IK zP)A@-6hd~a>*y6UxraQ&R64gr$8sf!W7Qj!S-~Y9-}_lTmk#ob^VjIOpA%v2Oq`Kb zR`nn{<>~(uojA>gATuIbuoEAjzvw(vh+^3~TPJy8KGb9Kpo=->W*&ZAV1K9l>$`%) zd_;`25@bo0M$IoriqszsM%up9$rt*g0|}KjQ5w?e1K`6Epu*%fChxYiL^7-p7*!=3 zm}i7vp`kAV=i4cAAhzsr+@5x67~60-(lqc4Jv_ve{Aed1&*xFam#L+DvOMnbZXl2M zs_FWv51{rk4Rhb~d^pKND*urQ&`5>%5+|8^CP(|y0aaCtNUMqwsN$A6iRD;PJJ#s- zYJhbxkh*@O+do;~urAeKz?X~XL%Te~RU&X6Q4{JlHj%HLy9eAVn-WBIwb`z#Q|;i9 zUb3y>Q01JjtoOQH|B2F{qYzHp`mJutz>qicKtL1USS7UBch1!7Mpn-H@p;{oZfH%3 z5#y}oD9&|t0j@h*ittVx*sHBP#R0X@*}ghCcr{WquCCF?H7I4|%rYby%J%<}b(R5D zZC%?ojv@jgpaMz=Y(NPq0SQ3~0V!!|=@tP&8Wrj82I=n3Eg)Ue(%sz+-`JjWp7(jb zcl|g&&M(<(t~tjXSV1(cXdq2UxCCzaWZP{v(^s|+9Yi)g_cpxAEm8>ff zQ>jd(hc43k#6h5tC)~>odnd(DxT_nuSLMo*ryFe~%lYi4GS;#-?a|MLVAd(S`S$^u z_N~=qav*|*C{6Ou_vg!kHSBb}n||ECdjbEWp#d;L-HCeYdoIkqFA(aKt+r@nh-WuR zt2u6Cvl+j^(^hmeZ|?nEy^85%s0pb&KLS;;$%{U7uZA;P9M3Vi7s z(>*%YiGmNTX-5{89t5&X3SR#Ka^rVU=P!ST{sg%N@^qWlu>bu#mUjiw=3|};Ia=uk zTt$J6C#PNvOv__t)~3@Zhf{8GMH}};1B0{PmcOdL7rJN9^XwT{9SAAWhlZpd%U-}XWb4uZOwF&e;_))O!F)%}h>!bldnZGX52QSioOp+t zYfR{gB;Z~>8Kewe^S7n_iFhk!hy&yYY@X=cVqfnP(+N{(yoDCz(#NfdB={|s2_z-G zAACKZZ8VspQTOvP>MIrGLZGIuxfd@`DFiTZ`=3|)ch~?Zl|v9)&&;O(x<$<6-NiHE zA<1(_)biM1d61#z5ZCE!k6nWH;4X8X8m<%L5*nQ9Iw+u3xEWr5m~Dspv!Gg`z`wKv z+&aq&G+khl*77;4NR}vihm5n&Bc!b-`5tR%ISnJd zsSk>o>(%EBi?_@{%dsY!B`s5qKb{V4i~F!_qql(lvbW;%ptLW75u5b6>lznNLtrv3 z)7%;1Vo!Bxq<*4f{XA+wpdRV}a%bD-u?Ma=SzN?GT>PtV?YbjL21ci+ZMlX8IR7?` zrzbb~-ENZ*W6Mncg&p@!z_p3oq>n(0I!^dC-~4>XZ)VLqSH6-@>agK_dknzVuZh5| zr?(KZwdD+bqJE8(Uc}?Eb^-d)aJ(9Yic-nwZ^!*vgo$ zyK4ub1I)~k2+N@o6SOPN6m-7DKsCE<*l+U90l7B#dcnur8xs&s62ub^SDuWqU2kL9>^v6#@rMhJ)R^GabhV)74P);;2R{B#)hZ7RUe9m)!+n3RM z$s;5aMFS6idgK6n8F{XlxoZY+^d!8xo=B&h|2jss@l@w2Apv;{+wh=?d%eX1A=job zU%Di&8>Z1kMg@<^w#NO>h&7lSlXl~ny}jsUvj1JtHCeaN;TL4II-EPW|N!c??ay~c&RxY&-Bc-DJ><;9D2ws z{z`vvesC8%Dy$beUoz+S9@1#STW;6U)lH9^LbYkZZ(_!GGS}1NijM}x zxZpz0^X@7+JLuA0%b%kqd-PQ4tSYRlVb%KFlr*#JwI2Vn|Ca;vGk-!uO0f&m3WkDP z2BK|j#2=2IHgWz_!b)vz_KwH(ix7x)@g{XWgIZtWiHfnxMbR!6HRViGdao3H4KwU{ zO57G(ST_WZZieJrEQBd#Mq3=U-t{JUKA_2kn6;67_vSBfrG7@BSB9J8H1J;H#NL`zv?Zq51i zt-BfDvw(|NAug3~jv!)q`S@Z%Xk&LG2e0|x21TV>?Hn%XO z)Hg#U7%eAj_T}m%qmp}hA4xk5rQ7rAz>#u;)czSMiZ=|@!uWo0Kgu4$iERWO6ZQpL zy_IYa*Ufa@D$GI`%vem__w2hRbj;PLM8eiw)koRb&$&KD>jRvzJ0jTiWv; zIdBKfVZL|nW6%7gUW^r6(}m|C+&po4JE5d~8Z=7U>jP^e*2SXOUMsHOs=`%)Jr^_) z_oWFnrNlsvly1EHnPvupT*)XT+Lf;qDBDn9ZK8l6R*-!#9k_9O&#yu7%v~@RxdA@G zqpxTUkZ;c$y`$1j9WJhe1rn{_Xh6u@JQt5phU`Q!uIh8VV~68Bb)3^coLkPf$6wq| zNBGN;f%w9+E21Qh%gE}}ul;sp<)j`S?lO8A^qHX;1;PUQIG5uM`EYmE{*5G|@q{xY zHO?V`g-0|HVSRWVRd|(E+xjqxFeN#0P!cxb(+L1IRjQTt$F!ms_tl%|ezge=qW&Qf z>Ba3fPNbaP&?nD;=0hB<2x*a+F&R3Cm`S%uDocD{P(;yPu5sc_9?|W-SYDAHk7J+6 zne*z8*>b`7o$6(uORraBAuqKhJ&A42_ZRs&PJBYb+`|I1%cGSIemHTeBR`DWSDV+k z2!%FffK59PHU*6Te^c=NUE+Xtyuae-pGQzUBdR<1bOW=EKB>y!mE^_uM^E)fuWU%h zd||M1^gt!)89^_cCK~jGo@{Gsa=BXbgY1OHcR-J4X^PE1KTp4G{G#Hjy9zpCRdBR- z7f9?iRRlrBn8zhkY_E>%P&H7-Awl<6-vV-pN8Qhn#(J#nOAeiihpVA>P{z8()P_F=10iL25Vhg zSq~w!0Q#W`z@+nJKRUHd_<25oJqehirh>UlM(xELyGti2$ISd-Gjh*;BX>j>^q1pM z*SZ*x!wSzwEf8V{Pf~KX%NZEH3kUw}Y1K;)GiTWIOyyPE-&9b~^G_nth?hzukhv_^ zs=x;$2&Sz1%Iv@5_2~jf_m{(3FGM%QACC zZdkR@>gwwFS#=5Ze`-G}kb&0G|323TH*Qw4&ki1Dv)0@GtmGpN9-?58+VQ~%3zg{p7fqpT+z$O&gC z{`(}9g#zuW76mUwsPZM~tlV0r!v?v-OgqSwWgm%5dqNxCHO?F>xRx}0(zz;HB){=Mam--GYIK>dI_~WTM#Hu;)oS zq%4pkx@PMv)NZyoTBTl`c6R#}Oc89r;*LBsJtsHu`?rm9R~+u~b*?^97O@NARN9OEMU?Bg z>Kl%Me!v_v9(8BscO`#@xS3pim7Y58#tlJ$DwzRyKU;9!Ce663XO6c2TxZ8jr$Cj2 zrxvCbOcGDt&N?Pw)3-FS2T@Vbkl)iOPQorQv0PzoJi@>)z9*#?pcf2R&aXiI?b8cN z(aPrG-@W-_>{xtjt+WxbBrYl01cJ2m7VcK-L*-~?=FUXX(%5H~%SC?S0NyWV<` zUGv*=VO`av0}7dIlGnvL!uQA$zyzeyq(-yg#sl5(zJvywz&A6ko_7t;%zap^89}5` zLCLTXK}{UsPndUhwLX6}yVknMASiz=@UraV$A^Z~+Ni3USuNB#hW2)98HNMY=8|NMMo$6LqjbSlv<|duU(P?lJ@iuwuzR3_eci#oO z-Iw}fL0@|1SSP2ZTPn(>Br+k#Ix&IYx(miM^e6H$Kpl{>M)+^7ny>(v24FTv?szx# zIgKW3$c!qNJ~>hJJlet2gPWqFa*5_a(t#9fd_iPhf0g>i<~&>H{4tSe1&YOd$HJyvm0>w%YA)RWWF+FC~)=a@qk>XcrD>KkzGJ(w98n=nZB zaKHJ_81H}L$X1W0+(@@Nf8iLqg;}D7e@mY!^G@ZhOK7Fwe1Ze`0RGI9m|x({Pm{@I zLcst#Yc?-VoYdv~BjsXE5|j<2TzL)qN?60 zh?J8!vAyTBs`M7yjqlt0*mjTALs-^2t3&i7^NGaZdi5qihKEVO%hYOhc5GR7*7?D* zk#{GoUHrfmy48)S=%gN(rUtJtQ1E>LY01vXTbYrGsAtz;?v6UiJm4fllPQP?yk&fK zXqLi;Vys$o+x__qhJ%MBubaKFw>8}mhe1gs=A?IS6XbN-(;N^HgVhqG(Tr96dRY#3 z1c9%-8`mFi%*;+VJVV-Fi!~lg7@y!C$rueYp2(rxezPu#NOxNzX&tjm_v39$zDxV7 z<~@IL2OO#g)Y~fCqvboxHSjU~d1yRic^q83Y7Vz;0UZDQ{z^Wb3U^muVUY(b7#Ehg~PGpVO?&jdJb&s{~Ei9py}?i~dbj0PoT zqr|4b8~8!HK?MrFD_rD_bs%|qTKRSf7Iw3wK(we9oqRbcX<;| z6iv8up6E&38^Sh)M@VWYYKZ>-qQ*8ywbHkNl>X&hMsd6DsXfWKV>}ST!nSvY7f1J4 zjmHB~{G_ii{mE!+y>tv9*hx21r@GLjI}pIaJxwbw7m6i==a5Ehd2i3HN7JTG@ z#$amkSJ2bGBjPo?^4zv22kVLr&+VjOg-e==ty;Z#IMxLQh4~^+XI&xyec;?{ifcvaYYv3|9JY63nT6 zaN(rT&@kH=cYqlId!>)OM>YbH-|ylDEI9!|1xN<|c;Z1BKAWiDEWM7Eql)xBpsMym z9f&oxwv3hEsxFbM&$(PbS`8UurZkHiooTLaf-d%Q7e9Z(?F50d*Q~$FU*c7zk2<%n z4U*ELA)SFQ^E0A>bZS*d^n*pmeQhf0DYHQHI1~~uG}K{(OkJEIjKGFLlOcG|f%84z zzEuR}vA+WfAB%>4p1g+glA)f2gr!0C17&Vyh85zZeQMI!(o4b?u$!7Q=j5umz>bsA zqAG3~MgE9RNqqbapv2jC8w1bRNu7qhZiX2B=57l_6y4RNnOyM*QkB#U4F2Zr^C18G z#ii5AV0`9Lk)4Sg=lM{hIvrQT?XBqBnn?7K#Lcq8_M}S&JyYj{8`rT5XGk zJgvZ4;oe#j#2L&9#~XEXQ$NwZVO#Vf;bHy1b(y?&=726-E&d+Xld zOPj3@$)k(MxqFRktVRWR`iocu=9Ga!eV1R`rAY86Le`kPVi@8FbM}Zr`76jQBZl3J zf|f6=bI#i;JqRE*11bJ-;}+(ZtD>h}cqUr%0Cz`RD3X zIp4lR^kvdtSXMIat30HnIgGi6|Jq}vBYs8@CFK3HCZh0zbuFKYYPoc^UvseC=R0$; znoYi|x!am9_G1~NS`Y-~h}dqX58fvVXTiU#N&9v*Dx5D67si8sp1V43enc;izO{06 zaUr@5tlwe|AX(^6ID87b^n$nj*xvsPyzJaB61y9lUbOa$5T8Nimy$m_*c#I$h$tPV zKy#v9+>?^hZ#V-at)Z^O-4cpYz$5`Qv%6AJ^t3eER3gyt^Q15)3A2jPeKvs0toRni;@@Mh1nUI2_MY&Zez^SlanoRh#M0nWUpW_$FF-g$PBZ#%=k(w9 zTF=f-7xE!lKIiEb3OdeOsC4>rRVxn~L$e<%88kI}p(*63HFPq3il50G>!Ul)4c^L6 zo8WzfdpCHGDmBSa6#n)(2p02;m#dVx$I#O9kX$6XyV5|^a^5gZ53>h@@MB1*XRjB2 z=3X0yHExP!+oj;iO#=I8rk5e1Cby*fsaHn}a5unrv594WzMYTxhGyoj`@^}&ib?~Nn+(q&bN1#~0ts;D}>E93M!?1*CT|FeFSPrIc7=`gRt zE+*Aj52dPA-4-5oao{!nKnD~T2J1d+lPGg#oZMGbFEVQ)PXyYnyDbm(u(7eD95t8t zQ|jnpoZ)oga3lBN!FQ?=mW!-FWS6MTwKR{bZ9)x+%JsV8LzN8okQ_HA#3H?s3mr{c zf?j5(_1CqH$G_?YW@$B9(R;YzwoaUIpmRq%h#-*s1`|H4M%`7m#MX!0NWZ{M49_<~ zxBh3zpaAfhs%mW_t{Rba)5VSSn_{tk2W+U`glWOPHL}8g67{Ek6(v z4K*@KJ>3P$8p!EiayZe)O|=}+bwd*w^mVedF_myF%5-35Ci6s~Gv!JqygzGvX8tq3 z0?Y|l|1p>SCy#X(0y%!n>ri?0%$-8z$wH@E(lcj#z>HU~?nGJ#jaQu8xH>^n6TFN> zDEVkCspA_wXSglQrJ@F7_AWH{25SodD6f!y-7$uzw|L0k93#1=5AZ&i{o6|N8qwkP|RGuPCLljYl%{gq7+XkNEDbe`d=>~f%^f- zmCJ`4w6SalKWhQ$z_pH&R&2o~1*b1d5fA0B-Hf|9MZ0<(vsvVckV_B(!D+EicZ^M- z9WY5@_rgAnlgl8;u$ZaD;#0Iz5y9YK*0mDTt35ph8+x;u`vuPN2k6&uTK7lamXd(r zC;dP=#epntDg?Am9zm%^)hNL->XChlLbtH!Io-JUzJSLna$(FTcE!rq3Hx_G|3$fn zrGD4fTlS1-;NcN`EO`-q+;_uYVDK)m^zWH;9L)d@ezCt4DV~5m^h%_Mti>qKcs%+{ zMbxx1i+`x`1b$uZrYF`7#t-Ifq%=d64oxmLh9e&%RUwpdhFYwrk&S!9Ibb1jJGxLN zjAS{yZnXK^BN)=XI=U$b?$n2=w^)O1XK-nz3cGj)U*qB2#rj)E`afy8ij|ft_pW2v zj_6wHfE;zsPHORD;P#)!_^>6McJ(9tLUr|AZ`QI{vV}O;5VJ1xpixBC*zVi0?IgVm zdzY6n1vv(JC*J*aP4J=3&&36Xx+Sc8sH11oxJ@45dEt?CiQeYoMPi#cuAwHwGk(r! z#rKw#3*S?Km`x*SamK0bC_ygU_8H@fGq=7SbFA_3H;px}^p&8Y;P%04$Q9U|O z2%kYspzxka--^r9Fd5l_%Xak<#yum-ok6&|Lp(zS3{;tMlE10HBjB`L&$*QX`=&m$ z>VGy%Y4vwe^)3XTK3`8Bt!%Dt-@KKpIgvGFO^(i8Vq$T6%{_sjm2LcO^>s^HIU$Zr z1ZltFKog_^{P%0tdEQZn&-E$2i%YDlU%acg5<+W4!B9tc5(-j`ep2riPH=|90!CpnxjgG2a{R2;@7gV;n z#fAn<5}O{}dT91>Z2-?vzDX(8f|)ku2uL};q;$}$b2_%vWAl%E zssj{Y0otuUFT3xHZ2E5&9U4QqtP~LFX0x0q5x9DWWK8WaSQ%y)q9}ji&unPE)@ugq z#FeV@4KrLVenO`j`aDe}mp;d}=bTr!>t%f_tJJV@C=v3<4NOuF*B02vgu@VDj@L@h zpwrSa9Z3r>oypAO@UZtZPRFD-H2cPzb(@Y2adD~QSE@uZ>*{dxb3Vf0EjaX+#CGwX6mL>HRVe;(Ps7{EPb zk5p$!L~7gaPc1$8IyosUw%meD&b?w|;TGT~*kI>U*8$)Jy@u(s) zsq!Io6v;SPu>$h%(jQ}qnV7suz78{ItghAPJApNy=r1?>fsM+>r^1jtXaUdo8ySeh zEf(ne286E}9DJHce3fmxeE6a_KXemj0 z=mbOi^7{q`&x-YNIQvbrZiyAxlhI?IznpqoVSJ55oBNkiSS4WM;uR*?`*q?5wQQ#t z{wlORXgIT6@fL^MZAh^VMx)jGEhn8gni+XG}K&uvS-aq_EFSMxjjz+-TpJ|8)dBRu7o?wUjx<`WrS9uup z4}MlTnoe(}h+9(~(7!q#QxDe~VOx!1k{Kg4KVw|OvzgM_9HIEHPr3-D$%Gl+yP!L@ z>;%x74To93igLNM16vXgKC_^7;BhsJXy~Lf&)Fm?fo}oN7u^|c%dZ7RnZqJ}9fKxlbv4$;^I&iB6oZbp6K>nZ*t^%|oy3m99)f>Oj}a-48D1{1=#Pd5#rjNoy4+1bwP zDqxtwS-GEgD`tvR|A;wq>Hgt*_?8591t-K&0cNdH_o0~L+^KS>yan={8z4-&r&_TmumtW3Xqp*iw6BIiAQGw!el}=2`lAdz2q1z6TkIFKtqyHJ z-{+F?t9|&THva4Er23hwIq&w-;lbnzX-dszz|Ijd!51(Z7}%jmZKx+rA5hGMx6Y5K zBTM{i-i;s#wu|}4UO|Z}P)vGU>*`~j=Xmvfj*?4PljI9GPM<#XC)^#eal*~oVs~lf znnIJbO~kJO#97pOrsE}>2M*xaq7S2*`tSW5VF-l7!JJu zOw7g8Z3us|?fjS>hGA-F>DSckp#@Spee<`8;|;0pmx6eP^uTYzVn}Jt4Jvm_-0b8 zc_{?S-54*FFOtn27svAm&yV!cV_PN;DIeFmK`TRdf61+<_00EZp%lTVSn3#5vher2 zgiBP-F3hgq7PFlU`OB&2eY59%_=t!J)IPGwRQKhxlTRzFhA)iAJ{fy{NM7wTVA*W{ z(Goklx1jF!D^El;N`N$FQ>KIx`rQ4rvai}AEv0Dl@ACy;gdy^5=XBIrO~&sx`NsSj zc;V6zlBuv|i)0V6=yOc)!xv02&tXt4QOWEk2$Xemf5iKLw_eT+p0iyRS>db{tAq&7 zhFMBlhKbwY%H~8}9Yfd}Ve?{~jllui^}B8Z>Wk3MXEq*?M*fJQr8rxtYcRw}a=%zI z$1d0U7)50Ef6U-V7%77<|q}p357B?4Urk*z-?b zfC$dZD8twfalANIMCnWaHm#)IAOBLXw3*%-=dS)JkxuX$Q^$9Tkpkd^aMKH1t%DEa z!!YvVQ(v0ggzlxBb{Yc0pwCIOPyg6deJBRcQDGE}h}YHltm>r#LAu$01Z6PFsjUFk z%ymrrk!e%=2pd*T@_R<(B%WexYWxSL`_n|NXU%0##zO4adA+(m*rb#j4Gs>Eqa5(4 zhlb>dT2+#`ibm9>dS!G5#zG&IuT{ayjq7~VZn>rIK`F9 zN59uqC#Eq>6;V{LE_#dXf|4IGILqGeNx%k^-&X(UHi8+rXo_05F^dCiajOqoFJY@L-&^0E6irDOT=<} zK$SahtfjUq1uc$$87}{h!iBpa*6UY-99L9lA*h5C;fiCJn%^xgT?(m3jhYU)JxknL z186AFQ9_j&s&6}-EYw+?8!hS2+1s6>LE%ry;8z|6QF(^YChme#L=~vZXY*Hmw5xHt z=kg&l)AGAJ7r1j=Uz%cf#f~+vDy>gF$jY&hK2R$wF$`g1xJ)w=T;q7vwP+>$`S(_K zyD05?t?fLZpr-Ac@i-2qE&uPhsYVJJ6%#LnY4xF0-TB z)V?9(aN6rn_~^Bb(<866!Mup$PbKyeEuxr#!FeM6!)4T0hf0%|E~?eqDIDsr!!YW4 zY-=@qjn+Vc1GPY6$-#dJrl+TST41E7H`W8D1T8(wi3qivpfGIS=*mlk*d+S&@C6k} z;;M+pu=VOP=A1fl%nkQv3z4c+*bCCGkr0O49=8(~frWt~WV^L|KZ+ayU>bb79@I7P z*0!|skzUBL%@V$+plOv$7GiG09K9Mj=wPqI_oU_dsF0w3bx`tY^j|oY3@IU;o9|FY!8*adE*s>q zXyRAxZ-VLLUf-^0@nLV7HT#u$-&DQZ)~k!sH$3soeC>EeZRII3rUibKTS6hrmYZ-q z9PUiU4a1xVd>5c8%+s7RM8&FsY@=^x9siMfVG{$DY?f!~1fj30x`PXh{4-}Bs8Y58 zS>qazR9~ssQ~u@hYR*_;pH0_P5B%!DBTslaGyk^0m=J~#8T~JSUHEU8#P(o4J8F_2 zgfTmR@MN$#86@!^wm}0;IwW!v#ANX`@8*czOWk~bLZosrM5mk{GTn11qN^+vQ;z#~ ziu{3BzorMqfW(LFlm3;W_;EZ5o;;eG*x&V83c&5mB3#xDwPS zo0L28xpc%*Iw;KAkU_8QbHOzX-nx1>zoG$DzeeKvYU|#w5P6LXCzJHoY7$(4F%icQL4ByQsRWtrepY#ln*MD=Z10q}e-j_QUa1B|{e{mrpI$iT=3%a>`+cZ}hdp zhOIx%;mvlX#wRYwk8)B-lO=|cT3t)f&8cOMz{8@yu)mkzXV&ayKaeE;ip#jEwlVf5+|GO0(L2<^$`hCc%yh_->Y zYzFgs=h#-F}0XK(`-MjCVgFG|5xfpRGM5VP96F5WM)>cEf;^i zmQNDo@&-&Lu6}-g;(^#A=g{teCpbFLvspi4 zt9F(0%EY@vG(nVVSn2T$B&&a}HN{53jEWW!LGJEP{JMB9`2PO%*~f`A%{oq;MD4W9 z{nW~kj@3pCog&lTMNdz8POd)9ltR;S_&RA~WfEj5*d+G@&^M)eQTYp;8IV9wMm>>`w5Ip5&{>;Z~n_~uSp!|Vldjox;WBY#}Rs9&UEBE2_tYpUvK z5jbH`ce*dLu4D$$iQxL?Jh#=Fnx_1t*BE9EY@b}^U4V98`3*l$g(hD`-Xk%04D!?iA<+t zwTZuW-Oz}E(}SzQ7ETZ-(Ep8HK;YHCvc^@|>KA|KQ(U=ntFbwc3! zZx1|31G)+lXL`;o2pLPXX|n=tzdIBGT*%Y=-DV#0F*-vrZuLSnUP6AOE4v`%E6|%x zO5YsRHQJJ!2EAf;wiHYB+p^|j{Dq#L4+cZ#P&d7*&aqKaAGyNEq&1IL=5XRW@U;re zoFX5si`_UadUy8R5~3wbYG zKSSAJX5Ll$Zc1}4_Sg3C+!S%zts6W`b?;{3{+4LqRq`lXWx^rED9@%EB5MGWQ4OU^ z+6NA^={tsfhVQlxsz#OndhFD8!C}gir&W1Av2u;r9QjaPCinz%uBLX{?$tN*i-PsF z_}23qGC71@yuCW#&j4TD_frbB7ElkRxV-K?IB#7Zu$w+)p%p#JIgyCw_UKeqca9r~ zTi0(cj6@|{=NtOS2Qi_nO>GJ})15Ju!=IYv%#ADe7PCoc(RXGR)*fI=Zd|fH`YQwd z1L@NUQoABsis;Ju9Rz8536tr=o(de+#1%CSvFUtUel9w{S%UT1XwKx}Ev&>6AefQdHKJ3-tCVNG9}t&q*3GIVRIH7mfk z2g~iZe0!2xtDdf)`>S)jtRe#p`^@0- z><~vL5o_KLn{QCpdkFG9+*<#QZrwg~=APyss3=d1kS{%4-InITh8cUF-S$Zrp8l+! z@lc?HllIMW^}rKnlaan8imsxK=i~aTJVB`nTH*|y|4ClrOVAS(kzX& z9_pRYoM>igo0Ux_{`&>PEAA`Q>*`}{&Bvqe25fYc2xYX#Vwq<+mub9wB9r%MW8gBp zSg7=_uxhv+y}g3I6tsoy%O{{Bhv+l*9L~0Vv~{1R&(L+VjONA-j{%Wg9M?-agiAr? z7SyKHTxP+D=|h7JH4u!y5SP^)SL;P+*Wzrs=e)%TSt)%v#`avQSjz4vV&Ijq_SXt^ zu{klaiA=dvGRN~Hd=q+se`8?&dCfh0CmU#x#z8zLkprg1>DqcUc*k@~Rd;lrpTW${ z`sf(tCADT?A<=mf?C-~2^Lz&ig_YU@ta2D z2Ri$)@%2J8t^Jw9kuWZa{uCb=x0GegpxRs%+tH_IUG?PCVY1H8!z?Gv??OJm-(aKsYWc79Z zU5wu5JdW#YIU}vMQ0;788vQ^7;QyQi*KB`p|$s= z>FwSLKi%2Ut;U=opXq7drN6T#3S4rLG&rG5uFlV(TTI;dV*fZ6(J zxfhQE+S@8_1!(00MIeA%vq*~}v878!dUK|4N&iiGir_W|dU~b3ODm**&e+E(E{>m_ z5O6u-LUCM6Gq*skRs~h*ibx2Af*E+lIZBzW6VOxMq`OrVvAcLUlB?g_uqe1+(+WOemJq`r-Jq&z?2ADyi`1U3q3#i@>;M`G!g3bLP zySF1JZOg^W=^|L}uM4_(FNhebcX7|-E*37ND5$8e!{n~p@wH1W_)ojjEwH^#?szb( zUDlV*X0wuv@JtQ-z<=&Lcrv2OP-5J2PUCbS+U(%{*veP|PoFzvBQ=@aVTMXYz3?7> z7()|wZ;IA}9bUe{;tlV$QDW!eBB9g@pEn@gpH9T$@m<*(b)v1oV?S)%GaZy!P0i>@D-d;e~EmYdHW6tHnyab z7w7C-YWZ{z;y41{oL_{2leVYdL^!&z#mN?OOHFTQJT><7h;nT7bXa=3?`6Oh*Hoas z{?2fiG;OQ^jl1fU9yhYNu-TAxWeVKe-2<-#X7B$89D>@7Dy5~RZ->2UNhlQ6RrkL& z^r=bW*K5Ls+IqL}X9gL=gt{DU{Ncl7r)#B^C`G+Mqf(hZIxK*U!H2zjsUQXegpgNt zuO5%n<<3qo-EGY=Kr40^Ysl>Bu2xN&s6!)8Fn z(0D|<7PWKype$e4=S+Zfcwf(C$P<+H3hJ{#I^uiHtL#83tsRf!@ON={ABE1kOGu{t zNV`83*?}i>c!6lC+V8WmgEFTL9uk^^KyzLj;4Rs258>;NmEg77D&4AhDrhZBgvwB5 zg~`D}S6mbF;%p=OFVd77=;%^TacP?bOtx9(3>qB2)z(=-`Ck76zOYGW4(rI!463=j zlTTHrJ`4wR2CaHv za}{#(daeEwB1I%((^^CknQD5Y)%sdO)~7f7lh$i23To?&4k7;gt=0WaT1`5+6BRz4 z&^ykd8Fb6o3ZcV=Q2}gW9Us<)Els*mdm8Eqpq)LkHypNtD7TVDt}y?k;aHwp6orrH z@I#H#IuxdxEva!@dy#tt+}Z>n6rK)2F@qM8b9i#Gex**_ zzJ1?(_K}nWO>}>}u62SrPcu%(92@;;y!DI_yrqNG^ls`Oo^n@T1rL@$Vha7%LY$MK zQM z-$!Bjn(x?bW}}5 z*LBc}p`uX#EI^Kri#L>t*Y#PN`PGPw6yS`F;=quE)JT>X{EpeVGA)dI37-l>H@C6B zr1oR9)O^vf*86=!rA8(1YN+Gr3Cn#}Bb|Jo?VcE8tq;P8c_h;d@m;bJtwNvI+9u;! zoue@X3OI9FrA!ZrX2zquA=u5p2>QV0e(eZ$^IZb36(2y39Hd{a4Oo7m6>%AbtXZDa zaLRlcHBVM}OCo4iRe*A|K&QRCO;5tu+1Y9pIJPs!_!^K9!kvm<36YH-U zTKi36(`}FcB4>`j?#gifl&jVaw_+q!&?>?2qqkB8-jtaf7!1)p1$yUAKCE$q#3^9q z@2-s;esY1>7mPoH zC4a(6lmM_ta**!}`7v4y5D7FQe&5=ElVb;72BuO|C$K7F3X62co+){Z02io#vQ&yI zKk|4wYERUZ`7qs~>B%7o+lpB4W?@B@Bxue>LbcDZdPHloHjqYWB^mp*T|COX1gAyh z@T9&RMa(0wOXx3v#MaMoup6g)RLlwr!0(?3IAxMGPAhpl-3WC%M1h_PhCH%$PrmNd zZeWhmc5lgz>(k+tXWfTeGnRPv!dc3t610LYwR;cPfk|c&g`DW`;sOp&CpLQPbFoaN zJ*Ip+NmLFbkFCYSl)Y7Fk1;iVFz~!7m9_-4wYR_jqq#z6v1;TIQpf(yFfG>?Ap?>1 z_DH4c>NN==C8kYHaS70peKa$rC*{YvPx}N1Y_&=v zt)?iW-|kW&9H9{wDpmGZaB$SI5*6%Sik)e9pJd-lRl_4VlT4 z|DoSoI}KxkbivT5%MPWYGa0rlAjXc5uK%K8w)p%#Q|OsJex{?-cciL({&p!Q-M9sD z%ysdX5d~ePQp=JM0W#r$6jElv3E27HOQ-naV4^$E%)-l;fly#$ir9T0SZ<-UEZRIW znr#DjzJW9kGW{BClbwyB5VrpU9p-Hm>a;tDUoYx1>9W`R*1^0yeMF<20F36k`ODc# z(#I~zP1BN*b6wV2zSbx9mOkCi9+zVhBP^kv5 z6wZCu-0?RG-?RM9Jv%&JC8rEVZ@$csH0?I7D>y#1$8TWT_S=oer@5q{k}+# zuY$I&?A%1)8~&P5shZF|P;po{cOg97(zA{xcFg0n)Z*&n$3&YKGHoxC9I)ipS+YhR zucfQz(?G3w6ZC`B8y}vQnAUfq<4pnLyw6Cj<>+i_nB?D~8M)qAjm3k)h4x~R z3i__#*>cIQ@v{$e%W{yZoMg%kX~d{9Vy3NqB}jmj)rj>c+#QO0g5v;p`5EpNwG52Y zM_Y0=Y>R!QZI0!MRO`P)t>W=%_s5z%CwiFPcO1CqcK|6QFwQs~(_UJp0h#A00e7Icddd7BldDNNk~aAuv|iA}I> zFi_r@x2Yff2tfXi%Bw0t7Tnj zb^c~Pj&dr+(}mgTyf;B=(@XieQQU26Pei)4i}H)1v5@N~=W8x#bV$ zdlLPxE@XriBgzz!8hGFUkmkLQ!_?ArAV@XtN63y&GJe$eykqpN^R}zV5iV8B5i^17 ziT-w+Dk4DW5_fUMw>xycujLFAUUk?mj_F-W>5BGw|NJz@LVp`?Q-_1Hp#Rl8{-F+w<29`$VKcm-ZKY&o3eyvzu3YMs9QyTX!-$Kf=IG{W88{Jw~;C0yd+w748U<;4VGYq993SQz*&T6@dIz=3|G zR@HneFlI9H>AOuE+lQS^7cKJwzrMBb)5;>LZSJKt{BQ6HW^!r|fDa)5;>YEzQwP?0 zh8qn@ExmA9s?aGG5ILRZW8pKX_K4!@0Ay?HjN{X}B<6i?%-HSdgs}j2 zkrR$3UHz6*i4~vQa`Dz+MRA1aHd*di9*M&;t8~-T9HiT)hY;wHv<&Q~zn>)w8fM(u zYo1gGr37`uop+D;Zfb!8-nL~Iy3T~hyQJSPW(%Z541E07mZ#iEo}bL@=(SN{r8?ca zORU8#^divQdV$tcDw7Ck(jeFK!HA+uZ*cAD)VH{BadCGkaB-w0wx{aRP?7@x{0PL@VioOoNftW?e&%=a zDvc~sPFA7^!V58Iwwu5qyQiSn4wAdgk;(WprE0b-&KT)4qEXsJ1uvc_y_4$88MzJg z-#1-_5vT;n)&Ajjsl=uPQ7y+&JIz?q1!f5PAVK38VM@~56iPrhNu(O)D69&(vm>jxo= z(uKFOR#joFvpnU8M@_z`^sl*8N@=XZg3F-&nP8l6JG#Z*X2a<m}x8 zc0<>TqZS%Dq|}QVzVPREHEMx1t_~;I;Ru{iteWkx4Bw?nQ;KP^#z1>I&bwZDY1U#x zX2c;;R{XJ5R#d!t5$coccikskF%{4`=+;h;c%{k>ePmk#C~MuKBpEq}Yp)Xa4%XjwA89I*Pu8x!|ig+XqX9^NY!J zLRMGSMvGJLKV`%8CG1>SozK4a0RBM5NV4vxpj1gF-BH9HdZ{PnXG}$c^L!5KUjAPj z7&lAf%j`C4I3-@S2&9A8os600)tYyaVFxFjdil*2HsiXQGqiqz5V$t4B(tplsO2|Q zc+W6|qmp^StFG5`prg0ZDrYoxAZNs(;o||>F-PSTcwpy zKHhS3dUv@!f{RqLn2oIvN<;4!nUr|Q;drE2@pV8gOirr8nDVK~z-z89?$L4!A%+;H z?TE?Fu}T77NAgkb)5+Q8ozk_W(@Kqe2he-=<+zD`6&xaj6@)}AnP_W221&3olucp)>{~^k5yscvPRqMo3Ak<36{S`-^_fWNFHyM@m(ga9K?s1Vh~4 zPtWvRrotlohYuNlkp>>t4%A|uT|W(7a-<+U2<@Quyu;vpajKbkoKq9shDRwX_tQ6~ za<3;i1X0@vB-y}|jie0;+^Dd$fjcY*V?sZdys3_?GXvj!d)25hn<0GXi8{W`_HfE! z^|rvf4;tTG7zT{A2;uVm3idSVQ#Fxk4TX^1#PwW$rj2HnZw-j>>`zL3Iifka8>87D z%n$m{FFr^u_*=A=^}+3Cclb6=GWOr5!M~4HsYsP7Yn(Y+S=NX&1`U&ijO&`F<5kIF zMbW_Yp?H|~{XVw@2Lb!LU+=2y4kQ>rDiF-dW<2^;$?|^2zHp#wx|Q%Sf*#W($g7g! zbmy)BuxM`QYjeQ%vZs(b0ZXQzywc(1)^}6n%VrR}8QSSg#nSx_%H8iINs~>!o+2LS z!m`jw!Nw-K4tqr!4N=u;AF(I8T#ioj+2?u#eN3k(at z)_bAE*SNy>&$T+?qkm1Xpau?zq@OOWgw2x3mvo{)T(I$Fg>^=k9a>vH`ILKUw!~cc z|B>~VVO4fp`#5YXARr)J(%s$CEV@HlxFzFRq;pY9hjjOUF7JEq=lAY+ zec+qNv0T@@#vJ1uXRy_R@O2j8=po7=qao_GF&I}ix#XQqO86nBbP>J^iTC}FZD-?X ztsFL??3MDvHH*`<8tk+${`y9H5xg_)Z*m7z75f9}1bd1|i9E({0~j_Ve~T>SbDh`x_4s=!>>HUg;9Su`K2{V8sr2)!X7$Rv!Ubk~mxCk!W@ zy`0VoHC?EVb(3XUKrX>w_?5?}mXgl?R6V_)l+a>k1rRU~FZy3%f@vpVHQKh9;^WYp9w=n5f+tG!`RBjr~$NGIjA1_r1-`=Nz)NCfnq&b ze_#DG{}Rt}wtiP|fP73wm<7~)zkVYBrzsuyJ)ABO4m`m>4#v@$cff*|P*BDMxLgk3 zz+=+InvYcg7UpaLF6wg2gw%%~o;?@PUk3&^m2n3iagl8drIx*T2Qznuf)PiVl$7+> z(JDo~*XoOX0hbIX{HR)q*7&)_>pIXCl1awOO)cGNN;EArT8Wp)a-5MEg-kwVJK>|2 z>9lkLw`AMBYeZi6b1jSLF{!hIQ8bf6rEy-5dBC z`%6xnFT|7db9g*GHW+U9zobE6_X7PurQ~76{J>a__hLssTH4Z8xt>1OjZ5Y1{nJ3{ zs8h+#Z@*Sl7_BzxX!%b%ETe)?MQJ;;(5hD#-=9r;>RXWrSk$eZK%yKVq|0Rw@0vYt zRLfMZQ@PQDj$;dxw4}z*>N~sI-f@TPhLz`Y#yb4);F}-_ASGJND;CqCX<9pCxbn{P z$lbY3CChsKFVPdva;-1&vh3lyYz`)~cpnj}5(xCu+uJGeEn1$sBz zKH?J4xq$g&b7h?-A4IetLpc*)(+;NZPFnbZUT>SM>Sfo;<`DfUIdRsXpW_!-AZ{bW za2uX{&%#Xz+D-mbb2Vz(`olLZl4!R#D3KkBRh#mSmZH&{%))&+{mrgckuy+&VS;RLH$VUiQ)TB=(aam=jQoDS(GN`=)3gd0awNn<6#Ehu z#UFB`{ED{)9QN+vgk2dH1ep~ z6SpY7mKNK633LPS=yd+g)3W57@%&d2PrAzm5H`}rFvpnk^fxcpJ?kp$eVkjfu&!>X zL{ePSsXIi)h*=d;J%1QX?ohrhP$yKKJ{J?%%xOSO-)=XkrI9z#VLjs6dd$GSMjvW^$hIG_05HH4sIKO=A3>2125q} zH}$$a7<@T+%!)*UP~G7EeWZqZRwo;Dui&XHndQmB@Cb6#>|7r1TR`1GMMYzB8+vvd z)hkPf%95hg$-pSUZoN<(f9qyAs)6AR3r_-XuENt%%{nVJ$GIkF0l*&i2SJG|_r5Rt z*TJiOKMZ8e3b}6h(f#jwh?=kkUAvFKs z*dEXfomP3cgA~dy-mOmxC<4r_%0o-g;A2X|diZ)XPyCE_aGGQ^{HJ|QvH=Ka>vZ88 z8|vG?yT)m)bDzL%#m(<^o1gB#H4k2c0r;rb13zin*BZ#{N?4#^QzmDj`qW}NLGD*% z&!xrQhY;&A99N}Np7lGUP`IQd>S-9^kw5ffH=FOfsy^y-}6Csk-A@W8EoBUOg zo~(!4y+b%^b8@0)3L$umuGYJov!vXg!I%t8*0-eKJb3V4-Ni2NemaBdU+>R<<)nj? zVov`hOw7tnpj4|Z+|aleK@o0s%(d=Z4_sy3et!Kr{x2H!DIZvfC#P1Eq2MO7C8~kP z1#FLdZ9#G$tLdaN9Vz?L+$?nXIr!RLB|LR!QE^0Y%uf5zU>|=e;_%RIdL-swvo-Dv z;2x4>NUZ^#6tL@mN~=@(*7F+a{i0i_e1<&JvrUF4x({!jy}%Tbzt5u7u0qNIt41q% z4HyM4sD?q%R6+)d{C}j~1EX1XFteSqfa%02jMSYMBvK}wnpIY%OJ6(M3QGi0o3c32 zlUq0Vb(;u$oO`afo$jr_eKnHM@WAgTtr^Vh2rV>`z;(xru9ZrovY4^TCy({A$Ro~{ zS9K4Qa+|(W6o(xC{_{IrQl>F$d7&i1{StD_HlQ{aYJHkS$-2h^=XE9ZJt?1h&wl$; ztnJl6U7Hv&&>v?Mms{P)x?H_TTzEL1ZOE`MX}o+F#LW!$yE;vFB#l$0;Sc>5N%H*@ z6mKYM+&TZ=oZ!zLU!r%7&GKWHt2LHw&BzG5ZQ|~MU%<4_ZM&H4q`4;~8ZrHk(o}bU zH*U!XXAvPGADtxH?fbhMU`BxTplmHp57MYViZ!Z`==YZj4~_=yqI!ysOLr5Ual?6`lp1I2dgvyQ}Q zbIi@MLSaf7@^F^W>gVbFp5r6nJIB~DM>?G*96{~F!Xe292U`IdS?Hq{JuhhaF5pn| zmi5O9)T8^unXw)EujH`Wws{AptzK%roI_+hBOM0E`Zvg@yT)#71gvJx{xH~vM(e7leZ0W-g&J&%zwP`OyN{?f7nY1;tSBbPdHuq2NEJcH*w%B+&PB!7SPq(mOPHbs(V0wbKNJhq?odhW~#I=9=F1_*FzdD7=M3n z@W*i29|2RL)1WvneI5&*V%eCjwgZHhSSmk;zI}K1}dfqeRW-1&dG+YquIN}5}s}@8z_ANAm zn6cYkvF@md``LPpd zgPXSoWP%y12^DCE0C8%`F>3L=!2oE3Sg-8jB%36@q4SrRrvcuWJ^k-fv^?eOywG6m zH^2!I_26|*eMdY{V2C;pWkmDljdEX(Ok}MXxuXAD+JG-@h@t=sy{2iE@VG!qewh7+ zQ35Rxc{hHKqr=b}RhwsA@*KE^m*jAPC>Re%Q+_(qHYDr8iUfJY z>@|^2soY9$sYp8<7jbU0bnAb4d6exnT_#Q*7M9Eiac`Bm3ZWSBCZNk+pDlI=|*giuYXICpxMJUs0n;wxowE_|=qvsHKT2JEu_wzwNbF-B&joq0&U!ybEI>O6P%2vmve2tV%*={_1zobwSC6~opge2_tt zQjN!nh9K9h3ODz2hU89P0%P3!o}IJFwQIQJl&|PR%Xu3)1rhNz#XlHkjPO57GEm8T zKnNbwRvnS8-31%AOO>Ooudd$XKa0-q8O*p~?nW&yWFlzF%v8NKc;7`|G3Yer#8(%O zmcN=T))wH>2s~MCNQ1)U0l=4e*PUz60hdG!abZHIF_X8B!Nlvj^FdzkI(%g@y`}H z(TKi^=Bbd21Jv08A^2NYd9L^`ba{1mr`xEEfj0z8UuKI^cP*j}BQ0i1ICv7LhR2?M z@gLM*xVEQ;1T|Pl;#VX%uVG8hSn5alNp*rd0HF6%Bhr5#w8jS^A!4ZGmL*hfYYT~k z!v+tF?}d8ZFzn?IIKS3B*&yj-c%>@VpS9)z965!xv{H1?{>2A~naTTk$Ys*LZ_r?0 zE0Y>}XheBPqz~8OD8=z#0~;)2#`-s2!&dPh|7b-ufuNe`NH?>}7$En`G%j(oWxY;~ zutUWRf5f`Q4X-~2_bRl~urh@6?5wWbvrn!13G6jKtD@Jcu0C%n7c9#x050Yq+uMo6 z)}w`bl1RsFYvNj%?3elcdUHI7c9uz0TaZ`TQ$)Wov*{UJ7%4FqG}Y<80om-uGZ9}Y z4gSFgCM~GFr+NS0_DdGIueEvL@Pd0+$X@#WMDDJ;SfFpw$b z4NpQ1>0L;OvqD^fV}DNwc3u<#c^y-w={(0XGYl(_w%;tH(B)ADo6OCyv4REB0y^}N_FtXkckH!D`{k963dz*?0(O!NcUH}=Coh08qsrN!#cIyA zd&rF!NW=|!iA=DQ+mD*VU^Co&)qha&`!24*hF`FI)b;igE&l}*7gr#eP|t@ALiaDS zt8txEJQ6>PsyMjo{76qi!@|Za64!vQf_gpB7U(?w?&#>Cw8|(-!}ep#F;AuPe6&x! zYI9h^ua{J>XP+m3ycw8Mp>#Fm5_C((b%QMB(+{X9Mz8-fp8RK*k$85xt>o}$a>}71 z9;5PogK1FZ*D$UU*khkCd6UwHVR1~G%V(Iv5=R5Cs5H<;sV9Ba^z<*+843pOkL|75e&sn8vE!UZU&uyzDwpWI zoOk~7W4_MjtO^ZfEL;*J{p`;oG8G_5tW{R_wl4>)^hf8pZC6L;C^J8nBInEH{VwgK z(d6VS83(qVF*;Gr6|yY>ADVInF#AtJ&R;9%iZZZav#?ToqVXE}tpD*1AFI9~U8`XB zERBvZ$pMuALP(1SOtYS^SYlkrO{$&E14YvP{G383*Ih9`CcR>lUUJ&b35th8OKTHFzCwY=rh=T z&C|$a#}{mF{WiOR&%AYL!NIm< zwX2szs>SYw!{d}CdHz1`WHTL8K2wp6v%xL-)_Rt!KI?q}4miTE;!urTo5Ejcix;HZ4;XGo@n(0GX&(Z^F%@yhbgTP_&RhBq)GEwwa}I-T@6ApVtDgU6 zI(U<`@3-eos5tU>cx}hF{dA(T$y}O!D~p871P}T$#WRqgO8GD1^j}XOW~mp27z`Tl zZSA+@PtBNrQFy0wxf3jTUuMMDhJXlJ{dODS$iV@kE02K3)t@tbE)90sTMRe+#c36M z7kZi=VRcUHFrPLRh!7Z=*NHWuATU{8DTHV^n3}{{t$JuLF9Q>*pN>!89xzOsPG=#) zNGtKu=|8|gK9qgJiyTpvme5fJB<0aw;Ier9Uo3+lL0&7ap z%xm#8$dd*{WbJ1T!%?tHYup57?lcAO!YE95P`U{+3H?`|IIj20ef8 z&TShx_UJj9G%H%O)5j~^m_{-XIZ!a3nT551(Kkln?RmGhTT zlxlT_e{5fD^a?SfMpnEEmu>g^i78)et*JiGS!kEHmR?gup|#-2WOl3^J1M#$3k0wt zcSyM5Wc|%N90z*Uc&tkJ9K2#ZpOzBRXnaw=Q`8;sS)h6NeCrtCKEvw<>YSB@tCMRU z2x#g5x4+Qn1PP(QH)T&bxYDcNAkWFC-gUQDXZ(}Xp9RE+_9x_<(d82#4@ZBy6$}N1 z1`E#}tNhwJHmZBF+7~^8Axgv1US>eT=sK_BmoBRu+}3GOU8ZpKm6L?$*^dHmO_yWD z@B7VPyiRH}B`2&84}T(S_8*qLpo(7Nzz&HK900mry*psGaC2S)E8W+TmeA(s-I6gf ztq)QXxYTg`1Ezb!U!H>4V{bBaS&BqI61ZC4=BJUpP}Z@)lrpm__IjtifWJM7)&8<~ z1{6g&nK+s*mG73xdM|(e-msV5+K^^pa9F7p2FFGmmf6=td)j z_~VB&?1BMAKVKk>0J*cEIP7~Y|F)IE3+{(kOWEj7CaQz;p@Gl>$` zm-r^{XqrvztMPhXD>J0>Ni5$HdRzM1y!TR{YfPBb>_Pk%PZ_?o#R6IwKlh7+Z2Ncu z=s^(a)#Y*1M}q?Z;}f#}VaGWM;}>^v$eOE&2mxz!0H3ZhIn1G~(R@IeW|!^XjEz_x zY0nUPg`f+IQq9Hbjg)D?t7%lRn8U3?=9k1N;x%LOOGTu{QphE~P(#*@7No;|8z`9 z+TFtDo>0CweL-p%4UV*+<+ZAMnz2?~ECx}#GzX!wh?<+9P10Q4m(sYm{K5I`W zy;J|RAB`iQQn`oID691)VnyZfWTZjgV6zyX!;Dcej0Ph5EuK0M&~1vku|-5qS0l~~ zWPQoYIgOI3JvjW1oPU4DtcruVB^2pS_ka>Dn@?%7*FA&W#L-PxEh!2r&lbrTbB`BiT*p9@cPwI*?X$f^fqm>O9{7O7TpJL1jr@l@kKOPCaR3|2H5vK zxdg4p78}vEQ^MNn4JpKjG_n_*E4%Gu^w>UwsiYc!6g-A4_G-p-DJt~Gr$Pz1>?+V_6Hc1SmlZ4>W#TI4`zt@5`6khDcfI=-WZYJ ze5}-5W{o-NlwoFlAN_N}gx118YDX|Nzk}$_lr29qQ6r3Q#eu9?8612A+w#>B0fw#I zs`$E!io&u%=+g6Aq)ONE_-iR$`4-^g0m5=xSdHRBo~ClzJy{=6n_AL^oF1*;)mGSl z3AB0akb24^l)XA-thUi3%#6w`Mw)EwnBIs%pZ0}(l`)6uiC<_(Ip!epsgMrtV>@@*=wnlR;%Of{{Sl-s!C82SiCZF$C<@5ntS~KTG5P z^4-@T+A#S!Rrhf6cBu50`6icwXi!e8lA6{a!1VGOq7#2%gLYU=?K5CCt-Zz z6HC#`H>O2=gxJH;Z_`Z23i0S_Sc0Wj{yL$@+PLfG>An z<0TSa4`3oQ0nRSyIuU{EB8&)$f~BQSc5HibJj1{1-l5P`)^FldbNvTY%vK N^|W0wgVt6r%`hgUE<-RHtjZ-a;1~W0u64L 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 !M@LD=WVQ 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

#@%@}MwM?t{@`whS_ahn}}RkkWV8N0t725 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

uhrWf@#j4C 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�mlR=w;Be%gXyv3>KA*B!1pabEBDVj`E*a%V+Z#V5Uiv%qrHM;N@}}V= zj2eQvsAMs3Njtz6bnWHkwTMK<1BV=Zua{14G!oF==>IP|yLg+J5HpsTz_F~(BL5LT zR!xgrprSWM=l$}+3qoQL1Xo*ib>Ldw`JRr-=BR%$Qj0rG$4&5zC@1`Vb`W7i&?V*j zdpXH;qF>TIU-WCR5Ffh5aEE#OQ%553Y?iaI$R{CToF=)AzT9@AEnNca)Dzh}RSpN? z)Cjibu=YN~%-G%Wa{vzQc4WPg1jLWD1b(9XRjNv1tT8`6Ap)%n`e|v95^^8_@PgkW z66;Q!Pu|2v*x!+$zx*ijXxk-I`h~G?{XhK+MrZREf3Q~< zEpddElK^N#_80IfZ!QMiffAlJnt@LtvlR!0Mes{Q(=B8U`2!$QeV1N}h9McLBAx

0YrYQKQfUTA#}pXzlVHso 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 literal 0 HcmV?d00001 From 9a326f1a20d961cd1b494540d3c72e3c6ade6912 Mon Sep 17 00:00:00 2001 From: Chaoyun Zhang Date: Thu, 8 Feb 2024 10:40:44 +0800 Subject: [PATCH 032/223] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fa973e09..baa60f0e 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th ## 🆕 News -- 📅 2024-02-08 UFO is released on GitHub🎈. +- 📅 2024-02-09 UFO is released on GitHub🎈. ## 💥 Highlights From e0f0282ce776a4651d38c9ce70ff8b72133ee4e9 Mon Sep 17 00:00:00 2001 From: Chaoyun Zhang Date: Thu, 8 Feb 2024 23:45:04 +0800 Subject: [PATCH 033/223] readme --- DISCLAIMER.md | 2 +- README.md | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/DISCLAIMER.md b/DISCLAIMER.md index dc6a096b..cee3321c 100644 --- a/DISCLAIMER.md +++ b/DISCLAIMER.md @@ -15,7 +15,7 @@ It is crucial to note that Microsoft, the provider of this code, explicitly stat By running the code, you understand and accept the responsibility for the content and nature of the data present on your desktop during the execution period. It is your responsibility to ensure that no sensitive or confidential information is visible or captured during this process. ## 5. Security Measures: -Microsoft has implemented security measures to safeguard the data transmission process. However, it is recommended that you run the code in a secure and controlled environment to minimize potential risks. Ensure that you are running the latest security updates on your system. +Microsoft has implemented security measures to safeguard the action execution. However, it is recommended that you run the code in a secure and controlled environment to minimize potential risks. Ensure that you are running the latest security updates on your system. ## 6. Consent for Inference: You explicitly provide consent for the GPT model to analyze the captured screenshots for the purpose of generating relevant outputs. This consent is inherent in the act of executing the code. diff --git a/README.md b/README.md index baa60f0e..1c712d76 100644 --- a/README.md +++ b/README.md @@ -101,7 +101,9 @@ Welcome to use UFO🛸, A UI-focused Agent for Windows OS Interaction. \___/ |_| \___/ Please enter your request to be completed🛸: ``` -#### **⚠️Reminder: Before UFO executing your request, please make sure the targeted applications are active on the system.** +#### **⚠️Reminder:#### +- Before UFO executing your request, please make sure the targeted applications are active on the system. +- The GPT-V accepts screenshots of your desktop and application GUI as input. Please ensure that no sensitive or confidential information is visible or captured during the execution process. For further information, refer to [DISCLAIMER.md](./DISCLAIMER.md). ### Step 4 🎥: Execution Logs From 5469f465886ad28a736f4af9a980c5ddb52a7d76 Mon Sep 17 00:00:00 2001 From: Chaoyun Zhang Date: Thu, 8 Feb 2024 23:46:14 +0800 Subject: [PATCH 034/223] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1c712d76..a28291c5 100644 --- a/README.md +++ b/README.md @@ -101,7 +101,7 @@ Welcome to use UFO🛸, A UI-focused Agent for Windows OS Interaction. \___/ |_| \___/ Please enter your request to be completed🛸: ``` -#### **⚠️Reminder:#### +#### ⚠️Reminder: #### - Before UFO executing your request, please make sure the targeted applications are active on the system. - The GPT-V accepts screenshots of your desktop and application GUI as input. Please ensure that no sensitive or confidential information is visible or captured during the execution process. For further information, refer to [DISCLAIMER.md](./DISCLAIMER.md). From c6c0a6b9baa556c1f8d6da64b5c2680b8fd56a7a Mon Sep 17 00:00:00 2001 From: Chaoyun Zhang Date: Fri, 9 Feb 2024 01:06:08 +0800 Subject: [PATCH 035/223] readme --- DISCLAIMER.md | 18 ++++++++---------- README.md | 2 +- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/DISCLAIMER.md b/DISCLAIMER.md index cee3321c..1688b3db 100644 --- a/DISCLAIMER.md +++ b/DISCLAIMER.md @@ -5,31 +5,29 @@ By choosing to run the provided code, you acknowledge and agree to the following ## 1. Code Functionality: The code you are about to execute has the capability to capture screenshots of your working desktop environment and active applications. These screenshots will be processed and sent to the GPT model for inference. -## 2. Data Transmission: -Upon execution, the captured screenshots will be transmitted to external servers hosting the GPT model. This transmission is necessary for the inference process to generate relevant outputs based on the visual information provided. -## 3. Data Privacy and Storage: +## 2. Data Privacy and Storage: It is crucial to note that Microsoft, the provider of this code, explicitly states that it does not collect or save any of the transmitted data. The captured screenshots are processed in real-time for the purpose of inference, and no permanent storage or record of this data is retained by Microsoft. -## 4. User Responsibility: +## 3. User Responsibility: By running the code, you understand and accept the responsibility for the content and nature of the data present on your desktop during the execution period. It is your responsibility to ensure that no sensitive or confidential information is visible or captured during this process. -## 5. Security Measures: +## 4. Security Measures: Microsoft has implemented security measures to safeguard the action execution. However, it is recommended that you run the code in a secure and controlled environment to minimize potential risks. Ensure that you are running the latest security updates on your system. -## 6. Consent for Inference: +## 5. Consent for Inference: You explicitly provide consent for the GPT model to analyze the captured screenshots for the purpose of generating relevant outputs. This consent is inherent in the act of executing the code. -## 7. No Guarantee of Accuracy: +## 6. No Guarantee of Accuracy: The outputs generated by the GPT model are based on patterns learned during training and may not always be accurate or contextually relevant. Microsoft does not guarantee the accuracy or suitability of the inferences made by the model. -## 8. Indemnification: +## 7. Indemnification: Users agree to defend, indemnify, and hold Microsoft harmless from and against all damages, costs, and attorneys' fees in connection with any claims arising from the use of this Repo. -## 9. Reporting Infringements: +## 8. Reporting Infringements: If anyone believes that this Repo infringes on their rights, please notify the project owner via the provided project owner email. Microsoft will investigate and take appropriate actions as necessary. -## 10. Modifications to the Disclaimer: +## 9. Modifications to the Disclaimer: Microsoft reserves the right to update or modify this disclaimer at any time without prior notice. It is your responsibility to review the disclaimer periodically for any changes. By proceeding to execute the code, you acknowledge that you have read, understood, and agreed to the terms outlined in this disclaimer. If you do not agree with these terms, refrain from running the provided code. \ No newline at end of file diff --git a/README.md b/README.md index a28291c5..75c796eb 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ You may use them to debug, replay, or analyze the agent output. ## 🎬 Demo Examples -We present two demo videos that complete user request on Windows OS using UFO. For more cases, please consult our [technical report](http://export.arxiv.org/abs/2311.17541). +We present two demo videos that complete user request on Windows OS using UFO. For more case stufu, please consult our [technical report](http://export.arxiv.org/abs/2311.17541). #### 1️⃣🗑️ Example 1: Deleting all notes on a PowerPoint presentation. In this example, we will demonstrate how to efficiently use UFO to delete all notes on a PowerPoint presentation with just a few simple steps. Explore this functionality to enhance your productivity and work smarter, not harder! From bb6daef9f193fa0b5405c38a9b66a9c0c024097e Mon Sep 17 00:00:00 2001 From: Chaoyun Zhang Date: Fri, 9 Feb 2024 01:09:19 +0800 Subject: [PATCH 036/223] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 75c796eb..ffe20063 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th ## 🆕 News -- 📅 2024-02-09 UFO is released on GitHub🎈. +- 📅 2024-02-09 UFO is released on GitHub🎈. Happy Chinese New year🎊! ## 💥 Highlights From e9b850a4163db8921043484cad67a6eec7f1dacd Mon Sep 17 00:00:00 2001 From: Chaoyun Zhang Date: Fri, 9 Feb 2024 15:10:53 +0800 Subject: [PATCH 037/223] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ffe20063..5f4a274e 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th - [x] **First Windows Agent** - UFO is the pioneering agent framework capable of translating user requests in natural language into actionable operations on Windows OS. - [x] **Interactive Mode** - UFO facilitates multiple sub-requests from users within the same session, enabling the completion of complex tasks seamlessly. - [x] **Action Safeguard** - UFO incorporates safeguards to prompt user confirmation for sensitive actions, enhancing security and preventing inadvertent operations. -- [x] **Easy Extension** - UFO offers effortless extensibility, allowing for the integration of additional functionalities and control types to tackle diverse and intricate tasks with ease. +- [x] **Easy Extension** - UFO offers extensibility, allowing for the integration of additional functionalities and control types to tackle diverse and intricate tasks with ease. From 7632142b5349e343ca01c034f7b1b0b8a55ef870 Mon Sep 17 00:00:00 2001 From: Chaoyun Zhang Date: Fri, 9 Feb 2024 18:52:29 +0800 Subject: [PATCH 038/223] readme --- README.md | 9 ++++----- assets/UFO_paper.pdf | Bin 0 -> 11684072 bytes 2 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 assets/UFO_paper.pdf diff --git a/README.md b/README.md index 5f4a274e..a56abd7a 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ - ActAgent 👾, responsible for iteratively executing actions on the selected applications until the task is successfully concluded within a specific application. - Control Interaction 🎮, is tasked with translating actions from AppAgent and ActAgent into interactions with the application and its UI controls. It's essential that the targeted controls are compatible with the Windows **UI Automation** API. -Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend the application UI and fulfill the user's request. For more details, please consult our [technical report](http://export.arxiv.org/abs/2311.17541). +Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend the application UI and fulfill the user's request. For more details, please consult our [technical report](UFO_paper.pdf).

@@ -122,7 +122,7 @@ You may use them to debug, replay, or analyze the agent output. ## 🎬 Demo Examples -We present two demo videos that complete user request on Windows OS using UFO. For more case stufu, please consult our [technical report](http://export.arxiv.org/abs/2311.17541). +We present two demo videos that complete user request on Windows OS using UFO. For more case stufu, please consult our [technical report](UFO_paper.pdf). #### 1️⃣🗑️ Example 1: Deleting all notes on a PowerPoint presentation. In this example, we will demonstrate how to efficiently use UFO to delete all notes on a PowerPoint presentation with just a few simple steps. Explore this functionality to enhance your productivity and work smarter, not harder! @@ -143,7 +143,7 @@ https://github.com/microsoft/UFO/assets/11352048/aa41ad47-fae7-4334-8e0b-ba71c4f ## 📊 Evaluation -Please consult the [WindowsBench](http://export.arxiv.org/abs/2311.17541) provided in Section A of the Appendix within our technical report. Here are some tips (and requirements) to aid in completing your request: +Please consult the [WindowsBench](./assets/UFO_paper.pdf) provided in Section A of the Appendix within our technical report. Here are some tips (and requirements) to aid in completing your request: - Prior to UFO execution of your request, ensure that the targeted application is active (though it may be minimized). - Occasionally, requests to GPT-V may trigger content safety measures. UFO will attempt to retry regardless, but adjusting the size or scale of the application window may prove helpful. We are actively solving this issue. @@ -153,13 +153,12 @@ Please consult the [WindowsBench](http://export.arxiv.org/abs/2311.17541) provid ## 📚 Citation -Our technical report paper can be found [here](http://export.arxiv.org/abs/2311.17541). +Our technical report paper can be found [here](./assets/UFO_paper.pdf). If you use UFO in your research, please cite our paper: ``` @article{ufo, title={UFO: A UI-Focused Agent for Windows OS Interaction}, author={Chaoyun Zhang, Liqun Li, Shilin He, Xu Zhang, Bo Qiao, Si Qin, Minghua Ma, Yu Kang, Qingwei Lin, Saravan Rajmohan, Dongmei Zhang, Qi Zhang}, - journal={arXiv preprint arXiv:2311.17541}, year={2024} } ``` diff --git a/assets/UFO_paper.pdf b/assets/UFO_paper.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f2fa7a991145c2f514003ea3be15030c9271f6f2 GIT binary patch literal 11684072 zcmeEsWmp{TvMuiJ?(XhRaCi5?g2UkMPH>k10g|AB;O-LK-8DD_3wDQ3&i?kf`|rKK zHatAdRM%TwwYuu!=rJ1X( zk0pSN9rTHeot=k|i;b6qj8&G*fQ*BmkBf|lgP+WZj8%mUw3M5SRf>$8my?%+kBn8B zjFXLwRr75PFBdN-2bqWnf~6zi%{1Bn^PjgsIQ|icrnj>t8LO_kr4=X)OGj&<4ahrQ zGFE9@d!VH&=xA>Sw0vi2;RFDw{drV1b9HbddqY9e$==<;(Txlgo~o-Qz}5ojg` zTQYVKrhl0B_!}(Fe+P(F?j4zdkQKWbA14pDg*h)f0Kj7ovdL-5&BJbGVad+JZpp
;r~{1#0X4lj&C?JOg`(39E;@OBoG` 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

Jt}5-((fLgX+|qQ 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

F}c;XXz6f26v*Px&Krz0qsuUC21)< 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�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 t8tM{al6 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%0A#;K=Y zojzNsoA(mX+KVLExfGTUoZMMj!M21$_9TJzB%GS)m}*Ec9aGi&?8UERMA0t33Cxsu zpS2jJ*LK>jIV+>uAt&S+P8~nN<~X=N?{{-|7$$Y`wH01aGh6NBzO0{xF!$cARNsc+ zF5Rf*ybw~ew-x@-8s{K@wv4_xRo6mo07&@IzigxR6Pwk2hGM%yy6sQc)EKHIYd*}d zw9)X`l5Qb8w>|Rps}nw&BiRbeBTtzb|CAXD45fIJ{Y9$YLqpN`j;%li-b>rp3B)m5 z?m192o5@bS<^m|k&|?`J8oSypH}xc8oNXg*qT+Lz2jy5N29n>Jj!3xo)YNWe+}Pgb z)>E5fw!g&ddF(N&zRrxDTxRl&@cU49M-4a;Xx5##>5Q+k-k^NsyksMZH$5REszH0tBQ@2xfi{(_eqk zv~BRUlN91mp;hjL8%HQB(K2>hp1ngQW*p_AwJO@eK<5SVgP5%9GHibq+4NX;%YpEk zKuQ^oa_Wr(xgWwzL6@)3?wBnQgDs6%xKRI%PhcS0gC_h7XU@PU?FdM$<1zfHwtpEx z2lB{qL!lw-<-$(Opg4usRmKSHCbjnG6l0Eag;{l;_w4c70Ej!S*?PYBva34ODmAGYn@mzu^Xf2_Z8Qfd`;VYQAF}JEv0t(Cp^47 z_oQIcF<)_YXvr!jfq@nVm;K@O>z3k?k)0x8>||*h!DB`~4m3tTn;wM0YhFBza9A1gTJB=xWG*>N_}QVygA;NeDUz#eFuoriV4FIPhgNwwzjmA~hx^P;xsVHKudg`j<3BEz0cCv2 zq@5`1<7($E?Rq*GuQ7xA0O##Iv)kH)srB1%y4MZ3%=88lI;OdVMbdo@@v@sVlS#%a zC4`%B3Mp>sz8$l;Vko|My-Cn)J&Dp--6FAf%G;h%nSwF|k05<*@Jr6Ve1P(y;_$)W z(hYF^L?-P^K6nXu1xd{5p`WipdeyfB<~z#-S1f7m)92f0Z)5eUsyY*D9&y?9_j?w! zm3a$ej#e!OL4SL`m`k0ix)rleYSxBKe%s%TQ`)EmSS+Y?HNnq`q&b#`AY+tzWz{ zeNQHRz>-jD%aV~nVE3+KODpRuW%$@6!#jV!$?L);3hZo72z)!g$eBQv&l`64HWy+lk}h;-RYLi8DsB2xZs)cjRR4 zu;lZg6?CpvjuG_|i{L8K=`;7^YcR65(BQogdDRzN$|~B}@~5)}YrnK@YSi2J&kKxc zGc>9-r39>W$S@Tc;F^gF@g8I}3-z{P;hz;a$}}JWDusQ{?}xPCe{>8Ts~Af$(B~;D zC?R{U|2tZg+jD`Q`3*IuRZ6^mC3F14MHNyTBhdi8U(@@oI~*#ESVGK9b_v|8DeIRx zLyNAA(e3$Xg*8v#hMe-EHkr>a3^2CxQvb?WPdbq)P0=!M;4NBJaSeSbzV^oG4mt-B~24132GO4`L)m!(@2@ZgDTU{`9IC-33yFr)XKOf4VXv6Lc`%Y zoHm6j*(@5#?)kF6p3I=Kapf1GTf!~B&O9=(3~zMQ;29$-eE!3)6z5|Gmw>aSR3Z63 zZ4^tmlb%u}Qh~1PAG{=`Sdjg9=YoZyjAiMT~mi`8o(1L4WJiN#9n0QRngmvRqM@r!uZLu4LHx${%^x9e5Rh>}3a=bJ*pnP({omEg zw6XO;;^QFdY|OkWOI9(pyDUv)x~ zl&ZAzv=l4s&3Cx7A&oBO&RglZfhr#kgX5z^4dld8dcA;|wfKeG4PFBf0*}7djJXGy zJ7q}kv3$RBal1<|?K9cLU!Vs8<@6rlTx;e6?r)=kcAQfMyAR#FgtJrw3#^mQ#QwHm z{C|rF6E^etd*R$q#GxNj=y+de-h9ucXmCK`q{kC)C;=%*h}b_v^JAdlTe=|2-gmT} zLyH*Vjc95A#E_LqBAP4`YJ|%-)0%r%sNzr^li?Wy>H=wJML#mpps}Q(^;8)_H9VMb zVOqmieun`LUg_5vxSL|R4!;M<_G^U@HI>otv!%I2{A$sI>U4zw8;@lBst$E&D=DMB zr9Nk7I_JAAhzoa;XXWfNDDK`S2%Lp+ix@hEQiX)80ugyFPO-p5OqGMyJaz|uN{#f| zPLK0Kj!d@kCX3EjpFB0xaYI=nH3S|~6^1Xml~_P9ceTgQy7;A2PDU~(+M9Na8pn(= z8t~Vfq{(>mwL#n;t_u%xCWE_89`mOJ-%jjtD*xE1lq7h@N1t4sHzTc4x?xL{Y(-UN zn~?mYfRiWrT?vJI5w)R}V0}@nnfm`??=67hYPLoH!6is=f+qxr0KuK$?iO5wySux) zyE`Pf69NPX?(RCcJ8$PZ_q+Ey=bm@!f9u`)SG{_7YN}>W&)$1>ukK#Gx_hl(Qw!sN zDxIfd-N+oE!K#AW;2SDroAPGVj!+D{@D5$2^P?|E-TfVVZs@o@cw0iG3Pdpad8Yg| zz6>~qnA{VtwrtCpH)-m&umx+;B_*=_3Su#WM!L|v>FLCv2=vf1_q4TY#Ewoe4ox5& zT!tTg0|(n~t}{!^^5%KmxJXMwh71WQ0y41gjqOSQwifd?c}485Y9Txu`G^rWBjX!W zJ|rdL`4vSh?_@YQtV2B5`hwAQjYvL)EZjLNv|1=yRMIoJdsQfRa|}%c10%c5o$e82 z(^n0XjODl`#TZ1dT!P`5uFA(XL{P+cDn$*&)}6vqG|;|RncYcERlGOxv5lAxP=Nh> zCas~+R>M*3D*N^ruJVJxQ%>uAlji13fmk}nlQgZ$$s9(sdLw}qC(_tPOu{0mTCi=r zOd!##CM#V9qtKpQqMVtI%mQs42DJY38~ZU;Y3yv%{NC0fHXOCXcE0b;W-}2w)YF;F zr4rf~R^wkvZ4{ z!u7trsQmS4V;F?n7RCWpnF76z=}p`cYJnk zk*w{Th>|!Vj=t@P4Bd$9awRz!qL9_I>n(#R<9#vM7f`~&Qbv{}pM|H{6DGtb1Kh4! zJC28AF2Kjws=QfYkQ-8r)_$RCoFDU-{hD{ahB5aA02D1nT!MszhrD>Cn0=(~#e~qx zZ?=jT>S&7Qn@JGnoj~rV$em*^-OEATc_R@sD;xI-8pOcEsVMd8QB~1 z#9m6n1QYa5n@5JuL*R-mRvq7EF*DJ+7J%R-?x3+*_|L2L=|vdXl{ z{AEn6X{$K}FJ%x07K486hPSP|RKA^6CXxNUF>j@0qqo;&o_8`TFEC`MP!4Y8T}Ght zMR#R72d3guU>+ANW!UnKe^~482Y}6_bY@fb(S{E(%2mTa$N1IqSKP`)9#r+OwJ~jH z^68TilqK5EUKM7phBx$C87h9GByg2-wn^`&w!WnBSLRgMO~uF4Bw}Hpnth!{ds8Vt z`d-DTWd0-dd{oMSN@{$la6A^#V9P+fe4Sb)W`rhUD;2A~VgmC75D6Zo@QvIwka|E} zAW`-0kLs`SLmL&A1&cBp+texhLDXLr{QgEvaoq02LYdRkQLX;`uFZd=)#Docyz(2E zvU;34pVa?UM3MRjFh%80P|Ba5SSMb{XF_Skft9<>Nk7C&PG|`;d+YvL zbbj_}aU}YOY<;Nxw?KHz!h>Uk;BJTUz4sL`sd=20?N|WB4wdaxj`RJvz{}|%?}P#( zl;*ZxK*<7dPmX-+3jOP9;yX*xw}6ioV%;-Ege_KE@B#m`veu)ZE5(vf^c7296xH1u zi7Iqn?{|YP>WjC@P?L@t;X;#^%_h?!&u1GoS@#FtSMkl)aFFQ(+mWi%<&qnz*|U_z z$6W{NJMfbxahURRY`4lH9bdy^=J^ik^n7G%N}+WXqflr7*2=(PBqfW}v0s&`G(uRb*{t`r&4$FkudL^*ng+g=z_?WVNJ}Dtb%~iY6t)RXuS~*Smt^V)uSlR`a=( zXjv)yB(L#;c%nY)}D;@$(H>!9q$Ex^HsU9Z&hsXJnUH zT1WRt#AEith7SCV&#G^YXLWIm+&B&o{rO7DSmQ9d#*)T=BhyD*oVYvghZ=YxosgYG!4k8V}M9{YWJ9Y*7x zclx0@R{NXrx;hfpEl|~KK=KnY@nb5gU)oB1^AOp$CRthSgf(6*O*ZUg_72&VY!vCZ zr3iE+;Ql7Dn9(88_0h-*rV}~V@}OKjcTQeZtkOp16*R;j&c;e-ClIg!9u3(O-%9a+ z?DdSsVhCy3q#}QJJPfAxW0U@?F%S8mE$GDvgJupM?;pxzW%-Ce2d17S zI_=Bv*~Z2})8w!?X>WYF;8pj|j7V+yT{0KK7Kkyjr`XGzvs0KL%L1`s-{BiEdyqge zF`I14gB#XkS<5H4H*5nLmP_1ycePCz8MYbz(Pk5QQ9`f^i_4yYsi`YckXYX`ha#Mh zRXJ`d)hUZ{OMDdAmYM5_M5uj&YOfM{d)u;d6P{C^>uW#Xw|rS(eLnPgb|s#vLYWXz zPTa3EhUopkQ+m***f6U#N|O+Q=tMPFSZF(Egn7USEHMJntB!Ar-qxiQD=5C#18VtY zfTB>Hh)Rk|VeeZk)wg+&brUdB!oSf!bwVnsVJTszzf%bmEK3_Eou&bh7GYhwnL^z} z-LYioD|*;AsEu#NKWwY>i1&3q)!fNWbU5DTJhZ9wjMHReKJ~QHMW1+yVgUA8hI{Tm z7R~Qjj~Qo0wUusXs|RvF;aL1J|5zPO7dv=v+4V{`t?@MWg>7emv(w1;BY(_4?GCm* zel0q}u!b#*IO(&%Pp@&S*BGNBxI}Y&zLiu1#kqkl!hJ`YS9A&s?5SiX`a^`(r2Vbd zMV@8H*;Gl$g=n97bz-)~4n^xxU2eE$*cV;5QuDcFt7pm?W@|14s1%F< zJ*G-h2px5~5!goIHtwNKkNxr!5cAB$@HFX31FWispmz4*c+FvrhI$=veZ6|<-?InI z0Gq6?f3Va4V7@6=a^73A$pxLm8O4#0C^uv{kn(&*z)}grs9~|+M@4KX8rK-MG|`Yr zw-_J1(fC>cdx&(gv=-s#S?(-1UTx)wS}*8KqNz&~(xjIQdL#p%0nx_&~jxg-|cez30l+KHUNf_(m9S@D|- zzMoU|=#_Pn9I$de9B?EV_A0{mX(ENiJZDk(KA#u$cL-afwNZM9m566P|xx`ZTM{ zn_6lsG}Lgf_jJexI04NR>$kkS5sJE(7fN}-&E=}p`ZEFmb8}*>#aIK&yx;01M1AX z^e|`gUUT1YSKh?)#>i~%@am^*;zCbV*WQBQr?fk^Udzs2&T#KZ#m90a!EwS{m=h+v zFv=>y$^X>N{Tru>`H`S+o_Y@cz+OGqn`FQf?cp4+pQL# zs?UsCaOa`!+n|!tFr-Dn=5Oj=ixFE>nNsMdwvL>hot6=npEAg-Sen1{HqmL)V!C>w zrhDfeifzkTqwF2irhyw_A3Mo$OjB>KkYUr1gg3QH2_DcMftFz$5r@AM1Z*_IUoTI^~^`G})(pp#uc7r=<1Z*<}WoJ!s zERK6U?pN2s!LGK-mLI!f@`( z?~2jO6&Qq7bX3YH%oVTCQ@31CM^3e*S)gIc3SeV;x#9=qrc|++h_9tRLN~BiH}J2o zQp>@^nn#lqe1~bbH>#HR!(g`&Kt3~AEB#i;>f4-@dCenhdH)0(^*gO9fBhyDHHcfs z)a9gMMsZ8?-U4vu@a=x2NzO}iaweBokY+mETd-gfE3eDQ)jX#mKlx!Ze_&}!?xksr z*32EP7k1GZ#LF5iKbb5&MV4@YT^k_S_I&+zGUAF5wSfmbRum=~s^3~aMe#M>YQlie z11bjodiR25PxpxH!LvoF9REifjW#K%F*CPc5wcZ8BA40wA{PghQ=P_Q%YiFbm)CQ zosd6uRLIqfJ(6$oHcE$wyBXh%)rDdrv>sp5P$kVFQqxG1z)+E`R1+&Yihl{2&FggV ztdE~vPK_YUU%{!pQ9OW-x*`A)GfT!z!Lwubi0{kAzh5PS5$_$$^1c<1%VX5=V|_#4Djqo6B7w=uBEWQQxIUkO2|Gko*2j zIiEwAH}9+eyOwFjxq@PO72V%WRh}Q|cl(usm6z!yr^E`{h{rsj3hQAMp}H;Tg{=9d z@VgP~|Nb0iO(iwy{XqGLy(iEAhV#K({zFS3X{mAe*tgxKe0S?q;ws!rx!)7{{eL_#T#;AF%g>t zb@i);^0E7oDb32CAJzErT_GlM5waL;GdAP1p5WY81a){^3^uU~i$w{mzGhnly5NAk zE>XSst;e3s=eapHmPvoG?#*yU)=i=%h04qlpJEI<3D~%iyG&C~6`zroC@MlJ%a<9M z;Sm7r5+*6wWENKDKiDN-e&a;qcH&<>jo&E(+j^)F_OJ7`@KLi?--vEYElZ}+^6IUt zKIESlTgo0s59T9F;3WnXh}ZHpbtV$2d)sY+e!k=BMw?*S|9xrqTvxOm?{w+nO zmyQe)=vh->Fcst=els&*$S@PSBq;NIffNj>SSl)0st^eYbqQ!PGCDFw7-8QB;1(;_F?%GSJQr_=?VIO=ZbJ81e@0CF`D-IVUL*(sr zNwk_tB`!3PNhQ5sE4kqu*}48uxE}%KL*nm81<*9&Wp8~qhUo+rz>Vpm!ifPnUZ`pFvJqY^pZrS& zR(59i_GtX_%7NW3mMM8Ac;G!u&j5GC7%Voe(ZIR0Rb{k-6prYMO)Wu(l1Hg%M zb;{jjn``C=q82_AI`59yBI07eN3B;0V06s1?zOnybG?8fU9K?ge`@y;MjH~>eJEcQ z_{t})T|ivNo4?v~UA%A8bFUgc{+rv;Q+wop9ok0d!2xlvMf^+-oTK^l$V9yE=6xG> zdQZ6<^Ay2Fw8v-Cce3t#tK)s$;_{TQc-uz18u$X(z2?>Mc~M`81_`6xiR&yoy^$n% zlY0PDy*PT|<4|YNG2Fx<@l#S8Y#2w1JEaq^A90;_`fAUt!M;uLy<-0nM#0UPwdjNr zfbGan4X*XQ6nn~JmboX-;f>1PlqIg?3x3$UPq}vmVqd;gXYA#thR=1~^Lvf0;GGnj z^*lom1I!cPG>X7zEiP5!>p?z%(_)bqJue z|8LZeq`y%+WTK<9ka-l9h&2F0%|_|wX20L4$`srTP;S*a^nb&D959|uc2hiS(~Hgk zUciyu9=5>Tp1T78@z9|K&cLY+y^_0KTvL1jF;exE|$-S2tGpNj8q(8vOOkA$-`rf%cnki$-F(tFjP zN`LS+qV2(FXZYQflRwhDH|f|tKArmRZ)h={HOcD`%Zt|OU76hQ{vhH$jRjIE&RRb` znfCOpU|D66O`tw?^aDJOVSvX$U;bftp7=DyMfaRr6mVKzv+&-O8{Mo%SgbNUBTDW! zY7qfqY|oA`pUQEjRqYSxBsbaoX|dYM@2WMuk?WAWRl1(ceP%m&b(Uy^b4_a(pt`cQ z+xqVV381cqUA8eZ#XoKa`(4lo+?zK?i^P6woI~+(N6Zz*N^Md3t4YuI zPk9aGq@$WOfWT}W}j2Uc;gAKhU{}w&+R?H#~ znh{=yOb(O5BK*wbjBsi zq)5N^bq|Bo``re+EU@+(AEjA}VkAy@uji`l{h82rSqXGd9_2dqZn?{fv;|LjUrR7F z>XiYfKtGvc>3*sMCtEz#*4ILh2Blv~h@jVW)Ee4}ieM#f$I)IDLWjt9(@nk=<*OK% z?^rDH6KI??Iv=pg6Prb+2hTSi4-_0LVL{{h9i?_=nPJ7prCw$^5+y`sVYN2?PsXOm zEoov#6B5q3AK4n!JZsMP^gNCB2l@uTWzRS_vMog3YkymT@G+S;FS9PoP%qvnbuY`t zD?u*{F3Vfk3j~83omiS6#ER_aJzN_!HPlL~Kd`aRX0x%jR#LQIUk^R)fO|6Iy})&= zcqkwe1(}C~bn4=nQkR3QgJRgSfP>t!64tVqgDo~^N6tMn+m4D}HB^tK<#{{@hq2?+ z5+1kdW|w78@2@XmldC;_!H%Ll(44za;heEG*m~mYJwij zYSmqvYQN4bxGgLyb}i-`5Ej^@@@5h~+pV+`Tve@Hd%^fnDy)7G{d-}U^ZcqH6lUeRyVH_ob(%-x37!5V2HxJ1st~Fs#HeJvx^>p$VA>Gmk5hmJ zBA3Tk7IRdncQB=kQ32g1i_w5mNGn0QQFV|$921D3o&QPr|4AMX*LB$bb;m3k#r~dv z;NwdosS7wu)m!SYPbA704k+U1^}W0tP4k!MIQCEes0Lh39Zff~5TMmq@T+?HKqU%g zNfyOzCBEWgDf4%VKb6hG%_}R7`{9_@jF@2@U#o!BbN@^#s3=iIR`(9K2XHx`pNO`O3%xT}W{pxqb1NF*1YvnIT?OYU3*L!Nwo@cftyTs3SM26Rc zned=-d#o*`O2xA&o@rTRC4^}~WyU?T`n=ywdS^>xW)unx$43nBtZLad6gk|#oLTv) z`0n1u*=35T{XnyA=97AaP5>_?zfx00=|5_B{ibR_?QG8qUC}!_wwiZv145&nQoZWB z+Kn8x0*hC-KiTQPQLR-@dYQ9>e8f18%Kz~e8!kFeeN|E5gJUf~Ar{5ZDDCWEm!ql> z@l;gP^31EbUQga1UyHQLubR(r0lk{L^p*7Ay0t%qB5*a<-YDUM;Z1VNVoKOK4G=pG z$rDG04JGe9nw2V4c8HW|hQcq(CDkJ!NZh8_lx6;264%o=<<8rVgHO9jYBqdpcDVBeMsdoGJDz|Aq#~vCSNTJyp1rKN{(VQuc&ID)h#onq?(*UpvGhdn5eZbgV!cvyH+cwTr_cuRQSgSY^r zRk(Tf-oc(agYk7-APpSrA;D7p!)bSNG!f*#pP&BCP|snx?l{V%jk2AXFfu=PZhZFJ z7w{|hplf7eF1s!N#^`KrTeq#l-Bm9ZyCZZE$Uyi~19%`!Of3hkspSP<=}b=^z7Kfd zgCPu!^z4J9g(lCTHQ%QbuSdPu5S%KV4wucr*;So~9bz^R2v;L-BX2uzFU%pLFMJ|= z1-y3@bsY}b_M(!(Y;^vuJXzQtI~UhkLI~s&EIy^htc?~a?MUKuwWX}(LHNmhgO7`rL|2T(=7e;(t46bCMpMhn|lmxa-#eRH^eGVGsyWKFIs|K_?%5`yB}6 z92X7(z25?k5SrmZ`~n{!K`}A^lk`85__=0PPQGbOJutjg3f}zbJrC zOGPF9I(=zr=}iL+uXe-n@y(OlJD?4Y2gnCqBz=gIsJNRg<(|0x^@sXM(u4+)q%jQE zSf4$X{215FVD!E|ttD;H0{x*k4nH#(Gvf>)Cz>u30!ne-2?B(>8^)7N*+bFFm5&~- zNjp8mT3=s5ICuG{N{ogE<*4Vu<|D9Kt=id-7B)2O1S^_a?Cl*9ao4Q+pn-Iks71oZ z112B7h!D>#*@ZzE7#2W~g1VZNBe2Q{;UoH zdCB}u8_TXTsuK`0$XHl>byS7_HEpCAM@uSW100OTXv=0di3j z-WNU*z7l>ArfFCz$Fk03r7B%%R#= ziA&MIDtiK+uQLDx9iT9?*YlC8?QSo=Y5|ZxHB2lVIvimfE!6=1gq0maDA}9gi0jrD z6+*0rfFaBorP&G%TrU4!|Ia@6)ncR5a28fO z&h$;Tlg2R<9?&gi9Uf=Y+Z(HmKKIp0=gE=;d5RyW#zBL2tTT^2peS-fANw5mh1YN}rq1Y-E2 zbdV49;6%(X&j{XR69NCk&ijqB{XZb*{uoqNIFnEI~fW6wkUJdAS0QK<49v`Bq5%HG_}OWdJ#g!za$% z(1iE=VwC0Psxu8a-dIB|)YxI*JW5KsxF7KEyLp(RhtEgb?3uQgU6}?RJ1)+8Q(SMd z>{piTPk1V|xF|Agz9U4fA5bfn)*oka%3AZ0+(JBKcn#dNWtc$d*M|2k(~wYdQ!-N* zcuFz(>A*qTe33 zFUtA_rW)3cFn%W9<4)Yco((JF`=!q?vD2pI zMD6YU$T-ZRIqyHBN%^e6U_PDFZ`XPg6)N-I1DXilSiFP793y5BvjXm#JS~Cg_F`BA zFN)yqVy>3ljN9$UDG3$tRiLo2b2L%Aj`Pjr zvO&MLMhiC!BeFXr_mZoDAQoq*uGB4p?ErCwR`C9@*S$lJ$Qa8t0rAV4lfbScGL{KX z8)L1gP+w<i3a!Ex}yQ>ni;UMr0~!Jt3Gm4 zQ<)PVz2{Z+tL|}I)YX%gb1|+Bah2AXLo~a3CgCtX5}d7QJtY_c&(Kp3HZX{**>!ih z`~K=jBM9)gOboJd@pfB4GN0-n>+t(LccEuesNU0vM1YGPnqcD+9Pj?kpw$RE_~{KQ zYLAF70{e1E(kDvHyY-!F(f$vr5|Wjw#DcR!*Eb`BeSPPzkOBuz=}`OqlSha#Of@ae zchehf3VDM%s8`ZnC;LV2ZDWww;0f91INA6A(ou7h-paXboD|Bg~p!HtNmZ z(?hOcgFLaIw~`VPcpfetRZ5xGNkrrc)n@9vTdVO6K+NI(wwMHnx|qkENs&wcn;!y~ zY>4!j+aALO&Kso)rSy&t3WKMK_T0_ z13Q^SGvzT9Z47KFg|69n_XNAb>ye^^yu#seTN@0k$HdI;r*)U~&iXZ?aL4o86dTTB zqvtkb`cB}l&sRLPCceq}?-5UYA?(gt=}1w_%SV@~)EI3&PTPyW!p}eR(L=S?=`b3A zg0EVvIh`{u!aA+0|59h%_lx2E$1-G2KeDQcuGh>*CWAR|oo`va`;@$If7UJKHhqe) z;EK{^@P2j~w5+Z;1V7wdRMD%n)V}ba$Sl{SKEMRkqlwleHxiQv%%v1~TP^%*ErP%7 z-PvI0{x~SPJ9`j)_kPw=$YOixt_@rwY&L*)IMNtFB|uG9NH{!%FFfElMA!WuCxV2- zPfMeeR4v;PKj6#q_0dv$QCo)dQHogo_V!cjWtR&CtMBKI?O~1p&Q+3#?WrGi-!8Qp zmnQBAxfC%b8Kc@fp)@{2CWwFoQ#)<&TdbN3ad7An`jPYcmgB8U?O{_j#hY5SWBH<- zwbZ0&E{J<>5mCb92CzJavYD&m;!m}p#@)TNgoU-My>OlHBXn#1 zMMV$-p=T|Fw@`4hT!XTXwW-xPTTXn&Jz?AGT&Q?>wCAp*-0a{YM0JS^x*G9lgIkMH z4Cvl{d|sY5-}B_U#`@Lf&0dC6Ns+CI;VUY_VI@){P}=uP$He8ZC^UXQ^m3|Yhr?)m zJoKcpmRdGaDxEmn&j=b0%;ZNniYDc>9CegzUp{eIp@FfV>`7MPnwe?BNnow25(SnW zfp>Z@TEkC5Qb6b^eR63Y8u+=9ZX&ZMxc?GA1o`Qw|I>auhpL1`>&BaIlGnNZ8LvNi z5@~nfl8(zGkk261Ml?ug1tAZQ1tG-m9hvcJwq|X?U!U8CMCc}}OWG_S)1(N?dRkYi z3D3zhU=qD~N#k&o{8bqD{WHoDd{UEyzs>AXU2yQUVr%QO?agt-7Sh*yTnS03m*;)0 zgdzwenSLg}qa`#XFn71(1OJy<{3*>w?>*TWPidf4`MYzA(Zjcyy*y{7YRUWKnsmaB zOXB!Qb1{C{9vbdVct7KExfk|m`&$+Ek`fmthn#IEZ4|h0ldA2GHdd+SI9-sWbPhIO zP!1sOZRZuP#~!l%f;J;YyIK0)d-+9~!noBZ6En`q6HHbHmLPqHaTt`d#v1OGbBMmAIef|O+p{It?` zq^)4tYMo@F%ZiI(e>nS=tMADADP6qp^5I#M<2DpWkLCtuC07!zk0qpjWpgk`uOOTq zUK2w5?^(e$GognvvqxyLucO&2$!cTS@94!bvNBV%T_zwZaoV%CyLNmvd~*Qb;BP0W z&3pJTI(E%i-WS1Eu3zx^@~&vO;GCY5Z?n{GLq5v3b|BkgPRz9Im&%(V_#J1RgLk&Q zD#dLpPY2W{%~sa0Q8k~%w&*gx!#CD1f8^BJt`bvXD&ul6VYkzSfjC!#RRnh*KM#o= z^N+r=**#sS@(AsTbL4G%lXdytNtD4mwE%Kv?-RQ*p-zKe9D&a@ z_OBm2wsbn&)XG-S)!UPb9F$2RXt+PF(P)|A82uP5^S-{ol`4%;2Y-L-diiVhrSh|+ zSon<2b2><1i{H@jF_gko7{%w)4?ANQ4t%qv_6TFh4IbH}+f#FK@!~ousoM^Sx8yst zUD;?KWtkK|daXzfL3^}Xy1!q<|0x-XN9>*Sx(ES^sOU#)E-mXp%QROv*%$Wi-Vf*k zqg+FX&go(X58t*N@FDXokZ0&13ZY17hw#az-X-kGr>y$QRLSM`UM%)k5J`e5FYU$^ z8rT@(f}-Gkoab&yh%w?FDk~yjXRWI};xLiE>}$(_qgZR;qa(OFG6ua4%}hT#I9vo` zu8`s1q{R*-_G#`qfQ5T>@=Vv>FV?*8Ku*i{X zH@?d^U_7%+Od(06_B(Sw5hf+x&M0-(FAzqMm)M7C!&Zi-Dl48%+E!tOWJQ&x* zPzTF;JEne_3DI?yq^+*cevZ`@PnCOyfc9i@zDWG5A)h0l_E%8|*1}ph#A)jnmMkj*q`C0 z)>csp39spRe|V#18#_z8gp{3=^DO@gzrygfkm2DMNWF!*&-AYmKUWvNY#|-rXgQFc_>wO*UD-)>AqBw%~}Qs>E}022@6PM z;`5Qrrj-?!_tg}v^pFp-RxG2=Ko?#XT$)L8xpDJ2!VWl=Pt3(}1;%Z`f5>9){YV7B z%73~EmRLKO*i$B$slcw+7(kd4S1xuPuy4kG62LSPGHf$?)7@J9Ed$!uMf^O_5uf$C zFW%SSHc)G4n(fwgbVbJ0MA=oxTT!b~(_hKA(;#df>-MGHT-6RzlI_jw{E%WiARe-> zgcmh6i(13E1oAmc_u1u_4mp?Kh1*p*9h>9Hlc?}^$O>&RJc)HSr~~(XLa7deejU{g zkrTaraO4jmLrQY%Nk#Nm(RK<{&p>-DYAbJ~LFHr2$dq1rwe#>6!9VxjV>EX*6lJx% z&`8lfSU<~IR~o!NOlmGYwn5e_fb2`wiJoq&Lqq4!!`fG*qf1HeYbGsMwp4S&^us3e z_8`uv&zg#sik?n;qTK-JyRqk^-(kT5wUqxFJnZ1{*nV?hctp4&qs2AJ*HXFWvtb>s zRS@%Wd1!ZD?A`XaY!@&2@$Pwh9G-K^+*>|Di0<`w?q(M6F+&mRdvOP)j^HJY#Mcjv zcj>9qIp7Y(c9Z4;JfT-J_H#R5_wf{9zvdoBF&`8+DmZUQszu1#Os{m;b-Y!VvTC?W zNJU{oULYDDpNE$GbQ+T;tj+1o#pqo@@}56+h{H1RZgzp(*5DCH)~iJ7qd5`gPgQbgehlfc-g54#5$T!5;X;rn zs2M^vwUB;zI$kvkraket^f67gx{eoY|1d>=iKFbUl92Tr23 zTUixRB@4UfxzI)DL$~8<`p2s~9OpxiFH5%r<1WaQK?IGA0S2F{gf3R!EYoSW9rlOg z;N#=Jv;h+1d+{*68=QvbIk-6E;LPUq^(AmiNE*M3WLs@o2~yx_iEpEcBw(%YM`4D?4Ughf|C&Fl zZ12}VtB+gz+u)^X8j?__ z?;jX|+|$2*mVNESf?nDVUCYjS>G%n1yd{Un?YiCRsHOS9z-CiK`Gglr&Oc;|%JDnx z9;uCki{;9X%hBh%W?O()?$<_;ov3dk{X#hz2i?UYlX0^GvH!(xr=+y#1K+_VOh^U;6dpG`fyK-#`i@_f z_qc8M3uo6Z$WoE5gn?>{9ENse>!%%d(~21>d^Ku(3h?<`qYy^ zghhzEZB{m#mPdE5%4S4_N%wu(aDXNwLKMgTa>hys!*Qx1owPcU?-Z6*YRnz(6Men<(>}yLOAmJTSsK9is32a^v!v zB?Kb(I>XPEm0+O!m=EPLke!iL5$pj5^z$1GiaV7MGIrbZ_Ma*5Bj}xFi8~5M-e5|wtRK4# z%^acVJx4%Hu9P`L=ijVc%lXc`0mFNfnIoX234cDmfgEpdBTr$E|$p;0n0XDKc4UTR#8I1 zXr{5qTke_LPfUKUhcQOjOUy(mcjm-zyl>%!XOF_^+wr2<7%e`A zjPl-aw{sA1oa4|!435DrtPpl@g~eXrV9QHz-A~4VQWDa{RaV;_NlJUzR0HL~uhNQR^o3#ptM|Iy+u{R2jhNi}Y`$$iZoImbVRyq1= zhW}cNwD>5e`!NAoX!ngn6zsdE|-K9RqNETPNAD3Ud=OH7h8aPTN0=kv|iq@%Q z1KtUnRB`{=|MJV#{aGg(Fsd6ulNxE!YX3sm{tz?Tc^gLnx3?eJ$K3a$*z0`XIDx## z8Jh17bB2AQilDou4CAYnXvDAT^78!mg;la+aP3Rv&`XaMEc1H*$;@g1z zlT;_Mmn2Ptc_O2;lbD`e z-Q+rgEWd}`v3`isN-%_UdGS{a5HeM9_TkdbV*W_J|3jQ+VL8E6Y@TDulfH&mYs`_a z6({zv35z4p6;|)mW6Blr)yyTA)hOae<>i;H`Yd{~adVhbPtWW-e;0^FqV1~s{`!jda* zQ^BjvB{mM)>+wwA46e>4Gg^mXjuV4Ic8@hZA?@zz=B4Pz_rO6)L~Ym$k{~A~v&E$Q{AmE2;AJu00-JlHk8$M#y6PsBorl7`b?0(H_tgb` zn^04$)1Sd&Us$87{ba?fMe7VE7V~3|&Dw+p&@kfKFfauws|Edv#G^d`cK8({-d4Yo<$sd8gkz4{Ak{FU_9n7 z5g|H0r{Z5xZgSR;sd?t|bbocs^PvCk>J|LvBVJfW!DPL=HA=ig1E#g{9m;|emU3x* zpS_w=T?Pg$(4SJs(sd0JS1Nol6g>rc)n+?rdbPT#+dI~g$`~3o84Op_i%LG29t@}B z1;L;1a$Ag<-k0Y=@MXL&|Bew9tvm1v6g#mwgnLTI!1`qRCbKdc-t*-N6`|5@-`EZT zsCSef2)bEV>iZg7Nu=<(z%Y<+!6=Ujj@T~~g+nPAbX(f2g~(M|(7Z0)>k$GQV>%10CQN=W|pq;b*mWUsn;;6NaWp<^N_nX z?FV(MN2%9EmTIlUMB23F(h>k0C^0Y@7oW|#Hvl#~LUY~^oTTx(j15$&-P#Qd%#@UC zS6%}X5d(x!z{0~IA?0_-nH85!y2DeH0>|BM&!TR^?wWGf?de%MUHhIQ{TaCP2~;sk z%-X(;_eBoe?#FGPJ%F4BqNHju+P)baK2y*V<+p+EX*gPPy_kEv{*@}!;FV7z(oqI& zAnXQ*Ji@fBproq0i$WBY)=9#vK^Xd@z@h?zL(po4c{*K1QG?57Om1e^<>2v7UyfQ) zw@-htPC!uxyQbdD_?=vvMxF$3*xE?{7KnvU&jMQLgG95lrF5a~L(*{`Nh)#^BX z6z{w3*+*NGCEbwWYDC5u!tUq@Jo|lgs&Ak3au`jLCv)5UuDy}? zY-x;+NB37xaDxauY`$$rrH|~nCGH__+0CrQQ_p($>&<5+22o<>Ef~4uSl2?N8E)PN zS>k8->B-Zrw0tYLIlp@E3S62kZoTZh|&#`o?DbkVK>^`+2C=P)D`5l zJ$G>N9kB4*JIpmlx)Yd#{Mcl5^kH7J%=*_bRr=dl63&kK7Pv&btC%#&pgPhK&Bmqg zUF0q0jM>r;)R#g(-!X@Cw|g8lH-x?2|PR z4F!s?Qq}1-Lcj&4uXHNuH!AedZNx+oFia~w1Mw;SBT{GW$C-r{67*1h>6*G0_d8Jf zX|)KrRIco>U?l`YhW!)j3q(*BdGbG5o%|gZ@ZY{V$^NfaCmH_>tCLJ0|Kf%Aj}G~N zi9|pm&iN-{2>G5^@Z*JrOIU_XTt2v6O5yhLC8I#9l$c8Y7jAVX+= znZ0_K_*2vTRAb-lmFP}N=M(H-%kYuyA=~!@i>#V5$463Io*yE)EzbwitJ4k$ z_RH~sL~K&Rg29yIhk(JfaUG;9*mxoBxU%g9XVZP3ZSy78l<(?I!mwG#g3+|#fWXoI z%h%?Yd!KN+n@t)-%C$Jv|NIxvKf}(-fjR8*+d;U8MLzDTJ9AYP6&0MfOU500qm`6v z`a=j!r(uvE8ZvxdRsZGdlDB8qiTrW@Ke^`zS78X4$8N0b|Hat#E9S#Eh3nJfEZwAJWxcTg2*TVTGT;6M8ycmsTDCr z3cN@oMMQ*v5fK3qIm5o5m1l+6vEA>xzwW(%-*3PDYlfEaWIb!$_jOx6OJ}rJ6^q9Y6#Rp4Hef1<>|Cyx0_U7`S(Jnf>QSdBWu;4{c|KrE5?N@Hf z>c-UZ>pa%fJo%_>{jov2ytRe4=IRxn{>XN8cVTM|9_LZn$jr8%|6N_Yt=Y!R+j?F; z{%k^BC4gyhV?uFymAm7D+It}$FRJZ)yz0%?N#{uJjCudlufCez&|7~nHpprB?%hrK zL*u=tzOCaj!bPWYuw8D@D9(Z&G(~a0)+cY7_sYx#59$g-Cv4of@f(lnlO8^l6h8TL za9Z&Cf-{%JAB`_qq|<73?o0FKLEq5DTKk8=wOF2UZK`*iHZ%W&*(*-TbTKn68};nw z-0(SYps&noXtaUg?1B|$(V_kpO+%~vLnd3;+$}lX`e^CUXXbbQS*BWY$S&z+;k%0r zc)j0jaO4~g80_EwW5ZGYx!^y}cFB_f96fyaaBy(&yYIfM%NVu(@a}>sla4RXtab?+ z7_TqBFwyr!LY%PMy4&Ax{>2fqCfLo%>DZg`mEqubk9uq0R`23A`MdpFvz{zUV_tCj zAAa=(Z!LUs-!;AGaY;;DXH88_Y;0`X44IQzwDtKXD^@lSRb4aBU#v35TF-D>^R97} zbs@e+j;f`lMVRW4R;jeD(y_esRfaHi`Idr?kQ-JX1>(Uz+|r)y+j_snC$XZ*CtFo( z<~07&pMC$-#j~&&xy&WkfBZw|ALoy1yqQ)$d5nur+L8IAE>3(H^x6AY4=tVToHKpE zw0}8s7_rJhl5cy&?Y_>;;wQe{FVNbW!&^ka9OwtSvzAxJ#m43a4e=$p3b(_5EOAXQ z-*wB%dZh1{#<}P0k}_j-GwcH;?;2Y)8|!<$zvtVKx%wQ=p$`)i6I~>i+m#kP-u}K< zErWxB)*#0^y$nj z+4kPelr2>Xg`%^w(|tkqe)g+fn0)kzF=yTA!wKTLuDV%u&BI^o(^D5#`t~nmH-G<( z-&@U|5TF{*ydwvMD)J8A__Y?_*lIuT#)2CX^V5gQ5)0}s*S2=~=L!;a`8VM=O8Y>Sno`#<_NcCYT<)_>B&)3f#Yb3T7Hc|nsN+WBo0RhoO+~R!gy0Bz%{dQEoEf*>W_X zdUFnTblUFYKWmZN^3M$gjWQqdo#!&ASJ^dd!qEDU9wp2infa3#@go6Q&iIkebmK=i zXE8q->im6v^H9ax{o{)Vx)BC58<0Tv7HOry?$CE~hQhn2#rt}Ng@qx2r8>-tvd(fc z^Jwh9{v=(@_pI;lQN=G>wCKQr19G`MR-k(ELY#N7Bb9lcep%?ifu5~}7oO;t(Z8vA zjGM(J>z(|vW;=}Ad!_MhC%-}iPFwb=zV`8d>{rYh*`2a}T-$o&(ljJ$m)wNE<@+!D zeNgAoe2;H?7X9GsWj1^EqS(^*_I5W|5lZTbm&xV4@;b=A+2W*B!3`DU_A zTv}GPG4)=``ZQ-yAjOS$n_ebdZ&(^2U21ru#5J^Vt4vr^UA>6M3yI-guTujfiJ?d1 zs>F)G{92EUuCA^W#nV4zG~9|2-EHzVi$2g^Ux-f=rrzu6**{NU`Y@y;-9U|~z7>ZE zc?%aVRJM25*C#046wRG>N!Rl7;#N(Yppc)gJ(ix&d}QCiptptM7BlhtyWjc!HOB~V z_QlJW*UERDENujw-CH4jT&z<-K(75ve3C=TK9OjSez>QH$2^hxIraAj1qJ!~ z`UV6n=8P#TEyZFZ3Cgmvu)ccYrGm_rGo$V_ijm#RcS+;ooSmI-$A|)b{K;?st#Q7U zu%*AhzpZWW&Yh~R+MuA`_j&Dg+|#T6h3gq-M!BX}d1M3^)FA>Q?UiuVe^cknUT#K4 zMr6^s%I1K;rKM+m>u&`x2WRUQ#}vhwF=KAjJl{3%Oo{7}Wc3&9PwDIHo2`E$Qji#L zE;N0roH{ndeL-JeYkt0@=f#sJPx|{G)UhA#(iHg@@vE+`-7?`7M@juI*@f`PRnsaf zD>JTNf7MZ@T<#NZi?ij^?dRD4S^d1TmIX+6*$DD$gN6nJt{E9y7#W{l#Xs=M z-bj9_lgWkt_^ zwzkV;6>vUhzY-;U<5qWm)wJ}itPQCSXA4Bj&z8F{n9FX>&1)X_aaAgnORapwsGCeZO5_v&ZAI^d)=5PDRpx zDZa~YHb+4(`@)J>vd4HcuZe!5G2QTu=l=b}DpUbdVd}r=A*?9r5+U4Vyb|5qN`I~O zqo>Lr7-0KjlQ*JKvf?Rft!a@xy?jANwSqpvMZ_d*UhMJjHvfl5Mofw8dAk|oMmBj{ zJXQ9;3Mvf1PFF9J&X_S4v85!U(Z>!Q+bQ~2#TWUtR*PY7G^tU{i!MHImjtj_n>Y2T z@?1sJr{8>@WRDn_U86tx9fYqs2l~6V6AZ%Uo?Zp~nW9LpY(8)I1%mhKRe^ka)9W{G zoUuNSyqM+WF>ew;_W;~JV>L^?)Y5(rP;apEM>oXUf0nrFhTO916k&I~mL!lVrbUMQ zMXY{7ac0=-01(*g*zscV-CgspXJmBrNF?0Sw}x|IszZ#Gq5KpZYK)IAR32M?)+6J9 zxA!%yl1w&UXI)?YQdwrW?vxXeBr4YC?AHx<$j;3j=x$e*jZvS8wv^uOb4#0=nqn4u zVq1Rm`S;t+b=+@<1n`9|_4QjV^(Vt6f%&Ix+!}+O3u2DTl^q=&yXFd#?2j%`Uc7kG z@;|;iT^pf$+#$t*$r`}+1$Aw`z4v#q8+%1)aPptuIp~vJ({T3j*c$hB}4p}J}%Gon(*2O#wMde3ykV+=H}*hwbpj^4Pf79XD^DOFu+tl z6%pu0jmI^kox69>x*yT;tSUW?ldNaPptZWXEtxAb6~ia}(F}f7gqPN4u!s%ZY$M3Q z-zjbsyKs^<2W(vXDQVr_pU6o9CZ_9M#}_!hcj|CqT?7&gLi}FcB?|R^(=)su;pOG^ z+76$gpZe;r2F8<;_4I;mZXTX6VS=)q`{0f%yW0+bdA)&vtssB@`@7}=ub4&KoVQC! zNg49yBQ%ZIxL%NHP9YOxqqx?@Sg?m1pc&)m{HGM;pJu--7X{l;8lS40? zm^`em9yQ@e@t@bJ-V2NVZ6BU7vIr>9c6rLOC5oFiTRw4AKVIDn zt#4z*H{5Bd@0(qNREBciL=Tx=|GDzeAGd&*FdH$!g2N_*E9%%8-mE+{s*`;!dd(et zVBgZpF75F2$$v5A{a52>BEqyxxSDRt#F$p4clIV49gW`a6am-mn)lS(;@x-Or3)ch zZII}YLSwK*2cQ?Q5`pXBcVE|dEQ~23n-TE$M|n@nQ14cQ#OfAJU~>3Tep-NFHS}`` z8`QVzfxKwDc}z@qx$ zF!HeV`KuWjl^z-I9{f&?L+QD$C|sgAQn1CFD?s5ys)G}s^{+KBcHFdS^?5rQ2r4Qn zii?X;?}K`3SIXn3j8gBNO1(X|vv8bl+_;gGW69%vF>ewH4tzdG6$*rQO=y1F$;D-M zlr_+R!flh26W5S^)gJ*2oh`pm-J(BbN(&D7o;`Syyi8r==h|2SB~n#Y)n4vAAq)IM z_*KWe{QY~uBay{KN&HrfsGcwIUMiR;Z0T&S1j6cTt6P$}ah`DXEcG9IBue0yV%LVt zk(kR}rFKc<_S{BA-IG|tjSqLIzJK3eeZVuSryO5i7e}*9xSq~B4bVtY&~$-6h?5UI zN6=PPb@c&&(EQqk^ciR1uMs$mV+I0C!XHXoqS%U8K|+>9bnSjw*q_J(w%Pdm8|)0c zCQPzN7DF5b)G6&Q!ib@SwP*A z>VOT8`U(3f^BcOs)=I7#sTvy2mG5%*^i*~906(W~6h975UKXr$qUb!Bg)NqAa*TFz zIX)J#2M-=3kpkb(@I-eap9!mgqa8h1(1o54Z!J-9!q`OOU4BZ6vr)ADZgVGoC)XL< zt$mm5-Cl0UQo~8f4y2r-;Dh3Blcfmq7O}7T2C%o6pIu`X?Um((%6ikLfJb|!wnvh& zVT-nJy)cQa+P4X}&MMwH_(^t+$ATELVz*W_NUlWbI%5;kL*jSg429gGV~;xk454JP zFiaGt0)4xhpS}>@(X&g2u=;aYL$_P#Sc4OD^~1Ako+Hze(jfo#UF z!My(~akR#>MR}-@e(l;Nh1R^#x4oJ;gh|1;^<3hX$7hDcjL_XoSo*UU;5`d zq^wJ;v^jsbx7XkNbid?+(4D}LpO+jObo`~?h5LKC$HvH$6mErE=fsqtXA<;Ox%8|e zqNo8MLJobZLrP`y>S?+w8r0|0a?`aBRIgsWLIDIiL+jvRIUloS9i42S_42|Q4^n>blGt5{J$T^UvK)H0k=<~#A??RTDmp0wL$&e zA_}3;o;?fNfO1XfpyjzxKvSNwY;_oh_2yV8^XhA8^& zDXUy9~LqITrP=(q~dxzUu3S0ip z7tFIaH5n6qXcQ>O+e%SpR0+3#2whXph%YMNc@(l^*4io~qu>8QIPI?8{jZmeG`%`| z^TMH_)|~ZXV_#0n6qn+qkBdZ-9h-b_s^&JU8I^AZOK0(#JN-%E^~v6p>VO)`B33YU ztksQh-N2D=tw|F4jnx-Si)=e_!M??J$e8T!zYYCSBx7Lb=yzfTiOy+oqw8K;TJfGS zKTP-b&9deNMydMq4i_sHQ>u_eUDpl6>eL9$N|pMzHVvnelJAie4&`_cVAE-HYj z&*&2wCvbL>6+qF^;sdarWPiss-6~Q!FJ?7;i2OQm)968^SE2Yr_1@$SQV^BNcJno1 z9rD_Mg>nQGF?+~rj*6w7{)=M;eFK5nHJ2PxdL;ZkROJeh24`@2{ID&Ok3N>QPzu1*M%zWQt`05m^7%^?K@P;Dz}!cKosir{G4vWN84 z={jiRwPRj5Zy>2ouL91gZt+1r9XGOFByD}nT_Y3DjIyw_ya;}ZiM}-t9&k^n!Ng_V zcJtD$S0)}`j`|9C49u7)>AvqmQ9TC)<6}ZDxi0|5xpe8$-s?=C@iV; z$L3A~6XQ4B4)Ky=2im8;8XV{gH?RsE?B_{LlO1#$)iJyO%yc=J;o`;@y}cH~+e!8_ z%gsyCj14~}igQSrGG$6G^!)w(l6jL%^+MY;?`?LdjRJ6M^T(h>0mq!oRN}1d<~=`{ zmoA*et8%~YXmYQ)69L^ep1(SAt%421v)^yz;@mBWS#}-;XzJ(F`?ntf5r`6S6xlUn3{W05clHhrJ~U^~*6h#}1#;o8c}E?@=>8-` zNztAdz&A5I@jd11V`DdM+Ek+IX#0fjd>cu61c*zlJ+>qvSB5epI`$&1^ddiHXk`DCNfOPBjB$JqHcYBInEhm=^U^wxQ|F!nI!I9-eA057X> zo39^!fDlynGZDV#@&x9mk6A0Qore#~Od7O8b{Xx=b+%=@CHTVpc>EubGN+Z?+LOtk zcoc5uDaE)RtB9aBaWq0F;I3Y1dx*4kIj=5}knLo(!fX^KH1Js4r(Un|m=LWtL6h*y~Te$U#bDFP3?01_#jwwMNq?P#kdR-n^jCqq{2pH(#2`2t&+ZL`RqDNhpk`0H8Ue1#3l;Lfe2P&X{C1}Y> zB^Y2pHO?3yeKvQzQh76#cT85>y0<6-kxN_zkciyi$Xp2`Vnmp#9AG zla702EaHqort-;-(!7Y1%8QlFP2TrgyAY9NLTpQLYACqd7q1CJJ&A4yx(D7C2fy3A zAZE{kn6?>o&lVTTMJQzaET4D!c91EkYZsm7o-P(F3Ia?Y5ia>c=m=SlKQ6uggD@|K3#@AVXmML|B$K%Tu#vG?{*+nlp8K;({HzX*UMhv1w2?5dz zLeu!N^(hLU>?!M0XbcP7K;BW6yIxeX!cF$+H*JyU-EdR}dz;gs(2xxF_q=*_kFJ!< zs}~&OWC!qUL4!T2^71v_4AF(uG+nM)nNiLUQ}k5aa=w6s(}U~@dvsXez`#IX|9W+c zI4dVFFE2Bb%jaLRpBWq+oMiv>(W6H@trcTKmV#95c)VIB41h2|9&XUdLYAD*Pbwb( ztUi2*GF5~0A6lg3RoR@)!x){ zf7kOG^kTa|>;BOvdtEY1F^{di*x=;sjK{=InLZAD%iLMKc5}hRVpT`2>AFZ7^_J#D z%#AM#F4&S$jh#!#e5ginc0PXZ_RYP1V)Ayz^Al(cGe)$A4(XypO1s|!Qn;gWm7<6% z5+&HlKIX(73PuOGxY1m4herGV#*WC&zX6>5Z|wNr*ztcScAS1EBv~6h`mmJmBO~XZ zQl`-a9Bs+x^DQlrZyUw?Aqo(QL=uTplKmJRowZ3n0tc5J;`+1g5FfKUnuN5{o=I4t zh4p3jDTm_|fFOd6>*~-fOSFxLXv;M{D?dNu*joh4wiN>?AvsSvj$ni0ewUF7?W!^p zC5jLGWWBf?g0L+mQzgKc6pHzUcshu+Y6igm(@|2t4~&mBcJ#EKN~W2@+0eP@beRgp zc6G}F1|gww4PHkBfOv}*W#70l(qIi6NiXXn)<(~Ec`c3KQn-~hFrbPlGYi0CHi|#s z@1Q+vCPu!o>@uj4kFYxY_X~*HBXo=-S9X79p9}=gigt$nktswBMu$(3xRzO~trA1k z7hmcc$VY73(*5$~JQTlCwDkS_jo`4>J_VIRU7|X8kJUe-s{4yIeH%vn69B?1&Xyxv zq*s}!c@e&R#9LcTn3wSlMSaP%ra(M-p*#i+l(+J zH#c_GG&BuSY(oMu@^Ck|lvFZ5kOHg9JutvfZq3$XqY8_;1Y4ld!vVUPGNtgmTkRhE zP*Mqh^Z5mZo3XJmY9Rm@v;tcPy~r{B-O##P6Xnakfyl^6^sg|+UG;2kG51QM!i``6 zI~mKu+W=#OH8P6^n^tZv0AM&JV#>;ud-I%&@O7YULAMA30tvs?eL*t2UjsKdCF6h+ zu#N^5g(g8xpdc9}45?zO1Ms+0swOz?An#~r`UZQZeK7LyP1{q+i&Gu?n$z<6lJ2&i z4pnvaM!HggRVbJNCZnte)J1W5h_u}=N0^$x(X7mDzx`=KDHup@szY-@unsLbCiqJv z5ujcuZSw9diCKv5-#}j%n1mlwSa9~~nlKH`fp0<< zFX&%FQ{io#bS`3pt*xz9K<~U*0k-PEK<*9};k)RqPXVh?zH3}+182$UbcpzrWL^uCBaa2KF5qUf7y1%qz3;)Lc1 z(^KEKl17gB-||OskGUnTYw3%t2BmXs`CsT0#eFH3k`+KJ4|smwB*=PVN(NUkWh9L% zLq~qK67H(u?3_1=hI5};cSPW&ye(R~`tZTRRB$SI6Ofeo8J3E!R=FqHyUm+a6hui2Z9ZDb^tl=Rlt;9zFuBRDt!^)Sp0hothog?aJ%_w(q2ukvLx8xOqq(tDCZ|J zJEVd6L1M8T0XIWeeA5xPD6 zyH>iIS8Uptk#_f_%xja&2ivAe^5#A_jxJv8bu6-h+pfz)s0A#-344LYc$+L!xcVfE zj4VW9y35K5)7d^pAQK)B7hS)8J#gQ#4tyiKq-QNHU?Be-T!014qoj$S?3}$CS2(9t z5DRAn4x|K5nm;zsmB&z3*IAcjg+(PU49_QqShQh=ipS5Xp@49Kb>nZ4=z3{Ub3 zfzS$3wIb+!vg(gqnp$`QP9u&g$zxCihRL_tvdm*n;p77fdIIu`z$_LNEE%_qto0O< zj#0})rU}KFOx79k-ikCfc-=4LX!3ZW6-^%hUyl&t4~79A+Zn=5W6CQP@Z#j>82v_Tph zyN``AkiEw9idKf9B>(2~?k|$g(5-125y?aWXezLs(N;8zCVh}V3ZkMA`N5vHy-(@2 z-S5XYNI;;0pM+LcDur6dO?JjUWpShu49^zs#Y2Tq`V?+`pWir<6LQ8D%eeyX>Zy;j&x6EZJBd1ID9(Q4@EbGND09f z9u@{d0f7>{1`U)K4=oF4c*6(LoRJe0$Lld(7S9NTcW??2U2DI(quixkYrSatDisozG+BMJm{9QcO?uc+kVrflzt^@}Mer zg3r)jLr*2KqESpwy<_M(`xdk)0y)5AQN@iCe!L(tC`yS_ijMovozOQRjsm*1`$-T7 zDK(Z68m_6?koPxGqI5q;b(*7=azLo-Cd&&ll&@s*<76W_7YBjMQN!!?Go$dQ6OX&C z4AZqbvDQQn>_28=BHd)brJ%{I22^ZzPYvYWhF}F9U`RfZtJERTPnZfuQ08c2pQ6@h z=PUyRTXW6P1cDFAv9*BG+oTZIfJAJy6{A#iP2azF?_N}*7#0wwYJN*-$Kpqv2$D(& zVjuE9rd!Lb0_g$Z$e$BxaFClQ3>6aaqf@fFSRG}fKvQR+qs)q#0?QACW~!5BjFjBP za>OMtYf!UqO0usv7DM@1QnFgAi@OCINN01s9ETC zgHmL$Y&+TP~stb!`|s>J_alg?Op4kx^P==SE}a zqseF$uRKH$*Bx*Ig@wz8!K3U;TQM`)1r4HpxUE2dIY21(k{JpSng3&s!_9h>0$Z>A zDPGL-0hjgKS2DSXk=f-}G+{*`cmN7Y`Z4VxDX0;)5J}O5;*X6^9%veRo9wT){11~H zfa;*)t8AV>>9}3eNy`%*^KPxwXA0^}Xl@EGYrx}i?4#*NA9w8UUy5=I6m3bPSQOT= zL?%SmK-gt!HeT`zL9hX( zj|~k*i@^RotgQtRNBUSm6|G%XL4z1#0S?1_)#Hiy9mEpsNAURrt#1?I3JiWMMIBOfVWq5>2Jx zwlYbr!~h^CB_7EK@x0qTbyJbKAdW*@t;MIT46H^H?Zae1C4e=IDZ#-c)z{E&G-(;& z{|qxJfx^^RiM0Kkf4AC8%Dsbti2h4<4S(_CDdBRuI)0%GUug)qz(~Y9q=D&2Ne|e9 z?kG%GATjOU-E8zx80|32KtX6a%= zx`Jj>h24BwV{M#j%ma@BY6af`Jw3FRi8_+XPG&(^3=zUG?{?3SU(^EwGBn2gEcp=I z680#GRLeG~mJzVAkwOa%C3ohq2~~K@nCasF`^m|NXbJ!guLIwm5Qt96cn2B+@f=Ga zvgpJP5ejmf{TyS6XP^MpE4V>R`1wau6baK&%Anjpr^(lMVRSL_ijKk!022kdI)-g^ z)GC(EigbB^?MU-erl6`qZy5>++9|@f&}SoyV_GZIdVP6=V+^T+I@RB6{vxac0ybbO zE!_1z`)?O$Si`xr^88JIR8hfzAo|gRnRvdsz1>44qMMf~wD-kUXX1a4I+4*7F#EL_ znacv46pRx<)P$o%`trbUTzOBk6*9e9bahP)iY@F7>=2y5qlR?j+)x)(|DMELtaMde zgis98VAcF{NllFEqWdI$xRwaH2x3&g3p8VikcS+W$6w$y5}W{OYKj7>I=>bm4}(~2 zyuPf5Q;*JTKNn3*nwf`Y{(B_D$mZk6w{=-rqUQvI;U*;p94HaI6 z3@r_dWT~lz)?p$dxL`Ac{Y?C6+sO*x;y}YhQto4>#8}}5d5?~cPEc=|I&k)Hd}9b~ zzb0&fg71ps1qXHI>lezEha~K};s_0W_e6l#+j1^5LN}FL8{YslSK``1qpQD6m_&c; z&86>9=S1T?W)+Z;5SG0yR?0Lr9$Mdk>ZPvfnfB`L>;yH3sEQB5a2oVw5YsnPw7mYn zfiT_mDLc$h=MN2L+a=wyZ6I@tFPaF!dA-M!tR$Nltz~$ag}_B4D8`n;8Ykuacum z8+uv6!6*RT<@aWlih#2SfruKFv?4H*YJGmt->^u8N)mb%@M@NpIXOAfGS!-KG)Uhw zM8)|UZE_<$9aDFgXX0q+>fB^E^7Erv5+Y}lU9wL=z!WQ{^2b~Rp}X?$ zh;S84REg^-_RK?bV}2SWH7!ar)R}6q2B3;!4#*$wu?ovo`tqJH*uxIG3c?tabOHec zg_cx=s8=*cO{1#|x+rU-8SDC*j06$PP$b$FX3-eMC*@Efq}CK=Cz60K0qMK_9n8!@9-F{cz?nM@7& zdV9~~j8S#$@7DCq6cKi6{TZ+vX(_2IHLqhG1uK!cV88&{yt*YW9vU`{1kn?mAF#-R z81#e)7#^&&lPx8!GE}Gih|{)1xR(z9{4MBwhKegXiGT<(pig#yzrTfk_+oZ-+Vni1 zX=Eq;)4--64XhbQ+8N$-NBR2rpq_?bg3YI#TvnpC8{#Y^4Kj5<^^yZ2x0;L;=yGz= zi`-&lf_X^jf6+Pq9WC$h8cGrbfvl4MxNtP56uw zV;ez;dJVtw2M-?xJ_g)FSLX1ibr5aQVl3k`ff&OEvuDr7ci70#VMvK+_GpSfbhpgR z%x-Fw$`_YOB05^CGtemp-GbReOh_o)>{4H?3e$~FCIK6hJ$j+bx=(In6Dm_CzwzV* zc9M<>!yg)%5Xp6>J>G#va=nt3TvK!c<}UFg!3)wc!8Du6k$oC=a@_iqWozcemnn_K zFi*fyge{Sm)F4>_fZ4W|2m(=8U)CR%|7?md76Z2L@X%SfA_?BfX>soeQuWd%ot*(YEsE!_1L`@Y<#QJ~~XrPsgJkNOP`bls1H331wfp0@Pdk@#-6P}vk6NreQ*u4pcOzbT zO=wD=&$DX}GsHYtt<`=GJWSvT#OQJ*j5FL9V8@~zs`Qc;Z8v0bvEKL6y034VO| z^0O4AV_?}!YBlH)!?d4Kks_S6cFC3P;;dr{R2$xAhoFa9de?L^kV+Utv_l{?4L87V zubQ@&l*Et(9$yYBF1_lIEsdmco_*X>pjym@Z2ou`ZC%?X^__Ryh)F9lX9zowChsE! zb&!OoRnlEP;fm=xjQ+PPkujJuhX|I_ImVY5;T&zme7Bh)-uCZrqL4@h0ug5e+ZnQs z_I43VAd2u1Z!uC@bpsmUv2PeW?!2$BL?p%}H%6|JT9WLqpLerzx37N8bVG>Nm6`Y0 zn2M+#fJvC_Ay$THrSO%5q;12lq8-0?!$jAguTO#g6B2^Gg(8Y}pyQtPped0GQSM-WN165cu~sL%$YOq=;tJ>p`=g#*H|(@L zIqF7y1U(y;6{O9zXWTN_g1}S)14KbV`J_Q-KU0>T-tkXFX+~mNn|lD9vAX@elg8At zaVjo~Sk#>rP4j3>ouhC=PYHchbxZ{{OoR+5JUHwbwXC`>+yfqaT4eXsM4(+`p6A1y z{oC1aYH2z8^>FGX@s043NFEH&DCkHV+{4vvl`X?<72b7Yrm(cshXR6hRiIQgKP^Fc zSJQ6jsz4Pv+*O&)RMgNlzqYCOK@9&_O*93Mfh;r}O(&ocgZ?vEE6$ijvCPmcu{(f< z_gR1xq3%mm;?|B}80-Fm!GYF6Tx!ewGc@YD0zzDf`H}k6FvqsxfsW{UICz1NAHX4E ztK)jwMfwM!5Kk5F&`^l3>7d0n{W67^bFxL3heTk08oJ=?q@)H>5X_1%wMuHg4YiNC z@B^?#|2csIu^lyKqKDudyS3xcA8C|orW~SQEalbGXqo+JAKgYd0(#mjX&g)FAedEpnrvt31=Fmk%C1pln2(=f-5rW7NxmdYRNtMp$;z5f--H0*s4x4n|mLL}Eu+ ztTsxHK~Nt6Npq|KAP1X`bWf}0qQHMLZ3pmCtb7?0i;x{?@R8wlIRmt?7cdjt+KMj9 zo}~LavqjgnqvjM22UbRAdZTEJDtlQohiPbaw{N4u_rGtG?qNDFz+nO1ZFL>0GWZ6L zaKX^UQaX1C5cGy{Xtn5e7GQmnJ({G@^Pv|Z&Kg}y(>D%3Gufj~T*I<-9gY&mJhH?U zNrAMHL5!wXt)dL47g!Jf+_*B8rj2~Xeh*$MCRo791v+X?uvp#g(54UvUp7?~79Q3F zOXcZY4FGd#K#T6xs|814Gqn#AWp&yhV`&)rtE$?+>dUk1+0pYt&{}9vpr_z%ah&#% zSH0dxhVu_m?!$42_K|I`r#fsji$bd5em8eExHmHpXz? zy8Tuvgc?e4(qIu7>4K);EDB$B84^H4KZTOg2(RKpxQEOta+70Rp{-om?Zr@n^JeZ5^ z3w`=?pKP>+>BOGjCnA|}+%ky0!SIl#DUb_@uuDQyGmYTJ+HrLAFc<24=T(Rl)ynBr z*k1%V2ckP(zz&~i^^tQfdU{EbtP>l#Th`F-!&Sr{jAaICPweIYgNDQZ4>65Kn_mx* zO@Xh4v6>8CDJHn^oWou1@r0TOWlmnLnnZL>4=)n|aFzfRffDm;4Z`JE-eC^W23QZu(wGtme5g1;J zwB6&E*P`Ttk_0tPTrGeJ&;hVM|2#T*kI~o=FzC#%hcL0?gE7GsP2RcAE-o&?I)l&i z|40&HTX@EQ4h#kcKBq`B zRZX1dfn(^yBL2Wc2D6UnX`D(PxV&ah3|ka~66=P!0#vyuzqP933W@JAG@xKZ^Al;O zAoV<&s0yTA5lc%1{@2zsvXJTg69i?#znz4khB=I9Nf|oJ0`aiCsSELeAD===#V`bB z$mNbNr@a&+mowns4mo_9C|Nq5*JQ)`bEvN}f3S0t40r;UvNQh-efD#FxXoIDAb5{h zd;p<0HlEi6yl3Z`RRR{o+|tlsS3WQeDo!wvGigC_M%9&^Mf-W<)w4fmrz2|tDxfKe z-@{o$2h1)Bj}^Rx)5_wwenSy6^`%ZyN@fZN1dje%SZXn_2EEIz8P$twKIOj@4AH`6rgGLNQ|YE(Sj$SLnHnxfi%&KX$p9Dj_S9Sm1 zMs~i3fCD9Fg;;u-%Ch}7ba_c(ie#lN%XayM2Fzbaa{sxg_Xb#)*vCUZfkMcBA7E3= z(a}F@O{gg#8G`54`l1q7gGlWXI&CkO2EG_o?&ul7j;GUKUB1CYMc$)q1ya%imBrw? z-yHOwS3QOv4YO(JBf}B|>Rl(Zv(xE=<$U>zArBNHq6^42()5HRo+yt|n^QEbsy>wr zYN}g=jyYsrq#)_v5T*VcO(~I8D#^hH8Ho$Y5`8}Bs4MwO@LJL2o7;A388^Rvov6?{~4wg5y8N>?m zn*KfXg^5tFLa+&`3xrHX+pjvA6)dDJ{a>hv-;#4{V;i)@^YBM?U$B-A0djsG^ny&* zRpX_?QwD+300Num`K+-{_{)BdaTwG5CIl-)(B2|Z9nB~zKi4!(qh^9y=6*Z@riBP^ z&^>eN-MmK{q`!n547%~T% zITZI}4CU{U(iYU!s5q@mGz_Sv{MFQ*=w=bRh_KXT$Ww<>X<{gv{QW0sm^Tu=7zGlD z^32SM#6}SgH7N@H?=`X+bi&&_Hban}Z#+2h+EPL=07ObyqmdGRhbo@}eYMCf zMB4XJDe^WX)R?dZq@zP6&YwG_>Mbh=RTcj|^t#~9QDT>h@=_cy@6Nh5fEFz99|p70 zR|5=pLh&;#l8Pv6AqU#ax;D((QcmYkW;a)JRG>D#(BcqtF81+C`?^{UATQcNtIo6! zX+r#MOWijF$p7Ckfy0&U{~8mBD3=C?sIu;0exE1Xs#Wf>!QB2b+D%puq?j;$RJ$a5 z*4p8~#}lRT@dxPa*s@!44bcSATPD<7j7vaf07v!rVQU6A83=Q9S0{uXrd<(L^{-Ka z5J*FS!bi^p6Z=rmYAK}W)lNZ6s{qaoFa?C<3#o_u?`5qPvkJ-%l4>`Z#iB)^E}>qL z97EyJk^Z(SJ5tLdgTX^3t{RBCZDTUJ3oFj9q2j{mV$973hl`+4g4Zutx2^&=3^Ghm zuifAYHGiw>plxOO$>bX7s2DqpzKTR!;BugIjbP^Lgdap|QV^|zcMtxZ77wT6YEv)- zvZqzVOg2Lx)I>wvztlae=|?g70+gUe&SX{{H31xs=X@l9y#i}}0NG>RUT#bYD#VhK zxD=0}4_H#=~Nb2qF zOrc`9I3-qfxER(sXGs-rHhP8__}=w4FF{si;Fgx=wWcGwiQj znzti2>r&dWokV^A`yA)15sXzR{76adMrdn{v(M#~`eHU^|8V@;x6(n~n1OLJ=4IHP zU3Ag*Kpzex&LMN$ckSlW(U;~3hZK-q;O(0`i6@G{w!!kxqPqk>V(xB>pFW?q2ppr& z2~ES4(~m~z^1xQZ@NVScsidNwK`ZL~#bIaZ#LK3;M3FOZ609tUw4Axytj z-7PMb13ZE+#c)}jM)H@7W-wDv@7Hp`$=A&E{qK|F)Ob*}-e4xmXDye8_aGUTi^eU( zX+RH^u0V7Hx5Z~8#h0&X5IJLD)j@liMK~0;RzGM@{N+Zl!fSX5P)nUgF_Lnc@m)?L zG5UtHIEJ}IqW71r;m9felYIvI(8VR3q-Tb|?nPM$TC4)BdV~@d)M#DfFz7(=$23id z`i%Z=rHzdOLQ*jYf)C&k;wuw$O8GV_{9&OT938it!?6fB7@rc9X(DIJI)HoI5v0UXvAN#H_gV4#GLIpo^RUZ!2l9)+>4IC4xR6Z?5@bWfbq zTAw|G-JvHG*i&znv(tK)eO8ibJ>u&M?V;Le$}Uwe&{_=e2*(5b1BMkgH$cCI*f@yME9rnsMuc)IA`0v3%}k=ya~)_8VNz`>nMBF10saP01QW_1tOYj^ z9x-d6W1|_QNjq_=;RjWR+Ny`p+jzsEJLn{evHC?1GjI0{Hxx0JpD-*ZH8x4aXx>BA zkI+(p;X6N~xxbl6{bw#NyBYx&21BkeE%M1G1sbxzs%ahReO!zfe|0kXFh;nyn~yM9 zX^poK^ap~qyN5nZWmMM~u%=zJxbOE*sy{~DS*J;m&phAC#CN0&G) z^w>(#<4?b-*qTNIEiJdLm((ZQl=3yoyb@w%b4L4F@a;vM6>CuRV5}Zv7GPPv`P^@R z*xX6SDH?6=?C$m>y*|*b7gx@UCUC=O{ni}O zpq6BhdFP-1`aLRbela52!=t`YOyrB+*)@ z4NI&2zhFo++b|_bR6;T>Tqc%6v5KsVaTH=_gi$(p1kwo$;nZJ@g%}n9J$J@ir7jJ5e$T=Vzxiqr~hCBDVngWrK``kH8@ zq5OqG7kXDvI@c8hqa%vZTkSOAa*BCh7>>ih&-M@S9gK?^Ric&6-n@-PGsca?c_9jS zSX1q=h)t#h;_+)_ATPK85&$DjZ_*@P*bHf;h2gOP0t z9-WohQA}6BBO@DfAk3|msp2;jt&CQC=OBjxc4_|G*_#-j2Q`u)v#Zdpz@~`NX+sA^ ztOU=Q(1iCb&~_~R zGbTgc5CB((VStKm<9v3;0;K6{X{JmSNd$-m+7rz8W)-Ogh(AZ`5FnPQ@7(}q0ocSw zSu?IsL4wjr#$y86(0rr5v==wm8RKqfi}UfIj#KrDH1s1ChWDfKFIZ5ZvS8j|okl zz%KPVvUqwr3_?IL<=5uJzMpz?o8H|44LedJY*o-U0p_q#1ZIXrG9)P)+K3kr<#~I1 z2L|%v%hu81y1Q?Pd4e;_sm5Y}9kl^s4;ev$NScnIRALEO>}0;-HmuZ&%$Zw`%7_Od zPC9CHsZ?06i#lD5S>4IOeee&GRjfV6;Jq$0wOS z1E4S?K(t4;5@$itH*oni0b-?!yYeI=x>jU-M#JLnoU7|Kqkb{asRN8q7>nUN$geS| zsD}AJQy`)Mc~fMoOPmS?A_JZL{JKFzPzjQypow= z+bAMRYp<~e%fBI`8uv0`mH=%$cs87aX9H|62ef*~lbRUMhJ0c_hE$G4cQgSY&{Thr zQsG5wN%u@6qNMmp6!=7(K?q7Xq#=_cv=AIi$55zqmvHJV^%%;}(SlVr8AV29r>?IU z_#BoX>f9whhr_j56OkbLlQ9&Ke(+$RqM6Iffz~U<<{|&ge@ZndP5S9tx)6m6^NC2^tz~{69H&NB?*U>=dEmqW{Ag3poyz0K&-(iWL+)ARb4*1EF@7)5DsY!#aaaw1b=$eTuQOY2XUT1PiJD z22JG1caV-l_=_eG9;>SlyO7pwC_#QP7NT$=j@qP8fT?syX;j0`u9Y_M3S??8HIzXR zHeJ`Z<*e}E;~FY$?Z75^Lpf{-B0}MYJ_?t|gYS@bn&{raysvgJnmIYEPQjgwvytNz#UU|r>B#0{39cYL@oRgF#h%>`;zJS&YEp02a|c@WIQ zi9_PjDs%x{=(_b^o&T5{G&JB#hFb;#T_|^AorYPIWX0V8DPw#H+L2myIYX)m57>{w zl!aTN=G?Ew&1sc*FL*n+f6RGoJ$x`AVjq6VkO|-=*Vb;lt>!qp=fAm7M&Leth1@d$ z`8#+?aDw=pR0nzvDnENeo&3TMGyA1v5I8e8cOQid^MR|GDLtQT;8HN2xX=bJUqJhe zJ9NXNM<1H5^P>N4=iMkNZoE>LQbcgAhS^Mu1vM{>yV@+7;z-lH{cj48RPg^-D8QHb zuQ@Uhe6ePn+K>v|FJ@z>k8_UGHoNg(OeaT)s`KYO;1}%eV9=NF`Ecp{GGThyHrg?| zp=Ol?iO|Bp297ieKqa64!Nm#{GPKROM=7SnIc*_l%uZ&wWMsUisq73KhD!iQbDJny z)JG)#RPuS~Z-%ERkTZb?oXjX{-F@Oe7ydAchby0G$FtH#?deMHfzyHotHYI+k&IrP zoU7`VR~g3Qi_~$&4t&uvT%=&JcrhlU(-dwfy>%ul?sANICvfv8YA4^ld%to>0l&1^ z(z3tFNWtehFEhPq$1z7U};pJBHWQ^s>KA{pxprcQ}*a_oc(p zf7plJym)VD$oHY~>7rG>E#mCLsH+d1D%aos=ZN^$V|~B>345SmUwM zc;e&$E*7u_7ZozC2^sALO+d8^F*#@`)}CXS{ziGW#Q4CULZJOp_RTVNX*4om7vJD@B57KtGc_f3zmnfK^ z-KuUuPm#1dV9()_523O8o*iO~18Oi68>Sav2JFOX`Z(q`{4>}?ezD40eTJ$wHA9>aiPq6>2) zEi|OAhb&QT!3>i+TxA5xlIY(sV;%QB2*>^pSQ*kQ{csE$ypyq@-Skd+b_Ntf7x@eKmLqf@PoL|Ti z3wZ((g9bcbYnMR$0)1etKxwB|0LHCNeuZ#~AZ!r}@f-<)8hQHGw0|mLym|@Qz#=w1 zeJ)LoJhGVz}q&4W;=g*;wM$lIs;zA1_ zU5r~wVSI%39vDPN>~$XpNMhBh#-Bw2o*bQ6xb&iO@c=#By*ZcwGbD97{huuSm*dGr{^J&(gyV$HB>lgbL?jkC3fpd z+(!m`SU?JdQ*xseMmrOkfekzo;}3(;pK;45J-1*2blV91WGoE4B~cxMRWTMzU0{@` zC5ovWi}@6X6kLYY+69FT85sbqfj4E1l4-UuX55Zwv(QPLoKqmqEn)#OKp~Ur4^|IK zYW2V>ZYU6zVeEkVebM8OS>0$Yzpufb;X47+jP@HsngkIAatV4%N%oA(p|?h$Gw0#~ z`pM%5q|9BJ(b_8Q8~Q3PY9+rwt*-LW+jP79KOY7GDkqKxn(@yaqXCufX8V~oHD(9t zCQ%~@9L%M}13-PsyrnA zdtBgqe7O?USCRwZCAp|d;}Prdrr;MMSGb{G)zUCdd(G4a1+jq=(l5&skNPDM0B1-% zFoH&x1x%)MnuZ&6MEH*tynFBy_MRHtiHGy3vG}6Pre*QP7zp7G-HI=qlJ601+guxk zJ_coaUpC<~a5x;J+SRCVu9UzqhDjyrz;~OtJ3!n!Jf7#gxx<-RgH{o2F?xEkXrx$z zraoloU$TxB7+-@a5Y29gV@VH-x1($$SZ>M3A_wwasrRk_*)YZ&}#m)nT`%=j`}0Ij?l~FI(QU2{q%+#J2|*AtAZj zQjO;DxO3Z$Kyoihv9>mQQ@EEDM7X7uwq-UQSJ}LXPT5_jQ+dDbj~17{-e%#+G1)P+ zTRSKpA~VbUcuZ)(i4#>eItvgS^lKY9I9DQ#WACCDMyh4n(=1QlhtK zV1N$-&Kx%KN;4v5*miT!dXP%7H-#|n552KmIeNylKdLU4ozn_5rr9wz`f|u)Pz^%_ zLpfthhw)g&zsJ9gjivi~ z!8LeiW4if)QbK~O6ZJ1V0?W6+{_gi#_e09i?t$tFpdCTq_|{5tJtte&SGRVd1SSq2 zniAOj7a}CK$FcF0{SFI*KneVfe=aSM+zqvi!7%N!vJ^voahM6UV&-As^oDx&IlV(_ zb-y?Q^Vo1jQ(wi_D7IBQATm~f0Q2XDm5MPo0x=3%(3O~Y2fb}S6Zh`G1Thv9eQI;U z%V@cs)i};x&Vny3LjP-}4-{65PbmA*_|S40%sJIPRjrnWtw4(p=2r-b3G2{S*ch^| z*4B2(k6HiNM>1gF*J`*(W3hfP7j@RKg&~!aq`|a1G+`G%UT)g}|6p?b4OHBGh;pd@ zrmZYoIh|@uO{oJIatUM{*5_Y9Z%ELu+IVscz$&2-f0y<|MLZ8pv^)DL1oWK6p>tl>+2vaq0)^G;XYlU}%R>JlrZUaTz0WNnlqkbULaf4KG zBUGg7w-$p!Q&Vqg)kN4lwhdg+nM5$@lReM@j)xTkE;z|iLWx$l*H6uUr8-2yzmHOO$R$juRSe9_-|tFy~h|U3T^g04pnZ04;Kt90B{JcFioKu zDP}_J>(%fErW$TRlLU%MXv}b>g2wwbbWfZ*l{_YaZ+;+if7I;gVlCURKg3Y$*CucD zrYH?O8AJifvWH;oa4uo1_Qv_Wu*cdoNLgGGw`Zi2P$&N$^dI4+*zC2MW zsc>B7?CEAY(S#Ma3c-Sw8IGft84mn&Bc-@F)-oMlh!RYWvrXuuhO`MC)7>~#rIi4S z8{@cYKkO@x{d+XV4V!g;r5P-*WG@=$*+6A4l#b%v@{^@zwpBrv3}TXu&UJ_Vp&6mSU|yG zh(#s@>_(+iDhf>cKGpdNJZXXEdRg(Hgkf zA0vTi{=@xa_~HOvdUUJl#NB1hG|T_mkA~zAb6=f{Icc z`(Ho#oHx>B&CpP7)vOI8ntr_3qG!Cr=Th^mvh1<^+WpVb4%j@b{;nwIK>b1$+kx4w zUQ+1XSQX<>@2v^beH&8dth_vUTdM8Kp-VB6Lli<$OHcvWB=Cl0z7voQo;F z#x)jK|I)8-fGY>cP@r2zH4wdB5_BGzf(~uY|vN z`SKd$-pqLDfDyt)>n=e9F#OUDxmCPF`q@e4IlCm%ctp3D+$#=Z3JwkQ_dA!#ML;Gf z4fAWQ7A=DIg7JNZ7loyM5Xy5Sy-*Bzpv#?P57|+6jsEC&Krv-G9Wm&y2^vM>=OZi6 zeN5KF{lNIPAkwCf1M=fcA;w|Qw2ln{OJx>4`S@+LKrweg!>)m$@b-qNWL$U&dk0An zN3}lJ4a*uX#~&v!7j+lzSg_Qm`bNiEw-3~JTcfbVx5a%17GWJJb~4-!BWPHva6`mJ zMTQa*dVc(VI$20Md-hU)7-rKs}^Y|UW5_>T|&$vAKh5utY)*)B^Bub^Xp z>OEtrIhoWo1D%j$&RjrlAaul7e2x)GTsA zZf>mgdFKs98%&jlw!yHpp{;H2y5z@H(bwxRi$}VJz4R7F49$kiU0|=pTrnjX%O4$& zYj!{U6YT_D#1nuv2G5_Lo4eS`%9FWOXaBm?SJp7PhU=?kzvhOQ@Uf|kz8pg<=&O~u zp0`7>1_x%n(1E91LHAnjdtrwQ>LS-AouOCLgkMc|08EBbjy>J^7AHE)Z*7<&A0fY4 z*S50zV~KvCW=42Tf}8BaKcNqVt4)a~Ab9IWu9f=sD%-lha`nap1#wnTY37OzvEO5% zAa=kJCsic8MDroyeyh%r%i)hOI8sJ$YU%zfjK}bP19*b}!QNZIMY(V9ql1_js3;%^ z*dP)j-6|p~B@IKVNOw2b2ncLIL|VE*V(0-;0R?G>4gu*HknX!?V2r)@Isf0e_niCr z-TOIy+-!uIci#6K>$}#op0%DuLht^m3=KRTVgXtdn-Q2WQ>H(1H2;~-V-7+6O=H#s zn{T?{jI(mPxHS@M^T*?XQMc6_SE%`i@%(jop>+e^ zcp?Wj{W5Tj0Idab7j!}2{-azh8dfYmQwUyQn-Oesd{w#s4 zATq)PTCQ@>C{GQ<{g6KcxiDxggQMVa`Q9jEQc!g-y9a9_unPG45cHVjLJf?Q5Fsb( z^jsma-A=&U8=fAQ2!ggg(~IdAIHe`u8<4ODlu3^R93m*Q00$+E&_7!<8`tsyjQ5?3 zc?AUqTp>{80y{prpC=vCD|Q0@pO4`31nX<=$1iMotASw;yB)1K*ADCjHrT&Il+xXk^y321ys95zLSH)a+m8S74~b%sGBx0@tr|P72h(3FU&>znC^f!UcA(b zPhqQW`K>oY#hyoZ@Liboj>Us?8lK#p4o$<-aYhz}oPbPe#{|H(W%nWpo@dwJ+Pw`; zf_CZFu;nKy{?Oo5eTnm+fm$ArG=aBEB^mM)a5r#*K}!g*??zmfgo4Vh=31Qi73huu z;SlP>!am`uI!a357$b}e_N_~LJ2d&7HwR%Y=%7QuBqgDN1X%bh2PJSi6t0_t#u5lc z_@{hZq2a7JNK2E0&@5CLr^+*K9w7vNQ1g+2%`T9jP6x83_&#H~uwAQowss&b4GrW> zjqy4_pubHhe#7Sco$-T)vqEr63knME7e4I5xO*GH@f=&cdv<7aGzq%N;0FRaS12i3 zDB?baC2-}Z63ZQ$?w;PZ){tQ6$ zZ~l%+r;A^ltUmoIAMa)0<)nbv5Bn~+10Ur3 zlUzr5TD*)M%x-i)4?H1$=lfRc0B#gr&m$~clAmu*unZ#Cs(8Q!1n&W`DJ&=!Bq=dh zn)glHo%27B3wPJHjFlDv793M0*iVSu3ky}jenOFoz~i}ckl+G!!;Spe@!B+|CAZ96 zlt15$Z^ZYL{9!~0l`_f|N%B8-QZfdFwl}vqYyY(QG{pjkqhy6pDML?~cbUZY zO)9tQEsO?a%&G=JY8w7PaOdiZB~Zc(o$q+#MBnl9JHJHfhR6~n<|IYciT-gcR#Q!l z&`3hL5f0Yf$SI&vR{;bv@b@tW1b?5Ed@sR&;8VmH_4slErUL6Q#ptrY_5OZ3uzV)-Tw#GmM8oZGQCdP#eyvf?3cIW^*kj0-#m$3rxclG@7-Qak_ zJ|Li%iwwzRyfAGoV*t9~Nh*sV2-yNI;R&$HALx5OO#KkPryE{54#0c~YsDTqLa~fc zbJg)7Y{`ZTw0u862#44A6T-(|>iqtlKVr3n`dUJ8vp4~oEkKso;H=o=MnIG{p5fgT zU|?^~;nqm>g!j)n2ojc0g#*EO{x-Y>g@pywzz0b@IzjM{onA6jKqVCv zbVB>!kZO=N!Ik0PXChze*M(gONwFE|JJJpv6v9CI3w(&)A6c9+RS0r^3paq-ckZxz zV64G~3}q&$!?wr=qhZ7a3?DNd$bS%qjx>W&0kFw>b9j0H1M#urhJrWQpQC8levtnp z1kz(5qmDP;AkF~kO3<~~j9IOZ4+R{jr}crD8TgXvEhWOfT4y&&k9QK!~`vQ_nuoWN~j&CuZ&eWe$l%iOO zkLn2cW%D5rpV@S|=$QLoRt@MK(}jY%fbByo0bpc-Z3Brj=pqGdn_m>KI{wz~ZH!%# z%JzXlfV>%g*pz zr@p#z1~dj`83RBt6ZSIfXc=$9xO}B)#wy@EX(6fTdU!u!F{F$Db}=$?e)ppht9I-H zWOtz|9(t^Uu+N#pQ2Jcn{KCpxH3sl0aBe~Y7s2sP(L(uw$Phq|z`+9QK4ezzUz)aCodZ7&XFR4pLpBGb z^L{#BIFIlj*ghC`FlL8^itw}F`=gB7>ABw7O=TeHQ*Oisxk!AYpA6-3r3Lf%5rk0v z_`aRJze}GAD=Q>}Z3V_DzC;w#v|*p@kM*T^zb%P;&e)cd0+xzkIGdnimI)R0O`8sMq!)N0--GY0OE4lLKO9}| z9h^~_yc25VER#aVf877tVLIPN0K#f&0PKdi1`dT-S)4M$j^0c&bNmC_5=Mv4y4D0>BPi&dttpPDP=q>xcY;Y^vU~M}C_8s7ydM}JYvaf1)r<&n`h{zj&_^BWldA^4 zgF0&D?bpGBar%yM|`3HrB zz+nyd1E55zV%63&zhUi@#6f>nJW^msfCgj52TkOmL4P}vIY|fAT zeZDoo-J+hj)H=v)07(SWkB~)zd<4`;lUCT@_4dDU28icSJVfrA2K6`@HgNm&P$Cntdk1T%x5 zWnOr^(;-RwNlATPypWKP_)=XBYO-)nwQlh*--y*82O?Nnn~{dPx~OV0Gk*Wm!Cpqb zAY<7};imfDi<+7mqI6gqKwO8OKliq#S;-TaWi4Y6cGUZY1_cG_-K@bWC7Q{h%&Hn1 z8bI93?uMOwd}GE|YU46%IMZid0Rg6fTYxM8f)9rmE7NCpivA~6P>v>Sl0+E2I#0Ws zIM*()3bq3j&jwb-HjV%c{2lh*LHtc^+UyS^MqAB<>L}nI;Ki^7V9tNHk@R4dzzpx< ze%1k58@rcfTNcC_+-^HtTj(4Dot3@4y&=kgB8hYU$KVeY)pG8P`Fpyjd*5q=WUq#* zDnAe`!3tgr0q|35lR|>M0;dG{HN3oSt*y$+%ELmZhL#S}3&CBIvmD5MLj7TaYl}`a z96fp30%ngZWX+csj)m}k9>V;Ur2H^nU6#0Zag#IV&)nQLCY(a2#OjxLdi%_(>g#=f zGbUYKaDr^2Unmp`j%{~$ci7TCp5}14^gaTsy@+dLP!1$wovdTDbFj|~`L{Y7PH*-< z!Es+qOn`9>2TNsTB^+`v8X#W1f-Q+4HGgmVO!(HB!(gAMp)MqE8hYype1j(R0(E{{ zvrj8(i5qZ0np|9pAvDR(29PEmuU7!Ii~FEkSQWSsV6|Z#aC*SH z`7yh)iD1k&__oX-h`&{VYXI01{CG-Q8XRh12!XQ)?AM};AKh~l z#m^ibfnGcg4*L2dkS6xt%K8j@4x9aHz&Hd2Vb{Xhzc(bwn$8#e`W-|Em)EVjwvxz_?Gx8Nh;JXJ@Aqc6o82 z!rq>(#{aYh^v=nKpcs^BSpp$+vP(Hjuv!OM%Yi}y32|6CT3Y?k%uKjA5xH=PS2{-# z3P&KZ)!X}O>&8}7=snG$v?3=n)30`j{@ghiIDhC>ldHdcVPa)#MRs!dRziN12_voeXOdF z1_K3G5c@!q4u3Sc%-svM^M-@trNlX)u5R{o=jP&qHve#lM%Q1g+^P}h_SrZ@3U%_! zklBJ7DyZO5R^F6CKZ<`UcUvV@HMLGSa`^Z>#CWH78v6FEo!@%1ae*$kFFYLV5y+M9 zH;1dkXLywL&Cbq3B^4x6>+0&p26=qVOi%ezg8KkXNMP|Ik#MDxY~P;E>fM$4D6x4& zE^0Ok7UQrf*r#ap1OWCnE8r4<&leE^^a!v6;OJlHPxA8iF1{y*8WOjNl96Hz7^NL} zk^<)R59)>w{7<;|V9B~i*ZGNQ@I(34^@>2LdpURgcpM~4@fr$Xu>)@5%jA1nTc1DU zfvpIhVY|$PHCZTqbZBH`By6)AdsOhZH+7&_^8Lz_T<|Y?=c0n77D&Q+)>O9RuRR<; zL>3B$tJ(yPG6-V9yMhB0)Z}2dwYS4D4Huuz;6XE$+uwajCVN%!#=iWMf<+>B{!>B# z#4IltC?*4$7sgG42N|gqOpL#35&blaK^Ga0a{yro-k7Wb0%Ht*xRFsxYAQ1e3pfU@ z%d`6T?w!(bZwx$HGb1Bq=kn_v199YoDh+gY3J(Xl6+j`~C=R64FxM`{HilNPNPCai z?=m-yNcb8N{`dc-OF8L6Pbhbid2XrFVtU5b9-bX5;R$zK`;Uw}Mm<{dl6$+5=Z38^ zgE|7p0nqb+PX?0)Cop6xVR9MCJz*EXi3F(|aM;0OfuBFIaxmWUC0SU&pN0Y+6ryHB zLmd6T$iS`_HuvJbut|L>I$@b5zoxN^ri^Pg?V=pMxL*K`BJP>N*^D*K1#U9 z?l*UuZj`!|oo`*Zwqu1l{!S0s(Q(sIxb3~QrnwyucjA|n7+EM-SfC|6efkv6CU6ZP z$f?$WO zrx}8whcE`FGo%`hjWy0u^;J=KpZy+BHHCUwCu%($SFY_idVK0HUtFzAVfxF;;)8{j zd~-_7N#+G*O4rNLrMXToDLt%m<=zIudsY*9;7c3sySBW#Q^;ok5(C`|XQwhU4oRAQ zUs`QylIJJ{`vXVI>C>k{L@fO4HR8ZxQu96;sYOG9>OEU44_F-<=V4b`81cv;}MD&2cmEmoLR7 zk05KZdd+4@eK8NJ*gHD~cro%5c3Cc zvcRe!)z#O&4~TP=x>vw1Jx57JN{+2FtW(YTEtdb~M)5ZfciSsg1)kkh zqxKPs2m>mYQ6mm2xU;XU%ddQLl=p~U4ZF>FOa3-I0PahVSSdrA8jIUYFE1~!kwA0- z;Wcn&+4+Ke5aQt}P7+RP z!RPC?VX(X>wH|}xpjfh(?uq8Jo^heL_`r|c-g37~iG2S2Wy+aipDV=4(9OQPqhqgd z1K2{`IF<~n3Kcme9Q1g?7uf_A=^|>2$(w^q!nk;VW*ggp?Fiw?Qao zH&?A$qHi-}y1wo+`A{lb0H^&2-TEOV1;j~dq?KL`a3}NC4oKE&;^KQ!(mg&Tq%XYp z<6Ircc+S8=c+dL5w7g<=_8*Tf_EA<(b#1L%M9q6?RJ~6&VPMz!WnmpWk&Q$?m-{ia zlBEnR98iqV`0?XM@J_S$4KZ^|JEG`yho5ju$I3#3R^;m}=&tVd4t!}`R~il6jro)t zh>MGZi2*NQI^)Wf#S^QSR&^Gm&93;kn;wsU^N5)C&tJasvrxJ)ge;nXM-o`|lrHLn zPj>Gk*~A!Flk;mZm^OCE&Eb@PNm!>O#UYP+gCGC{b(c3#)M`h8B8vEGfe(fi8#L#e_Qd*aL~iXBl474n=4#(-Ri4fG^o2DSkXE}t zGwH2*Id&yaFubp9ETHdUi@%nGgS1mW7>VOkfBDj5TM9?o)Rozd_Ve&yrc=yxuxQNH zetAltM>1+wR5h1rp3Y>28)cC@dquIzCGD#3A)fBpSx?Wnt|m%nyD_HuPX~AHMRVBe z)!Og7VAH(C_I&T!xH}}$vhgPQ$Ae@&a$O6mG7EQH=N$DMa;08vfK~sGEMrf~o!Qf= zkJdco-eTRc(O>tPWBchYkubJa{9@BPH?Ecnclo;>8&h9k?>RB;)!!{7b7jXafq(Gj zm&3qWTK?@%dn@d^5yLIDwc|@m-M1EK=|j8~SfT#Y(X%OyfIqGgh<$H1h^4^GO8c6&mg#-?{S9q>T|KK4oR?0p-ZX(< zo0;N%dqU@~ktO_APV%m$;R#-L_&{0sm-Rg>do%d)P2;<|@IQI{Ka{2K8E9)+onTec zzi*{?f{law1gnI$i7tH4!FfVRh-B;T?LsF?iEvU~@82v)8*Bxvso5^Uz5e6J=J*#Ln}hS`W3%z{@c#bboyO9tO5~UCYVF&0?_D{0`hkNx zUw?1DZ^U?*`s!mgo|p#@5+wDTE^};baDORyb};7hsbE0^?ex?kviCzCtm3Le$QW7g zejeQ4M#aWC{e}_w0?sbKCU2qYp~`{s;T`4IyW%(nG zeq4ZVf6SBFKNuUzB@CU{_Notj`0&`LeD6|Q!{YZ<3486{GS^p{>$Ckep5ND-rA;Bi z&65*MQt}z&ylFuH(yLg87b!M9Ogk6-@Z}%0vZC#;zs;SrMvoYnOx1tWdsz0GIJdcl z3S~`eRiw(_;kqE0Ax#OJx>(lRTwJLeA*|Znp(d8}`}BSFOY?GjuT;PUcbk$|(iv2pNYV}J^Jl_hUUAGA zn4{TKN34>#{f|{1kdS`i*LOYDqSxa{^prxtDb$1^{vBq zkv3R5)Y5?ma=2X_XFM=1j)-vlm6;)sv)ZR?aCGwly(SGCP z$Qc;0m+bcb)~?9COOa*tvDKCB=4cz2Y(wPP5%HTyADhjWG-lswu)UP(ccdo!mMl*r zseR2(IC7_A;#;7pOmb4@J-$k-R1D?`T5yzZkd)o^jzUA zG)AVY^Me>Se`lE2Tp7_H>%!lq+rL@f^c?$3n%Ci!%;`)V1_4=vRSOkf;@ItHM#z7x zb$^S7+QQ0UfRRR_)^5!iOxeIvQ0g3~O_y!S_^N%T?MNTvO=g_Mx=wPFKJjdIOz5n? zM|V*3vV=#q-L4=zH{Ycow~Y7mq{FMChGjjiv(|ngll7Nx-5^ce+6Ee_DYoi6 zJCSPsfhs}0rDFckPw58Zz`hJ_U;Z+`vYvM(ja4dyLf5b9rc}redqUXoH7knEAq6_f zp7)h9Eg7dGV!w=|-S{!N)f2X+8ZzTE(dw%wZ%#}y+FJQ6Z+`5(2292&umM4))^mf% zua@d!dyR?)0-mPMp}+*ZMVsf%^d)ErrnQ_&B)k2q4ehp?yP!n0fC*5yE&3yZ*$dE& zmrCUN)~F(6a*By!^Y5=WU+h&!t1AfwPhk6BPWOG9{W#p&4?=tAJpKWe7IXC(GFM|U6b`SHrtLC0j%X3nnV zTITHq-2Nwoq$LD+ZE{I{wk5_E{4b2JN zATl#gb@&^Hgzew&kX*XR`_CK_&VRun;o*WyZTVrBF7fdE$sy@6#4ONMm|NCNtA+W~ z*^CdKVWfB0DPPvgLaiq#N_J&q^!Z6tcS#+&*=iyya?qT7?8uSh+DH5rA8VYwo^k8; zb=F57BJ26U6Um*YE=4$AAgwxUK& zoeRsoC)bu|*0`l<^961Cx)(pKRmBq_USE@aANz+mukA={@x%2=AMTV9qx9yM7FQp= zF9(ilhSXuY#|kDY!072g?N{I2BU6J#6-1gxsW>*+1}bZB~bP{O zxn$LAR<30iX-~f0Xgw;6b7KgBnA-S5v>)F4VV8rjT47XT1{+IxK|uk4-YBD+1>KQw z!6Vbd?QN#4$LW^F{d-bW4@Iz%lRULI#=vtlc^o)OgoyJ_p>!jiHPKj8%$Ii<+;F;i ztgWdjZ>D7|os`zaOgnq9b|2zh)k}}*=A}q@SIbZ~TtT<^**eC9`#R}lvE}qj+d2e7 zuI}-LXt+OYYbWNm=Eg@NEun}AOv9>ZPnu~l)hrbi;*NoXQ-9|~2APPXL%7f#CUQ@4 z3L6c+9BlXEjp_(8!~^8#1C+Vw5R4+%+P1>YaNQ1p zXlnkDtZNc3kcl$1&Q}ZnRJKH8xv}0N+*9IIFzB-jaoJcK8!bH11{%kinr&eg=JiDf z@^>RH4^A#lO|PK=R$5uSS6NmTW^oAdz*Ssjao}MwF7vP(@viaPDFlKD_u|Ve+Ykr; z07cL3|NYT_N8-P0;va2=NpDg*=nkB!NN-{8QlW<1I^P$|^E_XE0x*4RsCILlKA~r?&dOy6|vO8e<^z zw7W9JY5_5AaXut^mo3=mN_tALt8d2j%!dYTsj1h;^w@wP98%wuZCJHzC0UR;D7_a< z>MU4h)giZ?%Y_uS*}~@8JQ=fdJ1jdII7e=!$KVWelS_{VkC4-wg~yy#pk@~DLmpvw zHY`n|Z1HPlLT&>BkzSN?R7_~)TeS5BT@Fs2lHirXSH&H5b#L`C4PYn79=l=H1O{Fo zLVQ)2gVEikblo(Jj!LL51UXI59^9uG%1{n@yu4`VmRECd>-;*~5q5L;Bkdf=KcY%S zh}XL4QdESZr(HuY2u&+OgNM~w)G^f_l~*nTU1z#R!E6@{flZA$jd*weB_j(;jj^D~ zT7}`j#7JBIQWp#kP+*o+r`@&6YvxC>+-Z{aJT_L?mI!Q#{r4NMycbv_b|UU%emcyy z`Od^i8>2~NXMK0;ZB2$F#bX;e0z+(CV5;F1@m!**A}?95XYE<4qRWM)voi2d2!S}~ z*<_m7=TdmL+9QHh`O=22ah7ge`O3-2#cLc;C~lPt%fLi6QT~U+5FYCyel!rta#Ve^ zK;BmP7K0E_C0R^$;E%s?Pk*Dk{>JvZQBRWo#&^5)@AuvQIfTabFSu_1F$fKZ#{Dlm_HPgx4>#BE9&3l8oV*g%v)+WR?SF_^K7TFs*eg=t zdW3l{@>n_A-M7nTYZ$H` zrhFIRcT7LVLSNk@a5B~<-giQKKE+G33u7Qw9YnlFY=14BQ;5r4*J5<2uq4|hC`cdG z(U>)H>_M`&1DCV-KtsV1)-Lh2hIcRD8W^EUA+0&nHvWNl?eWcpkBi@G<*G-T(QWgc zkMqT(X$93^YiejH+vntwn9aqQCaNI=`(hmvHK|@7j&n=A*RGtJu33-yXs@TolW)SM z3RTZObTzC(&N-Pt@E%Q8Vs+`Tn~Upc8@I_RphhT(S2njv{Bi>q1tpF)mLK^pKGr^F z(Brc-F70m%WU_Ywv8cJBFoEG}Q`6jn!j6!YLe*W49d0WDVWbG9kNV9Gx$-Qj;?oW2 zCf5BDdm2B;vl)+LP}qtR<(APk15|o#XMgw=oJsG*1^qMQ~58cAC0jzp*8r1C=Xjbb|3{r32M1d2DYi)g&GhAhnSzxNYV^Lxb zdE%)Ay<8Os`#{m~;VX0eN?yL@63OVIw|?rj*ol=7w)71oQ;9GaKkk&Z;L2@vGSCSG z6Rzu-+~t+JHX&k4j98cZd50QS&R?~VVioP|4J2kkwGDjiAr`kTyyNy$e9#wj^bL>x z4hAVCk%#|(|M~x9G>Umry{qK(h4#FZ%(5pnC6<-@*K#E=TwkHhnIU5SIy zyJlEh_*6}8NNs$I$PkP2_}w*f-yldQE_7rlUmtDWe|=s5jq9CzPTyS|O|ya=~@;66{Kr%MqAei1}@HTW}R8St))U`0W9H`A==soGf_~? zVmS99B{H%%;vDu%_lmW-3om_4ZJP@`i{BWmbY8lz%QqHeOE@l`l^~TX%VxuGjnQ4o zfhj4v*3}jv8?L$*j1iJSSqnD&A*!bH7DgUu&9)_kSy|X1%clAL@u4X$L!;l*!X>Sp z-?Xb|O$)j3lw@YlTckFsV2dY>Z1`2X_CFYl%nAT&uYU(`Ixxi!^_&kkWLp}$teuRa z+KjqPYXw~vIZ_G6+BxQjmF{aRUKUjsOg2Po&<)caKSmoy8BxTKG2)EZMNS+k6eKni zl&FpS`EpT;?dz5DSao3J_X*SqgXv(<<+@IVK1M^FM}FzF*Otv4wRxxMRN^3`o;-(Y z7B@=m4k;FTFc#A-hZUU~thk`m(}0mCRyBTGPH7ny@6nqphQS?vnf`kwtKMtuIp zE5aqb{>}cu{{hkB`4{|y-w`cd?%(}`PEEalpNN+0gpK8D3)wwR846Wy{(`$o$u{dj z*E@_cH{EKIkCxxD%Di*e)D&#g|bHuJy9R8 zpxrGxVcTv)dryN-gMunTK%g7FBuF2`F_H+axxeEaO|An_f4DF^w{T6In-wzl_cHJ( z6qHHc!~MG7;C!#_r`S+&nFZrmt%93LADIqybm%bK4LDxt(O6ySF1%o1BuL369xL}^FXeaETMPRsLC zOZ+W6i4c@xo3K_(4>0`V4c7_+jI(rbu$C7d*0PJVU-Ac>3|ebylG~ z`;nfFWqJgnUy3CErKJjYTsi++!;bVG)kdLYXif%P{CGZjqX3=@Tbq`?c#^I~q|2ZPY+uk(PZi68!Ahvslx02IrQx_0!yGq4}=P348O^*IUH_v?)gfK+jW+(WxEY;TSaE~T1udrcce6T zho@}# z=9H*09HCvIa%k(LqZ7`XDGy-pzCw(UxD2nYou_NdF3yUKT#qC!2k^>f^WI0^>&56?x7wCfULr(7!1#mdHO&-2HMMrV7$F@= zAL~)Ezx%ZnUGK^1dINzlILm)$d}1W2m_sn4)(7n#eks9 z1t@EZ;lH5Pf3dv(qMHA6F!!OVQY}q88jVc#9_S05Z^MDb-%6{+qXVT~XM1-A+&UXr zrJcVBI~X=_%!`zzej>zeRWPj@lswJ(7Wx2p%=SRhe4N8EI)OvHdG0YGJ=YTMP463Yx*bo6uHEv9PfAeUHz+y7#uaekuJVb0TkA)OS1GgWr;nbBp$g*nz=!k`bzIcNRzG(gP!e%8~Q zuG7B1@>s;3?TFV8;5F6Me893TcFKOu99YH4&28M4$D;0^ma^0cW`n7#M2JIxqpqWo z(^aEGM9fo5Tr;9Y=mNZ8_7-FU`ff~cTa3u}tWTmYbSJR}(g`A+h6Ah$E*gTKGv)@N*h50+-6tXE(t(NqXZt&1D zjoth7y=}=%U+{ouV{Uv%jA|FHP{gFY>1>qMb_Au5Y+39panZm6mc6)ALt>$)$KO-gT)Fdtjp5#ZHqOPFT^=TzPYBs_OKzVLHoe z;oMlh)12Mhd&=CR*dl7<3qc#hsspsIQWaH!TKUCjm1#~jDX+;Qaagt`wqQl^>U0KF zf!YHxk)7Ifg(^ZyVuiHhuIs(OapG`E!hf?9$HDf`vXVGD+W#$f*u~#HxYCC>D%giN zOLCfDcPngG0{lV_d&hP?@^6V@IB4zP{J_B9`p3L5wu?9_+W+*4e@C@A|HO#vFqWgz z2UH6o=^5w7!LT#vM%|5<9#jlHb$70vee~!#+j9~ggSf$sjVEa2rSdKXc9Zb-nD_QA z(>DtWJy>1&I-L zyNddD1PJZ8eQcjyqVspbhiiuwsxlup*WLbP&o}%m>^U{9d%@`sh&t}5w1#*DpU7jz z3F|v+8>;F7+Qv!fgn~3OYWFkc_Y%LgCc9INBz}|N+ktStS}(Wk2Q3O`diAb7rO7@j zhJEsNS{=3OF_ZO{oyv3gVS2nqO>G>7We{c{|EiFxa&=nz0OD(4eCK(GrP%zZYJ=5Z zzTIa$MCX;{#TcV47?q}3z<0+`Me?Iodc0qLZlmD^(_F4sjIk)BHo7>sK7pK?6ERGT ziHcH6Jz|qHgY6k0&pbAfv3w-`YLfrP+cap?L6KBmFt+efPsib&wt0@cnxc%)fgGe5 zzi#!dLR5$TgtZjn4Qcj#dqrV z(nmF%S6NNdX(vs?T^MbplPD(Iwc}kd0mO)5>ba_#^(7U_!hwoq#r*7o0)h0a2DS>! z#{7#@xybHH1N$CTukuqPi81pE)^o#mRLhF>uwzRRwbZWb(`A|zbVOeRZOPEJL%SFw zg>sTTl9Fv&f~**YsH{Uv-z>y76UV1?S0)|h=B2Gghp`+DM5QMsSE9miN)gRwjTLY; ziC`28$K0v|o*L;~3V5E^d;8OY?b~cw($I2>sVNzU7Ur6&V8D}8B3u}gfkZ>e!ESlRYGM@kBYXdu98zJo6=Dvzz(a^YvPkRfxWF8HWUh ztu^Z8BhP;e9Mq63dY)JEbo?vs6Ap2wR9Ts)W~O;9WXkDk?|9H5UzTiwb}s5jAm6)W zPC;AAO0V6*4-vq5V`U!pzMzT(P8wj>KMHQu-{6Wi--=4y$23=DJ?L z*o)nUaADLys^&IOIbTe*x!CtiQ?lq2Yc+;(Ot-pH+YN@eMCK^U#$c(5BuP|$EFrM@ zk5phaDR$&^zV)Y~Q~jb18?d>)MznB#DHL9)nD$fF1=;vNWjP+UBhO(@RIFDrj0SY2MZC~_q}&r zXT?q_IX%35lH^T9;zPzrhgOpbmlRXyRyCDRI_KovpHm-rI)3?tnI;llhRMv%^Tut= zZjLPal=X zgKR6Q_HAEXNKMI=Rzr0bq|G?qlV3>s((Xu&xi|CHs+}p<$Cf`8U9$%<>((4z5WkFn zgak&MP2@{NCIyk&&SA+~=wA)2>Asqj^+!#!+-C>V2L=#xE3!B@(v8~yQAd{~YAwC> z(F*d^=(Gc^&0QsX?cS!HR4p`d;@}IqRRl#zpR}7se^}x-bP0B&;iK_8lb(!5CM9q= ztc+?EEThu8g%53~(Y;8ury_!s9=a}`(};=pW8^~2lK%D)DMFda=;ecP%Kg2C?*jnrv(VK{C>KN($@_R5M3ezDys?J$yl@=!s)x9c9WEkfeL_acrdFaWe;#pPSa~+Nm;R|QfMbFEPkn)35iB-du0J7IU8Z_X3pDS{{R@xp=9LE0A4Y}swccSe>j_15 zH|nwbX*J8~2Gkq!jLsM5cg@#5ym;`|A9vr@a6C%A)Ufke<2x(H-Kx$fl(%2;U^?4g z@ch)%R;rj2FPvL_b__*eQzoc5(@E2J*@8fek7hV}sgvdy_oPsKQc_Yo9vT$bM>b$n zQopdH?;>DZGfTn2!O(!4i5%Qcs5;@sLx-gE*Rn+OMN34>M5{#WMO&Po5*-WlFw}8w zt!u4oXz1ihwq9Q-$<lA~iJ=Q&YWGSFVbe0n3Wwl^~tcr>kr%X{1C5+WjhmI$e|* z6rUF!4-E$1igi3+u2%+k@is z5s2uq2Gm1hF^3_Sg`lgE7yUdXt0h+s%zccMDG@{LpR>oap@)v8?3U2$Bv=o(8+a2F#E&Dy6i(UW1Q3QekACQiW*@>K5khM1PfXlk&8oNSIN_|5yRrQQr+IXP8W6crR87Kbe$;82A9 z{}<{&$}(I`~vSpb7qu(d>>F-kyqycQ9wO6@NJSWwX8Q@7T8T@jMKCn>oICH?Qy%fyD(+#Ic4e_6r!xvF8d7;=UqDw4*of2`s)g~n9l=02s`r1|2ZQEa zWcwy7S*zaf>4s&xT~&Mow8ft`6`(bJky|0!C%b92ALfn2%wT{<^x^C>Gb0O<#e)S0 zwoG)XwwM}4w6#NDUo85lsS3MPM15Y8v;8$K)1Gc;H-~vTmxWgM$EW9jgZY?s>_bAH zUOq#?a6v-h{9Lk54hjSSoP=C+dvZGagV_u$zkmB|oTVD!;84RpQ;hx|s|`z}J;SgA z>;Vz(0+r10>62|sGf~5X0-TNp+6ElmfqTkSqoAQm83y_`kvzSs26Q242H}8Djm=z? zc&R$8DzBEUc0}Duy{Sv-u!n63oG+pHyqUe-pipt}>*^9j*%W8)-}oN5RMx-Q_xPu{ z3)@8;iRpjpda!YD{h)(${26#*!+|aD-^@uH?(JkC+iFL&qev)?~{w1e0GcN>H9v*p9%;UuO+^0 zmf)BaL6vYg$t@|WeQ~(JfJiYR+Q8saKn;_Q#gfro-rUSrn(CTJ;s=*+Pd5n?d}`Hy{KKc79}>T==OV)2-CxItSEnOB+Y z-ebl^j9D$1Zu+Ago}<+*lM~#U*eYSf!R-rOn;{m&ISMzdWl^*6mKu=@$=dq)Ui5Np zvG1?zD>1+-#xcI7@DyeeM!0=||{}b4%5%=ss4Rcqi?` zjF@st@GyubNt8-@We``H=<+NMJwinr&lxVEv$sms(Jeq{Ma1=8B?)4qpEYeOnq!P# z=AApeZ6hrC8e^EMN(YNl_81pyI{$}5`a2$A?R~PJojxiXCeMtK2xxTOYluWL(;p5J zuN_iqv8}{7tQ6UEj(5HYUu8sm&6nAHe0g?-n&~0pW@3GHq#V+a@7qg=(m4$JN6w^j za{9yf5&!=~KYn|nh3DCWN&(GD2lV|E5wEWs8%Z@F71-${3|q~k-R1dmGjr6_nvm$h z0c%)y-7b#blOg3GLRdX8d{T3AN5g^@JFNRZ-_LnlgtArE&k>&8H8I8t*imu(&rlpU zd7P<{=18sSYv%%c7$#`97DPu)bqjsTL4=)<{N_$m5a*N|kQWwd1acL-R-26#*Q**P za*vSMTk3@-(HlW!M-h`t7k*o6NyAOq&zP&sqo?mP7RulDSn%nlvt|ueYH?BD!}Q?9 z3_A{#__5qOJkyuuGqIPH4#*b6`9osC?UQ@0H2KhyH2v zLWu-0fpN$uicdxD!>frr*29)Fo^9M?Ww|Tb>1kbijZ0u*v%dWxGqe-&=su6^FFSf` zLC!o3m`h9RR#jeJ2~5`*Qw~sZG)=|uFWI#Xlgf`bCZ9xXcl#57F;ZeVXQqUuKb{kI z<71CHYTD$bjd;Lvsd;pRQA=Oh{%UH$q+o_ zCa0L9ntXtKZT?o*LS{0wlEJfXGBPp}6G7)jTLnsf3ZSvp7b9oZU}n4*xaEV6PAa8* z3=m=pybzE!sb09SZ@t%tUWf*LaS5XoSPblSK~Eh|3r`nM56@SgQL2d*nyp@-RuCH- zi%LyRE{xw;i|qBS&u~wa8)Eg*EV?Af?zlGiz7s8$OHN0OcpEPI8#Y2iOPORfVPtIV z+3h*%_*4X#L3!34IS?w-Iaz(L$_i9m=$%-R9t?bi6|!5dbrar(c)PxdQ>3O<=oK-b zozc!R&h;*=u3wY|<;RCR*Sp`<>1yc~FPR7l$9tQlM@1?l6oEJAKwF zUkqVZ%^Al|P}3d@E3%mA$S>pX*|Q_o4nGrR5h(w%}R=R&>pOb3=aH3yqR|Ggzd-n$!pcCwK0Y*=nbJzM8ihw3h`o+}Gi{*)QX(4Hnhu`(fD? ztb84r3)u@z&Z;w+B5GSO7$9aWjJI1ld{0UT8I+49*#cmKz6}Ev4Epl>dIAj(44d4L z;KVk>J84Zd0YQ6Ip{}i^rDazMMSh-^n7z^aMivBOb+)XG;X`gWi`ZF3%Z%F$*(mJ~ z6$0?4xAh7oc{~D_+S^}=;(k?JTrAH>BXo(!exMypm4S;d6kgtHy2H^MdHQj^n~b~l zh6=Q|2g}q;AHfd@M(f)oG0*xZDvr9dce|1lNGVBqaX)X=Lu2Seu5^G>6^Wdmn-5#Pw`%IT;dbw*#aW;o_B`jbu9s2ZBvhhZ z^=b`Uv@#MQbpe2k{ZZ{6G7na|?YRx!E(_-u>0$1@D0z_+3Li7SMj!43L>M{I5mBt@ zoal-u(fZ^N(%hPDQm~F&;F81iSP9I^2`VB)_eIR@7Y#UT?K!{FW?9Br*4ohEXKh70 zPPaPcUz=Rd19r%1aJ3=R3M#8;2pG762-_{}!rEha=)97p$c(EwFYn()<36SMnbyZpRg*|HEcGY#0BP z;`U$B45+*M%_aFsBcbcv_E#Foukgmyewzb-hiq{F2g<|PpalP)J^sH^AoeS?afu!1 zD8CIrr=gtO0{OeU`}bTsL3z31#t}vm3%UGC(Sy5BGCrrIhxPuaUTpv%A*qu#PC_x|e65NPeg4 zo&bZ`hFx_#PT8V$E73CV!WSaf+`PON%Adk1sa8~iOr2Y3*|p2f&ET|%2txf-6vasL z{#jCJLff5Sl)rlN?S>{&JS^?H{1~dVe9A1DjmtiZ7eiIzn7pIz>?sG|VpXr}mR9$_ zE!Wk(dxt76z7?OoA*R%CoRLy4T0T1Gu4AcV(bqeR4rp5$^R)D#8003WK&;Q5vOR>x z{2mA5(j*LwDC%?F&jfp4_)A7j4+S=jPR7tL+zJch(q-ROpfirAJ-3RA(K6i9i ziprAd`Jw;g@pCJO6Lg=ufV+j&!#rxcu%|Mt8L=>*ZSSL2zkFjTKqlIHMCCrF(_IhU zt8#u~A?u(Naiv!7+fLPDD-;Yi*oOFFO>JOqER)nhVKWs%zo5x={*6U#e)%Qd7u$sz z(T{7-7W<;!1J}=V?lEQe6XCr4iFS)mc)jn^(glPwVynv-+`^wKR?uQ&6hH7O|8oClgbvis9RRN9zQZMPnAa?Yk$3$`!xWBSE; z$gDU|4u5n_Qq!a+B#--k_bjd0>uxp}7%9f4ff@-0TF3RF+YpIaEhrqGWL+Us1XlO) zfw(;&Yu@6Fv%$Zpq7B#5Hkt9;b6o`%3d~g#_Xvc1zhF8y)*84fHYN57yt?g+q-UVX z(J&Eg;3;ggYH}=exA66~vp@D+EQz6*t2cJK0O)CGw>)szpe1YaFnr_?^Py?NN-Ed2 zuy{wNL6YCeXQO!mJf&L<2G8nfU%{dx`##t_f_KnubWItXn91~$YHN9f)wjB)mw z)2RU36hPc8JiOK~tlj`mDE`PFpt*GsRTzHMR+BsGiD`g}&z*G!j_%M#nr8t50h^r) z4b%MvH#f-+?{z=g{OUIIgrg}tIrHfI zi;bt>+)ORkRINC-joQrV&h2b#N;Vp|d}ZhIVOQTc^s)?14xs_@v|1D_LAGz0jJbh{ z=bl2NM^BN8I#hjws6EgdrB51fTnC9h0hw5XFFB+{tq5MQ7J}BlQ7{9rm~TLC)_+d^ z|A7cIRGDs`IioK(Fxom(K)PPZt1KW%L;YT1#iW{zubQfu6(WNmRd29fE-g z$p7<-liwK0*W_5q3%adq`a^=rSLZeixSvrfYK*9Le4^v**?0u4QV%_LF zJ)N9z+A!%T1g%O_WQ22{oJ24d7x&D<>nG|ZMaFd>LgPnq3{^t3;Ow2P;-Y%Uo$u9n zn3rn2lc&ZW77lKYttYI*M$XPN;8gD_MDDDuuNQ03-D~BKx|0N^G#RS^25Xm;%Ftze z8tBY1Gw~GZqPYnBXb?ZTApccTL}b8L<|CYoTLM;kk=FnnRyPc=*D&SrrdAIVlDV4^ zrP6I_Uf}}XXep;ueHeESVRCdfqgx1gn{yiu$hP=H)LGF130^osZCA&(G=6B246p>1 zpKGSWe2Fy67&SErSJ7T#T0p?c+E2h=QyGgErYk8GEyAE}IRkx^&#`9tPVx(k0L;umKaEYsm2vSMLA1 zG^Hp)hBefpsK~!EpDBA9T@h>S0XSj6FZL1=`{Z}aMvlSl?33;7Qtk0wLkfG>42HRB zsae7pWhg@Z1VyzQ*8=kU$12A4JN|U3e{fM38bFhM>Uj_))u3M_>7D}(IZy!}IckY8 zcFJ>9oO?z5>(%KBz`u`Oqiby~Y#(3hT~V_U|48ynBHc#?VQCo6h-=lMyx|3DL)(cv!NNg=kfNK+IU5H1DaPG;qDe#D%E zYM+r8pU9(a&F1 zvn5oOb_GOPifYPh)~u2k)2=NqF5Vf`0~$0$+K$f&34ogLPWA>CVd&QF^X+;UL&G^^ z4h>PDld%Ni>?k2{$R0r0Ju+QY>Peo3&8_eC0<>AUSd$K=EYzyB^Q2K%XCss}(~&Ng($}q9^?MtvztMBjY$G-s=sy57X49jmrJa1t zyB-37dR$W^oHv&Xr+_l?$kiy|4|;iB-_O3Ys{qg+N0!UET<+0azuc+{xWxMWu3K{n z|M^|e=@M3g_n$%kA;Ev7;6IA+A6o#F=1Ngq1*~Zw<71&!s%xMoTp)WZsx|M2b(>7a zfPGb!z1O9e27K-cW)cL7*ByDM9y}7F{$b=J(7O?6z3Xecd5Faa983>-`3i`qD(^=A z&3thFZ68TwQ&W?KM;N2OSuq^gu~t^lGV|P7vs5=0rlR815%50GdscUHX^$^2+0m=W zW8X98nw8|^YjBCn)(3%d9u)BDH5j+G>1}Ro)GeDQN@ z2xwzqUWNt&jU9z8F%QgA^5q91mrU#LiMt=d!5T~&EXTejSS*&}*|YOhSo0MCo%VJ_ zLZ{$Cy`N|G+4t2i>Y_lKc~+*$r8l=ghRrBOPK`TU_7z+bI`y7S)y|%tfKR*-Mq*vf z-TR6uL2n#hQy97#j?8s&L{M@w@>~WIXV_XGkigE15mEqmZ&BIOB+z0IX|&fDoR5(W zodG(su!K_KOfSwL4#+g1q!{IUdk&2&K-6N}xxg|5!-y-(}?qBY&WA^Fql89%g;AR zPhWqgu~`IE54davlwaX)ijD%?<*g*o)@&5}9H-90z9vP$>48RCO}+yPKdfv1iq*to zxr=A>QRk%=xM96Ss{CoPSMAr z+9H>Y!Vym>3psaaJMg99tP%((&L)3{n8BC3)VA1yzmG+2+uUe_)d2!&@jEcJ!)+Dc zsXJ%&5FF?E7h(VZKp~5NTi%P8=f6|Pf>+@0rCI+^CG!7$66EjQ>n35Ho`1P*{XdZU z`S0s{@dEW~|MxM70z!iSg+b)w<^87uU(-M;qy>416BXsvC6%<>;ioTb^RDt zUoIwI=w*c>0!O$G+mRMa`8rbh_+{N#0#f&caaPY|#lX?}LBtnidCrF*5jYmeFrE>zX?{<;MkskQ|L z6_x<Msw421-Z=YY5?eq_D?3`VromJKhL@);T_L_x=%l_dJ=54s^ zR|uTawl<7}vtra9q;U6JKhr2_owfcfSuc*uD2HCC;x|>zWiAi#=Mf3bzahqe(Zh4H)^~O&-&UFXiwg7Ci4;F~AQ9af z*lW(_-|B&0l!2P6lmOJ>Kiu4ULD(&D=|TAoP3usb!a}MJ!kH7+MUJ52izlGDDJlc* zoMaRLIE$^V3;HqBsbC(8Mvr8MyFaVj!}e!4$| z^__|DQ-K=Ez7T`VUvPoq@790}gO~8$(ER5Q{~ytV5k77FX}ZCD!}Yt;|H7D14;Ibd zqo__>UI?PLe87G)`S1iLxuxGgrw8>tQn~`dT^XbL4L!|Ew+6(aNO2}%`gzu;{9(#5 z9bN7SaP5u~DYvX2z)A2|z?S@7XuLg~FI?@--JSdaQzE!lF53a<@7Xjbs0lykZ(!EH z?kHch>g9w~GJhS^HT~4@NZUiU&gq1evv&1SEyxj4wUCWHyN2w{0Y~}eBr6la)H8JVg0WgnK6AQlR&i1aeZFenw zyKZ11-fgqB zQt0~Z_q{|&h>n^-{peBX5JWN|y1|(hPs&w~AVK|iR_9-!(VO17g*kBGKB8#KlY`x} z=Keog^fl@BolOpY8&<1EiD?GL3RwqHDhIbulW1Sd7n_Y84OM6o-kYt@t?f62`!?g)IRC7BfXQC*P?y%n`xkNG|3GPoe_zmy zm-oL@8$v|n9|9u&#{&QK9UmDw;>Osq_ZYIGm%?oh&T7G_tc{|j|eIDP?AI*q{PPBXs0Q&B?4vmC#LleX9e9B)PTeo09FKKAp+^2 zK$}zVh5<`g;C#Y_o?f)Up@AB-97=BJYB+2t=hz z+uv|wu6xRW0A#rR;Ww~mL$^kp===E!%Mtn@<3`3!n4BqPXdBQMTy?BPJ@N>#JGzqA zKkH|*5Qx~iuw43;s-I070rN3k=urXodQ;gN)*5meEfJRhLMmB z?mn*+k3*y|k7&8y{?Lxk{$@$TYQzr0abX9C0s4TtsQ;cZvTZW#!F07rH!6FKbJIYr zP$RT$p`4Vn&bw|*@_cwjX_iLpF%45b>lILug-YPSyWXGl)C{#5xJICxVJ^9OJ?pI3 zIm%}dO2RbWaGu0{l7h2t$B6-$Dtdu?E}KhBbA4MLklNaYjKvV*GG#UZ>|ojLiFo!3 z1S+ybqKhT5XQ9m{^K~%XFEHE)XwX_TyB#o)X89^47TCq?^$4nQId>SHh8AiRpMFy^ zwOFn1tLT>$^ff&BF=4{*-wQk_S=uNfB^j6%3bh54Ak(bp^zV3&$K$+#S4et7i#|uMtP9RWLk=L8YJfer)NtDmkg$_z9D%@21 z7XW54K>R%0FE@uLSZMj=NX|Q~>Q%uZ0^tNZkPTjVHt4lJ)Bic0l7zpw+KYduTvm;NMQjCqJ%5w^jjNcoV&7 zxD95H^SBLwongBr77*yefByRq4gMns|F6`5tGin!gZI0eBj#|P2EhYpX~wIAQf0Q` zjiV!O3B<;5^97Y+&nb|=&$FSI7{|%U36!NBY0U@Je8Ok@H0%=oTGn^E-kLN!HEJo4 z=%t;jcBa7vb3w{B`riOGxo#mGjmL5WVb~2Q>d3o9E36*C(d#>J3<^Jx{PYh-qXsrJ z3ADK0hf5o9ZEw+>ZR#tX09{)27mPFE}r=wc!q z`)Ib>BotpBForo^t~4YQ4Zc=~rrj)|!(ns2mKTepJV0}q^p%0-M2l40oz3dQwf#Z- z9>BVnL`9wV!2}mIfj$BK+T~)4}!gVA({RaZ4P29 zZrC~=4|^uD$B&(k<5~ScAj^+@VUl5TVHyAu_9T?fznT*PY2Dnc-WVVRR$r;)U%N5< z^Gd!a_Tg-Gm+xK*V+1ZEekT+ixRxp9`R3`;knK%d;mE06zeH zU#t?$=Of|~<+0{zDP679ofH#Gzg>L%s9)_~S)tvNv6jXuP4Uxg*-LA$uwyrcnV$lI zdh9L}7F6C;&DJ!t z%~o5=Hrr>L4TCjYxeIoOhClnUYRXVDN*s>tV0B4N@Ivm?$F2HV%qDQ@|9Bu&@ zD@Kw__C0yqmhSG(C*)TzdIR&sE~=i?ff^>yiU~~fJaCONDjQRZ$MD{zdt7D5Csr_z z4*cpVMw>w9do$VxSK&!9tIz{gmYD;eMSp7OX!VGWDEjE@!7teBNfwI?wRq2PQ#~7iO-|1J}NDU@`i)!?eVrh{@ZqxSpecbLZC2Sqi1kNefpUY`=y> zMD9%{-HD~#*jd=k{PykYop`T!14#IeyNuv4J&TQ74xzJ+1Z+bkOT543eGxX+E+@O~ z>Q29Hi|4`QAie@iDgFVWIuu!$I~#ffMNjv5cz5gK8TrG_am*8fiS7gt(sFQca}ZLg z%39od0MkVKd3b3**!9>;G3yuhVn~Hp<|HuQIjy6gxzoxoA>41@`%=4}<>B=uOEEk& zcUkEK-w1xLVQ_!BdAz1J&G&)Y|p4TH0}=C#>KHJc^8WqKSYz2F!*e$3r45 zUc4*;T72rgTD`L^NqoKN*2Pt+f^HGtYiLBVxV)nL>vD%O()}ev`_^Kg&+=#1L&&jC z`>Tt)G)uTSohy%dh5Kwj$7M`0`I$X_|NT61xy)+2+qh(({~2{iKQk_C64%91*En;l z(}Nj3G&^3)&M3IHpk(FRo;Idv!LOLAjdhXOr0%a{d;btihKtkdG7&!y3w?++q+Ds| z0U0GrWiKO_5zI?w=&G=1Yvq{cn@8o1IMGBW(v(<;xu1agO0UyJrEC_Qh&^9x=NMjm!SB9Rd5dcv9mZH1<$kK3+|0I7nM%w=E1(muc9Dm zV>;0>;4v96muIIv`#JH@&t3M*fs9hsP2`03m9jECpN-s5JXq-&t>1^_I0_cGn?Y3B z9Wiz<^Ts2-i47|EAV|nHk|{MSDU=L)5O(EX)K=OsQy+b43A}h=^AF2KSSoG#1%cm< z*uJqnEEV7=`6H6lmlxJd)RJ_%ua~&gh9O|HbTmE{JTk^Uef_+%{l`Z;&NtjENVy<# zmSQ`V5~>4-2E!K>jrBooz!TisBp=rD{E?@sGW3Meq6{3jK(WuQ=C#BsK2f% zfS#%eQGN9?=$t3b?B{cpU)8@}-qEa9)Z-10cu<_MoN|ZU>#no_+T*rKiI$GJUqdC= zZ9w$H+7sFgrtYuwf6YbN{Lt&Qri58peONE@o_IJKLd1%#M&>qH?GFSV_=}du-=bJK zmkxSNyOzJ;MH|8U@=q@Ubb6#(H2L8gJ1d&`wEl-tpv!`!x-r;;-}7 z34B6FxC`+)XFwuMi69|P9UImP)RN~e^!eN=Vwd_>qEX}d zd?4wT?weiF;5yZVD%#A5{>hO8{@W%pZ88z}Ej1&yHc)8Kej6%tTRBFT4KNtft_jAR z*j91;tnfSdw3eJ|cmwxZImpk$G?H~k*QuAE->Ij@q$rtF>FtJ1+4tmF(|QIi2aXJbUB|wg$MZb#?y$<>=xzY#WDHj2!5+{8U`$BC4N$u z^BcIJGe<*-qJd&?gheQN)y!{Xc(1wV+VRs=Wx0W4?d@yh?HsG-FXWt4T^LPU+=6QZ zllR65itENCGQZvb$tsEq<(L$dkx;cw);BxH)Md@>INe1g8tV8yVirAB{v>I*v@+B&77u9VNY+ zK0NTXc}0SWuhZd2+WGOMRchJ}ipiev!l2+E4$mHvM{??NsARY7o=VA|G;l|8;y)SowWt;=|>} zDRJvI#})%mEY_ui?RYa7TW6f>S9WT$vT8Tsjh!*gyvy<;_*!0eWYBF)@hF)CeH9;; z#;T~RjB1Vj-Ur{GoDhS?)b^iu+FiddzpN>K3hr~h{~pp^+;?{m*v2JmalpXV4+zD+ zi+zp3bec=5$&O>}I;^5TFSMp|RhNL2o)`v-R|qT{Nu_+Y463YF*jAcd?kNFT$Hxnf zU`_UJfU2tINlRtoPbfrSmSBQzM5Km?udig=%ada>Fdvg|4>Hqn-%XI+{zBK3)y(BA3IEo^(&7KzBwq9$Y-^i z0yDna4OhgyV#CC%Xa*ElIU{v53nv&ZNT}X!Vz4iNOe}I-?;!M+`{>-e3?@pp2*(Wg z27Nk1c3Wunk~r^n>OWG$zH5o3aie&%d+ja#zCpqVlb?NV++TiT7#QS-gsSfd4bJau zwE4AhC6?Z~h6`Ell&E!SgfBzM*zaR;$te*`yNVvm2E-_KvPxIByCh^(Ph6kx>s|G_ zdw_6sUhbBqp+!j~wc$E1)F{jp-J-sH@zscVAdY4A*9#WkidD3yfoWRkqtF(<^C9s} z5X!Gbcw|dobA@_#??_g+vnKbz(i?8Xc0?c9`=T@Us4&*1Kes$K+rgG*II$70_dF}` z+(jk~=Aic#r@VqCB*d*s#G;vL~#SKWoFeJ&`>9VVv_=z#=U z%dIkst;zd0eVBg!W_9mb-;)2qzJon1b!8xx><|?I`NUoKlztbB*jp94Rcy_t#7L6+ zXjaM`FAgLsM&5I81}hf4`+hhkROMX)lP|>^$rSpgsH1W|lJPHaM0zsJJ#7Utu9m=^ zUpaPek&hlE)868akK7fN?ftrfREWLUEMi)0x{>EY*)P&gX*06_;W{_=R&`b?qDyXp z_t+>N=VBZ+XmB+^n~76VxcQ5rw7%SOH}s{-wYmTf(Y*Z3qqXH=T;~(q>9!f* zuN6H6HP`kgHh##;SKTf~73+>GS6++JYQ+Fov@@2%%xG-JN;lUDK{L~`}o zbA^~e+Qzw@7%hd>EG%J*#XW}ASFe~FC;Z}2kzGLK-8XSrZhVVkA{|Md*1vc*Ig{dg zy+Az1P$2e1R!WUTV2=IQ{hAC^U0`GclfN%2DFotB3mwlrwU|Y^Y`CF2f|W=_&Ue>a zdo?qs@=0Ht!u;p=i=v@#%u2LQrz%X%ra7ul7rHjU4z!Y0D38cUamkT+bOxCPv3TQiDkcE7mxg2clNUzT%087^$eZV6@KDgA&WiB z8jWYI%O@wmMfG#3m@-Wauv%QFfu4H=zoqp!3NJ4|+?~H?-gg);+>h+;_SqbFlJIua z#JwzK32Y3#Pk+T)Vg0K( z+b`ugen}xiJh`y?`ue0Ku}>Y{Q&Y0~DRusZJC1&MwdW2@gO3HrOITMY8DPqegXq@j`A`S!|mG5$Kaa}!)7nf*QTB-(L;}-u;#Bev;8FHbj+2AwG zhz^W}_Git(j?8ZPUH|neUGIE}OXlG^5&=;A ztP3A*`1(Nks3@2W6F=?}=Tlv$l)VBTxV4h|ZGsp^_MW}CvHqDK>P(4=RQxPcq8$gF zL>s1d1*3)okv|7}AlAjOC5rb?kGV$-?kPPVzpC)`A+Mld<{Jl-R{f+bhsSSjIwH63 zv7E?xwZL|Zt|8YdxUtiF+@aDI`>a{E8=pI}9U9q#_WIV7Rzt!Wi%f;Q*+N&1uq0O{k-9T}*t&jC zFIx4$D*450#g~#L;tp#|++O$dtyKAk!w}N-*+UlJxsLPG+o@bFLrHO;hKcc35tU*5 zTejl6Jh$h=dbM{`tZiG4~CLZ5U`dCEkPXBf;-H>#Ke0hor=k*y$ zlnkj|wXFL=vqii{-#QJvWTbKW1s}>zz+-5BIaFT>9UG+Xi7t=cic|Q2=smYLKVOE- z3aZUv2CCqH^s$zheM=NQ3L}T$y&JblqGSl$oh)^9*Z8_2+CPzSrBUoH)iyY?{^#n} z9;!V#ZmFBY%>jz3I10WI3wtqOapId+yoC0%qxQNr+cZrZe!TEVQNWFQwDA-_nV>|L z;3v#$5g!6KBUzw-KR)opbjft{t^U`0WaPfePo4Ur#~&-+8d|jfbvF5RZI_Ur(VSZf zYt&}7G|dvb%!&1{SX~La;-m2?gGz<0tRLB@mwb;6JI_K#6EcDKWT&4Qru{hR)9?Y_ zJko&C^WKXZI6DDc=sQrEB8~-aBZ12qly5f@(jxDS29dPk=rFDK<#F2FnW6XPGVI2@}U-k=mH z^k~cVq!%lbARg6=S?PUH_fEL zH^OH!lA!*j7Fn`I_ba2sb5KClh3_OF@`rr8iHZb|z3ut6d)@2u$I@I5s?>u_o*hBW zJ7hj}a}hhl3={k?OUbIl-fwaDp4bh0s*q5Bkl$WD8&#}%8@7MkuEP}-c1?E0Q)S?A zS>DM7H#g%%LB}dfSX?F7zhH#ur#L1^U!PuK8Ua^$x2Ac?X7CEpN3c>)xIl9bP!gRd zPw9>(J5W=FEnTmbFCG-+q-mMkA$00avq!c~v^A!z>$LnP4|c1SyYE;d4D^Q;p$PBB zg8Yvh1+1lXgiKtMI0KIorx`2U#h&AV^dAKe?TJF7@~31g@)fH>B9rgJmdx7mmX=@B_iR<}JP>aEc6lW*r)cxbQU3AM(z1%cZlAnDyq=ZhGX1r8 zL1~}A36%YQ%FD@Dl$3x9zw_L`&!k?$bN|uJ z@JB5_IT*Ojt^$|eMcXR8rO9HIF9IgZa|*AO0%-KfmRp}DFa?`_Y8^^sa&CG5ioZFU z8OCI8j7p*s&WMSv0Y(YI(RgM&?dI$J*de4UtkRwn9+wOeSbLI| zJ(5usQ(-%}dmch+`4P7;NL4_fz^P9B=Hd{jCLX_5JHSCpCW8)BXG-gc4YuuFlk ztH7r0Gm>Xuf?+4<)VRthMr43~#t9j~XYjynC;2nqNUYH{4A{H(Smj?B{{Mbq&i{ME z&nqJQue-qfKeYV3{C_w7d;qBCfBmYlIRjHwv#8|Wy=P2*zwj6P`+Hw+(cHiOVUloI zO5i;sftnOKc{9jr`y7TJH%nIQ<<7cTQ>MwZliRE5snZM-NO2ai?GqC?Z94 zKHq;?Rq_ZiuL?W52PbkusZBvGG05FG#91B_I$FtZ5iYt1?#m_`IMu{rcAH@%{wqBm z$P@+NlbHnmEkelo6x44d(zh$SaZkw%B6^|Vk2;m*#0?`h<|32(uyVcgA>i^9Nteou zvW@fCeJA=U3>N*#*z><%<%e`@T-@~7LQZE#_(xwH*ez#&e4jM5g-qEJft_lSO8Rcs z1%k)0&K9}n&O0MmtPSho33RJrS|25T?(z3|cKHvxq~$M8oe#qy)<@Z;3Mse~z73wC zTCPJ=SmyEks~MyRkJkE4r98e7ZsSXl;)h z(IarW9M=(ud0=sE*e1Ju&TC@8@E~OwQ6X%V^Agp2N?!H+jnA#l}rljg1^LQ2a zUlhcu`qYU{At$pVV22A6(`8hJnBmYGRs{CUbsPOeB05G}H3~HM?UQvLHgri)cU;c4u=<6`NjCyBqIvN%+ZP2iE2z*p z?>O%D%RA0Esu+nGsW=+-LwzmvK40nG@0xrfQSQIX6l;JH6?8g3TOO?8hb4(*Pxd8q z=rdBI*Z0cWM#B3MJKO3w3`Ye{$saj8IazcOcYcn`&JBcbZDI5OWD^#4I*h;w51^FH zpl78=UIz!G&0oGr!$nU=RykN3 z2T|;Z}pdX4|F2=hjiUu<#vxyO2HOw4E~A)uOf?twP!)T znSttk+sEzBoK8j2eU(*$`g6(aYuJvITyz!PRNcb0Q(=0RzSh08ZhZ?SVeN%vQNPMz zF<)HO*v39^&g{d1yTA9QcTL%ZkfN@SY=6@!H}Ou@63OmP9!uX@Qcc$jT$>9z9WaX? z`VFn%)I!^B%w2~!FilP;$w%0;A+Tm+Kb1Nm#Ym8iNhFn|?T$Jw8yA9yBi_{XkSuQS zJzSJh>PT??;F8ynAufPk+RA1ipiq8y0rAIGV+x$>ilcQG%2OW0&>@5e`EUa3>`PxIAf$*kn}GW8GRIp|Zn051)1^ zmApE*<|-4$5sm3|$(zhQh4?4?T@2i%P>#Q7*gE0Pmhr9|Yick=KEW>rg z9ce~ly^hYK>e{m>#k{Yv!nqtoDF}&xQ#%{Pkut@xiq{mU68c^V??||i5V9%T1*sAz zM{y)?vW#ryQrR#Hf!aEc9kYfck|EI7HNp7gIki<4$Mwz|U7f0VfgkgZzo5dOv452s znd#@~-=2BoA=GG>BZx%Nq5D@W9pC(+?jalpS0p`7u0GY&ox3@kqOFHpU;(B)sjw)F zm~HUi(`y|HwheHp<3p6@rsI8dAroPO_G3>Y?>OX^Zl_leMDPQ*KOaFt8dK4GlR;%i zs(Y>5=>UD36R$;Vr%SzS{bG$_qN0;ypOFqAo5nw5O z+^^_rL-7dmx9t$Hqcz2b@LKnFspv_bdSNA61JxV!%<_{m`g0(oK_L_#;q@pX8VV7q zctBi`T9{=;*vmQ4z;Qmp;n4-(C{&cg@r_{x;o>WPld-F$WQubj&U=n;VsD8^bqf&F zJLJA0LpSZ|&|e?C?|9gH#rRu5#v&70*2}pytD8T55=7*ZNJab3#lIrB+DRDEnI!c| zZ!Vsb^!ZC@sD+?Q@%dYw(J~{i=sYkipG~nu;6%+`7 zLn~j`iE5APeauX3zKGQ4!CVqN!uMa2US)p6OJ926Fez~D?UF^P7$xD`;l3P7i*~|V zI(Bv{+#9lynZgPx)q8%K-qOof_+%Nibv1k*J1d#({Opm!0oNxe`-VExQX`JN=PZ@3 zJh!A2p>@2%n;5O86NbmTpVXe1ga2f|W1;;A=*d16?q&;q`ckS8^%3#&PKjA^fN13s zK}}a$zL8V|w0U61%kKDw$Lfw-0RFp|9Y3xEbQZm?1km{^=`TJ!LQ9$e{BrrSroC9A z>z~2&#ccu13V5;*dS)3~5mD?Fqr|Iy=gz{;5wL8T4`$g&{1l8$g5=Hi;N-ev0*i-G=RFY z#dO{wGZ*+omCzaV;c@4ZGTL*rxarE<%^g2&sHeCFygnBoy(xvdS#?!@qlN7d^>vk` z!}GK6>DJTy?vF^x9bgXUt@$AyXLKBSmB$gO0d-v1D+FQ%IrjSNqE0d+BVu|9C*@bz zG~7H~&{c5z`+u1?tvQgis3(ly0nEle{8Wf2D$ zF@|V04wn;q1M6ywf^6PP-c}r6s)?(woS8K~*|%d2Ung_lujkcSd~rnAOQACpdZ~5r zl+ZD;u*CWs&vX7%j|U-FmLfry?ttm%r5%%3V@MJY1-`pVt?fW-pfiK$uVU~|-8W^H} z|CyLxmF^82x``K<%@;6zlyCrZO%ty!{rfMCl>OFuuaR3_m^>Cz<$`i1MR&y!ZN}ty z{Ygg(fWwn}JC;+`FxRu?#6%+CaOiZc)M>|Y8C}Pz>GbB0OjSBS{#bg!% z=zw>tlruRy>X`(?)=|?yD&G5Fj~oT&@Qei>=9W_v7%vHj3#t&lU5acA|8V8)5;vCS z9U-6xc04Gm_g{SKA70A7578xU=p29B7-O|d8}s0|jfwbhNm5s`RDhh<>A#x&sS*k1 z0gIdzWPdP;7=+?KNxT~2FCrBt;OL6MZxOhWd=TeA1FYdEp`wp0y1n0}I|+~jEiOmJ z6iL8eoNjJJx`zk6UB=JevRy~5wN5^W0H~LvH%CvJRg3G%fqu1Ix7o8jG(TxN?OCY( zld?j3^}`;3-M0RKPtLJ*8aJYrvfTV(B9p`e_vWdYM0oawL^wE3gz8K-8(Nf``{pS? z-3SBWL(;l)LULO~?ZNt1RA<`$UI8=!|LO$tytHxGvp~{I^^)}Ld0mbUntuJ`S-fQF zLhC0-M$#kI7Moi1Y_r(e;}A{o&Y`e|8qgg;0^dU)gHPnHr7}}H=(Z4+m+w){w_}B` zT!7kM*>`}T=SqHQMO!-mF=1OVaI+gC6i0u0${V@7tr<7=&s>wfZG5Xx?Z{sCj~Pu3Nlkf zZCQ=D2Skjj*n?Wo>&|=SnJIr9Y9QrIm%XelfUTm6#DNyveku1`A%Mx}(e6OxdUrrB z`RhYVd}-S%o?P;`M(t8%6feyoHDKWWQi-8Qj`f*%PnYmJY@C>102%-$eE<1cLVdfqL$e>6@ylPMgLXH3X;5; zoL43;!dq89&kk_7d=WWN>4aN5>=qQH01mVF2Fw;`=erI(bc+^1(sJ2CfbEsD=Zg74 z1UQL$E5JB?fpcza(O-WpmZ6hO!?b3flcR^hf2!tDHEJLqei(zIh{-0A3ImAWHQkUD zN86txK6~{KQ(X}y)(~&e$&G*v2?DY-?K#UPf*+QzUt94K{rKrXYm-iTwUa57?hgLd zPAG=|IvCJ{NyA}oGL{oh)l1qOlmGUwbGI*DMO)6LDNz`{Bq_t4OOmcLiv#4m^re5P zL@!>4E<5vcNymD?l?mLSzi@m*Z8f)cO8Cy|w#X_sk`GwJCvfs{#C|w@HC7mqgYSBC zK)kuVaI`lu#>_=nL&RaS0lc36s6c7+1gL3Xz-g>%yLy zIt1B4}?CUy7P67~YN7Zbbm*qML&yIHt+ZTq`(8SL;_ z?>`_*tF5}gj%0`(RjHYW;;UFY(9H@khF!}2Bv=;UZD|Bd^(X@N+g%6%ab3Ktb>Jm` zU2-o&ft26o@K2wAsS;V*bDpmV-u)zu7+a9~1ZV&gDcL;|dIsDZ9v}#~R97xXc{@-# zpfA8|UPwC1&t84Igx6u~#4LBFBc7it=U2sXkRK}|RWj%=GVxg5!pqUv-Ktd`;ILH( zBExPGJFp&SW6cg6DlKMow>PxLtnO6mwO#obt!PIkA{9NY$Ie0lI0>&Iz&PE9=uVda zZpvMzLWE!P*Nn1C4IpDV+xCSG@wDq4BOL5XbZ@8u;>XnZ2y+Xjs(1ko^Jk@Fsv_x; zYxx+ytPc_M)3T<4H^lD;zI_`sCV&4KDKPq+;rbT{rSOAm*S{c6Eyx%FJt%L^filZ& z?`2)mX6xbaFsX^<(p7}2T$+-koZqJ80pLZA2A_BW+q~3zw8dHjYO;#2jQH-LUi1*AdvCVBJ(6pdG0gCWFS#L zgw#^0sPH(vIqkLwXqS<++lJiO2mZVwz_`@|2C5{lE~y)F;d(DOhf9ynr+&8?aEOBg zX{Uxti)o%dvR;<^ol{DHG=45^^77_$EbUkTuV_N*-r&V`|i-J^?FP*`L1H)T^I08eURhe(L6MevvQhfpW<0 zp(IQno)xOM5~rrRv};Te0B=nha9Jn@+$DdvtR7w3w&81+{9S#0848GcU7ExH-7q-f zQeA-;g-OtJ;H}|uHoz-H{f(=g1QC~k8W7@YsK%VxYpwt<$Zw1@FC0r<{t9VG9nDu4E zSeKUW49FPp-lgNiD>$f`r>T}I1mXpV|F?KkJY(PU&ihYx^WrJ=sCCO?!iZyXsdwf9 z8CR&tGG4ySY-1z4hp;O6AWC*0_Q+oTCh%jgpIIEx1FJy53`hST?7ekVRqMMyx&Q$c z0i~r?N+czPMJNJF3M{%5M5IBGPKyR5q(MQtq&p-9X;^fFbayW9JC|Gc_ndp~`F-yh z0ASh!WdJzg7{$lt(mU)m}2A80n#_b4>GM8ZZVXkjc1 z2z@`l4V#VUy`Px#)?CO_W2sY2Nm;z8-0(<)xFm6so09bO@)T)sjqLIO7thVW%^x!vX z|5C zG*8fs^?YbYG6V(ewxD+Sd**{F@!!H=YN%WRQ7FRj0jvS~G=M@l5uXpiqlSPQfVf#H zth-}5ZMj<0utu5Vsi*V5AuS*W_mXMOf{Fu=|Daisz+euleFF9PnvoZPTPUMpoYD*1 z^e_ZCnX~esIlVtIw*lMme)uX9LW~X)l0T>EE+_uxSBTs+xCP7r;UJ)n#+!~(KR1~! zUmK}&61vmZ+pR}Py?WF0d^@Hz76-jlXo!rz61|jruLki;`UfbD(MSq#nNGOt2!2{G z4rs$HWz7KBpARig1!F3*5F-LQ`|MH>OtMIXmUJ-^0LwQIai_p?{)U&(l=yEM7m&L? zew!Bebe$}82(vnYmp~Kw6*%sFi?-ys!JXBp=K~Zh8lYM_KIR08W?4*YOvB!`Vs}hE z&N%K2IKuY(2w0hvl|5lVCtHs8Un^VRDEs#u4)V~H|IN|>7((>-I+l<39$5R@e*Qz% zgo>sXUP`Qg1zh{vUZ!xuxM&nLD_!RiP+Z=hR&fF~t9dC@ARH`xR$|7beS747fCVMi zHPcXceL6Knpi5Iwqu2E6x`l`1?uLSgp(L_@yqm{*pb=D;Hz_jvmM(KgTDi0Lt!>bt z8Z*``InMTa1HUAeTU)Gb*5N|HNZNb)wMd}%G#HYfTbQlHGy%VE#hhPkscoV47mL(C zT_FOH`gMpYnh4_W2ki3VfW7?-7zZh)16cB^Z`_X)qLFk1h&g49yWls80h&{R?WVK0 z65z4tkwD7Jr5#JJNxlvEtg_3m&LMzPl$;HRbHgEp-6A{gL$aP}3iLG1*K13LTK0ib`%4c|wr zcHG?1k`mN`<@~o9mn~|G{dJ=k?6B5kon_*{$r75#*gvp4(tGDQ^ym_RB%8zi=qsp} zICfncH;s{oyatSm;drt2-w^u=S9kG9*a0gG9ABZONYKknz4R$gcs*tAJb{IXjU5KegKU>R^!OT2x?<#Dh}1;myunSWIUPU z52}mcR))5Exk9Yc%UuHXIS~t(pX%6{4r(=(>Y?Pzso}wyw}cQd3L|A;ksXjy_ zMRU^Ik}+Qa9iBg8e$9A(dY2#x@YpLEE+gyuBIPO`vPOWId{N`86Rf$`L7?5bKgT|XPSHqjZz%<93Uz~lU zDD5I*U6=~H4#Z>pQcntb8CG^FFN#BXL-{^XXNES024KATd*DogpQcC!+Hm45Eu^%` z4aeVu)&@rhJt`<5#k$b999mLC187NU-ayOw?=r6Wlb_l+{#Y15N*!0K-rOFACi2CP zc(E#}ow}8xqQ^%`x`v+~gK81hE*CobTI_2G9>WVCa#i;>@D6;!Hhb$J;+tZL#lN(g1!{J>c5dBe`p? z&c{z*q`AVE)hA(h_x7u^IN`LJisJ~d^!a`nw?{`*CwPiYF1<;UKXP-^P~uy=3KVa@ zlA4m!DP+CyX&|X8+FsHH!uKm0HAG2{U7TRj(h^Nho69haBok=gCnJgiA%07BMS0D5 zbPzD2q46W!^rcsNvt_D7db1jJ)HhwQx=tV{ z{!n!iekN?4@ocl1szS`Q4#V$AMcGZm!_no-OhR51kbUN+zKv%lN97F<-3reJDlK>x z&)ia7Lzkw!5hv;8+0sK7593p%U5@d1F4JwG(mL&I_r|2!uIjN?04|(8{%${x5bfc0 zpgla(=?P_*X|#vOgZA*oetCF$Xb(@|FAvWdOcxOVxZ)Sd1f7AU?KHUn|}Bs>~T!pZ+4;s4%}MdXg>L5>Bkg1*OT|Lfg2Hvlg_Vt15z zaOjnleJ$Q?&*pxlK?|IXzMM``6WwV+VBZ*d+2%(sb>n5ad-e2KZkq1Sbv4v2&5=t} zf6B6>RVdP_l9XyYubyQmujrlWOF^9+HRHgr zkOWJsP(dY?dI}U=VM`RM`qbPe!@U>{vVwx$-JB|JPmH7OYy_#Qp|jm5H{+Eaiu2vW zI~6aLm0pftbs@uT6&5`@JZujw+wAaLa@9ZEXb_=0^Q==~%@7{IK{+Q;Qp8!BKevFj zn$oVVpX{$^e@UdQd%j`MB$ACzxW>tUO;f=;v^Jt94w`r9w@(W{uR}uq^WeK?gk#?MD zj1}`2#zI#CVB(#2c+}vC`@pU30Mai%7vzNYW#xb`3(A5A2vVApgOEOp)vO2X3R*#a z;NF4afXr-re|0`pixo>l!+|TfEVtskRjO2UGZe@5UG|ac)Zpk(Pb?N~9;|FFivafy zA=G=YQ?R*UH}kU@OW(#bq$eAl?N~)Kj{No*4v2tT+H?Xvs-Fr8HG@ael0QMpB+<$7 z>%OVUv#kD{v_c@yMtdLA_0x^hF1jZ5K=yu)bv&m6{{DUuRvhgyVim5r5}TjRd`?Wm&~@Qojs^P^(qxuZH7BS&-n6fA6nvD@UP1I7u395&Q8 zo{9OjcQoa87v8GYh?|&{I2JkEJ~w#sa@+r}2BXEHM^!O0IQX&wqg93(rOJm)KAJr( za?l4S-7n)AC1;5-WdgMgPP1`@{yK276T#A^j^QWuqJXtWBjDjN;a)7LDmH><-_6oB z)s?zYR#s@bk>QuYEh5xa&0`Pf#&e6KF`@J{q4fX}f2^N0bf+gLb1kEe#*#0qb3GiV zdm*Yw>QE*X>^vig&CopAY+55su=Y$ug&}@z4B*7FJTTC1{?pJ_Vi?DZc(QqqSX?xjm(lMxA}TB`QC=e zcS`g@Nnbpgd@stO$#)547t59ZBH!pX2+abh3V=jwT#g+Cj`)3A!E(@xbupXa=)evW z2<(8efJPRZwK-(mc^QHM#Xv|M17aPZIG~hMMPp`k#^24Vqdt8+ode0do?CUibc+BS z{mu2AVMkZ{!`*lg>tKyDaXlJxv@74-n(+c7l)XdZoTEMq!uRkRO_h1IwRV$f5^h;f^lRWj^@$s;i zAspD)+LIK(#$HfXz6#mcoPqdIs-ttd9|}1IdyoO@o!^fGx-X07HrlqELECmTXxnbl z2W{JVqiwtLU$&j(U$))9wPYPXGacBVjFVUIfPT&HV>e^{N!VM^^Vbsm)h#))EZl5? zP4N-8;}EZCxj<1XLNEwSPtD0#wiM@`x(xkKg@xLcT2*&=^S+iJHvZLM*vWGP$1KcO zgr;Fe$;4+F(M!s1Td3iRTyWAQRe1s&NLWS7vNK8g`r|omB?4$2N>vgWNlWv5;%WuZp$hp=E#nY~IEN-Mn76?2 zaChH+YFSy3C^Ru32Dj;K7W?!y)NiSy$g5^N4M!@KiVAE;K4?tBXQwW=($jFP+HxyT zS3I%8?2cGO?~ER@j1TB1Xt@@jj)Ce(zZg63fvbRILpd7mdn#lJf!Y?pY$8(9w;g5Xwwn0m2WpfXDiJmRQDk;|Q^o1=x6A@By8-?Q+IsjQ~VR zMviP$Z$Ck+vQCgHt0I4*ZK{Y?W$jYXsw^6WFpd3EWzlW$cNGBdj%N&08XWQKgw$Zb zyyx&Tq(xiU#K6J^WdV&WGQnaf(NUWR1)Ok$+Ckor&3Xk=p~j|FEXC+b%F6SmO>HoGsv@6(`P$AnzC6!7F-d4i_48Jlw1WBjbym8SvHN=kbr_DWd5e6!$Z>F@r>?W-))D$!eOt2HiI-3vFQb zY@+iV1n4}6T?0DLA%V_w=>E!cT>mT2fo>fCrzM-;LJE^X8dUA#a_)rl*XjaJYtK5+ z^Y=R&ZwZk17gv`7|M~~k{K?zl-67^|S!#fQ(%7sO$W%m}pCCCOX$`aMWsg%wYiNv} zOhaf0G?#!ANl(m(YWlGn)x<0v`|WQaYF2OJ zP`^-E1Dbeq`@}>^0=ojT(;n^DZFc8!TB*;C#Gnld@FZfnV1mN+0Dw)eX~npg0QA!# zYzPLkQ?s;~SdG(dfpJZxxbKA9uH}#gGwlBT1lMb0t|{&Q)X=9YL*u>Of$3Y}a6=f@kMc<{j5FgI`;W5&3H) zQCDMtAp2*Zt~h2A$KVbiP!^<04V8whkiQM_370MNdTH$i3T6A%1LNo zEjb@Rl%6FE$B9Fl924wonjnGeoHPtIgQc`IR}gLDB_!O_V{Z>Y4wHrh_$ak)eO7-|KXN0^3K0z% zHl!WfjpvEKglvPIonJz5FvXAA-e2tg*u?4M3s^%aP*?0|i#SrN#yWm&r0 zKxhawm>-R1h7MFz6<~a50`irS@|%r;ldgo6oB6pXHxqiJWAYCWEialXtaxHKJOP^c z%-s6=NGDn9l5qtTEG*o7Hx-bFHexmm-Zj?9c?T>E&$s8f|7$)%mzQW1CNv zGf4>v6Ywai^{ljx{ar%E(QOdqSOJEdt;J-nK!z7!eDC^kK4pQ%)ZuY9F2kDfjcWUr zm6-4(j4@8sPm#bu)Ng-xAeAh^!ovYnM+WBn;e?k8pTF4n;OP`G!K1!}kR|j+(wqgf z1L^v1=XH?c=pTNJ1Q|awbOPKCj!uAMp%dUV z=mhxUWpo0304>Cp|4xAaTT52vx*OC8Tx+=X(a~}VZPxk8naI=xY5i_g507yPt*(P6ZnM3=ziRBSvRj}F zCH!8v?kxWR!OXomDAJUikw)2@gtaPc2(YP7f67F5s9(l*$6$frqw&q|&Q7cNwm=6p z#QgD*H}e{p&m{KBN@HdG8v|6x+66m92{WumYTMQx^EDn;jHJlPz{Bv81R8745CytM zW^ZA-#^a-975~oS8mKx{y|z!*Yty3}>8w^z8z925r1)?by^%p4O^`P8XP=F85deqW z)vB6~$;2a;Fy;$~)EZFIr*XT|$O=c7x-@9x=ej!;t>Qb1T+$(kQs_)I?jVW|_z9r{ zei^b|(31Ab$F1^m!e0QjJDiuU9Jly~(?(gwYl(Yg(NH-sU` zO{9RbfbNFCYzBQ;hE@<7Pyi!A2@dQah^qrYn~`q%ce8@WF2(%@us|D<1c+84H}G#3 z7uA%S5Gb8W#VJO6;D;3!hGz0%=A7ubtHrn-l>T<`2dc%Z!tpeIs2K>cvI4o{a(n&j zDs^xtN0Gf`GLW&l;iG3?Q5$;?=BdKLgu3_g?Y66pX=zO^jbIaStO4=C0FE^WWB3)w zvF;hX3FmJx3W)caS%B{A6T*jf=!AYbbQoxdE(q<=+4-OyIy1CGr~8*f z_wOy4PPKEh0f;lv3c8){Y7_Q5?15~L2ASYIs?71{T-|WLKuMGM6Q{}8nnx9)$6sFh z&iH`oiQUm+kRi7OkKi95YH1<3YDp2d2jU$orH9AIdj*Z@M?*PK^!twJ(eBUHR#%s8DC?@MiU?fn z_S%cf1K9MwS?_xPLrJ8Q@rouj%lg5>{JenTT$AvvjBU5mdg6UBpDzlhr>*Hw9RMQt z*seV9a}fqhrc-In_C!rdh@a_3(@E<{CnT7r22Y39#|2M=MM!Tn9+`luBcs*{N9c`g7BhsjnLqnnpw0?#2z|ERCR#x(h;9W`_B$wPRL4=$l5VBQ zlRjwUw-@G91r+Cps}K-G(W=5<7p6lezvIx!Z)8JF@?HZv`E86&expIilb$Mc^4s#S zC=npq)PbhIS)ANVZ)Xz#ml1S?u8kNnGH50*Q~c{b2!5+_ z=(eDWMxa{U)v`jMn*j}JIFKuRe#^{S6^T6{yYZZM%>%7MZwJais&aXqQ?(%9=)?d4 z^$dtIjbS#!K$IyWq}2zCGMSkBK*>I`5-8~EaZ&)~zKi%l_r2c|jgD^6prad$Fm!Z7 z8Xesb`W4;aLq|6_{)%q=drQWlUu6igy7YvxKuOQWT^2qDp-(ovSlct5$``gzES6)m z4L^N_gFI}SZh~7+c>_Q|ejwrVlpC2u4g{^_+8wzp%LZD-<0k%!f&DPI>b zpWgyP?T~|ivMa^MB{VkJH4FaiP5=(fKX$@D zb^@gK{bMKmV<-G$CqQc7KX$_Zf9!;_5{Fb>6E+xL9(qV6T8HtN z)krp6_C8aU#l+R#UJ6g@UDHK2(wIGAI>mHw-iszh1E%18=z%glYCw;5V=0&YUBFnKZZyLYKlIk36+zF-%-f zUIRr#=rY}hgTCmnqA#=Z(B&L~r+~yH%#jEB!jMF8G#Qirt*CV=JApXS>)OwB1h6{| zwV!9`U?!I^z2lo;vt8H(DpauViG)-jru4oX*5Iie;$)k}rNyZ)j#3j_ z;Ih=PIilmK=ko~r&I5y!ueGUyFgZs16SHc5+9=&)r>6Lep6LzoP3^&fZl4!WCccU` zu*iq8!{U>$_mTn;e(a<$O}kJ5CzDI!L?CYy)QIsQFAp9Y8-7= z@MwL^H@MOh+jZk=+Kw)r&gL{jzk-Y~`d}k>CUjB6a_7VK*%h3OznWR@HI;45gnb!D} zND#(g(r3xp8)KW@5@VhYwtF=#@mfOCZbxK96YR?)=2Kdcm9*iBtF~+ewXT6$htrQm z;62qzOT~kuUf5uB9_M@0AO{qKn2iwx`Yh42rdTjrWM<>a_|}`RNiPCBEK)eZO>JB% z+mBpF$J|*g^PFDE3NsI|S%Wix7dw{fm846iFF$8>a30q)J&awI<4V*{v751+q9N=> zUuJRv!hCq$6`pJWzVE}nis`7;!`jK2c)v0P^ucd6nj1(8gBNyE7;Q1Zt}YdA9e$H4 zeHr05G!1*Iw9ZdmLKi?R2>Wv7cna*;mu?|cqZZBCd1_dXk4WGJ=%PY}{*!Gw`VuMt z{l`C>3w;rwG-(}i(Uat;b_$f=Lr@#;g0R`kSl&S%urJ)_slhEq?mCUQIjLAoL{p-CVSVS#$Vd@00Y{=ZHQ$v^u^@8X|OnU17DU+Ce`<^N5~N%dH`^%|7^CqiofcAia<5A5J< z%BA4N<`BBkiFGyy=Qx^Os(pG?yI3sbZ9IUC5QJ7!rm}K~TCQjd+$#%fV=7MVlCmPe znJeLmKrgjX!P}HrQ^DX;sZy(cVAWBCGj*ypeW}yB3d1vbbF#@;)YbAb+f?XamOMi$-25ZK(!4H*!S%Ijs5! zZQ$RMHWZf|Y$ zpBt?&$tUP7m=rtYp$3A~MIvNVXQMYU(f)J=U$r1Z#+l7q7mdNbF3Xs3%BZQPYV+*`{@d^RMp0e|VCpBd&KVO(a;?_i%k z8`^D1BXa+yjMCCrSZkb~PWalTGo+aIk{*6c#TIxW8;Wb!!Q95QP53eC$Rq`mLhjfi z&G8m{d7K>Gd?zQK`amNU<7U7pt61ERFGLj;z6hq&lap05xmR(vIniTgH#y!Fy zMLbS6RSwczJo3X(yW6zd(HD-!f(W*xQoR_SW6c z)=nSWS$^L5@#BLAJgOyrF=6Si)l2Sc-G5+b$ow+W+`8)Gi{x-9nb7+o*6XE z6zKg4aH8(UnULR|yCW3nlMZHEC$lg3-q&T@9T2U{RB@4-J`Mar?8$=~ z{!(N$?XLJiN247P4ec}4t#j68-mdjG3=^7}C3*{{?!;}Z^vxRAG!I!7>J`n`}?S5qz;%m5D-*-3Om|YjK4b|Uei8o=43MpzaJEGN2FCz zJDb0P5{`pIy;rTr*WSmdWR)gn|(ALKV6MAgdA31eiacvq`Rn*i=wvJh z*UzPM+?7^@j`&dmr_qT64CZ-;cZPxZKBoGAe@Lz%^qg`l1JjFeI6db*6Fb{SMlU3+ zEUc|8jV$fx!3*~!tjw)ms8~NS1P?F2Z)9&`X!LJ9B=`T}t$+W+XXO6Nd;hq(`0xD3 zr=t&RKS122z}-+BL4Ju5VN0fXqT!{P*xiVmaQ#XM%Y%mNM6KRFX)DQGGKpP}uWU00 z5?vhr^wY~-wDBFpk)iY zHsW|+tq zMzfxt^bf`BTVEf07DqN|#Yy?&l081Me#h?=Sad+iF8aDvVukA(p@u)*<=fQ$%k>JK z8cb#ubCJf(w-pmG>ivv}e38vB7)?*BZ%fA&WE&5z)2*4<_TOpUv+%iyN0YZ1mShpT z@U*hs#?6?HO`lNRV#idg#aV)P5p*Xm5{#l*ZsHd3w(owrP|Jf1Q!?Ty?w(29uwv0 zS@o{X#|=9GF5V9l6)Sxmg{xuWaYRGBUyR6^p2Uh05Nq)dLvn8mZYJbiXAeA(jHo}h zIdQ*Bt2c9yD|sqKU8B@j<25ruw97etU=JW$Goi>_2N9Kw*oq<5%bl%r^$~*f>TjmV z{f{%bPKu^QD?{c-7##&U*CSdEe9MK~;ZYAlHa{!(*RVFemN(eve6KXb{@wP4dpZLl zUd{K7)2-&v;O_^LJ#dYf#zS%n+$+-_K+#`N+=FXtEaV^Y! zr||yh?7WpBEw&%aR3$b_c{cQcOR4)C%SxBCTP7kauIprWw2y~W)T$+oUlLyHzaeLM z*W&|5bM7lmJCrud=}0o8)S?$#ZgiwmeJib2QdoF z-q?gpYwyQ4OP7rkxcYYopNPG&?vtg@YiY@oc?{L<;ruoh6;iMJzi58Y>qr0hG{4(| z|LM&T{bIKoFknra+a+HfDa)CM8Pv*bVh&z)#8O)h#PJUlsC}#|hw~#lAZ(Q_C+3pF z%iZJrAIR=871tW8$pU!23M+VFtec78O2W$1(}KiN^4+Ny49hA}Ek~6(MsAcYnhDdT zVoUYA8vXM&9Lp*r-;a0+^F?C`pSf8w=ZkjYX(k-0^{2iJ+Z9t64BIV>X*;T9d*(J? zQXndMXSrTd(Q;^CG<-2j@g?7K?_m3pNU71PTPbDx5xni0o9VJ|ezy0Sd_xQ&xUCZ<;t7p&7zJNwY()nNP z^X>mt`^?SF%l{vT+=$t85_J;Xje;nJmwBLO-RYeQ3I_am|k}kYn?8 zaq+!?kc+Qa+%GO;C0)7Er2L?vknw@6Id<=$U#<^DlDm(|ja!Lt&JXJr4Ivkpnxo)- zSv+f_wjJh@dxRCo*H%u}I!2?8FNw3|H4ypVQ!d!@lgXrtuG%jzUvr9~%8>Qn%2!T; zr5bULX$(!S-c34)HZ94H-_NTj5d0QiQ`Q^8*>hsq02b3H9DnM_4u51R+b^A-+v~D>Qs_jq3QhP+#*5AJ4akJ4uFMOIa zbHH7s_udCW3&t^?2k=_Gs~&_Oa8tkYOg@Dpy%AolUAJS~uma$nKdGd-96b+AY0qr0 z`{P=djuh4J*uQ1puMy5WyS4fQ8^`eG$Vpnnx1)oks`d8yhf~YWM0jTLpXv^lqxYPZ zRlbYtax&jc9W1CQ7CXCIK!}Udo4eWZp`pIl=eHX{$w!R0Maxcw*=E$0PHUdJ*3EfW z`yj-mu;ENIbje3Xw^0NcH4mEf#dnF<9&D`c>^i)?X|?StIrmMeao*$8wiZUU<=)Hg zRgQ^d)fJP{i3N9>f&N~({TP(-S>hXyS8He2rg)AX|0Ht97}LK#l`4|5^=*nsw2DfZ zu}%WVhED5wVt^tI4i8TCYo4~Pj+lrU(&5u2qY(W#k4d5#j5(HE*nu(L7L21&c0=(U z3*r09??%Y+PJC5pstkXYnuPO!R8xUz|4qc&b22CQ@)+A z%YU--m7(P7=Bs_}FLEv$tR5bweU6^#CH05eLrSw4SXG+AUWn98YsaICZ%F*iqoeNyqbty4|_;u!u2CD-B@^z<~zzQA0(Y*yFqo!{7+lP*3tRZv5Bb%5qkJL)cOv_YdV*{4kf?8}uB z7?;-NV2#2=wVMj(1ReDs8)rE#W9n2IVTg`rcoK{!deV+Zdvc72c#4kud0rSNAG~sF zT%(r6isf;T0MS=3fyy0qc?#{Y`a~kO0oD%-LHB^bkMHW>hRS}=7`c>dC>W2Te1X$_VR&O zt-lD9qt;`AM*Xx=mq(5=^eU1+{X?Z3?@gYIt8uJ5pG!g^%}<{YIi-q8cVp3)mdCYJ zT;S{Jrr{oE{wy~IXM@aQ)CToYz>DHp25Xa>LF5K4kKNzqXj(fz(OxszI0)_W3T97Z z387^1p4x zF(Ct^w^_{(QPzahY6X7pkMT-pld~I}0=}6F8VvDHYSsETQP<~rqZU~{5U^!LO6%J2 zCMv%OzAc`hWg)5T9BlpbZQ6$VQ^(F@9!f7R*ZY`L;7}ZDY+gCf;H~P|Sy9fQR%wVq zxsHH+6DFzM=s5SN@&*R=`hCyW4)nG4+T@edZWvE9*9q30Jcfw7zG;(m)oT-XHEI)e zHEUnt`lfxEtDXukavC4IZBq)9e**_|DVvG5-roSc?AeG0L%4l_?5pp8JPRBfm%LbU zs9#pWA z9#hfBpXJ;$eejIX!P60?n;zVJjx6m^a%X5gX~W$4!tFjht{Rh0+9h!@FLLQ!<6yf< z6~BqcTrQumX4PNugyD%#U+}^>deX(jQ>iuil3wft|NQw}q6Mj*AJT0bQ<&;MKJSzZ zKXbfBAd5GegWbEFGtX>HIOTZF{^9sEMSabCc~o=^ygdFjxqXP>b9c&;pO6TMNNMfzTQu=tT(k-5jEWUJ8o z9&x?S_0h3$@txSU!ZLmVk^Okv&h=Oqy_4!oqj%h^D@NAVs)SX-ex@})CHokDZdj-9 zz=_iL$I9{wcGg!@B~x=A%vJH~)VC)%QxqIUA*a_`+;gAS$mN`Is3nSR&AAp{?@V|Q zFgO&(+uqziKEB4)P~$%~A9&T^xIi&KfoWj>e#Popr9b! z_|1fm2gbp6!}*Cgs@%DG#{ibgPA8-vBHkTT&*bts)(q0qiPRoTN*!W_oN~0FjLO{2 zE{$`N&ff7}d14|;9yq^^y;;r6G}+=qO+25pR`kNHFM(x1dN;()?tcD+x7ZGMn=~%t z;rLm}KBE|lGsLY>D?j1p&;-Mf`kj^AtqDDIZ;$y~P}pUtOH+&FtLns#-%!s(5EE6Q z4S1jch@3v48fb5Gc6mq+ZsYBa_0#YQ4bho()0nO9Vs3eHCZ7fD(Q!W;8c>MA=DGRs zr;eIu@Y2T)?$Z@ssyV})vBo>^r=E9OXvtgN?nXrP+bXWzQ z9z832oLyq)1R>eiu$PXmxWc-mi#W&I*lg-4uO#BakM@7iPv}oN985kNtB{P${c_?* zJ(j&sdST}W8R397Y%Ue0d0TJZg=j9qkZIu-YJTUfm~3>|f2E$QjW5$o~=F{s|M$%2N(kS;VHR zbplfyL;X3%M-xx%{pNz0DshPg%UidCyMo!~Fh6t75aex71>ZCFBL7yAD0&Ar8wLwn~SvJmFh^NK*3_M0R5%uCcGg*w+;@73iR6m{BT zy^dOG&Wq(=TuD{HJTc(PW$_;J*zWc`WBkyeV<2?2(TFo~w0+Z#do%c9&2(}{6VqwT zB(V*9Ui|DwhoIh(UJ1heZSC#La?1Qh8#M{qL2D;im__qm|3zEl`~RS=@o@8j_iI{$ zmvvfOLGS9MfA+-O7Rc5AGr5@$dcm8Vk)<(sF{i*C!T-d>;~X3jMtjZ7U)mT#g%+zq z#~-YVM3LM>`p|#!Y~{$o*12_^p0#2!pEbuXKi^M7jRbN3K87&=eMvSJ7Jn8QRiWAa ziuL1hmw5%Eduwe~wzqlax4qX2JPt;A4n^lhRz-59Uelj{^`HNhnY=f7#)x^U>Y z<+jiC(o!p`nSSl;F7~x5!;nkN6aoSQ4zIkuaStP6VlrbgKhZ4^O5$8*5|dz@nfi=e zf{Tb$QN+g!#i_|M+>g7QN`oN0_bKCZP*dE)CfW7XnVIGJdCtlC`Q@4H{b`bhL;5+l zPhyl9k{f(EmOD>-Y@)kuLpBMy&f#Etzj^nTxUR15o`l4!*O>UISkIk!A$C>5CJ_Z+ z1_FD={LQYVwA9U?_lZfUDQT~g(hyUTC)9q3jEsDL8N6kOn3VJi8D-mI^T3E~>dzpK zj@{>vL^`l@shB7UX_WA7_}vd%W_?{r@sVflxXKSB9SUw?u9U}-!k-JZ zP@Wer6R>n38B$Y>i4;{dbd=Tflr(i!wAJ+|y1w^zJpxjey0(g{rk<9v;F~n&YfQJ< zSZbwnx5b-h-aqi?GhmY=VtFAhX^k7UVET@Pgfv3AyYEU1FQ0$_RUrE%L;vpQ=9Z?@ z36oc)f@PEL4vT;#}xuC#Zye4`kWI`Wc6r1K_} zl!D!tTMCPduMCfz)6&-V^@)z5TwXR6+$EWPmcrC1`3~pEDO3fICRl==X*?%qtq*Bk z{VruJHuFMgX|(w_B!XMLx9|Sxr7QBnMhjh^r^W81y%NN2NKY-!NG#;yF{{e>#_M5Ql>hXzahEuc5reN`qeu2dHdAV z!(PNQGm5gZb?GY-u!jXzO`TLngZMZNx{Cr>Trm-dA0#;9Qe=#BzCDvK5RO zQ-)LD?jh>a-*F;&w=N)L#X3`~brh+{w|VVyzeww(tQTjl2<{F8at0rD6 zJmV%CnGU|lr*qxkg+3iw!?T-Gj+VBjD=#Ssd&N$C({O?rrcf4W2nP7SeK>KOFWwJ`P1lQ}UOX+NC-+GKCv?*6tVy_S-p4&xJmb z^atFBv$qGnyf6H)`!mLPA^-VPvun|oO8D{>B8@g|*T_=Z-(16fE15j&nUS6?V8)a- zWmaz1JgA|q85BH>V<-)WZu;jH`!?MyzPfX7f0lHUfB&l%+gU&dmlwjyp%ieFDc5M<@ib*$Ed*IM0Oq9J@En z-tpjpF8+kv<%_P_+4MP0Izq7%CK;Iw(rOx>CH)p%^a~SxH@ViCx|)*p#bMca(#;Lb z(ZLV8&dF$z;q(WxQj&B@IK8l#(ZZ13L_Xh!7lfFib_qf`m`SkRr`Nk|w z9MaRH=zW@`O!mLxag?MJR}bH8K-IPkglTda;6pDj?>O!Y=GJ&{Bq zmI5Op*ROtfPNo~^msqy2MMZvM-0ofBE;eSA{_K7^c%ItAwuyJVM%hj7Z`CYu+t-`; zQm7*A^54n3Z{>kS&=_t{jAruZ=xBMo(~vnYQo7Z?T0;}@k|QocpKj@R)YOWHzyBlt z!$ACN*hVXoJ6z2(J)GN|6xf#d&GM_aJ-m=szbRA1Q6LwWrYJ4zQ z^!TZM&(w>oa=%vr2V6wVNp{Y6dtMV2yKlXGa{KUVg1C-6|GFt_yN-O!MWyzyc+L6_ z`!_Ntj*kXr`srlne~yS6&{D1-$euCXr})Y;NZi}6NZJ2jsqW;hEcfa&o;kY~C4Z9* z74Am6fQ6G@3qtsAlkwT{7>*ye%~7NO(fgph&lxPjH?Lpze?_DtM=C1%`Zn_IL$)?n z*OV*1M@KlD&q_i}9GW+Npvoun_~=|6CS4h?79AYU*_wKXD!jC@f59N*Jp~3zV+&<* zzEs+V(MFDxG8uny`aNAjpmQhhvsW3!0v%yB0`zB9RcNa(WzbT<0K<_JJ2 zr~8gW)(xK~UHGR1v+@%eJ{3eg5lb%(%d&1ec7&e8KnVFb%DJZQLh-$ovJ8jC_bYG# zMxpQO^Ivd3+KGI;x%zCG%5dh6dT2-RgRsrl3HK0&MVVLcST41>sAr9o&ws!9{N+yj zXKm+D1s7Qr3llxo^b0~!cFtMn7WBx;dMsOf-aMTG@amc4eDXl2{?YUtP0i5tZ)$Id zJ%qjOTDO!9V%wG@t77PRIV9EV*9v^xerTbD{JS&!FVNg*mWw&fH5PEMo+ors3h)he z*yBwLd|>QD>_qbod5OqAYI&DQomjU2!TZ7rX@ucn)tjIXDwdV=VEx@ZF0+19do{!3 z5}}}X@j_^vxX?+sEO*uw4hQKjOE4fvB2)6(=1pf!pPeALX|)dfBaU&NF5HSS?5&6z zSflQ-;g+pvL7uZ0zhEMueO{b)c!3Q0om{@TQN@@;t9mVTjJacYqO6bnxY;3sAmYh~ z*-;zWSI<=DLMm)shvQiJi5YD9rsqDOWK(Q=0xD=VPdiF*6$iJ$-xz7fJ@0GxK$qDs zG-w9-5}crWc})Kodv6sLR}k%a6C}91y9Rd}r*U@)7TjHeLkJq&-QC?SxLYH^-8Hzw zbndri)|#37c<;-s@2#uOIdx7~?Y*n|{C~Ym8Us-d{6RIIx4xycI0a>%kD6nJ(z1ytt#53VeRI17D@;&F488smWx<{qb## zW6nQXIHm*36|Q>is8{g+Jf5Bt^C+@yej&5s&pO}Ja}Se#*V9WsU7E{`TZ}ru4g1N; ziQF&yUVSl+M){)HII3)w$&Ln1t3Q4Ha7jwg>$Pz?B4@qz+=5oRwrYPEJ>PYNxcjwn z360;{DBLK@YBrAbX%uzwukX11onv z)|O-;<|4)Qj4=o+=@~KXr?|qppc5@U{pdIz_myJn)l6H+caVyY0lncSfD3 zd#$d@L7@7{srzcyCb71 z$g29wv{EPoO@`)G_^MP;W5z%q)wwymy8dA!e@dknEaus#-Wzd%YsywEXIKTN@x~+y zouRP*iM6ri3X{AEa@Xxp@c18xH+sV9VOHvvQ+)tstY;J}V+wvPBB%t71mtc!F6`HKb zoii_jCmy1duk6?59Vt~GJ}fj#?nAE4`X%ksN5E2Yf~)Lm?MnD?*)qcKbHZBPA8+JH zre}#d>VR9JpzGZt^P9diF*!&3(828nuP|L;QJuhFYKS(#z=%2|nnM)~vx+jXs_UUvbU+7~ozm}4jMZUm$zj%B=^ zaX`uD%UY;6Td%twPVGZ2!}XlW&#H}B_7UNAUbCrs9(N+%Pjxm|^J^_v- zMUS%|O-pSpt@mC4WAofe+fJK@f&PM!BZ}_~$j88uEcs|5=(jsKvendolUe>AN>hix zr?)FODpDtqkuO|5xmhgHvHETkUC9A41#$D9VX^BPx0pXaRT{LTGDd zMvBL=DRs!pI3bJg=jScyM8Ue~P@xMBf65lXz;Phy>@Av?vLA>q5 zvC5^ojyMw=>U1Fd?R0j(pahZohAn;50nNTc{yThQg&1LH{bwvz5pbY2HD#+t+9x#? ze1kqi8ZF{7H^aRWy2aD9`yBUFRcI zsob=Y3!o`&@XNT@{f!2=BH;LB?-Cd*6htTsd(1=2Or{hO`+}Bt9kTLA%%2Z(B5t-Z zRd3)Kjs4;+ea+}i8c1rLLYakfq$KstGf>FM zAQ7LG;rqJ#jM0&Ul!#8>J^Lt$^`SP@+c_NF!)%wlt6GQVfwyFe=)W<8Y)_#VjwlsLM=m6Ca&ozyQ)V(iO;deJKWn79FfUNWE9un-k`SJhJ7de^9?#{dq_i< zJbbd?3%(;7IGf!slYVVBK7#|(`rm^8VY3&x-f5uSK;NchY1+?*$}XCI7rEnZN5$^T zD(pt|jWBR%!bsGhZJs7wiYzg`hTTG23tzZvDAXuka>SL$yQEj;jzQ3@0Hob#WABUH2l6H5j(w2KU6fB{G)OxHV_n4-wSQxDTDaQ*yMi-NOk`za zRmrf&Q>aZ%JXtl4b*G#lo{a= zv=3O+fTpJ({`dZGMAMzLZ%hapRp|Ig-qw8Ft&*8W4dJhBGG<-)zZm}T;M~GJKWnLH z7|IP>M{J{;VJ%mW+5akl9UEN?(}6zKU!Gh{;8&{u>A2Mo!4B1!L$mR3#tPF)Ea)fv z%sm-%RYWWH3l4>hL9)-=Z&wFi zKwpG5!_}eR@E-4dQIj{{;vbmmlP_={G?hg%7xHj1(!b3-<7D?n>ISxRKzEe5QIGd>%F;Fv@TsRkNW3;CG!S(4`gw&>+}DqTTNAr* z7@D4ec#_ky0qt&i@`3!8-~L6g!<3df`NHGonh?^vDYu{VzG% zBf3VTuoYYTYL;=iXr#ZYm8laR5G$rwr zL_7R^_UW4ka#z`dgCNz;`2DR)GT*RAWr>KO zqn%jF%-_U~e0jcFj4h4*$ixy6J!uJe2`p8WH+Rinby9YpF?P=FOBluIbQjAAEA7Wc zwnl1_Yr|O)7bg~~WFcke1#QmhAB(b}f8^xZiK`odU*(bzT5HJx()s_RYzKa|8=nvE zQZyI56=`u~17)8!MJ19DZVZ*5v^KK!(rh{k$EMqXyi%rC3UvVBIfkC5sBU=a@12uA zr1~=brnOAvUx+(Iu`qje+hh(!?lcc5%waC#2bwsgob$|PoQ-K=*K6uJu>@7-Y-u~q z#4C#8PSsU-@fc-W#rH0bFpXJZJ9;u9E7+T{ASeetv_r>8mT3i)hd*UZ#FI=jAruHM z2l=Wip~_aB^Wt>wlthu31+op8>V(!Q&ccmlVfC-GD)C9V&TMIHcn_)ooY1eoIF5_m z7m5lz5mq$CRs5=0G+j#dWk;A)ihEiLssm_h*SRLMoA=^!kz<54bTf4ch}*h zjCIZYtP4+k;X;OSEN#$Xp2F_P*VLyc;dk?@B(V0XoVn-iF^`YHJsm+eyi&hb=m-v5 zKb$$!3G*f;5_g|KM9t)bG$6LK&}LkfNNnoma97|jg~Ea-!p5#JV*&66#10w8?9|WD zjlE&2YlfNVC1dU9F11)I-^A$;aLr~cgzc!a^w#8#=_VMYX$MU+_71SX9YVME+aR(j z%k|_ci4oT5tDh`Y8Qh92U%KceFe8$#zp%46&aXK!+8n8IG>koRR1T%3%GK2nxEe{< zSDRVLx(W_lTB6`m?=emWP6EB3cV3kw)|RD-rcYRl9XL=T+i~SXz}m2z{M0aTnf+P2 znKvm}d6@Dm5|1z{MfNw06Uy(8U#bO2*7hvtNt~U8Mjt*>7SQ^3jKq^1Gwzg{H#&-9 zrBRrSV$>T^wcZ=F-q3bD&g5J5@GFi3U%5-~L|RNPJEhH6G&ZZ|Fdyt@k|{Oo z`|dS}hp;Ti(Z6_ttrYS1u_dQLN1lRIrHM)@ljiB|(Bw=p-WB zljjdHpy~(em8Jd5b7Tln7kjy8R8-JL_>3#UxCixZ-!eZ&(dI z15i#XA$6yy znfko>oomRBU2&{NYdYqeTz@!mW~iOc9mh?$H#xFvurRY2De@RI(*r{h5wn&{O{p4S zr|g|y0riy?<7Pj&!C68H7tq zD<-$Mw$~jIZL#I-L(wSoEcU(M>4+4L4>puJKy%m=@AX>eXcO)@iWDKY$jOhOS?ohr zT4@6zbWy_JkuYKh|667{yzhELPiu@Ha!l2yft041U$H-Irl5q4nz>kc0f-(o!L~ju z+E<9>u$c)TqXC+M)Q_AKo)2hau(5MB$PvvN4TNLTDrE!QPHvAm zET*yrSA*kKvl3#!yUaZ$iB{a*A;ZCkM=OG*lZmNm7N(jq2U{CLF6)V<@B~_=3~rMl zWbjoPE#J2D2O~&*U7r%Bt9^_n)9(m3{2XqQnGEeW>s%f-x?oXB`28@RQH@!AzS}U~ z=J=3p85_^!iW(Sv3fT$^3mUkMTzl=izFzrk;yrvcyE~*0FgwxEnrwYvT($4HnF@Yj z^xNt!lFQMnyMDqo^mN-DYT5j-94}dIK3}S{dD!rMK_M3M+rhde)snbh)8fzlEOSnz z=w4lIZ+~$?^0i9w@OZ!I4s>;IB61(dFOje2>`_pxqf7^YHf0pNJ zXUE0+FgO+DpMnpA`+2qLo?7$sXN3%Ihj))t+|`!LrK|oJZ@-Q2TfgHrV{(YJDFm($ z>;|D6@)7e|Tie?^Z20bueSKbEA(29Ib4N;p3VU^QGBGPFt*lRu@I1Fu;W4XQjaL@_ ztUKOR>fBryv|7&oL}k{$-VsjqwC?&_XU+m=yjNl z8K+T^E416|{@MCx)n=|FnWK}-oORdjhTr>Vprf?5xVWq9&Q|2vS$_Vn^5=tOqkaHC zOSa>3l9qwXn3&r9ah&E?Y}6slmO?eZ@R&1!=#`}Gi>&6mHsOr(B~7Zpk@X}-a1 zf)E=2^lM(+4^%<9e(wK-0O0;_Apki4n+O12R#x`^jUYYGf=$KJXdd=WsX;$%4j}%&Xo9}pz| z{{CG#8!>ZeccS7#Gq93Gki~>MmOf$TyrW=UA2t*ZDK9V2Xst&Kh#V5TmHQjQzbpGj zbmB#X6bu5i=5~&(?~R9tSkerj5#R`o;o*a|ec;x6Npn*NGoX;t14VF@!RmFVtT-6KN1URYa0!l+W+5}un zNge|KM3E763A=D@OHNG>4AIgQ6&G2Un;jk;9O7bO;ox9l?H%s#n_HL_7tzoT4NFQX z-yOYq{DHDV&WG7~6Ib8;qNki`DJcP#Y=y|_(=Zj>?fr~YoUC-(%JS>MG{(z!iQux% z%ErQ0GGU%CluUeV(P}Y2I@**4>;pM*4m2>uG%yF(mBL5MtnhW(JYgiL&5D1OpQNv} zKR<^^%BqG%4G*0 z3*wUKS_$##aYOfLudaKR~auo#yJ71t0hYOcFr#gG$Y=KmSzq2w7`cq>IH_xI*hAg5p zD8ZPrEmrFC=ckwklQI!DEz0iP(u!~;d2-ZJq66!Zw|NnLg^Vq0kJ(5P0t4ao^~_5v z8}c3cscG4$7!quPz01?{V33n0Rb4HW4p2{lDk@k)OYQ4a8v({Vt5$#b(AvT}lN(q6 z@3%{F!OT;uT>&KxPZfJfRa~@nKvgpo0;QEpb5JOMu+|?ZoBuBAJrh#8<31rD$@F~&rIYSnH$$o7+qNf zJ@c2EZ@5_AB2KvKxTJ_NdK{Y9S=6n`|<4eeN4GTKs2 z+m}@swGmtdQlOTi+#g&VT+-^g0-HF}!%7;uit2{c<5RNnFsE!_pF>4MOv0=o=|$o3 zg_v=sMkYqb4-3*ip_VeYJ=8r*$ z<*DB8TGtP1a$gkwrVXk`>2H|ldbE!eQCkn=Hthyz<6@>(v(g0e<(P8uHZR9C~_F=y7w>%QA%;sFAiAZ^}^8r^yXEcoEn0p(OLf?zI6 zbfuKGuA;nlPGLbd21f0e?dYFmqll=L?qK-j3r*sz#dl&R-RAH-$CkjBImeY_OR%;v zDW?>MgnWC``vs9ej*;GIEK%=>x@*lt{z){n4>c=M%Y_@aRMOUElk z8GCEJpdTUpGd)=^##IDzG0=vA^;3Vd7|LhGdE^Du`Q5N3mPgsZa`@F)U>|^`5?5Av z5x+ZLb;sJ8kifD!M1pJm^{p_;m=Q$2Vr5fK&oZ*tmnG8Gf@`2d(4UE%m3f2RK7q{G zkDHP@p|8AH9ikN#TaMrDTvqQf!e0Sai+Px)@B;0n_$xCWJ!atqF`O824s@v)o{&gw zhT>ZZ$R^=H$LAL(mSr`2)s;to$%Gx0l)zvB)3gOBZm}(!Jw~* zmBl60S-}=m7X{I{0`9oUh4~r#ZB6b;3U9_<92)tyGo^@ZFW=p%w_&9cyf4vqK3joo zl(C9RS{8`kO^SwQBH3>@gXXr#Wv)DR0X9^)>YB~k^0lUqlB~QIJiAlfN6*1Aot^IE z7X|fLl=~y04Z}H_fUfl{J7nx&{HvjFf*abD1J{AqS2ti5M_RgcaG}BS<897X=Ms0D5P%%rg1DXXj6Y8q)TDsaSPUD4NK zDGu(i#mgjQGnr0xzgdszY40S*uJrt0;|X!hUY?dM>e4z?_Bo0$Bqt_$?eyjiK(>^iBqvi zw_HAqwvl1c`y4(yP_h#XuIWW~T(S)2*ZVD-5A%eC?j&j}qe!ERgdquv-z{vq=!Lns zi4p>T;`2Ju+e61UbOGii?!~s5nHXB<2WDm^0~T zqo*?xsh8B-ls?pnS1YZ^o3{63{b5VOmccX#9gM|s^;+@X`MBJ|eMbz)D>J6LU3V`} z0aQtV8H52Np)@1-kfOTUzh^kV;HizjrnV7`>a{@D;|o7wFyFsT)2`kV|5S|(-c`zR zLO8y4ZQ{|uj{DP=(~>a^fYJb7_r=rPxOPkQsT*-YnR$vVSESZiC_e3W`gi?(|Klsw z*p;lWao&4C`MvinnOlvSw@}XjW4AffCNPJDu&cx|!o+ z(trPkQiO-dUxG@XwNV{?kRD$d6o&SY7=2{jS+!ahsWO{v92i@HKG(MsSuGfk&vW)4+MjVihdA0w^lP~J+eF#26ou{{44 zGkhY-@RbG29R%xgfaG&Z5C#^0YoqDo*q98=uXB5>mVp&N(JYR) zco|_?NWU4?cuPyUa*3t1)uM~oR>t9AQe{Z(C1VU_xy&LXk{aAyeeWPX{ZR$M|CuT| zc-XVEq8NIRjc(f}IJs!vHJkbiZBK5P!)xOG!bpX1R2uKoSR1O)!xXMCu`}18_TvD6 zhb}4lbfLCTZef6?8*bdW(r05K%*x10or8jw<0@X~L8$pTp{l2?+L)1%lrgJ3KeE-4 zg7~P%x~SIcdjg+6c-mryrejV*IhJ)NiW(Wu6i$fn-TZjQ#r7s4irM}1RVMV-O9R_{ zW~@z)H|x_VK{qtDW(Rn^0;ctdLA`Brycwe@lLy9|$ii*XM_*F1K#QW9d@Rxt@Tjiu z6 z0H!80KAE`B{)aNB9!QQ{I~3iesoIO$z?Mz$@T8)}e|Aa1W0>@=LL3s_?)wC0&Gt|$uf>m9VFMmS=k?!*UOYYel3S^w=8G%uYU9iC^9r!IE90} zk*<{ouE)4vE#YNTE%MI$CKli->RMmQzW42YIbig=&r%Tn(s1|*KY9@7IQ3eFeHr)t z2N$mnFnhglMM3iLbE9-DwBcoIghS`U)xv4>d&rMScON?G(8$b^-!x#4h_pV&HD9pb zu|}X)QLynY@dPb=7iirP?p#JZO^1s&T~eVLYv=KO62{iM|Rw;Wwg**HWg%(@kJ zK1g_?{X72h4aD1N8;{l%$f}HKJXn@Su7E&LxOki=t-*rFg-bu7rrl(847HnoE7F9H zdBj&7AXtc^lAcg_M;EmqmAVXrjbpz@XalV^$9vJ2apAWU#qu1z1+|*zAsVZwV8xvg zI-|%f#&|X?i8=C{`h2^fx;WpiFS1R}@N0)#4);qaT3h9A!sz6}piX6(KH;o~tWd@` zIO=h!)QZs>Tfv8R@8qsFs}w|3?AFixL)UI$<;I}->WdXq)C%oXLs<9pdDbejj#^t*i4-S06s;T@<|&$fW%+7W>ugsjo{V|&$BBorCWs2=0@`j00Z zD16*+0EN@WxVNHN1eyfFN_CS7tM{4=QthW>mSNVbQvmC6<6_Do{lfgzgP(IgyetFp z_vKgGMV}ZTO!bH>H>!$Oc1EQ%ds;$N3|p1eSQYBKH>FUme!AR~{yEq)(eLf0XK9=D zxjv2`dir6TbsfnQP;`#Xv@Gf^o)^9}7nrVvz2B6&9vRTY%Qve4esC;)_!pISh0(bJ{;uFtrCG);)t_*Dp5E$oeZ`;9;oWGNYuTa z<7LQ_1kKy4v9}q0X@rME60XI-(W%BHwgyT%_W4;NqLFdmP&29-$TlL|Fb@%ha6|ks zrZnuUXG+uahkJg7!y~=ELF49Xl5z+Y5`rA&e-(g!0_$5jol~Zl8Z#wQ5T1h+#06_p zd!sXvxMz*96+;I9&*<286+cj&~>FxMmJEbTN< z_&V~xGOT0_SUdz7_r03QSfJd_qHAAJfUGFp;L=9-0xt7nqJKNXCZQOH#@=vW1`2_t zcBV!Y6^AjC(Y-jiL-eBr%HMiYg}_7dJ(*z_!rM{wZ`HY9x=zNPkm)It6}eHK+xh)- zsTtGdQIa_vh0ve3;5ZMXFUZ}(;w#15?Y##;ZN%U@R@!L_kdYgl4#*Soc@K^?bh;3< zeTv3jc=P#RllO{v3h65qU_F>`)BY9f-x(c45A4UW#qJLHpk*Xquvl+rax5SYvmP4= z5|x}Xf3`wb4GoL`Gyl%@uK}Tkd2%E#2mBlF(>x`x^3O&~T%STuOV6&I?5YXOA^LPc z%s^bPCj~|WX#e8`2E))1S=O-^_g(!NTB!ifAFebl^NFzv=k-FtZuI|}OpX|L>)V$p z!T0LXD;3gWN-*a8?#e)}mw#x&c0=PZ9QQsN(GBrI9#%Y>>l zqTs?l_t#J|!^otL1BxAp+hug+>Jm4&X7E!yL~aBNfgymT+ZQymHW_rPG)6f{1V?Ita=IUGL9lK{=PLMb6gtUXtXM1_v2e?xu z;Ad$^Idb?>xP{3Qau*^E+?ZIZq1i2uu{^~jf|(OEi-J`r7H%hy73=<-X+3h*Cv&fjBUG_Z02k9GV_gME9rV$Zn=NGOrjvdM_ts(MM7GQmb4FTxvWpCgY9Ymz*ea3rmz6geSS;L>eb>t}0nLurFFTF-54;uyr8L{ck7oGUpaP3@88vTP?SQN(1DyBIc9{9_ zQeKmjjVMMI-ep0iufNlEYkMjh+S=(Rv$=48dLXUPi6cIbJdh)Rq}g@YjuW#2nh|CL zswz>?v5kk*BYt>vBiUi+e=>A)n*js~+Ax2f{UxEyv*kZ309^)rWS}FyjLDr8n?D4$ z>xEXX-m5DD+Bx$6RVcXV>g%}Yvni__Kl&j4L&qwliN!`u*`cKB^>Qpm1;mSYK=6HW zj42j67IMgT)>@2d6RF5{c=_CNX|8AMvFu@~Z!^i{3=O3PX`D@=45{+wYpDN#07U-u zFNkUdVz&szZgk61xeCB}GevK;BG9Pm=V;S5-i8&zFJNahTalwyH$k6oY71E)KU+x? z;3RPnTMa24;{?rT^D>M`IUOHK?gsK|9qa|$-I*<4ZT}bpk92pAm~Lq4$koltiEP7; zdR+8{nB^%NHlL5C4HNhwfq);nd6U5T-L1#ubPVvsZM@|}_D3uuv~*a=Mb1s-Yout+ zNOj;3Ja^z~Xz36O@#KPOTQmUF8^?%it}CU64Q@jU5DqqHo$d?Ey;C%6I;j#}1Us^P z970RtKD^4A^axQb6Rtjur_!z;Tul{J#Ot#E5CM;hsvnGhRH!MX!A)uHW3!{?d05m# z$DrmZh|h0(*6-!mgIneUtcx=Sw$mszF4mjYTZ69Fq3tO15m4ib@A0^b3Nk+ZD@80h z6AxyrPzPNE{6hj@6f}az?4|K1m}Vp?tXWIS>H}=8wbTH0FS%9X>RZLdzkDO7u7XD>jOex-sD|^O3vv;|xPF(jfWlU3%)HclXNzsQTGszSP4J8%D zykK}urKn5256hLGS<;ZO0$4hi#z+nUwwy@P3>jjvrYTc+jywg4#C<|=gm1c6MKtoA zX{Pv9pI4?jS?o@KlV>M^wNDA2g9eM;;YVTfz*xZE`DZo7ol+6(2;Ff;*+r-P8 zV-fvq#!-nqJh4>kII$uQ9FCY-q(Hc)(y1;0g(Qlq?@A{l)-^U$Q4ZzCxpoQ#aO0{( zzu5em%Lm?m6(1$C5c$Uqbe8vVwv$U>9(#aKKXvrh5G|(}H61FNxu^K$1T^#e#XV{& zO9r-0q!g_^YJ4cJ1Qc)q1vkSPQwrwM^7=Q0IM`R&^3f8;Trm2$5~D8+EF;j(9(`?f z+w;j8c(rUSgHEVEZv1o z5kAg4ZD=>=YO7h-wEY5FmJAAvyCl2UD1aFdHD4@gghcf`MPCe61 z>8?`kOQS<(%HMbuCRq5Bk2vds#&Q?kJ1jsgn%S78@hvq@mPv|288^4@|FFbIDCgr@rhq0aa3s!jw(;_17Y z9tdMfB`7&59{Ba>1ZUJn*VpbJ@9=1=ttejs?c=lOytINdW3$0qRHbSlQp75vEPI06 zn1H1|a~8{O$Jwc`M~0v3euU<_0e^q~ZedE)XbVSznCt&poO@U-*9-{%i1ZvPvUg3@ zXz3w~BJzO|Ch(k*%hkWjc1LyV@MFYS&~{mGOh6t9fcaLC2V>Iv9sjoG$H!T# zb)!tCBFag?%yVO>GVu?7H;SE`@#ovy+h8^AL4BJe>j(K0Hi|3C{3agG^(Wq&&+J?l z^+hQ{(BkG}q^))}1>4(uLoLBc>RARvRn%PkGqg|>QS79|OdsASlHh3)aO#EFPmHLc z$%7+*>AVnlN_jClSey#u53NQXZ%}7?aQo&yeApX__RyCaDp3hNi2|mj_~XXW;V$%V zsm;BM91)a_35S&YHp8Ul9HZR|U( z7SGyl4mVvch2PuuW`~nm4C}6w{up>4uA>UQo9+(PbZ=bu#|U4pv|Rp0cm3MzVr!OS zLi-7O=x6`j-1zu-M*r~e@E;Z`DhhUPHoh+vxuuo$?PX>CYy8m(TTi%p0&mwg<{Pea zb`6Kj+K!jL5g$)81u;Tz6A>(3*DI%&-5u`hw1mPhClySa4y#u;H9hamA0uo$;KYT) zJVWhCj#xpMWV6{dIUAe8WUO?&OW(r6ektuxX=|I7m)lvhyI^GUT7iOb6?dsTm}q&ocE6D5U5}W=2=>c3-q|=*>onM}m*hCCbUwXYw!F1A)HqyjK*6Gtet)f8xbUBz zaLufP2B}jq@e-c-(Bm^z~lPPX1 zF!(#m^GiH+jKKRq!*tK@%_(~09>pb|2q$mrf(CdOceSh2B3seKwR|O(pp@!P#;Toral8Ez93?R zj2*Dt{UMdg(xLpPnmgJc^APbdm*->Cq)069m1UvtQKAH=7me2MjJRwD79#lzG!6vK zB~~}t?`z1)2pHv1$mzgLRk{KA{CV;E%2-Ls$q+inJXJ+F+0r6+F8x2qfk82I?bd`c ztQG2J+M@9qCammL@J5U-oM&!W@b&UzrJp^}%igYByR}z>bh;-k%zJ){lgxui&qb~A zcT*NR8k~f~cI-3nPTXu83B*nsG;A1c%YT-g+kSt6GP>`mYDhaH80y(Xu7LX0DK!_G3umc2Ta<<#hX6M%9ijj)-O69 zf4$LfT#=cjm{`wGq6?3rD9<6%=#d(+2$t2Bq@*rZziU

&uo-I$?nhzJ~3FXvKNN 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≪hml2Z#@J-`RhF)eoElariJz>ndlCZfOI-JG{f$O?q=Jc+}OZ-MdVklccayG53(MFAf z1vb|c%lf>1r0@jiu*PC9hBXfS(&?Eku!XKN%buRJh_X-P9>xcxvM$o;qGRGFK4(zFKy$_XSy(kqOm8A!e8(>Fva-tAR@WJ_v%W37|k?mg;Onj|R_wIsy z4@;?i3*c7cdQ?z z-=`1fUT&1|W2A?(1+ZGcsWGV=VHcAY%gBqRy1vhgLur(kmHT#{R8b33^_Qmp86h96o<;u-W|r z=!QR)_i<8Co;nDp`KiVMVzp%cs4#=xGQ10R=)Bpm6P1G5Du%5)uG$7ZK^dj{x_WMg z{gL>>=fGlP_ov=2o8)Rqv8}xx$l4byuvf0`2NoBatfj#^&Yo==yW@3>!2ld_cTXRm z{&qvu*ZEfGz*GKt*qwogH5Ie;NjsrNJkJFA`?q&u&Cr|a_YH2{a`1j5HrG~??db01 zLyWY6o&D67Pt{R*=shco{?xthLXQi7#>hI@5%!IKGl80?;?<1FVRj`~Q(F$2tc6`1 zIffpwd%Krc$VKU7wD2?Wp^RM{VMkg7(W<-kB;3j1s&2wJ!@lx^zh3B7@xabvLI5aD z4x?c(+`IX7kgiu)3JZL!SUa}O`rF&U6L#q5@vxdq^z&0sQe82+bMMk zbi%H|`V?AjO~=vu7}(hd;EQ9%Ue3qSQrt*6JkMfEmw$JoGUe=1Ft%5}+BK!7DUi67 zcxx+F+U{cjFkdO|fc=p&I~W@ zqrW&bTv*m?rXKoA?2Fd9%o15NH)F&NKbSOLgFGMwJNx=xkH(m(KrQ)^P?CvEV2n(# zuU8Q-=*`fe+Q->+$<*x zS0Wo-ZPXX0>fnCche(kGFe__0m!2&uL6Vw0vzL3{fq27|Zxw4`ulDBc7;e@)9FP0L z)9U?FJDo!qjPTx7@VUWPaORiy08HIja#(C&bN8oyti`K>!mOj9BX)-W3jq5I5?>J) zB|%3x?I|hN&3lGdS>f46VtewTVWF=Ie)<(=a^#zds5{_ zVHf<@xpw75_e0QVY`LG%QIktcsdw#u7uZN(*RX`=s0|>i{dnzL9c@`RDZ=6WjKJR;b{1jt)u(4=P=l{Em466ZZnm{ql2GXJ@HCH zgBsg4cI%qhOGKG~k3(;l3bmdTCY46utb3-*yYXLYkP33BA`c5KFs7>Dk{o4`l2Qo4 zRxe|CTNT!K{)0_31htndP%Di=$k~!D9BYJd3*&e)KkSdl?{kgw>;YofmjNk+slXTx z4{ili{wm&T#o@lB_A@uYB_-K%C+D0Hfck$(n%c&$@%r+ZEWI~f9zwDMvMiamzOy)g z;1hs@rg5!~jGVrpspsTS0tXy`$xX_S@h(v8OzCXfxoLp$lHz>fz1&q~%Xa{3Z+?MV zkzJ1}h;lY8Z2&-EDlDdhT~NN=usX`?-cpgpvki7p5XxF;E0;)hA%9+$$|QE^6jdvc zZlSx1;3*m&4RTdp;5yhv0lR}OX^H3Mkzndf+KZew|Ibc{{<^dSnj>G5JQK*Ni&8g#y(5iT_sv+)w;X^x}LV z=$$ERF~b?0B-t3To}FGo`=MFW zv;zvW1|KFEx?W}oyK!0cG?WoXCc$>BC%}MQ`-#OPEqI>$=8ao>(-(WbrUNTN@zRUrFn(IBwo{#iNBj33k0#9;unZ(#_GBk&R6mY04$#9Os z=LpJa_$a^=B@UWDNk}1oXkLgvTyy7&+gMLbZ&*A?{fEvQ_nQ!TOGpLtb2J$r&`4=x z>I3t|l#%q-L^QWNG&-(@F=;IhJw~OAH*$v*L8w&jsC}tm%*Gg`5#@TI#8B8yB$RL` zXHMD_)i;5FbY%C&%SF+)Q(6gw7e}V-V{#>eUb29Qv^wu)IHaJII(@GZaEYqbMC%f% zB8qKIoUzaE0aIeDAxrM(&+VT5RRlosti2r)Z$ebS;G6VYJt)(PqAjK#YUVl=gAvx> z$JrvGT<$I2jOR(Q1FM4HaJPY+`pPX##a&!CfGxg1%)fi6A_(dT)qk2ne*)|;srIo0 zwFi9oUT1Dn-V7kB;DFii3*GCH9NY(-;zeLixn-8-NFOh8v{J=X72k1YT1Ee*Srl<4q5{MfvG^v|GX9K8Xp@N^X)oE zgUIrKU~qqjzj8En z7R@;fwZG-V+6X#Im` zOc^yWGi&va%=#0H`n>3EL2ANJ^Jjzar!nBL_wmYK?Y!U03aW2Qrq{VB350URMwt@Z zgY4<*#K+q?L++*}mC zM!*J&P&U6N+?n#a15y|dyDjTr^_vY@W&*8Pc`sw!@|_jEN;0My<=v_d12>0q8>_Goo{-S|i5$fqgXTrsZa}M>altOn zRD7R-KG@_Ii?olQL-dUH^p8!095>+F!4@==oSkopHu0T121ciT5T0RB6zH-zd%roA z1B6OGHyJ;MtJ++0za#Ytlo*EKj;8azF=e0AD2iH8K)MRFi9<$>Mqm z^{YhqJAnOFOB8klLyS-Roo0Eb(m11U4TtwzW9kI7X3j=dk* zR201}ur6KOh6QRwiil)ehf#F=0X1HAB9z=9N%3w~Qh?B6-h12mrerfJRAnRJ9-j^8 zD?jL(4 z67b@)`Eq717})!W0eD7~oEhx9va5_A32Ou1nVTfZ_kUdn(>wZO4sNE-u7TE@X0?W$q($xujxQfbJoJ*xIzpkkBiv3`*CZ z%D!ioTszs9lcFx9bZe@-K@r^641!~NxKVaamO;#%?Eg-QGGR90zAQ%{t_ION^MEG) zSC0Nyj{aAU{=Y?z(v*diUSCe?Ly1G|@r^Av#8NWO60mwe2!H@aWD}=uff@M&tD_YV zpNxyZ;)qS#2;LDMqqyvlgA~{gOUTKQ8!+Kt_2sGo8jaWhd$sB}{m6VAY8a4{udK+- zVi&TlfV{|Q`FzbRNM;JI%FIZWY})x00}04D6WF$6m?QC~eDn}GOk3Pkz`ltUqF(jV zE7Ysb<$uMsn5htOeJ0`3`AN7m_WhS|{g-h4e}!-@n9h!to=CU#`7VBB=)$EK8^N96 z!OiKn?%W>sGB_x=e*Rnd%Y$oUqQ3qyaruvjxXvYh&sRHZR0pYb<#B^cI{1whtHcxfu(T8~K@& zk~8$o(5Yq#1snpI0%Fe%Mv{tXYc2(6x*a%yYt-Z_>w(hRrW%WM1FZbZ`*+K{O;r`E zR}&`!6Jcu{ed&QY0RBMv*qupht`9ID;?3YK0ajOy9Q1EWQ*3y8UgiF`Oio z;ow8!F>LOs#exXFwh^3Ka{!2i6Rw+KA-e%Tyt2i3E$rAs@L||_Fn&re!R5dH`ukyx zBntTAdx1|qW~IiM-BST15c4hhxlH48ZF*}WDuu3pVdtN5M@hCYTWfDyrTyXlb#}1gnz{S|WUOyqFM0WVYhHE(z`vyTE7?QB>+&l-ilk!b;^L5dE+=UiG;oxpT87W-BDIhb~@4hU7cI03wdf5K) z+i;~&q^UtiYKdK}vCPW2=gdy9))BHJ{U*YSJ`jw|sPE4K@!r%i7Ut0Ny~v7I388m! z@K8UhA7cMb-4kx5Q`N!3Ev3)xdSp4tyZM*A7D$jWTH-=ZL)X}tJTx>hC#b0%2Yb9}3-djB?4VsCNgWqZrNCW|!xFu-492FJ)q_lVcf41BLE(%S+D<1} zrXOHylj=W1)IS5>^I7>IfECLw%-Cj7#JeHhJu!1VO_yYJeHxl)h7&)rrG*yggQkE2 zCsgfwGccP<{MOm3?>iJ0Q3FqRb5937^`d*AuY20U5h)jqRj5!(Y}krDKbYCd@dTj% z4^1$pj<~lD=|VLM?s(8Wz6nS-jv9Io><%gnK+>Bi`Av|_Rbir)f>m{=l#}q>{To$5 z_rI$D{?=#V<5aF)U!x~}1$Rv*)Qv|Kz{fX6ebKHQES+-I3S2#}`@m0PN*8I((bXJ~ zZ7VV{SJ+AGtz;iI6;Sm>w{w%1#~Ct#Us#{^1S7*9pJbwNkW7w`*nvV(KR|^8RoD5h zy3QT$Tls^vFsvL>ran`RY58cVi~Af4kA)i(N%PH+`2E`C!U^W{m-kIry?#k3WGyqb zFQ1+wn@0d65<5lVLQqrJz{Dm99`o%0CSMdeJB(uDM(iq<(G!t`@GjHxroo$MojCSa$#KU-p3 zvH?$fus7Im(H*DxMZry}L_Z~e9zyQ>ZtHJjO=;x|4X;(6O_tl>8kufv8T}hie{9cC zOTTfpj@)PrG@v5?_hIR8Ky-@IArD>ud0DPm;*9dC(g7f=Z{)3_$ZI65+&fFtk?Lo@ z-13dMzH2EVhF6lg3N3Es7}>@eL%;p@2bc!Jv=N6vSUv;7GQj2eUnZJE15Y)F%zWTz zv;FDeU{Gti25{jse9O(&?Kb13N}p)!3mXcedv#BfksbJ?K?_#!F3$9pKu)Qt%xETM?Qw3ObLtmhaDf1PH0gAB&#eJG?y!ZB?frL)Bc74{^(wVYRHl`SQ+u9CLY?&MA9f!=v*6+U{>}Am7GNF)l zbTu7b8UynzXHW1CY{|RfZ!)LA$1HH*y&rinS?GGJ0KveD0L|n7lB)lbs(%Nmg2M9u zoKzvRJSHo#YuJ{_*pJKy^5R0nkS>#G&_JQ+0bAfkD@qS{9Ojl7YY$HfcKZD2up`QM zrf;$WT7U87S86qXKSnqng=)_O3UU4JpA6lCqrdT7?PrMapnOGWfX9KejzwMW?H;l! zRT&kBm&^@CFHxI`%<#naYvAfRR~yWm%noH?h@$r`#S6zTjV~=iq}2(;t~pcCMhUmk zX79}~k#&vK2NV#u#6)^c&QJjpSU)uCv+Vo%A^iOFMq-Ouev?-Sz z$%~5N5Lu>MKMaEzbMzPCbO#+KmEZ>D6v=vPrxtle7tKI?O2i~AN=2Al!kF#Xa};uf zs)irhe<4p;g(})4jaq3BRjtqd(M zITw9PLt$(XlbV+3my8^tmogSRC2Bzt(J84Gmo&=$khL9%)d#12G(3H8=jzkyhN&iy zK#c!Yt3)-G%9z)GHeQ!7LsL*cak_K4=LD)3&83~)Jb#@z`5^7E5@~DMa z;&U*(|J*qETZZn#R48Spoov7^07l8O^2BDZQ1umcx^=J#@S|USg;kEY(8L3=zTpuA zW(5AxFD|Gj;mS;7;YSVxf(qQF++koGg&GN4Rx(54Q8S?Swsh=QMxLbU5;@WqfD2cs zg$y6a#JWB|=htuB`XzZHEZA7I^j)D&3T_lceem&b$Wp2SKWU1Zhs3!A#G!BebP@EQ zF9`jPyn5^L3@>dVc{QA`bQOMuN#jBF?)kv%$N18NBYSnZl1;cl4rJ19VW^A0bh;`X zFUrGF)1dtPBBfsvbnElGDJ~cYWc#1z@!E~=`JR+z`p3ZBAe|;#_R+%#NiEFmsLyzR6~60d3xYXu=2xpU@vV+{AdZxw<3s} zu25Ti1jc2s9Fo_!Kz)0YAQ$UA1(En1H5A4aRe@kU?v~eQcBbeB&=Qr<0=)svh-8I# zU?tgunJkrBnabw$x+04-M7tCLcqBLe1|5IrKK*{!&9)*R==vXe%8uj@N8I$SM}p$B z-AW?HPJZJFVDf*~N^lft`Lcq@4^fwM#Y5Uux(G6<^nZZqD^JSw`HZX5cC#Cgf=T=U zcuFgb;7dCYsbETRbfgijTfkb+g#@6jR?W=|=r6ajZG~sm8Ils9Mgo2BAH1j^o`BOY zmVsIEu`_6sDxXD49fo8?`UaLF+{4ZrH`sG}Qw5ehpSYkxrh2Ewf{Ef_vBaI9U;>tu z_g^rx;uq*C%p1c?fAcS25m`|T_e?{5uNZ_+TNQ0)x(u=hzAQEK@Iw7E;8^Pn1S)EA zzSJ=Wgp4j=ZK`z$Z{aSO0J`foJ#KuV!G@_RagcgE-D{EytX`mJm#}|wEz7*Yaw9Xs zDWJUCo_frWk}6Y}&Kq!}ei6xigK}L(=A2MWv0m-*9}-Un9D6U|@_m!3H`-NlZc1Pf zY-S2J)a;^P2Ae{~d~HLHK)C_oF^|1FNf&9-^wRC`!j!uu95%+^0E30CO_UM{y* zFt_5|?rliXFwTAs8DtD6=)f1NW-l$}7X$R(PxGLUv5z-GS$JiRH2^?f0g<6(Cc7}V z@buERzZeTjz{Q%h@41m5g4~BxOJu6`pD9xD{;JKX(Zj=CWZ`?;Elm^I!SQ4PWYFJ` z75)z?62xBLel)k~TU3?^%^3b0@&IIwr`{NOMB#59oc)P zMgv1K83M-1^U}dERd;*jm>#s=;jC7jGmzCH>$Lh!AOk^6#9rfDJ3nyAwMKPvz)IjR zpWYz{IzZX*%O}%LiVLe8OoRi3WoJZoJ}$1t6D((Xp8gLRj-!KL3$#Li)e1}&!tYV` zt0CPWdjN!M|G&c>V4CXX?>y$A>)*O++P_-X7%M31%~IJrRj!Qd;0}Vqy!MK_=5RO` zG4P9rnfU`uFI6-LAFikmXcC|JS%<-bX!~2O<+8uxeQG+oIlVcN<|h>Sd#MF{uTvbj ziCDiZ!e5gc~=~Qb4 z?XQ?wPJ9`@vqfazqy0?(dsY)9jNhv;??R`B2OmOt?)g%hiaKP|e(j9uvB(}?qEk_w zk|1-JMM_hn3Qc#*JM{ohvSC`T3sj13_9|dHk%vK2vi^*-p;k%~k-SSTJLSLu0Ah^+ z*s=`BeR_9dY_WqR2RL>;`--EpECHKF zS|R5>U}Z4jy~9QbXUIbIQUeatUsEGgjQ*R{czPBP!~a!koLg!wB4#9IyI%WvtoZej z!|yb;kBw*wd~yv-*EBAJ?UdDS9SGX|ShM0m{`xB|^rh18RVsJnlja*+!=GFu%*dIO zd*oWg;-%JXgi1ggFO^cEDeJ^hg3|a_{n!{GS%3FHWq!#Swr5E7J*1h06{UNd%yx^ z<>KscQZ8)34L>)%(9km4b=#GQ0;NF}f9Z5gvtDm2zG?gx`j}#amPsBiMyaK6xfb+y`OraBz-Z5z3W3&T4nTQ@MZ3AB^1C0=l z0JL|qqCad(tt+0312SPRC0|CB7@Jh78O0(f+u>Y`^vdLQfGVtSELGWcbP&mE57frF znfM+fSNs?>FW-z|2{|05sD<8qiTD~w2+&72gWD5Y=O0FRmiB(ovlVO(aOQc92|P=d|kH# zbnCk!3W{>UgGoumDy5(xjXGg0(>MitxJ5Ld7jo&~i8L}x)TAA`6DX zvg}IUnb>l9Fr#Dp?PmV8henpCrCeKi*u=_nZ4#ggPv)z}j~(fWw84pLq5aB1mhguW z%D84wtv!3i*)_W~2P-KN!KE}^XyJ|Uy=_Y!KV3*s08B3NVr&axC~b1Y!e%aec@)_t z6h@_%nH(=meEu_bcx1IXrnAsO@{E+B0n*gb%^M_C2qTL2J+1eVgQ3+uJQw`Q)_uv9 z(6C7|E72~qSPKtZ8h&x4d0)SGhzs>YV_+1sxKluMa47X~oew~$n46>S3DN%EG5im)Q}gZ1%_Xm&W8Ua|>B0`A+{>cP~U3U2r$ zFk#oyC0t@cr<)Q?m*y-$Y5GAUwSD+2?bUcT2Usv2LLb}AntXf;0yqK+j&JI4HvQ%? z*zy`yp;s)h^Fto2K5&6>LlKC!4Np0Aw$4lT>NP78AqjdSNF7vx*!zpwY_k^c8}I`einW4iK^gM)NqDbGuc?J`*m&?QSL&=*~m| zlhB}D&Y`76g*M^_*6AnC7&JmF4F3jj?%;-yO~Z!h5qrm{R*vp?J1=vj1|%_ny?Ns* z&UGvljIG}*qgTQEL6CR7P=^2YYt3kKe*7Rh6?!5O{CLM7rH>CQ> zaX+CV3#iHV?;!Z;uFf;xR-Oy^dew|fgOq&f<~&!@8Qtb~K&bdMJ3U zef%5BtXNFNun%uR@$OAd9Z!*AwZ^Cwrb6<<1$@A{T0gmHz^^5p^E=vo7Zl@p9_@>rbHP05I5AVZ5kx~8#u6uT$Opl4RD z>7a65a(tn?CV5>YI7bK_RIX>`)o)XLaLuQn{P{Q`d@;7B9GfzIrMpkOw(l|lEPB2B zk04vFT&t&U}92p{*d^*W5k%Ffc$RUT=D z=OpG*XLKuB0NVl>`6Z2tKD`oT>5G7d?LHd>E)lDE75DsS@$GdcfzGuoQp~*7$^>c= zrEhk)pEY@OI?q{Xqtr@{i}Bt7yZ2i<4UFMN(I_?j%*@Fa%e6>z_c|=$>^3xmINDE* z^1v6_JMR3*V0*KncT_`jxj*6uW^*`Q*oDV*%y!)v) zI=_G9(fv##ZDn{eijIZzzttUDHqso5t{L;!PG@+l9jkDiur$>DAs0xXaaL?!v7RZ0doB z=w_Ss^5Tl=?~TzY*(l{;K$x$>PlK7IJ(LbD`#Jx(s1nI-qOeGFRM^IgFcy`UD}9%X z^gPfp8xIy(Xuitn;SmlH!=34R`SQ~hI_YD1O)zo?WY{t#0;=SBskF)DKZ$Mf1yry-Xl_yG5#oH=C;QT>? z-Db|Jci((s4lREWWG0uwi5E_AS3ryL5ZM#@O)=zZ=7S|X>-TyP1BVQplRSEDk4T9_ z*$KfEw|`L#x1o~?1O-JChkL<|mc!5rY_NX?mkd+g{#z8ouONgLDLGvJUnkV`|0fAG zF3PaIy;Z?^9AJPiNPUOAqo6QZ6kTaj>V|i+f#)rxwpl}>am}Sz-Gsb}kq@}(s@{pP z9BA)?vTWw+!`A+=j`Ut$YL1?H%*&VL@Zzxv>Sv}?L z-l=d2d3229mZj-$hro!Pl$N7UQ6|qjbPqMzI)+RQ5ESGOLhA>gGmOLbDRm;Pp@l-J zOPu|$RD2=7{VYhLaUFB?9^q0P&5kJ+JTxRv#e60Szb&4JzXp@s3Cg7671;UjgNii) zAn{*W9DS)^%H})K*LWAYLFkGPi6VpKPJTCALK@l!QY0kK8MS@g?b?WA&Mq8QQwg?U z>w@<`R2fN8eHmo-z_W95PS(M^-3yN#2KTsa;g2XJfQ0!E^5paeQse+pTAu`tKL^zl{^ghY zF=lD1{n6NRY3hgfacV`H{v>Pce~}I9!3^)B1y966;qP7uOFU_zr(PRDex>p#EP<)T z9o?WXq1i4+njfbR)}iLjB6#qB;ZtSdv_lTJGhP*Q5$=4rBB8>&Ui+#1|FxWNP(h$hf*`pBB>JBvfoT&! zafol|-GN+ickXE7Wuahn%t7xO^4@3L0WE(~D~}#=5LCd%;|}y}+s-4rQHpyO%DG*i zI^136XQuqLJP<@l^!*s`!QOccRPJ(mr9P~3EBASP@dTFatu>cixskcd`WF)fc|YcI zDPv;rERathrpLk{9&iEDC|4KzCE1N9ivW*UJA@pa8L1#J6^GR_{E%h-UD~t0X1yI~ zW}UCG-y}EZRBZ=~hJ=j?sKG&A$RaIj9AXBXVC~@fp=CQ{StCIy62$veKg2(pC>hOd z%v@w0%QfmCSfde46^Dm0LFNGJPxk^=j07VO@X&f7-f$q^{!Kn@gOD3gR9Vx8I1!H< z1zQ0D$4eUA(X@W=<;oh$3>@6iw{5qlVM!nA{AMeZ7ngj{@97 zy}DWBC(eC)B@_yvg6iM`7oF*F50L@YdWIK-a_h@WD<@oA2A^)|=f=?<6ctZR$x{%Qa>48;N@;AwKg)4`rbX5x}fh+}v z!DCi~6L=PoA9cUZuo@ILdb0>C`4uA5P#ijYExGxPy)4p6SPt%0Odk1edptkW4yup4 z{o?vsS@U_Fs-k6DG1qDT&=8Hp3M?m?tRmcr$^{D|AFzQ&oCGW3$$@n|{n2F#a?GN| zVP*7Eb$_4FQaBoPV5<3vq3FXWuT8xIrk-Xga-fdz0AdE;A^oTs?=fFX zsyxBu5m1T*tJSlq&MwZQCjUoL$9TBn$_-Z+Met(306!P50VERB*qd+Rnfa{TWm@z) zQ!@pb%L>~xGJ?b}c`xC}s1hg}WxjEly;$3Wk~5w3q*3B8Lq3mw{a{zWM5$ay=V6 zb5Zg#b96lP)|-K!I@L|-=A2*Y;=;&`AI_WwIO|T`qqHnS{L<`&v2VkzYr=uzF=EoQ zp^?3Gs&Ifr5RN2!<0ga+w#&&Z@k`igPiYsQVsiH#d^@IetbiHAmchZST``Q{zW4E{ z2&k^50R+U|PoOK}$8;I;;cDAEN5UYXmsy;PbQ-!3E>96$p6{GOKycD%J7-S}D|}SW zn}HxgPF@J9KWu?q3JM88v0826cl2OYe+y1{_*3jGtv`&r@^bi61LR@LXt~r$q|O`- z2lVGo0TP}$pI6r(7QlL(%KnTo_tknc8`v(Ge%wTG-dUZ^Nk5s!kwe1gMwr_9814KXSC`!RaOrsUY?&}T{2o6^HZ>_ zC|NRsi{tmx4oA=LJ#NT7G=G`W)7Thv8tj`$EWybq25taPcZoQ*{=C3;)(=Mx^&Y-- zqT;6FMP0RsgBJxi?cp2KTUsi;5nhm+ejNR-q4mp%6nCtcLhStDChC#uC)vtL;1(z1 z?K8F!E+^P#u=|KZQ`cV^pStF!q$rJPib_|{m)NIf>C%4Y9C)nj9~M$x`aB)F3GOaB z&jMHmGlTPqt|jGOoX1O?=r8!t7zY~JoNx(8c489A``QLf7QuFtDbjBYd%A7awTO{yc=TQqjchy-upa z3(N5Ov-Wq_-nwQZJ(MfIxQKqL_GlfKM4c4n^U1@tyWF1hReu^K&*|M0-lt^o>7KV6 zVKA6Cr*+}FWzL}ISNk)=xdyn_p&b=kvCmSNXWyBE=qYLBRy(_MhpXt2$0!GA@v{T0 zrKcU`_rg=Ioc(^#{ZZ21j4;RQ2e0-$>TTJ8;(JDO(kyA_+A(bLX5rwB&2@R1@apEm z$^3y_)rhm813tfTGiG=Snd&-l*kAp$&R)WSA1%sv^;x39%;#3K<9oGrH(y9kKbc@L zakBoIzo?on!EX1*!uFD@vdCj;tbRmFZTLH4x}_Sf_(&i8m3HBqp_LOqzIbpXfL3;! zR=DG_(~Hj~Qi5cv%RFfC(^Qk)<*}J#5n9GP$0hJo`|MY$Y*D=?ju$&qSpE2$hpoVq zG~i(8$MPeg`X{3aj*-g)<^R~BvQa8!{bSD;JSWgWmyce%`a(cCmUA?P_5O9Yh=m3| zS{KK`s9xORnXd7AXRtx6*5mS?qe|^+57wES8{b&wZ@k)%f-htlHP$v7Pq)0-w&UF) ze`Lx)lIb7oufBMz%=3|BE7wM0ljBc~eI$!xzbTa>pG~XZlzDe}T>Y8bWZ5I%YVFMc ze=n{){rDjrxz_O1)d%YW?Kj8{$K2nr;dAy=&6|Ur3z=l+NNZLUMh0aTJiV1-iqn5J73v?DCnL#@VPo&l zY;5a|Xg>4#&B~V^JVWe{zo`!f>Q*lA4t~&^QHa))v^-V5$4R&Ql%8^53w8_+G)Mwa zzPmQ}j=`E+^s}b!BVd|%4JFod?cgBKSDt#Xf~LC$>flP!v{dk)!=KwQC&L>B^+EL6 zyV=qYnX?m2Q0PB_FAB1Yh{u1klepM_-~o{T=4Unke9G+^k-t1CBGNJ7)mfOI?PBGV zM@JHN^En()xtr#GwS9~6Y|>eq!All@?5}C_SqgSKNiA!~>3KZi`ZBel?_6KGtb)wJ zExnzM_CX4BvU^0xC+ZgMbT(xPR7$L?%vLo%DREP3&Dm=`_Yi_HK-N}0F`lYBO zw#ye%kF1gRNZo&K|IBttA0RbrbP{dUT2KU_7R z9=d+>eqoY;k-*Ug0rsvh$Wzxe-gqY&ZLadEoaajKp^U}~6xkPF$9dJBUBjx(sU0{W z@EF{?2S4&@pp-(ssQ*Ab^!bgaB}k@x!Oe)VwU z(~IZvw7t0a4DQ!~aNd}>H@kFRDQo+myvCDyF@mu!u|=-SVD76R{QKq5brNNAcP1#+ zoSxl07Pv>zqES~|@CmosN?Kl}s8-{>n=cw1zhzL%Ybhvr{lzv#5;1j?Q^V6WqrpRK zOup>4bP+3W$JFgEUwoA9AZE{#0H%*5v2=^MbeVW z+~C(|xx^PD)^KMZlMmZXN9SV#wjN0pymalsA19kzUw(brXbPSo*J$|YHA2jwFzK;E zuB@&dUJoNkbQVe};jGLvDGf_EukLiycDrq$?%{MMu0Y!=e4_cquzpfgb286E%jfQ6 zHj{mnd0KbWkliWN(rgVm)hhbY@i^C~v7^>~K67(}Q|LnlFX>zE3CAn=EPSs~>OxsNh+}gXL z`g&cH#^FoV2N1&|wA09BICeog{L&xn+geZS z>|_b>ciEAWcaTaye!>JHfXF+7#k$AlA$EA-Lu#hQ$UGOsxi0+w^&!oFeHOJRXM

@@ -30,7 +33,7 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th -## 🆕 News +## 📢 News - 📅 2024-02-14: Our [technical report](https://arxiv.org/abs/2402.07939) is online! - 📅 2024-02-10: UFO is released on GitHub🎈. Happy Chinese New year🐉! diff --git a/ufo/module/flow.py b/ufo/module/flow.py index e252c141..2821888a 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -242,7 +242,7 @@ def process_action_selection(self, headers): print_with_color("Selected item🕹️: {control_text}, Label: {label}".format(control_text=control_text, label=control_label), "yellow") print_with_color("Action applied⚒️: {action}".format(action=action), "blue") print_with_color("Status📊: {status}".format(status=self.status), "blue") - print_with_color("Next Plan📚: {plan}".format(plan=self.plan.replace("\\n", "\n")), "cyan") + print_with_color("Next Plan📚: {plan}".format(plan=str(self.plan).replace("\\n", "\n")), "cyan") print_with_color("Comment💬: {comment}".format(comment=comment), "green") From 8239e5b76f7d98ecab223cb7d7d59f208a8ef825 Mon Sep 17 00:00:00 2001 From: Chaoyun Zhang Date: Fri, 23 Feb 2024 00:34:31 +0800 Subject: [PATCH 060/223] x --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2bbcbef0..c2893e80 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ![Python Version](https://img.shields.io/badge/Python-3776AB?&logo=python&logoColor=white-blue&label=3.10%20%7C%203.11)  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)  ![Welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat) -![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/:UFO_Agent) +![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/UFO_Agent) From 07177237a372825864a92112187e5fc60af488c0 Mon Sep 17 00:00:00 2001 From: Chaoyun Zhang Date: Fri, 23 Feb 2024 00:36:18 +0800 Subject: [PATCH 061/223] x --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c2893e80..8220888e 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ![Python Version](https://img.shields.io/badge/Python-3776AB?&logo=python&logoColor=white-blue&label=3.10%20%7C%203.11)  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)  -![Welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat) +![Welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)  ![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/UFO_Agent) From ca9eb32325d7ec158c463f34251073e8636072c3 Mon Sep 17 00:00:00 2001 From: Chaoyun Zhang Date: Fri, 23 Feb 2024 00:37:26 +0800 Subject: [PATCH 062/223] x --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8220888e..39561d19 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ![Python Version](https://img.shields.io/badge/Python-3776AB?&logo=python&logoColor=white-blue&label=3.10%20%7C%203.11)  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)  ![Welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)  -![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/UFO_Agent) +[![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/UFO_Agent)](https://twitter.com/intent/follow?screen_name=UFO_Agent) From 49b0e6aed18c789a1c6a6e19d156e15e3d325735 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Fri, 23 Feb 2024 20:05:16 +0800 Subject: [PATCH 063/223] qwen --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 39561d19..179d493b 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@
+[![arxiv](https://img.shields.io/badge/Technical%20Report-arXiv%20%7C%202402.07939-b31b1b.svg)](https://arxiv.org/abs/2402.07939)  ![Python Version](https://img.shields.io/badge/Python-3776AB?&logo=python&logoColor=white-blue&label=3.10%20%7C%203.11)  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)  ![Welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)  From 9ff38684076c1a036ac748e5a44ac99e410dbeac Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Fri, 23 Feb 2024 20:05:49 +0800 Subject: [PATCH 064/223] arxiv --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 179d493b..66064068 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,6 @@ ![Welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)  [![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/UFO_Agent)](https://twitter.com/intent/follow?screen_name=UFO_Agent) - -
**UFO** is a **UI-Focused** dual-agent framework to fulfill user requests on **Windows OS** by seamlessly navigating and operating within individual or spanning multiple applications. From eef206e299d492c4619d4b0ab6ad8fe16963504a Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Fri, 23 Feb 2024 20:07:11 +0800 Subject: [PATCH 065/223] arxiv --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 66064068..fc65ae7f 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@
-[![arxiv](https://img.shields.io/badge/Technical%20Report-arXiv%20%7C%202402.07939-b31b1b.svg)](https://arxiv.org/abs/2402.07939)  +[![arxiv](https://img.shields.io/badge/Paper-arXiv%20%7C%202402.07939-b31b1b.svg)](https://arxiv.org/abs/2402.07939)  ![Python Version](https://img.shields.io/badge/Python-3776AB?&logo=python&logoColor=white-blue&label=3.10%20%7C%203.11)  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)  ![Welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)  From 2b7a353391996b5754123f731940ccc73232cfe2 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 24 Feb 2024 20:33:25 +0800 Subject: [PATCH 066/223] arxiv --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fc65ae7f..bbf117f2 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@
-[![arxiv](https://img.shields.io/badge/Paper-arXiv%20%7C%202402.07939-b31b1b.svg)](https://arxiv.org/abs/2402.07939)  +[![arxiv](https://img.shields.io/badge/Paper-arXiv:202402.07939-b31b1b.svg)](https://arxiv.org/abs/2402.07939)  ![Python Version](https://img.shields.io/badge/Python-3776AB?&logo=python&logoColor=white-blue&label=3.10%20%7C%203.11)  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)  ![Welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)  From b452fc30c18d927bc4c2639c7e4165445d7593fe Mon Sep 17 00:00:00 2001 From: Yu Kang Date: Mon, 26 Feb 2024 21:12:25 +0800 Subject: [PATCH 067/223] Add config file to ignore, and added a template config file for user reference --- .gitignore | 3 +++ ufo/config/config.yaml.template | 42 +++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 ufo/config/config.yaml.template diff --git a/.gitignore b/.gitignore index 182c5752..35df3064 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ __pycache__/ **/__pycache__/ *.pyc + +# Ignore the config file +ufo/config/config.yaml diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template new file mode 100644 index 00000000..31358a10 --- /dev/null +++ b/ufo/config/config.yaml.template @@ -0,0 +1,42 @@ +version: 0.1 + +API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. +OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. +OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key +AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply +OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input +CONTROL_BACKEND: "uia" # The backend for control action +MAX_TOKENS: 2000 # The max token limit for the response completion +MAX_RETRY: 3 # The max retry limit for the response completion +MAX_STEP: 30 # The max step limit for completing the user request +SLEEP_TIME: 5 # The sleep time between each step to wait for the window to be ready +TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model +TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model +SAFE_GUARD: True # Whether to use the safe guard to prevent the model from doing sensitve operations. +CONTROL_TYPE_LIST: ["Button", "Edit", "TabItem", "Document", "ListItem", "MenuItem", "ScrollBar", "TreeItem", "Hyperlink", "ComboBox", "RadioButton"] # The list of control types that are allowed to be selected +HISTORY_KEYS: ["Step", "Thought", "ControlText", "Action", "Comment", "Results"] # The keys of the action history for the next step. +ANNOTATION_COLORS: { + "Button": "#FFF68F", + "Edit": "#A5F0B5", + "TabItem": "#A5E7F0", + "Document": "#FFD18A", + "ListItem": "#D9C3FE", + "MenuItem": "#E7FEC3", + "ScrollBar": "#FEC3F8", + "TreeItem": "#D6D6D6", + "Hyperlink": "#91FFEB", + "ComboBox": "#D8B6D4" + } + +PRINT_LOG: False # Whether to print the log +CONCAT_SCREENSHOT: True # Whether to concat the screenshot for the control item +LOG_LEVEL: "DEBUG" # The log level +INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation +REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model +APP_SELECTION_PROMPT: "ufo/prompts/base/app_selection.yaml" # The prompt for the app selection +ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt for the action selection +INPUT_TEXT_API: "type_keys" # The input text API + + + + \ No newline at end of file From f8d837590f45cb5febf82a183d1a16eeafe996cb Mon Sep 17 00:00:00 2001 From: Yu Kang Date: Mon, 26 Feb 2024 21:12:25 +0800 Subject: [PATCH 068/223] Add config file to ignore, and added a template config file for user reference --- .gitignore | 3 +++ ufo/config/config.yaml.template | 42 +++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 ufo/config/config.yaml.template diff --git a/.gitignore b/.gitignore index 182c5752..35df3064 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ __pycache__/ **/__pycache__/ *.pyc + +# Ignore the config file +ufo/config/config.yaml diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template new file mode 100644 index 00000000..31358a10 --- /dev/null +++ b/ufo/config/config.yaml.template @@ -0,0 +1,42 @@ +version: 0.1 + +API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. +OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. +OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key +AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply +OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input +CONTROL_BACKEND: "uia" # The backend for control action +MAX_TOKENS: 2000 # The max token limit for the response completion +MAX_RETRY: 3 # The max retry limit for the response completion +MAX_STEP: 30 # The max step limit for completing the user request +SLEEP_TIME: 5 # The sleep time between each step to wait for the window to be ready +TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model +TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model +SAFE_GUARD: True # Whether to use the safe guard to prevent the model from doing sensitve operations. +CONTROL_TYPE_LIST: ["Button", "Edit", "TabItem", "Document", "ListItem", "MenuItem", "ScrollBar", "TreeItem", "Hyperlink", "ComboBox", "RadioButton"] # The list of control types that are allowed to be selected +HISTORY_KEYS: ["Step", "Thought", "ControlText", "Action", "Comment", "Results"] # The keys of the action history for the next step. +ANNOTATION_COLORS: { + "Button": "#FFF68F", + "Edit": "#A5F0B5", + "TabItem": "#A5E7F0", + "Document": "#FFD18A", + "ListItem": "#D9C3FE", + "MenuItem": "#E7FEC3", + "ScrollBar": "#FEC3F8", + "TreeItem": "#D6D6D6", + "Hyperlink": "#91FFEB", + "ComboBox": "#D8B6D4" + } + +PRINT_LOG: False # Whether to print the log +CONCAT_SCREENSHOT: True # Whether to concat the screenshot for the control item +LOG_LEVEL: "DEBUG" # The log level +INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation +REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model +APP_SELECTION_PROMPT: "ufo/prompts/base/app_selection.yaml" # The prompt for the app selection +ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt for the action selection +INPUT_TEXT_API: "type_keys" # The input text API + + + + \ No newline at end of file From 2bbc7992eb261966d661629232c75153d917dda0 Mon Sep 17 00:00:00 2001 From: Yu Kang Date: Mon, 26 Feb 2024 21:17:54 +0800 Subject: [PATCH 069/223] Update dict format in app_selection.yaml --- ufo/prompts/base/app_selection.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ufo/prompts/base/app_selection.yaml b/ufo/prompts/base/app_selection.yaml index 816c47e0..e534389f 100644 --- a/ufo/prompts/base/app_selection.yaml +++ b/ufo/prompts/base/app_selection.yaml @@ -10,7 +10,7 @@ system: |- ## Guidelines - You are given a screenshot of the current desktop, along with a list of available applications in the windows. - The screenshot of multiple screens is concatenated into one image. - - You are given the information of all available applications item in the current desktop window in a dict format: {"label": control_text: "the text of the application", control_type: "the type of the application"}. + - You are given the information of all available applications item in the current desktop window in a dict format: {label: "label", control_text: "the text of the application", control_type: "the type of the application"}. - You are provided your previous plan of action for reference to decide the application. This usually happens when the you have already completed the previous task on an application and need to switch to another application to complete the next task. - When the selected application is visible in the screenshot, analyze the screenshot of the application window on its current status. Draft your plan based on the current status of the application and user request, and do not include the steps that have been completed on the application base on your screenshot observation. - You are provided the user request history for reference to decide the selection of application or control item. From 82185aadb22808f3a521b2ca90a671f09f9d6591 Mon Sep 17 00:00:00 2001 From: Yu Kang Date: Mon, 26 Feb 2024 21:17:54 +0800 Subject: [PATCH 070/223] Update dict format in app_selection.yaml --- ufo/prompts/base/app_selection.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ufo/prompts/base/app_selection.yaml b/ufo/prompts/base/app_selection.yaml index 816c47e0..e534389f 100644 --- a/ufo/prompts/base/app_selection.yaml +++ b/ufo/prompts/base/app_selection.yaml @@ -10,7 +10,7 @@ system: |- ## Guidelines - You are given a screenshot of the current desktop, along with a list of available applications in the windows. - The screenshot of multiple screens is concatenated into one image. - - You are given the information of all available applications item in the current desktop window in a dict format: {"label": control_text: "the text of the application", control_type: "the type of the application"}. + - You are given the information of all available applications item in the current desktop window in a dict format: {label: "label", control_text: "the text of the application", control_type: "the type of the application"}. - You are provided your previous plan of action for reference to decide the application. This usually happens when the you have already completed the previous task on an application and need to switch to another application to complete the next task. - When the selected application is visible in the screenshot, analyze the screenshot of the application window on its current status. Draft your plan based on the current status of the application and user request, and do not include the steps that have been completed on the application base on your screenshot observation. - You are provided the user request history for reference to decide the selection of application or control item. From 27b2949a8c03307520de50aaef328d5a383142ec Mon Sep 17 00:00:00 2001 From: Yu Kang Date: Mon, 26 Feb 2024 21:39:12 +0800 Subject: [PATCH 071/223] Update configuration of API base URL for AOAI --- ufo/config/config.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/ufo/config/config.py b/ufo/config/config.py index dc3dc031..780e70a9 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -22,6 +22,16 @@ def load_config(config_path="ufo/config/config.yaml"): if yaml_data: configs.update(yaml_data) except FileNotFoundError: - print(f"Warning: Config file not found at {config_path}. Using only environment variables.") + print( + f"Warning: Config file not found at {config_path}. Using only environment variables.") - return configs \ No newline at end of file + # Update the API base URL for AOAI + if configs["API_TYPE"].lower() == "aoai": + configs["OPENAI_API_BASE"] = "{endpoint}/openai/deployments/{deployment_name}/chat/completions?api-version={api_version}".format( + endpoint=configs["OPENAI_API_BASE"][:-1] if configs["OPENAI_API_BASE"].endswith( + "/") else configs["OPENAI_API_BASE"], + deployment_name=configs["AOAI_DEPLOYMENT"], + api_version="2024-02-15-preview" + ) + + return configs From 1915b772cb16ab8f257c79f52a2955e170d91444 Mon Sep 17 00:00:00 2001 From: Yu Kang Date: Mon, 26 Feb 2024 21:39:12 +0800 Subject: [PATCH 072/223] Update configuration of API base URL for AOAI --- ufo/config/config.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/ufo/config/config.py b/ufo/config/config.py index dc3dc031..780e70a9 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -22,6 +22,16 @@ def load_config(config_path="ufo/config/config.yaml"): if yaml_data: configs.update(yaml_data) except FileNotFoundError: - print(f"Warning: Config file not found at {config_path}. Using only environment variables.") + print( + f"Warning: Config file not found at {config_path}. Using only environment variables.") - return configs \ No newline at end of file + # Update the API base URL for AOAI + if configs["API_TYPE"].lower() == "aoai": + configs["OPENAI_API_BASE"] = "{endpoint}/openai/deployments/{deployment_name}/chat/completions?api-version={api_version}".format( + endpoint=configs["OPENAI_API_BASE"][:-1] if configs["OPENAI_API_BASE"].endswith( + "/") else configs["OPENAI_API_BASE"], + deployment_name=configs["AOAI_DEPLOYMENT"], + api_version="2024-02-15-preview" + ) + + return configs From 71a4261c532c3604478b277a028aab2c6b3c2c49 Mon Sep 17 00:00:00 2001 From: Yu Kang Date: Tue, 27 Feb 2024 11:06:12 +0800 Subject: [PATCH 073/223] Remove obsolete config.yaml file --- ufo/config/config.yaml | 41 ----------------------------------------- 1 file changed, 41 deletions(-) delete mode 100644 ufo/config/config.yaml diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml deleted file mode 100644 index a4836f2b..00000000 --- a/ufo/config/config.yaml +++ /dev/null @@ -1,41 +0,0 @@ -version: 0.1 - -API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. -OPENAI_API_BASE: "YOUR_ENDPOINT" # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. -OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key -OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input -CONTROL_BACKEND: "uia" # The backend for control action -MAX_TOKENS: 2000 # The max token limit for the response completion -MAX_RETRY: 3 # The max retry limit for the response completion -MAX_STEP: 30 # The max step limit for completing the user request -SLEEP_TIME: 5 # The sleep time between each step to wait for the window to be ready -TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model -TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model -SAFE_GUARD: True # Whether to use the safe guard to prevent the model from doing sensitve operations. -CONTROL_TYPE_LIST: ["Button", "Edit", "TabItem", "Document", "ListItem", "MenuItem", "ScrollBar", "TreeItem", "Hyperlink", "ComboBox", "RadioButton"] # The list of control types that are allowed to be selected -HISTORY_KEYS: ["Step", "Thought", "ControlText", "Action", "Comment", "Results"] # The keys of the action history for the next step. -ANNOTATION_COLORS: { - "Button": "#FFF68F", - "Edit": "#A5F0B5", - "TabItem": "#A5E7F0", - "Document": "#FFD18A", - "ListItem": "#D9C3FE", - "MenuItem": "#E7FEC3", - "ScrollBar": "#FEC3F8", - "TreeItem": "#D6D6D6", - "Hyperlink": "#91FFEB", - "ComboBox": "#D8B6D4" - } - -PRINT_LOG: False # Whether to print the log -CONCAT_SCREENSHOT: True # Whether to concat the screenshot for the control item -LOG_LEVEL: "DEBUG" # The log level -INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation -REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model -APP_SELECTION_PROMPT: "ufo/prompts/base/app_selection.yaml" # The prompt for the app selection -ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt for the action selection -INPUT_TEXT_API: "type_keys" # The input text API - - - - \ No newline at end of file From 95ce45691d9e6467b6bed4ecd2b46df9ddf66efa Mon Sep 17 00:00:00 2001 From: Yu Kang Date: Tue, 27 Feb 2024 11:06:12 +0800 Subject: [PATCH 074/223] Remove obsolete config.yaml file --- ufo/config/config.yaml | 41 ----------------------------------------- 1 file changed, 41 deletions(-) delete mode 100644 ufo/config/config.yaml diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml deleted file mode 100644 index a4836f2b..00000000 --- a/ufo/config/config.yaml +++ /dev/null @@ -1,41 +0,0 @@ -version: 0.1 - -API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. -OPENAI_API_BASE: "YOUR_ENDPOINT" # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. -OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key -OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input -CONTROL_BACKEND: "uia" # The backend for control action -MAX_TOKENS: 2000 # The max token limit for the response completion -MAX_RETRY: 3 # The max retry limit for the response completion -MAX_STEP: 30 # The max step limit for completing the user request -SLEEP_TIME: 5 # The sleep time between each step to wait for the window to be ready -TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model -TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model -SAFE_GUARD: True # Whether to use the safe guard to prevent the model from doing sensitve operations. -CONTROL_TYPE_LIST: ["Button", "Edit", "TabItem", "Document", "ListItem", "MenuItem", "ScrollBar", "TreeItem", "Hyperlink", "ComboBox", "RadioButton"] # The list of control types that are allowed to be selected -HISTORY_KEYS: ["Step", "Thought", "ControlText", "Action", "Comment", "Results"] # The keys of the action history for the next step. -ANNOTATION_COLORS: { - "Button": "#FFF68F", - "Edit": "#A5F0B5", - "TabItem": "#A5E7F0", - "Document": "#FFD18A", - "ListItem": "#D9C3FE", - "MenuItem": "#E7FEC3", - "ScrollBar": "#FEC3F8", - "TreeItem": "#D6D6D6", - "Hyperlink": "#91FFEB", - "ComboBox": "#D8B6D4" - } - -PRINT_LOG: False # Whether to print the log -CONCAT_SCREENSHOT: True # Whether to concat the screenshot for the control item -LOG_LEVEL: "DEBUG" # The log level -INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation -REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model -APP_SELECTION_PROMPT: "ufo/prompts/base/app_selection.yaml" # The prompt for the app selection -ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt for the action selection -INPUT_TEXT_API: "type_keys" # The input text API - - - - \ No newline at end of file From 434bc94f811f7e23c7e1fc6cbc663b3f829aa410 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 2 Mar 2024 18:06:35 +0800 Subject: [PATCH 075/223] help doc processing --- .gitignore | 3 ++ ufo/rag/__init__.py | 2 + ufo/rag/basic.py | 39 +++++++++++++++++++ ufo/rag/utils.py | 38 +++++++++++++++++++ ufo/rag/xml_loader.py | 87 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 169 insertions(+) create mode 100644 ufo/rag/__init__.py create mode 100644 ufo/rag/basic.py create mode 100644 ufo/rag/utils.py create mode 100644 ufo/rag/xml_loader.py diff --git a/.gitignore b/.gitignore index 35df3064..1b5569f8 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,6 @@ __pycache__/ # Ignore the config file ufo/config/config.yaml + +# Ignore the helper files +ufo/rag/app_docs/* diff --git a/ufo/rag/__init__.py b/ufo/rag/__init__.py new file mode 100644 index 00000000..7f3fd831 --- /dev/null +++ b/ufo/rag/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. \ No newline at end of file diff --git a/ufo/rag/basic.py b/ufo/rag/basic.py new file mode 100644 index 00000000..4d83965e --- /dev/null +++ b/ufo/rag/basic.py @@ -0,0 +1,39 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +import utils + + +class BasicDocumentLoader: + """ + A class to load documents from a list of files with a given extension list. + """ + + def __init__(self, extensions: str, directory: str = None): + """ + Create a new BasicDocumentLoader. + :param extensions: The extensions to load. + """ + self.extensions = extensions + self.directory = directory + + + def load_file_name(self): + """ + Load the documents from the given directory. + :param directory: The directory to load from. + :return: The list of loaded documents. + """ + return utils.find_files_with_extension(self.directory, self.extensions) + + + def construct_document_list(self): + """ + Load the metadata from the given directory. + :param directory: The directory to load from. + :return: The list of metadata for the loaded documents. + """ + pass + + + + \ No newline at end of file diff --git a/ufo/rag/utils.py b/ufo/rag/utils.py new file mode 100644 index 00000000..faa4a0e3 --- /dev/null +++ b/ufo/rag/utils.py @@ -0,0 +1,38 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +import os + +def find_files_with_extension(directory, extension): + """ + Find files with the given extension in the given directory. + :param directory: The directory to search. + :param extension: The extension to search for. + :return: The list of matching files. + """ + matching_files = [] + + for root, _, files in os.walk(directory): + for file in files: + if file.endswith(extension): + matching_files.append(os.path.join(root, file)) + + return matching_files + + + +def find_files_with_extension_list(directory, extensions): + """ + Find files with the given extensions in the given directory. + :param directory: The directory to search. + :param extensions: The list of extensions to search for. + :return: The list of matching files. + """ + matching_files = [] + + for root, _, files in os.walk(directory): + for file in files: + if file.endswith(tuple(extensions)): + matching_files.append(os.path.join(root, file)) + + return matching_files + diff --git a/ufo/rag/xml_loader.py b/ufo/rag/xml_loader.py new file mode 100644 index 00000000..4a21659e --- /dev/null +++ b/ufo/rag/xml_loader.py @@ -0,0 +1,87 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import basic +import utils +import os +from langchain_community.document_loaders import UnstructuredXMLLoader +import xml.etree.ElementTree as ET + + +class XMLLoader(basic.Loader): + """ + Class to load XML documents. + """ + + def __init__(self, directory: str = None): + """ + Create a new XMLLoader. + """ + + super().__init__() + self.extensions = ".xml" + self.directory = directory + + + def get_microsoft_document_metadata(self, file: str): + """ + Get the metadata for the given file. + :param file: The file to get the metadata for. + :return: The metadata for the given file. + """ + + if not os.path.exists(file): + return {'title': os.path.basename(file), 'summary': os.path.basename(file)} + + tree = ET.parse(file) + root = tree.getroot() + + # Extracting title + if root.find('title') is not None: + title = root.find('title').text + else: + title = None + + # Extracting content summary + + if root.find('Content-Summary') is not None: + summary = root.find('Content-Summary').attrib['value'] + else: + summary = None + + return {'title': title, 'summary': summary} + + + def get_microsoft_document_text(self, file: str): + """ + Get the text for the given file. + :param file: The file to get the text for. + :return: The text for the given file. + """ + return UnstructuredXMLLoader(file).load()[0] + + + def construct_document_list(self): + """ + Construct a document from the given file. + :param file: The file to construct the document from. + :return: The constructed document. + """ + documents = [] + for file in self.load_file_name(): + text = self.get_microsoft_document_text(file) + metadata = self.get_microsoft_document_metadata(file + ".meta") + title = metadata["title"] + summary = metadata["summary"] + + document = { + 'title': title, + 'summary': summary, + 'text':text + } + documents.append(document) + + return documents + + + From 41b4c34860e841eadd88ced93db60a5a852a0e71 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 2 Mar 2024 18:06:35 +0800 Subject: [PATCH 076/223] help doc processing --- .gitignore | 3 ++ ufo/rag/__init__.py | 2 + ufo/rag/basic.py | 39 +++++++++++++++++++ ufo/rag/utils.py | 38 +++++++++++++++++++ ufo/rag/xml_loader.py | 87 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 169 insertions(+) create mode 100644 ufo/rag/__init__.py create mode 100644 ufo/rag/basic.py create mode 100644 ufo/rag/utils.py create mode 100644 ufo/rag/xml_loader.py diff --git a/.gitignore b/.gitignore index 35df3064..1b5569f8 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,6 @@ __pycache__/ # Ignore the config file ufo/config/config.yaml + +# Ignore the helper files +ufo/rag/app_docs/* diff --git a/ufo/rag/__init__.py b/ufo/rag/__init__.py new file mode 100644 index 00000000..7f3fd831 --- /dev/null +++ b/ufo/rag/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. \ No newline at end of file diff --git a/ufo/rag/basic.py b/ufo/rag/basic.py new file mode 100644 index 00000000..4d83965e --- /dev/null +++ b/ufo/rag/basic.py @@ -0,0 +1,39 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +import utils + + +class BasicDocumentLoader: + """ + A class to load documents from a list of files with a given extension list. + """ + + def __init__(self, extensions: str, directory: str = None): + """ + Create a new BasicDocumentLoader. + :param extensions: The extensions to load. + """ + self.extensions = extensions + self.directory = directory + + + def load_file_name(self): + """ + Load the documents from the given directory. + :param directory: The directory to load from. + :return: The list of loaded documents. + """ + return utils.find_files_with_extension(self.directory, self.extensions) + + + def construct_document_list(self): + """ + Load the metadata from the given directory. + :param directory: The directory to load from. + :return: The list of metadata for the loaded documents. + """ + pass + + + + \ No newline at end of file diff --git a/ufo/rag/utils.py b/ufo/rag/utils.py new file mode 100644 index 00000000..faa4a0e3 --- /dev/null +++ b/ufo/rag/utils.py @@ -0,0 +1,38 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +import os + +def find_files_with_extension(directory, extension): + """ + Find files with the given extension in the given directory. + :param directory: The directory to search. + :param extension: The extension to search for. + :return: The list of matching files. + """ + matching_files = [] + + for root, _, files in os.walk(directory): + for file in files: + if file.endswith(extension): + matching_files.append(os.path.join(root, file)) + + return matching_files + + + +def find_files_with_extension_list(directory, extensions): + """ + Find files with the given extensions in the given directory. + :param directory: The directory to search. + :param extensions: The list of extensions to search for. + :return: The list of matching files. + """ + matching_files = [] + + for root, _, files in os.walk(directory): + for file in files: + if file.endswith(tuple(extensions)): + matching_files.append(os.path.join(root, file)) + + return matching_files + diff --git a/ufo/rag/xml_loader.py b/ufo/rag/xml_loader.py new file mode 100644 index 00000000..4a21659e --- /dev/null +++ b/ufo/rag/xml_loader.py @@ -0,0 +1,87 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import basic +import utils +import os +from langchain_community.document_loaders import UnstructuredXMLLoader +import xml.etree.ElementTree as ET + + +class XMLLoader(basic.Loader): + """ + Class to load XML documents. + """ + + def __init__(self, directory: str = None): + """ + Create a new XMLLoader. + """ + + super().__init__() + self.extensions = ".xml" + self.directory = directory + + + def get_microsoft_document_metadata(self, file: str): + """ + Get the metadata for the given file. + :param file: The file to get the metadata for. + :return: The metadata for the given file. + """ + + if not os.path.exists(file): + return {'title': os.path.basename(file), 'summary': os.path.basename(file)} + + tree = ET.parse(file) + root = tree.getroot() + + # Extracting title + if root.find('title') is not None: + title = root.find('title').text + else: + title = None + + # Extracting content summary + + if root.find('Content-Summary') is not None: + summary = root.find('Content-Summary').attrib['value'] + else: + summary = None + + return {'title': title, 'summary': summary} + + + def get_microsoft_document_text(self, file: str): + """ + Get the text for the given file. + :param file: The file to get the text for. + :return: The text for the given file. + """ + return UnstructuredXMLLoader(file).load()[0] + + + def construct_document_list(self): + """ + Construct a document from the given file. + :param file: The file to construct the document from. + :return: The constructed document. + """ + documents = [] + for file in self.load_file_name(): + text = self.get_microsoft_document_text(file) + metadata = self.get_microsoft_document_metadata(file + ".meta") + title = metadata["title"] + summary = metadata["summary"] + + document = { + 'title': title, + 'summary': summary, + 'text':text + } + documents.append(document) + + return documents + + + From c690a42dd8995a33c089e0df9a5bdf01dc008507 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 2 Mar 2024 23:04:57 +0800 Subject: [PATCH 077/223] help doc build --- .gitignore | 2 + learner/__init__.py | 2 + learner/__main__.py | 8 +++ {ufo/rag => learner}/basic.py | 4 +- learner/indexer.py | 63 ++++++++++++++++++++ learner/learn.py | 36 +++++++++++ learner/records.json | 3 + learner/utils.py | 95 ++++++++++++++++++++++++++++++ {ufo/rag => learner}/xml_loader.py | 37 ++++++++++-- ufo/rag/utils.py | 38 ------------ 10 files changed, 242 insertions(+), 46 deletions(-) create mode 100644 learner/__init__.py create mode 100644 learner/__main__.py rename {ufo/rag => learner}/basic.py (91%) create mode 100644 learner/indexer.py create mode 100644 learner/learn.py create mode 100644 learner/records.json create mode 100644 learner/utils.py rename {ufo/rag => learner}/xml_loader.py (67%) delete mode 100644 ufo/rag/utils.py diff --git a/.gitignore b/.gitignore index 1b5569f8..74875e28 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ ufo/config/config.yaml # Ignore the helper files ufo/rag/app_docs/* +ufo/learn/records.json +vectordb/* diff --git a/learner/__init__.py b/learner/__init__.py new file mode 100644 index 00000000..7f3fd831 --- /dev/null +++ b/learner/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. \ No newline at end of file diff --git a/learner/__main__.py b/learner/__main__.py new file mode 100644 index 00000000..b79ff465 --- /dev/null +++ b/learner/__main__.py @@ -0,0 +1,8 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from . import learn + +if __name__ == "__main__": + # Execute the main script + learn.main() \ No newline at end of file diff --git a/ufo/rag/basic.py b/learner/basic.py similarity index 91% rename from ufo/rag/basic.py rename to learner/basic.py index 4d83965e..3d63592f 100644 --- a/ufo/rag/basic.py +++ b/learner/basic.py @@ -1,6 +1,6 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. -import utils +from . import utils class BasicDocumentLoader: @@ -8,7 +8,7 @@ class BasicDocumentLoader: A class to load documents from a list of files with a given extension list. """ - def __init__(self, extensions: str, directory: str = None): + def __init__(self, extensions: str = None, directory: str = None): """ Create a new BasicDocumentLoader. :param extensions: The extensions to load. diff --git a/learner/indexer.py b/learner/indexer.py new file mode 100644 index 00000000..022ad118 --- /dev/null +++ b/learner/indexer.py @@ -0,0 +1,63 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from . import xml_loader +from .utils import load_json_file, save_json_file, print_with_color +from langchain_community.embeddings import HuggingFaceEmbeddings +from langchain_community.vectorstores import FAISS +import os + + +def create_indexer(app: str, docs: str, format: str, incremental: bool, save_path: str): + """ + Create an indexer for the given application. + :param app: The name of the application to create an indexer for. + :param docs: The help documents dir for the application. + :param format: The format of the help documents. + :param incremental: Whether to enable incremental updates. + :param save_path: The path to save the indexer to. + :return: The created indexer. + """ + + if os.path.exists("./learner/records.json"): + records = load_json_file("./learner/records.json") + else: + records = {} + + print_with_color("Loading documents from {docs}...".format(docs=docs), "cyan") + + loader = xml_loader.XMLLoader(docs) + documents = loader.construct_document() + + print_with_color("Creating indexer for {num} documents for {app}...".format(num=len(documents), app=app), "yellow") + + if format == "xml": + embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + else: + raise ValueError("Invalid format: " + format) + + db = FAISS.from_documents(documents, embeddings) + + if incremental: + if app in records: + print_with_color("Merging with previous indexer...", "yellow") + prev_db = FAISS.load_local(records[app], embeddings) + db.merge_from(prev_db) + + db_file_path = os.path.join(save_path, app) + db_file_path = os.path.abspath(db_file_path) + db.save_local(db_file_path) + + records[app] = db_file_path + + + save_json_file("./learner/records.json", records) + + print_with_color("Indexer for {app} created successfully. Save in {path}.".format(app=app, path=db_file_path), "green") + + return db_file_path + + + + + diff --git a/learner/learn.py b/learner/learn.py new file mode 100644 index 00000000..cc8489da --- /dev/null +++ b/learner/learn.py @@ -0,0 +1,36 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import argparse +from . import indexer + + + +# configs = load_config() + +args = argparse.ArgumentParser() +args.add_argument("--app", help="The name of application to learn.", + type=str, default="./") +args.add_argument("--docs", help="The help application of the app.", type=str, + default="./") +args.add_argument("--format", help="The format of the help doc.", type=str, + default="xml") +args.add_argument('--incremental', action='store_true', help='Enable incremental update.') +args.add_argument("--save_path", help="The format of the help doc.", type=str, + default="./vectordb/docs/") + + + + +parsed_args = args.parse_args() + +def main(): + """ + Main function. + """ + + db_file_path = indexer.create_indexer(parsed_args.app, parsed_args.docs, parsed_args.format, parsed_args.incremental, parsed_args.save_path) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/learner/records.json b/learner/records.json new file mode 100644 index 00000000..f8d74264 --- /dev/null +++ b/learner/records.json @@ -0,0 +1,3 @@ +{ + "powerpoint": "C:\\Users\\chaoyunzhang\\OneDrive - Microsoft\\Desktop\\research\\GPTV\\UFO-windows\\github\\UFO\\vectordb\\docs\\powerpoint" +} \ No newline at end of file diff --git a/learner/utils.py b/learner/utils.py new file mode 100644 index 00000000..b25b08d4 --- /dev/null +++ b/learner/utils.py @@ -0,0 +1,95 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +import os +import json +from colorama import Fore, Style, init + +# init colorama +init() + +def print_with_color(text: str, color: str = ""): + """ + Print text with specified color using ANSI escape codes from Colorama library. + + :param text: The text to print. + :param color: The color of the text (options: red, green, yellow, blue, magenta, cyan, white, black). + """ + color_mapping = { + "red": Fore.RED, + "green": Fore.GREEN, + "yellow": Fore.YELLOW, + "blue": Fore.BLUE, + "magenta": Fore.MAGENTA, + "cyan": Fore.CYAN, + "white": Fore.WHITE, + "black": Fore.BLACK + } + + selected_color = color_mapping.get(color.lower(), "") + colored_text = selected_color + text + Style.RESET_ALL + + print(colored_text) + + + +def find_files_with_extension(directory, extension): + """ + Find files with the given extension in the given directory. + :param directory: The directory to search. + :param extension: The extension to search for. + :return: The list of matching files. + """ + matching_files = [] + + for root, _, files in os.walk(directory): + for file in files: + if file.endswith(extension): + path = os.path.join(root, file) + path = os.path.realpath(path) + matching_files.append(path) + + return matching_files + + + +def find_files_with_extension_list(directory, extensions): + """ + Find files with the given extensions in the given directory. + :param directory: The directory to search. + :param extensions: The list of extensions to search for. + :return: The list of matching files. + """ + matching_files = [] + + for root, _, files in os.walk(directory): + for file in files: + if file.endswith(tuple(extensions)): + path = os.path.join(root, file) + path = os.path.realpath(path) + matching_files.append(path) + + return matching_files + + + +def load_json_file(file_path): + """ + Load a JSON file. + :param file_path: The path to the file to load. + :return: The loaded JSON data. + """ + + with open(file_path, 'r') as file: + data = json.load(file) + return data + + + +def save_json_file(file_path, data): + """ + Save a JSON file. + :param file_path: The path to the file to save. + """ + + with open(file_path, 'w') as file: + json.dump(data, file, indent=4) diff --git a/ufo/rag/xml_loader.py b/learner/xml_loader.py similarity index 67% rename from ufo/rag/xml_loader.py rename to learner/xml_loader.py index 4a21659e..f08d603a 100644 --- a/ufo/rag/xml_loader.py +++ b/learner/xml_loader.py @@ -1,14 +1,14 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. -import basic -import utils +from . import basic import os from langchain_community.document_loaders import UnstructuredXMLLoader +from langchain.docstore.document import Document import xml.etree.ElementTree as ET -class XMLLoader(basic.Loader): +class XMLLoader(basic.BasicDocumentLoader): """ Class to load XML documents. """ @@ -63,9 +63,8 @@ def get_microsoft_document_text(self, file: str): def construct_document_list(self): """ - Construct a document from the given file. - :param file: The file to construct the document from. - :return: The constructed document. + Construct a list of documents. + :return: The list of documents. """ documents = [] for file in self.load_file_name(): @@ -82,6 +81,32 @@ def construct_document_list(self): documents.append(document) return documents + + + + def construct_document(self): + """ + Construct a langchain document list. + :return: The langchain document list. + """ + documents = [] + for file in self.load_file_name(): + text = self.get_microsoft_document_text(file) + metadata = self.get_microsoft_document_metadata(file + ".meta") + title = metadata["title"] + summary = metadata["summary"] + page_content = """{title} - {summary}""".format(title=title, summary=summary) + + metadata = { + 'title': title, + 'summary': summary, + 'text':text + } + document = Document(page_content=page_content, metadata=metadata) + + documents.append(document) + return documents + diff --git a/ufo/rag/utils.py b/ufo/rag/utils.py deleted file mode 100644 index faa4a0e3..00000000 --- a/ufo/rag/utils.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. -import os - -def find_files_with_extension(directory, extension): - """ - Find files with the given extension in the given directory. - :param directory: The directory to search. - :param extension: The extension to search for. - :return: The list of matching files. - """ - matching_files = [] - - for root, _, files in os.walk(directory): - for file in files: - if file.endswith(extension): - matching_files.append(os.path.join(root, file)) - - return matching_files - - - -def find_files_with_extension_list(directory, extensions): - """ - Find files with the given extensions in the given directory. - :param directory: The directory to search. - :param extensions: The list of extensions to search for. - :return: The list of matching files. - """ - matching_files = [] - - for root, _, files in os.walk(directory): - for file in files: - if file.endswith(tuple(extensions)): - matching_files.append(os.path.join(root, file)) - - return matching_files - From edc0a7a269179dc16ed9cbdb2b808ae70655b483 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 2 Mar 2024 23:04:57 +0800 Subject: [PATCH 078/223] help doc build --- .gitignore | 2 + learner/__init__.py | 2 + learner/__main__.py | 8 +++ {ufo/rag => learner}/basic.py | 4 +- learner/indexer.py | 63 ++++++++++++++++++++ learner/learn.py | 36 +++++++++++ learner/records.json | 3 + learner/utils.py | 95 ++++++++++++++++++++++++++++++ {ufo/rag => learner}/xml_loader.py | 37 ++++++++++-- ufo/rag/utils.py | 38 ------------ 10 files changed, 242 insertions(+), 46 deletions(-) create mode 100644 learner/__init__.py create mode 100644 learner/__main__.py rename {ufo/rag => learner}/basic.py (91%) create mode 100644 learner/indexer.py create mode 100644 learner/learn.py create mode 100644 learner/records.json create mode 100644 learner/utils.py rename {ufo/rag => learner}/xml_loader.py (67%) delete mode 100644 ufo/rag/utils.py diff --git a/.gitignore b/.gitignore index 1b5569f8..74875e28 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ ufo/config/config.yaml # Ignore the helper files ufo/rag/app_docs/* +ufo/learn/records.json +vectordb/* diff --git a/learner/__init__.py b/learner/__init__.py new file mode 100644 index 00000000..7f3fd831 --- /dev/null +++ b/learner/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. \ No newline at end of file diff --git a/learner/__main__.py b/learner/__main__.py new file mode 100644 index 00000000..b79ff465 --- /dev/null +++ b/learner/__main__.py @@ -0,0 +1,8 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from . import learn + +if __name__ == "__main__": + # Execute the main script + learn.main() \ No newline at end of file diff --git a/ufo/rag/basic.py b/learner/basic.py similarity index 91% rename from ufo/rag/basic.py rename to learner/basic.py index 4d83965e..3d63592f 100644 --- a/ufo/rag/basic.py +++ b/learner/basic.py @@ -1,6 +1,6 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. -import utils +from . import utils class BasicDocumentLoader: @@ -8,7 +8,7 @@ class BasicDocumentLoader: A class to load documents from a list of files with a given extension list. """ - def __init__(self, extensions: str, directory: str = None): + def __init__(self, extensions: str = None, directory: str = None): """ Create a new BasicDocumentLoader. :param extensions: The extensions to load. diff --git a/learner/indexer.py b/learner/indexer.py new file mode 100644 index 00000000..022ad118 --- /dev/null +++ b/learner/indexer.py @@ -0,0 +1,63 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from . import xml_loader +from .utils import load_json_file, save_json_file, print_with_color +from langchain_community.embeddings import HuggingFaceEmbeddings +from langchain_community.vectorstores import FAISS +import os + + +def create_indexer(app: str, docs: str, format: str, incremental: bool, save_path: str): + """ + Create an indexer for the given application. + :param app: The name of the application to create an indexer for. + :param docs: The help documents dir for the application. + :param format: The format of the help documents. + :param incremental: Whether to enable incremental updates. + :param save_path: The path to save the indexer to. + :return: The created indexer. + """ + + if os.path.exists("./learner/records.json"): + records = load_json_file("./learner/records.json") + else: + records = {} + + print_with_color("Loading documents from {docs}...".format(docs=docs), "cyan") + + loader = xml_loader.XMLLoader(docs) + documents = loader.construct_document() + + print_with_color("Creating indexer for {num} documents for {app}...".format(num=len(documents), app=app), "yellow") + + if format == "xml": + embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + else: + raise ValueError("Invalid format: " + format) + + db = FAISS.from_documents(documents, embeddings) + + if incremental: + if app in records: + print_with_color("Merging with previous indexer...", "yellow") + prev_db = FAISS.load_local(records[app], embeddings) + db.merge_from(prev_db) + + db_file_path = os.path.join(save_path, app) + db_file_path = os.path.abspath(db_file_path) + db.save_local(db_file_path) + + records[app] = db_file_path + + + save_json_file("./learner/records.json", records) + + print_with_color("Indexer for {app} created successfully. Save in {path}.".format(app=app, path=db_file_path), "green") + + return db_file_path + + + + + diff --git a/learner/learn.py b/learner/learn.py new file mode 100644 index 00000000..cc8489da --- /dev/null +++ b/learner/learn.py @@ -0,0 +1,36 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import argparse +from . import indexer + + + +# configs = load_config() + +args = argparse.ArgumentParser() +args.add_argument("--app", help="The name of application to learn.", + type=str, default="./") +args.add_argument("--docs", help="The help application of the app.", type=str, + default="./") +args.add_argument("--format", help="The format of the help doc.", type=str, + default="xml") +args.add_argument('--incremental', action='store_true', help='Enable incremental update.') +args.add_argument("--save_path", help="The format of the help doc.", type=str, + default="./vectordb/docs/") + + + + +parsed_args = args.parse_args() + +def main(): + """ + Main function. + """ + + db_file_path = indexer.create_indexer(parsed_args.app, parsed_args.docs, parsed_args.format, parsed_args.incremental, parsed_args.save_path) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/learner/records.json b/learner/records.json new file mode 100644 index 00000000..f8d74264 --- /dev/null +++ b/learner/records.json @@ -0,0 +1,3 @@ +{ + "powerpoint": "C:\\Users\\chaoyunzhang\\OneDrive - Microsoft\\Desktop\\research\\GPTV\\UFO-windows\\github\\UFO\\vectordb\\docs\\powerpoint" +} \ No newline at end of file diff --git a/learner/utils.py b/learner/utils.py new file mode 100644 index 00000000..b25b08d4 --- /dev/null +++ b/learner/utils.py @@ -0,0 +1,95 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +import os +import json +from colorama import Fore, Style, init + +# init colorama +init() + +def print_with_color(text: str, color: str = ""): + """ + Print text with specified color using ANSI escape codes from Colorama library. + + :param text: The text to print. + :param color: The color of the text (options: red, green, yellow, blue, magenta, cyan, white, black). + """ + color_mapping = { + "red": Fore.RED, + "green": Fore.GREEN, + "yellow": Fore.YELLOW, + "blue": Fore.BLUE, + "magenta": Fore.MAGENTA, + "cyan": Fore.CYAN, + "white": Fore.WHITE, + "black": Fore.BLACK + } + + selected_color = color_mapping.get(color.lower(), "") + colored_text = selected_color + text + Style.RESET_ALL + + print(colored_text) + + + +def find_files_with_extension(directory, extension): + """ + Find files with the given extension in the given directory. + :param directory: The directory to search. + :param extension: The extension to search for. + :return: The list of matching files. + """ + matching_files = [] + + for root, _, files in os.walk(directory): + for file in files: + if file.endswith(extension): + path = os.path.join(root, file) + path = os.path.realpath(path) + matching_files.append(path) + + return matching_files + + + +def find_files_with_extension_list(directory, extensions): + """ + Find files with the given extensions in the given directory. + :param directory: The directory to search. + :param extensions: The list of extensions to search for. + :return: The list of matching files. + """ + matching_files = [] + + for root, _, files in os.walk(directory): + for file in files: + if file.endswith(tuple(extensions)): + path = os.path.join(root, file) + path = os.path.realpath(path) + matching_files.append(path) + + return matching_files + + + +def load_json_file(file_path): + """ + Load a JSON file. + :param file_path: The path to the file to load. + :return: The loaded JSON data. + """ + + with open(file_path, 'r') as file: + data = json.load(file) + return data + + + +def save_json_file(file_path, data): + """ + Save a JSON file. + :param file_path: The path to the file to save. + """ + + with open(file_path, 'w') as file: + json.dump(data, file, indent=4) diff --git a/ufo/rag/xml_loader.py b/learner/xml_loader.py similarity index 67% rename from ufo/rag/xml_loader.py rename to learner/xml_loader.py index 4a21659e..f08d603a 100644 --- a/ufo/rag/xml_loader.py +++ b/learner/xml_loader.py @@ -1,14 +1,14 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. -import basic -import utils +from . import basic import os from langchain_community.document_loaders import UnstructuredXMLLoader +from langchain.docstore.document import Document import xml.etree.ElementTree as ET -class XMLLoader(basic.Loader): +class XMLLoader(basic.BasicDocumentLoader): """ Class to load XML documents. """ @@ -63,9 +63,8 @@ def get_microsoft_document_text(self, file: str): def construct_document_list(self): """ - Construct a document from the given file. - :param file: The file to construct the document from. - :return: The constructed document. + Construct a list of documents. + :return: The list of documents. """ documents = [] for file in self.load_file_name(): @@ -82,6 +81,32 @@ def construct_document_list(self): documents.append(document) return documents + + + + def construct_document(self): + """ + Construct a langchain document list. + :return: The langchain document list. + """ + documents = [] + for file in self.load_file_name(): + text = self.get_microsoft_document_text(file) + metadata = self.get_microsoft_document_metadata(file + ".meta") + title = metadata["title"] + summary = metadata["summary"] + page_content = """{title} - {summary}""".format(title=title, summary=summary) + + metadata = { + 'title': title, + 'summary': summary, + 'text':text + } + document = Document(page_content=page_content, metadata=metadata) + + documents.append(document) + return documents + diff --git a/ufo/rag/utils.py b/ufo/rag/utils.py deleted file mode 100644 index faa4a0e3..00000000 --- a/ufo/rag/utils.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. -import os - -def find_files_with_extension(directory, extension): - """ - Find files with the given extension in the given directory. - :param directory: The directory to search. - :param extension: The extension to search for. - :return: The list of matching files. - """ - matching_files = [] - - for root, _, files in os.walk(directory): - for file in files: - if file.endswith(extension): - matching_files.append(os.path.join(root, file)) - - return matching_files - - - -def find_files_with_extension_list(directory, extensions): - """ - Find files with the given extensions in the given directory. - :param directory: The directory to search. - :param extensions: The list of extensions to search for. - :return: The list of matching files. - """ - matching_files = [] - - for root, _, files in os.walk(directory): - for file in files: - if file.endswith(tuple(extensions)): - matching_files.append(os.path.join(root, file)) - - return matching_files - From edc8439e7c0df14574e33e525b4e1dd23f085b26 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 2 Mar 2024 23:06:13 +0800 Subject: [PATCH 079/223] help doc build --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 74875e28..c8a65e15 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,5 @@ ufo/config/config.yaml # Ignore the helper files ufo/rag/app_docs/* -ufo/learn/records.json +learner/records.json vectordb/* From 83373ce447b851ebb8d65a16e7d455a137ce76df Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 2 Mar 2024 23:06:13 +0800 Subject: [PATCH 080/223] help doc build --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 74875e28..c8a65e15 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,5 @@ ufo/config/config.yaml # Ignore the helper files ufo/rag/app_docs/* -ufo/learn/records.json +learner/records.json vectordb/* From 1ecf0868c51a6248ac6ce650726d64acb37fed92 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 2 Mar 2024 23:07:04 +0800 Subject: [PATCH 081/223] help doc build --- learner/records.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 learner/records.json diff --git a/learner/records.json b/learner/records.json deleted file mode 100644 index f8d74264..00000000 --- a/learner/records.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "powerpoint": "C:\\Users\\chaoyunzhang\\OneDrive - Microsoft\\Desktop\\research\\GPTV\\UFO-windows\\github\\UFO\\vectordb\\docs\\powerpoint" -} \ No newline at end of file From 0ebe839e85e71ef77f612e310c44510f69a7cc0e Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 2 Mar 2024 23:07:04 +0800 Subject: [PATCH 082/223] help doc build --- learner/records.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 learner/records.json diff --git a/learner/records.json b/learner/records.json deleted file mode 100644 index f8d74264..00000000 --- a/learner/records.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "powerpoint": "C:\\Users\\chaoyunzhang\\OneDrive - Microsoft\\Desktop\\research\\GPTV\\UFO-windows\\github\\UFO\\vectordb\\docs\\powerpoint" -} \ No newline at end of file From c0617c8dbfbcb4b30e7a4afa9780961ffc9049fe Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 19:51:53 +0800 Subject: [PATCH 083/223] web retriever --- ufo/rag/web_retriever.py | 97 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 ufo/rag/web_retriever.py diff --git a/ufo/rag/web_retriever.py b/ufo/rag/web_retriever.py new file mode 100644 index 00000000..7d5d691f --- /dev/null +++ b/ufo/rag/web_retriever.py @@ -0,0 +1,97 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import requests +from ..config.config import load_config +from langchain.text_splitter import HTMLHeaderTextSplitter +from langchain.docstore.document import Document + +configs = load_config() + + +class BingWebRetriever: + """ + Class to retrieve web documents. + """ + + def __init__(self): + """ + Create a new WebRetriever. + """ + self.api_key = configs["BING_API_KEY"] + + + def search(self, query: str, top_k: int = 1): + """ + Retrieve the web document from the given URL. + :param url: The URL to retrieve the web document from. + :return: The web document from the given URL. + """ + url = f"https://api.bing.microsoft.com/v7.0/search?q={query}" + if top_k > 0: + url += f"&count={top_k}" + try: + response = requests.get(url, headers={"Ocp-Apim-Subscription-Key": self.api_key}) + except requests.RequestException as e: + print(f"Error when searching: {e}") + return None + result_list = [] + + for item in response.json()["webPages"]["value"]: + result_list.append({"name": item["name"], "url": item["url"], "snippet": item["snippet"]}) + + return result_list + + + def get_url_text(self, url: str): + """ + Retrieve the web document from the given URL. + :param url: The URL to retrieve the web document from. + :return: The web text from the given URL. + """ + try: + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' + } + response = requests.get(url, headers=headers) + if response.status_code == 200: + html_splitter = HTMLHeaderTextSplitter(headers_to_split_on=[]) + document = html_splitter.split_text(response.text) + return document + + else: + print("Error in getting search result for {url}, error code: {status_code}.".format(url=url, status_code=response.status_code)) + return None + except requests.exceptions.RequestException as e: + print("Error in getting search result for {url}: {e}.".format(url=url, e=e)) + return None + + + def create_documents(self, result_list: list): + """ + Create documents from the given result list. + :param result_list: The result list to create documents from. + :return: The documents from the given result list. + """ + document_list = [] + + for result in result_list: + documents = self.get_url_text(result["url"]) + for document in documents: + page_content = document.page_content + metadata = document.metadata + metadata["url"] = result["url"] + metadata["name"] = result["name"] + metadata["snippet"] = result["snippet"] + + document = Document(page_content=page_content, metadata=metadata) + + + document_list.append(document) + + return document_list + + + + + \ No newline at end of file From bf45ace2eca9e0ba019d4556bacfa5e8aaf489bb Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 19:51:53 +0800 Subject: [PATCH 084/223] web retriever --- ufo/rag/web_retriever.py | 97 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 ufo/rag/web_retriever.py diff --git a/ufo/rag/web_retriever.py b/ufo/rag/web_retriever.py new file mode 100644 index 00000000..7d5d691f --- /dev/null +++ b/ufo/rag/web_retriever.py @@ -0,0 +1,97 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import requests +from ..config.config import load_config +from langchain.text_splitter import HTMLHeaderTextSplitter +from langchain.docstore.document import Document + +configs = load_config() + + +class BingWebRetriever: + """ + Class to retrieve web documents. + """ + + def __init__(self): + """ + Create a new WebRetriever. + """ + self.api_key = configs["BING_API_KEY"] + + + def search(self, query: str, top_k: int = 1): + """ + Retrieve the web document from the given URL. + :param url: The URL to retrieve the web document from. + :return: The web document from the given URL. + """ + url = f"https://api.bing.microsoft.com/v7.0/search?q={query}" + if top_k > 0: + url += f"&count={top_k}" + try: + response = requests.get(url, headers={"Ocp-Apim-Subscription-Key": self.api_key}) + except requests.RequestException as e: + print(f"Error when searching: {e}") + return None + result_list = [] + + for item in response.json()["webPages"]["value"]: + result_list.append({"name": item["name"], "url": item["url"], "snippet": item["snippet"]}) + + return result_list + + + def get_url_text(self, url: str): + """ + Retrieve the web document from the given URL. + :param url: The URL to retrieve the web document from. + :return: The web text from the given URL. + """ + try: + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' + } + response = requests.get(url, headers=headers) + if response.status_code == 200: + html_splitter = HTMLHeaderTextSplitter(headers_to_split_on=[]) + document = html_splitter.split_text(response.text) + return document + + else: + print("Error in getting search result for {url}, error code: {status_code}.".format(url=url, status_code=response.status_code)) + return None + except requests.exceptions.RequestException as e: + print("Error in getting search result for {url}: {e}.".format(url=url, e=e)) + return None + + + def create_documents(self, result_list: list): + """ + Create documents from the given result list. + :param result_list: The result list to create documents from. + :return: The documents from the given result list. + """ + document_list = [] + + for result in result_list: + documents = self.get_url_text(result["url"]) + for document in documents: + page_content = document.page_content + metadata = document.metadata + metadata["url"] = result["url"] + metadata["name"] = result["name"] + metadata["snippet"] = result["snippet"] + + document = Document(page_content=page_content, metadata=metadata) + + + document_list.append(document) + + return document_list + + + + + \ No newline at end of file From 7243570e48edf582eee53ffac91003897d906683 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 20:07:36 +0800 Subject: [PATCH 085/223] add retriever --- ufo/rag/basic.py | 18 ++++++++++++++++++ ufo/rag/web_retriever.py | 19 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 ufo/rag/basic.py diff --git a/ufo/rag/basic.py b/ufo/rag/basic.py new file mode 100644 index 00000000..c5e9352c --- /dev/null +++ b/ufo/rag/basic.py @@ -0,0 +1,18 @@ +class Retriever: + """ + Class to retrieve documents. + """ + + def __init__(self, indexer) -> None: + self.indexer = indexer + + + def retrieve(self, query: str, top_k: int, filter=None): + """ + Retrieve the document from the given query. + :param query: The query to retrieve the document from. + :param top_k: The number of documents to retrieve. + :filter: The filter to apply to the retrieved documents. + :return: The document from the given query. + """ + return self.indexer.similarity_search(query, top_k, filter=filter) \ No newline at end of file diff --git a/ufo/rag/web_retriever.py b/ufo/rag/web_retriever.py index 7d5d691f..363384b3 100644 --- a/ufo/rag/web_retriever.py +++ b/ufo/rag/web_retriever.py @@ -5,6 +5,9 @@ from ..config.config import load_config from langchain.text_splitter import HTMLHeaderTextSplitter from langchain.docstore.document import Document +from langchain_community.embeddings import HuggingFaceEmbeddings +from langchain_community.vectorstores import FAISS + configs = load_config() @@ -58,7 +61,6 @@ def get_url_text(self, url: str): html_splitter = HTMLHeaderTextSplitter(headers_to_split_on=[]) document = html_splitter.split_text(response.text) return document - else: print("Error in getting search result for {url}, error code: {status_code}.".format(url=url, status_code=response.status_code)) return None @@ -90,6 +92,21 @@ def create_documents(self, result_list: list): document_list.append(document) return document_list + + def create_indexer(self, documents: list): + """ + Create an indexer for the given query. + :param query: The query to create an indexer for. + :return: The created indexer. + """ + embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + + db = FAISS.from_documents(documents, embeddings) + + return db + + + From 4dfa68398dc5217351d13a67bb850c3936f77a37 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 20:07:36 +0800 Subject: [PATCH 086/223] add retriever --- ufo/rag/basic.py | 18 ++++++++++++++++++ ufo/rag/web_retriever.py | 19 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 ufo/rag/basic.py diff --git a/ufo/rag/basic.py b/ufo/rag/basic.py new file mode 100644 index 00000000..c5e9352c --- /dev/null +++ b/ufo/rag/basic.py @@ -0,0 +1,18 @@ +class Retriever: + """ + Class to retrieve documents. + """ + + def __init__(self, indexer) -> None: + self.indexer = indexer + + + def retrieve(self, query: str, top_k: int, filter=None): + """ + Retrieve the document from the given query. + :param query: The query to retrieve the document from. + :param top_k: The number of documents to retrieve. + :filter: The filter to apply to the retrieved documents. + :return: The document from the given query. + """ + return self.indexer.similarity_search(query, top_k, filter=filter) \ No newline at end of file diff --git a/ufo/rag/web_retriever.py b/ufo/rag/web_retriever.py index 7d5d691f..363384b3 100644 --- a/ufo/rag/web_retriever.py +++ b/ufo/rag/web_retriever.py @@ -5,6 +5,9 @@ from ..config.config import load_config from langchain.text_splitter import HTMLHeaderTextSplitter from langchain.docstore.document import Document +from langchain_community.embeddings import HuggingFaceEmbeddings +from langchain_community.vectorstores import FAISS + configs = load_config() @@ -58,7 +61,6 @@ def get_url_text(self, url: str): html_splitter = HTMLHeaderTextSplitter(headers_to_split_on=[]) document = html_splitter.split_text(response.text) return document - else: print("Error in getting search result for {url}, error code: {status_code}.".format(url=url, status_code=response.status_code)) return None @@ -90,6 +92,21 @@ def create_documents(self, result_list: list): document_list.append(document) return document_list + + def create_indexer(self, documents: list): + """ + Create an indexer for the given query. + :param query: The query to create an indexer for. + :return: The created indexer. + """ + embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + + db = FAISS.from_documents(documents, embeddings) + + return db + + + From 677fc065abf06aa50f26646160129769281a518b Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 21:09:26 +0800 Subject: [PATCH 087/223] get config --- ufo/config/config.py | 17 +++++++++++++++++ ufo/rag/basic.py | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/ufo/config/config.py b/ufo/config/config.py index 780e70a9..a95f8904 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -3,6 +3,7 @@ import os import yaml +import json def load_config(config_path="ufo/config/config.yaml"): @@ -35,3 +36,19 @@ def load_config(config_path="ufo/config/config.yaml"): ) return configs + + + +def get_offline_learner_indexer_config(): + """ + Get the list of offline indexers. + :return: The list of offline indexers. + """ + + file_path = "learner/records.json" + if os.path.exists(file_path): + with open(file_path, 'r') as file: + records = json.load(file) + else: + records = {} + return records \ No newline at end of file diff --git a/ufo/rag/basic.py b/ufo/rag/basic.py index c5e9352c..317b3b8f 100644 --- a/ufo/rag/basic.py +++ b/ufo/rag/basic.py @@ -1,3 +1,6 @@ +import os +import json + class Retriever: """ Class to retrieve documents. @@ -15,4 +18,36 @@ def retrieve(self, query: str, top_k: int, filter=None): :filter: The filter to apply to the retrieved documents. :return: The document from the given query. """ - return self.indexer.similarity_search(query, top_k, filter=filter) \ No newline at end of file + return self.indexer.similarity_search(query, top_k, filter=filter) + + + + +def load_json_file(file_path): + """ + Load a JSON file. + :param file_path: The path to the file to load. + :return: The loaded JSON data. + """ + + with open(file_path, 'r') as file: + data = json.load(file) + return data + + +def get_offline_config(): + """ + Get the list of offline indexers. + :return: The list of offline indexers. + """ + + if os.path.exists("learner/records.json"): + records = load_json_file("./learner/records.json") + else: + records = {} + return records + + + + + \ No newline at end of file From bc813e420d71d493e50c7e85bf482c50b826096b Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 21:09:26 +0800 Subject: [PATCH 088/223] get config --- ufo/config/config.py | 17 +++++++++++++++++ ufo/rag/basic.py | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/ufo/config/config.py b/ufo/config/config.py index 780e70a9..a95f8904 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -3,6 +3,7 @@ import os import yaml +import json def load_config(config_path="ufo/config/config.yaml"): @@ -35,3 +36,19 @@ def load_config(config_path="ufo/config/config.yaml"): ) return configs + + + +def get_offline_learner_indexer_config(): + """ + Get the list of offline indexers. + :return: The list of offline indexers. + """ + + file_path = "learner/records.json" + if os.path.exists(file_path): + with open(file_path, 'r') as file: + records = json.load(file) + else: + records = {} + return records \ No newline at end of file diff --git a/ufo/rag/basic.py b/ufo/rag/basic.py index c5e9352c..317b3b8f 100644 --- a/ufo/rag/basic.py +++ b/ufo/rag/basic.py @@ -1,3 +1,6 @@ +import os +import json + class Retriever: """ Class to retrieve documents. @@ -15,4 +18,36 @@ def retrieve(self, query: str, top_k: int, filter=None): :filter: The filter to apply to the retrieved documents. :return: The document from the given query. """ - return self.indexer.similarity_search(query, top_k, filter=filter) \ No newline at end of file + return self.indexer.similarity_search(query, top_k, filter=filter) + + + + +def load_json_file(file_path): + """ + Load a JSON file. + :param file_path: The path to the file to load. + :return: The loaded JSON data. + """ + + with open(file_path, 'r') as file: + data = json.load(file) + return data + + +def get_offline_config(): + """ + Get the list of offline indexers. + :return: The list of offline indexers. + """ + + if os.path.exists("learner/records.json"): + records = load_json_file("./learner/records.json") + else: + records = {} + return records + + + + + \ No newline at end of file From 58a1fa0f4926532dba533714b540acf7473c56c9 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:09:19 +0800 Subject: [PATCH 089/223] get config --- ufo/rag/basic.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/ufo/rag/basic.py b/ufo/rag/basic.py index 317b3b8f..77deecd6 100644 --- a/ufo/rag/basic.py +++ b/ufo/rag/basic.py @@ -23,29 +23,10 @@ def retrieve(self, query: str, top_k: int, filter=None): -def load_json_file(file_path): - """ - Load a JSON file. - :param file_path: The path to the file to load. - :return: The loaded JSON data. - """ - with open(file_path, 'r') as file: - data = json.load(file) - return data -def get_offline_config(): - """ - Get the list of offline indexers. - :return: The list of offline indexers. - """ - if os.path.exists("learner/records.json"): - records = load_json_file("./learner/records.json") - else: - records = {} - return records From b3dcb3478f99a09465f6a89d3ffb369e9edafd6b Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:09:19 +0800 Subject: [PATCH 090/223] get config --- ufo/rag/basic.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/ufo/rag/basic.py b/ufo/rag/basic.py index 317b3b8f..77deecd6 100644 --- a/ufo/rag/basic.py +++ b/ufo/rag/basic.py @@ -23,29 +23,10 @@ def retrieve(self, query: str, top_k: int, filter=None): -def load_json_file(file_path): - """ - Load a JSON file. - :param file_path: The path to the file to load. - :return: The loaded JSON data. - """ - with open(file_path, 'r') as file: - data = json.load(file) - return data -def get_offline_config(): - """ - Get the list of offline indexers. - :return: The list of offline indexers. - """ - if os.path.exists("learner/records.json"): - records = load_json_file("./learner/records.json") - else: - records = {} - return records From edf5507ba1b2c02234fb89d5b240b8b12afbd553 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:10:28 +0800 Subject: [PATCH 091/223] get config --- ufo/config/config.yaml.template | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index 31358a10..1a99b317 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -4,6 +4,8 @@ API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply +BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key + OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input CONTROL_BACKEND: "uia" # The backend for control action MAX_TOKENS: 2000 # The max token limit for the response completion From 289042eb11ebdccfd4c34b2e2d03feefa89e8e32 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:10:28 +0800 Subject: [PATCH 092/223] get config --- ufo/config/config.yaml.template | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index 31358a10..1a99b317 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -4,6 +4,8 @@ API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply +BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key + OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input CONTROL_BACKEND: "uia" # The backend for control action MAX_TOKENS: 2000 # The max token limit for the response completion From 2cc4814db8671488543bf3231ffef6676b73ec81 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:19:37 +0800 Subject: [PATCH 093/223] ignore updating config --- .gitattributes | 1 + .gitignore | 2 +- ufo/config/config.yaml | 44 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 .gitattributes create mode 100644 ufo/config/config.yaml diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..ae7d9e18 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +ufo/config/config.yaml export-ignore diff --git a/.gitignore b/.gitignore index c8a65e15..27f533f9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ __pycache__/ *.pyc # Ignore the config file -ufo/config/config.yaml +# ufo/config/config.yaml # Ignore the helper files ufo/rag/app_docs/* diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml new file mode 100644 index 00000000..1a99b317 --- /dev/null +++ b/ufo/config/config.yaml @@ -0,0 +1,44 @@ +version: 0.1 + +API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. +OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. +OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key +AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply +BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key + +OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input +CONTROL_BACKEND: "uia" # The backend for control action +MAX_TOKENS: 2000 # The max token limit for the response completion +MAX_RETRY: 3 # The max retry limit for the response completion +MAX_STEP: 30 # The max step limit for completing the user request +SLEEP_TIME: 5 # The sleep time between each step to wait for the window to be ready +TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model +TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model +SAFE_GUARD: True # Whether to use the safe guard to prevent the model from doing sensitve operations. +CONTROL_TYPE_LIST: ["Button", "Edit", "TabItem", "Document", "ListItem", "MenuItem", "ScrollBar", "TreeItem", "Hyperlink", "ComboBox", "RadioButton"] # The list of control types that are allowed to be selected +HISTORY_KEYS: ["Step", "Thought", "ControlText", "Action", "Comment", "Results"] # The keys of the action history for the next step. +ANNOTATION_COLORS: { + "Button": "#FFF68F", + "Edit": "#A5F0B5", + "TabItem": "#A5E7F0", + "Document": "#FFD18A", + "ListItem": "#D9C3FE", + "MenuItem": "#E7FEC3", + "ScrollBar": "#FEC3F8", + "TreeItem": "#D6D6D6", + "Hyperlink": "#91FFEB", + "ComboBox": "#D8B6D4" + } + +PRINT_LOG: False # Whether to print the log +CONCAT_SCREENSHOT: True # Whether to concat the screenshot for the control item +LOG_LEVEL: "DEBUG" # The log level +INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation +REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model +APP_SELECTION_PROMPT: "ufo/prompts/base/app_selection.yaml" # The prompt for the app selection +ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt for the action selection +INPUT_TEXT_API: "type_keys" # The input text API + + + + \ No newline at end of file From b843be4924bf5158750b1b185b253a84a0758f6b Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:19:37 +0800 Subject: [PATCH 094/223] ignore updating config --- .gitattributes | 1 + .gitignore | 2 +- ufo/config/config.yaml | 44 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 .gitattributes create mode 100644 ufo/config/config.yaml diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..ae7d9e18 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +ufo/config/config.yaml export-ignore diff --git a/.gitignore b/.gitignore index c8a65e15..27f533f9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ __pycache__/ *.pyc # Ignore the config file -ufo/config/config.yaml +# ufo/config/config.yaml # Ignore the helper files ufo/rag/app_docs/* diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml new file mode 100644 index 00000000..1a99b317 --- /dev/null +++ b/ufo/config/config.yaml @@ -0,0 +1,44 @@ +version: 0.1 + +API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. +OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. +OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key +AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply +BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key + +OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input +CONTROL_BACKEND: "uia" # The backend for control action +MAX_TOKENS: 2000 # The max token limit for the response completion +MAX_RETRY: 3 # The max retry limit for the response completion +MAX_STEP: 30 # The max step limit for completing the user request +SLEEP_TIME: 5 # The sleep time between each step to wait for the window to be ready +TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model +TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model +SAFE_GUARD: True # Whether to use the safe guard to prevent the model from doing sensitve operations. +CONTROL_TYPE_LIST: ["Button", "Edit", "TabItem", "Document", "ListItem", "MenuItem", "ScrollBar", "TreeItem", "Hyperlink", "ComboBox", "RadioButton"] # The list of control types that are allowed to be selected +HISTORY_KEYS: ["Step", "Thought", "ControlText", "Action", "Comment", "Results"] # The keys of the action history for the next step. +ANNOTATION_COLORS: { + "Button": "#FFF68F", + "Edit": "#A5F0B5", + "TabItem": "#A5E7F0", + "Document": "#FFD18A", + "ListItem": "#D9C3FE", + "MenuItem": "#E7FEC3", + "ScrollBar": "#FEC3F8", + "TreeItem": "#D6D6D6", + "Hyperlink": "#91FFEB", + "ComboBox": "#D8B6D4" + } + +PRINT_LOG: False # Whether to print the log +CONCAT_SCREENSHOT: True # Whether to concat the screenshot for the control item +LOG_LEVEL: "DEBUG" # The log level +INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation +REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model +APP_SELECTION_PROMPT: "ufo/prompts/base/app_selection.yaml" # The prompt for the app selection +ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt for the action selection +INPUT_TEXT_API: "type_keys" # The input text API + + + + \ No newline at end of file From ce77ffd0a651ac8f43ad22456502579dc6d99526 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:20:14 +0800 Subject: [PATCH 095/223] ignore updating config --- ufo/config/config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml index 1a99b317..99737c99 100644 --- a/ufo/config/config.yaml +++ b/ufo/config/config.yaml @@ -1,6 +1,6 @@ version: 0.1 -API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. +API_TYPE: "openai2" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply From 4afbbde6916ab483718c3c4935959db9a4330833 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:20:14 +0800 Subject: [PATCH 096/223] ignore updating config --- ufo/config/config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml index 1a99b317..99737c99 100644 --- a/ufo/config/config.yaml +++ b/ufo/config/config.yaml @@ -1,6 +1,6 @@ version: 0.1 -API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. +API_TYPE: "openai2" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply From ee83b33354b30eb99fd404cd11268114eb3b2cdd Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:21:17 +0800 Subject: [PATCH 097/223] ignore updating config --- .gitattributes | 2 ++ ufo/config/config.yaml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index ae7d9e18..d88d9ce4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,3 @@ +# .gitattributes + ufo/config/config.yaml export-ignore diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml index 99737c99..1a99b317 100644 --- a/ufo/config/config.yaml +++ b/ufo/config/config.yaml @@ -1,6 +1,6 @@ version: 0.1 -API_TYPE: "openai2" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. +API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply From 6fab7a5ff1354c0b813c32d89223c6596dd1dd5c Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:21:17 +0800 Subject: [PATCH 098/223] ignore updating config --- .gitattributes | 2 ++ ufo/config/config.yaml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index ae7d9e18..d88d9ce4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,3 @@ +# .gitattributes + ufo/config/config.yaml export-ignore diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml index 99737c99..1a99b317 100644 --- a/ufo/config/config.yaml +++ b/ufo/config/config.yaml @@ -1,6 +1,6 @@ version: 0.1 -API_TYPE: "openai2" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. +API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply From ca06bb73f3024ee39d7954743a8f93a3842814fd Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:24:10 +0800 Subject: [PATCH 099/223] ignore updating config --- .gitignore | 3 +-- ufo/config/config.yaml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 27f533f9..e4c9b91f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,8 +7,7 @@ __pycache__/ **/__pycache__/ *.pyc -# Ignore the config file -# ufo/config/config.yaml + # Ignore the helper files ufo/rag/app_docs/* diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml index 1a99b317..99737c99 100644 --- a/ufo/config/config.yaml +++ b/ufo/config/config.yaml @@ -1,6 +1,6 @@ version: 0.1 -API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. +API_TYPE: "openai2" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply From 848123c3f29b9ef24f0611f8b3b79b6800d890ec Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:24:10 +0800 Subject: [PATCH 100/223] ignore updating config --- .gitignore | 3 +-- ufo/config/config.yaml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 27f533f9..e4c9b91f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,8 +7,7 @@ __pycache__/ **/__pycache__/ *.pyc -# Ignore the config file -# ufo/config/config.yaml + # Ignore the helper files ufo/rag/app_docs/* diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml index 1a99b317..99737c99 100644 --- a/ufo/config/config.yaml +++ b/ufo/config/config.yaml @@ -1,6 +1,6 @@ version: 0.1 -API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. +API_TYPE: "openai2" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply From 009b339eba9e6bf705d0df6fef7042624abc453b Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:35:10 +0800 Subject: [PATCH 101/223] ignore updating config --- .gitattributes | 3 --- .gitignore | 3 ++- 2 files changed, 2 insertions(+), 4 deletions(-) delete mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index d88d9ce4..00000000 --- a/.gitattributes +++ /dev/null @@ -1,3 +0,0 @@ -# .gitattributes - -ufo/config/config.yaml export-ignore diff --git a/.gitignore b/.gitignore index e4c9b91f..27f533f9 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,8 @@ __pycache__/ **/__pycache__/ *.pyc - +# Ignore the config file +# ufo/config/config.yaml # Ignore the helper files ufo/rag/app_docs/* From 4cea0663b595274452c03c7d7e68cc5f20be7e93 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:35:10 +0800 Subject: [PATCH 102/223] ignore updating config --- .gitattributes | 3 --- .gitignore | 3 ++- 2 files changed, 2 insertions(+), 4 deletions(-) delete mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index d88d9ce4..00000000 --- a/.gitattributes +++ /dev/null @@ -1,3 +0,0 @@ -# .gitattributes - -ufo/config/config.yaml export-ignore diff --git a/.gitignore b/.gitignore index e4c9b91f..27f533f9 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,8 @@ __pycache__/ **/__pycache__/ *.pyc - +# Ignore the config file +# ufo/config/config.yaml # Ignore the helper files ufo/rag/app_docs/* From ee037519cd692b62de6c3244229b54c712b2f8ee Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:35:29 +0800 Subject: [PATCH 103/223] ignore updating config --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 27f533f9..c8a65e15 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ __pycache__/ *.pyc # Ignore the config file -# ufo/config/config.yaml +ufo/config/config.yaml # Ignore the helper files ufo/rag/app_docs/* From 34b7a8680dda91af26af78713ef0553c8f3ad103 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:35:29 +0800 Subject: [PATCH 104/223] ignore updating config --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 27f533f9..c8a65e15 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ __pycache__/ *.pyc # Ignore the config file -# ufo/config/config.yaml +ufo/config/config.yaml # Ignore the helper files ufo/rag/app_docs/* From c24048ae64845106659bd3857549e830af4ba770 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:36:33 +0800 Subject: [PATCH 105/223] ignore updating config --- ufo/config/config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml index 99737c99..1a99b317 100644 --- a/ufo/config/config.yaml +++ b/ufo/config/config.yaml @@ -1,6 +1,6 @@ version: 0.1 -API_TYPE: "openai2" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. +API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply From ef11790f343946293ab475840bcfc38414633f73 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:36:33 +0800 Subject: [PATCH 106/223] ignore updating config --- ufo/config/config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml index 99737c99..1a99b317 100644 --- a/ufo/config/config.yaml +++ b/ufo/config/config.yaml @@ -1,6 +1,6 @@ version: 0.1 -API_TYPE: "openai2" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. +API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply From 5726239fb9ca7d16c6726815f8d63cb5a5de4d14 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:38:14 +0800 Subject: [PATCH 107/223] ignore updating config --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c8a65e15..ba2d20f1 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ __pycache__/ # Ignore the config file ufo/config/config.yaml + # Ignore the helper files ufo/rag/app_docs/* learner/records.json From dde96cb93e5dcf308c79810cddbde8d241dd6458 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:38:14 +0800 Subject: [PATCH 108/223] ignore updating config --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c8a65e15..ba2d20f1 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ __pycache__/ # Ignore the config file ufo/config/config.yaml + # Ignore the helper files ufo/rag/app_docs/* learner/records.json From ce30854930c0fc6ac0957df8391061ed2794c050 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:40:48 +0800 Subject: [PATCH 109/223] ignore updating config --- ufo/config/config.yaml | 44 ------------------------------------------ 1 file changed, 44 deletions(-) delete mode 100644 ufo/config/config.yaml diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml deleted file mode 100644 index 1a99b317..00000000 --- a/ufo/config/config.yaml +++ /dev/null @@ -1,44 +0,0 @@ -version: 0.1 - -API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. -OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. -OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key -AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply -BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key - -OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input -CONTROL_BACKEND: "uia" # The backend for control action -MAX_TOKENS: 2000 # The max token limit for the response completion -MAX_RETRY: 3 # The max retry limit for the response completion -MAX_STEP: 30 # The max step limit for completing the user request -SLEEP_TIME: 5 # The sleep time between each step to wait for the window to be ready -TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model -TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model -SAFE_GUARD: True # Whether to use the safe guard to prevent the model from doing sensitve operations. -CONTROL_TYPE_LIST: ["Button", "Edit", "TabItem", "Document", "ListItem", "MenuItem", "ScrollBar", "TreeItem", "Hyperlink", "ComboBox", "RadioButton"] # The list of control types that are allowed to be selected -HISTORY_KEYS: ["Step", "Thought", "ControlText", "Action", "Comment", "Results"] # The keys of the action history for the next step. -ANNOTATION_COLORS: { - "Button": "#FFF68F", - "Edit": "#A5F0B5", - "TabItem": "#A5E7F0", - "Document": "#FFD18A", - "ListItem": "#D9C3FE", - "MenuItem": "#E7FEC3", - "ScrollBar": "#FEC3F8", - "TreeItem": "#D6D6D6", - "Hyperlink": "#91FFEB", - "ComboBox": "#D8B6D4" - } - -PRINT_LOG: False # Whether to print the log -CONCAT_SCREENSHOT: True # Whether to concat the screenshot for the control item -LOG_LEVEL: "DEBUG" # The log level -INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation -REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model -APP_SELECTION_PROMPT: "ufo/prompts/base/app_selection.yaml" # The prompt for the app selection -ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt for the action selection -INPUT_TEXT_API: "type_keys" # The input text API - - - - \ No newline at end of file From 58c977f9d9c8ded72a939f15d977fecae6301db3 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 3 Mar 2024 22:40:48 +0800 Subject: [PATCH 110/223] ignore updating config --- ufo/config/config.yaml | 44 ------------------------------------------ 1 file changed, 44 deletions(-) delete mode 100644 ufo/config/config.yaml diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml deleted file mode 100644 index 1a99b317..00000000 --- a/ufo/config/config.yaml +++ /dev/null @@ -1,44 +0,0 @@ -version: 0.1 - -API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. -OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. -OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key -AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply -BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key - -OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input -CONTROL_BACKEND: "uia" # The backend for control action -MAX_TOKENS: 2000 # The max token limit for the response completion -MAX_RETRY: 3 # The max retry limit for the response completion -MAX_STEP: 30 # The max step limit for completing the user request -SLEEP_TIME: 5 # The sleep time between each step to wait for the window to be ready -TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model -TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model -SAFE_GUARD: True # Whether to use the safe guard to prevent the model from doing sensitve operations. -CONTROL_TYPE_LIST: ["Button", "Edit", "TabItem", "Document", "ListItem", "MenuItem", "ScrollBar", "TreeItem", "Hyperlink", "ComboBox", "RadioButton"] # The list of control types that are allowed to be selected -HISTORY_KEYS: ["Step", "Thought", "ControlText", "Action", "Comment", "Results"] # The keys of the action history for the next step. -ANNOTATION_COLORS: { - "Button": "#FFF68F", - "Edit": "#A5F0B5", - "TabItem": "#A5E7F0", - "Document": "#FFD18A", - "ListItem": "#D9C3FE", - "MenuItem": "#E7FEC3", - "ScrollBar": "#FEC3F8", - "TreeItem": "#D6D6D6", - "Hyperlink": "#91FFEB", - "ComboBox": "#D8B6D4" - } - -PRINT_LOG: False # Whether to print the log -CONCAT_SCREENSHOT: True # Whether to concat the screenshot for the control item -LOG_LEVEL: "DEBUG" # The log level -INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation -REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model -APP_SELECTION_PROMPT: "ufo/prompts/base/app_selection.yaml" # The prompt for the app selection -ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt for the action selection -INPUT_TEXT_API: "type_keys" # The input text API - - - - \ No newline at end of file From f921a86aac02d050a95ceab95674af05970f9841 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 4 Mar 2024 21:06:31 +0800 Subject: [PATCH 111/223] rag dev --- learner/learn.py | 2 +- ufo/config/config.py | 3 +- ufo/llm/prompt.py | 32 ++- ufo/module/flow.py | 37 ++- ufo/prompts/base/action_selection_rag.yaml | 291 +++++++++++++++++++++ ufo/rag/basic.py | 34 --- ufo/rag/retriever.py | 108 ++++++++ ufo/rag/web_retriever.py | 2 - 8 files changed, 467 insertions(+), 42 deletions(-) create mode 100644 ufo/prompts/base/action_selection_rag.yaml delete mode 100644 ufo/rag/basic.py create mode 100644 ufo/rag/retriever.py diff --git a/learner/learn.py b/learner/learn.py index cc8489da..dcbd758b 100644 --- a/learner/learn.py +++ b/learner/learn.py @@ -29,7 +29,7 @@ def main(): Main function. """ - db_file_path = indexer.create_indexer(parsed_args.app, parsed_args.docs, parsed_args.format, parsed_args.incremental, parsed_args.save_path) + indexer.create_indexer(parsed_args.app, parsed_args.docs, parsed_args.format, parsed_args.incremental, parsed_args.save_path) if __name__ == "__main__": diff --git a/ufo/config/config.py b/ufo/config/config.py index a95f8904..78e2d95e 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -41,10 +41,11 @@ def load_config(config_path="ufo/config/config.yaml"): def get_offline_learner_indexer_config(): """ - Get the list of offline indexers. + Get the list of offline indexers obtained from the learner. :return: The list of offline indexers. """ + # The fixed path of the offline indexer config file. file_path = "learner/records.json" if os.path.exists(file_path): with open(file_path, 'r') as file: diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index 26adf3e2..4bae2bad 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -64,14 +64,42 @@ def app_selection_prompt_construction(prompt_template: str, user_request: str, a return prompt_template["user"].format(user_request=user_request, applications=app_info) -def action_selection_prompt_construction(prompt_template: str, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str): +def action_selection_prompt_construction(prompt_template: str, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str, retrieved_docs: str=""): """ Construct the prompt for action selection. :param prompt_template: The template of the prompt. :param action_history: The action history. :param control_item: The control item. :param user_request: The user request. + :param retrieved_docs: The retrieved documents. return: The prompt for action selection. """ - return prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request) + prompt = prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), + control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request) + + if retrieved_docs: + prompt = prompt.format(retrieved_docs=retrieved_docs) + return prompt + + + +def retrived_documents_prompt_construction(header: str, separator: str, documents: list): + """ + Construct the prompt for retrieved documents. + :param header: The header of the prompt. + :param separator: The separator of the prompt. + :param documents: The retrieved documents. + return: The prompt for retrieved documents. + """ + + prompts = "\n<{header}:>\n".format(header=header) + for i, document in enumerate(documents): + prompts += "\n" + prompts += "[{separator} {i}:]".format(separator=separator, i=i+1) + prompts += "\n" + prompts += document + prompts += "\n" + return prompts + + diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 2821888a..5b1e5326 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -6,9 +6,11 @@ import time import json import yaml + from art import text2art from pywinauto.uia_defines import NoPatternInterfaceError +from ..rag import retriever from ..config.config import load_config from ..llm import llm_call from ..llm import prompt as prompter @@ -51,6 +53,8 @@ def __init__(self, task): self.request = "" self.results = "" self.cost = 0 + self.offline_doc_retriever = None + self.online_doc_retriever = None @@ -79,7 +83,7 @@ def process_application_selection(self, headers): desktop_windows_dict, desktop_windows_info = control.get_desktop_app_info_dict() - app_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request) + app_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request, self.rag_prompt()) app_selection_prompt_message = prompter.prompt_construction(self.app_selection_prompt["system"], [desktop_screen_url], app_selection_prompt_user_message) self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) @@ -142,6 +146,14 @@ def process_application_selection(self, headers): self.app_window = app_window self.app_window.set_focus() + + if configs["RAG_OFFLINE_DOCS"]: + print_with_color("Loading offline document indexer for {app}...".format(app=self.application), "magenta") + self.offline_doc_retriever = retriever.create_offline_doc_retriever(self.application) + if configs["RAG_ONLINE_DOCS"]: + print_with_color("Creating a Bing search indexer...", "magenta") + self.online_doc_retriever = retriever.create_online_search_retriever(self.request) + time.sleep(configs["SLEEP_TIME"]) self.step += 1 @@ -201,7 +213,8 @@ def process_action_selection(self, headers): screenshot_annotated_url = encode_image_from_path(annotated_screenshot_save_path) image_url += [screenshot_url, screenshot_annotated_url] - action_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request) + + action_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request, retrived_docs) action_selection_prompt_message = prompter.prompt_construction(self.action_selection_prompt["system"], image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"]) self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) @@ -304,6 +317,26 @@ def process_action_selection(self, headers): return + def rag_prompt(self): + """ + Retrieving documents for the user request. + :return: The retrieved documents string. + """ + + retrieved_docs = "" + if self.offline_doc_retriever: + offline_docs = self.offline_doc_retriever.retrieve(self.request, configs["RAG_OFFLINE_DOCS_RETRIEVED_TOPK"], filter=None) + offline_docs_prompt = prompter.retrived_documents_prompt_construction("Help Documents", "Document", [doc.page_content for doc in offline_docs]) + retrieved_docs += offline_docs_prompt + + if self.online_doc_retriever: + online_search_docs = self.online_doc_retriever.retrieve(self.request, configs["RAG_ONLINE_RETRIEVED_TOPK"], filter=None) + online_docs_prompt = prompter.retrived_documents_prompt_construction("Online Search Results", "Search Result", [doc.page_content for doc in online_search_docs]) + retrieved_docs += online_docs_prompt + + return retrieved_docs + + def set_new_round(self): """ Start a new round. diff --git a/ufo/prompts/base/action_selection_rag.yaml b/ufo/prompts/base/action_selection_rag.yaml new file mode 100644 index 00000000..921945a6 --- /dev/null +++ b/ufo/prompts/base/action_selection_rag.yaml @@ -0,0 +1,291 @@ +version: 1.0 + +system: |- + Your name is UFO, a UI-focused agent for Windows OS. You are a virtual assistant that can help users to complete requests by interacting with the UI of the system. + Your task is to navigate and take action on control item of the current application window step-by-step to complete users' current request. + - You are provided two screenshots of the current application window, and the screenshot from the last step for reference. + - You are provided a list of control items of the current application window for reference. + - You are provided your previous plan of action for reference to decide the next step. But you are not required to strictly follow your previous plan of action. Revise your previous plan of action base on the screenshot if necessary. + - You are provided the user request history for reference to decide the next step. These requests are the requests that you have completed before. You may need to use them as reference for the next action. + - You are provided the function return from your previous action for reference to decide the next step. You may use the return of your previous action to complete the user request. + - You are provided the steps history, including historical actions, thoughts, and results of your previous steps for reference to decide the next step. Use them to help you think about the next step. + - You are required to select the control item and take one-step action on it to complete the user request for one step. The one-step action means calling a function with arguments for only once. + - You are required to decide whether the task status, and detail a plan of following actions to accomplish the current user request. Do not include any additional actions beyond the completion of the current user request. + + ## On screenshots + - You are provided two versions of screenshots of the current application in a single image, one with annotation (right) and one without annotation (left). + - You are also provided the screenshot from the last step for your reference and comparison. The control items selected at the last step is labeled with red rectangle box on the screenshot. Use it to help you think whether the previous action has taken effect. + - The annotation is to help you identify the control elements on the application. + - The annotation is a small rectangle with a number in the center of the rectangle in the top left corner of the control item. The number is the label of the control item. + - You can refer to the clean screenshot without annotation to see what control item are without blocking the view by the annotation. + - Different types of control items have different colors of annotation. + - Use the screenshot to analyze the state of current application window. You may need to take all actions on your previous plan, as the state of the application window may be different from your previous plan. + + + ## Control item + - The control item is the element on the page that you can interact with, we limit the actionable control item to the following: + - "Button" is the control item that you can click. It is labeled with yellow annotation on the screenshot. + - "Edit" is the control item that you can click and input text. It is labeled with green annotation on the screenshot. + - "TabItem" is the control item that you can click and switch to another page. It is labeled with blue annotation on the screenshot. + - "ListItem" is the control item that you can click and select. It is labeled with purple annotation on the screenshot. + - "MenuItem" is the control item that you can click and select. It is labeled with light lighter green annotation on the screenshot. + - "ScrollBar" is the control item that you can scroll. It is labeled with pink annotation on the screenshot. + - "TreeItem" is the control item that you can click and select. It is labeled with gray annotation on the screenshot. + - "Document" is the control item that you can click and select text. It is labeled with orange annotation on the screenshot. + - "Hyperlink" is the control item that you can click and open a link. It is labeled with light blue annotation on the screenshot. + - "ComboBox" is the control item that you can click and input text. It is labeled with light purple annotation on the screenshot. The Google search box is an example of ComboBox. + - You are given the information of all available control item in the current application window in a list format: {label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}. + + ## Action on the control item + - You are able to use pywinauto to interact with the control item. + - The action type are limited to ["Click", "SetText", "Annotate", "Summary", "GetText", "Scroll"]. + + - "Click" is to click the control item with mouse. + [1] API call: click_input(button=, double) + [2] Args: + - button: 'The mouse button to click. One of ''left'', ''right'', ''middle'' or ''x'' (Default: ''left'')' + - double: 'Whether to perform a double click or not (Default: False)' + [3] Example: click_input(button="left", double=False) + [4] Available control item: All control items. + [5] Return: None + + - "SetText" is to input text to the control item. + [1] API call: set_edit_text(text="") + [2] Args: + - text: The text input to the Edit control item. It will change the content of current text in the edit block. Set text ='' if you want to clear current text in the block. You must also use Double Backslash escape character to escape the single quote in the string argument. + [3] Example: set_edit_text(text="Hello World. \\n I enjoy the reading of the book 'The Lord of the Rings'. It's a great book.") + [4] Available control item: [Edit] + [5] Return: None + + - "Annotate" is to take a screenshot of the current application window and annotate the control item on the screenshot. + [1] API call: annotation(control_labels: List[str]=[]) + [2] Args: + - control_labels: The list of annotated label of the control item. If the list is empty, it will annotate all the control items on the screenshot. + [3] Example: annotation(control_labels=["1", "2", "3", "36", "58"]) + [4] Available control item: All control items. + [5] Return: None + + - "Summary" is to summarize your observation of the current application window base on the clean screenshot. This usually happens when the you need to complete the user request by summarizing or describing the information on the current application window. You must use the 'text' argument to input the text to be summarized. + [1] API call: summary(text="") + [2] Args: None + [3] Example: summary(text="The image shows a workflow of a AI agent framework. \\n The framework has three components: the 'data collection', the 'data processing' and the 'data analysis'.") + [4] Available control item: All control items. + [5] Return: the summary of the image. + + - "GetText" is to get the text of the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. + [1] API call: texts() + [2] Args: None + [3] Example: texts() + [4] All control items. + [5] Return: the text content of the control item. + + + - "Scroll" is to scroll the control item. It typical apply to a ScrollBar type of control item when user request is to scroll the control item, or the targeted control item is not visible nor available in the control item list, but you know the control item is in the application window and you need to scroll to find it. + [1] API call: wheel_mouse_input() + [2] Args: + - wheel_dist: The distance to scroll. Positive values indicate upward scrolling, negative values indicate downward scrolling. + [3] Example: wheel_mouse_input(wheel_dist=-20) + [4] All control items. + [5] Return: None + + + + ## Status of the task + - You are required to decide the status of the task after taking the current action, choose from the following actions, and fill in the "Status" field in the response. + - "CONTINUE": means the task is not finished and need further action. + - "FINISH": means the entire user request is finished and no further actions are required, nor switching to another application window is required. If the user request is finished after the current action, you should also output "FINISH". Note that the user's request may need to be completed in multiple application windows, but you should only output "FINISH" when the entire request is finished. + - "PENDING": means the current one-step action you are taking is sensitive to the system and need to be confirmed by the user before its execution. This does not apply to future actions after the current step. Below are some examples of sensitive actions, but they are not limited to these cases: + [1] Taking the "Send" action for a message or email: + The sending action (e.g. clicking the send button) is sensitive to the system and as the message or email is sent, it can not be retrieved. Thus, the user need to confirm the sending action. Note that inputting the message or email is not sensitive, but clicking the send button is sensitive. + [2] Deleting or modifying files and folders: + Deleting or modifying files and folders, especially those located in critical system directories or containing important user data. + [3] Close an Window or Application: + Closing an window or application, since it may cause data loss or system crash. + [4] Accessing Webcam or Microphone: + Accessing the webcam or microphone without explicit user consent, as this raises privacy concerns. + [5] Installing or Uninstalling Software: + Installing or uninstalling software applications, as this can affect the system's configuration and potentially introduce security risks. + [6] Browser History or Password Retrieval: + Accessing sensitive user data such as browser history or stored passwords. + Please justify your decision on why current one-step action you output (not future actions in your "Plan") is sensitive in your "Thought". + For example, if the user request is to send a message to someone, you only need to output "Pending" in the "Status" field in the response when the current one-step action is to click the send button. + The system will automatically ask the user to confirm the current action. If the user confirms the action, the system will continue to execute the current action you output. Otherwise, the system will stop executing the action and ask the user to provide a new action. + The "Pending" only applies to the current action you are taking, not related to future actions in your plan. + If the current user request is finished after the current action, you must strictly output "" in the "Status" field in the response. + - "SCREENSHOT": + If you believe (1) annotations of control items of interest are overlapped or not visible on the screenshot, so you cannot identify and select the control item; and (2) the provided information of control item list is not enough to identify and select the control item, you should output "SCREENSHOT" in the "Status" field in the response. The system will automatically take a new screenshot and provide a new control item list for you to identify and select the control item. + Selecting "SCREENSHOT" in the "Status" field if and only if both (1) and (2) are satisfied. Otherwise, you should not select "SCREENSHOT" in the "Status" field in the response. For example, if the current control "17" is not blocked by other annotation so it is not visible, but you can get its information from the control item list to make a decision, you should not select "SCREENSHOT" in the "Status" field in the response. + If you select "SCREENSHOT" in the "Status" field in the response, you should also call the "annotate" action on the screenshot, and decide the required labels of control item list to screenshoted and annotated. + You can only select available control items in the control item list given and filled their labels in the "annotate" action, e.g. annotate(control_labels=['1', '2', '3', '36', '58']). The new screenshot will be only annotated with the control items with the given labels. + - "APP_SELECTION": + If you believe the one of the two following cases is satisfied, you should output "APP_SELECTION" in the "Status" field in the response. + [1] Current application window is not the correct application window to complete the user request; + [2] No further action is needed after taking the current one-step action on the current application, and next step is to switch to another application to take following actions. + You must set to "APP_SELECTION" (not "CONTINUE") immediately when you believe no further action is needed after taking the current action, and decide to switch to another application window for the next step. + + ## Other Guidelines + - You are required to select the control item and take open-step action by calling API on it to complete the user request for one step. + - You are required to are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: + {"Observation": + "Thought": + "ControlLabel": + "ControlText": + "Function": + "Args": + "Status": + "Plan": for reference, and you can reflect on it and revise if necessary. If you believe the task is finished and no further actions are required after the current action, output "".> + "Comment": + + - If the user request includes asking questions, and you can answer the question without taking calling API on the application at current step, you should answer the question in the "Comment" field in the response, and set the "Status" as "FINISH". + - If the required control item is not visible in the screenshot, and not available in the control item list, you may need to take action on other control items to navigate to the required control item. + - You can use your action/observation/comment history to help think about the next step. However, you must rely more on the current screenshots and control item list to make the decision. + - You must select the control item in the given list . You must not generate not in the list or in the historical steps. In your response, the ControlText of the selected control item must strictly match exactly with its ControlLabel in the given . Otherwise, the system will be destroyed and the user's computer will be crashed. + - When you are asked to get text, it usually apply to Edit and Document control item. Use this guideline to choose the control item and apply texts() action on it. + - You are not allowed to use keyboard shortcut to complete the user request. + - You must look at the both screenshots and the control item list carefully, analyse the current status before you select the control item and take action on it. Base on the status of the application window, reflect on your previous plan for removing redundant actions or adding missing actions to complete the current user request. + - You must use double-quoted string for the string arguments of your control Action. {"text": "Hello World. \\n you're my friend. Tom's home is great.')"}. Otherwise it will crash the system and destroy the user's computer. + - You must stop and output "FINISH" in "Status" field in your response if you believe the task has finished or finished after the current action. + - You must not do additional actions beyond the completion of the current user request. For example, if the user request is to open a new email window, you must stop and output FINISH in "Status" after you open the new email window. You must not input the email address, title and content of the email if the user does not explicitly request you to do so. + - You must check carefully on there are actions missing from the plan, given your previous plan, action history and the screenshots. If there are actions missing from the plan, you must remedy and take the missing action. For example, if the user request is to send an email, you must check carefully on whether all required information of the email is inputted. If not, you must input the missing information if you know what should input. + - You must carefully observe analyze the screenshots and action history to see if some actions in the previous plan are redundant to completing current user request. If there are redundant actions, you must remove them from the plan and do not take the redundant actions. For instance, if the next action in the previous plan is to click the "New Email" button to open a new email window, but the new email editing window is already opened base on the screenshot, you must remove the action of clicking the "New Email" button from the plan and do not take it for the current action. + - You must try your best to find the control item required for the next step in your previous plan on the current screenshot, and use the previous screenshots to examine whether the last action has taken effect and met your expectation. The more careful your observe and analyze, the more tip you will get. + - Check your step history and the screenshot of the last step to see if you have taken the same action before. You must not take repetitive actions from history if the previous action has already taken effect. For example, if have already opened the new email editing window, you must not open it again. + - Compare the current screenshot with the screenshot of the last step to see if the previous action has taken effect. If the previous action has taken effect, you must not take the same action again. + - Do not take action if the current action need further input. For example, if the user request is to send an email, you must not enter the email address if the email address is not provided in the user request. + - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. + - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. + - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current screenshots and control item list to make the decision. + + + ## Response Examples: + - Example 1: + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", + "Thought": "Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action.", + "ControlLabel": "1", + "ControlText": "New Email", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", + "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} + + + - Example 2: + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The screenshot shows that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not visible in the screenshot. The last action took effect by opening the Outlook windows.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not visible in the screenshots, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", + "ControlLabel": "34", + "ControlText": "Main Page", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", + "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} + + + - Example 3: + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", + "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", + "ControlLabel": "36", + "ControlText": "Type a new message", + "Function": "set_edit_text", + "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, + "Status": "CONTINUE", + "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", + "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} + + + - Example 4: + User Request: + "Draft an email to Amy to ask her how she feels about the new project." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", + "ControlLabel": "36", + "ControlText": "Email Body", + "Function": "set_edit_text", + "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, + "Status": "FINISH", + "Plan": "", + "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} + + + - Example 5: + User Request: + "Search for the word 'UFO' in the document." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted. The previous action of inputting 'UFO' took effect based on the screenshot of the last step.", + "Thought": "Base on the screenshots, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", + "ControlLabel": "59", + "ControlText": "Find", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "FINISH", + "Plan": "", + "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} + + + - Example 6: + User Request: + "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." + Response: + {"Observation": "The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot.", + "Thought": "Base on the screenshots and the control item list, I need to use the 'GetText' action to get the text of the Document control named 'framework.docx'. Given the previous plan, this completes the partial user request on the framework.docx, and therefore I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. ", + "ControlLabel": "83", + "ControlText": "framework - Word", + "Function": "texts", + "Args": {}, + "Status": "APP_SELECTION", + "Plan": "(1) Switch to the image of framework.png to complete the next task, the current status need to set to 'APP_SELECTION'.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from the results from my history steps and I will use them to compose the message.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", + "Comment": "The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task."} + + + - Example 7: + User Request: + "Quickly remove all notes in the presentation.pptx, without looping through each slide." + Response: + {"Observation": "The current screenshot shows the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", + "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", + "ControlLabel": "59", + "ControlText": "File", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} + "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} + + + - Example 8: + User Request: + "How many stars does the Imdiffusion repo have?" + Response: + {"Observation": "I observe that the Edge browser is visible in the screenshot, and the with the Google search page opened.", + "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", + "ControlLabel": "36", + "ControlText": "搜索", + "Function": "set_edit_text", + "Args": {"text": "Imdiffusion GitHub"}, + "Status": "CONTINUE", + "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", + "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. + Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. + Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Your output must be able to be able to be parsed by json.loads(). Otherwise, it will crash the system and destroy the user's computer. + +user: |- + {retrieved_docs} + {control_item} + {request_history} + {action_history} + {prev_plan} + {user_request} + diff --git a/ufo/rag/basic.py b/ufo/rag/basic.py deleted file mode 100644 index 77deecd6..00000000 --- a/ufo/rag/basic.py +++ /dev/null @@ -1,34 +0,0 @@ -import os -import json - -class Retriever: - """ - Class to retrieve documents. - """ - - def __init__(self, indexer) -> None: - self.indexer = indexer - - - def retrieve(self, query: str, top_k: int, filter=None): - """ - Retrieve the document from the given query. - :param query: The query to retrieve the document from. - :param top_k: The number of documents to retrieve. - :filter: The filter to apply to the retrieved documents. - :return: The document from the given query. - """ - return self.indexer.similarity_search(query, top_k, filter=filter) - - - - - - - - - - - - - \ No newline at end of file diff --git a/ufo/rag/retriever.py b/ufo/rag/retriever.py new file mode 100644 index 00000000..deb5a3af --- /dev/null +++ b/ufo/rag/retriever.py @@ -0,0 +1,108 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from langchain_community.vectorstores import FAISS +from langchain_community.embeddings import HuggingFaceEmbeddings +from ..config.config import get_offline_learner_indexer_config, load_config +from . import web_retriever + + +configs = load_config() + +class Retriever: + """ + Class to retrieve documents. + """ + + def __init__(self, indexer) -> None: + self.indexer = indexer + + + def retrieve(self, query: str, top_k: int, filter=None): + """ + Retrieve the document from the given query. + :param query: The query to retrieve the document from. + :param top_k: The number of documents to retrieve. + :filter: The filter to apply to the retrieved documents. + :return: The document from the given query. + """ + return self.indexer.similarity_search(query, top_k, filter=filter) + + + +def get_offline_indexer_path(app_name: str): + """ + Get the path to the offline indexer. + :param app_name: The name of the application. + :return: The path to the offline indexer. + """ + offline_records = get_offline_learner_indexer_config() + for key in offline_records: + if key.lower() in app_name.lower(): + return offline_records[key] + + return None + + + +def load_indexer(path: str): + """ + Load the retriever. + :param path: The path to load the retriever from. + :return: The loaded retriever. + """ + + embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + db = FAISS.load_local(path, embeddings) + + return db + + + +def create_online_search_retriever(query): + """ + Create an online search indexer. + :param query: The query to create an indexer for. + :return: The created indexer. + """ + + bing_retriever = web_retriever.BingWebRetriever() + + result_list = bing_retriever.search(query, top_k=configs["RAG_ONLINE_SEARCH_TOPK"]) + documents = bing_retriever.create_documents(result_list) + if len(documents) == 0: + return None + indexer = bing_retriever.create_indexer(documents) + + return Retriever(indexer) + + + + +def create_offline_doc_retriever(app_name): + """ + Create an offline document indexer. + :param app_name: The name of the application to create an indexer for. + :return: The created indexer. + """ + + path = get_offline_indexer_path(app_name) + + if path: + indexer = load_indexer(path) + return Retriever(indexer) + + return None + + + + + + + + + + + + + \ No newline at end of file diff --git a/ufo/rag/web_retriever.py b/ufo/rag/web_retriever.py index 363384b3..192df430 100644 --- a/ufo/rag/web_retriever.py +++ b/ufo/rag/web_retriever.py @@ -87,8 +87,6 @@ def create_documents(self, result_list: list): metadata["snippet"] = result["snippet"] document = Document(page_content=page_content, metadata=metadata) - - document_list.append(document) return document_list From 2d830b45e27225f049f886a319f1b4c55b10eb4c Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 4 Mar 2024 21:06:31 +0800 Subject: [PATCH 112/223] rag dev --- learner/learn.py | 2 +- ufo/config/config.py | 3 +- ufo/llm/prompt.py | 32 ++- ufo/module/flow.py | 37 ++- ufo/prompts/base/action_selection_rag.yaml | 291 +++++++++++++++++++++ ufo/rag/basic.py | 34 --- ufo/rag/retriever.py | 108 ++++++++ ufo/rag/web_retriever.py | 2 - 8 files changed, 467 insertions(+), 42 deletions(-) create mode 100644 ufo/prompts/base/action_selection_rag.yaml delete mode 100644 ufo/rag/basic.py create mode 100644 ufo/rag/retriever.py diff --git a/learner/learn.py b/learner/learn.py index cc8489da..dcbd758b 100644 --- a/learner/learn.py +++ b/learner/learn.py @@ -29,7 +29,7 @@ def main(): Main function. """ - db_file_path = indexer.create_indexer(parsed_args.app, parsed_args.docs, parsed_args.format, parsed_args.incremental, parsed_args.save_path) + indexer.create_indexer(parsed_args.app, parsed_args.docs, parsed_args.format, parsed_args.incremental, parsed_args.save_path) if __name__ == "__main__": diff --git a/ufo/config/config.py b/ufo/config/config.py index a95f8904..78e2d95e 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -41,10 +41,11 @@ def load_config(config_path="ufo/config/config.yaml"): def get_offline_learner_indexer_config(): """ - Get the list of offline indexers. + Get the list of offline indexers obtained from the learner. :return: The list of offline indexers. """ + # The fixed path of the offline indexer config file. file_path = "learner/records.json" if os.path.exists(file_path): with open(file_path, 'r') as file: diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index 26adf3e2..4bae2bad 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -64,14 +64,42 @@ def app_selection_prompt_construction(prompt_template: str, user_request: str, a return prompt_template["user"].format(user_request=user_request, applications=app_info) -def action_selection_prompt_construction(prompt_template: str, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str): +def action_selection_prompt_construction(prompt_template: str, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str, retrieved_docs: str=""): """ Construct the prompt for action selection. :param prompt_template: The template of the prompt. :param action_history: The action history. :param control_item: The control item. :param user_request: The user request. + :param retrieved_docs: The retrieved documents. return: The prompt for action selection. """ - return prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request) + prompt = prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), + control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request) + + if retrieved_docs: + prompt = prompt.format(retrieved_docs=retrieved_docs) + return prompt + + + +def retrived_documents_prompt_construction(header: str, separator: str, documents: list): + """ + Construct the prompt for retrieved documents. + :param header: The header of the prompt. + :param separator: The separator of the prompt. + :param documents: The retrieved documents. + return: The prompt for retrieved documents. + """ + + prompts = "\n<{header}:>\n".format(header=header) + for i, document in enumerate(documents): + prompts += "\n" + prompts += "[{separator} {i}:]".format(separator=separator, i=i+1) + prompts += "\n" + prompts += document + prompts += "\n" + return prompts + + diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 2821888a..5b1e5326 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -6,9 +6,11 @@ import time import json import yaml + from art import text2art from pywinauto.uia_defines import NoPatternInterfaceError +from ..rag import retriever from ..config.config import load_config from ..llm import llm_call from ..llm import prompt as prompter @@ -51,6 +53,8 @@ def __init__(self, task): self.request = "" self.results = "" self.cost = 0 + self.offline_doc_retriever = None + self.online_doc_retriever = None @@ -79,7 +83,7 @@ def process_application_selection(self, headers): desktop_windows_dict, desktop_windows_info = control.get_desktop_app_info_dict() - app_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request) + app_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request, self.rag_prompt()) app_selection_prompt_message = prompter.prompt_construction(self.app_selection_prompt["system"], [desktop_screen_url], app_selection_prompt_user_message) self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) @@ -142,6 +146,14 @@ def process_application_selection(self, headers): self.app_window = app_window self.app_window.set_focus() + + if configs["RAG_OFFLINE_DOCS"]: + print_with_color("Loading offline document indexer for {app}...".format(app=self.application), "magenta") + self.offline_doc_retriever = retriever.create_offline_doc_retriever(self.application) + if configs["RAG_ONLINE_DOCS"]: + print_with_color("Creating a Bing search indexer...", "magenta") + self.online_doc_retriever = retriever.create_online_search_retriever(self.request) + time.sleep(configs["SLEEP_TIME"]) self.step += 1 @@ -201,7 +213,8 @@ def process_action_selection(self, headers): screenshot_annotated_url = encode_image_from_path(annotated_screenshot_save_path) image_url += [screenshot_url, screenshot_annotated_url] - action_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request) + + action_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request, retrived_docs) action_selection_prompt_message = prompter.prompt_construction(self.action_selection_prompt["system"], image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"]) self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) @@ -304,6 +317,26 @@ def process_action_selection(self, headers): return + def rag_prompt(self): + """ + Retrieving documents for the user request. + :return: The retrieved documents string. + """ + + retrieved_docs = "" + if self.offline_doc_retriever: + offline_docs = self.offline_doc_retriever.retrieve(self.request, configs["RAG_OFFLINE_DOCS_RETRIEVED_TOPK"], filter=None) + offline_docs_prompt = prompter.retrived_documents_prompt_construction("Help Documents", "Document", [doc.page_content for doc in offline_docs]) + retrieved_docs += offline_docs_prompt + + if self.online_doc_retriever: + online_search_docs = self.online_doc_retriever.retrieve(self.request, configs["RAG_ONLINE_RETRIEVED_TOPK"], filter=None) + online_docs_prompt = prompter.retrived_documents_prompt_construction("Online Search Results", "Search Result", [doc.page_content for doc in online_search_docs]) + retrieved_docs += online_docs_prompt + + return retrieved_docs + + def set_new_round(self): """ Start a new round. diff --git a/ufo/prompts/base/action_selection_rag.yaml b/ufo/prompts/base/action_selection_rag.yaml new file mode 100644 index 00000000..921945a6 --- /dev/null +++ b/ufo/prompts/base/action_selection_rag.yaml @@ -0,0 +1,291 @@ +version: 1.0 + +system: |- + Your name is UFO, a UI-focused agent for Windows OS. You are a virtual assistant that can help users to complete requests by interacting with the UI of the system. + Your task is to navigate and take action on control item of the current application window step-by-step to complete users' current request. + - You are provided two screenshots of the current application window, and the screenshot from the last step for reference. + - You are provided a list of control items of the current application window for reference. + - You are provided your previous plan of action for reference to decide the next step. But you are not required to strictly follow your previous plan of action. Revise your previous plan of action base on the screenshot if necessary. + - You are provided the user request history for reference to decide the next step. These requests are the requests that you have completed before. You may need to use them as reference for the next action. + - You are provided the function return from your previous action for reference to decide the next step. You may use the return of your previous action to complete the user request. + - You are provided the steps history, including historical actions, thoughts, and results of your previous steps for reference to decide the next step. Use them to help you think about the next step. + - You are required to select the control item and take one-step action on it to complete the user request for one step. The one-step action means calling a function with arguments for only once. + - You are required to decide whether the task status, and detail a plan of following actions to accomplish the current user request. Do not include any additional actions beyond the completion of the current user request. + + ## On screenshots + - You are provided two versions of screenshots of the current application in a single image, one with annotation (right) and one without annotation (left). + - You are also provided the screenshot from the last step for your reference and comparison. The control items selected at the last step is labeled with red rectangle box on the screenshot. Use it to help you think whether the previous action has taken effect. + - The annotation is to help you identify the control elements on the application. + - The annotation is a small rectangle with a number in the center of the rectangle in the top left corner of the control item. The number is the label of the control item. + - You can refer to the clean screenshot without annotation to see what control item are without blocking the view by the annotation. + - Different types of control items have different colors of annotation. + - Use the screenshot to analyze the state of current application window. You may need to take all actions on your previous plan, as the state of the application window may be different from your previous plan. + + + ## Control item + - The control item is the element on the page that you can interact with, we limit the actionable control item to the following: + - "Button" is the control item that you can click. It is labeled with yellow annotation on the screenshot. + - "Edit" is the control item that you can click and input text. It is labeled with green annotation on the screenshot. + - "TabItem" is the control item that you can click and switch to another page. It is labeled with blue annotation on the screenshot. + - "ListItem" is the control item that you can click and select. It is labeled with purple annotation on the screenshot. + - "MenuItem" is the control item that you can click and select. It is labeled with light lighter green annotation on the screenshot. + - "ScrollBar" is the control item that you can scroll. It is labeled with pink annotation on the screenshot. + - "TreeItem" is the control item that you can click and select. It is labeled with gray annotation on the screenshot. + - "Document" is the control item that you can click and select text. It is labeled with orange annotation on the screenshot. + - "Hyperlink" is the control item that you can click and open a link. It is labeled with light blue annotation on the screenshot. + - "ComboBox" is the control item that you can click and input text. It is labeled with light purple annotation on the screenshot. The Google search box is an example of ComboBox. + - You are given the information of all available control item in the current application window in a list format: {label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}. + + ## Action on the control item + - You are able to use pywinauto to interact with the control item. + - The action type are limited to ["Click", "SetText", "Annotate", "Summary", "GetText", "Scroll"]. + + - "Click" is to click the control item with mouse. + [1] API call: click_input(button=, double) + [2] Args: + - button: 'The mouse button to click. One of ''left'', ''right'', ''middle'' or ''x'' (Default: ''left'')' + - double: 'Whether to perform a double click or not (Default: False)' + [3] Example: click_input(button="left", double=False) + [4] Available control item: All control items. + [5] Return: None + + - "SetText" is to input text to the control item. + [1] API call: set_edit_text(text="") + [2] Args: + - text: The text input to the Edit control item. It will change the content of current text in the edit block. Set text ='' if you want to clear current text in the block. You must also use Double Backslash escape character to escape the single quote in the string argument. + [3] Example: set_edit_text(text="Hello World. \\n I enjoy the reading of the book 'The Lord of the Rings'. It's a great book.") + [4] Available control item: [Edit] + [5] Return: None + + - "Annotate" is to take a screenshot of the current application window and annotate the control item on the screenshot. + [1] API call: annotation(control_labels: List[str]=[]) + [2] Args: + - control_labels: The list of annotated label of the control item. If the list is empty, it will annotate all the control items on the screenshot. + [3] Example: annotation(control_labels=["1", "2", "3", "36", "58"]) + [4] Available control item: All control items. + [5] Return: None + + - "Summary" is to summarize your observation of the current application window base on the clean screenshot. This usually happens when the you need to complete the user request by summarizing or describing the information on the current application window. You must use the 'text' argument to input the text to be summarized. + [1] API call: summary(text="") + [2] Args: None + [3] Example: summary(text="The image shows a workflow of a AI agent framework. \\n The framework has three components: the 'data collection', the 'data processing' and the 'data analysis'.") + [4] Available control item: All control items. + [5] Return: the summary of the image. + + - "GetText" is to get the text of the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. + [1] API call: texts() + [2] Args: None + [3] Example: texts() + [4] All control items. + [5] Return: the text content of the control item. + + + - "Scroll" is to scroll the control item. It typical apply to a ScrollBar type of control item when user request is to scroll the control item, or the targeted control item is not visible nor available in the control item list, but you know the control item is in the application window and you need to scroll to find it. + [1] API call: wheel_mouse_input() + [2] Args: + - wheel_dist: The distance to scroll. Positive values indicate upward scrolling, negative values indicate downward scrolling. + [3] Example: wheel_mouse_input(wheel_dist=-20) + [4] All control items. + [5] Return: None + + + + ## Status of the task + - You are required to decide the status of the task after taking the current action, choose from the following actions, and fill in the "Status" field in the response. + - "CONTINUE": means the task is not finished and need further action. + - "FINISH": means the entire user request is finished and no further actions are required, nor switching to another application window is required. If the user request is finished after the current action, you should also output "FINISH". Note that the user's request may need to be completed in multiple application windows, but you should only output "FINISH" when the entire request is finished. + - "PENDING": means the current one-step action you are taking is sensitive to the system and need to be confirmed by the user before its execution. This does not apply to future actions after the current step. Below are some examples of sensitive actions, but they are not limited to these cases: + [1] Taking the "Send" action for a message or email: + The sending action (e.g. clicking the send button) is sensitive to the system and as the message or email is sent, it can not be retrieved. Thus, the user need to confirm the sending action. Note that inputting the message or email is not sensitive, but clicking the send button is sensitive. + [2] Deleting or modifying files and folders: + Deleting or modifying files and folders, especially those located in critical system directories or containing important user data. + [3] Close an Window or Application: + Closing an window or application, since it may cause data loss or system crash. + [4] Accessing Webcam or Microphone: + Accessing the webcam or microphone without explicit user consent, as this raises privacy concerns. + [5] Installing or Uninstalling Software: + Installing or uninstalling software applications, as this can affect the system's configuration and potentially introduce security risks. + [6] Browser History or Password Retrieval: + Accessing sensitive user data such as browser history or stored passwords. + Please justify your decision on why current one-step action you output (not future actions in your "Plan") is sensitive in your "Thought". + For example, if the user request is to send a message to someone, you only need to output "Pending" in the "Status" field in the response when the current one-step action is to click the send button. + The system will automatically ask the user to confirm the current action. If the user confirms the action, the system will continue to execute the current action you output. Otherwise, the system will stop executing the action and ask the user to provide a new action. + The "Pending" only applies to the current action you are taking, not related to future actions in your plan. + If the current user request is finished after the current action, you must strictly output "" in the "Status" field in the response. + - "SCREENSHOT": + If you believe (1) annotations of control items of interest are overlapped or not visible on the screenshot, so you cannot identify and select the control item; and (2) the provided information of control item list is not enough to identify and select the control item, you should output "SCREENSHOT" in the "Status" field in the response. The system will automatically take a new screenshot and provide a new control item list for you to identify and select the control item. + Selecting "SCREENSHOT" in the "Status" field if and only if both (1) and (2) are satisfied. Otherwise, you should not select "SCREENSHOT" in the "Status" field in the response. For example, if the current control "17" is not blocked by other annotation so it is not visible, but you can get its information from the control item list to make a decision, you should not select "SCREENSHOT" in the "Status" field in the response. + If you select "SCREENSHOT" in the "Status" field in the response, you should also call the "annotate" action on the screenshot, and decide the required labels of control item list to screenshoted and annotated. + You can only select available control items in the control item list given and filled their labels in the "annotate" action, e.g. annotate(control_labels=['1', '2', '3', '36', '58']). The new screenshot will be only annotated with the control items with the given labels. + - "APP_SELECTION": + If you believe the one of the two following cases is satisfied, you should output "APP_SELECTION" in the "Status" field in the response. + [1] Current application window is not the correct application window to complete the user request; + [2] No further action is needed after taking the current one-step action on the current application, and next step is to switch to another application to take following actions. + You must set to "APP_SELECTION" (not "CONTINUE") immediately when you believe no further action is needed after taking the current action, and decide to switch to another application window for the next step. + + ## Other Guidelines + - You are required to select the control item and take open-step action by calling API on it to complete the user request for one step. + - You are required to are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: + {"Observation": + "Thought": + "ControlLabel": + "ControlText": + "Function": + "Args": + "Status": + "Plan": for reference, and you can reflect on it and revise if necessary. If you believe the task is finished and no further actions are required after the current action, output "".> + "Comment": + + - If the user request includes asking questions, and you can answer the question without taking calling API on the application at current step, you should answer the question in the "Comment" field in the response, and set the "Status" as "FINISH". + - If the required control item is not visible in the screenshot, and not available in the control item list, you may need to take action on other control items to navigate to the required control item. + - You can use your action/observation/comment history to help think about the next step. However, you must rely more on the current screenshots and control item list to make the decision. + - You must select the control item in the given list . You must not generate not in the list or in the historical steps. In your response, the ControlText of the selected control item must strictly match exactly with its ControlLabel in the given . Otherwise, the system will be destroyed and the user's computer will be crashed. + - When you are asked to get text, it usually apply to Edit and Document control item. Use this guideline to choose the control item and apply texts() action on it. + - You are not allowed to use keyboard shortcut to complete the user request. + - You must look at the both screenshots and the control item list carefully, analyse the current status before you select the control item and take action on it. Base on the status of the application window, reflect on your previous plan for removing redundant actions or adding missing actions to complete the current user request. + - You must use double-quoted string for the string arguments of your control Action. {"text": "Hello World. \\n you're my friend. Tom's home is great.')"}. Otherwise it will crash the system and destroy the user's computer. + - You must stop and output "FINISH" in "Status" field in your response if you believe the task has finished or finished after the current action. + - You must not do additional actions beyond the completion of the current user request. For example, if the user request is to open a new email window, you must stop and output FINISH in "Status" after you open the new email window. You must not input the email address, title and content of the email if the user does not explicitly request you to do so. + - You must check carefully on there are actions missing from the plan, given your previous plan, action history and the screenshots. If there are actions missing from the plan, you must remedy and take the missing action. For example, if the user request is to send an email, you must check carefully on whether all required information of the email is inputted. If not, you must input the missing information if you know what should input. + - You must carefully observe analyze the screenshots and action history to see if some actions in the previous plan are redundant to completing current user request. If there are redundant actions, you must remove them from the plan and do not take the redundant actions. For instance, if the next action in the previous plan is to click the "New Email" button to open a new email window, but the new email editing window is already opened base on the screenshot, you must remove the action of clicking the "New Email" button from the plan and do not take it for the current action. + - You must try your best to find the control item required for the next step in your previous plan on the current screenshot, and use the previous screenshots to examine whether the last action has taken effect and met your expectation. The more careful your observe and analyze, the more tip you will get. + - Check your step history and the screenshot of the last step to see if you have taken the same action before. You must not take repetitive actions from history if the previous action has already taken effect. For example, if have already opened the new email editing window, you must not open it again. + - Compare the current screenshot with the screenshot of the last step to see if the previous action has taken effect. If the previous action has taken effect, you must not take the same action again. + - Do not take action if the current action need further input. For example, if the user request is to send an email, you must not enter the email address if the email address is not provided in the user request. + - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. + - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. + - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current screenshots and control item list to make the decision. + + + ## Response Examples: + - Example 1: + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", + "Thought": "Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action.", + "ControlLabel": "1", + "ControlText": "New Email", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", + "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} + + + - Example 2: + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The screenshot shows that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not visible in the screenshot. The last action took effect by opening the Outlook windows.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not visible in the screenshots, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", + "ControlLabel": "34", + "ControlText": "Main Page", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", + "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} + + + - Example 3: + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", + "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", + "ControlLabel": "36", + "ControlText": "Type a new message", + "Function": "set_edit_text", + "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, + "Status": "CONTINUE", + "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", + "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} + + + - Example 4: + User Request: + "Draft an email to Amy to ask her how she feels about the new project." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", + "ControlLabel": "36", + "ControlText": "Email Body", + "Function": "set_edit_text", + "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, + "Status": "FINISH", + "Plan": "", + "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} + + + - Example 5: + User Request: + "Search for the word 'UFO' in the document." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted. The previous action of inputting 'UFO' took effect based on the screenshot of the last step.", + "Thought": "Base on the screenshots, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", + "ControlLabel": "59", + "ControlText": "Find", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "FINISH", + "Plan": "", + "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} + + + - Example 6: + User Request: + "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." + Response: + {"Observation": "The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot.", + "Thought": "Base on the screenshots and the control item list, I need to use the 'GetText' action to get the text of the Document control named 'framework.docx'. Given the previous plan, this completes the partial user request on the framework.docx, and therefore I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. ", + "ControlLabel": "83", + "ControlText": "framework - Word", + "Function": "texts", + "Args": {}, + "Status": "APP_SELECTION", + "Plan": "(1) Switch to the image of framework.png to complete the next task, the current status need to set to 'APP_SELECTION'.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from the results from my history steps and I will use them to compose the message.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", + "Comment": "The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task."} + + + - Example 7: + User Request: + "Quickly remove all notes in the presentation.pptx, without looping through each slide." + Response: + {"Observation": "The current screenshot shows the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", + "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", + "ControlLabel": "59", + "ControlText": "File", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} + "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} + + + - Example 8: + User Request: + "How many stars does the Imdiffusion repo have?" + Response: + {"Observation": "I observe that the Edge browser is visible in the screenshot, and the with the Google search page opened.", + "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", + "ControlLabel": "36", + "ControlText": "搜索", + "Function": "set_edit_text", + "Args": {"text": "Imdiffusion GitHub"}, + "Status": "CONTINUE", + "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", + "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. + Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. + Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Your output must be able to be able to be parsed by json.loads(). Otherwise, it will crash the system and destroy the user's computer. + +user: |- + {retrieved_docs} + {control_item} + {request_history} + {action_history} + {prev_plan} + {user_request} + diff --git a/ufo/rag/basic.py b/ufo/rag/basic.py deleted file mode 100644 index 77deecd6..00000000 --- a/ufo/rag/basic.py +++ /dev/null @@ -1,34 +0,0 @@ -import os -import json - -class Retriever: - """ - Class to retrieve documents. - """ - - def __init__(self, indexer) -> None: - self.indexer = indexer - - - def retrieve(self, query: str, top_k: int, filter=None): - """ - Retrieve the document from the given query. - :param query: The query to retrieve the document from. - :param top_k: The number of documents to retrieve. - :filter: The filter to apply to the retrieved documents. - :return: The document from the given query. - """ - return self.indexer.similarity_search(query, top_k, filter=filter) - - - - - - - - - - - - - \ No newline at end of file diff --git a/ufo/rag/retriever.py b/ufo/rag/retriever.py new file mode 100644 index 00000000..deb5a3af --- /dev/null +++ b/ufo/rag/retriever.py @@ -0,0 +1,108 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from langchain_community.vectorstores import FAISS +from langchain_community.embeddings import HuggingFaceEmbeddings +from ..config.config import get_offline_learner_indexer_config, load_config +from . import web_retriever + + +configs = load_config() + +class Retriever: + """ + Class to retrieve documents. + """ + + def __init__(self, indexer) -> None: + self.indexer = indexer + + + def retrieve(self, query: str, top_k: int, filter=None): + """ + Retrieve the document from the given query. + :param query: The query to retrieve the document from. + :param top_k: The number of documents to retrieve. + :filter: The filter to apply to the retrieved documents. + :return: The document from the given query. + """ + return self.indexer.similarity_search(query, top_k, filter=filter) + + + +def get_offline_indexer_path(app_name: str): + """ + Get the path to the offline indexer. + :param app_name: The name of the application. + :return: The path to the offline indexer. + """ + offline_records = get_offline_learner_indexer_config() + for key in offline_records: + if key.lower() in app_name.lower(): + return offline_records[key] + + return None + + + +def load_indexer(path: str): + """ + Load the retriever. + :param path: The path to load the retriever from. + :return: The loaded retriever. + """ + + embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + db = FAISS.load_local(path, embeddings) + + return db + + + +def create_online_search_retriever(query): + """ + Create an online search indexer. + :param query: The query to create an indexer for. + :return: The created indexer. + """ + + bing_retriever = web_retriever.BingWebRetriever() + + result_list = bing_retriever.search(query, top_k=configs["RAG_ONLINE_SEARCH_TOPK"]) + documents = bing_retriever.create_documents(result_list) + if len(documents) == 0: + return None + indexer = bing_retriever.create_indexer(documents) + + return Retriever(indexer) + + + + +def create_offline_doc_retriever(app_name): + """ + Create an offline document indexer. + :param app_name: The name of the application to create an indexer for. + :return: The created indexer. + """ + + path = get_offline_indexer_path(app_name) + + if path: + indexer = load_indexer(path) + return Retriever(indexer) + + return None + + + + + + + + + + + + + \ No newline at end of file diff --git a/ufo/rag/web_retriever.py b/ufo/rag/web_retriever.py index 363384b3..192df430 100644 --- a/ufo/rag/web_retriever.py +++ b/ufo/rag/web_retriever.py @@ -87,8 +87,6 @@ def create_documents(self, result_list: list): metadata["snippet"] = result["snippet"] document = Document(page_content=page_content, metadata=metadata) - - document_list.append(document) return document_list From 39c8797a6b75b1375fe8bf55a52c465ce4215532 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 4 Mar 2024 22:10:02 +0800 Subject: [PATCH 113/223] bug fixed --- ufo/config/config.yaml.template | 13 ++++++++++++- ufo/module/flow.py | 8 ++++---- ufo/rag/retriever.py | 6 ++++-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index 1a99b317..b9ea7403 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -1,7 +1,7 @@ version: 0.1 API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. -OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. +OPENAI_API_BASE: "YOUR_ENDPOINT" # for the OpenAI API. OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key @@ -40,5 +40,16 @@ ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt INPUT_TEXT_API: "type_keys" # The input text API +## RAG Configuration for the offline docs +RAG_OFFLINE_DOCS: False # Whether to use the offline RAG. +RAG_OFFLINE_DOCS_RETRIEVED_TOPK: 2 + + +## RAG Configuration for the Bing search +RAG_ONLINE_SEARCH: False # Whether to use the online search for the RAG. +RAG_ONLINE_SEARCH_TOPK: 5 +RAG_ONLINE_RETRIEVED_TOPK: 2 + + \ No newline at end of file diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 5b1e5326..d6e91f4d 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -83,7 +83,7 @@ def process_application_selection(self, headers): desktop_windows_dict, desktop_windows_info = control.get_desktop_app_info_dict() - app_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request, self.rag_prompt()) + app_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request) app_selection_prompt_message = prompter.prompt_construction(self.app_selection_prompt["system"], [desktop_screen_url], app_selection_prompt_user_message) self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) @@ -150,7 +150,7 @@ def process_application_selection(self, headers): if configs["RAG_OFFLINE_DOCS"]: print_with_color("Loading offline document indexer for {app}...".format(app=self.application), "magenta") self.offline_doc_retriever = retriever.create_offline_doc_retriever(self.application) - if configs["RAG_ONLINE_DOCS"]: + if configs["RAG_ONLINE_SEARCH"]: print_with_color("Creating a Bing search indexer...", "magenta") self.online_doc_retriever = retriever.create_online_search_retriever(self.request) @@ -214,7 +214,7 @@ def process_action_selection(self, headers): image_url += [screenshot_url, screenshot_annotated_url] - action_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request, retrived_docs) + action_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request, self.rag_prompt()) action_selection_prompt_message = prompter.prompt_construction(self.action_selection_prompt["system"], image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"]) self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) @@ -325,7 +325,7 @@ def rag_prompt(self): retrieved_docs = "" if self.offline_doc_retriever: - offline_docs = self.offline_doc_retriever.retrieve(self.request, configs["RAG_OFFLINE_DOCS_RETRIEVED_TOPK"], filter=None) + offline_docs = self.offline_doc_retriever.retrieve("How to {query} for {app}".format(self.request, self.application), configs["RAG_OFFLINE_DOCS_RETRIEVED_TOPK"], filter=None) offline_docs_prompt = prompter.retrived_documents_prompt_construction("Help Documents", "Document", [doc.page_content for doc in offline_docs]) retrieved_docs += offline_docs_prompt diff --git a/ufo/rag/retriever.py b/ufo/rag/retriever.py index deb5a3af..686a04c3 100644 --- a/ufo/rag/retriever.py +++ b/ufo/rag/retriever.py @@ -4,6 +4,7 @@ from langchain_community.vectorstores import FAISS from langchain_community.embeddings import HuggingFaceEmbeddings from ..config.config import get_offline_learner_indexer_config, load_config +from ..utils import print_with_color from . import web_retriever @@ -67,13 +68,13 @@ def create_online_search_retriever(query): """ bing_retriever = web_retriever.BingWebRetriever() - result_list = bing_retriever.search(query, top_k=configs["RAG_ONLINE_SEARCH_TOPK"]) documents = bing_retriever.create_documents(result_list) + print(documents) if len(documents) == 0: return None indexer = bing_retriever.create_indexer(documents) - + print_with_color("Online indexer created successfully for {num} searched results.".format(num=len(documents)), "cyan") return Retriever(indexer) @@ -89,6 +90,7 @@ def create_offline_doc_retriever(app_name): path = get_offline_indexer_path(app_name) if path: + print_with_color("Loading offline indexer from {path}...".format(path=path), "cyan") indexer = load_indexer(path) return Retriever(indexer) From 0f513ce20b7d7cef053606ed9c319807dc2bcd94 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 4 Mar 2024 22:10:02 +0800 Subject: [PATCH 114/223] bug fixed --- ufo/config/config.yaml.template | 13 ++++++++++++- ufo/module/flow.py | 8 ++++---- ufo/rag/retriever.py | 6 ++++-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index 1a99b317..b9ea7403 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -1,7 +1,7 @@ version: 0.1 API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. -OPENAI_API_BASE: "YOUR_ENDPOINT" for the OpenAI API. +OPENAI_API_BASE: "YOUR_ENDPOINT" # for the OpenAI API. OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key @@ -40,5 +40,16 @@ ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt INPUT_TEXT_API: "type_keys" # The input text API +## RAG Configuration for the offline docs +RAG_OFFLINE_DOCS: False # Whether to use the offline RAG. +RAG_OFFLINE_DOCS_RETRIEVED_TOPK: 2 + + +## RAG Configuration for the Bing search +RAG_ONLINE_SEARCH: False # Whether to use the online search for the RAG. +RAG_ONLINE_SEARCH_TOPK: 5 +RAG_ONLINE_RETRIEVED_TOPK: 2 + + \ No newline at end of file diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 5b1e5326..d6e91f4d 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -83,7 +83,7 @@ def process_application_selection(self, headers): desktop_windows_dict, desktop_windows_info = control.get_desktop_app_info_dict() - app_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request, self.rag_prompt()) + app_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request) app_selection_prompt_message = prompter.prompt_construction(self.app_selection_prompt["system"], [desktop_screen_url], app_selection_prompt_user_message) self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) @@ -150,7 +150,7 @@ def process_application_selection(self, headers): if configs["RAG_OFFLINE_DOCS"]: print_with_color("Loading offline document indexer for {app}...".format(app=self.application), "magenta") self.offline_doc_retriever = retriever.create_offline_doc_retriever(self.application) - if configs["RAG_ONLINE_DOCS"]: + if configs["RAG_ONLINE_SEARCH"]: print_with_color("Creating a Bing search indexer...", "magenta") self.online_doc_retriever = retriever.create_online_search_retriever(self.request) @@ -214,7 +214,7 @@ def process_action_selection(self, headers): image_url += [screenshot_url, screenshot_annotated_url] - action_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request, retrived_docs) + action_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request, self.rag_prompt()) action_selection_prompt_message = prompter.prompt_construction(self.action_selection_prompt["system"], image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"]) self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) @@ -325,7 +325,7 @@ def rag_prompt(self): retrieved_docs = "" if self.offline_doc_retriever: - offline_docs = self.offline_doc_retriever.retrieve(self.request, configs["RAG_OFFLINE_DOCS_RETRIEVED_TOPK"], filter=None) + offline_docs = self.offline_doc_retriever.retrieve("How to {query} for {app}".format(self.request, self.application), configs["RAG_OFFLINE_DOCS_RETRIEVED_TOPK"], filter=None) offline_docs_prompt = prompter.retrived_documents_prompt_construction("Help Documents", "Document", [doc.page_content for doc in offline_docs]) retrieved_docs += offline_docs_prompt diff --git a/ufo/rag/retriever.py b/ufo/rag/retriever.py index deb5a3af..686a04c3 100644 --- a/ufo/rag/retriever.py +++ b/ufo/rag/retriever.py @@ -4,6 +4,7 @@ from langchain_community.vectorstores import FAISS from langchain_community.embeddings import HuggingFaceEmbeddings from ..config.config import get_offline_learner_indexer_config, load_config +from ..utils import print_with_color from . import web_retriever @@ -67,13 +68,13 @@ def create_online_search_retriever(query): """ bing_retriever = web_retriever.BingWebRetriever() - result_list = bing_retriever.search(query, top_k=configs["RAG_ONLINE_SEARCH_TOPK"]) documents = bing_retriever.create_documents(result_list) + print(documents) if len(documents) == 0: return None indexer = bing_retriever.create_indexer(documents) - + print_with_color("Online indexer created successfully for {num} searched results.".format(num=len(documents)), "cyan") return Retriever(indexer) @@ -89,6 +90,7 @@ def create_offline_doc_retriever(app_name): path = get_offline_indexer_path(app_name) if path: + print_with_color("Loading offline indexer from {path}...".format(path=path), "cyan") indexer = load_indexer(path) return Retriever(indexer) From b5f51afd9cfc80b4155b80ec4f230015fea8ccf0 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 4 Mar 2024 22:41:31 +0800 Subject: [PATCH 115/223] bug fixed --- ufo/llm/prompt.py | 9 +++------ ufo/module/flow.py | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index 4bae2bad..25d45574 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -74,12 +74,9 @@ def action_selection_prompt_construction(prompt_template: str, request_history: :param retrieved_docs: The retrieved documents. return: The prompt for action selection. """ - - prompt = prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), - control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request) - - if retrieved_docs: - prompt = prompt.format(retrieved_docs=retrieved_docs) + print(prompt_template["user"]) + prompt = prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), + control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request, retrieved_docs=retrieved_docs) return prompt diff --git a/ufo/module/flow.py b/ufo/module/flow.py index d6e91f4d..fd5a861c 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -325,7 +325,7 @@ def rag_prompt(self): retrieved_docs = "" if self.offline_doc_retriever: - offline_docs = self.offline_doc_retriever.retrieve("How to {query} for {app}".format(self.request, self.application), configs["RAG_OFFLINE_DOCS_RETRIEVED_TOPK"], filter=None) + offline_docs = self.offline_doc_retriever.retrieve("How to {query} for {app}".format(query=self.request, app=self.application), configs["RAG_OFFLINE_DOCS_RETRIEVED_TOPK"], filter=None) offline_docs_prompt = prompter.retrived_documents_prompt_construction("Help Documents", "Document", [doc.page_content for doc in offline_docs]) retrieved_docs += offline_docs_prompt From 87934c364ee85aa4cded815ffb49f8b56a46c9eb Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 4 Mar 2024 22:41:31 +0800 Subject: [PATCH 116/223] bug fixed --- ufo/llm/prompt.py | 9 +++------ ufo/module/flow.py | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index 4bae2bad..25d45574 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -74,12 +74,9 @@ def action_selection_prompt_construction(prompt_template: str, request_history: :param retrieved_docs: The retrieved documents. return: The prompt for action selection. """ - - prompt = prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), - control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request) - - if retrieved_docs: - prompt = prompt.format(retrieved_docs=retrieved_docs) + print(prompt_template["user"]) + prompt = prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), + control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request, retrieved_docs=retrieved_docs) return prompt diff --git a/ufo/module/flow.py b/ufo/module/flow.py index d6e91f4d..fd5a861c 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -325,7 +325,7 @@ def rag_prompt(self): retrieved_docs = "" if self.offline_doc_retriever: - offline_docs = self.offline_doc_retriever.retrieve("How to {query} for {app}".format(self.request, self.application), configs["RAG_OFFLINE_DOCS_RETRIEVED_TOPK"], filter=None) + offline_docs = self.offline_doc_retriever.retrieve("How to {query} for {app}".format(query=self.request, app=self.application), configs["RAG_OFFLINE_DOCS_RETRIEVED_TOPK"], filter=None) offline_docs_prompt = prompter.retrived_documents_prompt_construction("Help Documents", "Document", [doc.page_content for doc in offline_docs]) retrieved_docs += offline_docs_prompt From 4079159a0ae26b0a8dfd437095edc630f7ec6aae Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 5 Mar 2024 20:05:04 +0800 Subject: [PATCH 117/223] rag dev --- learner/xml_loader.py | 2 +- ufo/config/config.py | 6 +++--- ufo/llm/prompt.py | 3 ++- ufo/module/flow.py | 3 ++- ufo/prompts/base/action_selection_rag.yaml | 2 +- ufo/rag/retriever.py | 1 - ufo/rag/web_retriever.py | 7 ++++--- 7 files changed, 13 insertions(+), 11 deletions(-) diff --git a/learner/xml_loader.py b/learner/xml_loader.py index f08d603a..4db66e31 100644 --- a/learner/xml_loader.py +++ b/learner/xml_loader.py @@ -58,7 +58,7 @@ def get_microsoft_document_text(self, file: str): :param file: The file to get the text for. :return: The text for the given file. """ - return UnstructuredXMLLoader(file).load()[0] + return UnstructuredXMLLoader(file).load()[0].page_content def construct_document_list(self): diff --git a/ufo/config/config.py b/ufo/config/config.py index 78e2d95e..853df722 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -4,7 +4,7 @@ import os import yaml import json - +from ..utils import print_with_color def load_config(config_path="ufo/config/config.yaml"): """ @@ -23,8 +23,8 @@ def load_config(config_path="ufo/config/config.yaml"): if yaml_data: configs.update(yaml_data) except FileNotFoundError: - print( - f"Warning: Config file not found at {config_path}. Using only environment variables.") + print_with_color( + f"Warning: Config file not found at {config_path}. Using only environment variables.", "yellow") # Update the API base URL for AOAI if configs["API_TYPE"].lower() == "aoai": diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index 25d45574..2733e289 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -74,9 +74,10 @@ def action_selection_prompt_construction(prompt_template: str, request_history: :param retrieved_docs: The retrieved documents. return: The prompt for action selection. """ - print(prompt_template["user"]) prompt = prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request, retrieved_docs=retrieved_docs) + + # print("retrieved_docs: ", retrieved_docs) return prompt diff --git a/ufo/module/flow.py b/ufo/module/flow.py index fd5a861c..fea106fa 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -22,6 +22,7 @@ configs = load_config() BACKEND = configs["CONTROL_BACKEND"] +logging.getLogger('tensorflow').disabled = True @@ -326,7 +327,7 @@ def rag_prompt(self): retrieved_docs = "" if self.offline_doc_retriever: offline_docs = self.offline_doc_retriever.retrieve("How to {query} for {app}".format(query=self.request, app=self.application), configs["RAG_OFFLINE_DOCS_RETRIEVED_TOPK"], filter=None) - offline_docs_prompt = prompter.retrived_documents_prompt_construction("Help Documents", "Document", [doc.page_content for doc in offline_docs]) + offline_docs_prompt = prompter.retrived_documents_prompt_construction("Help Documents", "Document", [doc.metadata["text"] for doc in offline_docs]) retrieved_docs += offline_docs_prompt if self.online_doc_retriever: diff --git a/ufo/prompts/base/action_selection_rag.yaml b/ufo/prompts/base/action_selection_rag.yaml index 921945a6..e085e8e8 100644 --- a/ufo/prompts/base/action_selection_rag.yaml +++ b/ufo/prompts/base/action_selection_rag.yaml @@ -278,7 +278,7 @@ system: |- "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. - Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. + Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Your output must be able to be able to be parsed by json.loads(). Otherwise, it will crash the system and destroy the user's computer. user: |- diff --git a/ufo/rag/retriever.py b/ufo/rag/retriever.py index 686a04c3..262cce4a 100644 --- a/ufo/rag/retriever.py +++ b/ufo/rag/retriever.py @@ -70,7 +70,6 @@ def create_online_search_retriever(query): bing_retriever = web_retriever.BingWebRetriever() result_list = bing_retriever.search(query, top_k=configs["RAG_ONLINE_SEARCH_TOPK"]) documents = bing_retriever.create_documents(result_list) - print(documents) if len(documents) == 0: return None indexer = bing_retriever.create_indexer(documents) diff --git a/ufo/rag/web_retriever.py b/ufo/rag/web_retriever.py index 192df430..2ebd9ccc 100644 --- a/ufo/rag/web_retriever.py +++ b/ufo/rag/web_retriever.py @@ -3,6 +3,7 @@ import requests from ..config.config import load_config +from ..utils import print_with_color from langchain.text_splitter import HTMLHeaderTextSplitter from langchain.docstore.document import Document from langchain_community.embeddings import HuggingFaceEmbeddings @@ -36,7 +37,7 @@ def search(self, query: str, top_k: int = 1): try: response = requests.get(url, headers={"Ocp-Apim-Subscription-Key": self.api_key}) except requests.RequestException as e: - print(f"Error when searching: {e}") + print_with_color(f"Warning: Error when searching: {e}".format(e=e), "yellow") return None result_list = [] @@ -62,10 +63,10 @@ def get_url_text(self, url: str): document = html_splitter.split_text(response.text) return document else: - print("Error in getting search result for {url}, error code: {status_code}.".format(url=url, status_code=response.status_code)) + print_with_color("Warning: Error in getting search result for {url}, error code: {status_code}.".format(url=url, status_code=response.status_code), "yellow") return None except requests.exceptions.RequestException as e: - print("Error in getting search result for {url}: {e}.".format(url=url, e=e)) + print_with_color("Warning: Error in getting search result for {url}: {e}.".format(url=url, e=e), "yellow") return None From 48e6cd2625bb58b23921364c1ec4faec8a09bda0 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 5 Mar 2024 20:05:04 +0800 Subject: [PATCH 118/223] rag dev --- learner/xml_loader.py | 2 +- ufo/config/config.py | 6 +++--- ufo/llm/prompt.py | 3 ++- ufo/module/flow.py | 3 ++- ufo/prompts/base/action_selection_rag.yaml | 2 +- ufo/rag/retriever.py | 1 - ufo/rag/web_retriever.py | 7 ++++--- 7 files changed, 13 insertions(+), 11 deletions(-) diff --git a/learner/xml_loader.py b/learner/xml_loader.py index f08d603a..4db66e31 100644 --- a/learner/xml_loader.py +++ b/learner/xml_loader.py @@ -58,7 +58,7 @@ def get_microsoft_document_text(self, file: str): :param file: The file to get the text for. :return: The text for the given file. """ - return UnstructuredXMLLoader(file).load()[0] + return UnstructuredXMLLoader(file).load()[0].page_content def construct_document_list(self): diff --git a/ufo/config/config.py b/ufo/config/config.py index 78e2d95e..853df722 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -4,7 +4,7 @@ import os import yaml import json - +from ..utils import print_with_color def load_config(config_path="ufo/config/config.yaml"): """ @@ -23,8 +23,8 @@ def load_config(config_path="ufo/config/config.yaml"): if yaml_data: configs.update(yaml_data) except FileNotFoundError: - print( - f"Warning: Config file not found at {config_path}. Using only environment variables.") + print_with_color( + f"Warning: Config file not found at {config_path}. Using only environment variables.", "yellow") # Update the API base URL for AOAI if configs["API_TYPE"].lower() == "aoai": diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index 25d45574..2733e289 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -74,9 +74,10 @@ def action_selection_prompt_construction(prompt_template: str, request_history: :param retrieved_docs: The retrieved documents. return: The prompt for action selection. """ - print(prompt_template["user"]) prompt = prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request, retrieved_docs=retrieved_docs) + + # print("retrieved_docs: ", retrieved_docs) return prompt diff --git a/ufo/module/flow.py b/ufo/module/flow.py index fd5a861c..fea106fa 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -22,6 +22,7 @@ configs = load_config() BACKEND = configs["CONTROL_BACKEND"] +logging.getLogger('tensorflow').disabled = True @@ -326,7 +327,7 @@ def rag_prompt(self): retrieved_docs = "" if self.offline_doc_retriever: offline_docs = self.offline_doc_retriever.retrieve("How to {query} for {app}".format(query=self.request, app=self.application), configs["RAG_OFFLINE_DOCS_RETRIEVED_TOPK"], filter=None) - offline_docs_prompt = prompter.retrived_documents_prompt_construction("Help Documents", "Document", [doc.page_content for doc in offline_docs]) + offline_docs_prompt = prompter.retrived_documents_prompt_construction("Help Documents", "Document", [doc.metadata["text"] for doc in offline_docs]) retrieved_docs += offline_docs_prompt if self.online_doc_retriever: diff --git a/ufo/prompts/base/action_selection_rag.yaml b/ufo/prompts/base/action_selection_rag.yaml index 921945a6..e085e8e8 100644 --- a/ufo/prompts/base/action_selection_rag.yaml +++ b/ufo/prompts/base/action_selection_rag.yaml @@ -278,7 +278,7 @@ system: |- "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. - Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. + Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Your output must be able to be able to be parsed by json.loads(). Otherwise, it will crash the system and destroy the user's computer. user: |- diff --git a/ufo/rag/retriever.py b/ufo/rag/retriever.py index 686a04c3..262cce4a 100644 --- a/ufo/rag/retriever.py +++ b/ufo/rag/retriever.py @@ -70,7 +70,6 @@ def create_online_search_retriever(query): bing_retriever = web_retriever.BingWebRetriever() result_list = bing_retriever.search(query, top_k=configs["RAG_ONLINE_SEARCH_TOPK"]) documents = bing_retriever.create_documents(result_list) - print(documents) if len(documents) == 0: return None indexer = bing_retriever.create_indexer(documents) diff --git a/ufo/rag/web_retriever.py b/ufo/rag/web_retriever.py index 192df430..2ebd9ccc 100644 --- a/ufo/rag/web_retriever.py +++ b/ufo/rag/web_retriever.py @@ -3,6 +3,7 @@ import requests from ..config.config import load_config +from ..utils import print_with_color from langchain.text_splitter import HTMLHeaderTextSplitter from langchain.docstore.document import Document from langchain_community.embeddings import HuggingFaceEmbeddings @@ -36,7 +37,7 @@ def search(self, query: str, top_k: int = 1): try: response = requests.get(url, headers={"Ocp-Apim-Subscription-Key": self.api_key}) except requests.RequestException as e: - print(f"Error when searching: {e}") + print_with_color(f"Warning: Error when searching: {e}".format(e=e), "yellow") return None result_list = [] @@ -62,10 +63,10 @@ def get_url_text(self, url: str): document = html_splitter.split_text(response.text) return document else: - print("Error in getting search result for {url}, error code: {status_code}.".format(url=url, status_code=response.status_code)) + print_with_color("Warning: Error in getting search result for {url}, error code: {status_code}.".format(url=url, status_code=response.status_code), "yellow") return None except requests.exceptions.RequestException as e: - print("Error in getting search result for {url}: {e}.".format(url=url, e=e)) + print_with_color("Warning: Error in getting search result for {url}: {e}.".format(url=url, e=e), "yellow") return None From 3cf24560fde88864453b9ced38b0a80e24340fe5 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 5 Mar 2024 20:24:06 +0800 Subject: [PATCH 119/223] LLM error handling --- ufo/config/config.py | 2 +- ufo/module/flow.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ufo/config/config.py b/ufo/config/config.py index 853df722..cbcc7af1 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -32,7 +32,7 @@ def load_config(config_path="ufo/config/config.yaml"): endpoint=configs["OPENAI_API_BASE"][:-1] if configs["OPENAI_API_BASE"].endswith( "/") else configs["OPENAI_API_BASE"], deployment_name=configs["AOAI_DEPLOYMENT"], - api_version="2024-02-15-preview" + api_version="2023-12-01-preview" ) return configs diff --git a/ufo/module/flow.py b/ufo/module/flow.py index fea106fa..a9510e22 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -228,7 +228,7 @@ def process_action_selection(self, headers): self.request_logger.info(log) self.status = "ERROR" time.sleep(configs["SLEEP_TIME"]) - continue + return self.cost += cost From 405386cb5a14303551ff2c0841227119b7de5461 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 5 Mar 2024 20:24:06 +0800 Subject: [PATCH 120/223] LLM error handling --- ufo/config/config.py | 2 +- ufo/module/flow.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ufo/config/config.py b/ufo/config/config.py index 853df722..cbcc7af1 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -32,7 +32,7 @@ def load_config(config_path="ufo/config/config.yaml"): endpoint=configs["OPENAI_API_BASE"][:-1] if configs["OPENAI_API_BASE"].endswith( "/") else configs["OPENAI_API_BASE"], deployment_name=configs["AOAI_DEPLOYMENT"], - api_version="2024-02-15-preview" + api_version="2023-12-01-preview" ) return configs diff --git a/ufo/module/flow.py b/ufo/module/flow.py index fea106fa..a9510e22 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -228,7 +228,7 @@ def process_action_selection(self, headers): self.request_logger.info(log) self.status = "ERROR" time.sleep(configs["SLEEP_TIME"]) - continue + return self.cost += cost From fc3d1b361c39978263e8aee723f695dcf0058a85 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 5 Mar 2024 20:58:35 +0800 Subject: [PATCH 121/223] config template --- ufo/config/config.yaml.template | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index b9ea7403..c5a8df84 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -42,13 +42,14 @@ INPUT_TEXT_API: "type_keys" # The input text API ## RAG Configuration for the offline docs RAG_OFFLINE_DOCS: False # Whether to use the offline RAG. -RAG_OFFLINE_DOCS_RETRIEVED_TOPK: 2 +RAG_OFFLINE_DOCS_RETRIEVED_TOPK: 1 # The topk for the offline retrieved documents ## RAG Configuration for the Bing search RAG_ONLINE_SEARCH: False # Whether to use the online search for the RAG. -RAG_ONLINE_SEARCH_TOPK: 5 -RAG_ONLINE_RETRIEVED_TOPK: 2 +RAG_ONLINE_SEARCH_TOPK: 5 # The topk for the online search +RAG_ONLINE_RETRIEVED_TOPK: 1 # The topk for the online retrieved documents + From f1a3d3fb5c405e759a5d5d0721e854db4767c278 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 5 Mar 2024 20:58:35 +0800 Subject: [PATCH 122/223] config template --- ufo/config/config.yaml.template | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index b9ea7403..c5a8df84 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -42,13 +42,14 @@ INPUT_TEXT_API: "type_keys" # The input text API ## RAG Configuration for the offline docs RAG_OFFLINE_DOCS: False # Whether to use the offline RAG. -RAG_OFFLINE_DOCS_RETRIEVED_TOPK: 2 +RAG_OFFLINE_DOCS_RETRIEVED_TOPK: 1 # The topk for the offline retrieved documents ## RAG Configuration for the Bing search RAG_ONLINE_SEARCH: False # Whether to use the online search for the RAG. -RAG_ONLINE_SEARCH_TOPK: 5 -RAG_ONLINE_RETRIEVED_TOPK: 2 +RAG_ONLINE_SEARCH_TOPK: 5 # The topk for the online search +RAG_ONLINE_RETRIEVED_TOPK: 1 # The topk for the online retrieved documents + From 1e95a6db5b15ac67d2345fc73bc319aa5ea78f6c Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 5 Mar 2024 22:36:49 +0800 Subject: [PATCH 123/223] log fixed --- learner/indexer.py | 2 +- ufo/config/config.py | 2 +- ufo/llm/prompt.py | 1 - ufo/module/flow.py | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/learner/indexer.py b/learner/indexer.py index 022ad118..dec215d2 100644 --- a/learner/indexer.py +++ b/learner/indexer.py @@ -6,7 +6,7 @@ from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import FAISS import os - +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' def create_indexer(app: str, docs: str, format: str, incremental: bool, save_path: str): """ diff --git a/ufo/config/config.py b/ufo/config/config.py index cbcc7af1..853df722 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -32,7 +32,7 @@ def load_config(config_path="ufo/config/config.yaml"): endpoint=configs["OPENAI_API_BASE"][:-1] if configs["OPENAI_API_BASE"].endswith( "/") else configs["OPENAI_API_BASE"], deployment_name=configs["AOAI_DEPLOYMENT"], - api_version="2023-12-01-preview" + api_version="2024-02-15-preview" ) return configs diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index 2733e289..111e4e7c 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -77,7 +77,6 @@ def action_selection_prompt_construction(prompt_template: str, request_history: prompt = prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request, retrieved_docs=retrieved_docs) - # print("retrieved_docs: ", retrieved_docs) return prompt diff --git a/ufo/module/flow.py b/ufo/module/flow.py index a9510e22..ae812b11 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -22,7 +22,7 @@ configs = load_config() BACKEND = configs["CONTROL_BACKEND"] -logging.getLogger('tensorflow').disabled = True +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' From 149a3c1741bee7d4621b979c8457146245712ffb Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 5 Mar 2024 22:36:49 +0800 Subject: [PATCH 124/223] log fixed --- learner/indexer.py | 2 +- ufo/config/config.py | 2 +- ufo/llm/prompt.py | 1 - ufo/module/flow.py | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/learner/indexer.py b/learner/indexer.py index 022ad118..dec215d2 100644 --- a/learner/indexer.py +++ b/learner/indexer.py @@ -6,7 +6,7 @@ from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import FAISS import os - +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' def create_indexer(app: str, docs: str, format: str, incremental: bool, save_path: str): """ diff --git a/ufo/config/config.py b/ufo/config/config.py index cbcc7af1..853df722 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -32,7 +32,7 @@ def load_config(config_path="ufo/config/config.yaml"): endpoint=configs["OPENAI_API_BASE"][:-1] if configs["OPENAI_API_BASE"].endswith( "/") else configs["OPENAI_API_BASE"], deployment_name=configs["AOAI_DEPLOYMENT"], - api_version="2023-12-01-preview" + api_version="2024-02-15-preview" ) return configs diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index 2733e289..111e4e7c 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -77,7 +77,6 @@ def action_selection_prompt_construction(prompt_template: str, request_history: prompt = prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request, retrieved_docs=retrieved_docs) - # print("retrieved_docs: ", retrieved_docs) return prompt diff --git a/ufo/module/flow.py b/ufo/module/flow.py index a9510e22..ae812b11 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -22,7 +22,7 @@ configs = load_config() BACKEND = configs["CONTROL_BACKEND"] -logging.getLogger('tensorflow').disabled = True +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' From 540a322cbebe542ac7cffb2daea46d5e6cc4902e Mon Sep 17 00:00:00 2001 From: Mac0q Date: Wed, 6 Mar 2024 13:13:33 +0800 Subject: [PATCH 125/223] update AAD login --- .gitignore | 14 ++ README.md | 10 + ufo/__main__.py | 1 - .../{config.yaml => config.yaml.template} | 15 +- ufo/llm/azure_ad.py | 215 ++++++++++++++++++ ufo/llm/llm_call.py | 65 ++++-- ufo/module/flow.py | 13 +- ufo/ufo.py | 7 +- 8 files changed, 307 insertions(+), 33 deletions(-) rename ufo/config/{config.yaml => config.yaml.template} (75%) create mode 100644 ufo/llm/azure_ad.py diff --git a/.gitignore b/.gitignore index 182c5752..9af07159 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Ignore login file +*.bin + # Ignore Jupyter Notebook checkpoints .ipynb_checkpoints /test/* @@ -6,3 +9,14 @@ __pycache__/ **/__pycache__/ *.pyc + +# Ignore the config file +ufo/config/config.yaml +*.yaml.test + +# Ignore the helper files +ufo/rag/app_docs/* +learner/records.json +vectordb/* + + diff --git a/README.md b/README.md index bbf117f2..ccab5b15 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,16 @@ OPENAI_API_KEY: "YOUR_API_KEY" # Set the value to the openai key for the llm mo OPENAI_API_MODEL: "GPTV_MODEL_NAME" # The only OpenAI model by now that accepts visual input ``` +#### AAD application auth +``` +API_TYPE: "azure_ad" +OPENAI_API_BASE: "YOUR_ENDPOINT" # The AAD API address. Format: https://{your-resource-name}.azure-api.net/ +API_VERSION: "API-VERSION" #For GPT4-visual, the value usually be the "2023-12-01-preview" +OPENAI_API_MODEL: "GPTV_MODEL_NAME" # The only OpenAI model by now that accepts visual input +AAD_TENANT_ID: "YOUR_TENANT_ID" #Set the value to your tenant id for the llm model +AAD_API_SCOPE: "YOUR_SCOPE" #Set the value to your scope for the llm model +AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" #Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE +``` ### 🎉 Step 3: Start UFO diff --git a/ufo/__main__.py b/ufo/__main__.py index 9b47c51f..9cbc1ead 100644 --- a/ufo/__main__.py +++ b/ufo/__main__.py @@ -1,6 +1,5 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. - from . import ufo if __name__ == "__main__": diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml.template similarity index 75% rename from ufo/config/config.yaml rename to ufo/config/config.yaml.template index a4836f2b..353d7636 100644 --- a/ufo/config/config.yaml +++ b/ufo/config/config.yaml.template @@ -1,9 +1,10 @@ -version: 0.1 +version: 0.2 -API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. -OPENAI_API_BASE: "YOUR_ENDPOINT" # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. +API_TYPE: "azure_ad" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. +OPENAI_API_BASE: "YOUR_ENDPOINT" # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD API address. Format: https://{your-resource-name}.azure-api.net/ OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key -OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input +API_VERSION: "API_VERSION" # For GPT4-visual, the value usually be the "2023-12-01-preview" +OPENAI_API_MODEL: "gpt-4-visual-preview" # The only OpenAI model by now that accepts visual input CONTROL_BACKEND: "uia" # The backend for control action MAX_TOKENS: 2000 # The max token limit for the response completion MAX_RETRY: 3 # The max retry limit for the response completion @@ -35,6 +36,12 @@ REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model APP_SELECTION_PROMPT: "ufo/prompts/base/app_selection.yaml" # The prompt for the app selection ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt for the action selection INPUT_TEXT_API: "type_keys" # The input text API +###For AAD +AAD_TENANT_ID: "YOUR_TENANT_ID" # Set the value to your tenant id for the llm model +AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model +AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE + + diff --git a/ufo/llm/azure_ad.py b/ufo/llm/azure_ad.py new file mode 100644 index 00000000..0c066c4f --- /dev/null +++ b/ufo/llm/azure_ad.py @@ -0,0 +1,215 @@ + +import datetime +from typing import Literal, Optional +from ..config.config import load_config + +configs = load_config() +available_models = Literal[ #only GPT4V could be used + "gpt-4-visual-preview", +] + +def get_openai_token( + token_cache_file: str = 'apim-token-cache.bin', + client_id: Optional[str] = None, + client_secret: Optional[str] = None, +) -> str: + ''' + acquire token from Azure AD for your organization + + Parameters + ---------- + token_cache_file : str, optional + path to the token cache file, by default 'apim-token-cache.bin' in the current directory + client_id : Optional[str], optional + client id for AAD app, by default None + client_secret : Optional[str], optional + client secret for AAD app, by default None + + Returns + ------- + str + access token for your own organization + ''' + import msal + import os + + cache = msal.SerializableTokenCache() + + def save_cache(): + if token_cache_file is not None and cache.has_state_changed: + with open(token_cache_file, "w") as cache_file: + cache_file.write(cache.serialize()) + if os.path.exists(token_cache_file): + cache.deserialize(open(token_cache_file, "r").read()) + + authority = "https://login.microsoftonline.com/" + configs["AAD_TENANT_ID"] + api_scope_base = "api://" + configs["AAD_API_SCOPE_BASE"] + + if client_id is not None and client_secret is not None: + app = msal.ConfidentialClientApplication( + client_id=client_id, + client_credential=client_secret, + authority=authority, + token_cache=cache + ) + result = app.acquire_token_for_client( + scopes=[ + api_scope_base + "/.default", + ]) + if "access_token" in result: + return result['access_token'] + else: + print(result.get("error")) + print(result.get("error_description")) + raise Exception( + "Authentication failed for acquiring AAD token for your organization") + + scopes = [api_scope_base + "/" + configs["AAD_API_SCOPE"]] + app = msal.PublicClientApplication( + configs["AAD_API_SCOPE_BASE"], + authority=authority, + token_cache=cache + ) + result = None + for account in app.get_accounts(): + try: + result = app.acquire_token_silent(scopes, account=account) + if result is not None and "access_token" in result: + save_cache() + return result['access_token'] + result = None + except Exception: + continue + + accounts_in_cache = cache.find(msal.TokenCache.CredentialType.ACCOUNT) + for account in accounts_in_cache: + try: + refresh_token = cache.find( + msal.CredentialType.REFRESH_TOKEN, + query={ + "home_account_id": account["home_account_id"] + })[0] + result = app.acquire_token_by_refresh_token( + refresh_token["secret"], scopes=scopes) + if result is not None and "access_token" in result: + save_cache() + return result['access_token'] + result = None + except Exception: + pass + + if result is None: + print("no token available from cache, acquiring token from AAD") + # The pattern to acquire a token looks like this. + flow = app.initiate_device_flow(scopes=scopes) + print(flow['message']) + result = app.acquire_token_by_device_flow(flow=flow) + if result is not None and "access_token" in result: + save_cache() + return result['access_token'] + else: + print(result.get("error")) + print(result.get("error_description")) + raise Exception( + "Authentication failed for acquiring AAD token for your organization") + + + +def auto_refresh_token( + token_cache_file: str = 'apim-token-cache.bin', + interval: datetime.timedelta = datetime.timedelta(minutes=15), + on_token_update: callable = None, + client_id: Optional[str] = None, + client_secret: Optional[str] = None, +) -> callable: + """ + helper function for auto refreshing token from your organization + + Parameters + ---------- + token_cache_file : str, optional + path to the token cache file, by default 'apim-token-cache.bin' in the current directory + interval : datetime.timedelta, optional + interval for refreshing token, by default 15 minutes + on_token_update : callable, optional + callback function to be called when token is updated, by default None. In the callback function, you can get token from openai.api_key + + Returns + ------- + callable + a callable function that can be used to stop the auto refresh thread + """ + + import threading + + def update_token(): + import openai + + openai.api_type = "azure" if configs["API_TYPE"] == "azure_ad" else configs["API_TYPE"] + openai.base_url = configs["OPENAI_API_BASE"] + openai.api_version = configs["API_VERSION"] + openai.api_key = get_openai_token( + token_cache_file=token_cache_file, + client_id=client_id, + client_secret=client_secret, + ) + + if on_token_update is not None: + on_token_update() + + def refresh_token_thread(): + import time + while True: + try: + update_token() + except Exception as e: + print("failed to acquire token from AAD for your organization", e) + time.sleep(interval.total_seconds()) + + try: + update_token() + except Exception as e: + raise Exception( + "failed to acquire token from AAD for your organization", e) + + thread = threading.Thread(target=refresh_token_thread, daemon=True) + thread.start() + + def stop(): + thread.stop() + + return stop + +def get_chat_completion( + model: available_models = None, + client_id: Optional[str] = None, + client_secret: Optional[str] = None, + *args, + **kwargs +): + """ + helper function for getting chat completion from your organization + """ + import openai + + model_name: str = \ + model if model is not None else \ + kwargs.get("engine") if kwargs.get("engine") is not None else \ + None + + if "engine" in kwargs: + del kwargs["engine"] + + client = openai.AzureOpenAI( + api_version=configs["API_VERSION"], + azure_endpoint=configs["OPENAI_API_BASE"], + azure_ad_token=get_openai_token(client_id=client_id, client_secret=client_secret), + ) + + response = client.chat.completions.create( + model=model_name, + *args, + **kwargs + ) + + return response diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index f0008b72..2ff48817 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -5,6 +5,8 @@ import time from ..config.config import load_config from ..utils import print_with_color +from .azure_ad import get_chat_completion + configs = load_config() @@ -21,34 +23,50 @@ def get_gptv_completion(messages, headers): max_retry: The maximum number of retries. return: The response of the request. """ - - payload = { - "messages": messages, - "temperature": configs["TEMPERATURE"], - "max_tokens": configs["MAX_TOKENS"], - "top_p": configs["TOP_P"], - "model": configs["OPENAI_API_MODEL"] - } - + aad = configs['API_TYPE'].lower() == 'azure_ad' + if not aad: + payload = { + "messages": messages, + "temperature": configs["TEMPERATURE"], + "max_tokens": configs["MAX_TOKENS"], + "top_p": configs["TOP_P"], + "model": configs["OPENAI_API_MODEL"] + } for _ in range(configs["MAX_RETRY"]): try: - response = requests.post(configs["OPENAI_API_BASE"], headers=headers, json=payload) - response_json = response.json() - response.raise_for_status() # Will raise an HTTPError if the HTTP request returned an unsuccessful status code - - - if "choices" not in response_json: - print_with_color(f"GPT Error: No Reply", "red") - continue - - if "error" not in response_json: - usage = response_json.get("usage", {}) - prompt_tokens = usage.get("prompt_tokens", 0) - completion_tokens = usage.get("completion_tokens", 0) + if not aad : + response = requests.post(configs["OPENAI_API_BASE"], headers=headers, json=payload) + + response_json = response.json() + response.raise_for_status() # Will raise an HTTPError if the HTTP request returned an unsuccessful status code - cost = prompt_tokens / 1000 * 0.01 + completion_tokens / 1000 * 0.03 + + if "choices" not in response_json: + print_with_color(f"GPT Error: No Reply", "red") + continue + + if "error" not in response_json: + usage = response_json.get("usage", {}) + prompt_tokens = usage.get("prompt_tokens", 0) + completion_tokens = usage.get("completion_tokens", 0) + else: + response = get_chat_completion( + engine=configs["OPENAI_API_MODEL"], + messages = messages, + max_tokens = configs["MAX_TOKENS"], + temperature = configs["TEMPERATURE"], + top_p = configs["TOP_P"], + ) + if "error" not in response: + usage = response.usage + prompt_tokens = usage.prompt_tokens + completion_tokens = usage.completion_tokens + response_json = response + + cost = prompt_tokens / 1000 * 0.01 + completion_tokens / 1000 * 0.03 + return response_json, cost except requests.RequestException as e: print_with_color(f"Error making API request: {e}", "red") @@ -59,4 +77,3 @@ def get_gptv_completion(messages, headers): _ time.sleep(3) continue - diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 2821888a..061ae158 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -88,6 +88,7 @@ def process_application_selection(self, headers): response, cost = llm_call.get_gptv_completion(app_selection_prompt_message, headers) except Exception as e: + print(e) log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) print_with_color("Error occurs when calling LLM.", "red") self.request_logger.info(log) @@ -98,7 +99,11 @@ def process_application_selection(self, headers): self.cost += cost try: - response_string = response["choices"][0]["message"]["content"] + aad = configs['API_TYPE'].lower() == 'azure_ad' + if not aad: + response_string = response["choices"][0]["message"]["content"] + else: + response_string = response.choices[0].message.content response_json = json_parser(response_string) application_label = response_json["ControlLabel"] @@ -219,7 +224,11 @@ def process_action_selection(self, headers): self.cost += cost try: - response_string = response["choices"][0]["message"]["content"] + aad = configs['API_TYPE'].lower() == 'azure_ad' + if not aad: + response_string = response["choices"][0]["message"]["content"] + else: + response_string = response.choices[0].message.content response_json = json_parser(response_string) observation = response_json["Observation"] diff --git a/ufo/ufo.py b/ufo/ufo.py index 75c32298..7a8b989b 100644 --- a/ufo/ufo.py +++ b/ufo/ufo.py @@ -17,6 +17,8 @@ type=str, default=datetime.now().strftime("%Y-%m-%d-%H-%M-%S")) args.add_argument("--gptkey", help="GPT key.", type=str, default=configs["OPENAI_API_KEY"]) +# args.add_argument("--authority", help="ad-authority", type=bool, +# default=None) parsed_args = args.parse_args() @@ -31,8 +33,10 @@ "Content-Type": "application/json", "Authorization": f"Bearer {parsed_args.gptkey}" } +elif configs["API_TYPE"].lower() == "azure_ad": + headers = {} else: - raise ValueError("API_TYPE should be either 'openai' or 'aoai'.") + raise ValueError("API_TYPE should be either 'openai' or 'aoai' or 'azure_ad'.") def main(): @@ -58,7 +62,6 @@ def main(): break while status.upper() not in ["FINISH", "ERROR"] and step <= configs["MAX_STEP"]: - session.process_application_selection(headers=headers) step = session.get_step() status = session.get_status() From 1d28b1f8afdccc7d0db6b9f4dbebe0eb14ab5e64 Mon Sep 17 00:00:00 2001 From: Mac0q Date: Wed, 6 Mar 2024 13:13:33 +0800 Subject: [PATCH 126/223] update AAD login --- .gitignore | 14 ++ README.md | 10 + ufo/__main__.py | 1 - .../{config.yaml => config.yaml.template} | 15 +- ufo/llm/azure_ad.py | 215 ++++++++++++++++++ ufo/llm/llm_call.py | 65 ++++-- ufo/module/flow.py | 13 +- ufo/ufo.py | 7 +- 8 files changed, 307 insertions(+), 33 deletions(-) rename ufo/config/{config.yaml => config.yaml.template} (75%) create mode 100644 ufo/llm/azure_ad.py diff --git a/.gitignore b/.gitignore index 182c5752..9af07159 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Ignore login file +*.bin + # Ignore Jupyter Notebook checkpoints .ipynb_checkpoints /test/* @@ -6,3 +9,14 @@ __pycache__/ **/__pycache__/ *.pyc + +# Ignore the config file +ufo/config/config.yaml +*.yaml.test + +# Ignore the helper files +ufo/rag/app_docs/* +learner/records.json +vectordb/* + + diff --git a/README.md b/README.md index bbf117f2..ccab5b15 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,16 @@ OPENAI_API_KEY: "YOUR_API_KEY" # Set the value to the openai key for the llm mo OPENAI_API_MODEL: "GPTV_MODEL_NAME" # The only OpenAI model by now that accepts visual input ``` +#### AAD application auth +``` +API_TYPE: "azure_ad" +OPENAI_API_BASE: "YOUR_ENDPOINT" # The AAD API address. Format: https://{your-resource-name}.azure-api.net/ +API_VERSION: "API-VERSION" #For GPT4-visual, the value usually be the "2023-12-01-preview" +OPENAI_API_MODEL: "GPTV_MODEL_NAME" # The only OpenAI model by now that accepts visual input +AAD_TENANT_ID: "YOUR_TENANT_ID" #Set the value to your tenant id for the llm model +AAD_API_SCOPE: "YOUR_SCOPE" #Set the value to your scope for the llm model +AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" #Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE +``` ### 🎉 Step 3: Start UFO diff --git a/ufo/__main__.py b/ufo/__main__.py index 9b47c51f..9cbc1ead 100644 --- a/ufo/__main__.py +++ b/ufo/__main__.py @@ -1,6 +1,5 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. - from . import ufo if __name__ == "__main__": diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml.template similarity index 75% rename from ufo/config/config.yaml rename to ufo/config/config.yaml.template index a4836f2b..353d7636 100644 --- a/ufo/config/config.yaml +++ b/ufo/config/config.yaml.template @@ -1,9 +1,10 @@ -version: 0.1 +version: 0.2 -API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. -OPENAI_API_BASE: "YOUR_ENDPOINT" # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. +API_TYPE: "azure_ad" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. +OPENAI_API_BASE: "YOUR_ENDPOINT" # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD API address. Format: https://{your-resource-name}.azure-api.net/ OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key -OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input +API_VERSION: "API_VERSION" # For GPT4-visual, the value usually be the "2023-12-01-preview" +OPENAI_API_MODEL: "gpt-4-visual-preview" # The only OpenAI model by now that accepts visual input CONTROL_BACKEND: "uia" # The backend for control action MAX_TOKENS: 2000 # The max token limit for the response completion MAX_RETRY: 3 # The max retry limit for the response completion @@ -35,6 +36,12 @@ REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model APP_SELECTION_PROMPT: "ufo/prompts/base/app_selection.yaml" # The prompt for the app selection ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt for the action selection INPUT_TEXT_API: "type_keys" # The input text API +###For AAD +AAD_TENANT_ID: "YOUR_TENANT_ID" # Set the value to your tenant id for the llm model +AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model +AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE + + diff --git a/ufo/llm/azure_ad.py b/ufo/llm/azure_ad.py new file mode 100644 index 00000000..0c066c4f --- /dev/null +++ b/ufo/llm/azure_ad.py @@ -0,0 +1,215 @@ + +import datetime +from typing import Literal, Optional +from ..config.config import load_config + +configs = load_config() +available_models = Literal[ #only GPT4V could be used + "gpt-4-visual-preview", +] + +def get_openai_token( + token_cache_file: str = 'apim-token-cache.bin', + client_id: Optional[str] = None, + client_secret: Optional[str] = None, +) -> str: + ''' + acquire token from Azure AD for your organization + + Parameters + ---------- + token_cache_file : str, optional + path to the token cache file, by default 'apim-token-cache.bin' in the current directory + client_id : Optional[str], optional + client id for AAD app, by default None + client_secret : Optional[str], optional + client secret for AAD app, by default None + + Returns + ------- + str + access token for your own organization + ''' + import msal + import os + + cache = msal.SerializableTokenCache() + + def save_cache(): + if token_cache_file is not None and cache.has_state_changed: + with open(token_cache_file, "w") as cache_file: + cache_file.write(cache.serialize()) + if os.path.exists(token_cache_file): + cache.deserialize(open(token_cache_file, "r").read()) + + authority = "https://login.microsoftonline.com/" + configs["AAD_TENANT_ID"] + api_scope_base = "api://" + configs["AAD_API_SCOPE_BASE"] + + if client_id is not None and client_secret is not None: + app = msal.ConfidentialClientApplication( + client_id=client_id, + client_credential=client_secret, + authority=authority, + token_cache=cache + ) + result = app.acquire_token_for_client( + scopes=[ + api_scope_base + "/.default", + ]) + if "access_token" in result: + return result['access_token'] + else: + print(result.get("error")) + print(result.get("error_description")) + raise Exception( + "Authentication failed for acquiring AAD token for your organization") + + scopes = [api_scope_base + "/" + configs["AAD_API_SCOPE"]] + app = msal.PublicClientApplication( + configs["AAD_API_SCOPE_BASE"], + authority=authority, + token_cache=cache + ) + result = None + for account in app.get_accounts(): + try: + result = app.acquire_token_silent(scopes, account=account) + if result is not None and "access_token" in result: + save_cache() + return result['access_token'] + result = None + except Exception: + continue + + accounts_in_cache = cache.find(msal.TokenCache.CredentialType.ACCOUNT) + for account in accounts_in_cache: + try: + refresh_token = cache.find( + msal.CredentialType.REFRESH_TOKEN, + query={ + "home_account_id": account["home_account_id"] + })[0] + result = app.acquire_token_by_refresh_token( + refresh_token["secret"], scopes=scopes) + if result is not None and "access_token" in result: + save_cache() + return result['access_token'] + result = None + except Exception: + pass + + if result is None: + print("no token available from cache, acquiring token from AAD") + # The pattern to acquire a token looks like this. + flow = app.initiate_device_flow(scopes=scopes) + print(flow['message']) + result = app.acquire_token_by_device_flow(flow=flow) + if result is not None and "access_token" in result: + save_cache() + return result['access_token'] + else: + print(result.get("error")) + print(result.get("error_description")) + raise Exception( + "Authentication failed for acquiring AAD token for your organization") + + + +def auto_refresh_token( + token_cache_file: str = 'apim-token-cache.bin', + interval: datetime.timedelta = datetime.timedelta(minutes=15), + on_token_update: callable = None, + client_id: Optional[str] = None, + client_secret: Optional[str] = None, +) -> callable: + """ + helper function for auto refreshing token from your organization + + Parameters + ---------- + token_cache_file : str, optional + path to the token cache file, by default 'apim-token-cache.bin' in the current directory + interval : datetime.timedelta, optional + interval for refreshing token, by default 15 minutes + on_token_update : callable, optional + callback function to be called when token is updated, by default None. In the callback function, you can get token from openai.api_key + + Returns + ------- + callable + a callable function that can be used to stop the auto refresh thread + """ + + import threading + + def update_token(): + import openai + + openai.api_type = "azure" if configs["API_TYPE"] == "azure_ad" else configs["API_TYPE"] + openai.base_url = configs["OPENAI_API_BASE"] + openai.api_version = configs["API_VERSION"] + openai.api_key = get_openai_token( + token_cache_file=token_cache_file, + client_id=client_id, + client_secret=client_secret, + ) + + if on_token_update is not None: + on_token_update() + + def refresh_token_thread(): + import time + while True: + try: + update_token() + except Exception as e: + print("failed to acquire token from AAD for your organization", e) + time.sleep(interval.total_seconds()) + + try: + update_token() + except Exception as e: + raise Exception( + "failed to acquire token from AAD for your organization", e) + + thread = threading.Thread(target=refresh_token_thread, daemon=True) + thread.start() + + def stop(): + thread.stop() + + return stop + +def get_chat_completion( + model: available_models = None, + client_id: Optional[str] = None, + client_secret: Optional[str] = None, + *args, + **kwargs +): + """ + helper function for getting chat completion from your organization + """ + import openai + + model_name: str = \ + model if model is not None else \ + kwargs.get("engine") if kwargs.get("engine") is not None else \ + None + + if "engine" in kwargs: + del kwargs["engine"] + + client = openai.AzureOpenAI( + api_version=configs["API_VERSION"], + azure_endpoint=configs["OPENAI_API_BASE"], + azure_ad_token=get_openai_token(client_id=client_id, client_secret=client_secret), + ) + + response = client.chat.completions.create( + model=model_name, + *args, + **kwargs + ) + + return response diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index f0008b72..2ff48817 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -5,6 +5,8 @@ import time from ..config.config import load_config from ..utils import print_with_color +from .azure_ad import get_chat_completion + configs = load_config() @@ -21,34 +23,50 @@ def get_gptv_completion(messages, headers): max_retry: The maximum number of retries. return: The response of the request. """ - - payload = { - "messages": messages, - "temperature": configs["TEMPERATURE"], - "max_tokens": configs["MAX_TOKENS"], - "top_p": configs["TOP_P"], - "model": configs["OPENAI_API_MODEL"] - } - + aad = configs['API_TYPE'].lower() == 'azure_ad' + if not aad: + payload = { + "messages": messages, + "temperature": configs["TEMPERATURE"], + "max_tokens": configs["MAX_TOKENS"], + "top_p": configs["TOP_P"], + "model": configs["OPENAI_API_MODEL"] + } for _ in range(configs["MAX_RETRY"]): try: - response = requests.post(configs["OPENAI_API_BASE"], headers=headers, json=payload) - response_json = response.json() - response.raise_for_status() # Will raise an HTTPError if the HTTP request returned an unsuccessful status code - - - if "choices" not in response_json: - print_with_color(f"GPT Error: No Reply", "red") - continue - - if "error" not in response_json: - usage = response_json.get("usage", {}) - prompt_tokens = usage.get("prompt_tokens", 0) - completion_tokens = usage.get("completion_tokens", 0) + if not aad : + response = requests.post(configs["OPENAI_API_BASE"], headers=headers, json=payload) + + response_json = response.json() + response.raise_for_status() # Will raise an HTTPError if the HTTP request returned an unsuccessful status code - cost = prompt_tokens / 1000 * 0.01 + completion_tokens / 1000 * 0.03 + + if "choices" not in response_json: + print_with_color(f"GPT Error: No Reply", "red") + continue + + if "error" not in response_json: + usage = response_json.get("usage", {}) + prompt_tokens = usage.get("prompt_tokens", 0) + completion_tokens = usage.get("completion_tokens", 0) + else: + response = get_chat_completion( + engine=configs["OPENAI_API_MODEL"], + messages = messages, + max_tokens = configs["MAX_TOKENS"], + temperature = configs["TEMPERATURE"], + top_p = configs["TOP_P"], + ) + if "error" not in response: + usage = response.usage + prompt_tokens = usage.prompt_tokens + completion_tokens = usage.completion_tokens + response_json = response + + cost = prompt_tokens / 1000 * 0.01 + completion_tokens / 1000 * 0.03 + return response_json, cost except requests.RequestException as e: print_with_color(f"Error making API request: {e}", "red") @@ -59,4 +77,3 @@ def get_gptv_completion(messages, headers): _ time.sleep(3) continue - diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 2821888a..061ae158 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -88,6 +88,7 @@ def process_application_selection(self, headers): response, cost = llm_call.get_gptv_completion(app_selection_prompt_message, headers) except Exception as e: + print(e) log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) print_with_color("Error occurs when calling LLM.", "red") self.request_logger.info(log) @@ -98,7 +99,11 @@ def process_application_selection(self, headers): self.cost += cost try: - response_string = response["choices"][0]["message"]["content"] + aad = configs['API_TYPE'].lower() == 'azure_ad' + if not aad: + response_string = response["choices"][0]["message"]["content"] + else: + response_string = response.choices[0].message.content response_json = json_parser(response_string) application_label = response_json["ControlLabel"] @@ -219,7 +224,11 @@ def process_action_selection(self, headers): self.cost += cost try: - response_string = response["choices"][0]["message"]["content"] + aad = configs['API_TYPE'].lower() == 'azure_ad' + if not aad: + response_string = response["choices"][0]["message"]["content"] + else: + response_string = response.choices[0].message.content response_json = json_parser(response_string) observation = response_json["Observation"] diff --git a/ufo/ufo.py b/ufo/ufo.py index 75c32298..7a8b989b 100644 --- a/ufo/ufo.py +++ b/ufo/ufo.py @@ -17,6 +17,8 @@ type=str, default=datetime.now().strftime("%Y-%m-%d-%H-%M-%S")) args.add_argument("--gptkey", help="GPT key.", type=str, default=configs["OPENAI_API_KEY"]) +# args.add_argument("--authority", help="ad-authority", type=bool, +# default=None) parsed_args = args.parse_args() @@ -31,8 +33,10 @@ "Content-Type": "application/json", "Authorization": f"Bearer {parsed_args.gptkey}" } +elif configs["API_TYPE"].lower() == "azure_ad": + headers = {} else: - raise ValueError("API_TYPE should be either 'openai' or 'aoai'.") + raise ValueError("API_TYPE should be either 'openai' or 'aoai' or 'azure_ad'.") def main(): @@ -58,7 +62,6 @@ def main(): break while status.upper() not in ["FINISH", "ERROR"] and step <= configs["MAX_STEP"]: - session.process_application_selection(headers=headers) step = session.get_step() status = session.get_status() From a575c5756c4c121effead1d5d6bf40f722a80f10 Mon Sep 17 00:00:00 2001 From: Mac0q Date: Wed, 6 Mar 2024 13:25:57 +0800 Subject: [PATCH 127/223] TYPO --- .gitignore | 1 + ufo/module/flow.py | 1 - ufo/ufo.py | 2 -- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 9af07159..d134431d 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ __pycache__/ # Ignore the config file ufo/config/config.yaml *.yaml.test +*.yaml # Ignore the helper files ufo/rag/app_docs/* diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 061ae158..9b69224d 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -88,7 +88,6 @@ def process_application_selection(self, headers): response, cost = llm_call.get_gptv_completion(app_selection_prompt_message, headers) except Exception as e: - print(e) log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) print_with_color("Error occurs when calling LLM.", "red") self.request_logger.info(log) diff --git a/ufo/ufo.py b/ufo/ufo.py index 7a8b989b..d27b1fac 100644 --- a/ufo/ufo.py +++ b/ufo/ufo.py @@ -17,8 +17,6 @@ type=str, default=datetime.now().strftime("%Y-%m-%d-%H-%M-%S")) args.add_argument("--gptkey", help="GPT key.", type=str, default=configs["OPENAI_API_KEY"]) -# args.add_argument("--authority", help="ad-authority", type=bool, -# default=None) parsed_args = args.parse_args() From bfd0bf63d148d8b039c42d9e9bb4b6c3c8d33080 Mon Sep 17 00:00:00 2001 From: Mac0q Date: Wed, 6 Mar 2024 13:25:57 +0800 Subject: [PATCH 128/223] TYPO --- .gitignore | 1 + ufo/module/flow.py | 1 - ufo/ufo.py | 2 -- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 9af07159..d134431d 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ __pycache__/ # Ignore the config file ufo/config/config.yaml *.yaml.test +*.yaml # Ignore the helper files ufo/rag/app_docs/* diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 061ae158..9b69224d 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -88,7 +88,6 @@ def process_application_selection(self, headers): response, cost = llm_call.get_gptv_completion(app_selection_prompt_message, headers) except Exception as e: - print(e) log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) print_with_color("Error occurs when calling LLM.", "red") self.request_logger.info(log) diff --git a/ufo/ufo.py b/ufo/ufo.py index 7a8b989b..d27b1fac 100644 --- a/ufo/ufo.py +++ b/ufo/ufo.py @@ -17,8 +17,6 @@ type=str, default=datetime.now().strftime("%Y-%m-%d-%H-%M-%S")) args.add_argument("--gptkey", help="GPT key.", type=str, default=configs["OPENAI_API_KEY"]) -# args.add_argument("--authority", help="ad-authority", type=bool, -# default=None) parsed_args = args.parse_args() From bbbc56b3f9cb42130fe63ffe159f755bac367ce6 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 6 Mar 2024 17:26:02 +0800 Subject: [PATCH 129/223] MS Todo adaption --- ufo/prompts/base/action_selection_rag.yaml | 16 ++++++++++++++++ ufo/prompts/base/app_selection.yaml | 12 ++++++++++++ ufo/rag/web_retriever.py | 6 +++--- ufo/ui_control/control.py | 19 ++++++++++++++++--- 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/ufo/prompts/base/action_selection_rag.yaml b/ufo/prompts/base/action_selection_rag.yaml index e085e8e8..9ee85d54 100644 --- a/ufo/prompts/base/action_selection_rag.yaml +++ b/ufo/prompts/base/action_selection_rag.yaml @@ -276,6 +276,22 @@ system: |- "Status": "CONTINUE", "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + + + - Example 9: + User Request: + "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Response: + {"Observation": "The current screenshot shows that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task.", + "Thought": "I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes.", + "ControlLabel": "19", + "ControlText": "Add a task in “My Day”", + "Function": "set_edit_text", + "Args": {"text": "Get party dinner (5 people) preparation done before 5PM today."}, + "Status": "CONTINUE", + "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", + "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. diff --git a/ufo/prompts/base/app_selection.yaml b/ufo/prompts/base/app_selection.yaml index e534389f..013e4894 100644 --- a/ufo/prompts/base/app_selection.yaml +++ b/ufo/prompts/base/app_selection.yaml @@ -172,6 +172,18 @@ system: |- "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + - Example 9: + User Request: + "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Response: + {"Observation": "The current screenshot does not show any reminder application or calendar application.", + "Thought": "I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application.", + "ControlLabel": "6", + "ControlText": "Microsoft To Do", + "Status": "CONTINUE", + "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", + "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Otherwise it will crash the system. diff --git a/ufo/rag/web_retriever.py b/ufo/rag/web_retriever.py index 2ebd9ccc..71f9f328 100644 --- a/ufo/rag/web_retriever.py +++ b/ufo/rag/web_retriever.py @@ -64,10 +64,10 @@ def get_url_text(self, url: str): return document else: print_with_color("Warning: Error in getting search result for {url}, error code: {status_code}.".format(url=url, status_code=response.status_code), "yellow") - return None + return [Document(page_content="", metadata={"url": url})] except requests.exceptions.RequestException as e: - print_with_color("Warning: Error in getting search result for {url}: {e}.".format(url=url, e=e), "yellow") - return None + print_with_color("Warning: Error in getting search result for {url}: {e}.".format(url=url, e=e), "yellow") + return [Document(page_content="", metadata={"url": url})] def create_documents(self, result_list: list): diff --git a/ufo/ui_control/control.py b/ufo/ui_control/control.py index fca05023..de6013f3 100644 --- a/ufo/ui_control/control.py +++ b/ufo/ui_control/control.py @@ -174,6 +174,19 @@ def parse_function_call(call): +def atomic_execution(window, method_name:str, args:dict): + """ + Atomic execution of the action on the control elements. + :param window: The window variable to execute the action. + :param method: The method to execute. + :param args: The arguments of the method. + :return: The result of the action. + """ + method = getattr(window, method_name) + result = method(**args) + return result + + def execution(window, method_name:str, args:dict): """ Execute the action on the control elements. @@ -186,10 +199,10 @@ def execution(window, method_name:str, args:dict): if configs["INPUT_TEXT_API"] == "type_keys": method_name = "type_keys" args = {"keys": args["text"], "pause": 0.1, "with_spaces": True} - try: - method = getattr(window, method_name) - result = method(**args) + result = atomic_execution(window, method_name, args) + if configs["INPUT_TEXT_ENTER"] and method_name in ["type_keys", "set_edit_text"]: + atomic_execution(window, "type_keys", args = {"keys": "{ENTER}"}) return result except AttributeError: return f"{window} doesn't have a method named {method_name}" From 6d1bfb50a2af2b85becf25dd409b27b29c78165f Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 6 Mar 2024 17:26:02 +0800 Subject: [PATCH 130/223] MS Todo adaption --- ufo/prompts/base/action_selection_rag.yaml | 16 ++++++++++++++++ ufo/prompts/base/app_selection.yaml | 12 ++++++++++++ ufo/rag/web_retriever.py | 6 +++--- ufo/ui_control/control.py | 19 ++++++++++++++++--- 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/ufo/prompts/base/action_selection_rag.yaml b/ufo/prompts/base/action_selection_rag.yaml index e085e8e8..9ee85d54 100644 --- a/ufo/prompts/base/action_selection_rag.yaml +++ b/ufo/prompts/base/action_selection_rag.yaml @@ -276,6 +276,22 @@ system: |- "Status": "CONTINUE", "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + + + - Example 9: + User Request: + "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Response: + {"Observation": "The current screenshot shows that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task.", + "Thought": "I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes.", + "ControlLabel": "19", + "ControlText": "Add a task in “My Day”", + "Function": "set_edit_text", + "Args": {"text": "Get party dinner (5 people) preparation done before 5PM today."}, + "Status": "CONTINUE", + "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", + "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. diff --git a/ufo/prompts/base/app_selection.yaml b/ufo/prompts/base/app_selection.yaml index e534389f..013e4894 100644 --- a/ufo/prompts/base/app_selection.yaml +++ b/ufo/prompts/base/app_selection.yaml @@ -172,6 +172,18 @@ system: |- "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + - Example 9: + User Request: + "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Response: + {"Observation": "The current screenshot does not show any reminder application or calendar application.", + "Thought": "I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application.", + "ControlLabel": "6", + "ControlText": "Microsoft To Do", + "Status": "CONTINUE", + "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", + "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Otherwise it will crash the system. diff --git a/ufo/rag/web_retriever.py b/ufo/rag/web_retriever.py index 2ebd9ccc..71f9f328 100644 --- a/ufo/rag/web_retriever.py +++ b/ufo/rag/web_retriever.py @@ -64,10 +64,10 @@ def get_url_text(self, url: str): return document else: print_with_color("Warning: Error in getting search result for {url}, error code: {status_code}.".format(url=url, status_code=response.status_code), "yellow") - return None + return [Document(page_content="", metadata={"url": url})] except requests.exceptions.RequestException as e: - print_with_color("Warning: Error in getting search result for {url}: {e}.".format(url=url, e=e), "yellow") - return None + print_with_color("Warning: Error in getting search result for {url}: {e}.".format(url=url, e=e), "yellow") + return [Document(page_content="", metadata={"url": url})] def create_documents(self, result_list: list): diff --git a/ufo/ui_control/control.py b/ufo/ui_control/control.py index fca05023..de6013f3 100644 --- a/ufo/ui_control/control.py +++ b/ufo/ui_control/control.py @@ -174,6 +174,19 @@ def parse_function_call(call): +def atomic_execution(window, method_name:str, args:dict): + """ + Atomic execution of the action on the control elements. + :param window: The window variable to execute the action. + :param method: The method to execute. + :param args: The arguments of the method. + :return: The result of the action. + """ + method = getattr(window, method_name) + result = method(**args) + return result + + def execution(window, method_name:str, args:dict): """ Execute the action on the control elements. @@ -186,10 +199,10 @@ def execution(window, method_name:str, args:dict): if configs["INPUT_TEXT_API"] == "type_keys": method_name = "type_keys" args = {"keys": args["text"], "pause": 0.1, "with_spaces": True} - try: - method = getattr(window, method_name) - result = method(**args) + result = atomic_execution(window, method_name, args) + if configs["INPUT_TEXT_ENTER"] and method_name in ["type_keys", "set_edit_text"]: + atomic_execution(window, "type_keys", args = {"keys": "{ENTER}"}) return result except AttributeError: return f"{window} doesn't have a method named {method_name}" From a6187d63b536d4f6692a49d5cd3e5469174ad0de Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 6 Mar 2024 20:56:09 +0800 Subject: [PATCH 131/223] api version --- ufo/config/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ufo/config/config.py b/ufo/config/config.py index 853df722..e0e8f69c 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -32,7 +32,7 @@ def load_config(config_path="ufo/config/config.yaml"): endpoint=configs["OPENAI_API_BASE"][:-1] if configs["OPENAI_API_BASE"].endswith( "/") else configs["OPENAI_API_BASE"], deployment_name=configs["AOAI_DEPLOYMENT"], - api_version="2024-02-15-preview" + api_version=configs["API_VERSION"] ) return configs From e47a9f912a62141afb479343747eeb396cd7d9e6 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 6 Mar 2024 20:56:09 +0800 Subject: [PATCH 132/223] api version --- ufo/config/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ufo/config/config.py b/ufo/config/config.py index 853df722..e0e8f69c 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -32,7 +32,7 @@ def load_config(config_path="ufo/config/config.yaml"): endpoint=configs["OPENAI_API_BASE"][:-1] if configs["OPENAI_API_BASE"].endswith( "/") else configs["OPENAI_API_BASE"], deployment_name=configs["AOAI_DEPLOYMENT"], - api_version="2024-02-15-preview" + api_version=configs["API_VERSION"] ) return configs From a6b8b3940511597ad49148bd718d03dfc9f015f0 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Fri, 8 Mar 2024 17:11:31 +0800 Subject: [PATCH 133/223] fixed comment to prerelease --- learner/xml_loader.py | 8 +- requirements.txt | 5 +- ufo/config/config.yaml.template | 4 +- ufo/llm/azure_ad.py | 14 +++- ufo/llm/llm_call.py | 5 +- ufo/llm/prompt.py | 2 +- ufo/module/flow.py | 31 ++++---- ufo/rag/retriever.py | 109 -------------------------- ufo/rag/retriever_factory.py | 132 ++++++++++++++++++++++++++++++++ ufo/rag/web_retriever.py | 3 +- ufo/ui_control/control.py | 20 ++++- ufo/ui_control/screenshot.py | 97 +++++++++++++++++++++++ 12 files changed, 292 insertions(+), 138 deletions(-) delete mode 100644 ufo/rag/retriever.py create mode 100644 ufo/rag/retriever_factory.py diff --git a/learner/xml_loader.py b/learner/xml_loader.py index 4db66e31..673ed19d 100644 --- a/learner/xml_loader.py +++ b/learner/xml_loader.py @@ -58,7 +58,13 @@ def get_microsoft_document_text(self, file: str): :param file: The file to get the text for. :return: The text for the given file. """ - return UnstructuredXMLLoader(file).load()[0].page_content + + try: + doc_text = UnstructuredXMLLoader(file).load()[0].page_content + except: + doc_text = None + + return doc_text def construct_document_list(self): diff --git a/requirements.txt b/requirements.txt index 0be2efe2..6c057ded 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,11 @@ art==6.1 colorama==0.4.6 +langchain==0.1.11 +langchain_community==0.0.27 msal==1.25.0 -openai==1.11.1 +openai==1.13.3 Pillow==10.2.0 +pywin32==304 pywinauto==0.6.8 PyYAML==6.0.1 Requests==2.31.0 diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index b9033818..cc86a9cf 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -1,10 +1,10 @@ version: 0.1 -API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. +API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, "azure_ad" for aoai aad. OPENAI_API_BASE: "YOUR_ENDPOINT" # for the OpenAI API. OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply -API_VERSION: "2024-02-15-preview" # For GPT4-visual, the value usually be the "2023-12-01-preview" +API_VERSION: "2024-02-15-preview" # "2024-02-15-preview" by default. OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key diff --git a/ufo/llm/azure_ad.py b/ufo/llm/azure_ad.py index 0c066c4f..0de09d56 100644 --- a/ufo/llm/azure_ad.py +++ b/ufo/llm/azure_ad.py @@ -4,7 +4,19 @@ from ..config.config import load_config configs = load_config() -available_models = Literal[ #only GPT4V could be used +available_models = Literal[ + "gpt-35-turbo-20220309", + "gpt-35-turbo-16k-20230613", + "gpt-35-turbo-20230613", + "gpt-35-turbo-1106", + + "gpt-4-20230321", + "gpt-4-20230613", + "gpt-4-32k-20230321", + "gpt-4-32k-20230613", + "gpt-4-1106-preview", + "gpt-4-0125-preview", + "gpt-4-visual-preview", ] diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index 2ff48817..db4ea073 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -6,6 +6,7 @@ from ..config.config import load_config from ..utils import print_with_color from .azure_ad import get_chat_completion +import json configs = load_config() @@ -58,12 +59,14 @@ def get_gptv_completion(messages, headers): temperature = configs["TEMPERATURE"], top_p = configs["TOP_P"], ) + + response_json = json.loads(response.model_dump_json()) if "error" not in response: usage = response.usage prompt_tokens = usage.prompt_tokens completion_tokens = usage.completion_tokens - response_json = response + cost = prompt_tokens / 1000 * 0.01 + completion_tokens / 1000 * 0.03 diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index 111e4e7c..ffb1c302 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -81,7 +81,7 @@ def action_selection_prompt_construction(prompt_template: str, request_history: -def retrived_documents_prompt_construction(header: str, separator: str, documents: list): +def retrived_documents_prompt_helper(header: str, separator: str, documents: list): """ Construct the prompt for retrieved documents. :param header: The header of the prompt. diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 7c03a3dd..2184306e 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -10,7 +10,7 @@ from art import text2art from pywinauto.uia_defines import NoPatternInterfaceError -from ..rag import retriever +from ..rag import retriever_factory from ..config.config import load_config from ..llm import llm_call from ..llm import prompt as prompter @@ -94,7 +94,7 @@ def process_application_selection(self, headers): except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) - print_with_color("Error occurs when calling LLM.", "red") + print_with_color("Error occurs when calling LLM: {e}".format(e=str(e)), "red") self.request_logger.info(log) self.status = "ERROR" return @@ -103,11 +103,9 @@ def process_application_selection(self, headers): self.cost += cost try: - aad = configs['API_TYPE'].lower() == 'azure_ad' - if not aad: - response_string = response["choices"][0]["message"]["content"] - else: - response_string = response.choices[0].message.content + + response_string = response["choices"][0]["message"]["content"] + response_json = json_parser(response_string) application_label = response_json["ControlLabel"] @@ -154,10 +152,12 @@ def process_application_selection(self, headers): if configs["RAG_OFFLINE_DOCS"]: print_with_color("Loading offline document indexer for {app}...".format(app=self.application), "magenta") - self.offline_doc_retriever = retriever.create_offline_doc_retriever(self.application) + offline_retriever_factory = retriever_factory.OfflineDocRetrieverFactory(self.application) + self.offline_doc_retriever = offline_retriever_factory.create_offline_doc_retriever() if configs["RAG_ONLINE_SEARCH"]: print_with_color("Creating a Bing search indexer...", "magenta") - self.online_doc_retriever = retriever.create_online_search_retriever(self.request) + offline_retriever_factory = retriever_factory.OnlineDocRetrieverFactory(self.request) + self.online_doc_retriever = offline_retriever_factory.create_online_search_retriever() time.sleep(configs["SLEEP_TIME"]) @@ -228,7 +228,7 @@ def process_action_selection(self, headers): response, cost = llm_call.get_gptv_completion(action_selection_prompt_message, headers) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": action_selection_prompt_message}) - print_with_color("Error occurs when calling LLM.", "red") + print_with_color("Error occurs when calling LLM: {e}".format(e=str(e)), "red") self.request_logger.info(log) self.status = "ERROR" time.sleep(configs["SLEEP_TIME"]) @@ -237,11 +237,8 @@ def process_action_selection(self, headers): self.cost += cost try: - aad = configs['API_TYPE'].lower() == 'azure_ad' - if not aad: - response_string = response["choices"][0]["message"]["content"] - else: - response_string = response.choices[0].message.content + + response_string = response["choices"][0]["message"]["content"] response_json = json_parser(response_string) observation = response_json["Observation"] @@ -335,12 +332,12 @@ def rag_prompt(self): retrieved_docs = "" if self.offline_doc_retriever: offline_docs = self.offline_doc_retriever.retrieve("How to {query} for {app}".format(query=self.request, app=self.application), configs["RAG_OFFLINE_DOCS_RETRIEVED_TOPK"], filter=None) - offline_docs_prompt = prompter.retrived_documents_prompt_construction("Help Documents", "Document", [doc.metadata["text"] for doc in offline_docs]) + offline_docs_prompt = prompter.retrived_documents_prompt_helper("Help Documents", "Document", [doc.metadata["text"] for doc in offline_docs]) retrieved_docs += offline_docs_prompt if self.online_doc_retriever: online_search_docs = self.online_doc_retriever.retrieve(self.request, configs["RAG_ONLINE_RETRIEVED_TOPK"], filter=None) - online_docs_prompt = prompter.retrived_documents_prompt_construction("Online Search Results", "Search Result", [doc.page_content for doc in online_search_docs]) + online_docs_prompt = prompter.retrived_documents_prompt_helper("Online Search Results", "Search Result", [doc.page_content for doc in online_search_docs]) retrieved_docs += online_docs_prompt return retrieved_docs diff --git a/ufo/rag/retriever.py b/ufo/rag/retriever.py deleted file mode 100644 index 262cce4a..00000000 --- a/ufo/rag/retriever.py +++ /dev/null @@ -1,109 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -from langchain_community.vectorstores import FAISS -from langchain_community.embeddings import HuggingFaceEmbeddings -from ..config.config import get_offline_learner_indexer_config, load_config -from ..utils import print_with_color -from . import web_retriever - - -configs = load_config() - -class Retriever: - """ - Class to retrieve documents. - """ - - def __init__(self, indexer) -> None: - self.indexer = indexer - - - def retrieve(self, query: str, top_k: int, filter=None): - """ - Retrieve the document from the given query. - :param query: The query to retrieve the document from. - :param top_k: The number of documents to retrieve. - :filter: The filter to apply to the retrieved documents. - :return: The document from the given query. - """ - return self.indexer.similarity_search(query, top_k, filter=filter) - - - -def get_offline_indexer_path(app_name: str): - """ - Get the path to the offline indexer. - :param app_name: The name of the application. - :return: The path to the offline indexer. - """ - offline_records = get_offline_learner_indexer_config() - for key in offline_records: - if key.lower() in app_name.lower(): - return offline_records[key] - - return None - - - -def load_indexer(path: str): - """ - Load the retriever. - :param path: The path to load the retriever from. - :return: The loaded retriever. - """ - - embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - db = FAISS.load_local(path, embeddings) - - return db - - - -def create_online_search_retriever(query): - """ - Create an online search indexer. - :param query: The query to create an indexer for. - :return: The created indexer. - """ - - bing_retriever = web_retriever.BingWebRetriever() - result_list = bing_retriever.search(query, top_k=configs["RAG_ONLINE_SEARCH_TOPK"]) - documents = bing_retriever.create_documents(result_list) - if len(documents) == 0: - return None - indexer = bing_retriever.create_indexer(documents) - print_with_color("Online indexer created successfully for {num} searched results.".format(num=len(documents)), "cyan") - return Retriever(indexer) - - - - -def create_offline_doc_retriever(app_name): - """ - Create an offline document indexer. - :param app_name: The name of the application to create an indexer for. - :return: The created indexer. - """ - - path = get_offline_indexer_path(app_name) - - if path: - print_with_color("Loading offline indexer from {path}...".format(path=path), "cyan") - indexer = load_indexer(path) - return Retriever(indexer) - - return None - - - - - - - - - - - - - \ No newline at end of file diff --git a/ufo/rag/retriever_factory.py b/ufo/rag/retriever_factory.py new file mode 100644 index 00000000..7201f213 --- /dev/null +++ b/ufo/rag/retriever_factory.py @@ -0,0 +1,132 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from langchain_community.vectorstores import FAISS +from langchain_community.embeddings import HuggingFaceEmbeddings +from ..config.config import get_offline_learner_indexer_config, load_config +from ..utils import print_with_color +from . import web_retriever + + +configs = load_config() + +class Retriever: + """ + Class to retrieve documents. + """ + + def __init__(self, indexer) -> None: + self.indexer = indexer + + + def retrieve(self, query: str, top_k: int, filter=None): + """ + Retrieve the document from the given query. + :param query: The query to retrieve the document from. + :param top_k: The number of documents to retrieve. + :filter: The filter to apply to the retrieved documents. + :return: The document from the given query. + """ + return self.indexer.similarity_search(query, top_k, filter=filter) + + + + +class OfflineDocRetrieverFactory: + """ + Class to create offline retrievers. + """ + def __init__(self, app_name:str) -> None: + """ + Create a new OfflineDocRetrieverFactory. + :appname: The name of the application. + """ + self.app_name = app_name + + + def get_offline_indexer_path(self): + """ + Get the path to the offline indexer. + :return: The path to the offline indexer. + """ + offline_records = get_offline_learner_indexer_config() + for key in offline_records: + if key.lower() in self.app_name.lower(): + return offline_records[key] + + return None + + + def load_indexer(self, path: str): + """ + Load the retriever. + :param path: The path to load the retriever from. + :return: The loaded retriever. + """ + + embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + db = FAISS.load_local(path, embeddings) + + return db + + + def create_offline_doc_retriever(self): + """ + Create an offline document indexer. + :return: The created indexer. + """ + + path = self.get_offline_indexer_path() + + if path: + print_with_color("Loading offline indexer from {path}...".format(path=path), "cyan") + try: + indexer = self.load_indexer(path) + return Retriever(indexer) + except: + print_with_color("Error: Failed to load offline indexer from {path}.".format(path=path), "red") + return None + + return None + + + +class OnlineDocRetrieverFactory: + """ + Class to create online retrievers. + """ + + def __init__(self, query:str) -> None: + """ + Create a new OfflineDocRetrieverFactory. + :appname: The name of the application. + """ + self.query = query + + def create_online_search_retriever(self): + """ + Create an online search indexer. + :param query: The query to create an indexer for. + """ + + bing_retriever = web_retriever.BingSearchWeb() + result_list = bing_retriever.search(self.query, top_k=configs["RAG_ONLINE_SEARCH_TOPK"]) + documents = bing_retriever.create_documents(result_list) + if len(documents) == 0: + return None + indexer = bing_retriever.create_indexer(documents) + print_with_color("Online indexer created successfully for {num} searched results.".format(num=len(documents)), "cyan") + return Retriever(indexer) + + + + + + + + + + + + + \ No newline at end of file diff --git a/ufo/rag/web_retriever.py b/ufo/rag/web_retriever.py index 71f9f328..e4c3bc85 100644 --- a/ufo/rag/web_retriever.py +++ b/ufo/rag/web_retriever.py @@ -13,7 +13,7 @@ configs = load_config() -class BingWebRetriever: +class BingSearchWeb: """ Class to retrieve web documents. """ @@ -53,6 +53,7 @@ def get_url_text(self, url: str): :param url: The URL to retrieve the web document from. :return: The web text from the given URL. """ + print(f"Getting search result for {url}") try: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' diff --git a/ufo/ui_control/control.py b/ufo/ui_control/control.py index de6013f3..39beb4c5 100644 --- a/ufo/ui_control/control.py +++ b/ufo/ui_control/control.py @@ -5,6 +5,7 @@ import time import warnings from typing import List +from ..ui_control.screenshot import TransparentBox from pywinauto import Desktop @@ -182,8 +183,13 @@ def atomic_execution(window, method_name:str, args:dict): :param args: The arguments of the method. :return: The result of the action. """ - method = getattr(window, method_name) - result = method(**args) + try: + method = getattr(window, method_name) + result = method(**args) + except AttributeError: + result = f"{window} doesn't have a method named {method_name}" + except Exception as e: + result = f"An error occurred: {e}" return result @@ -195,17 +201,23 @@ def execution(window, method_name:str, args:dict): :param args: The arguments of the method. :return: The result of the action. """ + + if method_name == "set_edit_text": if configs["INPUT_TEXT_API"] == "type_keys": method_name = "type_keys" args = {"keys": args["text"], "pause": 0.1, "with_spaces": True} try: + if configs["DRAW_RECTANGLE"]: + box = TransparentBox(box_width=2) + left, top, right, bottom = window.rectangle().left, window.rectangle().top, window.rectangle().right, window.rectangle().bottom + box.start_drawing(left, top, right, bottom, screenshot=window.capture_as_image()) result = atomic_execution(window, method_name, args) if configs["INPUT_TEXT_ENTER"] and method_name in ["type_keys", "set_edit_text"]: atomic_execution(window, "type_keys", args = {"keys": "{ENTER}"}) + if configs["DRAW_RECTANGLE"]: + box.end_drawing() return result - except AttributeError: - return f"{window} doesn't have a method named {method_name}" except Exception as e: return f"An error occurred: {e}" diff --git a/ufo/ui_control/screenshot.py b/ufo/ui_control/screenshot.py index 5784dfcc..9039c126 100644 --- a/ufo/ui_control/screenshot.py +++ b/ufo/ui_control/screenshot.py @@ -6,6 +6,30 @@ from PIL import Image, ImageDraw, ImageFont, ImageGrab from pywinauto.application import Application from pywinauto.win32structures import RECT +import win32con +import win32api +import win32gui +import win32ui + +from ..config.config import load_config +from ..utils import number_to_letter + +configs = load_config() + +def capture_screenshot(window_title:str, save_path:str, is_save:bool=True): + """ + Capture a screenshot of the window. + :param window_title: The title of the window. + :param save_path: The path to save the screenshot. + :param is_save: Whether to save the screenshot. + :return: The screenshot. + """ + app = Application(backend="uia").connect(title_re=window_title) + window = app.top_window() + screenshot = window.capture_as_image() + if is_save: + screenshot.save(save_path) + return screenshot from ..config.config import load_config from ..utils import number_to_letter @@ -199,3 +223,76 @@ def concat_images_left_right(image1_path, image2_path, output_path): result.save(output_path) return result + + +class TransparentBox: + """ + A transparent box to draw on the screen. + """ + def __init__(self, box_width=3): + """ + Create a new TransparentBox. + :param box_width: The width of the box. + """ + self.desktop = win32gui.GetDesktopWindow() + self.desktop_dc = win32gui.GetWindowDC(self.desktop) + self.dc = win32ui.CreateDCFromHandle(self.desktop_dc) + self.dc.SetMapMode(win32con.MM_TEXT) + self.pen = win32ui.CreatePen(win32con.PS_SOLID, box_width, win32api.RGB(255, 0, 0)) + self.brush = win32ui.CreateBrush(win32con.BS_NULL, 0, 0) + self.started = False + self.box_width = box_width # Store the width of the box + + def start_drawing(self, left, top, right, bottom, screenshot): + """ + Start drawing the rectangle. + :param left: The left coordinate of the rectangle. + :param top: The top coordinate of the rectangle. + :param right: The right coordinate of the rectangle. + :param bottom: The bottom coordinate of the rectangle. + :param screenshot: The screenshot to draw on. + """ + if not self.started: + self.left = left + self.top = top + self.right = right + self.bottom = bottom + # Capture a screenshot of the area where the rectangle will be drawn + self.screenshot = screenshot + self.dc.SelectObject(self.pen) + self.dc.SelectObject(self.brush) + self.dc.Rectangle((self.left + self.box_width // 2, self.top + self.box_width // 2, self.right- self.box_width // 2, self.bottom- self.box_width // 2)) + self.started = True + + def end_drawing(self): + """ + End drawing the rectangle. + """ + if self.started: + win32gui.ReleaseDC(self.desktop, self.desktop_dc) + self.dc = None + self.started = False + + # Restore the screenshot to erase the rectangle + screenshot_dc = self.screenshot.load() + self.desktop_dc = win32gui.GetWindowDC(self.desktop) + + # Set the pixels for the top and bottom borders of the rectangle + for x in range(self.left, self.right): + for y in range(self.top, self.top + self.box_width): # Iterate over the width of the box for the top border + color = screenshot_dc[x - self.left, y - self.top] + win32gui.SetPixel(self.desktop_dc, x, y, win32api.RGB(color[0], color[1], color[2])) + for y in range(self.bottom - self.box_width, self.bottom): # Iterate over the width of the box for the bottom border + color = screenshot_dc[x - self.left, y - self.top] + win32gui.SetPixel(self.desktop_dc, x, y, win32api.RGB(color[0], color[1], color[2])) + + # Set the pixels for the left and right borders of the rectangle + for y in range(self.top, self.bottom): + for x in range(self.left, self.left + self.box_width): # Iterate over the width of the box for the left border + color = screenshot_dc[x - self.left, y - self.top] + win32gui.SetPixel(self.desktop_dc, x, y, win32api.RGB(color[0], color[1], color[2])) + for x in range(self.right - self.box_width, self.right): # Iterate over the width of the box for the right border + color = screenshot_dc[x - self.left, y - self.top] + win32gui.SetPixel(self.desktop_dc, x, y, win32api.RGB(color[0], color[1], color[2])) + + win32gui.ReleaseDC(self.desktop, self.desktop_dc) From 6c00eb628b2b526a0215064521bfc32fd50c2483 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Fri, 8 Mar 2024 17:11:31 +0800 Subject: [PATCH 134/223] fixed comment to prerelease --- learner/xml_loader.py | 8 +- requirements.txt | 5 +- ufo/config/config.yaml.template | 4 +- ufo/llm/azure_ad.py | 14 +++- ufo/llm/llm_call.py | 5 +- ufo/llm/prompt.py | 2 +- ufo/module/flow.py | 31 ++++---- ufo/rag/retriever.py | 109 -------------------------- ufo/rag/retriever_factory.py | 132 ++++++++++++++++++++++++++++++++ ufo/rag/web_retriever.py | 3 +- ufo/ui_control/control.py | 20 ++++- ufo/ui_control/screenshot.py | 97 +++++++++++++++++++++++ 12 files changed, 292 insertions(+), 138 deletions(-) delete mode 100644 ufo/rag/retriever.py create mode 100644 ufo/rag/retriever_factory.py diff --git a/learner/xml_loader.py b/learner/xml_loader.py index 4db66e31..673ed19d 100644 --- a/learner/xml_loader.py +++ b/learner/xml_loader.py @@ -58,7 +58,13 @@ def get_microsoft_document_text(self, file: str): :param file: The file to get the text for. :return: The text for the given file. """ - return UnstructuredXMLLoader(file).load()[0].page_content + + try: + doc_text = UnstructuredXMLLoader(file).load()[0].page_content + except: + doc_text = None + + return doc_text def construct_document_list(self): diff --git a/requirements.txt b/requirements.txt index 0be2efe2..6c057ded 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,11 @@ art==6.1 colorama==0.4.6 +langchain==0.1.11 +langchain_community==0.0.27 msal==1.25.0 -openai==1.11.1 +openai==1.13.3 Pillow==10.2.0 +pywin32==304 pywinauto==0.6.8 PyYAML==6.0.1 Requests==2.31.0 diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index b9033818..cc86a9cf 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -1,10 +1,10 @@ version: 0.1 -API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API. +API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, "azure_ad" for aoai aad. OPENAI_API_BASE: "YOUR_ENDPOINT" # for the OpenAI API. OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply -API_VERSION: "2024-02-15-preview" # For GPT4-visual, the value usually be the "2023-12-01-preview" +API_VERSION: "2024-02-15-preview" # "2024-02-15-preview" by default. OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key diff --git a/ufo/llm/azure_ad.py b/ufo/llm/azure_ad.py index 0c066c4f..0de09d56 100644 --- a/ufo/llm/azure_ad.py +++ b/ufo/llm/azure_ad.py @@ -4,7 +4,19 @@ from ..config.config import load_config configs = load_config() -available_models = Literal[ #only GPT4V could be used +available_models = Literal[ + "gpt-35-turbo-20220309", + "gpt-35-turbo-16k-20230613", + "gpt-35-turbo-20230613", + "gpt-35-turbo-1106", + + "gpt-4-20230321", + "gpt-4-20230613", + "gpt-4-32k-20230321", + "gpt-4-32k-20230613", + "gpt-4-1106-preview", + "gpt-4-0125-preview", + "gpt-4-visual-preview", ] diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index 2ff48817..db4ea073 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -6,6 +6,7 @@ from ..config.config import load_config from ..utils import print_with_color from .azure_ad import get_chat_completion +import json configs = load_config() @@ -58,12 +59,14 @@ def get_gptv_completion(messages, headers): temperature = configs["TEMPERATURE"], top_p = configs["TOP_P"], ) + + response_json = json.loads(response.model_dump_json()) if "error" not in response: usage = response.usage prompt_tokens = usage.prompt_tokens completion_tokens = usage.completion_tokens - response_json = response + cost = prompt_tokens / 1000 * 0.01 + completion_tokens / 1000 * 0.03 diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index 111e4e7c..ffb1c302 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -81,7 +81,7 @@ def action_selection_prompt_construction(prompt_template: str, request_history: -def retrived_documents_prompt_construction(header: str, separator: str, documents: list): +def retrived_documents_prompt_helper(header: str, separator: str, documents: list): """ Construct the prompt for retrieved documents. :param header: The header of the prompt. diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 7c03a3dd..2184306e 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -10,7 +10,7 @@ from art import text2art from pywinauto.uia_defines import NoPatternInterfaceError -from ..rag import retriever +from ..rag import retriever_factory from ..config.config import load_config from ..llm import llm_call from ..llm import prompt as prompter @@ -94,7 +94,7 @@ def process_application_selection(self, headers): except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) - print_with_color("Error occurs when calling LLM.", "red") + print_with_color("Error occurs when calling LLM: {e}".format(e=str(e)), "red") self.request_logger.info(log) self.status = "ERROR" return @@ -103,11 +103,9 @@ def process_application_selection(self, headers): self.cost += cost try: - aad = configs['API_TYPE'].lower() == 'azure_ad' - if not aad: - response_string = response["choices"][0]["message"]["content"] - else: - response_string = response.choices[0].message.content + + response_string = response["choices"][0]["message"]["content"] + response_json = json_parser(response_string) application_label = response_json["ControlLabel"] @@ -154,10 +152,12 @@ def process_application_selection(self, headers): if configs["RAG_OFFLINE_DOCS"]: print_with_color("Loading offline document indexer for {app}...".format(app=self.application), "magenta") - self.offline_doc_retriever = retriever.create_offline_doc_retriever(self.application) + offline_retriever_factory = retriever_factory.OfflineDocRetrieverFactory(self.application) + self.offline_doc_retriever = offline_retriever_factory.create_offline_doc_retriever() if configs["RAG_ONLINE_SEARCH"]: print_with_color("Creating a Bing search indexer...", "magenta") - self.online_doc_retriever = retriever.create_online_search_retriever(self.request) + offline_retriever_factory = retriever_factory.OnlineDocRetrieverFactory(self.request) + self.online_doc_retriever = offline_retriever_factory.create_online_search_retriever() time.sleep(configs["SLEEP_TIME"]) @@ -228,7 +228,7 @@ def process_action_selection(self, headers): response, cost = llm_call.get_gptv_completion(action_selection_prompt_message, headers) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": action_selection_prompt_message}) - print_with_color("Error occurs when calling LLM.", "red") + print_with_color("Error occurs when calling LLM: {e}".format(e=str(e)), "red") self.request_logger.info(log) self.status = "ERROR" time.sleep(configs["SLEEP_TIME"]) @@ -237,11 +237,8 @@ def process_action_selection(self, headers): self.cost += cost try: - aad = configs['API_TYPE'].lower() == 'azure_ad' - if not aad: - response_string = response["choices"][0]["message"]["content"] - else: - response_string = response.choices[0].message.content + + response_string = response["choices"][0]["message"]["content"] response_json = json_parser(response_string) observation = response_json["Observation"] @@ -335,12 +332,12 @@ def rag_prompt(self): retrieved_docs = "" if self.offline_doc_retriever: offline_docs = self.offline_doc_retriever.retrieve("How to {query} for {app}".format(query=self.request, app=self.application), configs["RAG_OFFLINE_DOCS_RETRIEVED_TOPK"], filter=None) - offline_docs_prompt = prompter.retrived_documents_prompt_construction("Help Documents", "Document", [doc.metadata["text"] for doc in offline_docs]) + offline_docs_prompt = prompter.retrived_documents_prompt_helper("Help Documents", "Document", [doc.metadata["text"] for doc in offline_docs]) retrieved_docs += offline_docs_prompt if self.online_doc_retriever: online_search_docs = self.online_doc_retriever.retrieve(self.request, configs["RAG_ONLINE_RETRIEVED_TOPK"], filter=None) - online_docs_prompt = prompter.retrived_documents_prompt_construction("Online Search Results", "Search Result", [doc.page_content for doc in online_search_docs]) + online_docs_prompt = prompter.retrived_documents_prompt_helper("Online Search Results", "Search Result", [doc.page_content for doc in online_search_docs]) retrieved_docs += online_docs_prompt return retrieved_docs diff --git a/ufo/rag/retriever.py b/ufo/rag/retriever.py deleted file mode 100644 index 262cce4a..00000000 --- a/ufo/rag/retriever.py +++ /dev/null @@ -1,109 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -from langchain_community.vectorstores import FAISS -from langchain_community.embeddings import HuggingFaceEmbeddings -from ..config.config import get_offline_learner_indexer_config, load_config -from ..utils import print_with_color -from . import web_retriever - - -configs = load_config() - -class Retriever: - """ - Class to retrieve documents. - """ - - def __init__(self, indexer) -> None: - self.indexer = indexer - - - def retrieve(self, query: str, top_k: int, filter=None): - """ - Retrieve the document from the given query. - :param query: The query to retrieve the document from. - :param top_k: The number of documents to retrieve. - :filter: The filter to apply to the retrieved documents. - :return: The document from the given query. - """ - return self.indexer.similarity_search(query, top_k, filter=filter) - - - -def get_offline_indexer_path(app_name: str): - """ - Get the path to the offline indexer. - :param app_name: The name of the application. - :return: The path to the offline indexer. - """ - offline_records = get_offline_learner_indexer_config() - for key in offline_records: - if key.lower() in app_name.lower(): - return offline_records[key] - - return None - - - -def load_indexer(path: str): - """ - Load the retriever. - :param path: The path to load the retriever from. - :return: The loaded retriever. - """ - - embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - db = FAISS.load_local(path, embeddings) - - return db - - - -def create_online_search_retriever(query): - """ - Create an online search indexer. - :param query: The query to create an indexer for. - :return: The created indexer. - """ - - bing_retriever = web_retriever.BingWebRetriever() - result_list = bing_retriever.search(query, top_k=configs["RAG_ONLINE_SEARCH_TOPK"]) - documents = bing_retriever.create_documents(result_list) - if len(documents) == 0: - return None - indexer = bing_retriever.create_indexer(documents) - print_with_color("Online indexer created successfully for {num} searched results.".format(num=len(documents)), "cyan") - return Retriever(indexer) - - - - -def create_offline_doc_retriever(app_name): - """ - Create an offline document indexer. - :param app_name: The name of the application to create an indexer for. - :return: The created indexer. - """ - - path = get_offline_indexer_path(app_name) - - if path: - print_with_color("Loading offline indexer from {path}...".format(path=path), "cyan") - indexer = load_indexer(path) - return Retriever(indexer) - - return None - - - - - - - - - - - - - \ No newline at end of file diff --git a/ufo/rag/retriever_factory.py b/ufo/rag/retriever_factory.py new file mode 100644 index 00000000..7201f213 --- /dev/null +++ b/ufo/rag/retriever_factory.py @@ -0,0 +1,132 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from langchain_community.vectorstores import FAISS +from langchain_community.embeddings import HuggingFaceEmbeddings +from ..config.config import get_offline_learner_indexer_config, load_config +from ..utils import print_with_color +from . import web_retriever + + +configs = load_config() + +class Retriever: + """ + Class to retrieve documents. + """ + + def __init__(self, indexer) -> None: + self.indexer = indexer + + + def retrieve(self, query: str, top_k: int, filter=None): + """ + Retrieve the document from the given query. + :param query: The query to retrieve the document from. + :param top_k: The number of documents to retrieve. + :filter: The filter to apply to the retrieved documents. + :return: The document from the given query. + """ + return self.indexer.similarity_search(query, top_k, filter=filter) + + + + +class OfflineDocRetrieverFactory: + """ + Class to create offline retrievers. + """ + def __init__(self, app_name:str) -> None: + """ + Create a new OfflineDocRetrieverFactory. + :appname: The name of the application. + """ + self.app_name = app_name + + + def get_offline_indexer_path(self): + """ + Get the path to the offline indexer. + :return: The path to the offline indexer. + """ + offline_records = get_offline_learner_indexer_config() + for key in offline_records: + if key.lower() in self.app_name.lower(): + return offline_records[key] + + return None + + + def load_indexer(self, path: str): + """ + Load the retriever. + :param path: The path to load the retriever from. + :return: The loaded retriever. + """ + + embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + db = FAISS.load_local(path, embeddings) + + return db + + + def create_offline_doc_retriever(self): + """ + Create an offline document indexer. + :return: The created indexer. + """ + + path = self.get_offline_indexer_path() + + if path: + print_with_color("Loading offline indexer from {path}...".format(path=path), "cyan") + try: + indexer = self.load_indexer(path) + return Retriever(indexer) + except: + print_with_color("Error: Failed to load offline indexer from {path}.".format(path=path), "red") + return None + + return None + + + +class OnlineDocRetrieverFactory: + """ + Class to create online retrievers. + """ + + def __init__(self, query:str) -> None: + """ + Create a new OfflineDocRetrieverFactory. + :appname: The name of the application. + """ + self.query = query + + def create_online_search_retriever(self): + """ + Create an online search indexer. + :param query: The query to create an indexer for. + """ + + bing_retriever = web_retriever.BingSearchWeb() + result_list = bing_retriever.search(self.query, top_k=configs["RAG_ONLINE_SEARCH_TOPK"]) + documents = bing_retriever.create_documents(result_list) + if len(documents) == 0: + return None + indexer = bing_retriever.create_indexer(documents) + print_with_color("Online indexer created successfully for {num} searched results.".format(num=len(documents)), "cyan") + return Retriever(indexer) + + + + + + + + + + + + + \ No newline at end of file diff --git a/ufo/rag/web_retriever.py b/ufo/rag/web_retriever.py index 71f9f328..e4c3bc85 100644 --- a/ufo/rag/web_retriever.py +++ b/ufo/rag/web_retriever.py @@ -13,7 +13,7 @@ configs = load_config() -class BingWebRetriever: +class BingSearchWeb: """ Class to retrieve web documents. """ @@ -53,6 +53,7 @@ def get_url_text(self, url: str): :param url: The URL to retrieve the web document from. :return: The web text from the given URL. """ + print(f"Getting search result for {url}") try: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' diff --git a/ufo/ui_control/control.py b/ufo/ui_control/control.py index de6013f3..39beb4c5 100644 --- a/ufo/ui_control/control.py +++ b/ufo/ui_control/control.py @@ -5,6 +5,7 @@ import time import warnings from typing import List +from ..ui_control.screenshot import TransparentBox from pywinauto import Desktop @@ -182,8 +183,13 @@ def atomic_execution(window, method_name:str, args:dict): :param args: The arguments of the method. :return: The result of the action. """ - method = getattr(window, method_name) - result = method(**args) + try: + method = getattr(window, method_name) + result = method(**args) + except AttributeError: + result = f"{window} doesn't have a method named {method_name}" + except Exception as e: + result = f"An error occurred: {e}" return result @@ -195,17 +201,23 @@ def execution(window, method_name:str, args:dict): :param args: The arguments of the method. :return: The result of the action. """ + + if method_name == "set_edit_text": if configs["INPUT_TEXT_API"] == "type_keys": method_name = "type_keys" args = {"keys": args["text"], "pause": 0.1, "with_spaces": True} try: + if configs["DRAW_RECTANGLE"]: + box = TransparentBox(box_width=2) + left, top, right, bottom = window.rectangle().left, window.rectangle().top, window.rectangle().right, window.rectangle().bottom + box.start_drawing(left, top, right, bottom, screenshot=window.capture_as_image()) result = atomic_execution(window, method_name, args) if configs["INPUT_TEXT_ENTER"] and method_name in ["type_keys", "set_edit_text"]: atomic_execution(window, "type_keys", args = {"keys": "{ENTER}"}) + if configs["DRAW_RECTANGLE"]: + box.end_drawing() return result - except AttributeError: - return f"{window} doesn't have a method named {method_name}" except Exception as e: return f"An error occurred: {e}" diff --git a/ufo/ui_control/screenshot.py b/ufo/ui_control/screenshot.py index 5784dfcc..9039c126 100644 --- a/ufo/ui_control/screenshot.py +++ b/ufo/ui_control/screenshot.py @@ -6,6 +6,30 @@ from PIL import Image, ImageDraw, ImageFont, ImageGrab from pywinauto.application import Application from pywinauto.win32structures import RECT +import win32con +import win32api +import win32gui +import win32ui + +from ..config.config import load_config +from ..utils import number_to_letter + +configs = load_config() + +def capture_screenshot(window_title:str, save_path:str, is_save:bool=True): + """ + Capture a screenshot of the window. + :param window_title: The title of the window. + :param save_path: The path to save the screenshot. + :param is_save: Whether to save the screenshot. + :return: The screenshot. + """ + app = Application(backend="uia").connect(title_re=window_title) + window = app.top_window() + screenshot = window.capture_as_image() + if is_save: + screenshot.save(save_path) + return screenshot from ..config.config import load_config from ..utils import number_to_letter @@ -199,3 +223,76 @@ def concat_images_left_right(image1_path, image2_path, output_path): result.save(output_path) return result + + +class TransparentBox: + """ + A transparent box to draw on the screen. + """ + def __init__(self, box_width=3): + """ + Create a new TransparentBox. + :param box_width: The width of the box. + """ + self.desktop = win32gui.GetDesktopWindow() + self.desktop_dc = win32gui.GetWindowDC(self.desktop) + self.dc = win32ui.CreateDCFromHandle(self.desktop_dc) + self.dc.SetMapMode(win32con.MM_TEXT) + self.pen = win32ui.CreatePen(win32con.PS_SOLID, box_width, win32api.RGB(255, 0, 0)) + self.brush = win32ui.CreateBrush(win32con.BS_NULL, 0, 0) + self.started = False + self.box_width = box_width # Store the width of the box + + def start_drawing(self, left, top, right, bottom, screenshot): + """ + Start drawing the rectangle. + :param left: The left coordinate of the rectangle. + :param top: The top coordinate of the rectangle. + :param right: The right coordinate of the rectangle. + :param bottom: The bottom coordinate of the rectangle. + :param screenshot: The screenshot to draw on. + """ + if not self.started: + self.left = left + self.top = top + self.right = right + self.bottom = bottom + # Capture a screenshot of the area where the rectangle will be drawn + self.screenshot = screenshot + self.dc.SelectObject(self.pen) + self.dc.SelectObject(self.brush) + self.dc.Rectangle((self.left + self.box_width // 2, self.top + self.box_width // 2, self.right- self.box_width // 2, self.bottom- self.box_width // 2)) + self.started = True + + def end_drawing(self): + """ + End drawing the rectangle. + """ + if self.started: + win32gui.ReleaseDC(self.desktop, self.desktop_dc) + self.dc = None + self.started = False + + # Restore the screenshot to erase the rectangle + screenshot_dc = self.screenshot.load() + self.desktop_dc = win32gui.GetWindowDC(self.desktop) + + # Set the pixels for the top and bottom borders of the rectangle + for x in range(self.left, self.right): + for y in range(self.top, self.top + self.box_width): # Iterate over the width of the box for the top border + color = screenshot_dc[x - self.left, y - self.top] + win32gui.SetPixel(self.desktop_dc, x, y, win32api.RGB(color[0], color[1], color[2])) + for y in range(self.bottom - self.box_width, self.bottom): # Iterate over the width of the box for the bottom border + color = screenshot_dc[x - self.left, y - self.top] + win32gui.SetPixel(self.desktop_dc, x, y, win32api.RGB(color[0], color[1], color[2])) + + # Set the pixels for the left and right borders of the rectangle + for y in range(self.top, self.bottom): + for x in range(self.left, self.left + self.box_width): # Iterate over the width of the box for the left border + color = screenshot_dc[x - self.left, y - self.top] + win32gui.SetPixel(self.desktop_dc, x, y, win32api.RGB(color[0], color[1], color[2])) + for x in range(self.right - self.box_width, self.right): # Iterate over the width of the box for the right border + color = screenshot_dc[x - self.left, y - self.top] + win32gui.SetPixel(self.desktop_dc, x, y, win32api.RGB(color[0], color[1], color[2])) + + win32gui.ReleaseDC(self.desktop, self.desktop_dc) From 5dfd302c53cd0036c28bf030b41d202738f494c0 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Fri, 8 Mar 2024 17:26:03 +0800 Subject: [PATCH 135/223] fixed comment to prerelease --- ufo/ui_control/control.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/ufo/ui_control/control.py b/ufo/ui_control/control.py index 39beb4c5..199f3eb9 100644 --- a/ufo/ui_control/control.py +++ b/ufo/ui_control/control.py @@ -5,7 +5,6 @@ import time import warnings from typing import List -from ..ui_control.screenshot import TransparentBox from pywinauto import Desktop @@ -208,15 +207,9 @@ def execution(window, method_name:str, args:dict): method_name = "type_keys" args = {"keys": args["text"], "pause": 0.1, "with_spaces": True} try: - if configs["DRAW_RECTANGLE"]: - box = TransparentBox(box_width=2) - left, top, right, bottom = window.rectangle().left, window.rectangle().top, window.rectangle().right, window.rectangle().bottom - box.start_drawing(left, top, right, bottom, screenshot=window.capture_as_image()) result = atomic_execution(window, method_name, args) if configs["INPUT_TEXT_ENTER"] and method_name in ["type_keys", "set_edit_text"]: atomic_execution(window, "type_keys", args = {"keys": "{ENTER}"}) - if configs["DRAW_RECTANGLE"]: - box.end_drawing() return result except Exception as e: return f"An error occurred: {e}" From 686062a8db2711b832f2e14bc857ca15c6519ed0 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Fri, 8 Mar 2024 17:26:03 +0800 Subject: [PATCH 136/223] fixed comment to prerelease --- ufo/ui_control/control.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/ufo/ui_control/control.py b/ufo/ui_control/control.py index 39beb4c5..199f3eb9 100644 --- a/ufo/ui_control/control.py +++ b/ufo/ui_control/control.py @@ -5,7 +5,6 @@ import time import warnings from typing import List -from ..ui_control.screenshot import TransparentBox from pywinauto import Desktop @@ -208,15 +207,9 @@ def execution(window, method_name:str, args:dict): method_name = "type_keys" args = {"keys": args["text"], "pause": 0.1, "with_spaces": True} try: - if configs["DRAW_RECTANGLE"]: - box = TransparentBox(box_width=2) - left, top, right, bottom = window.rectangle().left, window.rectangle().top, window.rectangle().right, window.rectangle().bottom - box.start_drawing(left, top, right, bottom, screenshot=window.capture_as_image()) result = atomic_execution(window, method_name, args) if configs["INPUT_TEXT_ENTER"] and method_name in ["type_keys", "set_edit_text"]: atomic_execution(window, "type_keys", args = {"keys": "{ENTER}"}) - if configs["DRAW_RECTANGLE"]: - box.end_drawing() return result except Exception as e: return f"An error occurred: {e}" From bdc33b81687081008634346e6c63b4ccdf021e0a Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Fri, 8 Mar 2024 18:01:51 +0800 Subject: [PATCH 137/223] fix bug in aad --- ufo/llm/llm_call.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index db4ea073..a5fcb5ab 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -59,24 +59,21 @@ def get_gptv_completion(messages, headers): temperature = configs["TEMPERATURE"], top_p = configs["TOP_P"], ) - response_json = json.loads(response.model_dump_json()) - if "error" not in response: + if "error" not in response_json: usage = response.usage prompt_tokens = usage.prompt_tokens completion_tokens = usage.completion_tokens - cost = prompt_tokens / 1000 * 0.01 + completion_tokens / 1000 * 0.03 return response_json, cost - except requests.RequestException as e: + except Exception as e: print_with_color(f"Error making API request: {e}", "red") - print_with_color(str(response_json), "red") try: - print_with_color(response.json(), "red") + print_with_color(response_json, "red") except: - _ - time.sleep(3) + pass + time.sleep(5) continue From fe3621dae714db0d16207da4704db7623d11613d Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Fri, 8 Mar 2024 18:01:51 +0800 Subject: [PATCH 138/223] fix bug in aad --- ufo/llm/llm_call.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index db4ea073..a5fcb5ab 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -59,24 +59,21 @@ def get_gptv_completion(messages, headers): temperature = configs["TEMPERATURE"], top_p = configs["TOP_P"], ) - response_json = json.loads(response.model_dump_json()) - if "error" not in response: + if "error" not in response_json: usage = response.usage prompt_tokens = usage.prompt_tokens completion_tokens = usage.completion_tokens - cost = prompt_tokens / 1000 * 0.01 + completion_tokens / 1000 * 0.03 return response_json, cost - except requests.RequestException as e: + except Exception as e: print_with_color(f"Error making API request: {e}", "red") - print_with_color(str(response_json), "red") try: - print_with_color(response.json(), "red") + print_with_color(response_json, "red") except: - _ - time.sleep(3) + pass + time.sleep(5) continue From d134e079232ce1ae03b708fa782fefb0a68b42cd Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 9 Mar 2024 21:36:51 +0800 Subject: [PATCH 139/223] readme for offline learner --- .gitignore | 2 +- README.md | 13 +-- learner/README.md | 32 ++++++ learner/doc_example/ppt-copilot.xml | 109 +++++++++++++++++++++ learner/doc_example/ppt-copilot.xml.meta | 5 + ufo/prompts/base/action_selection_rag.yaml | 31 ++++++ ufo/prompts/base/app_selection.yaml | 28 ++++++ 7 files changed, 208 insertions(+), 12 deletions(-) create mode 100644 learner/README.md create mode 100644 learner/doc_example/ppt-copilot.xml create mode 100644 learner/doc_example/ppt-copilot.xml.meta diff --git a/.gitignore b/.gitignore index efe4d12f..3ffc476a 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,4 @@ ufo/config/config.yaml # Ignore the helper files ufo/rag/app_docs/* learner/records.json -vectordb/* +vectordb/docs/* diff --git a/README.md b/README.md index ccab5b15..703fb3d4 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th ## 📢 News +- 📅 2024-03-XX: Our UFO framework now support RAG from offline document and online Bing search. - 📅 2024-02-14: Our [technical report](https://arxiv.org/abs/2402.07939) is online! - 📅 2024-02-10: UFO is released on GitHub🎈. Happy Chinese New year🐉! @@ -65,7 +66,7 @@ pip install -r requirements.txt ``` ### ⚙️ Step 2: Configure the LLMs -Before running UFO, you need to provide your LLM configurations. You can configure `ufo/config/config.yaml` file as follows. +Before running UFO, you need to provide your LLM configurations. You can configure create a config file `ufo/config/config.yaml` by copying the `ufo/config/config.yaml.template` edited as follows. #### OpenAI ``` @@ -83,16 +84,6 @@ OPENAI_API_KEY: "YOUR_API_KEY" # Set the value to the openai key for the llm mo OPENAI_API_MODEL: "GPTV_MODEL_NAME" # The only OpenAI model by now that accepts visual input ``` -#### AAD application auth -``` -API_TYPE: "azure_ad" -OPENAI_API_BASE: "YOUR_ENDPOINT" # The AAD API address. Format: https://{your-resource-name}.azure-api.net/ -API_VERSION: "API-VERSION" #For GPT4-visual, the value usually be the "2023-12-01-preview" -OPENAI_API_MODEL: "GPTV_MODEL_NAME" # The only OpenAI model by now that accepts visual input -AAD_TENANT_ID: "YOUR_TENANT_ID" #Set the value to your tenant id for the llm model -AAD_API_SCOPE: "YOUR_SCOPE" #Set the value to your scope for the llm model -AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" #Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE -``` ### 🎉 Step 3: Start UFO diff --git a/learner/README.md b/learner/README.md new file mode 100644 index 00000000..621c5427 --- /dev/null +++ b/learner/README.md @@ -0,0 +1,32 @@ +

+ Enhancing UFO with RAG using Offline Help Documents +

+ +## How to Prepare Your Help Documents ❓ + +### Step 1: Prepare Your Help Doc and Metadata + +UFO currently supports processing help documents in XML format, as this is the default format for official help documents of Microsoft apps. More formats will be supported in the future. + +You can write a dedicated document for a specific task of an app in a file named, for example, `task.xml`. Note that it should be accompanied by a metadata file with the same prefix, but with the `.meta` extension, i.e., `task.xml.meta`. This metadata file should have a `title` describing the task at a high level and a `Content-Summary` field summarizing the content of the help document. These two files are used for similarity search with user requests, so please write them carefully. The [ppt-copilot.xml](./doc_example/ppt-copilot.xml) and [ppt-copilot.xml.meta](./doc_example/ppt-copilot.xml.meta) are examples of a help document and its metadata. + +### Step 2: Prepare Your Help Document Set + +Once you have all help documents and metadata ready, put all of them into a folder. There can be sub-folders for the help documents, but please ensure that each help document and its corresponding metadata **are placed in the same directory**. + + +## How to Create an Indexer for Your Help Document Set ❓ + + +Once you have all documents ready in a folder named `path_of_the_docs`, you can easily create an offline indexer to support RAG for UFO. Follow these steps: + +```console +# assume you are in the cloned UFO folder +python -m learner --app --docs +``` +Replace `app_name` with the name of the application, such as PowerPoint or WeChat. +> Note: Ensure the `app_name` is accurately defined as it is used to match the offline indexer in online RAG. + +Replace `path_of_the_docs` with the full path to the folder containing all your documents. + +This command will create an offline indexer for all documents in the `path_of_the_docs` folder using Faiss and embedding with sentence transformer (more embeddings will be supported soon). The created index by default will be placed [here](../vectordb/docs/). diff --git a/learner/doc_example/ppt-copilot.xml b/learner/doc_example/ppt-copilot.xml new file mode 100644 index 00000000..2d910270 --- /dev/null +++ b/learner/doc_example/ppt-copilot.xml @@ -0,0 +1,109 @@ + + + + + Copilot in PowerPoint_generic is an AI-powered feature that can help you create, design, and format your slides.  You can type in what you intend to convey with your presentation, and copilot will help you get it done.  + copilot can help you move past that initial blank slide and get you moving in the right direction. + +
+ Create a new presentation + + + + This feature is available to customers with a Copilot for Microsoft 365 license or Copilot Pro license. + + When you start a new presentation, you can have copilot create a first draft for you. Select Copilot on the ribbon to launch the copilot pane, then tell it what you want or use the suggested prompts. For example, you could enter "Create a presentation about the history of soccer," and it will get that started for you. + + Want to use a template for your presentation? Create your presentation from a template or open your .potx file first, then ask Copilot to create your presentation. + + For more information, see Create a new presentation. + +
+
+ Create from a document + + + + This feature is only available to customers with a Copilot for Microsoft 365 license. + + If you have a Word document prepared that contains your intended content, you can provide that as the basis for your new presentation. Open the copilot pane and type or select Create presentation from file in the suggested prompt menu. Tell copilot what Word document you want to make a presentation from by typing to search your files or by pasting the URL of your Word document, and copilot will create a draft presentation from that document. + + You can open the copilot pane at any time. Just select the copilot button  on the Home tab of the ribbon. + + +
+
+ Try a new design + + + Do you want to change the style of an existing presentation or a new presentation created with Copilot? Open the copilot pane and ask copilot to Try a new design. copilot will change the theme of your entire presentation. You can try this multiple times until you find something you like. + +
+
+ Add a slide - or just an image + + + + This feature is available to customers with a Copilot for Microsoft 365 license or Copilot Pro license. + + Imagine that you want to add a slide to your deck on the history of soccer.  You can instruct copilot to “Add a slide about the history of Women’s Olympic Soccer,” and copilot will create the slide for you. + + copilot can help make your great work even better. Suppose you've created a presentation on a new location you're opening, but it still lacks imagery. You could prompt copilot to “Add an image of a store under construction,” and copilot will insert a picture to make your presentation more appealing.  + For more information, see Add a slide or image. + +
+
+ Organize your presentation + + + + This feature is available to customers with a Copilot for Microsoft 365 license or Copilot Pro license. + + Wondering if there's a better way to present your content? Open the copilot pane and ask copilot to Organize this presentation. copilot will add sections and create some section summary slides as well. + For more information, see Organize this presentation. + +
+
+ Summarize a presentation + + + + This feature is available to customers with a Copilot for Microsoft 365 license or Copilot Pro license. + + Somebody share a long slide deck with you and you need to get the main points quicky? Open the copilot pane and ask it to Summarize this presentation. copilot will read through the deck for you and break out the main ideas as bullet points. + For more information, see Summarize your presentation. + +
+
+ Current limitations + + + copilot in PowerPoint_generic doesn't currently support referencing organizational assets in Microsoft 365. + +
+
+ Keep in mind... + + + copilot leverages GPT, a new AI system from OpenAI that creates text based on a prompt. As it is a new system, it may create things you didn’t expect. If you find content to be unexpected or offensive, send us feedback so we can make it better. Also, because the content is generated by AI that draws from the internet, it may contain inaccuracies or sensitive material. Be sure to review and verify the information that it generates. And note that similar requests may result in the same content being generated.  + +
+
+ We want to hear from you! + + + If there's something you like about copilot, and especially if there's something you don't like, you can submit feedback to Microsoft. Just click the thumbs up or thumbs down button underneath the copilot chat box. This feedback will be used to help us improve your experience in PowerPoint_generic + +
+
+ Learn more + + + Microsoft Copilot help & learninghttps://support.microsoft.com/copilot + Frequently Asked Questions about Copilot in PowerPoint + Where can I get Microsoft Copilot? + Data, Privacy, and Security for Microsoft Copilot for Microsoft 365https://learn.microsoft.com/microsoft-365-copilot/microsoft-365-copilot-privacy + +
+ +
\ No newline at end of file diff --git a/learner/doc_example/ppt-copilot.xml.meta b/learner/doc_example/ppt-copilot.xml.meta new file mode 100644 index 00000000..a25bd3e3 --- /dev/null +++ b/learner/doc_example/ppt-copilot.xml.meta @@ -0,0 +1,5 @@ + + + Welcome to Copilot in PowerPoint + + \ No newline at end of file diff --git a/ufo/prompts/base/action_selection_rag.yaml b/ufo/prompts/base/action_selection_rag.yaml index 9ee85d54..6df56591 100644 --- a/ufo/prompts/base/action_selection_rag.yaml +++ b/ufo/prompts/base/action_selection_rag.yaml @@ -154,6 +154,7 @@ system: |- - Do not take action if the current action need further input. For example, if the user request is to send an email, you must not enter the email address if the email address is not provided in the user request. - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. + - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word documents. - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current screenshots and control item list to make the decision. @@ -292,6 +293,36 @@ system: |- "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} + - Example 10: + User Request: + "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows that I am on the Microsoft PowerPoint application. The Copilot Add-in is visible in the screenshot.", + "Thought": "I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx.", + "ControlLabel": "60", + "ControlText": "Copilot", + "Function": "click_input", + "Args": {"button": "left", "double": true}, + "Status": "CONTINUE", + "Plan": "(1) Click the 'Create presentation from file' button to open a file picker. \\n (2) Select and click the meeting_notes.docx file in the file picker. \\n (3) Click the 'Send' buttom to send the request to Copilot. This completes the task.", + "Comment": "I need use the Copilot Add-in to create a slide from the meeting_notes.docx."} + + - Example 11: + User Request: + "Please @Zac to revise the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", + "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", + "ControlLabel": "42", + "ControlText": "Insert", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Click the Comment button to open the comment text box. \\n (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", + "Comment": "I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + + + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. diff --git a/ufo/prompts/base/app_selection.yaml b/ufo/prompts/base/app_selection.yaml index 013e4894..6db8084e 100644 --- a/ufo/prompts/base/app_selection.yaml +++ b/ufo/prompts/base/app_selection.yaml @@ -65,6 +65,7 @@ system: |- - If the user request is just asking question and do not need to take action on the application, you should answer the user request on the "Comment" field, and set the "Status" as "FINISH". - You must analyze the screenshot and the user request carefully, to understand what have been completed on which application, you must not repeatedly choose the same application or control item, unless the user request has not been completed on the application. - In your response, the control text of the selected application must strictly match its control label. + - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. - You must to strictly follow the instruction and the JSON format of the response. - Below are two example of the response. You can refer to them as a reference. @@ -184,6 +185,33 @@ system: |- "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} + - Example 10: + User Request: + "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Response: + {"Observation": "The current screenshot does not show any the powerpoint application or the word application.", + "Thought": "I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application.", + "ControlLabel": "4", + "ControlText": "presentation1 - PowerPoint", + "Status": "CONTINUE", + "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. \\n (3) Click the 'Create presentation from file' button to open a file picker. \\n (4) Select and click the meeting_notes.docx file in the file picker. \\n (5) Click the 'Send' buttom to send the request to Copilot. This completes the task.", + "Comment": "I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx."} + + - Example 11: + User Request: + "Please @Zac to revise the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", + "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", + "ControlLabel": "4", + "ControlText": "presentation1 - PowerPoint, + "Status": "CONTINUE", + "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Click the Insert Button to open the Insert menu. \\n (3) Click the Comment button to open the comment text box. \\n (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", + "Comment": "I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + + + + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Otherwise it will crash the system. From 4098a7537ee3af5f7c712da75dc43b876029eb17 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 9 Mar 2024 21:36:51 +0800 Subject: [PATCH 140/223] readme for offline learner --- .gitignore | 2 +- README.md | 13 +-- learner/README.md | 32 ++++++ learner/doc_example/ppt-copilot.xml | 109 +++++++++++++++++++++ learner/doc_example/ppt-copilot.xml.meta | 5 + ufo/prompts/base/action_selection_rag.yaml | 31 ++++++ ufo/prompts/base/app_selection.yaml | 28 ++++++ 7 files changed, 208 insertions(+), 12 deletions(-) create mode 100644 learner/README.md create mode 100644 learner/doc_example/ppt-copilot.xml create mode 100644 learner/doc_example/ppt-copilot.xml.meta diff --git a/.gitignore b/.gitignore index efe4d12f..3ffc476a 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,4 @@ ufo/config/config.yaml # Ignore the helper files ufo/rag/app_docs/* learner/records.json -vectordb/* +vectordb/docs/* diff --git a/README.md b/README.md index ccab5b15..703fb3d4 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th ## 📢 News +- 📅 2024-03-XX: Our UFO framework now support RAG from offline document and online Bing search. - 📅 2024-02-14: Our [technical report](https://arxiv.org/abs/2402.07939) is online! - 📅 2024-02-10: UFO is released on GitHub🎈. Happy Chinese New year🐉! @@ -65,7 +66,7 @@ pip install -r requirements.txt ``` ### ⚙️ Step 2: Configure the LLMs -Before running UFO, you need to provide your LLM configurations. You can configure `ufo/config/config.yaml` file as follows. +Before running UFO, you need to provide your LLM configurations. You can configure create a config file `ufo/config/config.yaml` by copying the `ufo/config/config.yaml.template` edited as follows. #### OpenAI ``` @@ -83,16 +84,6 @@ OPENAI_API_KEY: "YOUR_API_KEY" # Set the value to the openai key for the llm mo OPENAI_API_MODEL: "GPTV_MODEL_NAME" # The only OpenAI model by now that accepts visual input ``` -#### AAD application auth -``` -API_TYPE: "azure_ad" -OPENAI_API_BASE: "YOUR_ENDPOINT" # The AAD API address. Format: https://{your-resource-name}.azure-api.net/ -API_VERSION: "API-VERSION" #For GPT4-visual, the value usually be the "2023-12-01-preview" -OPENAI_API_MODEL: "GPTV_MODEL_NAME" # The only OpenAI model by now that accepts visual input -AAD_TENANT_ID: "YOUR_TENANT_ID" #Set the value to your tenant id for the llm model -AAD_API_SCOPE: "YOUR_SCOPE" #Set the value to your scope for the llm model -AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" #Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE -``` ### 🎉 Step 3: Start UFO diff --git a/learner/README.md b/learner/README.md new file mode 100644 index 00000000..621c5427 --- /dev/null +++ b/learner/README.md @@ -0,0 +1,32 @@ +

+ Enhancing UFO with RAG using Offline Help Documents +

+ +## How to Prepare Your Help Documents ❓ + +### Step 1: Prepare Your Help Doc and Metadata + +UFO currently supports processing help documents in XML format, as this is the default format for official help documents of Microsoft apps. More formats will be supported in the future. + +You can write a dedicated document for a specific task of an app in a file named, for example, `task.xml`. Note that it should be accompanied by a metadata file with the same prefix, but with the `.meta` extension, i.e., `task.xml.meta`. This metadata file should have a `title` describing the task at a high level and a `Content-Summary` field summarizing the content of the help document. These two files are used for similarity search with user requests, so please write them carefully. The [ppt-copilot.xml](./doc_example/ppt-copilot.xml) and [ppt-copilot.xml.meta](./doc_example/ppt-copilot.xml.meta) are examples of a help document and its metadata. + +### Step 2: Prepare Your Help Document Set + +Once you have all help documents and metadata ready, put all of them into a folder. There can be sub-folders for the help documents, but please ensure that each help document and its corresponding metadata **are placed in the same directory**. + + +## How to Create an Indexer for Your Help Document Set ❓ + + +Once you have all documents ready in a folder named `path_of_the_docs`, you can easily create an offline indexer to support RAG for UFO. Follow these steps: + +```console +# assume you are in the cloned UFO folder +python -m learner --app --docs +``` +Replace `app_name` with the name of the application, such as PowerPoint or WeChat. +> Note: Ensure the `app_name` is accurately defined as it is used to match the offline indexer in online RAG. + +Replace `path_of_the_docs` with the full path to the folder containing all your documents. + +This command will create an offline indexer for all documents in the `path_of_the_docs` folder using Faiss and embedding with sentence transformer (more embeddings will be supported soon). The created index by default will be placed [here](../vectordb/docs/). diff --git a/learner/doc_example/ppt-copilot.xml b/learner/doc_example/ppt-copilot.xml new file mode 100644 index 00000000..2d910270 --- /dev/null +++ b/learner/doc_example/ppt-copilot.xml @@ -0,0 +1,109 @@ + + + + + Copilot in PowerPoint_generic is an AI-powered feature that can help you create, design, and format your slides.  You can type in what you intend to convey with your presentation, and copilot will help you get it done.  + copilot can help you move past that initial blank slide and get you moving in the right direction. + +
+ Create a new presentation + + + + This feature is available to customers with a Copilot for Microsoft 365 license or Copilot Pro license. + + When you start a new presentation, you can have copilot create a first draft for you. Select Copilot on the ribbon to launch the copilot pane, then tell it what you want or use the suggested prompts. For example, you could enter "Create a presentation about the history of soccer," and it will get that started for you. + + Want to use a template for your presentation? Create your presentation from a template or open your .potx file first, then ask Copilot to create your presentation. + + For more information, see Create a new presentation. + +
+
+ Create from a document + + + + This feature is only available to customers with a Copilot for Microsoft 365 license. + + If you have a Word document prepared that contains your intended content, you can provide that as the basis for your new presentation. Open the copilot pane and type or select Create presentation from file in the suggested prompt menu. Tell copilot what Word document you want to make a presentation from by typing to search your files or by pasting the URL of your Word document, and copilot will create a draft presentation from that document. + + You can open the copilot pane at any time. Just select the copilot button  on the Home tab of the ribbon. + + +
+
+ Try a new design + + + Do you want to change the style of an existing presentation or a new presentation created with Copilot? Open the copilot pane and ask copilot to Try a new design. copilot will change the theme of your entire presentation. You can try this multiple times until you find something you like. + +
+
+ Add a slide - or just an image + + + + This feature is available to customers with a Copilot for Microsoft 365 license or Copilot Pro license. + + Imagine that you want to add a slide to your deck on the history of soccer.  You can instruct copilot to “Add a slide about the history of Women’s Olympic Soccer,” and copilot will create the slide for you. + + copilot can help make your great work even better. Suppose you've created a presentation on a new location you're opening, but it still lacks imagery. You could prompt copilot to “Add an image of a store under construction,” and copilot will insert a picture to make your presentation more appealing.  + For more information, see Add a slide or image. + +
+
+ Organize your presentation + + + + This feature is available to customers with a Copilot for Microsoft 365 license or Copilot Pro license. + + Wondering if there's a better way to present your content? Open the copilot pane and ask copilot to Organize this presentation. copilot will add sections and create some section summary slides as well. + For more information, see Organize this presentation. + +
+
+ Summarize a presentation + + + + This feature is available to customers with a Copilot for Microsoft 365 license or Copilot Pro license. + + Somebody share a long slide deck with you and you need to get the main points quicky? Open the copilot pane and ask it to Summarize this presentation. copilot will read through the deck for you and break out the main ideas as bullet points. + For more information, see Summarize your presentation. + +
+
+ Current limitations + + + copilot in PowerPoint_generic doesn't currently support referencing organizational assets in Microsoft 365. + +
+
+ Keep in mind... + + + copilot leverages GPT, a new AI system from OpenAI that creates text based on a prompt. As it is a new system, it may create things you didn’t expect. If you find content to be unexpected or offensive, send us feedback so we can make it better. Also, because the content is generated by AI that draws from the internet, it may contain inaccuracies or sensitive material. Be sure to review and verify the information that it generates. And note that similar requests may result in the same content being generated.  + +
+
+ We want to hear from you! + + + If there's something you like about copilot, and especially if there's something you don't like, you can submit feedback to Microsoft. Just click the thumbs up or thumbs down button underneath the copilot chat box. This feedback will be used to help us improve your experience in PowerPoint_generic + +
+
+ Learn more + + + Microsoft Copilot help & learninghttps://support.microsoft.com/copilot + Frequently Asked Questions about Copilot in PowerPoint + Where can I get Microsoft Copilot? + Data, Privacy, and Security for Microsoft Copilot for Microsoft 365https://learn.microsoft.com/microsoft-365-copilot/microsoft-365-copilot-privacy + +
+ +
\ No newline at end of file diff --git a/learner/doc_example/ppt-copilot.xml.meta b/learner/doc_example/ppt-copilot.xml.meta new file mode 100644 index 00000000..a25bd3e3 --- /dev/null +++ b/learner/doc_example/ppt-copilot.xml.meta @@ -0,0 +1,5 @@ + + + Welcome to Copilot in PowerPoint + + \ No newline at end of file diff --git a/ufo/prompts/base/action_selection_rag.yaml b/ufo/prompts/base/action_selection_rag.yaml index 9ee85d54..6df56591 100644 --- a/ufo/prompts/base/action_selection_rag.yaml +++ b/ufo/prompts/base/action_selection_rag.yaml @@ -154,6 +154,7 @@ system: |- - Do not take action if the current action need further input. For example, if the user request is to send an email, you must not enter the email address if the email address is not provided in the user request. - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. + - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word documents. - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current screenshots and control item list to make the decision. @@ -292,6 +293,36 @@ system: |- "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} + - Example 10: + User Request: + "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows that I am on the Microsoft PowerPoint application. The Copilot Add-in is visible in the screenshot.", + "Thought": "I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx.", + "ControlLabel": "60", + "ControlText": "Copilot", + "Function": "click_input", + "Args": {"button": "left", "double": true}, + "Status": "CONTINUE", + "Plan": "(1) Click the 'Create presentation from file' button to open a file picker. \\n (2) Select and click the meeting_notes.docx file in the file picker. \\n (3) Click the 'Send' buttom to send the request to Copilot. This completes the task.", + "Comment": "I need use the Copilot Add-in to create a slide from the meeting_notes.docx."} + + - Example 11: + User Request: + "Please @Zac to revise the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", + "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", + "ControlLabel": "42", + "ControlText": "Insert", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Click the Comment button to open the comment text box. \\n (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", + "Comment": "I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + + + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. diff --git a/ufo/prompts/base/app_selection.yaml b/ufo/prompts/base/app_selection.yaml index 013e4894..6db8084e 100644 --- a/ufo/prompts/base/app_selection.yaml +++ b/ufo/prompts/base/app_selection.yaml @@ -65,6 +65,7 @@ system: |- - If the user request is just asking question and do not need to take action on the application, you should answer the user request on the "Comment" field, and set the "Status" as "FINISH". - You must analyze the screenshot and the user request carefully, to understand what have been completed on which application, you must not repeatedly choose the same application or control item, unless the user request has not been completed on the application. - In your response, the control text of the selected application must strictly match its control label. + - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. - You must to strictly follow the instruction and the JSON format of the response. - Below are two example of the response. You can refer to them as a reference. @@ -184,6 +185,33 @@ system: |- "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} + - Example 10: + User Request: + "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Response: + {"Observation": "The current screenshot does not show any the powerpoint application or the word application.", + "Thought": "I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application.", + "ControlLabel": "4", + "ControlText": "presentation1 - PowerPoint", + "Status": "CONTINUE", + "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. \\n (3) Click the 'Create presentation from file' button to open a file picker. \\n (4) Select and click the meeting_notes.docx file in the file picker. \\n (5) Click the 'Send' buttom to send the request to Copilot. This completes the task.", + "Comment": "I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx."} + + - Example 11: + User Request: + "Please @Zac to revise the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", + "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", + "ControlLabel": "4", + "ControlText": "presentation1 - PowerPoint, + "Status": "CONTINUE", + "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Click the Insert Button to open the Insert menu. \\n (3) Click the Comment button to open the comment text box. \\n (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", + "Comment": "I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + + + + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Otherwise it will crash the system. From 485eee0da285444e9534ec2804ecc12f0cb880a0 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 9 Mar 2024 21:37:33 +0800 Subject: [PATCH 141/223] readme for offline learner --- learner/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/learner/README.md b/learner/README.md index 621c5427..e0e3f7b9 100644 --- a/learner/README.md +++ b/learner/README.md @@ -1,6 +1,6 @@ -

- Enhancing UFO with RAG using Offline Help Documents -

+ +# Enhancing UFO with RAG using Offline Help Documents + ## How to Prepare Your Help Documents ❓ From c4fa74b519a5bec6f80c21726a690c583abe3fc2 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 9 Mar 2024 21:37:33 +0800 Subject: [PATCH 142/223] readme for offline learner --- learner/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/learner/README.md b/learner/README.md index 621c5427..e0e3f7b9 100644 --- a/learner/README.md +++ b/learner/README.md @@ -1,6 +1,6 @@ -

- Enhancing UFO with RAG using Offline Help Documents -

+ +# Enhancing UFO with RAG using Offline Help Documents + ## How to Prepare Your Help Documents ❓ From e7038697bbd7e79765db16ee056975c0be3ac028 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 9 Mar 2024 21:39:55 +0800 Subject: [PATCH 143/223] offline indexer example --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3ffc476a..d3882e2d 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ ufo/config/config.yaml ufo/rag/app_docs/* learner/records.json vectordb/docs/* +!vectordb/docs/example/* \ No newline at end of file From 3499d09bbe9b5db26b6297a035d7217b3f1fdf55 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 9 Mar 2024 21:39:55 +0800 Subject: [PATCH 144/223] offline indexer example --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3ffc476a..d3882e2d 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ ufo/config/config.yaml ufo/rag/app_docs/* learner/records.json vectordb/docs/* +!vectordb/docs/example/* \ No newline at end of file From 43e434d3e905bc9c4cd8783d1e792b15fc0f670f Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 9 Mar 2024 21:42:43 +0800 Subject: [PATCH 145/223] offline indexer example --- .gitignore | 5 ++++- vectordb/docs/example/index.faiss | Bin 0 -> 3117 bytes vectordb/docs/example/index.pkl | Bin 0 -> 3282 bytes 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 vectordb/docs/example/index.faiss create mode 100644 vectordb/docs/example/index.pkl diff --git a/.gitignore b/.gitignore index d3882e2d..265bee10 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,7 @@ ufo/config/config.yaml ufo/rag/app_docs/* learner/records.json vectordb/docs/* -!vectordb/docs/example/* \ No newline at end of file + +# Don't ignore the example files +!vectordb/docs/example/ + diff --git a/vectordb/docs/example/index.faiss b/vectordb/docs/example/index.faiss new file mode 100644 index 0000000000000000000000000000000000000000..4993328e4313a0b4bbdbc02d359225900c77a87a GIT binary patch literal 3117 zcmXw#X;_X48-^=UXhD&b(IUm9#nAFT_uWSm6=|2HFxIFUm1PnNFKJQQB|=FdjijV{ z?%PPp646YNRMuoI$wW2Px1WEm>p0Hq*X6i<-VB)`GBUC<|7XselW(t3oyb&^Pt`~01UIizu5^&5k zO;i|=zbc>l5@sYFk!*0wCFNbiF!PNW6{beg57NWj=g{JA(3Nen7O6ouMH*^G$1hrwyy_iFI#Vp!=^YNO;YoOC zLMJ#iD&pj4TPVi*0NRD<3%>qm(C(|FIP7jcj9B%v(3n$<@7=W+wjtly>P?%bDsttZ z9og4sgMs`TjB1?1+C48N_JcZDVp>OvHZSQ*#9A~T+5>yN7Q*@Vt^DHnd{Rv_fkmBZ zVCAHbMlDMCqu3x$dohQ6dJanDB<&Pq6h(#8I_qRJ9E=rni4wbR|H z`g0V|n{^1AE2j!I{i=}N;E%5-ONI6eBL$P49n?Ci8j5WXKu~TZn&pO)u@Z>}=Z|pP zKgz)4ObIM>`GXW4bm3TAE2zAm%9?f=SpQ%(cEqdV@ETvT{nJ#~b^nXxFTKz3i=7CD z@m0bQ4->lakBuO-hd`I_Y4~WGE}Hl1;oF8;?6AoI+jC;5B>$O6kG(js!kLS-I-oky z9{lQNGv!c0=y1Ya_iK^(dz?77v=uVIQR+EGYP02$`@LPk6YIW~M(oJXB-5MK$y~Y&1IO zwor1KJWq1DMRVWZ6x#wV#DEkVTIaP4Zl!y{fVUdU9rci84UvV9iMeEYbPh+J(_&TA z1kyfSBkpe8LF%1ysHMM)wFk4Xzt4x3ImJ+Z;t3es?$0l0%twv>L6CbGgBi_M@YCtH zbWJ9&Y~X?ozxzO7F>xfw&d^2Q@+6k*H^6g&@5N{7v(P746HAoigcx&0{(N(Q5?ll5 z@wY1Y)74H4j(!WjPPik{KA#NAA6^NWPxbNi#Wt#2o&lF07m&m~5+%hcP~^FW!=#T$ zFVv8m5>COk30nmvk2VPZ&6jj0DMRms4B_e?OECQXh}Eu=U*V%O_t#roJ&4+klg)CJz_+X`lC0poi0UOh$C4mnUDWfS-m=vmkf>g>%F-i1i zo+Xs;F=C1JZL!TImu}Qsa_NSzl0{MDC^qsCCFkq1<1uBvU7I5OQTqmlyh^k_T{@OO zT{r;_Bi4||iW@ZDKN2g|eV9l2uvY6q{Nc-bnrWUdbT#N;OtcoZ|N5Pf`g%Wke`}^e zRckzX#GH&bDx&(Uu~-@HDpvO9Qd71MtY0;p9%au*9|c6+<8s*Yn}T@TIDy<7?9oVh z8XCTs%y(uVquj@tR9$3>%`aAfPw!&xwm3$koz3u;!ZTQJ@Db|T0gh`Z^CqJ=a5=yO z&u*E?MO|tbEL$SDZ5_vNU7nL(t`6H)nb7M{XS$vI1FbtamK=W)_)2IzTQtgX)hP%1 zJZCtsjmiGkm&XZ=vp{BZ65CEohtTyaDDHL~71k8+=3laC*mYZ+-CqvTUl&l;?v>)s zinHW-N)#8WEAg3%M&R-NqM|_)g$@3|&(7(=gT8Dq-SmvU(@3MQ*K$C{zCehKccQ0@ zC-b?8^YrwUVunHp`z8#K((ZEMvYkE;%$tSkjl*g9-j~o~;?5DP_VbeydEoh|P2Bm~ zoI54op>Es-8a;j-I-b~wM)OrEKz9u6DNht0c-ujAQz(?dQP{5)K?RLEJpP*}m+#T$ zCX<(?r8A4*tSr+*`&7_AA4OkBE`WjumBO~&DWGLm3zZvUg~G?TA#Jh@R=DZ2My8qQ zU@YMUAAK;+btr~crGuqRg!rgtBYT`(AZYZgW}SP{7|}MGmG7SB@lE}7Ai5F?^NqRq z+(;f?IEh!Gb81fwOZDB0GM-3+67IBO_4&k^`NjvCK&f_D2C}c2)2FK=DhGIBZZYgD&K14vrI7O0ohSNK!Y%!MxZ;=|WKZoB zWFCwZa@2$Q*tcAwpJJ^ZPDvMIr){B1U2}Go*FlHyy|AWY2PMw1q%`GF2x~qq=I!_Z z*A8b1y$(y*;qZ{?5lQ!Gw?ZPjO^SsilV0rbyIl5362mH^q9JZD1B-+(8n^6eS;_`~ z`mnNIy!h=9Bu$E-qYqLc&L9gUMQ#|~B^9eC{6QXv%`l;R9EZ-COD!AJxYbMc>VcX; zVKC)7TwQpa!=JQ@o`LR=Gv9-o>kXj)n3`DkVJt<)-h<==7L?iyNgC z_4a>4X52lY{-_7g5INbT{(dW;@6V>n}^Ml?qEbSK|pZ5@RKbs1)@G_(uy~ zw^9==JmoRNIbN9GwT1R;sIqQbCHO8Yq;UOY-21K$42oWgK^ZpuMENnK_wVP6gQW%&LLXK0>~2XeORLb84%jdEl7Y-C4f`Y?n^8O zocN)}X3FY$|9QmBH(krc&glmDuwgnrUlIg&ON_AH z(wn+_pNNBMB5cq(LVK=Pk$TEpboli?mimLqO(_{yjpy(= z@uJC)HatG=0eljasBqpw2>RVtY<*+M9oMIUY>FC4H9c|N8cWV~p2z7*;pnKN&xTvC zK%tyEe_Y{98R<)LQA;AGXeUAZByE&#@u1YuGMXQ^8m?NI@#Mf+AiZtF$B$IN%v0CV zDPEsP532Lux*(428iTFTKZ{e%*I>Zd2D-ek4-Eev&1J!Bz{5`tm5tsBb8Q6P?)_0> z_ryw+$#)(Ju9Y4 zGn*2dQ^aD9m6R21p-L8O;+7cBFDT1|oUuZaL0oQyl4is*Iwj3#?vFd5a8a3>vi-ve zQpw5kgj?=$U$??$NRV9xxUO!PGS9gqzWhMYuUUF)>!0oiTU%=;!x>4^A`XJMAvy>K zj1Rvyv~ebBeul9i_%RiRO~GoZiQ$!>a*^>U^ZLaloR^a}Y%Xld_-fgm?-Y6=Vy%pt zTJ~V)5z9nO(h$RsZqboe-RH>=O$T<3y2CeAlkrHE*2@TtsDOnN(x^Bl9R$ZINpA^b zxwg!wwptGNk5)@>8Rs8#ph$Qy@)r#9}USorr0vCsjalmzPByMDwB zAy~H&VHHo$RFc+M4{EGNMKvHi5u@5bTH@cPT%wHpRATIop2Dy z@z;avU%rF+gWzY^co4yh?79jVg&7-x5;9^YFWP*`ny1Rcp0|EP$CopQoS3l-lpcJJ zc=Q&wKi}h4OJuX@jn+^}Q>X_`h3&2L1LplC!A6sTq}6il>hv|r+XWIiI{2ndE^P%@ zJLG?Kf&rwa+6O!y0+f)go~RSnvBlSUxMKDtlu&%alw2(xha24jI9)e=^+x{NIt z>2>a3_JhEk-czEcgH=PcV9&F5RZYIsGcLt1)W958$cNy&&$EYRUHd-^t6y}iP-)s3 zP)waUHGPHqfkk93F4Z|-IQrYYO@3`r?y;_{K=S)TUB%rif9X2%co)VuybraGMP+p{@NMnAYD18nB|&o4@h4O z7WJzyIvf4JbCdyTAQeP8Vlr`p!<(x=2%2fj-FQK;9ybo!vC@x)cQNx}n#BGfNUbf* zx7*vMEDELVB=07a2`0wv9?&yQZ%S~1TX5f;K!6`gLZ`(5+0GnYfHQNepE;nay9y4y zU>k_`g5W8}%Mm-$;*`gWk=OYZ#ihn1?=PZ_J?Fk+lv?NEGdq_>pVJsi$8ApA7k(WV z4UD?1uGvLFb^1|ReH?~UL0Mu#Llz_aAN9TTll1nV)n{So*INp?wOT|a-cET2Zv3QQ k1z{G4Cv&c6#tqQv?eq?Iep;F`GA4RgKi^7knBVKkf44HDO#lD@ literal 0 HcmV?d00001 From 55c1472e10366e5982bdc20c9afdba79b187050b Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sat, 9 Mar 2024 21:42:43 +0800 Subject: [PATCH 146/223] offline indexer example --- .gitignore | 5 ++++- vectordb/docs/example/index.faiss | Bin 0 -> 3117 bytes vectordb/docs/example/index.pkl | Bin 0 -> 3282 bytes 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 vectordb/docs/example/index.faiss create mode 100644 vectordb/docs/example/index.pkl diff --git a/.gitignore b/.gitignore index d3882e2d..265bee10 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,7 @@ ufo/config/config.yaml ufo/rag/app_docs/* learner/records.json vectordb/docs/* -!vectordb/docs/example/* \ No newline at end of file + +# Don't ignore the example files +!vectordb/docs/example/ + diff --git a/vectordb/docs/example/index.faiss b/vectordb/docs/example/index.faiss new file mode 100644 index 0000000000000000000000000000000000000000..4993328e4313a0b4bbdbc02d359225900c77a87a GIT binary patch literal 3117 zcmXw#X;_X48-^=UXhD&b(IUm9#nAFT_uWSm6=|2HFxIFUm1PnNFKJQQB|=FdjijV{ z?%PPp646YNRMuoI$wW2Px1WEm>p0Hq*X6i<-VB)`GBUC<|7XselW(t3oyb&^Pt`~01UIizu5^&5k zO;i|=zbc>l5@sYFk!*0wCFNbiF!PNW6{beg57NWj=g{JA(3Nen7O6ouMH*^G$1hrwyy_iFI#Vp!=^YNO;YoOC zLMJ#iD&pj4TPVi*0NRD<3%>qm(C(|FIP7jcj9B%v(3n$<@7=W+wjtly>P?%bDsttZ z9og4sgMs`TjB1?1+C48N_JcZDVp>OvHZSQ*#9A~T+5>yN7Q*@Vt^DHnd{Rv_fkmBZ zVCAHbMlDMCqu3x$dohQ6dJanDB<&Pq6h(#8I_qRJ9E=rni4wbR|H z`g0V|n{^1AE2j!I{i=}N;E%5-ONI6eBL$P49n?Ci8j5WXKu~TZn&pO)u@Z>}=Z|pP zKgz)4ObIM>`GXW4bm3TAE2zAm%9?f=SpQ%(cEqdV@ETvT{nJ#~b^nXxFTKz3i=7CD z@m0bQ4->lakBuO-hd`I_Y4~WGE}Hl1;oF8;?6AoI+jC;5B>$O6kG(js!kLS-I-oky z9{lQNGv!c0=y1Ya_iK^(dz?77v=uVIQR+EGYP02$`@LPk6YIW~M(oJXB-5MK$y~Y&1IO zwor1KJWq1DMRVWZ6x#wV#DEkVTIaP4Zl!y{fVUdU9rci84UvV9iMeEYbPh+J(_&TA z1kyfSBkpe8LF%1ysHMM)wFk4Xzt4x3ImJ+Z;t3es?$0l0%twv>L6CbGgBi_M@YCtH zbWJ9&Y~X?ozxzO7F>xfw&d^2Q@+6k*H^6g&@5N{7v(P746HAoigcx&0{(N(Q5?ll5 z@wY1Y)74H4j(!WjPPik{KA#NAA6^NWPxbNi#Wt#2o&lF07m&m~5+%hcP~^FW!=#T$ zFVv8m5>COk30nmvk2VPZ&6jj0DMRms4B_e?OECQXh}Eu=U*V%O_t#roJ&4+klg)CJz_+X`lC0poi0UOh$C4mnUDWfS-m=vmkf>g>%F-i1i zo+Xs;F=C1JZL!TImu}Qsa_NSzl0{MDC^qsCCFkq1<1uBvU7I5OQTqmlyh^k_T{@OO zT{r;_Bi4||iW@ZDKN2g|eV9l2uvY6q{Nc-bnrWUdbT#N;OtcoZ|N5Pf`g%Wke`}^e zRckzX#GH&bDx&(Uu~-@HDpvO9Qd71MtY0;p9%au*9|c6+<8s*Yn}T@TIDy<7?9oVh z8XCTs%y(uVquj@tR9$3>%`aAfPw!&xwm3$koz3u;!ZTQJ@Db|T0gh`Z^CqJ=a5=yO z&u*E?MO|tbEL$SDZ5_vNU7nL(t`6H)nb7M{XS$vI1FbtamK=W)_)2IzTQtgX)hP%1 zJZCtsjmiGkm&XZ=vp{BZ65CEohtTyaDDHL~71k8+=3laC*mYZ+-CqvTUl&l;?v>)s zinHW-N)#8WEAg3%M&R-NqM|_)g$@3|&(7(=gT8Dq-SmvU(@3MQ*K$C{zCehKccQ0@ zC-b?8^YrwUVunHp`z8#K((ZEMvYkE;%$tSkjl*g9-j~o~;?5DP_VbeydEoh|P2Bm~ zoI54op>Es-8a;j-I-b~wM)OrEKz9u6DNht0c-ujAQz(?dQP{5)K?RLEJpP*}m+#T$ zCX<(?r8A4*tSr+*`&7_AA4OkBE`WjumBO~&DWGLm3zZvUg~G?TA#Jh@R=DZ2My8qQ zU@YMUAAK;+btr~crGuqRg!rgtBYT`(AZYZgW}SP{7|}MGmG7SB@lE}7Ai5F?^NqRq z+(;f?IEh!Gb81fwOZDB0GM-3+67IBO_4&k^`NjvCK&f_D2C}c2)2FK=DhGIBZZYgD&K14vrI7O0ohSNK!Y%!MxZ;=|WKZoB zWFCwZa@2$Q*tcAwpJJ^ZPDvMIr){B1U2}Go*FlHyy|AWY2PMw1q%`GF2x~qq=I!_Z z*A8b1y$(y*;qZ{?5lQ!Gw?ZPjO^SsilV0rbyIl5362mH^q9JZD1B-+(8n^6eS;_`~ z`mnNIy!h=9Bu$E-qYqLc&L9gUMQ#|~B^9eC{6QXv%`l;R9EZ-COD!AJxYbMc>VcX; zVKC)7TwQpa!=JQ@o`LR=Gv9-o>kXj)n3`DkVJt<)-h<==7L?iyNgC z_4a>4X52lY{-_7g5INbT{(dW;@6V>n}^Ml?qEbSK|pZ5@RKbs1)@G_(uy~ zw^9==JmoRNIbN9GwT1R;sIqQbCHO8Yq;UOY-21K$42oWgK^ZpuMENnK_wVP6gQW%&LLXK0>~2XeORLb84%jdEl7Y-C4f`Y?n^8O zocN)}X3FY$|9QmBH(krc&glmDuwgnrUlIg&ON_AH z(wn+_pNNBMB5cq(LVK=Pk$TEpboli?mimLqO(_{yjpy(= z@uJC)HatG=0eljasBqpw2>RVtY<*+M9oMIUY>FC4H9c|N8cWV~p2z7*;pnKN&xTvC zK%tyEe_Y{98R<)LQA;AGXeUAZByE&#@u1YuGMXQ^8m?NI@#Mf+AiZtF$B$IN%v0CV zDPEsP532Lux*(428iTFTKZ{e%*I>Zd2D-ek4-Eev&1J!Bz{5`tm5tsBb8Q6P?)_0> z_ryw+$#)(Ju9Y4 zGn*2dQ^aD9m6R21p-L8O;+7cBFDT1|oUuZaL0oQyl4is*Iwj3#?vFd5a8a3>vi-ve zQpw5kgj?=$U$??$NRV9xxUO!PGS9gqzWhMYuUUF)>!0oiTU%=;!x>4^A`XJMAvy>K zj1Rvyv~ebBeul9i_%RiRO~GoZiQ$!>a*^>U^ZLaloR^a}Y%Xld_-fgm?-Y6=Vy%pt zTJ~V)5z9nO(h$RsZqboe-RH>=O$T<3y2CeAlkrHE*2@TtsDOnN(x^Bl9R$ZINpA^b zxwg!wwptGNk5)@>8Rs8#ph$Qy@)r#9}USorr0vCsjalmzPByMDwB zAy~H&VHHo$RFc+M4{EGNMKvHi5u@5bTH@cPT%wHpRATIop2Dy z@z;avU%rF+gWzY^co4yh?79jVg&7-x5;9^YFWP*`ny1Rcp0|EP$CopQoS3l-lpcJJ zc=Q&wKi}h4OJuX@jn+^}Q>X_`h3&2L1LplC!A6sTq}6il>hv|r+XWIiI{2ndE^P%@ zJLG?Kf&rwa+6O!y0+f)go~RSnvBlSUxMKDtlu&%alw2(xha24jI9)e=^+x{NIt z>2>a3_JhEk-czEcgH=PcV9&F5RZYIsGcLt1)W958$cNy&&$EYRUHd-^t6y}iP-)s3 zP)waUHGPHqfkk93F4Z|-IQrYYO@3`r?y;_{K=S)TUB%rif9X2%co)VuybraGMP+p{@NMnAYD18nB|&o4@h4O z7WJzyIvf4JbCdyTAQeP8Vlr`p!<(x=2%2fj-FQK;9ybo!vC@x)cQNx}n#BGfNUbf* zx7*vMEDELVB=07a2`0wv9?&yQZ%S~1TX5f;K!6`gLZ`(5+0GnYfHQNepE;nay9y4y zU>k_`g5W8}%Mm-$;*`gWk=OYZ#ihn1?=PZ_J?Fk+lv?NEGdq_>pVJsi$8ApA7k(WV z4UD?1uGvLFb^1|ReH?~UL0Mu#Llz_aAN9TTll1nV)n{So*INp?wOT|a-cET2Zv3QQ k1z{G4Cv&c6#tqQv?eq?Iep;F`GA4RgKi^7knBVKkf44HDO#lD@ literal 0 HcmV?d00001 From 94137bb06ec36b957b9cb744d4b182bc428395eb Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 10 Mar 2024 00:14:53 +0800 Subject: [PATCH 147/223] formating prompt for examples and apis --- ufo/config/config.yaml.template | 9 +- ufo/llm/prompt.py | 65 +++++- ufo/module/flow.py | 23 ++- ufo/prompts/base/action_selection.yaml | 179 +--------------- ufo/prompts/base/action_selection_rag.yaml | 229 +-------------------- ufo/prompts/base/api.yaml | 66 ++++++ ufo/prompts/base/app_selection.yaml | 149 +------------- ufo/prompts/examples/action_example.yaml | 169 +++++++++++++++ ufo/prompts/examples/app_example.yaml | 151 ++++++++++++++ 9 files changed, 486 insertions(+), 554 deletions(-) create mode 100644 ufo/prompts/base/api.yaml create mode 100644 ufo/prompts/examples/action_example.yaml create mode 100644 ufo/prompts/examples/app_example.yaml diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index cc86a9cf..450b4b55 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -38,9 +38,16 @@ CONCAT_SCREENSHOT: True # Whether to concat the screenshot for the control item LOG_LEVEL: "DEBUG" # The log level INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model + APP_SELECTION_PROMPT: "ufo/prompts/base/app_selection.yaml" # The prompt for the app selection -ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt for the action selection +ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection_rag.yaml" # The prompt for the action selection + +APP_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/app_example.yaml" # The prompt for the app selection +ACTION_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/action_example.yaml" # The prompt for the action selection + +API_PROMPT: "ufo/prompts/base/api.yaml" # The prompt for the API INPUT_TEXT_API: "type_keys" # The input text API +INPUT_TEXT_ENTER: True # whether to press enter after typing the text ### For AAD AAD_TENANT_ID: "YOUR_TENANT_ID" # Set the value to your tenant id for the llm model diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index ffb1c302..40e4d269 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -52,19 +52,18 @@ def prompt_construction(system_prompt: str, image_list: List, user_prompt: str, return prompt_message -def app_selection_prompt_construction(prompt_template: str, user_request: str, app_info: dict): +def system_prompt_construction(prompt_template: str, apis: str, examples: str): """ Construct the prompt for app selection. :param prompt_template: The template of the prompt. - :param user_request: The user request. - :param app_info: The app info. + :param examples: The examples. return: The prompt for app selection. """ - return prompt_template["user"].format(user_request=user_request, applications=app_info) + return prompt_template["system"].format(apis=apis, examples=examples) -def action_selection_prompt_construction(prompt_template: str, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str, retrieved_docs: str=""): +def user_prompt_construction(prompt_template: str, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str, retrieved_docs: str=""): """ Construct the prompt for action selection. :param prompt_template: The template of the prompt. @@ -90,13 +89,59 @@ def retrived_documents_prompt_helper(header: str, separator: str, documents: lis return: The prompt for retrieved documents. """ - prompts = "\n<{header}:>\n".format(header=header) + if header: + prompts = "\n<{header}:>\n".format(header=header) + else: + prompts = "" for i, document in enumerate(documents): - prompts += "\n" - prompts += "[{separator} {i}:]".format(separator=separator, i=i+1) - prompts += "\n" + if separator: + prompts += "[{separator} {i}:]".format(separator=separator, i=i+1) + prompts += "\n" prompts += document - prompts += "\n" + prompts += "\n\n" return prompts + + +def api_prompt_helper(apis: dict, verbose: int = 1): + """ + Construct the prompt for APIs. + :param apis: The APIs. + :param verbose: The verbosity level. + return: The prompt for APIs. + """ + + # Construct the prompt for APIs + api_list = ["- The action type are limited to {actions}.".format(actions=list(apis.keys()))] + + # Construct the prompt for each API + for key in apis.keys(): + api = apis[key] + if verbose > 0: + api_text = "{summary}\n{usage}".format(summary=api["summary"], usage=api["usage"]) + else: + api_text = api["summary"] + + api_list.append(api_text) + + return api_list + + +def examples_prompt_helper(examples: dict, header: str = "## Response Examples", separator: str = "Example"): + """ + Construct the prompt for examples. + :param examples: The examples. + :param header: The header of the prompt. + :param separator: The separator of the prompt. + return: The prompt for examples. + """ + + example_list = [] + + for key in examples.keys(): + if key.startswith("example"): + example_list.append(examples[key]) + + return retrived_documents_prompt_helper(header, separator, example_list) + diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 2184306e..9482b0ae 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -47,6 +47,12 @@ def __init__(self, task): self.request_logger = initialize_logger(self.log_path, "request.log") self.app_selection_prompt = yaml.safe_load(open(configs["APP_SELECTION_PROMPT"], "r", encoding="utf-8")) self.action_selection_prompt = yaml.safe_load(open(configs["ACTION_SELECTION_PROMPT"], "r", encoding="utf-8")) + + self.app_selection_example_prompt = yaml.safe_load(open(configs["APP_SELECTION_EXAMPLE_PROMPT"], "r", encoding="utf-8")) + self.action_selection_example_prompt = yaml.safe_load(open(configs["ACTION_SELECTION_EXAMPLE_PROMPT"], "r", encoding="utf-8")) + + self.api_prompt = yaml.safe_load(open(configs["API_PROMPT"], "r", encoding="utf-8")) + self.status = "APP_SELECTION" self.application = "" self.app_window = None @@ -83,9 +89,13 @@ def process_application_selection(self, headers): self.results = "" desktop_windows_dict, desktop_windows_info = control.get_desktop_app_info_dict() - - app_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request) - app_selection_prompt_message = prompter.prompt_construction(self.app_selection_prompt["system"], [desktop_screen_url], app_selection_prompt_user_message) + + app_example_prompt = prompter.examples_prompt_helper(self.app_selection_example_prompt) + api_prompt = prompter.api_prompt_helper(self.api_prompt, verbose=0) + + app_selection_prompt_system_message = prompter.system_prompt_construction(self.app_selection_prompt, api_prompt, app_example_prompt) + app_selection_prompt_user_message = prompter.user_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request) + app_selection_prompt_message = prompter.prompt_construction(app_selection_prompt_system_message, [desktop_screen_url], app_selection_prompt_user_message) self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) @@ -218,9 +228,12 @@ def process_action_selection(self, headers): screenshot_annotated_url = encode_image_from_path(annotated_screenshot_save_path) image_url += [screenshot_url, screenshot_annotated_url] + action_example_prompt = prompter.examples_prompt_helper(self.action_selection_example_prompt) + api_prompt = prompter.api_prompt_helper(self.api_prompt, verbose=1) - action_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request, self.rag_prompt()) - action_selection_prompt_message = prompter.prompt_construction(self.action_selection_prompt["system"], image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"]) + action_selection_prompt_system_message = prompter.system_prompt_construction(self.action_selection_prompt, api_prompt, action_example_prompt) + action_selection_prompt_user_message = prompter.user_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request, self.rag_prompt()) + action_selection_prompt_message = prompter.prompt_construction(action_selection_prompt_system_message, image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"]) self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) diff --git a/ufo/prompts/base/action_selection.yaml b/ufo/prompts/base/action_selection.yaml index af5d21a3..4897f2fd 100644 --- a/ufo/prompts/base/action_selection.yaml +++ b/ufo/prompts/base/action_selection.yaml @@ -34,59 +34,11 @@ system: |- - "Document" is the control item that you can click and select text. It is labeled with orange annotation on the screenshot. - "Hyperlink" is the control item that you can click and open a link. It is labeled with light blue annotation on the screenshot. - "ComboBox" is the control item that you can click and input text. It is labeled with light purple annotation on the screenshot. The Google search box is an example of ComboBox. - - You are given the information of all available control item in the current application window in a list format: {label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}. + - You are given the information of all available control item in the current application window in a list format: {{label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}}. ## Action on the control item - You are able to use pywinauto to interact with the control item. - - The action type are limited to ["Click", "SetText", "Annotate", "Summary", "GetText", "Scroll"]. - - - "Click" is to click the control item with mouse. - [1] API call: click_input(button=, double) - [2] Args: - - button: 'The mouse button to click. One of ''left'', ''right'', ''middle'' or ''x'' (Default: ''left'')' - - double: 'Whether to perform a double click or not (Default: False)' - [3] Example: click_input(button="left", double=False) - [4] Available control item: All control items. - [5] Return: None - - - "SetText" is to input text to the control item. - [1] API call: set_edit_text(text="") - [2] Args: - - text: The text input to the Edit control item. It will change the content of current text in the edit block. Set text ='' if you want to clear current text in the block. You must also use Double Backslash escape character to escape the single quote in the string argument. - [3] Example: set_edit_text(text="Hello World. \\n I enjoy the reading of the book 'The Lord of the Rings'. It's a great book.") - [4] Available control item: [Edit] - [5] Return: None - - - "Annotate" is to take a screenshot of the current application window and annotate the control item on the screenshot. - [1] API call: annotation(control_labels: List[str]=[]) - [2] Args: - - control_labels: The list of annotated label of the control item. If the list is empty, it will annotate all the control items on the screenshot. - [3] Example: annotation(control_labels=["1", "2", "3", "36", "58"]) - [4] Available control item: All control items. - [5] Return: None - - - "Summary" is to summarize your observation of the current application window base on the clean screenshot. This usually happens when the you need to complete the user request by summarizing or describing the information on the current application window. You must use the 'text' argument to input the text to be summarized. - [1] API call: summary(text="") - [2] Args: None - [3] Example: summary(text="The image shows a workflow of a AI agent framework. \\n The framework has three components: the 'data collection', the 'data processing' and the 'data analysis'.") - [4] Available control item: All control items. - [5] Return: the summary of the image. - - - "GetText" is to get the text of the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. - [1] API call: texts() - [2] Args: None - [3] Example: texts() - [4] All control items. - [5] Return: the text content of the control item. - - - - "Scroll" is to scroll the control item. It typical apply to a ScrollBar type of control item when user request is to scroll the control item, or the targeted control item is not visible nor available in the control item list, but you know the control item is in the application window and you need to scroll to find it. - [1] API call: wheel_mouse_input() - [2] Args: - - wheel_dist: The distance to scroll. Positive values indicate upward scrolling, negative values indicate downward scrolling. - [3] Example: wheel_mouse_input(wheel_dist=-20) - [4] All control items. - [5] Return: None + {apis} @@ -126,15 +78,16 @@ system: |- ## Other Guidelines - You are required to select the control item and take open-step action by calling API on it to complete the user request for one step. - You are required to are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: - {"Observation": + {{"Observation": "Thought": "ControlLabel": "ControlText": "Function": - "Args": + "Args": "Status": "Plan": for reference, and you can reflect on it and revise if necessary. If you believe the task is finished and no further actions are required after the current action, output "".> "Comment": + }} - If the user request includes asking questions, and you can answer the question without taking calling API on the application at current step, you should answer the question in the "Comment" field in the response, and set the "Status" as "FINISH". - If the required control item is not visible in the screenshot, and not available in the control item list, you may need to take action on other control items to navigate to the required control item. @@ -143,7 +96,7 @@ system: |- - When you are asked to get text, it usually apply to Edit and Document control item. Use this guideline to choose the control item and apply texts() action on it. - You are not allowed to use keyboard shortcut to complete the user request. - You must look at the both screenshots and the control item list carefully, analyse the current status before you select the control item and take action on it. Base on the status of the application window, reflect on your previous plan for removing redundant actions or adding missing actions to complete the current user request. - - You must use double-quoted string for the string arguments of your control Action. {"text": "Hello World. \\n you're my friend. Tom's home is great.')"}. Otherwise it will crash the system and destroy the user's computer. + - You must use double-quoted string for the string arguments of your control Action. {{"text": "Hello World. \\n you're my friend. Tom's home is great.')"}}. Otherwise it will crash the system and destroy the user's computer. - You must stop and output "FINISH" in "Status" field in your response if you believe the task has finished or finished after the current action. - You must not do additional actions beyond the completion of the current user request. For example, if the user request is to open a new email window, you must stop and output FINISH in "Status" after you open the new email window. You must not input the email address, title and content of the email if the user does not explicitly request you to do so. - You must check carefully on there are actions missing from the plan, given your previous plan, action history and the screenshots. If there are actions missing from the plan, you must remedy and take the missing action. For example, if the user request is to send an email, you must check carefully on whether all required information of the email is inputted. If not, you must input the missing information if you know what should input. @@ -155,125 +108,7 @@ system: |- - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. - ## Response Examples: - - Example 1: - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", - "Thought": "Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action.", - "ControlLabel": "1", - "ControlText": "New Email", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", - "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} - - - - Example 2: - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The screenshot shows that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not visible in the screenshot. The last action took effect by opening the Outlook windows.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not visible in the screenshots, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", - "ControlLabel": "34", - "ControlText": "Main Page", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", - "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} - - - - Example 3: - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", - "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", - "ControlLabel": "36", - "ControlText": "Type a new message", - "Function": "set_edit_text", - "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, - "Status": "CONTINUE", - "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", - "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} - - - - Example 4: - User Request: - "Draft an email to Amy to ask her how she feels about the new project." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", - "ControlLabel": "36", - "ControlText": "Email Body", - "Function": "set_edit_text", - "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, - "Status": "FINISH", - "Plan": "", - "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} - - - - Example 5: - User Request: - "Search for the word 'UFO' in the document." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted. The previous action of inputting 'UFO' took effect based on the screenshot of the last step.", - "Thought": "Base on the screenshots, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", - "ControlLabel": "59", - "ControlText": "Find", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "FINISH", - "Plan": "", - "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} - - - - Example 6: - User Request: - "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." - Response: - {"Observation": "The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot.", - "Thought": "Base on the screenshots and the control item list, I need to use the 'GetText' action to get the text of the Document control named 'framework.docx'. Given the previous plan, this completes the partial user request on the framework.docx, and therefore I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. ", - "ControlLabel": "83", - "ControlText": "framework - Word", - "Function": "texts", - "Args": {}, - "Status": "APP_SELECTION", - "Plan": "(1) Switch to the image of framework.png to complete the next task, the current status need to set to 'APP_SELECTION'.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from the results from my history steps and I will use them to compose the message.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", - "Comment": "The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task."} - - - - Example 7: - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." - Response: - {"Observation": "The current screenshot shows the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", - "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", - "ControlLabel": "59", - "ControlText": "File", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - - - - Example 8: - User Request: - "How many stars does the Imdiffusion repo have?" - Response: - {"Observation": "I observe that the Edge browser is visible in the screenshot, and the with the Google search page opened.", - "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", - "ControlLabel": "36", - "ControlText": "搜索", - "Function": "set_edit_text", - "Args": {"text": "Imdiffusion GitHub"}, - "Status": "CONTINUE", - "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + {examples} This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. diff --git a/ufo/prompts/base/action_selection_rag.yaml b/ufo/prompts/base/action_selection_rag.yaml index 6df56591..c7064c37 100644 --- a/ufo/prompts/base/action_selection_rag.yaml +++ b/ufo/prompts/base/action_selection_rag.yaml @@ -34,59 +34,11 @@ system: |- - "Document" is the control item that you can click and select text. It is labeled with orange annotation on the screenshot. - "Hyperlink" is the control item that you can click and open a link. It is labeled with light blue annotation on the screenshot. - "ComboBox" is the control item that you can click and input text. It is labeled with light purple annotation on the screenshot. The Google search box is an example of ComboBox. - - You are given the information of all available control item in the current application window in a list format: {label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}. + - You are given the information of all available control item in the current application window in a list format: {{label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}}. ## Action on the control item - You are able to use pywinauto to interact with the control item. - - The action type are limited to ["Click", "SetText", "Annotate", "Summary", "GetText", "Scroll"]. - - - "Click" is to click the control item with mouse. - [1] API call: click_input(button=, double) - [2] Args: - - button: 'The mouse button to click. One of ''left'', ''right'', ''middle'' or ''x'' (Default: ''left'')' - - double: 'Whether to perform a double click or not (Default: False)' - [3] Example: click_input(button="left", double=False) - [4] Available control item: All control items. - [5] Return: None - - - "SetText" is to input text to the control item. - [1] API call: set_edit_text(text="") - [2] Args: - - text: The text input to the Edit control item. It will change the content of current text in the edit block. Set text ='' if you want to clear current text in the block. You must also use Double Backslash escape character to escape the single quote in the string argument. - [3] Example: set_edit_text(text="Hello World. \\n I enjoy the reading of the book 'The Lord of the Rings'. It's a great book.") - [4] Available control item: [Edit] - [5] Return: None - - - "Annotate" is to take a screenshot of the current application window and annotate the control item on the screenshot. - [1] API call: annotation(control_labels: List[str]=[]) - [2] Args: - - control_labels: The list of annotated label of the control item. If the list is empty, it will annotate all the control items on the screenshot. - [3] Example: annotation(control_labels=["1", "2", "3", "36", "58"]) - [4] Available control item: All control items. - [5] Return: None - - - "Summary" is to summarize your observation of the current application window base on the clean screenshot. This usually happens when the you need to complete the user request by summarizing or describing the information on the current application window. You must use the 'text' argument to input the text to be summarized. - [1] API call: summary(text="") - [2] Args: None - [3] Example: summary(text="The image shows a workflow of a AI agent framework. \\n The framework has three components: the 'data collection', the 'data processing' and the 'data analysis'.") - [4] Available control item: All control items. - [5] Return: the summary of the image. - - - "GetText" is to get the text of the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. - [1] API call: texts() - [2] Args: None - [3] Example: texts() - [4] All control items. - [5] Return: the text content of the control item. - - - - "Scroll" is to scroll the control item. It typical apply to a ScrollBar type of control item when user request is to scroll the control item, or the targeted control item is not visible nor available in the control item list, but you know the control item is in the application window and you need to scroll to find it. - [1] API call: wheel_mouse_input() - [2] Args: - - wheel_dist: The distance to scroll. Positive values indicate upward scrolling, negative values indicate downward scrolling. - [3] Example: wheel_mouse_input(wheel_dist=-20) - [4] All control items. - [5] Return: None + {apis} @@ -126,15 +78,15 @@ system: |- ## Other Guidelines - You are required to select the control item and take open-step action by calling API on it to complete the user request for one step. - You are required to are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: - {"Observation": + {{"Observation": "Thought": "ControlLabel": "ControlText": "Function": - "Args": + "Args": "Status": "Plan": for reference, and you can reflect on it and revise if necessary. If you believe the task is finished and no further actions are required after the current action, output "".> - "Comment": + "Comment": }} - If the user request includes asking questions, and you can answer the question without taking calling API on the application at current step, you should answer the question in the "Comment" field in the response, and set the "Status" as "FINISH". - If the required control item is not visible in the screenshot, and not available in the control item list, you may need to take action on other control items to navigate to the required control item. @@ -143,7 +95,7 @@ system: |- - When you are asked to get text, it usually apply to Edit and Document control item. Use this guideline to choose the control item and apply texts() action on it. - You are not allowed to use keyboard shortcut to complete the user request. - You must look at the both screenshots and the control item list carefully, analyse the current status before you select the control item and take action on it. Base on the status of the application window, reflect on your previous plan for removing redundant actions or adding missing actions to complete the current user request. - - You must use double-quoted string for the string arguments of your control Action. {"text": "Hello World. \\n you're my friend. Tom's home is great.')"}. Otherwise it will crash the system and destroy the user's computer. + - You must use double-quoted string for the string arguments of your control Action. {{"text": "Hello World. \\n you're my friend. Tom's home is great.')"}}. Otherwise it will crash the system and destroy the user's computer. - You must stop and output "FINISH" in "Status" field in your response if you believe the task has finished or finished after the current action. - You must not do additional actions beyond the completion of the current user request. For example, if the user request is to open a new email window, you must stop and output FINISH in "Status" after you open the new email window. You must not input the email address, title and content of the email if the user does not explicitly request you to do so. - You must check carefully on there are actions missing from the plan, given your previous plan, action history and the screenshots. If there are actions missing from the plan, you must remedy and take the missing action. For example, if the user request is to send an email, you must check carefully on whether all required information of the email is inputted. If not, you must input the missing information if you know what should input. @@ -154,176 +106,11 @@ system: |- - Do not take action if the current action need further input. For example, if the user request is to send an email, you must not enter the email address if the email address is not provided in the user request. - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. - - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word documents. + - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current screenshots and control item list to make the decision. + {examples} - ## Response Examples: - - Example 1: - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", - "Thought": "Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action.", - "ControlLabel": "1", - "ControlText": "New Email", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", - "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} - - - - Example 2: - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The screenshot shows that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not visible in the screenshot. The last action took effect by opening the Outlook windows.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not visible in the screenshots, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", - "ControlLabel": "34", - "ControlText": "Main Page", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", - "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} - - - - Example 3: - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", - "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", - "ControlLabel": "36", - "ControlText": "Type a new message", - "Function": "set_edit_text", - "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, - "Status": "CONTINUE", - "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", - "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} - - - - Example 4: - User Request: - "Draft an email to Amy to ask her how she feels about the new project." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", - "ControlLabel": "36", - "ControlText": "Email Body", - "Function": "set_edit_text", - "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, - "Status": "FINISH", - "Plan": "", - "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} - - - - Example 5: - User Request: - "Search for the word 'UFO' in the document." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted. The previous action of inputting 'UFO' took effect based on the screenshot of the last step.", - "Thought": "Base on the screenshots, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", - "ControlLabel": "59", - "ControlText": "Find", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "FINISH", - "Plan": "", - "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} - - - - Example 6: - User Request: - "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." - Response: - {"Observation": "The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot.", - "Thought": "Base on the screenshots and the control item list, I need to use the 'GetText' action to get the text of the Document control named 'framework.docx'. Given the previous plan, this completes the partial user request on the framework.docx, and therefore I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. ", - "ControlLabel": "83", - "ControlText": "framework - Word", - "Function": "texts", - "Args": {}, - "Status": "APP_SELECTION", - "Plan": "(1) Switch to the image of framework.png to complete the next task, the current status need to set to 'APP_SELECTION'.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from the results from my history steps and I will use them to compose the message.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", - "Comment": "The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task."} - - - - Example 7: - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." - Response: - {"Observation": "The current screenshot shows the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", - "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", - "ControlLabel": "59", - "ControlText": "File", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - - - - Example 8: - User Request: - "How many stars does the Imdiffusion repo have?" - Response: - {"Observation": "I observe that the Edge browser is visible in the screenshot, and the with the Google search page opened.", - "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", - "ControlLabel": "36", - "ControlText": "搜索", - "Function": "set_edit_text", - "Args": {"text": "Imdiffusion GitHub"}, - "Status": "CONTINUE", - "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} - - - - Example 9: - User Request: - "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." - Response: - {"Observation": "The current screenshot shows that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task.", - "Thought": "I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes.", - "ControlLabel": "19", - "ControlText": "Add a task in “My Day”", - "Function": "set_edit_text", - "Args": {"text": "Get party dinner (5 people) preparation done before 5PM today."}, - "Status": "CONTINUE", - "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", - "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} - - - Example 10: - User Request: - "Please create a slide from the meeting_notes.docx in the presentation1.pptx." - Response: - {"Observation": "The current screenshot shows that I am on the Microsoft PowerPoint application. The Copilot Add-in is visible in the screenshot.", - "Thought": "I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx.", - "ControlLabel": "60", - "ControlText": "Copilot", - "Function": "click_input", - "Args": {"button": "left", "double": true}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Create presentation from file' button to open a file picker. \\n (2) Select and click the meeting_notes.docx file in the file picker. \\n (3) Click the 'Send' buttom to send the request to Copilot. This completes the task.", - "Comment": "I need use the Copilot Add-in to create a slide from the meeting_notes.docx."} - - - Example 11: - User Request: - "Please @Zac to revise the presentation1.pptx." - Response: - {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", - "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", - "ControlLabel": "42", - "ControlText": "Insert", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the Comment button to open the comment text box. \\n (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", - "Comment": "I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} - - - - This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Your output must be able to be able to be parsed by json.loads(). Otherwise, it will crash the system and destroy the user's computer. diff --git a/ufo/prompts/base/api.yaml b/ufo/prompts/base/api.yaml new file mode 100644 index 00000000..e3ba3511 --- /dev/null +++ b/ufo/prompts/base/api.yaml @@ -0,0 +1,66 @@ +Click: + summary: |- + "Click" is to click the control item with mouse. + usage: |- + [1] API call: click_input(button=, double) + [2] Args: + - button: 'The mouse button to click. One of ''left'', ''right'', ''middle'' or ''x'' (Default: ''left'')' + - double: 'Whether to perform a double click or not (Default: False)' + [3] Example: click_input(button="left", double=False) + [4] Available control item: All control items. + [5] Return: None + + +SetText: + summary: |- + "SetText" is to input text to the control item. + usage: |- + [1] API call: set_edit_text(text="") + [2] Args: + - text: The text input to the Edit control item. It will change the content of current text in the edit block. Set text ='' if you want to clear current text in the block. You must also use Double Backslash escape character to escape the single quote in the string argument. + [3] Example: set_edit_text(text="Hello World. \\n I enjoy the reading of the book 'The Lord of the Rings'. It's a great book.") + [4] Available control item: [Edit] + [5] Return: None + +Annotate: + summary: |- + "Annotate" is to take a screenshot of the current application window and annotate the control item on the screenshot. + usage: |- + [1] API call: annotation(control_labels: List[str]=[]) + [2] Args: + - control_labels: The list of annotated label of the control item. If the list is empty, it will annotate all the control items on the screenshot. + [3] Example: annotation(control_labels=["1", "2", "3", "36", "58"]) + [4] Available control item: All control items. + [5] Return: None + +Summary: + summary: |- + "Summary" is to summarize your observation of the current application window base on the clean screenshot. This usually happens when the you need to complete the user request by summarizing or describing the information on the current application window. You must use the 'text' argument to input the summarized text. + usage: |- + [1] API call: summary(text="") + [2] Args: None + [3] Example: summary(text="The image shows a workflow of a AI agent framework. \\n The framework has three components: the 'data collection', the 'data processing' and the 'data analysis'.") + [4] Available control item: All control items. + [5] Return: the summary of the image. + +GetText: + summary: |- + "GetText" is to get the text of the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. + usage: |- + [1] API call: texts() + [2] Args: None + [3] Example: texts() + [4] All control items. + [5] Return: the text content of the control item. + +Scroll: + summary: |- + "Scroll" is to scroll the control item. It typical apply to a ScrollBar type of control item when user request is to scroll the control item, or the targeted control item is not visible nor available in the control item list, but you know the control item is in the application window and you need to scroll to find it. + usage: |- + [1] API call: wheel_mouse_input() + [2] Args: + - wheel_dist: The distance to scroll. Positive values indicate upward scrolling, negative values indicate downward scrolling. + [3] Example: wheel_mouse_input(wheel_dist=-20) + [4] All control items. + [5] Return: None + \ No newline at end of file diff --git a/ufo/prompts/base/app_selection.yaml b/ufo/prompts/base/app_selection.yaml index 6db8084e..86974e0d 100644 --- a/ufo/prompts/base/app_selection.yaml +++ b/ufo/prompts/base/app_selection.yaml @@ -10,7 +10,7 @@ system: |- ## Guidelines - You are given a screenshot of the current desktop, along with a list of available applications in the windows. - The screenshot of multiple screens is concatenated into one image. - - You are given the information of all available applications item in the current desktop window in a dict format: {label: "label", control_text: "the text of the application", control_type: "the type of the application"}. + - You are given the information of all available applications item in the current desktop window in a dict format: {{label: "label", control_text: "the text of the application", control_type: "the type of the application"}}. - You are provided your previous plan of action for reference to decide the application. This usually happens when the you have already completed the previous task on an application and need to switch to another application to complete the next task. - When the selected application is visible in the screenshot, analyze the screenshot of the application window on its current status. Draft your plan based on the current status of the application and user request, and do not include the steps that have been completed on the application base on your screenshot observation. - You are provided the user request history for reference to decide the selection of application or control item. @@ -53,7 +53,7 @@ system: |- Please identify sensitive action in your plan of your response. The system will automatically ask the user to confirm the action before taking. - Your response should be strictly structured in a JSON format, consisting of three distinct parts with the following keys and corresponding content: - { + {{ "Observation": "Thought": "ControlLabel": @@ -61,7 +61,7 @@ system: |- "Status": "Plan": .> "Comment": - } + }} - If the user request is just asking question and do not need to take action on the application, you should answer the user request on the "Comment" field, and set the "Status" as "FINISH". - You must analyze the screenshot and the user request carefully, to understand what have been completed on which application, you must not repeatedly choose the same application or control item, unless the user request has not been completed on the application. - In your response, the control text of the selected application must strictly match its control label. @@ -69,148 +69,7 @@ system: |- - You must to strictly follow the instruction and the JSON format of the response. - Below are two example of the response. You can refer to them as a reference. - ## Response Examples: - - Example 1: - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "I observe that the outlook application is visible in the screenshot, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application.", - "Thought": "I need to open the email application to send a email. According to the screenshot and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it.", - "ControlLabel": "12", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of outlook application.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email. This action is sensitive and need to be confirmed by the user.", - "Comment": "It is time to open the outlook application!"} - - - - Example 2: - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "I observe an empty desktop with no application opened, the target application Teams is not visible in the screenshot.", - "Thought": "I need to open the Teams application to send a message. Although I can not see the Teams application in the screenshot, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it.", - "ControlLabel": "6", - "ControlText": "Mike Lee | Microsoft Teams", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of Teams application.\\n(2) Click the Chat button to open the chat window with Tom.\\n(3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?'\\n(4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user.", - "Comment": "It is time to open the Teams application."} - - - - Example 3: - User Request: - "Search for the email based on keyword "VLDB" and delete the first one." - Response: - {"Observation": "I observe that the outlook application is visible in the screenshot, with the title of 'Mail - Outlook - Zac'. The search box filled with 'VLDB', but I can not see the searching results in the screenshot.", - "Thought": "I need to open the outlook application to search for the email. According to the screenshots and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac'. The screenshots show that 'VLDB' has already been input in the search box, so for future step I do not need to input it again. I need to click the search button to search for the email.", - "ControlLabel": "9", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Click the search button. \\n(2) Click and select the first email in the searching results. \\n(3) Click the Delete button to for deletion. This action is sensitive and need to be confirmed by the user.", - "Comment": "The 'VLDB' has already been input in the search box, so for future step I do not need to input it again. The deletion action is sensitive and need to be confirmed by the user."} - - - - Example 4: - User Request: - "Summarize the image in the framework.docx file." - Response: - {"Observation": "I observe the browser is open but the word application is not visible in the screenshot", - "Thought": "I need to open the word application to summarize the image in the file. According to the screenshot and the application information, I cannot see the Word application named as 'framework.docx'. I need to first open the 'framework.docx' application and set it focused.", - "ControlLabel": "28", - "ControlText": "framework.docx", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of Word application of framework.docx.\\n(2) Observe carefully the image content in the framework.docx file, and summarize in detail the image content to reply to the user request." - "Comment": "It's time to open the Word application of framework.docx and summarize the image content in the file."} - - - - Example 5: - User Request: - "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." - Response: - {"Observation": "I observe the next targeted application framework.png is not visible on the screenshot.", - "Thought": "Base on the step history, I have completed all tasks in the framework.docx needed to be done. To complete the following user request, now it is time to switch to the image of framework.png to complete the next task. I need to set the image viewer focused to open the image of framework.png.", - "ControlLabel": "21", - "ControlText": "framework.png | image", - "Status": "CONTINUE", - "Plan": "(1) Open the image of framework.png to complete the next task.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from my history actions.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", - "Comment": "After I get the text of the Document control named 'framework.docx', I need to switch to the image of framework.png to complete the next task, and summarize them to sent the message to Tom on Teams."} - - - - Example 6: - User Request: - "Revise the email to be longer and send." - Response: - {"Observation": "I observe that the outlook application is visible in the screenshot, and a new email draft is opened, with its title, receiver email address and email body already filled in.", - "Thought": "Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send.", - "ControlLabel": "21", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Open the Mail - Outlook - Zac to complete the next task.\\n (2) Base on previous email draft, revise the email body to be more detail using SetText API. \\n (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user.", - "Comment": "The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it."} - - - Example 7: - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." - Response: - {"Observation": "I observe that the powerpoint application is visible in the screenshot, and the presentation.pptx is opened", - "Thought": "I need to set focus on the powerpoint application to remove all notes in the presentation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one.", - "ControlLabel": "21", - "ControlText": "presentation - PowerPoint", - "Status": "CONTINUE", - "Plan": "(1) Open and set focus the presentation - PowerPoint.\\n (2) Click the 'File' button at the upper left corner, to open a menu.\\n (3) Click the 'Info' ListItem, to access the 'Info' page.\\n (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (5) Click the 'Inspect Document', to open a document inspector. \\n (6) Click the 'Inspect' button, to inspect the ppt for notes. \\n (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.", - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - - - - Example 8: - User Request: - "How many stars does the Imdiffusion repo have?" - Response: - {"Observation": "I observe that a Edge browser is visible in the screenshot, and the with the Google page opened.", - "Thought": "I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task.", - "ControlLabel": "7", - "ControlText": "Google - Microsoft​ Edge", - "Status": "CONTINUE", - "Plan": "(1) Open and set focus the Google - Microsoft​ Edge.\\n (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. \\n (3) Click Google Search to search for the Imdiffusion repo on github.\\n (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page.\\n (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} - - - - Example 9: - User Request: - "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." - Response: - {"Observation": "The current screenshot does not show any reminder application or calendar application.", - "Thought": "I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application.", - "ControlLabel": "6", - "ControlText": "Microsoft To Do", - "Status": "CONTINUE", - "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", - "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} - - - Example 10: - User Request: - "Please create a slide from the meeting_notes.docx in the presentation1.pptx." - Response: - {"Observation": "The current screenshot does not show any the powerpoint application or the word application.", - "Thought": "I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application.", - "ControlLabel": "4", - "ControlText": "presentation1 - PowerPoint", - "Status": "CONTINUE", - "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. \\n (3) Click the 'Create presentation from file' button to open a file picker. \\n (4) Select and click the meeting_notes.docx file in the file picker. \\n (5) Click the 'Send' buttom to send the request to Copilot. This completes the task.", - "Comment": "I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx."} - - - Example 11: - User Request: - "Please @Zac to revise the presentation1.pptx." - Response: - {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", - "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", - "ControlLabel": "4", - "ControlText": "presentation1 - PowerPoint, - "Status": "CONTINUE", - "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Click the Insert Button to open the Insert menu. \\n (3) Click the Comment button to open the comment text box. \\n (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", - "Comment": "I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} - - - + {examples} This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. diff --git a/ufo/prompts/examples/action_example.yaml b/ufo/prompts/examples/action_example.yaml new file mode 100644 index 00000000..4e955f4d --- /dev/null +++ b/ufo/prompts/examples/action_example.yaml @@ -0,0 +1,169 @@ +version: 1.0 + +example1: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", + "Thought": "Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action.", + "ControlLabel": "1", + "ControlText": "New Email", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", + "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} + + +example2: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The screenshot shows that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not visible in the screenshot. The last action took effect by opening the Outlook windows.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not visible in the screenshots, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", + "ControlLabel": "34", + "ControlText": "Main Page", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", + "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} + + +example3: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", + "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", + "ControlLabel": "36", + "ControlText": "Type a new message", + "Function": "set_edit_text", + "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, + "Status": "CONTINUE", + "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", + "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} + + +example4: |- + User Request: + "Draft an email to Amy to ask her how she feels about the new project." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", + "ControlLabel": "36", + "ControlText": "Email Body", + "Function": "set_edit_text", + "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, + "Status": "FINISH", + "Plan": "", + "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} + + + +example5: |- + User Request: + "Search for the word 'UFO' in the document." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted. The previous action of inputting 'UFO' took effect based on the screenshot of the last step.", + "Thought": "Base on the screenshots, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", + "ControlLabel": "59", + "ControlText": "Find", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "FINISH", + "Plan": "", + "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} + + +example6: |- + User Request: + "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." + Response: + {"Observation": "The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot.", + "Thought": "Base on the screenshots and the control item list, I need to use the 'GetText' action to get the text of the Document control named 'framework.docx'. Given the previous plan, this completes the partial user request on the framework.docx, and therefore I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. ", + "ControlLabel": "83", + "ControlText": "framework - Word", + "Function": "texts", + "Args": {}, + "Status": "APP_SELECTION", + "Plan": "(1) Switch to the image of framework.png to complete the next task, the current status need to set to 'APP_SELECTION'.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from the results from my history steps and I will use them to compose the message.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", + "Comment": "The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task."} + + + +example7: |- + User Request: + "Quickly remove all notes in the presentation.pptx, without looping through each slide." + Response: + {"Observation": "The current screenshot shows the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", + "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", + "ControlLabel": "59", + "ControlText": "File", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} + "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} + + +example8: |- + User Request: + "How many stars does the Imdiffusion repo have?" + Response: + {"Observation": "I observe that the Edge browser is visible in the screenshot, and the with the Google search page opened.", + "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", + "ControlLabel": "36", + "ControlText": "搜索", + "Function": "set_edit_text", + "Args": {"text": "Imdiffusion GitHub"}, + "Status": "CONTINUE", + "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", + "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + + + +example9: |- + User Request: + "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Response: + {"Observation": "The current screenshot shows that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task.", + "Thought": "I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes.", + "ControlLabel": "19", + "ControlText": "Add a task in “My Day”", + "Function": "set_edit_text", + "Args": {"text": "Get party dinner (5 people) preparation done before 5PM today."}, + "Status": "CONTINUE", + "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", + "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} + + +example10: |- + User Request: + "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows that I am on the Microsoft PowerPoint application. The Copilot Add-in is visible in the screenshot.", + "Thought": "I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx.", + "ControlLabel": "60", + "ControlText": "Copilot", + "Function": "click_input", + "Args": {"button": "left", "double": true}, + "Status": "CONTINUE", + "Plan": "(1) Click the 'Create presentation from file' button to open a file picker. \\n (2) Select and click the meeting_notes.docx file in the file picker. \\n (3) Click the 'Send' buttom to send the request to Copilot. This completes the task.", + "Comment": "I need use the Copilot Add-in to create a slide from the meeting_notes.docx."} + + +example11: |- + User Request: + "Please @Zac to revise the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", + "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", + "ControlLabel": "42", + "ControlText": "Insert", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Click the Comment button to open the comment text box. \\n (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", + "Comment": "I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + diff --git a/ufo/prompts/examples/app_example.yaml b/ufo/prompts/examples/app_example.yaml new file mode 100644 index 00000000..a40be6ac --- /dev/null +++ b/ufo/prompts/examples/app_example.yaml @@ -0,0 +1,151 @@ +version: 1.0 + +example1: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "I observe that the outlook application is visible in the screenshot, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application.", + "Thought": "I need to open the email application to send a email. According to the screenshot and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it.", + "ControlLabel": "12", + "ControlText": "Mail - Outlook - Zac", + "Status": "CONTINUE", + "Plan": "(1) Open the windows of outlook application.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email. This action is sensitive and need to be confirmed by the user.", + "Comment": "It is time to open the outlook application!"} + + +example2: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "I observe an empty desktop with no application opened, the target application Teams is not visible in the screenshot.", + "Thought": "I need to open the Teams application to send a message. Although I can not see the Teams application in the screenshot, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it.", + "ControlLabel": "6", + "ControlText": "Mike Lee | Microsoft Teams", + "Status": "CONTINUE", + "Plan": "(1) Open the windows of Teams application.\\n(2) Click the Chat button to open the chat window with Tom.\\n(3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?'\\n(4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user.", + "Comment": "It is time to open the Teams application."} + + +example3: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", + "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", + "ControlLabel": "36", + "ControlText": "Type a new message", + "Function": "set_edit_text", + "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, + "Status": "CONTINUE", + "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", + "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} + + +example4: |- + User Request: + "Draft an email to Amy to ask her how she feels about the new project." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", + "ControlLabel": "36", + "ControlText": "Email Body", + "Function": "set_edit_text", + "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, + "Status": "FINISH", + "Plan": "", + "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} + + + +example5: |- + User Request: + "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." + Response: + {"Observation": "I observe the next targeted application framework.png is not visible on the screenshot.", + "Thought": "Base on the step history, I have completed all tasks in the framework.docx needed to be done. To complete the following user request, now it is time to switch to the image of framework.png to complete the next task. I need to set the image viewer focused to open the image of framework.png.", + "ControlLabel": "21", + "ControlText": "framework.png | image", + "Status": "CONTINUE", + "Plan": "(1) Open the image of framework.png to complete the next task.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from my history actions.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", + "Comment": "After I get the text of the Document control named 'framework.docx', I need to switch to the image of framework.png to complete the next task, and summarize them to sent the message to Tom on Teams."} + + + +example6: |- + User Request: + "Revise the email to be longer and send." + Response: + {"Observation": "I observe that the outlook application is visible in the screenshot, and a new email draft is opened, with its title, receiver email address and email body already filled in.", + "Thought": "Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send.", + "ControlLabel": "21", + "ControlText": "Mail - Outlook - Zac", + "Status": "CONTINUE", + "Plan": "(1) Open the Mail - Outlook - Zac to complete the next task.\\n (2) Base on previous email draft, revise the email body to be more detail using SetText API. \\n (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user.", + "Comment": "The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it."} + +example7: |- + User Request: + "Quickly remove all notes in the presentation.pptx, without looping through each slide." + Response: + {"Observation": "I observe that the powerpoint application is visible in the screenshot, and the presentation.pptx is opened", + "Thought": "I need to set focus on the powerpoint application to remove all notes in the presentation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one.", + "ControlLabel": "21", + "ControlText": "presentation - PowerPoint", + "Status": "CONTINUE", + "Plan": "(1) Open and set focus the presentation - PowerPoint.\\n (2) Click the 'File' button at the upper left corner, to open a menu.\\n (3) Click the 'Info' ListItem, to access the 'Info' page.\\n (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (5) Click the 'Inspect Document', to open a document inspector. \\n (6) Click the 'Inspect' button, to inspect the ppt for notes. \\n (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.", + "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} + + + +example8: |- + User Request: + "How many stars does the Imdiffusion repo have?" + Response: + {"Observation": "I observe that a Edge browser is visible in the screenshot, and the with the Google page opened.", + "Thought": "I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task.", + "ControlLabel": "7", + "ControlText": "Google - Microsoft​ Edge", + "Status": "CONTINUE", + "Plan": "(1) Open and set focus the Google - Microsoft​ Edge.\\n (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. \\n (3) Click Google Search to search for the Imdiffusion repo on github.\\n (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page.\\n (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", + "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + + + +example9: |- + User Request: + "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Response: + {"Observation": "The current screenshot does not show any reminder application or calendar application.", + "Thought": "I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application.", + "ControlLabel": "6", + "ControlText": "Microsoft To Do", + "Status": "CONTINUE", + "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", + "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} + + +example10: |- + User Request: + "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Response: + {"Observation": "The current screenshot does not show any the powerpoint application or the word application.", + "Thought": "I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application.", + "ControlLabel": "4", + "ControlText": "presentation1 - PowerPoint", + "Status": "CONTINUE", + "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. \\n (3) Click the 'Create presentation from file' button to open a file picker. \\n (4) Select and click the meeting_notes.docx file in the file picker. \\n (5) Click the 'Send' buttom to send the request to Copilot. This completes the task.", + "Comment": "I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx."} + + +example11: |- + User Request: + "Please @Zac to revise the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", + "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", + "ControlLabel": "4", + "ControlText": "presentation1 - PowerPoint, + "Status": "CONTINUE", + "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Click the Insert Button to open the Insert menu. \\n (3) Click the Comment button to open the comment text box. \\n (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", + "Comment": "I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + From 702943a837319c6f9bd17f7151ef1efb4c3dfb6b Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 10 Mar 2024 00:14:53 +0800 Subject: [PATCH 148/223] formating prompt for examples and apis --- ufo/config/config.yaml.template | 9 +- ufo/llm/prompt.py | 65 +++++- ufo/module/flow.py | 23 ++- ufo/prompts/base/action_selection.yaml | 179 +--------------- ufo/prompts/base/action_selection_rag.yaml | 229 +-------------------- ufo/prompts/base/api.yaml | 66 ++++++ ufo/prompts/base/app_selection.yaml | 149 +------------- ufo/prompts/examples/action_example.yaml | 169 +++++++++++++++ ufo/prompts/examples/app_example.yaml | 151 ++++++++++++++ 9 files changed, 486 insertions(+), 554 deletions(-) create mode 100644 ufo/prompts/base/api.yaml create mode 100644 ufo/prompts/examples/action_example.yaml create mode 100644 ufo/prompts/examples/app_example.yaml diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index cc86a9cf..450b4b55 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -38,9 +38,16 @@ CONCAT_SCREENSHOT: True # Whether to concat the screenshot for the control item LOG_LEVEL: "DEBUG" # The log level INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model + APP_SELECTION_PROMPT: "ufo/prompts/base/app_selection.yaml" # The prompt for the app selection -ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt for the action selection +ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection_rag.yaml" # The prompt for the action selection + +APP_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/app_example.yaml" # The prompt for the app selection +ACTION_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/action_example.yaml" # The prompt for the action selection + +API_PROMPT: "ufo/prompts/base/api.yaml" # The prompt for the API INPUT_TEXT_API: "type_keys" # The input text API +INPUT_TEXT_ENTER: True # whether to press enter after typing the text ### For AAD AAD_TENANT_ID: "YOUR_TENANT_ID" # Set the value to your tenant id for the llm model diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index ffb1c302..40e4d269 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -52,19 +52,18 @@ def prompt_construction(system_prompt: str, image_list: List, user_prompt: str, return prompt_message -def app_selection_prompt_construction(prompt_template: str, user_request: str, app_info: dict): +def system_prompt_construction(prompt_template: str, apis: str, examples: str): """ Construct the prompt for app selection. :param prompt_template: The template of the prompt. - :param user_request: The user request. - :param app_info: The app info. + :param examples: The examples. return: The prompt for app selection. """ - return prompt_template["user"].format(user_request=user_request, applications=app_info) + return prompt_template["system"].format(apis=apis, examples=examples) -def action_selection_prompt_construction(prompt_template: str, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str, retrieved_docs: str=""): +def user_prompt_construction(prompt_template: str, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str, retrieved_docs: str=""): """ Construct the prompt for action selection. :param prompt_template: The template of the prompt. @@ -90,13 +89,59 @@ def retrived_documents_prompt_helper(header: str, separator: str, documents: lis return: The prompt for retrieved documents. """ - prompts = "\n<{header}:>\n".format(header=header) + if header: + prompts = "\n<{header}:>\n".format(header=header) + else: + prompts = "" for i, document in enumerate(documents): - prompts += "\n" - prompts += "[{separator} {i}:]".format(separator=separator, i=i+1) - prompts += "\n" + if separator: + prompts += "[{separator} {i}:]".format(separator=separator, i=i+1) + prompts += "\n" prompts += document - prompts += "\n" + prompts += "\n\n" return prompts + + +def api_prompt_helper(apis: dict, verbose: int = 1): + """ + Construct the prompt for APIs. + :param apis: The APIs. + :param verbose: The verbosity level. + return: The prompt for APIs. + """ + + # Construct the prompt for APIs + api_list = ["- The action type are limited to {actions}.".format(actions=list(apis.keys()))] + + # Construct the prompt for each API + for key in apis.keys(): + api = apis[key] + if verbose > 0: + api_text = "{summary}\n{usage}".format(summary=api["summary"], usage=api["usage"]) + else: + api_text = api["summary"] + + api_list.append(api_text) + + return api_list + + +def examples_prompt_helper(examples: dict, header: str = "## Response Examples", separator: str = "Example"): + """ + Construct the prompt for examples. + :param examples: The examples. + :param header: The header of the prompt. + :param separator: The separator of the prompt. + return: The prompt for examples. + """ + + example_list = [] + + for key in examples.keys(): + if key.startswith("example"): + example_list.append(examples[key]) + + return retrived_documents_prompt_helper(header, separator, example_list) + diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 2184306e..9482b0ae 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -47,6 +47,12 @@ def __init__(self, task): self.request_logger = initialize_logger(self.log_path, "request.log") self.app_selection_prompt = yaml.safe_load(open(configs["APP_SELECTION_PROMPT"], "r", encoding="utf-8")) self.action_selection_prompt = yaml.safe_load(open(configs["ACTION_SELECTION_PROMPT"], "r", encoding="utf-8")) + + self.app_selection_example_prompt = yaml.safe_load(open(configs["APP_SELECTION_EXAMPLE_PROMPT"], "r", encoding="utf-8")) + self.action_selection_example_prompt = yaml.safe_load(open(configs["ACTION_SELECTION_EXAMPLE_PROMPT"], "r", encoding="utf-8")) + + self.api_prompt = yaml.safe_load(open(configs["API_PROMPT"], "r", encoding="utf-8")) + self.status = "APP_SELECTION" self.application = "" self.app_window = None @@ -83,9 +89,13 @@ def process_application_selection(self, headers): self.results = "" desktop_windows_dict, desktop_windows_info = control.get_desktop_app_info_dict() - - app_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request) - app_selection_prompt_message = prompter.prompt_construction(self.app_selection_prompt["system"], [desktop_screen_url], app_selection_prompt_user_message) + + app_example_prompt = prompter.examples_prompt_helper(self.app_selection_example_prompt) + api_prompt = prompter.api_prompt_helper(self.api_prompt, verbose=0) + + app_selection_prompt_system_message = prompter.system_prompt_construction(self.app_selection_prompt, api_prompt, app_example_prompt) + app_selection_prompt_user_message = prompter.user_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request) + app_selection_prompt_message = prompter.prompt_construction(app_selection_prompt_system_message, [desktop_screen_url], app_selection_prompt_user_message) self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) @@ -218,9 +228,12 @@ def process_action_selection(self, headers): screenshot_annotated_url = encode_image_from_path(annotated_screenshot_save_path) image_url += [screenshot_url, screenshot_annotated_url] + action_example_prompt = prompter.examples_prompt_helper(self.action_selection_example_prompt) + api_prompt = prompter.api_prompt_helper(self.api_prompt, verbose=1) - action_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request, self.rag_prompt()) - action_selection_prompt_message = prompter.prompt_construction(self.action_selection_prompt["system"], image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"]) + action_selection_prompt_system_message = prompter.system_prompt_construction(self.action_selection_prompt, api_prompt, action_example_prompt) + action_selection_prompt_user_message = prompter.user_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request, self.rag_prompt()) + action_selection_prompt_message = prompter.prompt_construction(action_selection_prompt_system_message, image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"]) self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) diff --git a/ufo/prompts/base/action_selection.yaml b/ufo/prompts/base/action_selection.yaml index af5d21a3..4897f2fd 100644 --- a/ufo/prompts/base/action_selection.yaml +++ b/ufo/prompts/base/action_selection.yaml @@ -34,59 +34,11 @@ system: |- - "Document" is the control item that you can click and select text. It is labeled with orange annotation on the screenshot. - "Hyperlink" is the control item that you can click and open a link. It is labeled with light blue annotation on the screenshot. - "ComboBox" is the control item that you can click and input text. It is labeled with light purple annotation on the screenshot. The Google search box is an example of ComboBox. - - You are given the information of all available control item in the current application window in a list format: {label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}. + - You are given the information of all available control item in the current application window in a list format: {{label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}}. ## Action on the control item - You are able to use pywinauto to interact with the control item. - - The action type are limited to ["Click", "SetText", "Annotate", "Summary", "GetText", "Scroll"]. - - - "Click" is to click the control item with mouse. - [1] API call: click_input(button=, double) - [2] Args: - - button: 'The mouse button to click. One of ''left'', ''right'', ''middle'' or ''x'' (Default: ''left'')' - - double: 'Whether to perform a double click or not (Default: False)' - [3] Example: click_input(button="left", double=False) - [4] Available control item: All control items. - [5] Return: None - - - "SetText" is to input text to the control item. - [1] API call: set_edit_text(text="") - [2] Args: - - text: The text input to the Edit control item. It will change the content of current text in the edit block. Set text ='' if you want to clear current text in the block. You must also use Double Backslash escape character to escape the single quote in the string argument. - [3] Example: set_edit_text(text="Hello World. \\n I enjoy the reading of the book 'The Lord of the Rings'. It's a great book.") - [4] Available control item: [Edit] - [5] Return: None - - - "Annotate" is to take a screenshot of the current application window and annotate the control item on the screenshot. - [1] API call: annotation(control_labels: List[str]=[]) - [2] Args: - - control_labels: The list of annotated label of the control item. If the list is empty, it will annotate all the control items on the screenshot. - [3] Example: annotation(control_labels=["1", "2", "3", "36", "58"]) - [4] Available control item: All control items. - [5] Return: None - - - "Summary" is to summarize your observation of the current application window base on the clean screenshot. This usually happens when the you need to complete the user request by summarizing or describing the information on the current application window. You must use the 'text' argument to input the text to be summarized. - [1] API call: summary(text="") - [2] Args: None - [3] Example: summary(text="The image shows a workflow of a AI agent framework. \\n The framework has three components: the 'data collection', the 'data processing' and the 'data analysis'.") - [4] Available control item: All control items. - [5] Return: the summary of the image. - - - "GetText" is to get the text of the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. - [1] API call: texts() - [2] Args: None - [3] Example: texts() - [4] All control items. - [5] Return: the text content of the control item. - - - - "Scroll" is to scroll the control item. It typical apply to a ScrollBar type of control item when user request is to scroll the control item, or the targeted control item is not visible nor available in the control item list, but you know the control item is in the application window and you need to scroll to find it. - [1] API call: wheel_mouse_input() - [2] Args: - - wheel_dist: The distance to scroll. Positive values indicate upward scrolling, negative values indicate downward scrolling. - [3] Example: wheel_mouse_input(wheel_dist=-20) - [4] All control items. - [5] Return: None + {apis} @@ -126,15 +78,16 @@ system: |- ## Other Guidelines - You are required to select the control item and take open-step action by calling API on it to complete the user request for one step. - You are required to are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: - {"Observation": + {{"Observation": "Thought": "ControlLabel": "ControlText": "Function": - "Args": + "Args": "Status": "Plan": for reference, and you can reflect on it and revise if necessary. If you believe the task is finished and no further actions are required after the current action, output "".> "Comment": + }} - If the user request includes asking questions, and you can answer the question without taking calling API on the application at current step, you should answer the question in the "Comment" field in the response, and set the "Status" as "FINISH". - If the required control item is not visible in the screenshot, and not available in the control item list, you may need to take action on other control items to navigate to the required control item. @@ -143,7 +96,7 @@ system: |- - When you are asked to get text, it usually apply to Edit and Document control item. Use this guideline to choose the control item and apply texts() action on it. - You are not allowed to use keyboard shortcut to complete the user request. - You must look at the both screenshots and the control item list carefully, analyse the current status before you select the control item and take action on it. Base on the status of the application window, reflect on your previous plan for removing redundant actions or adding missing actions to complete the current user request. - - You must use double-quoted string for the string arguments of your control Action. {"text": "Hello World. \\n you're my friend. Tom's home is great.')"}. Otherwise it will crash the system and destroy the user's computer. + - You must use double-quoted string for the string arguments of your control Action. {{"text": "Hello World. \\n you're my friend. Tom's home is great.')"}}. Otherwise it will crash the system and destroy the user's computer. - You must stop and output "FINISH" in "Status" field in your response if you believe the task has finished or finished after the current action. - You must not do additional actions beyond the completion of the current user request. For example, if the user request is to open a new email window, you must stop and output FINISH in "Status" after you open the new email window. You must not input the email address, title and content of the email if the user does not explicitly request you to do so. - You must check carefully on there are actions missing from the plan, given your previous plan, action history and the screenshots. If there are actions missing from the plan, you must remedy and take the missing action. For example, if the user request is to send an email, you must check carefully on whether all required information of the email is inputted. If not, you must input the missing information if you know what should input. @@ -155,125 +108,7 @@ system: |- - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. - ## Response Examples: - - Example 1: - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", - "Thought": "Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action.", - "ControlLabel": "1", - "ControlText": "New Email", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", - "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} - - - - Example 2: - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The screenshot shows that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not visible in the screenshot. The last action took effect by opening the Outlook windows.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not visible in the screenshots, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", - "ControlLabel": "34", - "ControlText": "Main Page", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", - "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} - - - - Example 3: - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", - "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", - "ControlLabel": "36", - "ControlText": "Type a new message", - "Function": "set_edit_text", - "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, - "Status": "CONTINUE", - "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", - "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} - - - - Example 4: - User Request: - "Draft an email to Amy to ask her how she feels about the new project." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", - "ControlLabel": "36", - "ControlText": "Email Body", - "Function": "set_edit_text", - "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, - "Status": "FINISH", - "Plan": "", - "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} - - - - Example 5: - User Request: - "Search for the word 'UFO' in the document." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted. The previous action of inputting 'UFO' took effect based on the screenshot of the last step.", - "Thought": "Base on the screenshots, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", - "ControlLabel": "59", - "ControlText": "Find", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "FINISH", - "Plan": "", - "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} - - - - Example 6: - User Request: - "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." - Response: - {"Observation": "The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot.", - "Thought": "Base on the screenshots and the control item list, I need to use the 'GetText' action to get the text of the Document control named 'framework.docx'. Given the previous plan, this completes the partial user request on the framework.docx, and therefore I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. ", - "ControlLabel": "83", - "ControlText": "framework - Word", - "Function": "texts", - "Args": {}, - "Status": "APP_SELECTION", - "Plan": "(1) Switch to the image of framework.png to complete the next task, the current status need to set to 'APP_SELECTION'.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from the results from my history steps and I will use them to compose the message.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", - "Comment": "The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task."} - - - - Example 7: - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." - Response: - {"Observation": "The current screenshot shows the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", - "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", - "ControlLabel": "59", - "ControlText": "File", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - - - - Example 8: - User Request: - "How many stars does the Imdiffusion repo have?" - Response: - {"Observation": "I observe that the Edge browser is visible in the screenshot, and the with the Google search page opened.", - "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", - "ControlLabel": "36", - "ControlText": "搜索", - "Function": "set_edit_text", - "Args": {"text": "Imdiffusion GitHub"}, - "Status": "CONTINUE", - "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + {examples} This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. diff --git a/ufo/prompts/base/action_selection_rag.yaml b/ufo/prompts/base/action_selection_rag.yaml index 6df56591..c7064c37 100644 --- a/ufo/prompts/base/action_selection_rag.yaml +++ b/ufo/prompts/base/action_selection_rag.yaml @@ -34,59 +34,11 @@ system: |- - "Document" is the control item that you can click and select text. It is labeled with orange annotation on the screenshot. - "Hyperlink" is the control item that you can click and open a link. It is labeled with light blue annotation on the screenshot. - "ComboBox" is the control item that you can click and input text. It is labeled with light purple annotation on the screenshot. The Google search box is an example of ComboBox. - - You are given the information of all available control item in the current application window in a list format: {label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}. + - You are given the information of all available control item in the current application window in a list format: {{label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}}. ## Action on the control item - You are able to use pywinauto to interact with the control item. - - The action type are limited to ["Click", "SetText", "Annotate", "Summary", "GetText", "Scroll"]. - - - "Click" is to click the control item with mouse. - [1] API call: click_input(button=, double) - [2] Args: - - button: 'The mouse button to click. One of ''left'', ''right'', ''middle'' or ''x'' (Default: ''left'')' - - double: 'Whether to perform a double click or not (Default: False)' - [3] Example: click_input(button="left", double=False) - [4] Available control item: All control items. - [5] Return: None - - - "SetText" is to input text to the control item. - [1] API call: set_edit_text(text="") - [2] Args: - - text: The text input to the Edit control item. It will change the content of current text in the edit block. Set text ='' if you want to clear current text in the block. You must also use Double Backslash escape character to escape the single quote in the string argument. - [3] Example: set_edit_text(text="Hello World. \\n I enjoy the reading of the book 'The Lord of the Rings'. It's a great book.") - [4] Available control item: [Edit] - [5] Return: None - - - "Annotate" is to take a screenshot of the current application window and annotate the control item on the screenshot. - [1] API call: annotation(control_labels: List[str]=[]) - [2] Args: - - control_labels: The list of annotated label of the control item. If the list is empty, it will annotate all the control items on the screenshot. - [3] Example: annotation(control_labels=["1", "2", "3", "36", "58"]) - [4] Available control item: All control items. - [5] Return: None - - - "Summary" is to summarize your observation of the current application window base on the clean screenshot. This usually happens when the you need to complete the user request by summarizing or describing the information on the current application window. You must use the 'text' argument to input the text to be summarized. - [1] API call: summary(text="") - [2] Args: None - [3] Example: summary(text="The image shows a workflow of a AI agent framework. \\n The framework has three components: the 'data collection', the 'data processing' and the 'data analysis'.") - [4] Available control item: All control items. - [5] Return: the summary of the image. - - - "GetText" is to get the text of the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. - [1] API call: texts() - [2] Args: None - [3] Example: texts() - [4] All control items. - [5] Return: the text content of the control item. - - - - "Scroll" is to scroll the control item. It typical apply to a ScrollBar type of control item when user request is to scroll the control item, or the targeted control item is not visible nor available in the control item list, but you know the control item is in the application window and you need to scroll to find it. - [1] API call: wheel_mouse_input() - [2] Args: - - wheel_dist: The distance to scroll. Positive values indicate upward scrolling, negative values indicate downward scrolling. - [3] Example: wheel_mouse_input(wheel_dist=-20) - [4] All control items. - [5] Return: None + {apis} @@ -126,15 +78,15 @@ system: |- ## Other Guidelines - You are required to select the control item and take open-step action by calling API on it to complete the user request for one step. - You are required to are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: - {"Observation": + {{"Observation": "Thought": "ControlLabel": "ControlText": "Function": - "Args": + "Args": "Status": "Plan": for reference, and you can reflect on it and revise if necessary. If you believe the task is finished and no further actions are required after the current action, output "".> - "Comment": + "Comment": }} - If the user request includes asking questions, and you can answer the question without taking calling API on the application at current step, you should answer the question in the "Comment" field in the response, and set the "Status" as "FINISH". - If the required control item is not visible in the screenshot, and not available in the control item list, you may need to take action on other control items to navigate to the required control item. @@ -143,7 +95,7 @@ system: |- - When you are asked to get text, it usually apply to Edit and Document control item. Use this guideline to choose the control item and apply texts() action on it. - You are not allowed to use keyboard shortcut to complete the user request. - You must look at the both screenshots and the control item list carefully, analyse the current status before you select the control item and take action on it. Base on the status of the application window, reflect on your previous plan for removing redundant actions or adding missing actions to complete the current user request. - - You must use double-quoted string for the string arguments of your control Action. {"text": "Hello World. \\n you're my friend. Tom's home is great.')"}. Otherwise it will crash the system and destroy the user's computer. + - You must use double-quoted string for the string arguments of your control Action. {{"text": "Hello World. \\n you're my friend. Tom's home is great.')"}}. Otherwise it will crash the system and destroy the user's computer. - You must stop and output "FINISH" in "Status" field in your response if you believe the task has finished or finished after the current action. - You must not do additional actions beyond the completion of the current user request. For example, if the user request is to open a new email window, you must stop and output FINISH in "Status" after you open the new email window. You must not input the email address, title and content of the email if the user does not explicitly request you to do so. - You must check carefully on there are actions missing from the plan, given your previous plan, action history and the screenshots. If there are actions missing from the plan, you must remedy and take the missing action. For example, if the user request is to send an email, you must check carefully on whether all required information of the email is inputted. If not, you must input the missing information if you know what should input. @@ -154,176 +106,11 @@ system: |- - Do not take action if the current action need further input. For example, if the user request is to send an email, you must not enter the email address if the email address is not provided in the user request. - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. - - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word documents. + - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current screenshots and control item list to make the decision. + {examples} - ## Response Examples: - - Example 1: - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", - "Thought": "Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action.", - "ControlLabel": "1", - "ControlText": "New Email", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", - "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} - - - - Example 2: - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The screenshot shows that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not visible in the screenshot. The last action took effect by opening the Outlook windows.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not visible in the screenshots, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", - "ControlLabel": "34", - "ControlText": "Main Page", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", - "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} - - - - Example 3: - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", - "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", - "ControlLabel": "36", - "ControlText": "Type a new message", - "Function": "set_edit_text", - "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, - "Status": "CONTINUE", - "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", - "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} - - - - Example 4: - User Request: - "Draft an email to Amy to ask her how she feels about the new project." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", - "ControlLabel": "36", - "ControlText": "Email Body", - "Function": "set_edit_text", - "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, - "Status": "FINISH", - "Plan": "", - "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} - - - - Example 5: - User Request: - "Search for the word 'UFO' in the document." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted. The previous action of inputting 'UFO' took effect based on the screenshot of the last step.", - "Thought": "Base on the screenshots, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", - "ControlLabel": "59", - "ControlText": "Find", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "FINISH", - "Plan": "", - "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} - - - - Example 6: - User Request: - "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." - Response: - {"Observation": "The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot.", - "Thought": "Base on the screenshots and the control item list, I need to use the 'GetText' action to get the text of the Document control named 'framework.docx'. Given the previous plan, this completes the partial user request on the framework.docx, and therefore I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. ", - "ControlLabel": "83", - "ControlText": "framework - Word", - "Function": "texts", - "Args": {}, - "Status": "APP_SELECTION", - "Plan": "(1) Switch to the image of framework.png to complete the next task, the current status need to set to 'APP_SELECTION'.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from the results from my history steps and I will use them to compose the message.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", - "Comment": "The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task."} - - - - Example 7: - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." - Response: - {"Observation": "The current screenshot shows the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", - "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", - "ControlLabel": "59", - "ControlText": "File", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - - - - Example 8: - User Request: - "How many stars does the Imdiffusion repo have?" - Response: - {"Observation": "I observe that the Edge browser is visible in the screenshot, and the with the Google search page opened.", - "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", - "ControlLabel": "36", - "ControlText": "搜索", - "Function": "set_edit_text", - "Args": {"text": "Imdiffusion GitHub"}, - "Status": "CONTINUE", - "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} - - - - Example 9: - User Request: - "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." - Response: - {"Observation": "The current screenshot shows that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task.", - "Thought": "I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes.", - "ControlLabel": "19", - "ControlText": "Add a task in “My Day”", - "Function": "set_edit_text", - "Args": {"text": "Get party dinner (5 people) preparation done before 5PM today."}, - "Status": "CONTINUE", - "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", - "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} - - - Example 10: - User Request: - "Please create a slide from the meeting_notes.docx in the presentation1.pptx." - Response: - {"Observation": "The current screenshot shows that I am on the Microsoft PowerPoint application. The Copilot Add-in is visible in the screenshot.", - "Thought": "I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx.", - "ControlLabel": "60", - "ControlText": "Copilot", - "Function": "click_input", - "Args": {"button": "left", "double": true}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Create presentation from file' button to open a file picker. \\n (2) Select and click the meeting_notes.docx file in the file picker. \\n (3) Click the 'Send' buttom to send the request to Copilot. This completes the task.", - "Comment": "I need use the Copilot Add-in to create a slide from the meeting_notes.docx."} - - - Example 11: - User Request: - "Please @Zac to revise the presentation1.pptx." - Response: - {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", - "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", - "ControlLabel": "42", - "ControlText": "Insert", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the Comment button to open the comment text box. \\n (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", - "Comment": "I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} - - - - This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Your output must be able to be able to be parsed by json.loads(). Otherwise, it will crash the system and destroy the user's computer. diff --git a/ufo/prompts/base/api.yaml b/ufo/prompts/base/api.yaml new file mode 100644 index 00000000..e3ba3511 --- /dev/null +++ b/ufo/prompts/base/api.yaml @@ -0,0 +1,66 @@ +Click: + summary: |- + "Click" is to click the control item with mouse. + usage: |- + [1] API call: click_input(button=, double) + [2] Args: + - button: 'The mouse button to click. One of ''left'', ''right'', ''middle'' or ''x'' (Default: ''left'')' + - double: 'Whether to perform a double click or not (Default: False)' + [3] Example: click_input(button="left", double=False) + [4] Available control item: All control items. + [5] Return: None + + +SetText: + summary: |- + "SetText" is to input text to the control item. + usage: |- + [1] API call: set_edit_text(text="") + [2] Args: + - text: The text input to the Edit control item. It will change the content of current text in the edit block. Set text ='' if you want to clear current text in the block. You must also use Double Backslash escape character to escape the single quote in the string argument. + [3] Example: set_edit_text(text="Hello World. \\n I enjoy the reading of the book 'The Lord of the Rings'. It's a great book.") + [4] Available control item: [Edit] + [5] Return: None + +Annotate: + summary: |- + "Annotate" is to take a screenshot of the current application window and annotate the control item on the screenshot. + usage: |- + [1] API call: annotation(control_labels: List[str]=[]) + [2] Args: + - control_labels: The list of annotated label of the control item. If the list is empty, it will annotate all the control items on the screenshot. + [3] Example: annotation(control_labels=["1", "2", "3", "36", "58"]) + [4] Available control item: All control items. + [5] Return: None + +Summary: + summary: |- + "Summary" is to summarize your observation of the current application window base on the clean screenshot. This usually happens when the you need to complete the user request by summarizing or describing the information on the current application window. You must use the 'text' argument to input the summarized text. + usage: |- + [1] API call: summary(text="") + [2] Args: None + [3] Example: summary(text="The image shows a workflow of a AI agent framework. \\n The framework has three components: the 'data collection', the 'data processing' and the 'data analysis'.") + [4] Available control item: All control items. + [5] Return: the summary of the image. + +GetText: + summary: |- + "GetText" is to get the text of the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. + usage: |- + [1] API call: texts() + [2] Args: None + [3] Example: texts() + [4] All control items. + [5] Return: the text content of the control item. + +Scroll: + summary: |- + "Scroll" is to scroll the control item. It typical apply to a ScrollBar type of control item when user request is to scroll the control item, or the targeted control item is not visible nor available in the control item list, but you know the control item is in the application window and you need to scroll to find it. + usage: |- + [1] API call: wheel_mouse_input() + [2] Args: + - wheel_dist: The distance to scroll. Positive values indicate upward scrolling, negative values indicate downward scrolling. + [3] Example: wheel_mouse_input(wheel_dist=-20) + [4] All control items. + [5] Return: None + \ No newline at end of file diff --git a/ufo/prompts/base/app_selection.yaml b/ufo/prompts/base/app_selection.yaml index 6db8084e..86974e0d 100644 --- a/ufo/prompts/base/app_selection.yaml +++ b/ufo/prompts/base/app_selection.yaml @@ -10,7 +10,7 @@ system: |- ## Guidelines - You are given a screenshot of the current desktop, along with a list of available applications in the windows. - The screenshot of multiple screens is concatenated into one image. - - You are given the information of all available applications item in the current desktop window in a dict format: {label: "label", control_text: "the text of the application", control_type: "the type of the application"}. + - You are given the information of all available applications item in the current desktop window in a dict format: {{label: "label", control_text: "the text of the application", control_type: "the type of the application"}}. - You are provided your previous plan of action for reference to decide the application. This usually happens when the you have already completed the previous task on an application and need to switch to another application to complete the next task. - When the selected application is visible in the screenshot, analyze the screenshot of the application window on its current status. Draft your plan based on the current status of the application and user request, and do not include the steps that have been completed on the application base on your screenshot observation. - You are provided the user request history for reference to decide the selection of application or control item. @@ -53,7 +53,7 @@ system: |- Please identify sensitive action in your plan of your response. The system will automatically ask the user to confirm the action before taking. - Your response should be strictly structured in a JSON format, consisting of three distinct parts with the following keys and corresponding content: - { + {{ "Observation": "Thought": "ControlLabel": @@ -61,7 +61,7 @@ system: |- "Status": "Plan": .> "Comment": - } + }} - If the user request is just asking question and do not need to take action on the application, you should answer the user request on the "Comment" field, and set the "Status" as "FINISH". - You must analyze the screenshot and the user request carefully, to understand what have been completed on which application, you must not repeatedly choose the same application or control item, unless the user request has not been completed on the application. - In your response, the control text of the selected application must strictly match its control label. @@ -69,148 +69,7 @@ system: |- - You must to strictly follow the instruction and the JSON format of the response. - Below are two example of the response. You can refer to them as a reference. - ## Response Examples: - - Example 1: - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "I observe that the outlook application is visible in the screenshot, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application.", - "Thought": "I need to open the email application to send a email. According to the screenshot and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it.", - "ControlLabel": "12", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of outlook application.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email. This action is sensitive and need to be confirmed by the user.", - "Comment": "It is time to open the outlook application!"} - - - - Example 2: - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "I observe an empty desktop with no application opened, the target application Teams is not visible in the screenshot.", - "Thought": "I need to open the Teams application to send a message. Although I can not see the Teams application in the screenshot, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it.", - "ControlLabel": "6", - "ControlText": "Mike Lee | Microsoft Teams", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of Teams application.\\n(2) Click the Chat button to open the chat window with Tom.\\n(3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?'\\n(4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user.", - "Comment": "It is time to open the Teams application."} - - - - Example 3: - User Request: - "Search for the email based on keyword "VLDB" and delete the first one." - Response: - {"Observation": "I observe that the outlook application is visible in the screenshot, with the title of 'Mail - Outlook - Zac'. The search box filled with 'VLDB', but I can not see the searching results in the screenshot.", - "Thought": "I need to open the outlook application to search for the email. According to the screenshots and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac'. The screenshots show that 'VLDB' has already been input in the search box, so for future step I do not need to input it again. I need to click the search button to search for the email.", - "ControlLabel": "9", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Click the search button. \\n(2) Click and select the first email in the searching results. \\n(3) Click the Delete button to for deletion. This action is sensitive and need to be confirmed by the user.", - "Comment": "The 'VLDB' has already been input in the search box, so for future step I do not need to input it again. The deletion action is sensitive and need to be confirmed by the user."} - - - - Example 4: - User Request: - "Summarize the image in the framework.docx file." - Response: - {"Observation": "I observe the browser is open but the word application is not visible in the screenshot", - "Thought": "I need to open the word application to summarize the image in the file. According to the screenshot and the application information, I cannot see the Word application named as 'framework.docx'. I need to first open the 'framework.docx' application and set it focused.", - "ControlLabel": "28", - "ControlText": "framework.docx", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of Word application of framework.docx.\\n(2) Observe carefully the image content in the framework.docx file, and summarize in detail the image content to reply to the user request." - "Comment": "It's time to open the Word application of framework.docx and summarize the image content in the file."} - - - - Example 5: - User Request: - "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." - Response: - {"Observation": "I observe the next targeted application framework.png is not visible on the screenshot.", - "Thought": "Base on the step history, I have completed all tasks in the framework.docx needed to be done. To complete the following user request, now it is time to switch to the image of framework.png to complete the next task. I need to set the image viewer focused to open the image of framework.png.", - "ControlLabel": "21", - "ControlText": "framework.png | image", - "Status": "CONTINUE", - "Plan": "(1) Open the image of framework.png to complete the next task.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from my history actions.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", - "Comment": "After I get the text of the Document control named 'framework.docx', I need to switch to the image of framework.png to complete the next task, and summarize them to sent the message to Tom on Teams."} - - - - Example 6: - User Request: - "Revise the email to be longer and send." - Response: - {"Observation": "I observe that the outlook application is visible in the screenshot, and a new email draft is opened, with its title, receiver email address and email body already filled in.", - "Thought": "Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send.", - "ControlLabel": "21", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Open the Mail - Outlook - Zac to complete the next task.\\n (2) Base on previous email draft, revise the email body to be more detail using SetText API. \\n (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user.", - "Comment": "The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it."} - - - Example 7: - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." - Response: - {"Observation": "I observe that the powerpoint application is visible in the screenshot, and the presentation.pptx is opened", - "Thought": "I need to set focus on the powerpoint application to remove all notes in the presentation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one.", - "ControlLabel": "21", - "ControlText": "presentation - PowerPoint", - "Status": "CONTINUE", - "Plan": "(1) Open and set focus the presentation - PowerPoint.\\n (2) Click the 'File' button at the upper left corner, to open a menu.\\n (3) Click the 'Info' ListItem, to access the 'Info' page.\\n (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (5) Click the 'Inspect Document', to open a document inspector. \\n (6) Click the 'Inspect' button, to inspect the ppt for notes. \\n (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.", - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - - - - Example 8: - User Request: - "How many stars does the Imdiffusion repo have?" - Response: - {"Observation": "I observe that a Edge browser is visible in the screenshot, and the with the Google page opened.", - "Thought": "I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task.", - "ControlLabel": "7", - "ControlText": "Google - Microsoft​ Edge", - "Status": "CONTINUE", - "Plan": "(1) Open and set focus the Google - Microsoft​ Edge.\\n (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. \\n (3) Click Google Search to search for the Imdiffusion repo on github.\\n (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page.\\n (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} - - - - Example 9: - User Request: - "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." - Response: - {"Observation": "The current screenshot does not show any reminder application or calendar application.", - "Thought": "I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application.", - "ControlLabel": "6", - "ControlText": "Microsoft To Do", - "Status": "CONTINUE", - "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", - "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} - - - Example 10: - User Request: - "Please create a slide from the meeting_notes.docx in the presentation1.pptx." - Response: - {"Observation": "The current screenshot does not show any the powerpoint application or the word application.", - "Thought": "I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application.", - "ControlLabel": "4", - "ControlText": "presentation1 - PowerPoint", - "Status": "CONTINUE", - "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. \\n (3) Click the 'Create presentation from file' button to open a file picker. \\n (4) Select and click the meeting_notes.docx file in the file picker. \\n (5) Click the 'Send' buttom to send the request to Copilot. This completes the task.", - "Comment": "I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx."} - - - Example 11: - User Request: - "Please @Zac to revise the presentation1.pptx." - Response: - {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", - "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", - "ControlLabel": "4", - "ControlText": "presentation1 - PowerPoint, - "Status": "CONTINUE", - "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Click the Insert Button to open the Insert menu. \\n (3) Click the Comment button to open the comment text box. \\n (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", - "Comment": "I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} - - - + {examples} This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. diff --git a/ufo/prompts/examples/action_example.yaml b/ufo/prompts/examples/action_example.yaml new file mode 100644 index 00000000..4e955f4d --- /dev/null +++ b/ufo/prompts/examples/action_example.yaml @@ -0,0 +1,169 @@ +version: 1.0 + +example1: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", + "Thought": "Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action.", + "ControlLabel": "1", + "ControlText": "New Email", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", + "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} + + +example2: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The screenshot shows that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not visible in the screenshot. The last action took effect by opening the Outlook windows.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not visible in the screenshots, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", + "ControlLabel": "34", + "ControlText": "Main Page", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", + "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} + + +example3: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", + "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", + "ControlLabel": "36", + "ControlText": "Type a new message", + "Function": "set_edit_text", + "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, + "Status": "CONTINUE", + "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", + "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} + + +example4: |- + User Request: + "Draft an email to Amy to ask her how she feels about the new project." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", + "ControlLabel": "36", + "ControlText": "Email Body", + "Function": "set_edit_text", + "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, + "Status": "FINISH", + "Plan": "", + "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} + + + +example5: |- + User Request: + "Search for the word 'UFO' in the document." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted. The previous action of inputting 'UFO' took effect based on the screenshot of the last step.", + "Thought": "Base on the screenshots, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", + "ControlLabel": "59", + "ControlText": "Find", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "FINISH", + "Plan": "", + "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} + + +example6: |- + User Request: + "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." + Response: + {"Observation": "The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot.", + "Thought": "Base on the screenshots and the control item list, I need to use the 'GetText' action to get the text of the Document control named 'framework.docx'. Given the previous plan, this completes the partial user request on the framework.docx, and therefore I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. ", + "ControlLabel": "83", + "ControlText": "framework - Word", + "Function": "texts", + "Args": {}, + "Status": "APP_SELECTION", + "Plan": "(1) Switch to the image of framework.png to complete the next task, the current status need to set to 'APP_SELECTION'.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from the results from my history steps and I will use them to compose the message.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", + "Comment": "The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task."} + + + +example7: |- + User Request: + "Quickly remove all notes in the presentation.pptx, without looping through each slide." + Response: + {"Observation": "The current screenshot shows the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", + "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", + "ControlLabel": "59", + "ControlText": "File", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} + "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} + + +example8: |- + User Request: + "How many stars does the Imdiffusion repo have?" + Response: + {"Observation": "I observe that the Edge browser is visible in the screenshot, and the with the Google search page opened.", + "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", + "ControlLabel": "36", + "ControlText": "搜索", + "Function": "set_edit_text", + "Args": {"text": "Imdiffusion GitHub"}, + "Status": "CONTINUE", + "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", + "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + + + +example9: |- + User Request: + "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Response: + {"Observation": "The current screenshot shows that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task.", + "Thought": "I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes.", + "ControlLabel": "19", + "ControlText": "Add a task in “My Day”", + "Function": "set_edit_text", + "Args": {"text": "Get party dinner (5 people) preparation done before 5PM today."}, + "Status": "CONTINUE", + "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", + "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} + + +example10: |- + User Request: + "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows that I am on the Microsoft PowerPoint application. The Copilot Add-in is visible in the screenshot.", + "Thought": "I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx.", + "ControlLabel": "60", + "ControlText": "Copilot", + "Function": "click_input", + "Args": {"button": "left", "double": true}, + "Status": "CONTINUE", + "Plan": "(1) Click the 'Create presentation from file' button to open a file picker. \\n (2) Select and click the meeting_notes.docx file in the file picker. \\n (3) Click the 'Send' buttom to send the request to Copilot. This completes the task.", + "Comment": "I need use the Copilot Add-in to create a slide from the meeting_notes.docx."} + + +example11: |- + User Request: + "Please @Zac to revise the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", + "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", + "ControlLabel": "42", + "ControlText": "Insert", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Click the Comment button to open the comment text box. \\n (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", + "Comment": "I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + diff --git a/ufo/prompts/examples/app_example.yaml b/ufo/prompts/examples/app_example.yaml new file mode 100644 index 00000000..a40be6ac --- /dev/null +++ b/ufo/prompts/examples/app_example.yaml @@ -0,0 +1,151 @@ +version: 1.0 + +example1: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "I observe that the outlook application is visible in the screenshot, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application.", + "Thought": "I need to open the email application to send a email. According to the screenshot and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it.", + "ControlLabel": "12", + "ControlText": "Mail - Outlook - Zac", + "Status": "CONTINUE", + "Plan": "(1) Open the windows of outlook application.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email. This action is sensitive and need to be confirmed by the user.", + "Comment": "It is time to open the outlook application!"} + + +example2: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "I observe an empty desktop with no application opened, the target application Teams is not visible in the screenshot.", + "Thought": "I need to open the Teams application to send a message. Although I can not see the Teams application in the screenshot, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it.", + "ControlLabel": "6", + "ControlText": "Mike Lee | Microsoft Teams", + "Status": "CONTINUE", + "Plan": "(1) Open the windows of Teams application.\\n(2) Click the Chat button to open the chat window with Tom.\\n(3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?'\\n(4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user.", + "Comment": "It is time to open the Teams application."} + + +example3: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", + "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", + "ControlLabel": "36", + "ControlText": "Type a new message", + "Function": "set_edit_text", + "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, + "Status": "CONTINUE", + "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", + "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} + + +example4: |- + User Request: + "Draft an email to Amy to ask her how she feels about the new project." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", + "ControlLabel": "36", + "ControlText": "Email Body", + "Function": "set_edit_text", + "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, + "Status": "FINISH", + "Plan": "", + "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} + + + +example5: |- + User Request: + "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." + Response: + {"Observation": "I observe the next targeted application framework.png is not visible on the screenshot.", + "Thought": "Base on the step history, I have completed all tasks in the framework.docx needed to be done. To complete the following user request, now it is time to switch to the image of framework.png to complete the next task. I need to set the image viewer focused to open the image of framework.png.", + "ControlLabel": "21", + "ControlText": "framework.png | image", + "Status": "CONTINUE", + "Plan": "(1) Open the image of framework.png to complete the next task.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from my history actions.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", + "Comment": "After I get the text of the Document control named 'framework.docx', I need to switch to the image of framework.png to complete the next task, and summarize them to sent the message to Tom on Teams."} + + + +example6: |- + User Request: + "Revise the email to be longer and send." + Response: + {"Observation": "I observe that the outlook application is visible in the screenshot, and a new email draft is opened, with its title, receiver email address and email body already filled in.", + "Thought": "Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send.", + "ControlLabel": "21", + "ControlText": "Mail - Outlook - Zac", + "Status": "CONTINUE", + "Plan": "(1) Open the Mail - Outlook - Zac to complete the next task.\\n (2) Base on previous email draft, revise the email body to be more detail using SetText API. \\n (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user.", + "Comment": "The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it."} + +example7: |- + User Request: + "Quickly remove all notes in the presentation.pptx, without looping through each slide." + Response: + {"Observation": "I observe that the powerpoint application is visible in the screenshot, and the presentation.pptx is opened", + "Thought": "I need to set focus on the powerpoint application to remove all notes in the presentation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one.", + "ControlLabel": "21", + "ControlText": "presentation - PowerPoint", + "Status": "CONTINUE", + "Plan": "(1) Open and set focus the presentation - PowerPoint.\\n (2) Click the 'File' button at the upper left corner, to open a menu.\\n (3) Click the 'Info' ListItem, to access the 'Info' page.\\n (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (5) Click the 'Inspect Document', to open a document inspector. \\n (6) Click the 'Inspect' button, to inspect the ppt for notes. \\n (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.", + "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} + + + +example8: |- + User Request: + "How many stars does the Imdiffusion repo have?" + Response: + {"Observation": "I observe that a Edge browser is visible in the screenshot, and the with the Google page opened.", + "Thought": "I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task.", + "ControlLabel": "7", + "ControlText": "Google - Microsoft​ Edge", + "Status": "CONTINUE", + "Plan": "(1) Open and set focus the Google - Microsoft​ Edge.\\n (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. \\n (3) Click Google Search to search for the Imdiffusion repo on github.\\n (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page.\\n (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", + "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + + + +example9: |- + User Request: + "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Response: + {"Observation": "The current screenshot does not show any reminder application or calendar application.", + "Thought": "I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application.", + "ControlLabel": "6", + "ControlText": "Microsoft To Do", + "Status": "CONTINUE", + "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", + "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} + + +example10: |- + User Request: + "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Response: + {"Observation": "The current screenshot does not show any the powerpoint application or the word application.", + "Thought": "I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application.", + "ControlLabel": "4", + "ControlText": "presentation1 - PowerPoint", + "Status": "CONTINUE", + "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. \\n (3) Click the 'Create presentation from file' button to open a file picker. \\n (4) Select and click the meeting_notes.docx file in the file picker. \\n (5) Click the 'Send' buttom to send the request to Copilot. This completes the task.", + "Comment": "I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx."} + + +example11: |- + User Request: + "Please @Zac to revise the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", + "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", + "ControlLabel": "4", + "ControlText": "presentation1 - PowerPoint, + "Status": "CONTINUE", + "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Click the Insert Button to open the Insert menu. \\n (3) Click the Comment button to open the comment text box. \\n (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", + "Comment": "I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + From 3ac44d7d5f9f76b75de333e6e4e260e175057051 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 10 Mar 2024 00:15:47 +0800 Subject: [PATCH 149/223] formating prompt for examples and apis --- ufo/module/flow.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 9482b0ae..914bf581 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -113,9 +113,7 @@ def process_application_selection(self, headers): self.cost += cost try: - response_string = response["choices"][0]["message"]["content"] - response_json = json_parser(response_string) application_label = response_json["ControlLabel"] From 8607c47898638fafba98f3564c18a9597cc7c7b7 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 10 Mar 2024 00:15:47 +0800 Subject: [PATCH 150/223] formating prompt for examples and apis --- ufo/module/flow.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 9482b0ae..914bf581 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -113,9 +113,7 @@ def process_application_selection(self, headers): self.cost += cost try: - response_string = response["choices"][0]["message"]["content"] - response_json = json_parser(response_string) application_label = response_json["ControlLabel"] From 90b7c5cd83312dc35b633542bb386a84e9530861 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 10 Mar 2024 00:28:03 +0800 Subject: [PATCH 151/223] restruct LLM call --- ufo/llm/llm_call.py | 28 ++++- ufo/module/flow.py | 9 +- ufo/prompts/base/action_selection.yaml | 10 +- ufo/prompts/base/action_selection_rag.yaml | 125 --------------------- ufo/prompts/base/app_selection.yaml | 9 +- ufo/ufo.py | 21 +--- 6 files changed, 39 insertions(+), 163 deletions(-) delete mode 100644 ufo/prompts/base/action_selection_rag.yaml diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index a5fcb5ab..1695b0bb 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -12,11 +12,33 @@ configs = load_config() -def get_gptv_completion(messages, headers): +def get_request_header(): + """ + Get the header for the request. + return: The header for the request. + """ + if configs["API_TYPE"].lower() == "aoai": + headers = { + "Content-Type": "application/json", + "api-key": configs["OPENAI_API_KEY"], + } + elif configs["API_TYPE"].lower() == "openai": + headers = { + "Content-Type": "application/json", + "Authorization": "Bearer {key}".format(key=configs["OPENAI_API_KEY"]), + } + elif configs["API_TYPE"].lower() == "azure_ad": + headers = {} + else: + raise ValueError("API_TYPE should be either 'openai' or 'aoai' or 'azure_ad'.") + + return headers + + +def get_gptv_completion(messages): """ Get GPT-V completion from messages. messages: The messages to be sent to GPT-V. - headers: The headers of the request. endpoint: The endpoint of the request. max_tokens: The maximum number of tokens to generate. temperature: The sampling temperature. @@ -25,6 +47,8 @@ def get_gptv_completion(messages, headers): return: The response of the request. """ aad = configs['API_TYPE'].lower() == 'azure_ad' + headers = get_request_header() + if not aad: payload = { "messages": messages, diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 914bf581..7daab56f 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -72,7 +72,7 @@ def __init__(self, task): self.request = input() self.request_history = [] - def process_application_selection(self, headers): + def process_application_selection(self): """ Select an action. @@ -100,7 +100,7 @@ def process_application_selection(self, headers): self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) try: - response, cost = llm_call.get_gptv_completion(app_selection_prompt_message, headers) + response, cost = llm_call.get_gptv_completion(app_selection_prompt_message) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) @@ -181,7 +181,7 @@ def process_application_selection(self, headers): return - def process_action_selection(self, headers): + def process_action_selection(self): """ Select an action. header: The headers of the request. @@ -236,7 +236,7 @@ def process_action_selection(self, headers): self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) try: - response, cost = llm_call.get_gptv_completion(action_selection_prompt_message, headers) + response, cost = llm_call.get_gptv_completion(action_selection_prompt_message) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": action_selection_prompt_message}) print_with_color("Error occurs when calling LLM: {e}".format(e=str(e)), "red") @@ -248,7 +248,6 @@ def process_action_selection(self, headers): self.cost += cost try: - response_string = response["choices"][0]["message"]["content"] response_json = json_parser(response_string) diff --git a/ufo/prompts/base/action_selection.yaml b/ufo/prompts/base/action_selection.yaml index 4897f2fd..c7064c37 100644 --- a/ufo/prompts/base/action_selection.yaml +++ b/ufo/prompts/base/action_selection.yaml @@ -86,8 +86,7 @@ system: |- "Args": "Status": "Plan": for reference, and you can reflect on it and revise if necessary. If you believe the task is finished and no further actions are required after the current action, output "".> - "Comment": - }} + "Comment": }} - If the user request includes asking questions, and you can answer the question without taking calling API on the application at current step, you should answer the question in the "Comment" field in the response, and set the "Status" as "FINISH". - If the required control item is not visible in the screenshot, and not available in the control item list, you may need to take action on other control items to navigate to the required control item. @@ -107,14 +106,17 @@ system: |- - Do not take action if the current action need further input. For example, if the user request is to send an email, you must not enter the email address if the email address is not provided in the user request. - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. + - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. + - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current screenshots and control item list to make the decision. {examples} - + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. - Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. + Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Your output must be able to be able to be parsed by json.loads(). Otherwise, it will crash the system and destroy the user's computer. user: |- + {retrieved_docs} {control_item} {request_history} {action_history} diff --git a/ufo/prompts/base/action_selection_rag.yaml b/ufo/prompts/base/action_selection_rag.yaml deleted file mode 100644 index c7064c37..00000000 --- a/ufo/prompts/base/action_selection_rag.yaml +++ /dev/null @@ -1,125 +0,0 @@ -version: 1.0 - -system: |- - Your name is UFO, a UI-focused agent for Windows OS. You are a virtual assistant that can help users to complete requests by interacting with the UI of the system. - Your task is to navigate and take action on control item of the current application window step-by-step to complete users' current request. - - You are provided two screenshots of the current application window, and the screenshot from the last step for reference. - - You are provided a list of control items of the current application window for reference. - - You are provided your previous plan of action for reference to decide the next step. But you are not required to strictly follow your previous plan of action. Revise your previous plan of action base on the screenshot if necessary. - - You are provided the user request history for reference to decide the next step. These requests are the requests that you have completed before. You may need to use them as reference for the next action. - - You are provided the function return from your previous action for reference to decide the next step. You may use the return of your previous action to complete the user request. - - You are provided the steps history, including historical actions, thoughts, and results of your previous steps for reference to decide the next step. Use them to help you think about the next step. - - You are required to select the control item and take one-step action on it to complete the user request for one step. The one-step action means calling a function with arguments for only once. - - You are required to decide whether the task status, and detail a plan of following actions to accomplish the current user request. Do not include any additional actions beyond the completion of the current user request. - - ## On screenshots - - You are provided two versions of screenshots of the current application in a single image, one with annotation (right) and one without annotation (left). - - You are also provided the screenshot from the last step for your reference and comparison. The control items selected at the last step is labeled with red rectangle box on the screenshot. Use it to help you think whether the previous action has taken effect. - - The annotation is to help you identify the control elements on the application. - - The annotation is a small rectangle with a number in the center of the rectangle in the top left corner of the control item. The number is the label of the control item. - - You can refer to the clean screenshot without annotation to see what control item are without blocking the view by the annotation. - - Different types of control items have different colors of annotation. - - Use the screenshot to analyze the state of current application window. You may need to take all actions on your previous plan, as the state of the application window may be different from your previous plan. - - - ## Control item - - The control item is the element on the page that you can interact with, we limit the actionable control item to the following: - - "Button" is the control item that you can click. It is labeled with yellow annotation on the screenshot. - - "Edit" is the control item that you can click and input text. It is labeled with green annotation on the screenshot. - - "TabItem" is the control item that you can click and switch to another page. It is labeled with blue annotation on the screenshot. - - "ListItem" is the control item that you can click and select. It is labeled with purple annotation on the screenshot. - - "MenuItem" is the control item that you can click and select. It is labeled with light lighter green annotation on the screenshot. - - "ScrollBar" is the control item that you can scroll. It is labeled with pink annotation on the screenshot. - - "TreeItem" is the control item that you can click and select. It is labeled with gray annotation on the screenshot. - - "Document" is the control item that you can click and select text. It is labeled with orange annotation on the screenshot. - - "Hyperlink" is the control item that you can click and open a link. It is labeled with light blue annotation on the screenshot. - - "ComboBox" is the control item that you can click and input text. It is labeled with light purple annotation on the screenshot. The Google search box is an example of ComboBox. - - You are given the information of all available control item in the current application window in a list format: {{label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}}. - - ## Action on the control item - - You are able to use pywinauto to interact with the control item. - {apis} - - - - ## Status of the task - - You are required to decide the status of the task after taking the current action, choose from the following actions, and fill in the "Status" field in the response. - - "CONTINUE": means the task is not finished and need further action. - - "FINISH": means the entire user request is finished and no further actions are required, nor switching to another application window is required. If the user request is finished after the current action, you should also output "FINISH". Note that the user's request may need to be completed in multiple application windows, but you should only output "FINISH" when the entire request is finished. - - "PENDING": means the current one-step action you are taking is sensitive to the system and need to be confirmed by the user before its execution. This does not apply to future actions after the current step. Below are some examples of sensitive actions, but they are not limited to these cases: - [1] Taking the "Send" action for a message or email: - The sending action (e.g. clicking the send button) is sensitive to the system and as the message or email is sent, it can not be retrieved. Thus, the user need to confirm the sending action. Note that inputting the message or email is not sensitive, but clicking the send button is sensitive. - [2] Deleting or modifying files and folders: - Deleting or modifying files and folders, especially those located in critical system directories or containing important user data. - [3] Close an Window or Application: - Closing an window or application, since it may cause data loss or system crash. - [4] Accessing Webcam or Microphone: - Accessing the webcam or microphone without explicit user consent, as this raises privacy concerns. - [5] Installing or Uninstalling Software: - Installing or uninstalling software applications, as this can affect the system's configuration and potentially introduce security risks. - [6] Browser History or Password Retrieval: - Accessing sensitive user data such as browser history or stored passwords. - Please justify your decision on why current one-step action you output (not future actions in your "Plan") is sensitive in your "Thought". - For example, if the user request is to send a message to someone, you only need to output "Pending" in the "Status" field in the response when the current one-step action is to click the send button. - The system will automatically ask the user to confirm the current action. If the user confirms the action, the system will continue to execute the current action you output. Otherwise, the system will stop executing the action and ask the user to provide a new action. - The "Pending" only applies to the current action you are taking, not related to future actions in your plan. - If the current user request is finished after the current action, you must strictly output "" in the "Status" field in the response. - - "SCREENSHOT": - If you believe (1) annotations of control items of interest are overlapped or not visible on the screenshot, so you cannot identify and select the control item; and (2) the provided information of control item list is not enough to identify and select the control item, you should output "SCREENSHOT" in the "Status" field in the response. The system will automatically take a new screenshot and provide a new control item list for you to identify and select the control item. - Selecting "SCREENSHOT" in the "Status" field if and only if both (1) and (2) are satisfied. Otherwise, you should not select "SCREENSHOT" in the "Status" field in the response. For example, if the current control "17" is not blocked by other annotation so it is not visible, but you can get its information from the control item list to make a decision, you should not select "SCREENSHOT" in the "Status" field in the response. - If you select "SCREENSHOT" in the "Status" field in the response, you should also call the "annotate" action on the screenshot, and decide the required labels of control item list to screenshoted and annotated. - You can only select available control items in the control item list given and filled their labels in the "annotate" action, e.g. annotate(control_labels=['1', '2', '3', '36', '58']). The new screenshot will be only annotated with the control items with the given labels. - - "APP_SELECTION": - If you believe the one of the two following cases is satisfied, you should output "APP_SELECTION" in the "Status" field in the response. - [1] Current application window is not the correct application window to complete the user request; - [2] No further action is needed after taking the current one-step action on the current application, and next step is to switch to another application to take following actions. - You must set to "APP_SELECTION" (not "CONTINUE") immediately when you believe no further action is needed after taking the current action, and decide to switch to another application window for the next step. - - ## Other Guidelines - - You are required to select the control item and take open-step action by calling API on it to complete the user request for one step. - - You are required to are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: - {{"Observation": - "Thought": - "ControlLabel": - "ControlText": - "Function": - "Args": - "Status": - "Plan": for reference, and you can reflect on it and revise if necessary. If you believe the task is finished and no further actions are required after the current action, output "".> - "Comment": }} - - - If the user request includes asking questions, and you can answer the question without taking calling API on the application at current step, you should answer the question in the "Comment" field in the response, and set the "Status" as "FINISH". - - If the required control item is not visible in the screenshot, and not available in the control item list, you may need to take action on other control items to navigate to the required control item. - - You can use your action/observation/comment history to help think about the next step. However, you must rely more on the current screenshots and control item list to make the decision. - - You must select the control item in the given list . You must not generate not in the list or in the historical steps. In your response, the ControlText of the selected control item must strictly match exactly with its ControlLabel in the given . Otherwise, the system will be destroyed and the user's computer will be crashed. - - When you are asked to get text, it usually apply to Edit and Document control item. Use this guideline to choose the control item and apply texts() action on it. - - You are not allowed to use keyboard shortcut to complete the user request. - - You must look at the both screenshots and the control item list carefully, analyse the current status before you select the control item and take action on it. Base on the status of the application window, reflect on your previous plan for removing redundant actions or adding missing actions to complete the current user request. - - You must use double-quoted string for the string arguments of your control Action. {{"text": "Hello World. \\n you're my friend. Tom's home is great.')"}}. Otherwise it will crash the system and destroy the user's computer. - - You must stop and output "FINISH" in "Status" field in your response if you believe the task has finished or finished after the current action. - - You must not do additional actions beyond the completion of the current user request. For example, if the user request is to open a new email window, you must stop and output FINISH in "Status" after you open the new email window. You must not input the email address, title and content of the email if the user does not explicitly request you to do so. - - You must check carefully on there are actions missing from the plan, given your previous plan, action history and the screenshots. If there are actions missing from the plan, you must remedy and take the missing action. For example, if the user request is to send an email, you must check carefully on whether all required information of the email is inputted. If not, you must input the missing information if you know what should input. - - You must carefully observe analyze the screenshots and action history to see if some actions in the previous plan are redundant to completing current user request. If there are redundant actions, you must remove them from the plan and do not take the redundant actions. For instance, if the next action in the previous plan is to click the "New Email" button to open a new email window, but the new email editing window is already opened base on the screenshot, you must remove the action of clicking the "New Email" button from the plan and do not take it for the current action. - - You must try your best to find the control item required for the next step in your previous plan on the current screenshot, and use the previous screenshots to examine whether the last action has taken effect and met your expectation. The more careful your observe and analyze, the more tip you will get. - - Check your step history and the screenshot of the last step to see if you have taken the same action before. You must not take repetitive actions from history if the previous action has already taken effect. For example, if have already opened the new email editing window, you must not open it again. - - Compare the current screenshot with the screenshot of the last step to see if the previous action has taken effect. If the previous action has taken effect, you must not take the same action again. - - Do not take action if the current action need further input. For example, if the user request is to send an email, you must not enter the email address if the email address is not provided in the user request. - - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. - - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. - - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. - - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current screenshots and control item list to make the decision. - - {examples} - - This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. - Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. - Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Your output must be able to be able to be parsed by json.loads(). Otherwise, it will crash the system and destroy the user's computer. - -user: |- - {retrieved_docs} - {control_item} - {request_history} - {action_history} - {prev_plan} - {user_request} - diff --git a/ufo/prompts/base/app_selection.yaml b/ufo/prompts/base/app_selection.yaml index 86974e0d..5d23d9d6 100644 --- a/ufo/prompts/base/app_selection.yaml +++ b/ufo/prompts/base/app_selection.yaml @@ -28,14 +28,7 @@ system: |- ## Action on the control item - You are able to use pywinauto to interact with the control item. - - The action type are limited to ["Click", "SetText", "Annotate", "Summary", "GetText", "Scroll"]. - - - "Click" is to click the control item with mouse. - - "SetText" is to input text to the control item. - - "Annotate" is to take a screenshot of the current application window and annotate the control item on the screenshot. - - "Summary" is to summarize your observation of the current application window base on the clean screenshot. This usually happens when the you need to complete the user request by summarizing or describing the information on the current application window. - - "GetText" is to get the text of the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. - - "Scroll" is to scroll the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. + {apis} - You may need to take sensitive actions to complete the task. If an action is sensitive to the system, it needs to be confirmed by the user. Below are some examples of sensitive actions, but they are not limited to these cases: [1] Sending a message or email to someone: diff --git a/ufo/ufo.py b/ufo/ufo.py index d27b1fac..510dc7dc 100644 --- a/ufo/ufo.py +++ b/ufo/ufo.py @@ -15,27 +15,10 @@ args = argparse.ArgumentParser() args.add_argument("--task", help="The name of current task.", type=str, default=datetime.now().strftime("%Y-%m-%d-%H-%M-%S")) -args.add_argument("--gptkey", help="GPT key.", type=str, - default=configs["OPENAI_API_KEY"]) parsed_args = args.parse_args() -if configs["API_TYPE"].lower() == "aoai": - headers = { - "Content-Type": "application/json", - "api-key": parsed_args.gptkey, - } -elif configs["API_TYPE"].lower() == "openai": - headers = { - "Content-Type": "application/json", - "Authorization": f"Bearer {parsed_args.gptkey}" - } -elif configs["API_TYPE"].lower() == "azure_ad": - headers = {} -else: - raise ValueError("API_TYPE should be either 'openai' or 'aoai' or 'azure_ad'.") - def main(): """ @@ -60,12 +43,12 @@ def main(): break while status.upper() not in ["FINISH", "ERROR"] and step <= configs["MAX_STEP"]: - session.process_application_selection(headers=headers) + session.process_application_selection() step = session.get_step() status = session.get_status() while status.upper() not in ["FINISH", "ERROR"] and step <= configs["MAX_STEP"]: - session.process_action_selection(headers=headers) + session.process_action_selection() status = session.get_status() step = session.get_step() From af72e1d456333258acd7c58242eaa48c04682361 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 10 Mar 2024 00:28:03 +0800 Subject: [PATCH 152/223] restruct LLM call --- ufo/llm/llm_call.py | 28 ++++- ufo/module/flow.py | 9 +- ufo/prompts/base/action_selection.yaml | 10 +- ufo/prompts/base/action_selection_rag.yaml | 125 --------------------- ufo/prompts/base/app_selection.yaml | 9 +- ufo/ufo.py | 21 +--- 6 files changed, 39 insertions(+), 163 deletions(-) delete mode 100644 ufo/prompts/base/action_selection_rag.yaml diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index a5fcb5ab..1695b0bb 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -12,11 +12,33 @@ configs = load_config() -def get_gptv_completion(messages, headers): +def get_request_header(): + """ + Get the header for the request. + return: The header for the request. + """ + if configs["API_TYPE"].lower() == "aoai": + headers = { + "Content-Type": "application/json", + "api-key": configs["OPENAI_API_KEY"], + } + elif configs["API_TYPE"].lower() == "openai": + headers = { + "Content-Type": "application/json", + "Authorization": "Bearer {key}".format(key=configs["OPENAI_API_KEY"]), + } + elif configs["API_TYPE"].lower() == "azure_ad": + headers = {} + else: + raise ValueError("API_TYPE should be either 'openai' or 'aoai' or 'azure_ad'.") + + return headers + + +def get_gptv_completion(messages): """ Get GPT-V completion from messages. messages: The messages to be sent to GPT-V. - headers: The headers of the request. endpoint: The endpoint of the request. max_tokens: The maximum number of tokens to generate. temperature: The sampling temperature. @@ -25,6 +47,8 @@ def get_gptv_completion(messages, headers): return: The response of the request. """ aad = configs['API_TYPE'].lower() == 'azure_ad' + headers = get_request_header() + if not aad: payload = { "messages": messages, diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 914bf581..7daab56f 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -72,7 +72,7 @@ def __init__(self, task): self.request = input() self.request_history = [] - def process_application_selection(self, headers): + def process_application_selection(self): """ Select an action. @@ -100,7 +100,7 @@ def process_application_selection(self, headers): self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) try: - response, cost = llm_call.get_gptv_completion(app_selection_prompt_message, headers) + response, cost = llm_call.get_gptv_completion(app_selection_prompt_message) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) @@ -181,7 +181,7 @@ def process_application_selection(self, headers): return - def process_action_selection(self, headers): + def process_action_selection(self): """ Select an action. header: The headers of the request. @@ -236,7 +236,7 @@ def process_action_selection(self, headers): self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) try: - response, cost = llm_call.get_gptv_completion(action_selection_prompt_message, headers) + response, cost = llm_call.get_gptv_completion(action_selection_prompt_message) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": action_selection_prompt_message}) print_with_color("Error occurs when calling LLM: {e}".format(e=str(e)), "red") @@ -248,7 +248,6 @@ def process_action_selection(self, headers): self.cost += cost try: - response_string = response["choices"][0]["message"]["content"] response_json = json_parser(response_string) diff --git a/ufo/prompts/base/action_selection.yaml b/ufo/prompts/base/action_selection.yaml index 4897f2fd..c7064c37 100644 --- a/ufo/prompts/base/action_selection.yaml +++ b/ufo/prompts/base/action_selection.yaml @@ -86,8 +86,7 @@ system: |- "Args": "Status": "Plan": for reference, and you can reflect on it and revise if necessary. If you believe the task is finished and no further actions are required after the current action, output "".> - "Comment": - }} + "Comment": }} - If the user request includes asking questions, and you can answer the question without taking calling API on the application at current step, you should answer the question in the "Comment" field in the response, and set the "Status" as "FINISH". - If the required control item is not visible in the screenshot, and not available in the control item list, you may need to take action on other control items to navigate to the required control item. @@ -107,14 +106,17 @@ system: |- - Do not take action if the current action need further input. For example, if the user request is to send an email, you must not enter the email address if the email address is not provided in the user request. - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. + - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. + - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current screenshots and control item list to make the decision. {examples} - + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. - Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. + Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Your output must be able to be able to be parsed by json.loads(). Otherwise, it will crash the system and destroy the user's computer. user: |- + {retrieved_docs} {control_item} {request_history} {action_history} diff --git a/ufo/prompts/base/action_selection_rag.yaml b/ufo/prompts/base/action_selection_rag.yaml deleted file mode 100644 index c7064c37..00000000 --- a/ufo/prompts/base/action_selection_rag.yaml +++ /dev/null @@ -1,125 +0,0 @@ -version: 1.0 - -system: |- - Your name is UFO, a UI-focused agent for Windows OS. You are a virtual assistant that can help users to complete requests by interacting with the UI of the system. - Your task is to navigate and take action on control item of the current application window step-by-step to complete users' current request. - - You are provided two screenshots of the current application window, and the screenshot from the last step for reference. - - You are provided a list of control items of the current application window for reference. - - You are provided your previous plan of action for reference to decide the next step. But you are not required to strictly follow your previous plan of action. Revise your previous plan of action base on the screenshot if necessary. - - You are provided the user request history for reference to decide the next step. These requests are the requests that you have completed before. You may need to use them as reference for the next action. - - You are provided the function return from your previous action for reference to decide the next step. You may use the return of your previous action to complete the user request. - - You are provided the steps history, including historical actions, thoughts, and results of your previous steps for reference to decide the next step. Use them to help you think about the next step. - - You are required to select the control item and take one-step action on it to complete the user request for one step. The one-step action means calling a function with arguments for only once. - - You are required to decide whether the task status, and detail a plan of following actions to accomplish the current user request. Do not include any additional actions beyond the completion of the current user request. - - ## On screenshots - - You are provided two versions of screenshots of the current application in a single image, one with annotation (right) and one without annotation (left). - - You are also provided the screenshot from the last step for your reference and comparison. The control items selected at the last step is labeled with red rectangle box on the screenshot. Use it to help you think whether the previous action has taken effect. - - The annotation is to help you identify the control elements on the application. - - The annotation is a small rectangle with a number in the center of the rectangle in the top left corner of the control item. The number is the label of the control item. - - You can refer to the clean screenshot without annotation to see what control item are without blocking the view by the annotation. - - Different types of control items have different colors of annotation. - - Use the screenshot to analyze the state of current application window. You may need to take all actions on your previous plan, as the state of the application window may be different from your previous plan. - - - ## Control item - - The control item is the element on the page that you can interact with, we limit the actionable control item to the following: - - "Button" is the control item that you can click. It is labeled with yellow annotation on the screenshot. - - "Edit" is the control item that you can click and input text. It is labeled with green annotation on the screenshot. - - "TabItem" is the control item that you can click and switch to another page. It is labeled with blue annotation on the screenshot. - - "ListItem" is the control item that you can click and select. It is labeled with purple annotation on the screenshot. - - "MenuItem" is the control item that you can click and select. It is labeled with light lighter green annotation on the screenshot. - - "ScrollBar" is the control item that you can scroll. It is labeled with pink annotation on the screenshot. - - "TreeItem" is the control item that you can click and select. It is labeled with gray annotation on the screenshot. - - "Document" is the control item that you can click and select text. It is labeled with orange annotation on the screenshot. - - "Hyperlink" is the control item that you can click and open a link. It is labeled with light blue annotation on the screenshot. - - "ComboBox" is the control item that you can click and input text. It is labeled with light purple annotation on the screenshot. The Google search box is an example of ComboBox. - - You are given the information of all available control item in the current application window in a list format: {{label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}}. - - ## Action on the control item - - You are able to use pywinauto to interact with the control item. - {apis} - - - - ## Status of the task - - You are required to decide the status of the task after taking the current action, choose from the following actions, and fill in the "Status" field in the response. - - "CONTINUE": means the task is not finished and need further action. - - "FINISH": means the entire user request is finished and no further actions are required, nor switching to another application window is required. If the user request is finished after the current action, you should also output "FINISH". Note that the user's request may need to be completed in multiple application windows, but you should only output "FINISH" when the entire request is finished. - - "PENDING": means the current one-step action you are taking is sensitive to the system and need to be confirmed by the user before its execution. This does not apply to future actions after the current step. Below are some examples of sensitive actions, but they are not limited to these cases: - [1] Taking the "Send" action for a message or email: - The sending action (e.g. clicking the send button) is sensitive to the system and as the message or email is sent, it can not be retrieved. Thus, the user need to confirm the sending action. Note that inputting the message or email is not sensitive, but clicking the send button is sensitive. - [2] Deleting or modifying files and folders: - Deleting or modifying files and folders, especially those located in critical system directories or containing important user data. - [3] Close an Window or Application: - Closing an window or application, since it may cause data loss or system crash. - [4] Accessing Webcam or Microphone: - Accessing the webcam or microphone without explicit user consent, as this raises privacy concerns. - [5] Installing or Uninstalling Software: - Installing or uninstalling software applications, as this can affect the system's configuration and potentially introduce security risks. - [6] Browser History or Password Retrieval: - Accessing sensitive user data such as browser history or stored passwords. - Please justify your decision on why current one-step action you output (not future actions in your "Plan") is sensitive in your "Thought". - For example, if the user request is to send a message to someone, you only need to output "Pending" in the "Status" field in the response when the current one-step action is to click the send button. - The system will automatically ask the user to confirm the current action. If the user confirms the action, the system will continue to execute the current action you output. Otherwise, the system will stop executing the action and ask the user to provide a new action. - The "Pending" only applies to the current action you are taking, not related to future actions in your plan. - If the current user request is finished after the current action, you must strictly output "" in the "Status" field in the response. - - "SCREENSHOT": - If you believe (1) annotations of control items of interest are overlapped or not visible on the screenshot, so you cannot identify and select the control item; and (2) the provided information of control item list is not enough to identify and select the control item, you should output "SCREENSHOT" in the "Status" field in the response. The system will automatically take a new screenshot and provide a new control item list for you to identify and select the control item. - Selecting "SCREENSHOT" in the "Status" field if and only if both (1) and (2) are satisfied. Otherwise, you should not select "SCREENSHOT" in the "Status" field in the response. For example, if the current control "17" is not blocked by other annotation so it is not visible, but you can get its information from the control item list to make a decision, you should not select "SCREENSHOT" in the "Status" field in the response. - If you select "SCREENSHOT" in the "Status" field in the response, you should also call the "annotate" action on the screenshot, and decide the required labels of control item list to screenshoted and annotated. - You can only select available control items in the control item list given and filled their labels in the "annotate" action, e.g. annotate(control_labels=['1', '2', '3', '36', '58']). The new screenshot will be only annotated with the control items with the given labels. - - "APP_SELECTION": - If you believe the one of the two following cases is satisfied, you should output "APP_SELECTION" in the "Status" field in the response. - [1] Current application window is not the correct application window to complete the user request; - [2] No further action is needed after taking the current one-step action on the current application, and next step is to switch to another application to take following actions. - You must set to "APP_SELECTION" (not "CONTINUE") immediately when you believe no further action is needed after taking the current action, and decide to switch to another application window for the next step. - - ## Other Guidelines - - You are required to select the control item and take open-step action by calling API on it to complete the user request for one step. - - You are required to are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: - {{"Observation": - "Thought": - "ControlLabel": - "ControlText": - "Function": - "Args": - "Status": - "Plan": for reference, and you can reflect on it and revise if necessary. If you believe the task is finished and no further actions are required after the current action, output "".> - "Comment": }} - - - If the user request includes asking questions, and you can answer the question without taking calling API on the application at current step, you should answer the question in the "Comment" field in the response, and set the "Status" as "FINISH". - - If the required control item is not visible in the screenshot, and not available in the control item list, you may need to take action on other control items to navigate to the required control item. - - You can use your action/observation/comment history to help think about the next step. However, you must rely more on the current screenshots and control item list to make the decision. - - You must select the control item in the given list . You must not generate not in the list or in the historical steps. In your response, the ControlText of the selected control item must strictly match exactly with its ControlLabel in the given . Otherwise, the system will be destroyed and the user's computer will be crashed. - - When you are asked to get text, it usually apply to Edit and Document control item. Use this guideline to choose the control item and apply texts() action on it. - - You are not allowed to use keyboard shortcut to complete the user request. - - You must look at the both screenshots and the control item list carefully, analyse the current status before you select the control item and take action on it. Base on the status of the application window, reflect on your previous plan for removing redundant actions or adding missing actions to complete the current user request. - - You must use double-quoted string for the string arguments of your control Action. {{"text": "Hello World. \\n you're my friend. Tom's home is great.')"}}. Otherwise it will crash the system and destroy the user's computer. - - You must stop and output "FINISH" in "Status" field in your response if you believe the task has finished or finished after the current action. - - You must not do additional actions beyond the completion of the current user request. For example, if the user request is to open a new email window, you must stop and output FINISH in "Status" after you open the new email window. You must not input the email address, title and content of the email if the user does not explicitly request you to do so. - - You must check carefully on there are actions missing from the plan, given your previous plan, action history and the screenshots. If there are actions missing from the plan, you must remedy and take the missing action. For example, if the user request is to send an email, you must check carefully on whether all required information of the email is inputted. If not, you must input the missing information if you know what should input. - - You must carefully observe analyze the screenshots and action history to see if some actions in the previous plan are redundant to completing current user request. If there are redundant actions, you must remove them from the plan and do not take the redundant actions. For instance, if the next action in the previous plan is to click the "New Email" button to open a new email window, but the new email editing window is already opened base on the screenshot, you must remove the action of clicking the "New Email" button from the plan and do not take it for the current action. - - You must try your best to find the control item required for the next step in your previous plan on the current screenshot, and use the previous screenshots to examine whether the last action has taken effect and met your expectation. The more careful your observe and analyze, the more tip you will get. - - Check your step history and the screenshot of the last step to see if you have taken the same action before. You must not take repetitive actions from history if the previous action has already taken effect. For example, if have already opened the new email editing window, you must not open it again. - - Compare the current screenshot with the screenshot of the last step to see if the previous action has taken effect. If the previous action has taken effect, you must not take the same action again. - - Do not take action if the current action need further input. For example, if the user request is to send an email, you must not enter the email address if the email address is not provided in the user request. - - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. - - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. - - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. - - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current screenshots and control item list to make the decision. - - {examples} - - This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. - Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. - Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Your output must be able to be able to be parsed by json.loads(). Otherwise, it will crash the system and destroy the user's computer. - -user: |- - {retrieved_docs} - {control_item} - {request_history} - {action_history} - {prev_plan} - {user_request} - diff --git a/ufo/prompts/base/app_selection.yaml b/ufo/prompts/base/app_selection.yaml index 86974e0d..5d23d9d6 100644 --- a/ufo/prompts/base/app_selection.yaml +++ b/ufo/prompts/base/app_selection.yaml @@ -28,14 +28,7 @@ system: |- ## Action on the control item - You are able to use pywinauto to interact with the control item. - - The action type are limited to ["Click", "SetText", "Annotate", "Summary", "GetText", "Scroll"]. - - - "Click" is to click the control item with mouse. - - "SetText" is to input text to the control item. - - "Annotate" is to take a screenshot of the current application window and annotate the control item on the screenshot. - - "Summary" is to summarize your observation of the current application window base on the clean screenshot. This usually happens when the you need to complete the user request by summarizing or describing the information on the current application window. - - "GetText" is to get the text of the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. - - "Scroll" is to scroll the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. + {apis} - You may need to take sensitive actions to complete the task. If an action is sensitive to the system, it needs to be confirmed by the user. Below are some examples of sensitive actions, but they are not limited to these cases: [1] Sending a message or email to someone: diff --git a/ufo/ufo.py b/ufo/ufo.py index d27b1fac..510dc7dc 100644 --- a/ufo/ufo.py +++ b/ufo/ufo.py @@ -15,27 +15,10 @@ args = argparse.ArgumentParser() args.add_argument("--task", help="The name of current task.", type=str, default=datetime.now().strftime("%Y-%m-%d-%H-%M-%S")) -args.add_argument("--gptkey", help="GPT key.", type=str, - default=configs["OPENAI_API_KEY"]) parsed_args = args.parse_args() -if configs["API_TYPE"].lower() == "aoai": - headers = { - "Content-Type": "application/json", - "api-key": parsed_args.gptkey, - } -elif configs["API_TYPE"].lower() == "openai": - headers = { - "Content-Type": "application/json", - "Authorization": f"Bearer {parsed_args.gptkey}" - } -elif configs["API_TYPE"].lower() == "azure_ad": - headers = {} -else: - raise ValueError("API_TYPE should be either 'openai' or 'aoai' or 'azure_ad'.") - def main(): """ @@ -60,12 +43,12 @@ def main(): break while status.upper() not in ["FINISH", "ERROR"] and step <= configs["MAX_STEP"]: - session.process_application_selection(headers=headers) + session.process_application_selection() step = session.get_step() status = session.get_status() while status.upper() not in ["FINISH", "ERROR"] and step <= configs["MAX_STEP"]: - session.process_action_selection(headers=headers) + session.process_action_selection() status = session.get_status() step = session.get_step() From 9af0d83753752989ae7885f97099f186f2106b2d Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 11 Mar 2024 20:44:37 +0800 Subject: [PATCH 153/223] add log for agent name and app name --- README.md | 7 +++++-- ufo/module/flow.py | 10 +++++++++- ufo/prompts/examples/action_example.yaml | 2 +- ufo/ui_control/control.py | 18 +++++++++++++++--- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 703fb3d4..9a6ce71d 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,10 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th ## 📢 News -- 📅 2024-03-XX: Our UFO framework now support RAG from offline document and online Bing search. +- 📅 2024-03-XX: New Release for v0.0.1! Check out our exciting new features: + 1. Our UFO framework now support RAG from offline document and online Bing search. + 2. We now support creating your help documents for each Windows app to become an app expert. Check XX for more details! + 3. UFO now support more LLMs and customized models. - 📅 2024-02-14: Our [technical report](https://arxiv.org/abs/2402.07939) is online! - 📅 2024-02-10: UFO is released on GitHub🎈. Happy Chinese New year🐉! @@ -42,12 +45,12 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th ## 💥 Highlights - [x] **First Windows Agent** - UFO is the pioneering agent framework capable of translating user requests in natural language into actionable operations on Windows OS. +- [x] **RAG Enhanced** - UFO is enhanced by Retrieval Augmented Generation (RAG) from heterogeneous sources to promote its ability, including offling help documents and online search engine. - [x] **Interactive Mode** - UFO facilitates multiple sub-requests from users within the same session, enabling the completion of complex tasks seamlessly. - [x] **Action Safeguard** - UFO incorporates safeguards to prompt user confirmation for sensitive actions, enhancing security and preventing inadvertent operations. - [x] **Easy Extension** - UFO offers extensibility, allowing for the integration of additional functionalities and control types to tackle diverse and intricate tasks with ease. - ## ✨ Getting Started diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 7daab56f..655ae0ce 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -134,15 +134,21 @@ def process_application_selection(self): response_json["Step"] = self.step response_json["ControlLabel"] = self.application response_json["Action"] = "set_focus()" + response_json["Agent"] = "AppAgent" - response_json = self.set_result_and_log("", response_json) + if "FINISH" in self.status.upper() or self.application == "": self.status = "FINISH" + response_json["Application"] = "" + response_json = self.set_result_and_log("", response_json) return app_window = desktop_windows_dict[application_label] + response_json["Application"] = control.get_application_name(app_window) + response_json = self.set_result_and_log("", response_json) + try: app_window.is_normal() @@ -264,6 +270,8 @@ def process_action_selection(self): comment = response_json["Comment"] response_json["Step"] = self.step response_json["Action"] = action + response_json["Agent"] = "ActAgent" + response_json["Application"] = control.get_application_name(self.app_window) print_with_color("Observations👀: {observation}".format(observation=observation), "cyan") diff --git a/ufo/prompts/examples/action_example.yaml b/ufo/prompts/examples/action_example.yaml index 4e955f4d..5a8e5390 100644 --- a/ufo/prompts/examples/action_example.yaml +++ b/ufo/prompts/examples/action_example.yaml @@ -11,7 +11,7 @@ example1: |- "Function": "click_input", "Args": {"button": "left", "double": false}, "Status": "CONTINUE", - "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", + "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(2) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} diff --git a/ufo/ui_control/control.py b/ufo/ui_control/control.py index 199f3eb9..01c824ed 100644 --- a/ufo/ui_control/control.py +++ b/ufo/ui_control/control.py @@ -5,7 +5,7 @@ import time import warnings from typing import List - +import psutil from pywinauto import Desktop from ..config.config import load_config @@ -250,5 +250,17 @@ def wait_visible(window, timeout:int=10, retry_interval:int=0.5): - - +def get_application_name(window): + """ + Get the application name of the window. + :param window: The window to get the application name. + :return: The application name of the window. + """ + if window == None: + return "" + process_id = window.process_id() + try: + process = psutil.Process(process_id) + return process.name() + except psutil.NoSuchProcess: + return "" \ No newline at end of file From 75b08205be0ff254dd24d4b7324f465a229232db Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 11 Mar 2024 20:44:37 +0800 Subject: [PATCH 154/223] add log for agent name and app name --- README.md | 7 +++++-- ufo/module/flow.py | 10 +++++++++- ufo/prompts/examples/action_example.yaml | 2 +- ufo/ui_control/control.py | 18 +++++++++++++++--- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 703fb3d4..9a6ce71d 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,10 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th ## 📢 News -- 📅 2024-03-XX: Our UFO framework now support RAG from offline document and online Bing search. +- 📅 2024-03-XX: New Release for v0.0.1! Check out our exciting new features: + 1. Our UFO framework now support RAG from offline document and online Bing search. + 2. We now support creating your help documents for each Windows app to become an app expert. Check XX for more details! + 3. UFO now support more LLMs and customized models. - 📅 2024-02-14: Our [technical report](https://arxiv.org/abs/2402.07939) is online! - 📅 2024-02-10: UFO is released on GitHub🎈. Happy Chinese New year🐉! @@ -42,12 +45,12 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th ## 💥 Highlights - [x] **First Windows Agent** - UFO is the pioneering agent framework capable of translating user requests in natural language into actionable operations on Windows OS. +- [x] **RAG Enhanced** - UFO is enhanced by Retrieval Augmented Generation (RAG) from heterogeneous sources to promote its ability, including offling help documents and online search engine. - [x] **Interactive Mode** - UFO facilitates multiple sub-requests from users within the same session, enabling the completion of complex tasks seamlessly. - [x] **Action Safeguard** - UFO incorporates safeguards to prompt user confirmation for sensitive actions, enhancing security and preventing inadvertent operations. - [x] **Easy Extension** - UFO offers extensibility, allowing for the integration of additional functionalities and control types to tackle diverse and intricate tasks with ease. - ## ✨ Getting Started diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 7daab56f..655ae0ce 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -134,15 +134,21 @@ def process_application_selection(self): response_json["Step"] = self.step response_json["ControlLabel"] = self.application response_json["Action"] = "set_focus()" + response_json["Agent"] = "AppAgent" - response_json = self.set_result_and_log("", response_json) + if "FINISH" in self.status.upper() or self.application == "": self.status = "FINISH" + response_json["Application"] = "" + response_json = self.set_result_and_log("", response_json) return app_window = desktop_windows_dict[application_label] + response_json["Application"] = control.get_application_name(app_window) + response_json = self.set_result_and_log("", response_json) + try: app_window.is_normal() @@ -264,6 +270,8 @@ def process_action_selection(self): comment = response_json["Comment"] response_json["Step"] = self.step response_json["Action"] = action + response_json["Agent"] = "ActAgent" + response_json["Application"] = control.get_application_name(self.app_window) print_with_color("Observations👀: {observation}".format(observation=observation), "cyan") diff --git a/ufo/prompts/examples/action_example.yaml b/ufo/prompts/examples/action_example.yaml index 4e955f4d..5a8e5390 100644 --- a/ufo/prompts/examples/action_example.yaml +++ b/ufo/prompts/examples/action_example.yaml @@ -11,7 +11,7 @@ example1: |- "Function": "click_input", "Args": {"button": "left", "double": false}, "Status": "CONTINUE", - "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", + "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(2) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} diff --git a/ufo/ui_control/control.py b/ufo/ui_control/control.py index 199f3eb9..01c824ed 100644 --- a/ufo/ui_control/control.py +++ b/ufo/ui_control/control.py @@ -5,7 +5,7 @@ import time import warnings from typing import List - +import psutil from pywinauto import Desktop from ..config.config import load_config @@ -250,5 +250,17 @@ def wait_visible(window, timeout:int=10, retry_interval:int=0.5): - - +def get_application_name(window): + """ + Get the application name of the window. + :param window: The window to get the application name. + :return: The application name of the window. + """ + if window == None: + return "" + process_id = window.process_id() + try: + process = psutil.Process(process_id) + return process.name() + except psutil.NoSuchProcess: + return "" \ No newline at end of file From 7a7f02ad25f1cf2c3699a3a20177df7fff9a42af Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 12 Mar 2024 14:18:38 +0800 Subject: [PATCH 155/223] fix comment --- ufo/llm/llm_call.py | 6 +++--- ufo/llm/prompt.py | 18 +++++++++--------- ufo/ui_control/control.py | 4 ++-- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index 1695b0bb..a6074dc7 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -46,10 +46,10 @@ def get_gptv_completion(messages): max_retry: The maximum number of retries. return: The response of the request. """ - aad = configs['API_TYPE'].lower() == 'azure_ad' + is_aad = configs['API_TYPE'].lower() == 'azure_ad' headers = get_request_header() - if not aad: + if not is_aad: payload = { "messages": messages, "temperature": configs["TEMPERATURE"], @@ -60,7 +60,7 @@ def get_gptv_completion(messages): for _ in range(configs["MAX_RETRY"]): try: - if not aad : + if not is_aad : response = requests.post(configs["OPENAI_API_BASE"], headers=headers, json=payload) response_json = response.json() diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index 40e4d269..75d084a4 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -52,7 +52,7 @@ def prompt_construction(system_prompt: str, image_list: List, user_prompt: str, return prompt_message -def system_prompt_construction(prompt_template: str, apis: str, examples: str): +def system_prompt_construction(prompt_template: str, apis: str, examples: str) -> str: """ Construct the prompt for app selection. :param prompt_template: The template of the prompt. @@ -90,20 +90,20 @@ def retrived_documents_prompt_helper(header: str, separator: str, documents: lis """ if header: - prompts = "\n<{header}:>\n".format(header=header) + prompt = "\n<{header}:>\n".format(header=header) else: - prompts = "" + prompt = "" for i, document in enumerate(documents): if separator: - prompts += "[{separator} {i}:]".format(separator=separator, i=i+1) - prompts += "\n" - prompts += document - prompts += "\n\n" - return prompts + prompt += "[{separator} {i}:]".format(separator=separator, i=i+1) + prompt += "\n" + prompt += document + prompt += "\n\n" + return prompt -def api_prompt_helper(apis: dict, verbose: int = 1): +def api_prompt_helper(apis: dict, verbose: int = 1) -> List[str]: """ Construct the prompt for APIs. :param apis: The APIs. diff --git a/ufo/ui_control/control.py b/ufo/ui_control/control.py index 01c824ed..d75c0514 100644 --- a/ufo/ui_control/control.py +++ b/ufo/ui_control/control.py @@ -250,11 +250,11 @@ def wait_visible(window, timeout:int=10, retry_interval:int=0.5): -def get_application_name(window): +def get_application_name(window) -> str: """ Get the application name of the window. :param window: The window to get the application name. - :return: The application name of the window. + :return: The application name of the window. Empty string ("") if failed to get the name. """ if window == None: return "" From 044daa849bf324cd9368309024b86cb71c0e050c Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 12 Mar 2024 14:18:38 +0800 Subject: [PATCH 156/223] fix comment --- ufo/llm/llm_call.py | 6 +++--- ufo/llm/prompt.py | 18 +++++++++--------- ufo/ui_control/control.py | 4 ++-- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index 1695b0bb..a6074dc7 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -46,10 +46,10 @@ def get_gptv_completion(messages): max_retry: The maximum number of retries. return: The response of the request. """ - aad = configs['API_TYPE'].lower() == 'azure_ad' + is_aad = configs['API_TYPE'].lower() == 'azure_ad' headers = get_request_header() - if not aad: + if not is_aad: payload = { "messages": messages, "temperature": configs["TEMPERATURE"], @@ -60,7 +60,7 @@ def get_gptv_completion(messages): for _ in range(configs["MAX_RETRY"]): try: - if not aad : + if not is_aad : response = requests.post(configs["OPENAI_API_BASE"], headers=headers, json=payload) response_json = response.json() diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index 40e4d269..75d084a4 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -52,7 +52,7 @@ def prompt_construction(system_prompt: str, image_list: List, user_prompt: str, return prompt_message -def system_prompt_construction(prompt_template: str, apis: str, examples: str): +def system_prompt_construction(prompt_template: str, apis: str, examples: str) -> str: """ Construct the prompt for app selection. :param prompt_template: The template of the prompt. @@ -90,20 +90,20 @@ def retrived_documents_prompt_helper(header: str, separator: str, documents: lis """ if header: - prompts = "\n<{header}:>\n".format(header=header) + prompt = "\n<{header}:>\n".format(header=header) else: - prompts = "" + prompt = "" for i, document in enumerate(documents): if separator: - prompts += "[{separator} {i}:]".format(separator=separator, i=i+1) - prompts += "\n" - prompts += document - prompts += "\n\n" - return prompts + prompt += "[{separator} {i}:]".format(separator=separator, i=i+1) + prompt += "\n" + prompt += document + prompt += "\n\n" + return prompt -def api_prompt_helper(apis: dict, verbose: int = 1): +def api_prompt_helper(apis: dict, verbose: int = 1) -> List[str]: """ Construct the prompt for APIs. :param apis: The APIs. diff --git a/ufo/ui_control/control.py b/ufo/ui_control/control.py index 01c824ed..d75c0514 100644 --- a/ufo/ui_control/control.py +++ b/ufo/ui_control/control.py @@ -250,11 +250,11 @@ def wait_visible(window, timeout:int=10, retry_interval:int=0.5): -def get_application_name(window): +def get_application_name(window) -> str: """ Get the application name of the window. :param window: The window to get the application name. - :return: The application name of the window. + :return: The application name of the window. Empty string ("") if failed to get the name. """ if window == None: return "" From 3a4fb57518f47c71d28727ff6ad6234921d0248c Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 13 Mar 2024 19:45:25 +0800 Subject: [PATCH 157/223] llm call --- requirements.txt | 2 + ufo/config/config copy.yaml | 81 +++++++++++++++++++++++++++++++++++++ ufo/llm/llm_call.py | 1 + 3 files changed, 84 insertions(+) create mode 100644 ufo/config/config copy.yaml diff --git a/requirements.txt b/requirements.txt index 6c057ded..60701a80 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,3 +9,5 @@ pywin32==304 pywinauto==0.6.8 PyYAML==6.0.1 Requests==2.31.0 +faiss-cpu==1.23.5 +lxml==5.1.0 \ No newline at end of file diff --git a/ufo/config/config copy.yaml b/ufo/config/config copy.yaml new file mode 100644 index 00000000..c83a3ef1 --- /dev/null +++ b/ufo/config/config copy.yaml @@ -0,0 +1,81 @@ +version: 0.1 + +API_TYPE: "azure_ad" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, "azure_ad" for aoai aad. #USER +# OPENAI_API_BASE: "https://cloudgpt-swc.openai.azure.com" # for the OpenAI API. +OPENAI_API_BASE: "https://cloudgpt-openai.azure-api.net/" #USER +OPENAI_API_KEY: "5dad6fd852874c9db87b049e7d4ea1a9" # The OpenAI API key #USER +AOAI_DEPLOYMENT: "gpt-4-visual-preview" # Your AOAI deployment if apply #USER +API_VERSION: "2024-02-15-preview" # For GPT4-visual, the value usually be the "2023-12-01-preview" #USER +OPENAI_API_MODEL: "gpt-4-visual-preview" # The only OpenAI model by now that accepts visual input #USER +BING_API_KEY: "a5f1dec156334648a2354fabb221ffff" # The Bing search API key #USER + +# DRAW_RECTANGLE: True # Whether to draw the rectangle for the control item +CONTROL_BACKEND: "uia" # The backend for control action #DEV +MAX_TOKENS: 2000 # The max token limit for the response completion #USER +MAX_RETRY: 10 # The max retry limit for the response completion #USER +MAX_STEP: 30 # The max step limit for completing the user request #USER +SLEEP_TIME: 5 # The sleep time between each step to wait for the window to be ready +TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model +TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model +SAFE_GUARD: True # Whether to use the safe guard to prevent the model from doing sensitve operations. #DEV + +# ALL DEV +CONTROL_TYPE_LIST: ["Button", "Edit", "TabItem", "Document", "ListItem", "MenuItem", "ScrollBar", "TreeItem", "Hyperlink", "ComboBox", "RadioButton"] # The list of control types that are allowed to be selected +HISTORY_KEYS: ["Step", "Thought", "ControlText", "Action", "Comment", "Results"] # The keys of the action history for the next step. +ANNOTATION_COLORS: { + "Button": "#FFF68F", + "Edit": "#A5F0B5", + "TabItem": "#A5E7F0", + "Document": "#FFD18A", + "ListItem": "#D9C3FE", + "MenuItem": "#E7FEC3", + "ScrollBar": "#FEC3F8", + "TreeItem": "#D6D6D6", + "Hyperlink": "#91FFEB", + "ComboBox": "#D8B6D4" + } + +#USER +PRINT_LOG: False # Whether to print the log +LOG_LEVEL: "DEBUG" # The log level + +#USER +CONCAT_SCREENSHOT: True # Whether to concat the screenshot for the control item +INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation + +# DEV +REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model + + +APP_SELECTION_PROMPT: "ufo/prompts/base/app_selection.yaml" # The prompt for the app selection +ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt for the action selection + +APP_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/app_example.yaml" # The prompt for the app selection +ACTION_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/action_example.yaml" # The prompt for the action selection + +API_PROMPT: "ufo/prompts/base/api.yaml" # The prompt for the API + + +# DEV +INPUT_TEXT_API: "type_keys" # The input text API +INPUT_TEXT_ENTER: True # whether to press enter after typing the text + +### For AAD +AAD_TENANT_ID: "72f988bf-86f1-41af-91ab-2d7cd011db47" # Set the value to your tenant id for the llm model +AAD_API_SCOPE: "openai" # Set the value to your scope for the llm model e.g. OPENAI +AAD_API_SCOPE_BASE: "feb7b661-cac7-44a8-8dc1-163b63c23df2" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE + +# User +## RAG Configuration for the offline docs +RAG_OFFLINE_DOCS: True # Whether to use the offline RAG. +RAG_OFFLINE_DOCS_RETRIEVED_TOPK: 1 # The topk for the offline retrieved documents + +# User +## RAG Configuration for the Bing search +RAG_ONLINE_SEARCH: True # Whether to use the online search for the RAG. +RAG_ONLINE_SEARCH_TOPK: 3 # The topk for the online search +RAG_ONLINE_RETRIEVED_TOPK: 1 # The topk for the online retrieved documents + + + + \ No newline at end of file diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index a6074dc7..6b62869e 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -84,6 +84,7 @@ def get_gptv_completion(messages): top_p = configs["TOP_P"], ) response_json = json.loads(response.model_dump_json()) + print(response_json) if "error" not in response_json: usage = response.usage From 3875ded9eacd01fca93fd68cf5c33c4ee7c8cf9d Mon Sep 17 00:00:00 2001 From: yunhao0204 <59384816+yunhao0204@users.noreply.github.com> Date: Tue, 12 Mar 2024 17:28:13 +0800 Subject: [PATCH 158/223] Enable non-visual model Add non-visual models related configs into the config template file Add flags to switch between visual and non-visual model for the app agent and action agent. Add prompts for non-visual model. Add logic to use different model based on the flags. --- ufo/config/config.yaml.template | 20 +-- ufo/llm/llm_call.py | 16 +- ufo/llm/prompt.py | 27 ++++ ufo/module/flow.py | 45 ++++-- .../base/nonvisual/action_selection.yaml | 106 +++++++++++++ ufo/prompts/base/nonvisual/api.yaml | 56 +++++++ ufo/prompts/base/nonvisual/app_selection.yaml | 74 +++++++++ .../base/{ => visual}/action_selection.yaml | 0 ufo/prompts/base/{ => visual}/api.yaml | 0 .../base/{ => visual}/app_selection.yaml | 0 .../examples/nonvisual/action_example.yaml | 147 ++++++++++++++++++ .../examples/nonvisual/app_example.yaml | 134 ++++++++++++++++ .../examples/{ => visual}/action_example.yaml | 2 +- .../examples/{ => visual}/app_example.yaml | 0 14 files changed, 597 insertions(+), 30 deletions(-) create mode 100644 ufo/prompts/base/nonvisual/action_selection.yaml create mode 100644 ufo/prompts/base/nonvisual/api.yaml create mode 100644 ufo/prompts/base/nonvisual/app_selection.yaml rename ufo/prompts/base/{ => visual}/action_selection.yaml (100%) rename ufo/prompts/base/{ => visual}/api.yaml (100%) rename ufo/prompts/base/{ => visual}/app_selection.yaml (100%) create mode 100644 ufo/prompts/examples/nonvisual/action_example.yaml create mode 100644 ufo/prompts/examples/nonvisual/app_example.yaml rename ufo/prompts/examples/{ => visual}/action_example.yaml (99%) rename ufo/prompts/examples/{ => visual}/app_example.yaml (100%) diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index 450b4b55..e14ea25a 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -39,11 +39,11 @@ LOG_LEVEL: "DEBUG" # The log level INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model -APP_SELECTION_PROMPT: "ufo/prompts/base/app_selection.yaml" # The prompt for the app selection -ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection_rag.yaml" # The prompt for the action selection +APP_SELECTION_PROMPT: "ufo/prompts/base/{mode}/app_selection.yaml" # The prompt for the app selection +ACTION_SELECTION_PROMPT: "ufo/prompts/base/{mode}/action_selection_rag.yaml" # The prompt for the action selection -APP_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/app_example.yaml" # The prompt for the app selection -ACTION_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/action_example.yaml" # The prompt for the action selection +APP_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/{mode}/app_example.yaml" # The prompt for the app selection +ACTION_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/{mode}/action_example.yaml" # The prompt for the action selection API_PROMPT: "ufo/prompts/base/api.yaml" # The prompt for the API INPUT_TEXT_API: "type_keys" # The input text API @@ -54,7 +54,12 @@ AAD_TENANT_ID: "YOUR_TENANT_ID" # Set the value to your tenant id for the llm mo AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE - +### For Non-visual model +APP_AGENT_VISUAL_MODE: True # Whether to use the visual mode for the app agent +ACTION_AGENT_VISUAL_MODE: True # Whether to use the visual mode for the action agent +OPENAI_API_BASE_NON_VISUAL: "YOUR_NON_VISUAL_ENDPOINT" # The OpenAI endpoint for non-visual model +OPENAI_API_KEY_NON_VISUAL: "YOUR_API_KEY" # The OpenAI API key for non-visual model +OPENAI_API_MODEL_NON_VISUAL: "gpt-4-1106-preview" # The non-visual OpenAI model ## RAG Configuration for the offline docs RAG_OFFLINE_DOCS: False # Whether to use the offline RAG. @@ -65,8 +70,3 @@ RAG_OFFLINE_DOCS_RETRIEVED_TOPK: 1 # The topk for the offline retrieved documen RAG_ONLINE_SEARCH: False # Whether to use the online search for the RAG. RAG_ONLINE_SEARCH_TOPK: 5 # The topk for the online search RAG_ONLINE_RETRIEVED_TOPK: 1 # The topk for the online retrieved documents - - - - - \ No newline at end of file diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index 6b62869e..b725b7bd 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -12,20 +12,21 @@ configs = load_config() -def get_request_header(): +def get_request_header(is_visual=True): """ Get the header for the request. + is_visual: Whether the request is for visual model. return: The header for the request. """ if configs["API_TYPE"].lower() == "aoai": headers = { "Content-Type": "application/json", - "api-key": configs["OPENAI_API_KEY"], + "api-key": configs["OPENAI_API_KEY" if is_visual else "OPENAI_API_KEY_NON_VISUAL"], } elif configs["API_TYPE"].lower() == "openai": headers = { "Content-Type": "application/json", - "Authorization": "Bearer {key}".format(key=configs["OPENAI_API_KEY"]), + "Authorization": "Bearer {key}".format(key=configs["OPENAI_API_KEY" "OPENAI_API_KEY" if is_visual else "OPENAI_API_KEY_NON_VISUAL"]), } elif configs["API_TYPE"].lower() == "azure_ad": headers = {} @@ -35,9 +36,10 @@ def get_request_header(): return headers -def get_gptv_completion(messages): +def get_gptv_completion(messages, is_visual=True): """ Get GPT-V completion from messages. + is_visual: Whether the request is for visual model. messages: The messages to be sent to GPT-V. endpoint: The endpoint of the request. max_tokens: The maximum number of tokens to generate. @@ -55,13 +57,13 @@ def get_gptv_completion(messages): "temperature": configs["TEMPERATURE"], "max_tokens": configs["MAX_TOKENS"], "top_p": configs["TOP_P"], - "model": configs["OPENAI_API_MODEL"] + "model": configs["OPENAI_API_MODEL" if is_visual else "OPENAI_API_MODEL_NON_VISUAL"] } for _ in range(configs["MAX_RETRY"]): try: if not is_aad : - response = requests.post(configs["OPENAI_API_BASE"], headers=headers, json=payload) + response = requests.post(configs["OPENAI_API_BASE" if is_visual else "OPENAI_API_BASE_NON_VISUAL"], headers=headers, json=payload) response_json = response.json() response.raise_for_status() # Will raise an HTTPError if the HTTP request returned an unsuccessful status code @@ -77,7 +79,7 @@ def get_gptv_completion(messages): completion_tokens = usage.get("completion_tokens", 0) else: response = get_chat_completion( - engine=configs["OPENAI_API_MODEL"], + engine=configs["OPENAI_API_MODEL" if is_visual else "OPENAI_API_MODEL_NON_VISUAL"], messages = messages, max_tokens = configs["MAX_TOKENS"], temperature = configs["TEMPERATURE"], diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index 75d084a4..a08241b0 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -51,6 +51,33 @@ def prompt_construction(system_prompt: str, image_list: List, user_prompt: str, return prompt_message +def prompt_construction_non_visual(system_prompt: str, user_prompt: str): + """ + Construct the prompt for GPT-4 Non-Visual model. + :param system_prompt: The system prompt. + :param user_prompt: The user prompt. + return: The prompt for GPT-4 Non-Visual model. + """ + prompt_message = [] + if len(system_prompt) > 0: + system_message = { + "role": "system", + "content": system_prompt + } + prompt_message.append(system_message) + + user_content = [] + + user_content.append({ + "type": "text", + "text": user_prompt + }) + + user_message = {"role": "user", "content": user_content} + prompt_message.append(user_message) + + return prompt_message + def system_prompt_construction(prompt_template: str, apis: str, examples: str) -> str: """ diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 655ae0ce..4fcd407b 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -45,13 +45,17 @@ def __init__(self, task): create_folder(self.log_path) self.logger = initialize_logger(self.log_path, "response.log") self.request_logger = initialize_logger(self.log_path, "request.log") - self.app_selection_prompt = yaml.safe_load(open(configs["APP_SELECTION_PROMPT"], "r", encoding="utf-8")) - self.action_selection_prompt = yaml.safe_load(open(configs["ACTION_SELECTION_PROMPT"], "r", encoding="utf-8")) + self.is_app_agent_visual = configs["APP_AGENT_VISUAL_MODE"] + self.is_action_agent_visual = configs["ACTION_AGENT_VISUAL_MODE"] + self.app_selection_prompt = self.get_prompt(configs["APP_SELECTION_PROMPT"], self.is_app_agent_visual) + self.action_selection_prompt = self.get_prompt(configs["ACTION_SELECTION_PROMPT"], self.is_action_agent_visual) - self.app_selection_example_prompt = yaml.safe_load(open(configs["APP_SELECTION_EXAMPLE_PROMPT"], "r", encoding="utf-8")) - self.action_selection_example_prompt = yaml.safe_load(open(configs["ACTION_SELECTION_EXAMPLE_PROMPT"], "r", encoding="utf-8")) + self.app_selection_example_prompt = self.get_prompt(configs["APP_SELECTION_EXAMPLE_PROMPT"], self.is_app_agent_visual) + self.action_selection_example_prompt = self.get_prompt(configs["ACTION_SELECTION_EXAMPLE_PROMPT"], self.is_action_agent_visual) + + self.app_selection_api_prompt = self.get_prompt(configs["API_PROMPT"], self.is_app_agent_visual) + self.action_selection_api_prompt = self.get_prompt(configs["API_PROMPT"], self.is_action_agent_visual) - self.api_prompt = yaml.safe_load(open(configs["API_PROMPT"], "r", encoding="utf-8")) self.status = "APP_SELECTION" self.application = "" @@ -91,16 +95,19 @@ def process_application_selection(self): desktop_windows_dict, desktop_windows_info = control.get_desktop_app_info_dict() app_example_prompt = prompter.examples_prompt_helper(self.app_selection_example_prompt) - api_prompt = prompter.api_prompt_helper(self.api_prompt, verbose=0) + api_prompt = prompter.api_prompt_helper(self.app_selection_api_prompt, verbose=0) app_selection_prompt_system_message = prompter.system_prompt_construction(self.app_selection_prompt, api_prompt, app_example_prompt) app_selection_prompt_user_message = prompter.user_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request) - app_selection_prompt_message = prompter.prompt_construction(app_selection_prompt_system_message, [desktop_screen_url], app_selection_prompt_user_message) - + if self.is_app_agent_visual: + app_selection_prompt_message = prompter.prompt_construction(app_selection_prompt_system_message, [desktop_screen_url], app_selection_prompt_user_message) + else: + app_selection_prompt_message = prompter.prompt_construction_non_visual(app_selection_prompt_system_message, app_selection_prompt_user_message) + self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) try: - response, cost = llm_call.get_gptv_completion(app_selection_prompt_message) + response, cost = llm_call.get_gptv_completion(app_selection_prompt_message, self.is_app_agent_visual) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) @@ -233,16 +240,19 @@ def process_action_selection(self): image_url += [screenshot_url, screenshot_annotated_url] action_example_prompt = prompter.examples_prompt_helper(self.action_selection_example_prompt) - api_prompt = prompter.api_prompt_helper(self.api_prompt, verbose=1) + api_prompt = prompter.api_prompt_helper(self.action_selection_api_prompt, verbose=1) action_selection_prompt_system_message = prompter.system_prompt_construction(self.action_selection_prompt, api_prompt, action_example_prompt) action_selection_prompt_user_message = prompter.user_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request, self.rag_prompt()) - action_selection_prompt_message = prompter.prompt_construction(action_selection_prompt_system_message, image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"]) + if self.is_action_agent_visual: + action_selection_prompt_message = prompter.prompt_construction(action_selection_prompt_system_message, image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"]) + else: + action_selection_prompt_message = prompter.prompt_construction_non_visual(action_selection_prompt_system_message, action_selection_prompt_user_message) self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) try: - response, cost = llm_call.get_gptv_completion(action_selection_prompt_message) + response, cost = llm_call.get_gptv_completion(action_selection_prompt_message, self.is_action_agent_visual) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": action_selection_prompt_message}) print_with_color("Error occurs when calling LLM: {e}".format(e=str(e)), "red") @@ -340,6 +350,17 @@ def process_action_selection(self): return + def get_prompt(self, path_template, is_visual): + """ + Get the prompt. + path_template: The template of the prompt path. + is_visual: Whether to use the visual prompt. + return: The prompt. + """ + path = path_template.format(mode = "visual" if is_visual else "nonvisual") + prompt = yaml.safe_load(open(path, "r", encoding="utf-8")) + + return prompt def rag_prompt(self): """ diff --git a/ufo/prompts/base/nonvisual/action_selection.yaml b/ufo/prompts/base/nonvisual/action_selection.yaml new file mode 100644 index 00000000..0f230e8c --- /dev/null +++ b/ufo/prompts/base/nonvisual/action_selection.yaml @@ -0,0 +1,106 @@ +version: 1.0 + +system: |- + Your name is UFO, a UI-focused agent for Windows OS. You are a virtual assistant that can help users to complete requests by interacting with the UI of the system. + Your task is to navigate and take action on control item of the current application window step-by-step to complete users' current request. + - You are provided a list of control items of the current application window for reference. + - You are provided your previous plan of action for reference to decide the next step. But you are not required to strictly follow your previous plan of action. Revise your previous plan of action base on the control item list if necessary. + - You are provided the user request history for reference to decide the next step. These requests are the requests that you have completed before. You may need to use them as reference for the next action. + - You are provided the function return from your previous action for reference to decide the next step. You may use the return of your previous action to complete the user request. + - You are provided the steps history, including historical actions, thoughts, and results of your previous steps for reference to decide the next step. Use them to help you think about the next step. + - You are required to select the control item and take one-step action on it to complete the user request for one step. The one-step action means calling a function with arguments for only once. + - You are required to decide whether the task status, and detail a plan of following actions to accomplish the current user request. Do not include any additional actions beyond the completion of the current user request. + + ## Control item + - The control item is the element on the page that you can interact with, we limit the actionable control item to the following: + - "Button" is the control item that you can click. + - "Edit" is the control item that you can click and input text. + - "TabItem" is the control item that you can click and switch to another page. + - "ListItem" is the control item that you can click and select. + - "MenuItem" is the control item that you can click and select. + - "ScrollBar" is the control item that you can scroll. + - "TreeItem" is the control item that you can click and select. + - "Document" is the control item that you can click and select text. + - "Hyperlink" is the control item that you can click and open a link. + - "ComboBox" is the control item that you can click and input text. The Google search box is an example of ComboBox. + - You are given the information of all available control item in the current application window in a list format: {{label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}}. + + ## Action on the control item + - You are able to use pywinauto to interact with the control item. + {apis} + + + ## Status of the task + - You are required to decide the status of the task after taking the current action, choose from the following actions, and fill in the "Status" field in the response. + - "CONTINUE": means the task is not finished and need further action. + - "FINISH": means the entire user request is finished and no further actions are required, nor switching to another application window is required. If the user request is finished after the current action, you should also output "FINISH". Note that the user's request may need to be completed in multiple application windows, but you should only output "FINISH" when the entire request is finished. + - "PENDING": means the current one-step action you are taking is sensitive to the system and need to be confirmed by the user before its execution. This does not apply to future actions after the current step. Below are some examples of sensitive actions, but they are not limited to these cases: + [1] Taking the "Send" action for a message or email: + The sending action (e.g. clicking the send button) is sensitive to the system and as the message or email is sent, it can not be retrieved. Thus, the user need to confirm the sending action. Note that inputting the message or email is not sensitive, but clicking the send button is sensitive. + [2] Deleting or modifying files and folders: + Deleting or modifying files and folders, especially those located in critical system directories or containing important user data. + [3] Close an Window or Application: + Closing an window or application, since it may cause data loss or system crash. + [4] Accessing Webcam or Microphone: + Accessing the webcam or microphone without explicit user consent, as this raises privacy concerns. + [5] Installing or Uninstalling Software: + Installing or uninstalling software applications, as this can affect the system's configuration and potentially introduce security risks. + [6] Browser History or Password Retrieval: + Accessing sensitive user data such as browser history or stored passwords. + Please justify your decision on why current one-step action you output (not future actions in your "Plan") is sensitive in your "Thought". + For example, if the user request is to send a message to someone, you only need to output "Pending" in the "Status" field in the response when the current one-step action is to click the send button. + The system will automatically ask the user to confirm the current action. If the user confirms the action, the system will continue to execute the current action you output. Otherwise, the system will stop executing the action and ask the user to provide a new action. + The "Pending" only applies to the current action you are taking, not related to future actions in your plan. + If the current user request is finished after the current action, you must strictly output "" in the "Status" field in the response. + - "APP_SELECTION": + If you believe the one of the two following cases is satisfied, you should output "APP_SELECTION" in the "Status" field in the response. + [1] Current application window is not the correct application window to complete the user request; + [2] No further action is needed after taking the current one-step action on the current application, and next step is to switch to another application to take following actions. + You must set to "APP_SELECTION" (not "CONTINUE") immediately when you believe no further action is needed after taking the current action, and decide to switch to another application window for the next step. + + ## Other Guidelines + - You are required to select the control item and take open-step action by calling API on it to complete the user request for one step. + - You are required to are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: + {{"Observation": + "Thought": + "ControlLabel": + "ControlText": + "Function": + "Args": + "Status": + "Plan": for reference, and you can reflect on it and revise if necessary. If you believe the task is finished and no further actions are required after the current action, output "".> + "Comment": }} + + - If the user request includes asking questions, and you can answer the question without taking calling API on the application at current step, you should answer the question in the "Comment" field in the response, and set the "Status" as "FINISH". + - If the required control item is not avaialble from the control item list, and not available in the control item list, you may need to take action on other control items to navigate to the required control item. + - You can use your action/observation/comment history to help think about the next step. However, you must rely more on the current control item list to make the decision. + - You must select the control item in the given list . You must not generate not in the list or in the historical steps. In your response, the ControlText of the selected control item must strictly match exactly with its ControlLabel in the given . Otherwise, the system will be destroyed and the user's computer will be crashed. + - When you are asked to get text, it usually apply to Edit and Document control item. Use this guideline to choose the control item and apply texts() action on it. + - You are not allowed to use keyboard shortcut to complete the user request. + - You must look at the control item list carefully, analyse the current status before you select the control item and take action on it. Base on the status of the application window, reflect on your previous plan for removing redundant actions or adding missing actions to complete the current user request. + - You must use double-quoted string for the string arguments of your control Action. {{"text": "Hello World. \\n you're my friend. Tom's home is great.')"}}. Otherwise it will crash the system and destroy the user's computer. + - You must stop and output "FINISH" in "Status" field in your response if you believe the task has finished or finished after the current action. + - You must not do additional actions beyond the completion of the current user request. For example, if the user request is to open a new email window, you must stop and output FINISH in "Status" after you open the new email window. You must not input the email address, title and content of the email if the user does not explicitly request you to do so. + - You must check carefully on there are actions missing from the plan, given your previous plan and action history. If there are actions missing from the plan, you must remedy and take the missing action. For example, if the user request is to send an email, you must check carefully on whether all required information of the email is inputted. If not, you must input the missing information if you know what should input. + - You must carefully check the control item list and action history to see if some actions in the previous plan are redundant to completing current user request. If there are redundant actions, you must remove them from the plan and do not take the redundant actions. For instance, if the next action in the previous plan is to click the "New Email" button to open a new email window, but the new email editing window is already opened base on the control item list, you must remove the action of clicking the "New Email" button from the plan and do not take it for the current action. + - Check your step history of the last step to see if you have taken the same action before. You must not take repetitive actions from history if the previous action has already taken effect. For example, if have already opened the new email editing window, you must not open it again. + - Do not take action if the current action need further input. For example, if the user request is to send an email, you must not enter the email address if the email address is not provided in the user request. + - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. + - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. + - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. + - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current control item list to make the decision. + + {examples} + + This is a very important task. Please read the user request and the control item list carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. + Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. + Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Your output must be able to be able to be parsed by json.loads(). Otherwise, it will crash the system and destroy the user's computer. + +user: |- + {retrieved_docs} + {control_item} + {request_history} + {action_history} + {prev_plan} + {user_request} + diff --git a/ufo/prompts/base/nonvisual/api.yaml b/ufo/prompts/base/nonvisual/api.yaml new file mode 100644 index 00000000..86f180dc --- /dev/null +++ b/ufo/prompts/base/nonvisual/api.yaml @@ -0,0 +1,56 @@ +Click: + summary: |- + "Click" is to click the control item with mouse. + usage: |- + [1] API call: click_input(button=, double) + [2] Args: + - button: 'The mouse button to click. One of ''left'', ''right'', ''middle'' or ''x'' (Default: ''left'')' + - double: 'Whether to perform a double click or not (Default: False)' + [3] Example: click_input(button="left", double=False) + [4] Available control item: All control items. + [5] Return: None + + +SetText: + summary: |- + "SetText" is to input text to the control item. + usage: |- + [1] API call: set_edit_text(text="") + [2] Args: + - text: The text input to the Edit control item. It will change the content of current text in the edit block. Set text ='' if you want to clear current text in the block. You must also use Double Backslash escape character to escape the single quote in the string argument. + [3] Example: set_edit_text(text="Hello World. \\n I enjoy the reading of the book 'The Lord of the Rings'. It's a great book.") + [4] Available control item: [Edit] + [5] Return: None + + +Summary: + summary: |- + "Summary" is to summarize your throughts of the current application window base on the control item list. This usually happens when the you need to complete the user request by summarizing or describing the information on the current application window. You must use the 'text' argument to input the text to be summarized. + usage: |- + [1] API call: summary(text="") + [2] Args: None + [3] Example: summary(text="The image shows a workflow of a AI agent framework. \\n The framework has three components: the 'data collection', the 'data processing' and the 'data analysis'.") + [4] Available control item: All control items. + [5] Return: the summary of the image. + +GetText: + summary: |- + "GetText" is to get the text of the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. + usage: |- + [1] API call: texts() + [2] Args: None + [3] Example: texts() + [4] All control items. + [5] Return: the text content of the control item. + +Scroll: + summary: |- + "Scroll" is to scroll the control item. It typical apply to a ScrollBar type of control item when user request is to scroll the control item, or the targeted control item is not visible nor available in the control item list, but you know the control item is in the application window and you need to scroll to find it. + usage: |- + [1] API call: wheel_mouse_input() + [2] Args: + - wheel_dist: The distance to scroll. Positive values indicate upward scrolling, negative values indicate downward scrolling. + [3] Example: wheel_mouse_input(wheel_dist=-20) + [4] All control items. + [5] Return: None + \ No newline at end of file diff --git a/ufo/prompts/base/nonvisual/app_selection.yaml b/ufo/prompts/base/nonvisual/app_selection.yaml new file mode 100644 index 00000000..f8a161b7 --- /dev/null +++ b/ufo/prompts/base/nonvisual/app_selection.yaml @@ -0,0 +1,74 @@ +version: 1.0 + +system: |- + - Your name is UFO, a UI-focused agent for Windows OS. You are a virtual assistant that can help users to complete their current requests by interacting with the UI of the system and describe the content in the control item list. + - Your task involves navigating through a provided control item list of the current desktop along with a list of available applications in the windows. + - As a multimodal agent, you are very expert in understanding the user request and the control item list. + - You are equipped to provide detailed descriptions or analyses of control item list if needed. Do not reject such requests. + - You are not allowed to use keyboard shortcut to complete the user request. + + ## Guidelines + - You are given the information of all available applications item in the current desktop window in a dict format: {{label: "label", control_text: "the text of the application", control_type: "the type of the application"}}. + - You are provided your previous plan of action for reference to decide the application. This usually happens when the you have already completed the previous task on an application and need to switch to another application to complete the next task. + - When the selected application is available from the control item list, analyze the control item list of the application window on its current status. Draft your plan based on the current status of the application and user request, and do not include the steps that have been completed on the application base on your control item list observation. + - You are provided the user request history for reference to decide the selection of application or control item. + - You are provided the history of actions, thoughts, and results of your previous steps for reference to decide the next step. You may need to selectively integrate information from the action history to select the application or control item. + - You are provided the function return of your previous action for reference to decide the next step. + - Some of the applications may not available from the control item list, but they are available in the list of . You can try to select these applications if required. + - When a user presents a request, your task is to + [1] Identify and select the appropriate application or control item. + [2] Detail a plan of following actions to accomplish the given task. + [3] If the target application is available, decide the current status of the task base on the control item list. Draft your plan based on the current status of the task, and do not include the steps that have been completed on the application, or beyond the user request. + [4] Determine whether the status of the task is finished or not. + - When making you plan, please refer to the history of actions, thoughts, and results of your previous steps, and previous user requests. Make sure your plan is complete ONLY for the current user request. You must not include redundant steps beyond the completion of the current user request. + - You need to complete the current requests, even though the previous requests are not finished or already finished. + - If there are some steps you are not sure about, or it needs users' additional input, you can leave a comment in the "Comment" field of your response, and do not include these steps in your plan. + + ## Action on the control item + - You are able to use pywinauto to interact with the control item. + {apis} + + - You may need to take sensitive actions to complete the task. If an action is sensitive to the system, it needs to be confirmed by the user. Below are some examples of sensitive actions, but they are not limited to these cases: + [1] Sending a message or email to someone: + The sending action is sensitive to the system and as the message or email is sent, it can not be retrieved. Thus, the user need to confirm the sending action. + [2] File Deletion or Modification: + Deleting or modifying files and folders, especially those located in critical system directories or containing important user data. + [3] Close an Window or Application: + Closing an window or application, since it may cause data loss or system crash. + [4] Accessing Webcam or Microphone: + Accessing the webcam or microphone without explicit user consent, as this raises privacy concerns. + [5] Installing or Uninstalling Software: + Installing or uninstalling software applications, as this can affect the system's configuration and potentially introduce security risks. + [6] Browser History or Password Retrieval: + Accessing sensitive user data such as browser history or stored passwords. + Please identify sensitive action in your plan of your response. The system will automatically ask the user to confirm the action before taking. + + - Your response should be strictly structured in a JSON format, consisting of three distinct parts with the following keys and corresponding content: + {{ + "Observation": + "Thought": + "ControlLabel": + "ControlText": + "Status": + "Plan": .> + "Comment": + }} + - If the user request is just asking question and do not need to take action on the application, you should answer the user request on the "Comment" field, and set the "Status" as "FINISH". + - You must analyze the control item list and the user request carefully, to understand what have been completed on which application, you must not repeatedly choose the same application or control item, unless the user request has not been completed on the application. + - In your response, the control text of the selected application must strictly match its control label. + - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. + - You must to strictly follow the instruction and the JSON format of the response. + - Below are two example of the response. You can refer to them as a reference. + {examples} + + + This is a very important task. Please read the user request and the control item list carefully, think step by step and take a deep breath before you start. + Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Otherwise it will crash the system. + +user: |- + {control_item} + {request_history} + {action_history} + {prev_plan} + {user_request} + \ No newline at end of file diff --git a/ufo/prompts/base/action_selection.yaml b/ufo/prompts/base/visual/action_selection.yaml similarity index 100% rename from ufo/prompts/base/action_selection.yaml rename to ufo/prompts/base/visual/action_selection.yaml diff --git a/ufo/prompts/base/api.yaml b/ufo/prompts/base/visual/api.yaml similarity index 100% rename from ufo/prompts/base/api.yaml rename to ufo/prompts/base/visual/api.yaml diff --git a/ufo/prompts/base/app_selection.yaml b/ufo/prompts/base/visual/app_selection.yaml similarity index 100% rename from ufo/prompts/base/app_selection.yaml rename to ufo/prompts/base/visual/app_selection.yaml diff --git a/ufo/prompts/examples/nonvisual/action_example.yaml b/ufo/prompts/examples/nonvisual/action_example.yaml new file mode 100644 index 00000000..824081b8 --- /dev/null +++ b/ufo/prompts/examples/nonvisual/action_example.yaml @@ -0,0 +1,147 @@ +version: 1.0 + +example1: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The control item list indicates that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", + "Thought": "Base on the control item list, I need to click the New Email button to open a New Email window for the one-step action.", + "ControlLabel": "1", + "ControlText": "New Email", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", + "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} + + +example2: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The control item list indicates that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not available from the control item list. The last action took effect by opening the Outlook windows.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not available in the control item list, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", + "ControlLabel": "34", + "ControlText": "Main Page", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not available in the control item list, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", + "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} + + +example3: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "The control item list indicates that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. ", + "Thought": "Base on the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", + "ControlLabel": "36", + "ControlText": "Type a new message", + "Function": "set_edit_text", + "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, + "Status": "CONTINUE", + "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", + "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} + + +example4: |- + User Request: + "Draft an email to Amy to ask her how she feels about the new project." + Response: + {"Observation": "The control item list indicates that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the seems like the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", + "ControlLabel": "36", + "ControlText": "Email Body", + "Function": "set_edit_text", + "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, + "Status": "FINISH", + "Plan": "", + "Comment": "I revised the previous plan base on the control item list since I think the New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} + + +example5: |- + User Request: + "Search for the word 'UFO' in the document." + Response: + {"Observation": "The control item list indicates that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted.", + "Thought": "Base on the control item list, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", + "ControlLabel": "59", + "ControlText": "Find", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "FINISH", + "Plan": "", + "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} + +example6: |- + User Request: + "Quickly remove all notes in the presentation.pptx, without looping through each slide." + Response: + {"Observation": "The current control item list indicates the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", + "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", + "ControlLabel": "59", + "ControlText": "File", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} + "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} + +example7: |- + User Request: + "How many stars does the Imdiffusion repo have?" + Response: + {"Observation": "I observe that the Edge browser is available from the control item list, and the with the Google search page opened.", + "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", + "ControlLabel": "36", + "ControlText": "搜索", + "Function": "set_edit_text", + "Args": {"text": "Imdiffusion GitHub"}, + "Status": "CONTINUE", + "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", + "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + +example8: |- + User Request: + "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Response: + {"Observation": "The current control item list indicates that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task.", + "Thought": "I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes.", + "ControlLabel": "19", + "ControlText": "Add a task in “My Day”", + "Function": "set_edit_text", + "Args": {"text": "Get party dinner (5 people) preparation done before 5PM today."}, + "Status": "CONTINUE", + "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", + "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} + + +example9: |- + User Request: + "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Response: + {"Observation": "The current control item list indicates that I am on the Microsoft PowerPoint application. The Copilot Add-in is avaialble from the control item list.", + "Thought": "I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx.", + "ControlLabel": "60", + "ControlText": "Copilot", + "Function": "click_input", + "Args": {"button": "left", "double": true}, + "Status": "CONTINUE", + "Plan": "(1) Click the 'Create presentation from file' button to open a file picker. \\n (2) Select and click the meeting_notes.docx file in the file picker. \\n (3) Click the 'Send' buttom to send the request to Copilot. This completes the task.", + "Comment": "I need use the Copilot Add-in to create a slide from the meeting_notes.docx."} + + +example10: |- + User Request: + "Please @Zac to revise the presentation1.pptx." + Response: + {"Observation": "The current control item list indicates the powerpoint application is visible, and the presentation1.pptx is opened.", + "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", + "ControlLabel": "42", + "ControlText": "Insert", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Click the Comment button to open the comment text box. \\n (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", + "Comment": "I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} diff --git a/ufo/prompts/examples/nonvisual/app_example.yaml b/ufo/prompts/examples/nonvisual/app_example.yaml new file mode 100644 index 00000000..c7a4dccb --- /dev/null +++ b/ufo/prompts/examples/nonvisual/app_example.yaml @@ -0,0 +1,134 @@ + +version: 1.0 + +example1: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "I observe that the outlook application is available from the control item list, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application.", + "Thought": "I need to open the email application to send a email. According to the control item list and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it.", + "ControlLabel": "12", + "ControlText": "Mail - Outlook - Zac", + "Status": "CONTINUE", + "Plan": "(1) Open the windows of outlook application.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email. This action is sensitive and need to be confirmed by the user.", + "Comment": "It is time to open the outlook application!"} + + +example2: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "I observe an empty desktop with no application opened, the target application Teams is not available frp, the control item list.", + "Thought": "I need to open the Teams application to send a message. Although I can not find the Teams application from the control item list, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it.", + "ControlLabel": "6", + "ControlText": "Mike Lee | Microsoft Teams", + "Status": "CONTINUE", + "Plan": "(1) Open the windows of Teams application.\\n(2) Click the Chat button to open the chat window with Tom.\\n(3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?'\\n(4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user.", + "Comment": "It is time to open the Teams application."} + + +example3: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "The control item list indecates that I am on the chat window of Tom on Teams, the message input box is empty and ready to input.", + "Thought": "Base on the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", + "ControlLabel": "36", + "ControlText": "Type a new message", + "Function": "set_edit_text", + "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, + "Status": "CONTINUE", + "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", + "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} + + +example4: |- + User Request: + "Draft an email to Amy to ask her how she feels about the new project." + Response: + {"Observation": "The control item list indecates that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the control item list indecates that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", + "ControlLabel": "36", + "ControlText": "Email Body", + "Function": "set_edit_text", + "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, + "Status": "FINISH", + "Plan": "", + "Comment": "I revised the previous plan base on the control item list since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} + + +example5: |- + User Request: + "Revise the email to be longer and send." + Response: + {"Observation": "I observe that the outlook application is available from the control item list, and a new email draft is opened, with its title, receiver email address and email body already filled in.", + "Thought": "Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send.", + "ControlLabel": "21", + "ControlText": "Mail - Outlook - Zac", + "Status": "CONTINUE", + "Plan": "(1) Open the Mail - Outlook - Zac to complete the next task.\\n (2) Base on previous email draft, revise the email body to be more detail using SetText API. \\n (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user.", + "Comment": "The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it."} + +example6: |- + User Request: + "Quickly remove all notes in the presentation.pptx, without looping through each slide." + Response: + {"Observation": "I observe that the powerpoint application is available from the control item list, and the presentation.pptx is opened", + "Thought": "I need to set focus on the powerpoint application to remove all notes in the presentation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one.", + "ControlLabel": "21", + "ControlText": "presentation - PowerPoint", + "Status": "CONTINUE", + "Plan": "(1) Open and set focus the presentation - PowerPoint.\\n (2) Click the 'File' button at the upper left corner, to open a menu.\\n (3) Click the 'Info' ListItem, to access the 'Info' page.\\n (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (5) Click the 'Inspect Document', to open a document inspector. \\n (6) Click the 'Inspect' button, to inspect the ppt for notes. \\n (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.", + "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} + + +example7: |- + User Request: + "How many stars does the Imdiffusion repo have?" + Response: + {"Observation": "I observe that a Edge browser is available from the control item list and the with the Google page opened.", + "Thought": "I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task.", + "ControlLabel": "7", + "ControlText": "Google - Microsoft​ Edge", + "Status": "CONTINUE", + "Plan": "(1) Open and set focus the Google - Microsoft​ Edge.\\n (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. \\n (3) Click Google Search to search for the Imdiffusion repo on github.\\n (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page.\\n (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", + "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + +example8: |- + User Request: + "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Response: + {"Observation": "The current control item list does not include any reminder application or calendar application.", + "Thought": "I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application.", + "ControlLabel": "6", + "ControlText": "Microsoft To Do", + "Status": "CONTINUE", + "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", + "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} + + +example9: |- + User Request: + "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Response: + {"Observation": "The current control item list does not include any the powerpoint application or the word application.", + "Thought": "I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application.", + "ControlLabel": "4", + "ControlText": "presentation1 - PowerPoint", + "Status": "CONTINUE", + "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. \\n (3) Click the 'Create presentation from file' button to open a file picker. \\n (4) Select and click the meeting_notes.docx file in the file picker. \\n (5) Click the 'Send' buttom to send the request to Copilot. This completes the task.", + "Comment": "I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx."} + + +example10: |- + User Request: + "Please @Zac to revise the presentation1.pptx." + Response: + {"Observation": "The current control item list includes the powerpoint application is visible, and the presentation1.pptx is opened.", + "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", + "ControlLabel": "4", + "ControlText": "presentation1 - PowerPoint, + "Status": "CONTINUE", + "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Click the Insert Button to open the Insert menu. \\n (3) Click the Comment button to open the comment text box. \\n (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", + "Comment": "I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + diff --git a/ufo/prompts/examples/action_example.yaml b/ufo/prompts/examples/visual/action_example.yaml similarity index 99% rename from ufo/prompts/examples/action_example.yaml rename to ufo/prompts/examples/visual/action_example.yaml index 5a8e5390..4e955f4d 100644 --- a/ufo/prompts/examples/action_example.yaml +++ b/ufo/prompts/examples/visual/action_example.yaml @@ -11,7 +11,7 @@ example1: |- "Function": "click_input", "Args": {"button": "left", "double": false}, "Status": "CONTINUE", - "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(2) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", + "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} diff --git a/ufo/prompts/examples/app_example.yaml b/ufo/prompts/examples/visual/app_example.yaml similarity index 100% rename from ufo/prompts/examples/app_example.yaml rename to ufo/prompts/examples/visual/app_example.yaml From 9bedae6b71d5a34ec6855a105322c8e88291cf4d Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 13 Mar 2024 20:33:05 +0800 Subject: [PATCH 159/223] delete --- ufo/config/config.yaml.template | 1 - 1 file changed, 1 deletion(-) diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index e14ea25a..1ff02698 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -9,7 +9,6 @@ OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that ac BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key - CONTROL_BACKEND: "uia" # The backend for control action MAX_TOKENS: 2000 # The max token limit for the response completion MAX_RETRY: 3 # The max retry limit for the response completion From 78aaf4793e5f800b9591347c347fc548515c4b87 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 13 Mar 2024 21:48:58 +0800 Subject: [PATCH 160/223] non-visual refine --- ufo/config/config copy.yaml | 81 --------------------------------- ufo/config/config.yaml.template | 3 +- ufo/llm/llm_call.py | 11 +++-- ufo/llm/prompt.py | 77 ++++++++++++++----------------- ufo/module/flow.py | 33 ++++++-------- 5 files changed, 58 insertions(+), 147 deletions(-) delete mode 100644 ufo/config/config copy.yaml diff --git a/ufo/config/config copy.yaml b/ufo/config/config copy.yaml deleted file mode 100644 index c83a3ef1..00000000 --- a/ufo/config/config copy.yaml +++ /dev/null @@ -1,81 +0,0 @@ -version: 0.1 - -API_TYPE: "azure_ad" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, "azure_ad" for aoai aad. #USER -# OPENAI_API_BASE: "https://cloudgpt-swc.openai.azure.com" # for the OpenAI API. -OPENAI_API_BASE: "https://cloudgpt-openai.azure-api.net/" #USER -OPENAI_API_KEY: "5dad6fd852874c9db87b049e7d4ea1a9" # The OpenAI API key #USER -AOAI_DEPLOYMENT: "gpt-4-visual-preview" # Your AOAI deployment if apply #USER -API_VERSION: "2024-02-15-preview" # For GPT4-visual, the value usually be the "2023-12-01-preview" #USER -OPENAI_API_MODEL: "gpt-4-visual-preview" # The only OpenAI model by now that accepts visual input #USER -BING_API_KEY: "a5f1dec156334648a2354fabb221ffff" # The Bing search API key #USER - -# DRAW_RECTANGLE: True # Whether to draw the rectangle for the control item -CONTROL_BACKEND: "uia" # The backend for control action #DEV -MAX_TOKENS: 2000 # The max token limit for the response completion #USER -MAX_RETRY: 10 # The max retry limit for the response completion #USER -MAX_STEP: 30 # The max step limit for completing the user request #USER -SLEEP_TIME: 5 # The sleep time between each step to wait for the window to be ready -TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model -TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model -SAFE_GUARD: True # Whether to use the safe guard to prevent the model from doing sensitve operations. #DEV - -# ALL DEV -CONTROL_TYPE_LIST: ["Button", "Edit", "TabItem", "Document", "ListItem", "MenuItem", "ScrollBar", "TreeItem", "Hyperlink", "ComboBox", "RadioButton"] # The list of control types that are allowed to be selected -HISTORY_KEYS: ["Step", "Thought", "ControlText", "Action", "Comment", "Results"] # The keys of the action history for the next step. -ANNOTATION_COLORS: { - "Button": "#FFF68F", - "Edit": "#A5F0B5", - "TabItem": "#A5E7F0", - "Document": "#FFD18A", - "ListItem": "#D9C3FE", - "MenuItem": "#E7FEC3", - "ScrollBar": "#FEC3F8", - "TreeItem": "#D6D6D6", - "Hyperlink": "#91FFEB", - "ComboBox": "#D8B6D4" - } - -#USER -PRINT_LOG: False # Whether to print the log -LOG_LEVEL: "DEBUG" # The log level - -#USER -CONCAT_SCREENSHOT: True # Whether to concat the screenshot for the control item -INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation - -# DEV -REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model - - -APP_SELECTION_PROMPT: "ufo/prompts/base/app_selection.yaml" # The prompt for the app selection -ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt for the action selection - -APP_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/app_example.yaml" # The prompt for the app selection -ACTION_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/action_example.yaml" # The prompt for the action selection - -API_PROMPT: "ufo/prompts/base/api.yaml" # The prompt for the API - - -# DEV -INPUT_TEXT_API: "type_keys" # The input text API -INPUT_TEXT_ENTER: True # whether to press enter after typing the text - -### For AAD -AAD_TENANT_ID: "72f988bf-86f1-41af-91ab-2d7cd011db47" # Set the value to your tenant id for the llm model -AAD_API_SCOPE: "openai" # Set the value to your scope for the llm model e.g. OPENAI -AAD_API_SCOPE_BASE: "feb7b661-cac7-44a8-8dc1-163b63c23df2" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE - -# User -## RAG Configuration for the offline docs -RAG_OFFLINE_DOCS: True # Whether to use the offline RAG. -RAG_OFFLINE_DOCS_RETRIEVED_TOPK: 1 # The topk for the offline retrieved documents - -# User -## RAG Configuration for the Bing search -RAG_ONLINE_SEARCH: True # Whether to use the online search for the RAG. -RAG_ONLINE_SEARCH_TOPK: 3 # The topk for the online search -RAG_ONLINE_RETRIEVED_TOPK: 1 # The topk for the online retrieved documents - - - - \ No newline at end of file diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index 1ff02698..0afbed9e 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -8,7 +8,6 @@ API_VERSION: "2024-02-15-preview" # "2024-02-15-preview" by default. OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key - CONTROL_BACKEND: "uia" # The backend for control action MAX_TOKENS: 2000 # The max token limit for the response completion MAX_RETRY: 3 # The max retry limit for the response completion @@ -44,7 +43,7 @@ ACTION_SELECTION_PROMPT: "ufo/prompts/base/{mode}/action_selection_rag.yaml" # APP_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/{mode}/app_example.yaml" # The prompt for the app selection ACTION_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/{mode}/action_example.yaml" # The prompt for the action selection -API_PROMPT: "ufo/prompts/base/api.yaml" # The prompt for the API +API_PROMPT: "ufo/prompts/base/{mode}/api.yaml" # The prompt for the API INPUT_TEXT_API: "type_keys" # The input text API INPUT_TEXT_ENTER: True # whether to press enter after typing the text diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index b725b7bd..a60b007c 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -51,19 +51,22 @@ def get_gptv_completion(messages, is_visual=True): is_aad = configs['API_TYPE'].lower() == 'azure_ad' headers = get_request_header() + model_name = configs["OPENAI_API_MODEL" if is_visual else "OPENAI_API_MODEL_NON_VISUAL"] + api_base = configs["OPENAI_API_BASE" if is_visual else "OPENAI_API_BASE_NON_VISUAL"] + if not is_aad: payload = { "messages": messages, "temperature": configs["TEMPERATURE"], "max_tokens": configs["MAX_TOKENS"], "top_p": configs["TOP_P"], - "model": configs["OPENAI_API_MODEL" if is_visual else "OPENAI_API_MODEL_NON_VISUAL"] + "model": model_name } for _ in range(configs["MAX_RETRY"]): try: if not is_aad : - response = requests.post(configs["OPENAI_API_BASE" if is_visual else "OPENAI_API_BASE_NON_VISUAL"], headers=headers, json=payload) + response = requests.post(api_base, headers=headers, json=payload) response_json = response.json() response.raise_for_status() # Will raise an HTTPError if the HTTP request returned an unsuccessful status code @@ -79,14 +82,14 @@ def get_gptv_completion(messages, is_visual=True): completion_tokens = usage.get("completion_tokens", 0) else: response = get_chat_completion( - engine=configs["OPENAI_API_MODEL" if is_visual else "OPENAI_API_MODEL_NON_VISUAL"], + engine=model_name, messages = messages, max_tokens = configs["MAX_TOKENS"], temperature = configs["TEMPERATURE"], top_p = configs["TOP_P"], ) response_json = json.loads(response.model_dump_json()) - print(response_json) + if "error" not in response_json: usage = response.usage diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index a08241b0..ad4aa333 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -3,14 +3,16 @@ from typing import List import json +import yaml -def prompt_construction(system_prompt: str, image_list: List, user_prompt: str, include_last_screenshot=False): +def prompt_construction(system_prompt: str, image_list: List, user_prompt: str, include_last_screenshot=False, is_visual=True): """ Construct the prompt for GPT-4 Visual. :param system_prompt: The system prompt. :param image_list: The list of images. :param user_prompt: The user prompt. :param include_last_screenshot: Whether to include the last screenshot. + :param is_visual: Whether the request is for visual model. return: The prompt for GPT-4 Visual. """ prompt_message = [] @@ -21,52 +23,28 @@ def prompt_construction(system_prompt: str, image_list: List, user_prompt: str, } prompt_message.append(system_message) - screenshot_text = [] - if include_last_screenshot: - screenshot_text += ["Screenshot for the last step:"] - - screenshot_text += ["Current Screenshots:", "Annotated Screenshot:"] - user_content = [] - for i, image in enumerate(image_list): - user_content.append({ - "type": "text", - "text": screenshot_text[i] - }) - user_content.append({ - "type": "image_url", - "image_url": { - "url": image - } - }) + if is_visual: + screenshot_text = [] + if include_last_screenshot: + screenshot_text += ["Screenshot for the last step:"] - user_content.append({ - "type": "text", - "text": user_prompt - }) + screenshot_text += ["Current Screenshots:", "Annotated Screenshot:"] - user_message = {"role": "user", "content": user_content} - prompt_message.append(user_message) - - return prompt_message - -def prompt_construction_non_visual(system_prompt: str, user_prompt: str): - """ - Construct the prompt for GPT-4 Non-Visual model. - :param system_prompt: The system prompt. - :param user_prompt: The user prompt. - return: The prompt for GPT-4 Non-Visual model. - """ - prompt_message = [] - if len(system_prompt) > 0: - system_message = { - "role": "system", - "content": system_prompt - } - prompt_message.append(system_message) + - user_content = [] + for i, image in enumerate(image_list): + user_content.append({ + "type": "text", + "text": screenshot_text[i] + }) + user_content.append({ + "type": "image_url", + "image_url": { + "url": image + } + }) user_content.append({ "type": "text", @@ -79,6 +57,7 @@ def prompt_construction_non_visual(system_prompt: str, user_prompt: str): return prompt_message + def system_prompt_construction(prompt_template: str, apis: str, examples: str) -> str: """ Construct the prompt for app selection. @@ -171,4 +150,18 @@ def examples_prompt_helper(examples: dict, header: str = "## Response Examples", return retrived_documents_prompt_helper(header, separator, example_list) + + +def load_prompt(template_path, is_visual): + """ + Get the prompt. + path_template: The template of the prompt path. + is_visual: Whether to use the visual prompt. + return: The prompt. + """ + path = template_path.format(mode = "visual" if is_visual else "nonvisual") + prompt = yaml.safe_load(open(path, "r", encoding="utf-8")) + + return prompt + diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 4fcd407b..29a43e75 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -45,16 +45,15 @@ def __init__(self, task): create_folder(self.log_path) self.logger = initialize_logger(self.log_path, "response.log") self.request_logger = initialize_logger(self.log_path, "request.log") - self.is_app_agent_visual = configs["APP_AGENT_VISUAL_MODE"] - self.is_action_agent_visual = configs["ACTION_AGENT_VISUAL_MODE"] - self.app_selection_prompt = self.get_prompt(configs["APP_SELECTION_PROMPT"], self.is_app_agent_visual) - self.action_selection_prompt = self.get_prompt(configs["ACTION_SELECTION_PROMPT"], self.is_action_agent_visual) - self.app_selection_example_prompt = self.get_prompt(configs["APP_SELECTION_EXAMPLE_PROMPT"], self.is_app_agent_visual) - self.action_selection_example_prompt = self.get_prompt(configs["ACTION_SELECTION_EXAMPLE_PROMPT"], self.is_action_agent_visual) + self.app_selection_prompt = self.get_prompt(configs["APP_SELECTION_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) + self.action_selection_prompt = self.get_prompt(configs["ACTION_SELECTION_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) - self.app_selection_api_prompt = self.get_prompt(configs["API_PROMPT"], self.is_app_agent_visual) - self.action_selection_api_prompt = self.get_prompt(configs["API_PROMPT"], self.is_action_agent_visual) + self.app_selection_example_prompt = self.get_prompt(configs["APP_SELECTION_EXAMPLE_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) + self.action_selection_example_prompt = self.get_prompt(configs["ACTION_SELECTION_EXAMPLE_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) + + self.app_selection_api_prompt = self.get_prompt(configs["API_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) + self.action_selection_api_prompt = self.get_prompt(configs["API_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) self.status = "APP_SELECTION" @@ -99,15 +98,14 @@ def process_application_selection(self): app_selection_prompt_system_message = prompter.system_prompt_construction(self.app_selection_prompt, api_prompt, app_example_prompt) app_selection_prompt_user_message = prompter.user_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request) - if self.is_app_agent_visual: - app_selection_prompt_message = prompter.prompt_construction(app_selection_prompt_system_message, [desktop_screen_url], app_selection_prompt_user_message) - else: - app_selection_prompt_message = prompter.prompt_construction_non_visual(app_selection_prompt_system_message, app_selection_prompt_user_message) + + app_selection_prompt_message = prompter.prompt_construction(app_selection_prompt_system_message, [desktop_screen_url], app_selection_prompt_user_message, False, configs["APP_AGENT_VISUAL_MODE"]) + self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) try: - response, cost = llm_call.get_gptv_completion(app_selection_prompt_message, self.is_app_agent_visual) + response, cost = llm_call.get_gptv_completion(app_selection_prompt_message, configs["APP_AGENT_VISUAL_MODE"]) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) @@ -244,15 +242,14 @@ def process_action_selection(self): action_selection_prompt_system_message = prompter.system_prompt_construction(self.action_selection_prompt, api_prompt, action_example_prompt) action_selection_prompt_user_message = prompter.user_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request, self.rag_prompt()) - if self.is_action_agent_visual: - action_selection_prompt_message = prompter.prompt_construction(action_selection_prompt_system_message, image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"]) - else: - action_selection_prompt_message = prompter.prompt_construction_non_visual(action_selection_prompt_system_message, action_selection_prompt_user_message) + + action_selection_prompt_message = prompter.prompt_construction(action_selection_prompt_system_message, image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"], configs["ACTION_AGENT_VISUAL_MODE"]) + self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) try: - response, cost = llm_call.get_gptv_completion(action_selection_prompt_message, self.is_action_agent_visual) + response, cost = llm_call.get_gptv_completion(action_selection_prompt_message, configs["ACTION_AGENT_VISUAL_MODE"]) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": action_selection_prompt_message}) print_with_color("Error occurs when calling LLM: {e}".format(e=str(e)), "red") From 44ba15494634de50a632d0d5ad0415c77895d8d8 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 13 Mar 2024 22:03:01 +0800 Subject: [PATCH 161/223] readme --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 9a6ce71d..ff2d37e7 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,16 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th - 📅 2024-02-10: UFO is released on GitHub🎈. Happy Chinese New year🐉! +## Media Coverage 🌐 +UFO sightings have garnered attention from various media outlets, including: +- [Microsoft's UFO abducts traditional user interfaces for a smarter Windows experience](https://the-decoder.com/microsofts-ufo-abducts-traditional-user-interfaces-for-a-smarter-windows-experience/) +- [The AI PC - The Future of Computers? - Microsoft UFO](https://www.youtube.com/watch?v=1k4LcffCq3E) +- [下一代Windows系统曝光:基于GPT-4V,Agent跨应用调度,代号UFO](https://www.qbitai.com/2024/02/121048.html) +- [下一代智能版 Windows 要来了?微软推出首个 Windows Agent,命名为 UFO!](https://blog.csdn.net/csdnnews/article/details/136161570) +- [Microsoft発のオープンソース版「UFO」登場! Windowsを自動操縦するAIエージェントを試す](https://internet.watch.impress.co.jp/docs/column/shimizu/1570581.html) +- ... + +These sources provide insights into the evolving landscape of technology and the implications of UFO phenomena on various platforms. ## 💥 Highlights From 181919cb933fb21ff2d9716d5e405d58ce23c15c Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 13 Mar 2024 22:03:47 +0800 Subject: [PATCH 162/223] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ff2d37e7..fc2f7f9b 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th - 📅 2024-02-10: UFO is released on GitHub🎈. Happy Chinese New year🐉! -## Media Coverage 🌐 +## 🌐 Media Coverage UFO sightings have garnered attention from various media outlets, including: - [Microsoft's UFO abducts traditional user interfaces for a smarter Windows experience](https://the-decoder.com/microsofts-ufo-abducts-traditional-user-interfaces-for-a-smarter-windows-experience/) - [The AI PC - The Future of Computers? - Microsoft UFO](https://www.youtube.com/watch?v=1k4LcffCq3E) From 880bd6b3da844ba4ea03e72861478c4ba301fb95 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 13 Mar 2024 22:05:35 +0800 Subject: [PATCH 163/223] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fc2f7f9b..ee87ff9c 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ pip install -r requirements.txt ``` ### ⚙️ Step 2: Configure the LLMs -Before running UFO, you need to provide your LLM configurations. You can configure create a config file `ufo/config/config.yaml` by copying the `ufo/config/config.yaml.template` edited as follows. +Before running UFO, you need to provide your LLM configurations. You can create a config file `ufo/config/config.yaml`, by copying the `ufo/config/config.yaml.template` edited as follows: #### OpenAI ``` From 8b0a05d4977e2a4b8534347f441a75a9d885fc88 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Thu, 14 Mar 2024 10:20:37 +0800 Subject: [PATCH 164/223] readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ee87ff9c..4c77ea99 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th ## 🌐 Media Coverage + UFO sightings have garnered attention from various media outlets, including: - [Microsoft's UFO abducts traditional user interfaces for a smarter Windows experience](https://the-decoder.com/microsofts-ufo-abducts-traditional-user-interfaces-for-a-smarter-windows-experience/) - [The AI PC - The Future of Computers? - Microsoft UFO](https://www.youtube.com/watch?v=1k4LcffCq3E) From 263b23e726e2b0d21a1801aa56cb4d2252e45c03 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Thu, 14 Mar 2024 12:38:42 +0800 Subject: [PATCH 165/223] merge new --- ufo/llm/llm_call.py | 2 +- ufo/llm/prompt.py | 149 +------------------------------------------- ufo/module/flow.py | 38 ----------- 3 files changed, 2 insertions(+), 187 deletions(-) diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index a60b007c..c65483ac 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -106,4 +106,4 @@ def get_gptv_completion(messages, is_visual=True): except: pass time.sleep(5) - continue + continue \ No newline at end of file diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py index 4c5a5801..9215b74e 100644 --- a/ufo/llm/prompt.py +++ b/ufo/llm/prompt.py @@ -164,151 +164,4 @@ def load_prompt(template_path, is_visual): return prompt - -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -from typing import List -import json - -def prompt_construction(system_prompt: str, image_list: List, user_prompt: str, include_last_screenshot=False): - """ - Construct the prompt for GPT-4 Visual. - :param system_prompt: The system prompt. - :param image_list: The list of images. - :param user_prompt: The user prompt. - :param include_last_screenshot: Whether to include the last screenshot. - return: The prompt for GPT-4 Visual. - """ - prompt_message = [] - if len(system_prompt) > 0: - system_message = { - "role": "system", - "content": system_prompt - } - prompt_message.append(system_message) - - screenshot_text = [] - if include_last_screenshot: - screenshot_text += ["Screenshot for the last step:"] - - screenshot_text += ["Current Screenshots:", "Annotated Screenshot:"] - - user_content = [] - - for i, image in enumerate(image_list): - user_content.append({ - "type": "text", - "text": screenshot_text[i] - }) - user_content.append({ - "type": "image_url", - "image_url": { - "url": image - } - }) - - user_content.append({ - "type": "text", - "text": user_prompt - }) - - user_message = {"role": "user", "content": user_content} - prompt_message.append(user_message) - - return prompt_message - - -def system_prompt_construction(prompt_template: str, apis: str, examples: str) -> str: - """ - Construct the prompt for app selection. - :param prompt_template: The template of the prompt. - :param examples: The examples. - return: The prompt for app selection. - """ - - return prompt_template["system"].format(apis=apis, examples=examples) - - -def user_prompt_construction(prompt_template: str, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str, retrieved_docs: str=""): - """ - Construct the prompt for action selection. - :param prompt_template: The template of the prompt. - :param action_history: The action history. - :param control_item: The control item. - :param user_request: The user request. - :param retrieved_docs: The retrieved documents. - return: The prompt for action selection. - """ - prompt = prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), - control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request, retrieved_docs=retrieved_docs) - - return prompt - - - -def retrived_documents_prompt_helper(header: str, separator: str, documents: list): - """ - Construct the prompt for retrieved documents. - :param header: The header of the prompt. - :param separator: The separator of the prompt. - :param documents: The retrieved documents. - return: The prompt for retrieved documents. - """ - - if header: - prompt = "\n<{header}:>\n".format(header=header) - else: - prompt = "" - for i, document in enumerate(documents): - if separator: - prompt += "[{separator} {i}:]".format(separator=separator, i=i+1) - prompt += "\n" - prompt += document - prompt += "\n\n" - return prompt - - - -def api_prompt_helper(apis: dict, verbose: int = 1) -> List[str]: - """ - Construct the prompt for APIs. - :param apis: The APIs. - :param verbose: The verbosity level. - return: The prompt for APIs. - """ - - # Construct the prompt for APIs - api_list = ["- The action type are limited to {actions}.".format(actions=list(apis.keys()))] - - # Construct the prompt for each API - for key in apis.keys(): - api = apis[key] - if verbose > 0: - api_text = "{summary}\n{usage}".format(summary=api["summary"], usage=api["usage"]) - else: - api_text = api["summary"] - - api_list.append(api_text) - - return api_list - - -def examples_prompt_helper(examples: dict, header: str = "## Response Examples", separator: str = "Example"): - """ - Construct the prompt for examples. - :param examples: The examples. - :param header: The header of the prompt. - :param separator: The separator of the prompt. - return: The prompt for examples. - """ - - example_list = [] - - for key in examples.keys(): - if key.startswith("example"): - example_list.append(examples[key]) - - return retrived_documents_prompt_helper(header, separator, example_list) - - + \ No newline at end of file diff --git a/ufo/module/flow.py b/ufo/module/flow.py index fb31ce80..29a43e75 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -45,15 +45,6 @@ def __init__(self, task): create_folder(self.log_path) self.logger = initialize_logger(self.log_path, "response.log") self.request_logger = initialize_logger(self.log_path, "request.log") -<<<<<<< HEAD - self.app_selection_prompt = yaml.safe_load(open(configs["APP_SELECTION_PROMPT"], "r", encoding="utf-8")) - self.action_selection_prompt = yaml.safe_load(open(configs["ACTION_SELECTION_PROMPT"], "r", encoding="utf-8")) - - self.app_selection_example_prompt = yaml.safe_load(open(configs["APP_SELECTION_EXAMPLE_PROMPT"], "r", encoding="utf-8")) - self.action_selection_example_prompt = yaml.safe_load(open(configs["ACTION_SELECTION_EXAMPLE_PROMPT"], "r", encoding="utf-8")) - - self.api_prompt = yaml.safe_load(open(configs["API_PROMPT"], "r", encoding="utf-8")) -======= self.app_selection_prompt = self.get_prompt(configs["APP_SELECTION_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) self.action_selection_prompt = self.get_prompt(configs["ACTION_SELECTION_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) @@ -64,7 +55,6 @@ def __init__(self, task): self.app_selection_api_prompt = self.get_prompt(configs["API_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) self.action_selection_api_prompt = self.get_prompt(configs["API_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) ->>>>>>> chaoyun/dev self.status = "APP_SELECTION" self.application = "" @@ -104,18 +94,6 @@ def process_application_selection(self): desktop_windows_dict, desktop_windows_info = control.get_desktop_app_info_dict() app_example_prompt = prompter.examples_prompt_helper(self.app_selection_example_prompt) -<<<<<<< HEAD - api_prompt = prompter.api_prompt_helper(self.api_prompt, verbose=0) - - app_selection_prompt_system_message = prompter.system_prompt_construction(self.app_selection_prompt, api_prompt, app_example_prompt) - app_selection_prompt_user_message = prompter.user_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request) - app_selection_prompt_message = prompter.prompt_construction(app_selection_prompt_system_message, [desktop_screen_url], app_selection_prompt_user_message) - - self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) - - try: - response, cost = llm_call.get_gptv_completion(app_selection_prompt_message) -======= api_prompt = prompter.api_prompt_helper(self.app_selection_api_prompt, verbose=0) app_selection_prompt_system_message = prompter.system_prompt_construction(self.app_selection_prompt, api_prompt, app_example_prompt) @@ -128,7 +106,6 @@ def process_application_selection(self): try: response, cost = llm_call.get_gptv_completion(app_selection_prompt_message, configs["APP_AGENT_VISUAL_MODE"]) ->>>>>>> chaoyun/dev except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) @@ -261,13 +238,6 @@ def process_action_selection(self): image_url += [screenshot_url, screenshot_annotated_url] action_example_prompt = prompter.examples_prompt_helper(self.action_selection_example_prompt) -<<<<<<< HEAD - api_prompt = prompter.api_prompt_helper(self.api_prompt, verbose=1) - - action_selection_prompt_system_message = prompter.system_prompt_construction(self.action_selection_prompt, api_prompt, action_example_prompt) - action_selection_prompt_user_message = prompter.user_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request, self.rag_prompt()) - action_selection_prompt_message = prompter.prompt_construction(action_selection_prompt_system_message, image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"]) -======= api_prompt = prompter.api_prompt_helper(self.action_selection_api_prompt, verbose=1) action_selection_prompt_system_message = prompter.system_prompt_construction(self.action_selection_prompt, api_prompt, action_example_prompt) @@ -275,16 +245,11 @@ def process_action_selection(self): action_selection_prompt_message = prompter.prompt_construction(action_selection_prompt_system_message, image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"], configs["ACTION_AGENT_VISUAL_MODE"]) ->>>>>>> chaoyun/dev self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) try: -<<<<<<< HEAD - response, cost = llm_call.get_gptv_completion(action_selection_prompt_message) -======= response, cost = llm_call.get_gptv_completion(action_selection_prompt_message, configs["ACTION_AGENT_VISUAL_MODE"]) ->>>>>>> chaoyun/dev except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": action_selection_prompt_message}) print_with_color("Error occurs when calling LLM: {e}".format(e=str(e)), "red") @@ -382,8 +347,6 @@ def process_action_selection(self): return -<<<<<<< HEAD -======= def get_prompt(self, path_template, is_visual): """ Get the prompt. @@ -395,7 +358,6 @@ def get_prompt(self, path_template, is_visual): prompt = yaml.safe_load(open(path, "r", encoding="utf-8")) return prompt ->>>>>>> chaoyun/dev def rag_prompt(self): """ From 3ce75394f363198cf2e2c08f38d563d1e62fc9ec Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Thu, 14 Mar 2024 12:39:30 +0800 Subject: [PATCH 166/223] merge new --- ufo/config/config.yaml.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index 0afbed9e..5ec01c98 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -67,4 +67,4 @@ RAG_OFFLINE_DOCS_RETRIEVED_TOPK: 1 # The topk for the offline retrieved documen ## RAG Configuration for the Bing search RAG_ONLINE_SEARCH: False # Whether to use the online search for the RAG. RAG_ONLINE_SEARCH_TOPK: 5 # The topk for the online search -RAG_ONLINE_RETRIEVED_TOPK: 1 # The topk for the online retrieved documents +RAG_ONLINE_RETRIEVED_TOPK: 1 # The topk for the online retrieved documents \ No newline at end of file From ea6e49087ac7916458f4713c904ca198e903a804 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Thu, 14 Mar 2024 12:40:45 +0800 Subject: [PATCH 167/223] merge new --- ufo/llm/{prompt.py => prompter.py} | 0 ufo/module/flow.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename ufo/llm/{prompt.py => prompter.py} (100%) diff --git a/ufo/llm/prompt.py b/ufo/llm/prompter.py similarity index 100% rename from ufo/llm/prompt.py rename to ufo/llm/prompter.py diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 29a43e75..cdf7678c 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -13,7 +13,7 @@ from ..rag import retriever_factory from ..config.config import load_config from ..llm import llm_call -from ..llm import prompt as prompter +from ..llm import prompter from ..ui_control import control from ..ui_control import screenshot as screen from ..utils import (create_folder, encode_image_from_path, From daaac52d57d48f7ebf81a17509dc0e39f1fe6004 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Thu, 14 Mar 2024 12:52:18 +0800 Subject: [PATCH 168/223] merge new --- ufo/config/config.yaml.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index 5ec01c98..a8fa6c2f 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -38,7 +38,7 @@ INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the o REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model APP_SELECTION_PROMPT: "ufo/prompts/base/{mode}/app_selection.yaml" # The prompt for the app selection -ACTION_SELECTION_PROMPT: "ufo/prompts/base/{mode}/action_selection_rag.yaml" # The prompt for the action selection +ACTION_SELECTION_PROMPT: "ufo/prompts/base/{mode}/action_selection.yaml" # The prompt for the action selection APP_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/{mode}/app_example.yaml" # The prompt for the app selection ACTION_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/{mode}/action_example.yaml" # The prompt for the action selection From 589d3a624f45cf6d3e998e174647fcf6ada51a6c Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Thu, 14 Mar 2024 13:00:10 +0800 Subject: [PATCH 169/223] merge new --- ufo/llm/prompter.py | 4 ++-- ufo/module/flow.py | 23 ++++++----------------- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/ufo/llm/prompter.py b/ufo/llm/prompter.py index 9215b74e..ce834669 100644 --- a/ufo/llm/prompter.py +++ b/ufo/llm/prompter.py @@ -152,12 +152,12 @@ def examples_prompt_helper(examples: dict, header: str = "## Response Examples", -def load_prompt(template_path, is_visual): +def load_prompt(template_path: str, is_visual: bool) -> str: """ Get the prompt. path_template: The template of the prompt path. is_visual: Whether to use the visual prompt. - return: The prompt. + return: The loaded prompt string. """ path = template_path.format(mode = "visual" if is_visual else "nonvisual") prompt = yaml.safe_load(open(path, "r", encoding="utf-8")) diff --git a/ufo/module/flow.py b/ufo/module/flow.py index cdf7678c..35f6918a 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -46,14 +46,14 @@ def __init__(self, task): self.logger = initialize_logger(self.log_path, "response.log") self.request_logger = initialize_logger(self.log_path, "request.log") - self.app_selection_prompt = self.get_prompt(configs["APP_SELECTION_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) - self.action_selection_prompt = self.get_prompt(configs["ACTION_SELECTION_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) + self.app_selection_prompt = prompter.load_prompt(configs["APP_SELECTION_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) + self.action_selection_prompt = prompter.load_prompt(configs["ACTION_SELECTION_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) - self.app_selection_example_prompt = self.get_prompt(configs["APP_SELECTION_EXAMPLE_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) - self.action_selection_example_prompt = self.get_prompt(configs["ACTION_SELECTION_EXAMPLE_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) + self.app_selection_example_prompt = prompter.load_prompt(configs["APP_SELECTION_EXAMPLE_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) + self.action_selection_example_prompt = prompter.load_prompt(configs["ACTION_SELECTION_EXAMPLE_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) - self.app_selection_api_prompt = self.get_prompt(configs["API_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) - self.action_selection_api_prompt = self.get_prompt(configs["API_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) + self.app_selection_api_prompt = prompter.load_prompt(configs["API_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) + self.action_selection_api_prompt = prompter.load_prompt(configs["API_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) self.status = "APP_SELECTION" @@ -347,17 +347,6 @@ def process_action_selection(self): return - def get_prompt(self, path_template, is_visual): - """ - Get the prompt. - path_template: The template of the prompt path. - is_visual: Whether to use the visual prompt. - return: The prompt. - """ - path = path_template.format(mode = "visual" if is_visual else "nonvisual") - prompt = yaml.safe_load(open(path, "r", encoding="utf-8")) - - return prompt def rag_prompt(self): """ From a1b907d01fbea630e8d5a5619d30d01c40f5f75a Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Thu, 14 Mar 2024 13:03:45 +0800 Subject: [PATCH 170/223] merge new --- ufo/llm/prompter.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ufo/llm/prompter.py b/ufo/llm/prompter.py index ce834669..2913e7f0 100644 --- a/ufo/llm/prompter.py +++ b/ufo/llm/prompter.py @@ -5,7 +5,7 @@ import json import yaml -def prompt_construction(system_prompt: str, image_list: List, user_prompt: str, include_last_screenshot=False, is_visual=True): +def prompt_construction(system_prompt: str, image_list: List, user_prompt: str, include_last_screenshot=False, is_visual=True) -> list[dict]: """ Construct the prompt for GPT-4 Visual. :param system_prompt: The system prompt. @@ -69,7 +69,7 @@ def system_prompt_construction(prompt_template: str, apis: str, examples: str) - return prompt_template["system"].format(apis=apis, examples=examples) -def user_prompt_construction(prompt_template: str, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str, retrieved_docs: str=""): +def user_prompt_construction(prompt_template: str, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str, retrieved_docs: str="") -> str: """ Construct the prompt for action selection. :param prompt_template: The template of the prompt. @@ -86,7 +86,7 @@ def user_prompt_construction(prompt_template: str, request_history: list, action -def retrived_documents_prompt_helper(header: str, separator: str, documents: list): +def retrived_documents_prompt_helper(header: str, separator: str, documents: list) -> str: """ Construct the prompt for retrieved documents. :param header: The header of the prompt. @@ -133,7 +133,7 @@ def api_prompt_helper(apis: dict, verbose: int = 1) -> List[str]: return api_list -def examples_prompt_helper(examples: dict, header: str = "## Response Examples", separator: str = "Example"): +def examples_prompt_helper(examples: dict, header: str = "## Response Examples", separator: str = "Example") -> list[str]: """ Construct the prompt for examples. :param examples: The examples. From 027fe787a78e39aea90f87ab8c57a3a840437b93 Mon Sep 17 00:00:00 2001 From: Mac0q Date: Thu, 14 Mar 2024 16:56:21 +0800 Subject: [PATCH 171/223] OpenAI API --- .gitignore | 1 + ufo/config/config.py | 41 +++++++-- ufo/config/config.yaml.template | 25 +----- ufo/config/config_llm.yaml.template | 26 ++++++ ufo/llm/llm_call.py | 105 +--------------------- ufo/llm/{azure_ad.py => openai.py} | 135 +++++++++++++++++++--------- ufo/module/flow.py | 6 +- 7 files changed, 167 insertions(+), 172 deletions(-) create mode 100644 ufo/config/config_llm.yaml.template rename ufo/llm/{azure_ad.py => openai.py} (59%) diff --git a/.gitignore b/.gitignore index 265bee10..ff51f6e0 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ __pycache__/ # Ignore the config file ufo/config/config.yaml +ufo/config/config_llm.yaml # Ignore the helper files diff --git a/ufo/config/config.py b/ufo/config/config.py index e0e8f69c..095adaa0 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -16,6 +16,29 @@ def load_config(config_path="ufo/config/config.yaml"): # Copy environment variables to avoid modifying them directly configs = dict(os.environ) + try: + with open(config_path, "r") as file: + yaml_data = yaml.safe_load(file) + # Update configs with YAML data + if yaml_data: + configs.update(yaml_data) + except FileNotFoundError: + print_with_color( + f"Warning: Config file not found at {config_path}. Using only environment variables.", "yellow") + + + return configs + +def load_llm_config(config_path="ufo/config/config_llm.yaml"): + """ + Load the configuration from a YAML file and environment variables. + + :param config_path: The path to the YAML config file. Defaults to "./config.yaml". + :return: Merged configuration from environment variables and YAML file. + """ + # Copy environment variables to avoid modifying them directly + configs = dict(os.environ) + try: with open(config_path, "r") as file: yaml_data = yaml.safe_load(file) @@ -27,18 +50,24 @@ def load_config(config_path="ufo/config/config.yaml"): f"Warning: Config file not found at {config_path}. Using only environment variables.", "yellow") # Update the API base URL for AOAI - if configs["API_TYPE"].lower() == "aoai": - configs["OPENAI_API_BASE"] = "{endpoint}/openai/deployments/{deployment_name}/chat/completions?api-version={api_version}".format( - endpoint=configs["OPENAI_API_BASE"][:-1] if configs["OPENAI_API_BASE"].endswith( - "/") else configs["OPENAI_API_BASE"], - deployment_name=configs["AOAI_DEPLOYMENT"], + if configs["API_TYPE"].lower() == "aoai" and 'deployments' not in configs["API_BASE"]: + configs["API_BASE"] = "{endpoint}/openai/deployments/{deployment_name}/chat/completions?api-version={api_version}".format( + endpoint=configs["API_BASE"][:-1] if configs["API_BASE"].endswith( + "/") else configs["API_BASE"], + deployment_name=configs["API_MODEL"], api_version=configs["API_VERSION"] ) + if configs["API_TYPE_NON_VISUAL"].lower() == "aoai" and 'deployments' not in configs["API_BASE_NON_VISUAL"]: + configs["API_BASE_NON_VISUAL"] = "{endpoint}/openai/deployments/{deployment_name}/chat/completions?api-version={api_version}".format( + endpoint=configs["API_BASE_NON_VISUAL"][:-1] if configs["API_BASE_NON_VISUAL"].endswith( + "/") else configs["API_BASE_NON_VISUAL"], + deployment_name=configs["API_MODEL_NON_VISUAL"], + api_version=configs["API_VERSION_NON_VISUAL"] + ) return configs - def get_offline_learner_indexer_config(): """ Get the list of offline indexers obtained from the learner. diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index a8fa6c2f..c581a7f3 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -1,20 +1,14 @@ version: 0.1 -API_TYPE: "openai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, "azure_ad" for aoai aad. -OPENAI_API_BASE: "YOUR_ENDPOINT" # for the OpenAI API. -OPENAI_API_KEY: "YOUR_API_KEY" # The OpenAI API key -AOAI_DEPLOYMENT: "YOUR_AOAI_DEPLOYMENT" # Your AOAI deployment if apply -API_VERSION: "2024-02-15-preview" # "2024-02-15-preview" by default. -OPENAI_API_MODEL: "gpt-4-vision-preview" # The only OpenAI model by now that accepts visual input +## For Non-visual model +APP_AGENT_VISUAL_MODE: True # Whether to use the visual mode for the app agent +ACTION_AGENT_VISUAL_MODE: True # Whether to use the visual mode for the action agent + BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key CONTROL_BACKEND: "uia" # The backend for control action -MAX_TOKENS: 2000 # The max token limit for the response completion -MAX_RETRY: 3 # The max retry limit for the response completion MAX_STEP: 30 # The max step limit for completing the user request SLEEP_TIME: 5 # The sleep time between each step to wait for the window to be ready -TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model -TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model SAFE_GUARD: True # Whether to use the safe guard to prevent the model from doing sensitve operations. CONTROL_TYPE_LIST: ["Button", "Edit", "TabItem", "Document", "ListItem", "MenuItem", "ScrollBar", "TreeItem", "Hyperlink", "ComboBox", "RadioButton"] # The list of control types that are allowed to be selected HISTORY_KEYS: ["Step", "Thought", "ControlText", "Action", "Comment", "Results"] # The keys of the action history for the next step. @@ -47,17 +41,6 @@ API_PROMPT: "ufo/prompts/base/{mode}/api.yaml" # The prompt for the API INPUT_TEXT_API: "type_keys" # The input text API INPUT_TEXT_ENTER: True # whether to press enter after typing the text -### For AAD -AAD_TENANT_ID: "YOUR_TENANT_ID" # Set the value to your tenant id for the llm model -AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model -AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE - -### For Non-visual model -APP_AGENT_VISUAL_MODE: True # Whether to use the visual mode for the app agent -ACTION_AGENT_VISUAL_MODE: True # Whether to use the visual mode for the action agent -OPENAI_API_BASE_NON_VISUAL: "YOUR_NON_VISUAL_ENDPOINT" # The OpenAI endpoint for non-visual model -OPENAI_API_KEY_NON_VISUAL: "YOUR_API_KEY" # The OpenAI API key for non-visual model -OPENAI_API_MODEL_NON_VISUAL: "gpt-4-1106-preview" # The non-visual OpenAI model ## RAG Configuration for the offline docs RAG_OFFLINE_DOCS: False # Whether to use the offline RAG. diff --git a/ufo/config/config_llm.yaml.template b/ufo/config/config_llm.yaml.template new file mode 100644 index 00000000..b8dc38c9 --- /dev/null +++ b/ufo/config/config_llm.yaml.template @@ -0,0 +1,26 @@ +API_TYPE: "azure_ad" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. +API_BASE: "YOUR_ENDPOINT" # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. +API_KEY: "YOUR_KEY" # The OpenAI API key +API_VERSION: "2024-02-15-preview" # "2024-02-15-preview" by default +API_MODEL: "gpt-4-visual-preview" # The only OpenAI model by now that accepts visual input +### For Non-visual model +API_TYPE_NON_VISUAL: "aoai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. +API_BASE_NON_VISUAL: "YOUR_ENDPOINT" # The OpenAI endpoint for non-visual model +API_KEY_NON_VISUAL: "YOUR_KEY" # The OpenAI API key for non-visual model +API_MODEL_NON_VISUAL: "gpt-4-visual-preview" # The non-visual OpenAI model +API_VERSION_NON_VISUAL: "2024-02-15-preview" # "2024-02-15-preview" by default. + + +### For parameters +MAX_TOKENS: 2000 # The max token limit for the response completion +MAX_RETRY: 3 # The max retry limit for the response completion +TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model +TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model + +### For AAD +AAD_TENANT_ID: "YOUR_TENANT_ID" # Set the value to your tenant id for the llm model +AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model +AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE + + + diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index c65483ac..867206b4 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -1,109 +1,12 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. -import requests -import time -from ..config.config import load_config -from ..utils import print_with_color -from .azure_ad import get_chat_completion -import json +from ..config.config import load_llm_config -configs = load_config() - - -def get_request_header(is_visual=True): - """ - Get the header for the request. - is_visual: Whether the request is for visual model. - return: The header for the request. - """ - if configs["API_TYPE"].lower() == "aoai": - headers = { - "Content-Type": "application/json", - "api-key": configs["OPENAI_API_KEY" if is_visual else "OPENAI_API_KEY_NON_VISUAL"], - } - elif configs["API_TYPE"].lower() == "openai": - headers = { - "Content-Type": "application/json", - "Authorization": "Bearer {key}".format(key=configs["OPENAI_API_KEY" "OPENAI_API_KEY" if is_visual else "OPENAI_API_KEY_NON_VISUAL"]), - } - elif configs["API_TYPE"].lower() == "azure_ad": - headers = {} - else: - raise ValueError("API_TYPE should be either 'openai' or 'aoai' or 'azure_ad'.") - - return headers +configs = load_llm_config() def get_gptv_completion(messages, is_visual=True): - """ - Get GPT-V completion from messages. - is_visual: Whether the request is for visual model. - messages: The messages to be sent to GPT-V. - endpoint: The endpoint of the request. - max_tokens: The maximum number of tokens to generate. - temperature: The sampling temperature. - model: The model to use. - max_retry: The maximum number of retries. - return: The response of the request. - """ - is_aad = configs['API_TYPE'].lower() == 'azure_ad' - headers = get_request_header() - - model_name = configs["OPENAI_API_MODEL" if is_visual else "OPENAI_API_MODEL_NON_VISUAL"] - api_base = configs["OPENAI_API_BASE" if is_visual else "OPENAI_API_BASE_NON_VISUAL"] - - if not is_aad: - payload = { - "messages": messages, - "temperature": configs["TEMPERATURE"], - "max_tokens": configs["MAX_TOKENS"], - "top_p": configs["TOP_P"], - "model": model_name - } - - for _ in range(configs["MAX_RETRY"]): - try: - if not is_aad : - response = requests.post(api_base, headers=headers, json=payload) - - response_json = response.json() - response.raise_for_status() # Will raise an HTTPError if the HTTP request returned an unsuccessful status code - - - if "choices" not in response_json: - print_with_color(f"GPT Error: No Reply", "red") - continue - - if "error" not in response_json: - usage = response_json.get("usage", {}) - prompt_tokens = usage.get("prompt_tokens", 0) - completion_tokens = usage.get("completion_tokens", 0) - else: - response = get_chat_completion( - engine=model_name, - messages = messages, - max_tokens = configs["MAX_TOKENS"], - temperature = configs["TEMPERATURE"], - top_p = configs["TOP_P"], - ) - response_json = json.loads(response.model_dump_json()) - - - if "error" not in response_json: - usage = response.usage - prompt_tokens = usage.prompt_tokens - completion_tokens = usage.completion_tokens - - cost = prompt_tokens / 1000 * 0.01 + completion_tokens / 1000 * 0.03 - - return response_json, cost - except Exception as e: - print_with_color(f"Error making API request: {e}", "red") - try: - print_with_color(response_json, "red") - except: - pass - time.sleep(5) - continue \ No newline at end of file + from .openai import OpenAIService + return OpenAIService(configs, is_visual).chat_completion(messages) diff --git a/ufo/llm/azure_ad.py b/ufo/llm/openai.py similarity index 59% rename from ufo/llm/azure_ad.py rename to ufo/llm/openai.py index 0de09d56..7222c291 100644 --- a/ufo/llm/azure_ad.py +++ b/ufo/llm/openai.py @@ -1,10 +1,13 @@ - import datetime -from typing import Literal, Optional -from ..config.config import load_config +from typing import Any, Literal, Optional +import openai +from openai import AzureOpenAI, OpenAI + +from ..config.config import load_llm_config -configs = load_config() -available_models = Literal[ +configs = load_llm_config() + +available_models = Literal[ #for azure_ad "gpt-35-turbo-20220309", "gpt-35-turbo-16k-20230613", "gpt-35-turbo-20230613", @@ -20,6 +23,92 @@ "gpt-4-visual-preview", ] + +class OpenAIService: + def __init__(self, config, is_visual: bool = True): + self.config = config + self.is_visual = is_visual + api_type = self.config["API_TYPE"].lower() if self.is_visual else self.config["API_TYPE_NON_VISUAL"].lower() + max_retry = self.config["MAX_RETRY"] + assert api_type in ["openai", "aoai", "azure_ad"], "Invalid API type" + self.client: OpenAI = ( + OpenAI( + base_url=self.config["API_BASE" if self.is_visual else "API_BASE_NON_VISUAL"], + api_key=self.config["API_KEY" if self.is_visual else "API_KEY_NON_VISUAL"], + max_retries=max_retry, + ) + if api_type == "openai" + else AzureOpenAI( + max_retries=max_retry, + api_version=self.config["API_VERSION" if self.is_visual else "API_VERSION_NON_VISUAL"], + azure_endpoint=self.config["API_BASE" if self.is_visual else "API_BASE_NON_VISUAL"], + api_key=(self.config["API_KEY" if self.is_visual else "API_KEY_NON_VISUAL"] if api_type == 'aoai' else get_openai_token()), + ) + ) + if (configs["API_TYPE"].lower() == "azure_ad" and self.is_visual) or (configs["API_TYPE_NON_VISUAL"].lower() == "azure_ad" and not self.is_visual): + auto_refresh_token() + + def chat_completion( + self, + messages, + stream: bool = False, + temperature: Optional[float] = None, + max_tokens: Optional[int] = None, + top_p: Optional[float] = None, + **kwargs: Any, + ): + model = self.config["API_MODEL" if self.is_visual else "API_MODEL_NON_VISUAL"] + + temperature = temperature if temperature is not None else self.config["TEMPERATURE"] + max_tokens = max_tokens if max_tokens is not None else self.config["MAX_TOKENS"] + top_p = top_p if top_p is not None else self.config["TOP_P"] + + try: + response: Any = self.client.chat.completions.create( + model=model, + messages=messages, # type: ignore + temperature=temperature, + max_tokens=max_tokens, + top_p=top_p, + stream=stream, + **kwargs + ) + + usage = response.usage + prompt_tokens = usage.prompt_tokens + completion_tokens = usage.completion_tokens + + cost = prompt_tokens / 1000 * 0.01 + completion_tokens / 1000 * 0.03 + + return response.choices[0].message.content, cost + + except openai.APITimeoutError as e: + # Handle timeout error, e.g. retry or log + raise Exception(f"OpenAI API request timed out: {e}") + except openai.APIConnectionError as e: + # Handle connection error, e.g. check network or log + raise Exception(f"OpenAI API request failed to connect: {e}") + except openai.BadRequestError as e: + # Handle invalid request error, e.g. validate parameters or log + raise Exception(f"OpenAI API request was invalid: {e}") + except openai.AuthenticationError as e: + # Handle authentication error, e.g. check credentials or log + raise Exception(f"OpenAI API request was not authorized: {e}") + except openai.PermissionDeniedError as e: + # Handle permission error, e.g. check scope or log + raise Exception(f"OpenAI API request was not permitted: {e}") + except openai.RateLimitError as e: + # Handle rate limit error, e.g. wait or log + raise Exception(f"OpenAI API request exceeded rate limit: {e}") + except openai.APIError as e: + # Handle API error, e.g. retry or log + raise Exception(f"OpenAI API returned an API Error: {e}") + + + + + + def get_openai_token( token_cache_file: str = 'apim-token-cache.bin', client_id: Optional[str] = None, @@ -126,7 +215,6 @@ def save_cache(): "Authentication failed for acquiring AAD token for your organization") - def auto_refresh_token( token_cache_file: str = 'apim-token-cache.bin', interval: datetime.timedelta = datetime.timedelta(minutes=15), @@ -158,7 +246,7 @@ def update_token(): import openai openai.api_type = "azure" if configs["API_TYPE"] == "azure_ad" else configs["API_TYPE"] - openai.base_url = configs["OPENAI_API_BASE"] + openai.base_url = configs["API_BASE"] openai.api_version = configs["API_VERSION"] openai.api_key = get_openai_token( token_cache_file=token_cache_file, @@ -192,36 +280,3 @@ def stop(): return stop -def get_chat_completion( - model: available_models = None, - client_id: Optional[str] = None, - client_secret: Optional[str] = None, - *args, - **kwargs -): - """ - helper function for getting chat completion from your organization - """ - import openai - - model_name: str = \ - model if model is not None else \ - kwargs.get("engine") if kwargs.get("engine") is not None else \ - None - - if "engine" in kwargs: - del kwargs["engine"] - - client = openai.AzureOpenAI( - api_version=configs["API_VERSION"], - azure_endpoint=configs["OPENAI_API_BASE"], - azure_ad_token=get_openai_token(client_id=client_id, client_secret=client_secret), - ) - - response = client.chat.completions.create( - model=model_name, - *args, - **kwargs - ) - - return response diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 35f6918a..59c49d4c 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -105,7 +105,7 @@ def process_application_selection(self): self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) try: - response, cost = llm_call.get_gptv_completion(app_selection_prompt_message, configs["APP_AGENT_VISUAL_MODE"]) + response_string, cost = llm_call.get_gptv_completion(app_selection_prompt_message, configs["APP_AGENT_VISUAL_MODE"]) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) @@ -118,7 +118,6 @@ def process_application_selection(self): self.cost += cost try: - response_string = response["choices"][0]["message"]["content"] response_json = json_parser(response_string) application_label = response_json["ControlLabel"] @@ -249,7 +248,7 @@ def process_action_selection(self): self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) try: - response, cost = llm_call.get_gptv_completion(action_selection_prompt_message, configs["ACTION_AGENT_VISUAL_MODE"]) + response_string, cost = llm_call.get_gptv_completion(action_selection_prompt_message, configs["ACTION_AGENT_VISUAL_MODE"]) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": action_selection_prompt_message}) print_with_color("Error occurs when calling LLM: {e}".format(e=str(e)), "red") @@ -261,7 +260,6 @@ def process_action_selection(self): self.cost += cost try: - response_string = response["choices"][0]["message"]["content"] response_json = json_parser(response_string) observation = response_json["Observation"] From 5b11c2fd1d8e1fc4d6c145c6e4f787352d56ead6 Mon Sep 17 00:00:00 2001 From: Mac0q Date: Thu, 14 Mar 2024 23:12:59 +0800 Subject: [PATCH 172/223] model list --- ufo/config/config.py | 38 +-- ufo/config/config_llm.yaml.template | 26 ++- ufo/llm/llm_call.py | 2 +- ufo/llm/openai.py | 344 ++++++++++++++-------------- 4 files changed, 211 insertions(+), 199 deletions(-) diff --git a/ufo/config/config.py b/ufo/config/config.py index 095adaa0..58620471 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -49,24 +49,32 @@ def load_llm_config(config_path="ufo/config/config_llm.yaml"): print_with_color( f"Warning: Config file not found at {config_path}. Using only environment variables.", "yellow") - # Update the API base URL for AOAI - if configs["API_TYPE"].lower() == "aoai" and 'deployments' not in configs["API_BASE"]: - configs["API_BASE"] = "{endpoint}/openai/deployments/{deployment_name}/chat/completions?api-version={api_version}".format( - endpoint=configs["API_BASE"][:-1] if configs["API_BASE"].endswith( - "/") else configs["API_BASE"], - deployment_name=configs["API_MODEL"], - api_version=configs["API_VERSION"] - ) - if configs["API_TYPE_NON_VISUAL"].lower() == "aoai" and 'deployments' not in configs["API_BASE_NON_VISUAL"]: - configs["API_BASE_NON_VISUAL"] = "{endpoint}/openai/deployments/{deployment_name}/chat/completions?api-version={api_version}".format( - endpoint=configs["API_BASE_NON_VISUAL"][:-1] if configs["API_BASE_NON_VISUAL"].endswith( - "/") else configs["API_BASE_NON_VISUAL"], - deployment_name=configs["API_MODEL_NON_VISUAL"], - api_version=configs["API_VERSION_NON_VISUAL"] + + return optimize_configs(configs) + + +def parse_aoai_base(config): + if 'deployments' not in config["API_BASE"]: + config["API_BASE"] = "{endpoint}/openai/deployments/{deployment_name}/chat/completions?api-version={api_version}".format( + endpoint=config["API_BASE"][:-1] if config["API_BASE"].endswith( + "/") else config["API_BASE"], + deployment_name=config["API_MODEL"], + api_version=config["API_VERSION"] ) + return config["API_BASE"] - return configs +def update_api_base(configs, key): + if not isinstance(configs[key], list): + configs[key] = [configs[key]] + for config in configs[key][1:]: + if config["API_TYPE"].lower() == "aoai": + config["API_BASE"] = parse_aoai_base(config) +def optimize_configs(configs): + update_api_base(configs, 'VISUAL') + update_api_base(configs, 'NON_VISUAL') + + return configs def get_offline_learner_indexer_config(): """ diff --git a/ufo/config/config_llm.yaml.template b/ufo/config/config_llm.yaml.template index b8dc38c9..eae6a0e8 100644 --- a/ufo/config/config_llm.yaml.template +++ b/ufo/config/config_llm.yaml.template @@ -1,16 +1,18 @@ -API_TYPE: "azure_ad" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. -API_BASE: "YOUR_ENDPOINT" # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. -API_KEY: "YOUR_KEY" # The OpenAI API key -API_VERSION: "2024-02-15-preview" # "2024-02-15-preview" by default -API_MODEL: "gpt-4-visual-preview" # The only OpenAI model by now that accepts visual input +VISUAL: + - NUM: 1 #The number of the visual model + - API_TYPE: "azure_ad" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "YOUR_ENDPOINT" # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. + API_KEY: "YOUR_KEY" # The OpenAI API key + API_VERSION: "2024-02-15-preview" # "2024-02-15-preview" by default + API_MODEL: "gpt-4-visual-preview" # The only OpenAI model by now that accepts visual input ### For Non-visual model -API_TYPE_NON_VISUAL: "aoai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. -API_BASE_NON_VISUAL: "YOUR_ENDPOINT" # The OpenAI endpoint for non-visual model -API_KEY_NON_VISUAL: "YOUR_KEY" # The OpenAI API key for non-visual model -API_MODEL_NON_VISUAL: "gpt-4-visual-preview" # The non-visual OpenAI model -API_VERSION_NON_VISUAL: "2024-02-15-preview" # "2024-02-15-preview" by default. - - +NON_VISUAL: + - NUM: 1 ##The number of the non-visual model + - API_TYPE: "aoai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "YOUR_ENDPOINT" # The OpenAI endpoint for non-visual model + API_KEY: "YOUR_KEY" # The OpenAI API key for non-visual model + API_VERSION: "2024-02-15-preview" # "2024-02-15-preview" by default + API_MODEL: "gpt-4-visual-preview" # The non-visual OpenAI model ### For parameters MAX_TOKENS: 2000 # The max token limit for the response completion MAX_RETRY: 3 # The max retry limit for the response completion diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index 867206b4..2abb38ed 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -9,4 +9,4 @@ def get_gptv_completion(messages, is_visual=True): from .openai import OpenAIService - return OpenAIService(configs, is_visual).chat_completion(messages) + return OpenAIService(configs, is_visual=is_visual).chat_completion(messages) diff --git a/ufo/llm/openai.py b/ufo/llm/openai.py index 7222c291..ff752cb6 100644 --- a/ufo/llm/openai.py +++ b/ufo/llm/openai.py @@ -3,9 +3,6 @@ import openai from openai import AzureOpenAI, OpenAI -from ..config.config import load_llm_config - -configs = load_llm_config() available_models = Literal[ #for azure_ad "gpt-35-turbo-20220309", @@ -25,28 +22,31 @@ class OpenAIService: - def __init__(self, config, is_visual: bool = True): + def __init__(self, config, index: int = 1, is_visual: bool = True): + if len(config["VISUAL" if is_visual else "NON_VISUAL"]) != \ + config["VISUAL" if is_visual else "NON_VISUAL"][0]["NUM"]+1: + raise ValueError("Invalid number of models") + self.config_llm = config["VISUAL" if is_visual else "NON_VISUAL"][index] self.config = config - self.is_visual = is_visual - api_type = self.config["API_TYPE"].lower() if self.is_visual else self.config["API_TYPE_NON_VISUAL"].lower() + api_type = self.config_llm["API_TYPE"].lower() max_retry = self.config["MAX_RETRY"] assert api_type in ["openai", "aoai", "azure_ad"], "Invalid API type" self.client: OpenAI = ( OpenAI( - base_url=self.config["API_BASE" if self.is_visual else "API_BASE_NON_VISUAL"], - api_key=self.config["API_KEY" if self.is_visual else "API_KEY_NON_VISUAL"], + base_url=self.config_llm["API_BASE"], + api_key=self.config_llm["API_KEY"], max_retries=max_retry, ) if api_type == "openai" else AzureOpenAI( max_retries=max_retry, - api_version=self.config["API_VERSION" if self.is_visual else "API_VERSION_NON_VISUAL"], - azure_endpoint=self.config["API_BASE" if self.is_visual else "API_BASE_NON_VISUAL"], - api_key=(self.config["API_KEY" if self.is_visual else "API_KEY_NON_VISUAL"] if api_type == 'aoai' else get_openai_token()), + api_version=self.config_llm["API_VERSION"], + azure_endpoint=self.config_llm["API_BASE"], + api_key=(self.config_llm["API_KEY"] if api_type == 'aoai' else self.get_openai_token()), ) ) - if (configs["API_TYPE"].lower() == "azure_ad" and self.is_visual) or (configs["API_TYPE_NON_VISUAL"].lower() == "azure_ad" and not self.is_visual): - auto_refresh_token() + if api_type == "azure_ad": + self.auto_refresh_token() def chat_completion( self, @@ -57,7 +57,7 @@ def chat_completion( top_p: Optional[float] = None, **kwargs: Any, ): - model = self.config["API_MODEL" if self.is_visual else "API_MODEL_NON_VISUAL"] + model = self.config_llm["API_MODEL"] temperature = temperature if temperature is not None else self.config["TEMPERATURE"] max_tokens = max_tokens if max_tokens is not None else self.config["MAX_TOKENS"] @@ -109,174 +109,176 @@ def chat_completion( -def get_openai_token( - token_cache_file: str = 'apim-token-cache.bin', - client_id: Optional[str] = None, - client_secret: Optional[str] = None, -) -> str: - ''' - acquire token from Azure AD for your organization - - Parameters - ---------- - token_cache_file : str, optional - path to the token cache file, by default 'apim-token-cache.bin' in the current directory - client_id : Optional[str], optional - client id for AAD app, by default None - client_secret : Optional[str], optional - client secret for AAD app, by default None - - Returns - ------- - str - access token for your own organization - ''' - import msal - import os - - cache = msal.SerializableTokenCache() - - def save_cache(): - if token_cache_file is not None and cache.has_state_changed: - with open(token_cache_file, "w") as cache_file: - cache_file.write(cache.serialize()) - if os.path.exists(token_cache_file): - cache.deserialize(open(token_cache_file, "r").read()) - - authority = "https://login.microsoftonline.com/" + configs["AAD_TENANT_ID"] - api_scope_base = "api://" + configs["AAD_API_SCOPE_BASE"] - - if client_id is not None and client_secret is not None: - app = msal.ConfidentialClientApplication( - client_id=client_id, - client_credential=client_secret, + def get_openai_token( + self, + token_cache_file: str = 'apim-token-cache.bin', + client_id: Optional[str] = None, + client_secret: Optional[str] = None, + ) -> str: + ''' + acquire token from Azure AD for your organization + + Parameters + ---------- + token_cache_file : str, optional + path to the token cache file, by default 'apim-token-cache.bin' in the current directory + client_id : Optional[str], optional + client id for AAD app, by default None + client_secret : Optional[str], optional + client secret for AAD app, by default None + + Returns + ------- + str + access token for your own organization + ''' + import msal + import os + + cache = msal.SerializableTokenCache() + + def save_cache(): + if token_cache_file is not None and cache.has_state_changed: + with open(token_cache_file, "w") as cache_file: + cache_file.write(cache.serialize()) + if os.path.exists(token_cache_file): + cache.deserialize(open(token_cache_file, "r").read()) + + authority = "https://login.microsoftonline.com/" + self.config["AAD_TENANT_ID"] + api_scope_base = "api://" + self.config["AAD_API_SCOPE_BASE"] + + if client_id is not None and client_secret is not None: + app = msal.ConfidentialClientApplication( + client_id=client_id, + client_credential=client_secret, + authority=authority, + token_cache=cache + ) + result = app.acquire_token_for_client( + scopes=[ + api_scope_base + "/.default", + ]) + if "access_token" in result: + return result['access_token'] + else: + print(result.get("error")) + print(result.get("error_description")) + raise Exception( + "Authentication failed for acquiring AAD token for your organization") + + scopes = [api_scope_base + "/" + self.config["AAD_API_SCOPE"]] + app = msal.PublicClientApplication( + self.config["AAD_API_SCOPE_BASE"], authority=authority, token_cache=cache ) - result = app.acquire_token_for_client( - scopes=[ - api_scope_base + "/.default", - ]) - if "access_token" in result: - return result['access_token'] - else: - print(result.get("error")) - print(result.get("error_description")) - raise Exception( - "Authentication failed for acquiring AAD token for your organization") - - scopes = [api_scope_base + "/" + configs["AAD_API_SCOPE"]] - app = msal.PublicClientApplication( - configs["AAD_API_SCOPE_BASE"], - authority=authority, - token_cache=cache - ) - result = None - for account in app.get_accounts(): - try: - result = app.acquire_token_silent(scopes, account=account) + result = None + for account in app.get_accounts(): + try: + result = app.acquire_token_silent(scopes, account=account) + if result is not None and "access_token" in result: + save_cache() + return result['access_token'] + result = None + except Exception: + continue + + accounts_in_cache = cache.find(msal.TokenCache.CredentialType.ACCOUNT) + for account in accounts_in_cache: + try: + refresh_token = cache.find( + msal.CredentialType.REFRESH_TOKEN, + query={ + "home_account_id": account["home_account_id"] + })[0] + result = app.acquire_token_by_refresh_token( + refresh_token["secret"], scopes=scopes) + if result is not None and "access_token" in result: + save_cache() + return result['access_token'] + result = None + except Exception: + pass + + if result is None: + print("no token available from cache, acquiring token from AAD") + # The pattern to acquire a token looks like this. + flow = app.initiate_device_flow(scopes=scopes) + print(flow['message']) + result = app.acquire_token_by_device_flow(flow=flow) if result is not None and "access_token" in result: save_cache() return result['access_token'] - result = None - except Exception: - continue + else: + print(result.get("error")) + print(result.get("error_description")) + raise Exception( + "Authentication failed for acquiring AAD token for your organization") - accounts_in_cache = cache.find(msal.TokenCache.CredentialType.ACCOUNT) - for account in accounts_in_cache: - try: - refresh_token = cache.find( - msal.CredentialType.REFRESH_TOKEN, - query={ - "home_account_id": account["home_account_id"] - })[0] - result = app.acquire_token_by_refresh_token( - refresh_token["secret"], scopes=scopes) - if result is not None and "access_token" in result: - save_cache() - return result['access_token'] - result = None - except Exception: - pass - - if result is None: - print("no token available from cache, acquiring token from AAD") - # The pattern to acquire a token looks like this. - flow = app.initiate_device_flow(scopes=scopes) - print(flow['message']) - result = app.acquire_token_by_device_flow(flow=flow) - if result is not None and "access_token" in result: - save_cache() - return result['access_token'] - else: - print(result.get("error")) - print(result.get("error_description")) - raise Exception( - "Authentication failed for acquiring AAD token for your organization") - - -def auto_refresh_token( - token_cache_file: str = 'apim-token-cache.bin', - interval: datetime.timedelta = datetime.timedelta(minutes=15), - on_token_update: callable = None, - client_id: Optional[str] = None, - client_secret: Optional[str] = None, -) -> callable: - """ - helper function for auto refreshing token from your organization - - Parameters - ---------- - token_cache_file : str, optional - path to the token cache file, by default 'apim-token-cache.bin' in the current directory - interval : datetime.timedelta, optional - interval for refreshing token, by default 15 minutes - on_token_update : callable, optional - callback function to be called when token is updated, by default None. In the callback function, you can get token from openai.api_key - - Returns - ------- - callable - a callable function that can be used to stop the auto refresh thread - """ - - import threading - - def update_token(): - import openai - - openai.api_type = "azure" if configs["API_TYPE"] == "azure_ad" else configs["API_TYPE"] - openai.base_url = configs["API_BASE"] - openai.api_version = configs["API_VERSION"] - openai.api_key = get_openai_token( - token_cache_file=token_cache_file, - client_id=client_id, - client_secret=client_secret, - ) - if on_token_update is not None: - on_token_update() + def auto_refresh_token( + self, + token_cache_file: str = 'apim-token-cache.bin', + interval: datetime.timedelta = datetime.timedelta(minutes=15), + on_token_update: callable = None, + client_id: Optional[str] = None, + client_secret: Optional[str] = None, + ) -> callable: + """ + helper function for auto refreshing token from your organization + + Parameters + ---------- + token_cache_file : str, optional + path to the token cache file, by default 'apim-token-cache.bin' in the current directory + interval : datetime.timedelta, optional + interval for refreshing token, by default 15 minutes + on_token_update : callable, optional + callback function to be called when token is updated, by default None. In the callback function, you can get token from openai.api_key + + Returns + ------- + callable + a callable function that can be used to stop the auto refresh thread + """ + + import threading + + def update_token(): + import openai + + openai.api_type = "azure" if self.config_llm["API_TYPE"] == "azure_ad" else self.config_llm["API_TYPE"] + openai.base_url = self.config_llm["API_BASE"] + openai.api_version = self.config_llm["API_VERSION"] + openai.api_key = self.get_openai_token( + token_cache_file=token_cache_file, + client_id=client_id, + client_secret=client_secret, + ) + + if on_token_update is not None: + on_token_update() - def refresh_token_thread(): - import time - while True: - try: - update_token() - except Exception as e: - print("failed to acquire token from AAD for your organization", e) - time.sleep(interval.total_seconds()) + def refresh_token_thread(): + import time + while True: + try: + update_token() + except Exception as e: + print("failed to acquire token from AAD for your organization", e) + time.sleep(interval.total_seconds()) - try: - update_token() - except Exception as e: - raise Exception( - "failed to acquire token from AAD for your organization", e) + try: + update_token() + except Exception as e: + raise Exception( + "failed to acquire token from AAD for your organization", e) - thread = threading.Thread(target=refresh_token_thread, daemon=True) - thread.start() + thread = threading.Thread(target=refresh_token_thread, daemon=True) + thread.start() - def stop(): - thread.stop() + def stop(): + thread.stop() - return stop + return stop From 5e572268920c983ff1e9ec7d62f4149f42fabbc9 Mon Sep 17 00:00:00 2001 From: Mac0q Date: Fri, 15 Mar 2024 10:30:45 +0800 Subject: [PATCH 173/223] API list --- ufo/llm/llm_call.py | 10 +++++++--- ufo/module/flow.py | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index 2abb38ed..839a602d 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -7,6 +7,10 @@ configs = load_llm_config() -def get_gptv_completion(messages, is_visual=True): - from .openai import OpenAIService - return OpenAIService(configs, is_visual=is_visual).chat_completion(messages) +def get_completion(messages, is_visual=True, index=1): + api_type = configs['VISUAL' if is_visual else 'NON_VISUAL'][index]['API_TYPE'] + if api_type.lower() in ['openai', 'aoai', 'azure_ad']: + from .openai import OpenAIService + return OpenAIService(configs, is_visual=is_visual, index=index).chat_completion(messages) + else: + raise ValueError(f'API_TYPE {api_type} not supported') \ No newline at end of file diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 59c49d4c..ebb12d54 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -105,7 +105,7 @@ def process_application_selection(self): self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) try: - response_string, cost = llm_call.get_gptv_completion(app_selection_prompt_message, configs["APP_AGENT_VISUAL_MODE"]) + response_string, cost = llm_call.get_completion(app_selection_prompt_message, configs["APP_AGENT_VISUAL_MODE"]) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) @@ -248,7 +248,7 @@ def process_action_selection(self): self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) try: - response_string, cost = llm_call.get_gptv_completion(action_selection_prompt_message, configs["ACTION_AGENT_VISUAL_MODE"]) + response_string, cost = llm_call.get_completion(action_selection_prompt_message, configs["ACTION_AGENT_VISUAL_MODE"]) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": action_selection_prompt_message}) print_with_color("Error occurs when calling LLM: {e}".format(e=str(e)), "red") From 8d5864f4cc8054452368cf07aeaa7361749856e8 Mon Sep 17 00:00:00 2001 From: Mac0q Date: Fri, 15 Mar 2024 11:50:52 +0800 Subject: [PATCH 174/223] check --- ufo/config/config.py | 3 +++ ufo/llm/openai.py | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ufo/config/config.py b/ufo/config/config.py index 58620471..73655044 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -71,6 +71,9 @@ def update_api_base(configs, key): config["API_BASE"] = parse_aoai_base(config) def optimize_configs(configs): + if len(configs["VISUAL"]) != configs["VISUAL"][0]["NUM"]+1 or \ + len(configs["NON_VISUAL"]) != configs["NON_VISUAL"][0]["NUM"]+1: + raise ValueError("Number of APIs does not match number of API listt") update_api_base(configs, 'VISUAL') update_api_base(configs, 'NON_VISUAL') diff --git a/ufo/llm/openai.py b/ufo/llm/openai.py index ff752cb6..f2438689 100644 --- a/ufo/llm/openai.py +++ b/ufo/llm/openai.py @@ -23,9 +23,6 @@ class OpenAIService: def __init__(self, config, index: int = 1, is_visual: bool = True): - if len(config["VISUAL" if is_visual else "NON_VISUAL"]) != \ - config["VISUAL" if is_visual else "NON_VISUAL"][0]["NUM"]+1: - raise ValueError("Invalid number of models") self.config_llm = config["VISUAL" if is_visual else "NON_VISUAL"][index] self.config = config api_type = self.config_llm["API_TYPE"].lower() From e8091e7b8f30eef966dbb9bce688ffb7e69a5ab2 Mon Sep 17 00:00:00 2001 From: Mac0q Date: Fri, 15 Mar 2024 17:54:08 +0800 Subject: [PATCH 175/223] backup engine --- ufo/config/config.py | 67 +++++++-------------- ufo/config/config.yaml.template | 4 -- ufo/config/config_llm.yaml.template | 93 +++++++++++++++++++++++++++++ ufo/llm/llm_call.py | 41 +++++++++++-- ufo/llm/openai.py | 12 ++-- ufo/module/flow.py | 4 +- 6 files changed, 159 insertions(+), 62 deletions(-) diff --git a/ufo/config/config.py b/ufo/config/config.py index 73655044..499129dd 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -6,7 +6,7 @@ import json from ..utils import print_with_color -def load_config(config_path="ufo/config/config.yaml"): +def load_config(config_path="ufo/config/"): """ Load the configuration from a YAML file and environment variables. @@ -16,66 +16,43 @@ def load_config(config_path="ufo/config/config.yaml"): # Copy environment variables to avoid modifying them directly configs = dict(os.environ) + path = config_path + try: - with open(config_path, "r") as file: + with open(path + "config.yaml", "r") as file: yaml_data = yaml.safe_load(file) # Update configs with YAML data if yaml_data: configs.update(yaml_data) - except FileNotFoundError: - print_with_color( - f"Warning: Config file not found at {config_path}. Using only environment variables.", "yellow") - - - return configs - -def load_llm_config(config_path="ufo/config/config_llm.yaml"): - """ - Load the configuration from a YAML file and environment variables. - - :param config_path: The path to the YAML config file. Defaults to "./config.yaml". - :return: Merged configuration from environment variables and YAML file. - """ - # Copy environment variables to avoid modifying them directly - configs = dict(os.environ) - - try: - with open(config_path, "r") as file: - yaml_data = yaml.safe_load(file) + with open(path + "config_llm.yaml", "r") as file: + yaml_llm_data = yaml.safe_load(file) # Update configs with YAML data if yaml_data: - configs.update(yaml_data) + configs.update(yaml_llm_data) except FileNotFoundError: print_with_color( f"Warning: Config file not found at {config_path}. Using only environment variables.", "yellow") - - return optimize_configs(configs) + return optimize_configs(configs) -def parse_aoai_base(config): - if 'deployments' not in config["API_BASE"]: - config["API_BASE"] = "{endpoint}/openai/deployments/{deployment_name}/chat/completions?api-version={api_version}".format( - endpoint=config["API_BASE"][:-1] if config["API_BASE"].endswith( - "/") else config["API_BASE"], - deployment_name=config["API_MODEL"], - api_version=config["API_VERSION"] - ) - return config["API_BASE"] -def update_api_base(configs, key): - if not isinstance(configs[key], list): - configs[key] = [configs[key]] - for config in configs[key][1:]: - if config["API_TYPE"].lower() == "aoai": - config["API_BASE"] = parse_aoai_base(config) +def update_api_base(configs, agent, key): + if configs[agent][key]["API_TYPE"].lower() == "aoai": + if 'deployments' not in configs[agent][key]["API_BASE"]: + configs[agent][key]["API_BASE"] = "{endpoint}/openai/deployments/{deployment_name}/chat/completions?api-version={api_version}".format( + endpoint=configs[agent][key]["API_BASE"][:-1] if configs[agent][key]["API_BASE"].endswith( + "/") else configs[agent][key]["API_BASE"], + deployment_name=configs[agent][key]["API_MODEL"], + api_version=configs[agent][key]["API_VERSION"] + ) + def optimize_configs(configs): - if len(configs["VISUAL"]) != configs["VISUAL"][0]["NUM"]+1 or \ - len(configs["NON_VISUAL"]) != configs["NON_VISUAL"][0]["NUM"]+1: - raise ValueError("Number of APIs does not match number of API listt") - update_api_base(configs, 'VISUAL') - update_api_base(configs, 'NON_VISUAL') + update_api_base(configs,'APP_AGENT', 'VISUAL') + update_api_base(configs,'APP_AGENT', 'NON_VISUAL') + update_api_base(configs, 'ACTION_AGENT', 'VISUAL') + update_api_base(configs, 'ACTION_AGENT', 'NON_VISUAL') return configs diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index c581a7f3..52f89346 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -1,9 +1,5 @@ version: 0.1 -## For Non-visual model -APP_AGENT_VISUAL_MODE: True # Whether to use the visual mode for the app agent -ACTION_AGENT_VISUAL_MODE: True # Whether to use the visual mode for the action agent - BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key CONTROL_BACKEND: "uia" # The backend for control action diff --git a/ufo/config/config_llm.yaml.template b/ufo/config/config_llm.yaml.template index eae6a0e8..c3bc0ab5 100644 --- a/ufo/config/config_llm.yaml.template +++ b/ufo/config/config_llm.yaml.template @@ -1,3 +1,96 @@ +## For Non-/Visual model +APP_AGENT_VISUAL_MODE: True # Whether to use the visual mode for the app agent +ACTION_AGENT_VISUAL_MODE: True # Whether to use the visual mode for the action agent + +APP_AGENT: + VISUAL: { + API_TYPE: "azure_ad", # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. + API_KEY: "YOUR_KEY", # The OpenAI API key + API_VERSION: "2023-12-01-preview", "2024-02-15-preview", # "2024-02-15-preview" by default. + API_MODEL: "gpt-4-visual-preview", # The only OpenAI model by now that accepts visual input + ### For Azure_AD + AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model + AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model + AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE + } + ### For Non-visual model + NON_VISUAL: { + API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "YOUR_ENDPOINT" , # The OpenAI endpoint for non-visual model + API_KEY: "YOUR_KEY", # The OpenAI API key for non-visual model + API_MODEL: "gpt-4-1106-preview", # The non-visual OpenAI model + API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default. + ### For Azure_AD + AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model + AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model + AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE + } + +ACTION_AGENT: + VISUAL: { + API_TYPE: "azure_ad", # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. + API_KEY: "YOUR_KEY", # The OpenAI API key + API_VERSION: "2023-12-01-preview", "2024-02-15-preview", # "2024-02-15-preview" by default. + API_MODEL: "gpt-4-visual-preview", # The only OpenAI model by now that accepts visual input + ### For Azure_AD + AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model + AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model + AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE + } + ### For Non-visual model + NON_VISUAL: { + API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "YOUR_ENDPOINT" , # The OpenAI endpoint for non-visual model + API_KEY: "YOUR_KEY", # The OpenAI API key for non-visual model + API_MODEL: "gpt-4-1106-preview", # The non-visual OpenAI model + API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default. + ### For Azure_AD + AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model + AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model + AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE + } + +BACKUP_AGENT: + VISUAL: { + API_TYPE: "azure_ad", # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. + API_KEY: "YOUR_KEY", # The OpenAI API key + API_VERSION: "2023-12-01-preview", "2024-02-15-preview", # "2024-02-15-preview" by default. + API_MODEL: "gpt-4-visual-preview", # The only OpenAI model by now that accepts visual input + ### For Azure_AD + AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model + AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model + AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE + } + ### For Non-visual model + NON_VISUAL: { + API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "YOUR_ENDPOINT" , # The OpenAI endpoint for non-visual model + API_KEY: "YOUR_KEY", # The OpenAI API key for non-visual model + API_MODEL: "gpt-4-1106-preview", # The non-visual OpenAI model + API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default. + ### For Azure_AD + AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model + AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model + AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE + } + + + +### For parameters +MAX_TOKENS: 2000 # The max token limit for the response completion +MAX_RETRY: 3 # The max retry limit for the response completion +TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model +TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model + + + + + + + VISUAL: - NUM: 1 #The number of the visual model - API_TYPE: "azure_ad" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index 839a602d..8ffa5945 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -1,16 +1,47 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. -from ..config.config import load_llm_config +from ufo.utils import print_with_color +from ..config.config import load_config -configs = load_llm_config() +configs = load_config() -def get_completion(messages, is_visual=True, index=1): - api_type = configs['VISUAL' if is_visual else 'NON_VISUAL'][index]['API_TYPE'] +def get_completion(messages, is_visual=True, agent: str='APP', backup_engine: bool=True): + """ + Get completion for the given messages. + + Args: + messages (list): List of messages to be used for completion. + is_visual (bool, optional): Flag indicating whether the completion is visual or not. + agent (str, optional): Type of agent. Possible values are 'APP', 'ACTION' or 'BACKUP'. + backup_engine (bool, optional): Flag indicating whether to use the backup engine or not. + + Returns: + tuple: A tuple containing the completion response (str) and the cost (float). + + """ + if agent.lower() == "app": + agent_type = "APP_AGENT" + elif agent.lower() == "action": + agent_type = "ACTION_AGENT" + elif agent.lower() == "backup": + agent_type = "BACKUP_AGENT" + else: + raise ValueError(f'Agent {agent} not supported') + + api_type = configs[agent_type]['VISUAL' if is_visual else 'NON_VISUAL']['API_TYPE'] if api_type.lower() in ['openai', 'aoai', 'azure_ad']: from .openai import OpenAIService - return OpenAIService(configs, is_visual=is_visual, index=index).chat_completion(messages) + try: + response, cost = OpenAIService(configs, is_visual=is_visual, agent_type=agent_type).chat_completion(messages) + except Exception as e: + if backup_engine: + print_with_color(f"OpenAI API request failed: {e}, try to use the backup engine", "red") + return get_completion(messages, is_visual=is_visual, agent='backup', backup_engine=False) + else: + raise e + return response, cost else: raise ValueError(f'API_TYPE {api_type} not supported') \ No newline at end of file diff --git a/ufo/llm/openai.py b/ufo/llm/openai.py index f2438689..5d8f64fc 100644 --- a/ufo/llm/openai.py +++ b/ufo/llm/openai.py @@ -22,8 +22,8 @@ class OpenAIService: - def __init__(self, config, index: int = 1, is_visual: bool = True): - self.config_llm = config["VISUAL" if is_visual else "NON_VISUAL"][index] + def __init__(self, config, agent_type: str, is_visual: bool = True): + self.config_llm = config[agent_type]["VISUAL" if is_visual else "NON_VISUAL"] self.config = config api_type = self.config_llm["API_TYPE"].lower() max_retry = self.config["MAX_RETRY"] @@ -141,8 +141,8 @@ def save_cache(): if os.path.exists(token_cache_file): cache.deserialize(open(token_cache_file, "r").read()) - authority = "https://login.microsoftonline.com/" + self.config["AAD_TENANT_ID"] - api_scope_base = "api://" + self.config["AAD_API_SCOPE_BASE"] + authority = "https://login.microsoftonline.com/" + self.config_llm["AAD_TENANT_ID"] + api_scope_base = "api://" + self.config_llm["AAD_API_SCOPE_BASE"] if client_id is not None and client_secret is not None: app = msal.ConfidentialClientApplication( @@ -163,9 +163,9 @@ def save_cache(): raise Exception( "Authentication failed for acquiring AAD token for your organization") - scopes = [api_scope_base + "/" + self.config["AAD_API_SCOPE"]] + scopes = [api_scope_base + "/" + self.config_llm["AAD_API_SCOPE"]] app = msal.PublicClientApplication( - self.config["AAD_API_SCOPE_BASE"], + self.config_llm["AAD_API_SCOPE_BASE"], authority=authority, token_cache=cache ) diff --git a/ufo/module/flow.py b/ufo/module/flow.py index ebb12d54..19c315e0 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -105,7 +105,7 @@ def process_application_selection(self): self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) try: - response_string, cost = llm_call.get_completion(app_selection_prompt_message, configs["APP_AGENT_VISUAL_MODE"]) + response_string, cost = llm_call.get_completion(app_selection_prompt_message, configs["APP_AGENT_VISUAL_MODE"], "APP", backup_engine=True) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) @@ -248,7 +248,7 @@ def process_action_selection(self): self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) try: - response_string, cost = llm_call.get_completion(action_selection_prompt_message, configs["ACTION_AGENT_VISUAL_MODE"]) + response_string, cost = llm_call.get_completion(action_selection_prompt_message, configs["ACTION_AGENT_VISUAL_MODE"], "ACTION", backup_engine=True) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": action_selection_prompt_message}) print_with_color("Error occurs when calling LLM: {e}".format(e=str(e)), "red") From d420cb4bdeee6dbb8ce1d4b3ef1f2b52bb6f6a30 Mon Sep 17 00:00:00 2001 From: Mac0q Date: Fri, 15 Mar 2024 17:55:56 +0800 Subject: [PATCH 176/223] template update --- ufo/config/config_llm.yaml.template | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/ufo/config/config_llm.yaml.template b/ufo/config/config_llm.yaml.template index c3bc0ab5..930ec2b1 100644 --- a/ufo/config/config_llm.yaml.template +++ b/ufo/config/config_llm.yaml.template @@ -90,32 +90,3 @@ TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative - -VISUAL: - - NUM: 1 #The number of the visual model - - API_TYPE: "azure_ad" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - API_BASE: "YOUR_ENDPOINT" # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. - API_KEY: "YOUR_KEY" # The OpenAI API key - API_VERSION: "2024-02-15-preview" # "2024-02-15-preview" by default - API_MODEL: "gpt-4-visual-preview" # The only OpenAI model by now that accepts visual input -### For Non-visual model -NON_VISUAL: - - NUM: 1 ##The number of the non-visual model - - API_TYPE: "aoai" # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - API_BASE: "YOUR_ENDPOINT" # The OpenAI endpoint for non-visual model - API_KEY: "YOUR_KEY" # The OpenAI API key for non-visual model - API_VERSION: "2024-02-15-preview" # "2024-02-15-preview" by default - API_MODEL: "gpt-4-visual-preview" # The non-visual OpenAI model -### For parameters -MAX_TOKENS: 2000 # The max token limit for the response completion -MAX_RETRY: 3 # The max retry limit for the response completion -TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model -TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model - -### For AAD -AAD_TENANT_ID: "YOUR_TENANT_ID" # Set the value to your tenant id for the llm model -AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model -AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE - - - From 7c61c0d75f06b42a82dae369cf20b9f660c62bf0 Mon Sep 17 00:00:00 2001 From: Mac0q Date: Sat, 16 Mar 2024 14:34:52 +0800 Subject: [PATCH 177/223] backup format --- ufo/llm/llm_call.py | 28 ++++++++++++++-------------- ufo/module/flow.py | 4 ++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index 8ffa5945..9f30a0ea 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -8,7 +8,7 @@ configs = load_config() -def get_completion(messages, is_visual=True, agent: str='APP', backup_engine: bool=True): +def get_completion(messages, is_visual=True, agent: str='APP', use_backup_engine: bool=True): """ Get completion for the given messages. @@ -16,7 +16,7 @@ def get_completion(messages, is_visual=True, agent: str='APP', backup_engine: bo messages (list): List of messages to be used for completion. is_visual (bool, optional): Flag indicating whether the completion is visual or not. agent (str, optional): Type of agent. Possible values are 'APP', 'ACTION' or 'BACKUP'. - backup_engine (bool, optional): Flag indicating whether to use the backup engine or not. + use_backup_engine (bool, optional): Flag indicating whether to use the backup engine or not. Returns: tuple: A tuple containing the completion response (str) and the cost (float). @@ -32,16 +32,16 @@ def get_completion(messages, is_visual=True, agent: str='APP', backup_engine: bo raise ValueError(f'Agent {agent} not supported') api_type = configs[agent_type]['VISUAL' if is_visual else 'NON_VISUAL']['API_TYPE'] - if api_type.lower() in ['openai', 'aoai', 'azure_ad']: - from .openai import OpenAIService - try: + try: + if api_type.lower() in ['openai', 'aoai', 'azure_ad']: + from .openai import OpenAIService response, cost = OpenAIService(configs, is_visual=is_visual, agent_type=agent_type).chat_completion(messages) - except Exception as e: - if backup_engine: - print_with_color(f"OpenAI API request failed: {e}, try to use the backup engine", "red") - return get_completion(messages, is_visual=is_visual, agent='backup', backup_engine=False) - else: - raise e - return response, cost - else: - raise ValueError(f'API_TYPE {api_type} not supported') \ No newline at end of file + return response, cost + else: + raise ValueError(f'API_TYPE {api_type} not supported') + except Exception as e: + if use_backup_engine: + print_with_color(f"The API request of {agent_type} failed: {e}, try to use the backup engine", "red") + return get_completion(messages, is_visual=is_visual, agent='backup', use_backup_engine=False) + else: + raise e \ No newline at end of file diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 19c315e0..4b0ae80e 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -105,7 +105,7 @@ def process_application_selection(self): self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) try: - response_string, cost = llm_call.get_completion(app_selection_prompt_message, configs["APP_AGENT_VISUAL_MODE"], "APP", backup_engine=True) + response_string, cost = llm_call.get_completion(app_selection_prompt_message, configs["APP_AGENT_VISUAL_MODE"], "APP", use_backup_engine=True) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) @@ -248,7 +248,7 @@ def process_action_selection(self): self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) try: - response_string, cost = llm_call.get_completion(action_selection_prompt_message, configs["ACTION_AGENT_VISUAL_MODE"], "ACTION", backup_engine=True) + response_string, cost = llm_call.get_completion(action_selection_prompt_message, configs["ACTION_AGENT_VISUAL_MODE"], "ACTION", use_backup_engine=True) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": action_selection_prompt_message}) print_with_color("Error occurs when calling LLM: {e}".format(e=str(e)), "red") From 273bebf8ca865b0f264a2125810f5e39fbcde95f Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 17 Mar 2024 20:33:58 +0800 Subject: [PATCH 178/223] log parser & bug fixed --- ufo/experience/__init__.py | 2 + ufo/experience/parser.py | 178 +++++++++++++++++++++++++++++++++++ ufo/experience/summarizer.py | 2 + ufo/module/flow.py | 8 +- ufo/ufo.py | 1 - 5 files changed, 189 insertions(+), 2 deletions(-) create mode 100644 ufo/experience/__init__.py create mode 100644 ufo/experience/parser.py create mode 100644 ufo/experience/summarizer.py diff --git a/ufo/experience/__init__.py b/ufo/experience/__init__.py new file mode 100644 index 00000000..7f3fd831 --- /dev/null +++ b/ufo/experience/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. \ No newline at end of file diff --git a/ufo/experience/parser.py b/ufo/experience/parser.py new file mode 100644 index 00000000..6d421349 --- /dev/null +++ b/ufo/experience/parser.py @@ -0,0 +1,178 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import json +import os +import re +from ..utils import encode_image_from_path + + +class LogLoader: + """ + Loading the logs from previous runs. + """ + + def __init__(self, log_path: str): + """ + Initialize the LogLoader. + :param log_path: The path of the log file. + """ + self.log_path = log_path + self.response = self.load_response_log() + self.max_stepnum = self.find_max_number_in_filenames() + self.request_partition = self.get_request_partition() + self.screenshots = {} + + self.logs = [] + + + def load_response_log(self): + """ + Load the response log. + :return: The response log. + """ + + response = [] + response_log_path = os.path.join(self.log_path, "response.log") + with open(response_log_path, 'r', encoding='utf-8') as file: + # Read the lines and split them into a list + response_log = file.readlines() + for response_string in response_log: + response.append(json.loads(response_string)) + return response + + + def find_max_number_in_filenames(self) -> int: + """ + Find the maximum number in the filenames. + :return: The maximum number in the filenames. + """ + + # Get the list of files in the folder + files = os.listdir(self.log_path) + + # Initialize an empty list to store extracted numbers + numbers = [] + + # Iterate through each file + for file in files: + # Extract the number from the filename + number = extract_number(file) + if number is not None: + # Append the extracted number to the list + numbers.append(number) + + if numbers: + # Return the maximum number if numbers list is not empty + return max(numbers) + else: + # Return None if no numbers are found in filenames + return None + + + def load_screenshot(self, stepnum: int = 0, version: str = "") -> str: + """ + Load the screenshot. + :param stepnum: The step number of the screenshot. + :param version: The version of the screenshot. + :return: The screenshot. + """ + + # create version tag + if version: + version_tag = "_" + version + else: + version_tag = "" + + # Get the filename of the screenshot + filename = "action_step{stepnum}{version}.png".format(stepnum=stepnum, version=version_tag) + screenshot_path = os.path.join(self.log_path, filename) + + # Check if the screenshot exists + if os.path.exists(screenshot_path): + image_url = encode_image_from_path(screenshot_path) + else: + image_url = None + + return image_url + + + def create_logs(self) -> list: + """ + Create the response log. + :return: The response log. + """ + self.logs = [] + for partition in self.request_partition: + request = self.response[partition[0]]["Request"] + nround = self.response[partition[0]]["Round"] + partitioned_logs = { + "request": request, + "round": nround, + **{ + "step_%s" % step: { + "response": self.response[step], + "screenshot": { + version: self.load_screenshot(step, "" if version == "raw" else version) + for version in ["raw", "selected_controls"] + } + } + for step in partition + } + } + self.logs.append(partitioned_logs) + return self.logs + + + def get_request_partition(self) -> list: + """ + Partition the logs. + :return: The partitioned logs. + """ + request_partition = [] + current_round = 0 + current_partition = [] + + for step in range(self.max_stepnum): + nround = self.response[step]["Round"] + + if nround != current_round: + if current_partition: + request_partition.append(current_partition) + current_partition = [step] + current_round = nround + else: + current_partition.append(step) + + if current_partition: + request_partition.append(current_partition) + + return request_partition + + + +def extract_number(filename): + # Define a regular expression pattern to extract numbers + pattern = r'action_step(\d+)\.png' + # Use re.search to find the matching pattern in the filename + match = re.search(pattern, filename) + if match: + # Return the extracted number as an integer + return int(match.group(1)) + else: + # Return None if no match is found + return None + + + +def extract_number(filename): + # Define a regular expression pattern to extract numbers + pattern = r'action_step(\d+)\.png' + # Use re.search to find the matching pattern in the filename + match = re.search(pattern, filename) + if match: + # Return the extracted number as an integer + return int(match.group(1)) + else: + # Return None if no match is found + return None \ No newline at end of file diff --git a/ufo/experience/summarizer.py b/ufo/experience/summarizer.py new file mode 100644 index 00000000..7f3fd831 --- /dev/null +++ b/ufo/experience/summarizer.py @@ -0,0 +1,2 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. \ No newline at end of file diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 35f6918a..20f9b1da 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -137,8 +137,10 @@ def process_application_selection(self): response_json["Step"] = self.step + response_json["Round"] = self.round response_json["ControlLabel"] = self.application response_json["Action"] = "set_focus()" + response_json["Request"] = self.request response_json["Agent"] = "AppAgent" @@ -276,8 +278,10 @@ def process_action_selection(self): self.status = response_json["Status"] comment = response_json["Comment"] response_json["Step"] = self.step + response_json["Round"] = self.round response_json["Action"] = action response_json["Agent"] = "ActAgent" + response_json["Request"] = self.request response_json["Application"] = control.get_application_name(self.app_window) @@ -310,6 +314,8 @@ def process_action_selection(self): break + self.step += 1 + # The task is finish and no further action is needed if self.status.upper() == "FINISH" and function_call == "": self.status = self.status.upper() @@ -317,7 +323,7 @@ def process_action_selection(self): return - self.step += 1 + if function_call: # Handle the case when the action is an image summary or switch app diff --git a/ufo/ufo.py b/ufo/ufo.py index 510dc7dc..767906c6 100644 --- a/ufo/ufo.py +++ b/ufo/ufo.py @@ -78,7 +78,6 @@ def main(): round=round), "magenta") print_with_color("{result}".format(result=result), "yellow") - session.set_round(round+1) # Print the total cost total_cost = session.get_cost() From 070b31198679b488290de21bf6cd80642056e17a Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 17 Mar 2024 20:48:20 +0800 Subject: [PATCH 179/223] add tag --- ufo/experience/parser.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ufo/experience/parser.py b/ufo/experience/parser.py index 6d421349..eeebb209 100644 --- a/ufo/experience/parser.py +++ b/ufo/experience/parser.py @@ -112,12 +112,13 @@ def create_logs(self) -> list: **{ "step_%s" % step: { "response": self.response[step], + "is_first_action": local_step == 1, "screenshot": { version: self.load_screenshot(step, "" if version == "raw" else version) for version in ["raw", "selected_controls"] } } - for step in partition + for local_step, step in enumerate(partition) } } self.logs.append(partitioned_logs) @@ -150,7 +151,6 @@ def get_request_partition(self) -> list: return request_partition - def extract_number(filename): # Define a regular expression pattern to extract numbers pattern = r'action_step(\d+)\.png' From 4bbf363e5c6f26e217a7672ae3bad59306d730e7 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 17 Mar 2024 22:24:16 +0800 Subject: [PATCH 180/223] abstract prompter --- ufo/config/config.yaml.template | 13 +- ufo/experience/experience_prompter.py | 107 ++++++++++++++ ufo/experience/parser.py | 3 +- ufo/experience/summarizer.py | 2 - ufo/llm/prompter.py | 6 +- ufo/prompter/base.py | 85 ++++++++++++ ufo/prompts/base/action_selection.yaml | 125 ----------------- ufo/prompts/base/api.yaml | 66 --------- ufo/prompts/base/app_selection.yaml | 77 ----------- ufo/prompts/examples/action_example.yaml | 169 ----------------------- ufo/prompts/examples/app_example.yaml | 151 -------------------- ufo/ui_control/control.py | 1 - 12 files changed, 211 insertions(+), 594 deletions(-) create mode 100644 ufo/experience/experience_prompter.py delete mode 100644 ufo/experience/summarizer.py create mode 100644 ufo/prompter/base.py delete mode 100644 ufo/prompts/base/action_selection.yaml delete mode 100644 ufo/prompts/base/api.yaml delete mode 100644 ufo/prompts/base/app_selection.yaml delete mode 100644 ufo/prompts/examples/action_example.yaml delete mode 100644 ufo/prompts/examples/app_example.yaml diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index a8fa6c2f..072878b9 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -67,4 +67,15 @@ RAG_OFFLINE_DOCS_RETRIEVED_TOPK: 1 # The topk for the offline retrieved documen ## RAG Configuration for the Bing search RAG_ONLINE_SEARCH: False # Whether to use the online search for the RAG. RAG_ONLINE_SEARCH_TOPK: 5 # The topk for the online search -RAG_ONLINE_RETRIEVED_TOPK: 1 # The topk for the online retrieved documents \ No newline at end of file +RAG_ONLINE_RETRIEVED_TOPK: 1 # The topk for the online retrieved documents + + + +## For experience learning +VISUAL_PROMPT = "ufo/prompts/experience/visual_experience_prompt.yaml" +NON_VISUAL_PROMPT = "ufo/prompts/experience/nonvisual_experience_prompt.yaml" + +VISUAL_EXAMPLE_PROMPT = "ufo/prompts/experience/visual_experience_example_prompt.yaml" +NON_VISUAL_EXAMPLE_PROMPT = "ufo/prompts/experience/nonvisual_experience_example_prompt.yaml" + +EXAMPLE_SAVED_PATH = "ufo/experience/replay/" diff --git a/ufo/experience/experience_prompter.py b/ufo/experience/experience_prompter.py new file mode 100644 index 00000000..a675ea14 --- /dev/null +++ b/ufo/experience/experience_prompter.py @@ -0,0 +1,107 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from typing import List +import json +import yaml + +VISUAL_PROMPT = "ufo/prompts/experience/visual_experience_prompt.yaml" +NON_VISUAL_PROMPT = "ufo/prompts/experience/nonvisual_experience_prompt.yaml" + +VISUAL_EXAMPLE_PROMPT = "ufo/prompts/experience/visual_experience_example_prompt.yaml" +NON_VISUAL_EXAMPLE_PROMPT = "ufo/prompts/experience/nonvisual_experience_example_prompt.yaml" + +EXAMPLE_SAVED_PATH = "ufo/experience/replay/" + + + +class ExperiencePrompter: + + def __init__(self, is_visual: bool): + """ + Initialize the ExperiencePrompter. + :param is_visual: Whether the request is for visual model. + """ + self.is_visual = is_visual + self.prompt_template = self.load_prompt_template() + self.example_prompt_template = self.load_example_prompt_template() + + self.system_prompt = self.system_prompt_construction() + + + def load_prompt_template(self): + """ + Load the prompt template. + :return: The prompt template. + """ + + if self.is_visual: + path = VISUAL_PROMPT + else: + path = NON_VISUAL_PROMPT + + prompt = yaml.safe_load(open(path, "r", encoding="utf-8")) + + return prompt + + + def load_example_prompt_template(self): + """ + Load the example prompt template. + :return: The example prompt template. + """ + if self.is_visual: + path = VISUAL_EXAMPLE_PROMPT + else: + path = NON_VISUAL_EXAMPLE_PROMPT + + prompt = yaml.safe_load(open(path, "r", encoding="utf-8")) + + return prompt + + + def system_prompt_construction(self) -> str: + + example_prompt = "" + system_prompt = self.prompt_template["system"].format(examples=example_prompt) + + return system_prompt + + + + def user_prompt_construction(self, log_partition: list) -> str: + pass + + + def prompt_construction(self, user_content:list) -> list[dict]: + """ + Construct the prompt for summarizing the experience into an example. + :param user_content: The user content. + return: The prompt for summarizing the experience into an example. + """ + + system_message = { + "role": "system", + "content": self.system_prompt + } + + user_message = { + "role": "user", + "content": user_content + } + + prompt_message = [system_message, user_message] + + return prompt_message + + + def examples_prompt_helper(self) -> list[str]: + """ + Construct the prompt for examples. + :param examples: The examples. + :param header: The header of the prompt. + :param separator: The separator of the prompt. + return: The prompt for examples. + """ + + pass \ No newline at end of file diff --git a/ufo/experience/parser.py b/ufo/experience/parser.py index eeebb209..a6921eaf 100644 --- a/ufo/experience/parser.py +++ b/ufo/experience/parser.py @@ -119,7 +119,8 @@ def create_logs(self) -> list: } } for local_step, step in enumerate(partition) - } + }, + "application": list({self.response[step]["Application"] for step in partition}) } self.logs.append(partitioned_logs) return self.logs diff --git a/ufo/experience/summarizer.py b/ufo/experience/summarizer.py deleted file mode 100644 index 7f3fd831..00000000 --- a/ufo/experience/summarizer.py +++ /dev/null @@ -1,2 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. \ No newline at end of file diff --git a/ufo/llm/prompter.py b/ufo/llm/prompter.py index 2913e7f0..f609448f 100644 --- a/ufo/llm/prompter.py +++ b/ufo/llm/prompter.py @@ -133,7 +133,7 @@ def api_prompt_helper(apis: dict, verbose: int = 1) -> List[str]: return api_list -def examples_prompt_helper(examples: dict, header: str = "## Response Examples", separator: str = "Example") -> list[str]: +def examples_prompt_helper(examples: dict, header: str = "## Response Examples", separator: str = "Example") -> str: """ Construct the prompt for examples. :param examples: The examples. @@ -164,4 +164,8 @@ def load_prompt(template_path: str, is_visual: bool) -> str: return prompt + + + + \ No newline at end of file diff --git a/ufo/prompter/base.py b/ufo/prompter/base.py new file mode 100644 index 00000000..da29ba6a --- /dev/null +++ b/ufo/prompter/base.py @@ -0,0 +1,85 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from abc import ABC, abstractmethod +import yaml + + +class BasicPrompter(ABC): + + def __init__(self, is_visual: bool, prompt_template: str, example_prompt_template: str): + """ + Initialize the BasicPrompter. + :param is_visual: Whether the request is for visual model. + :param prompt_template: The path of the prompt template. + :param example_prompt_template: The path of the example prompt template. + """ + self.is_visual = is_visual + self.prompt_template = self.load_prompt_template(prompt_template) + self.example_prompt_template = self.load_prompt_template(example_prompt_template) + + + def load_prompt_template(self, template_path: str) -> str: + """ + Load the prompt template. + :return: The prompt template. + """ + + path = template_path.format(mode = "visual" if self.is_visual else "nonvisual") + prompt = yaml.safe_load(open(path, "r", encoding="utf-8")) + + return prompt + + + def prompt_construction(self, system_prompt:str, user_content:list) -> list[dict]: + """ + Construct the prompt for summarizing the experience into an example. + :param user_content: The user content. + return: The prompt for summarizing the experience into an example. + """ + + system_message = { + "role": "system", + "content": system_prompt + } + + user_message = { + "role": "user", + "content": user_content + } + + prompt_message = [system_message, user_message] + + return prompt_message + + + @abstractmethod + def system_prompt_construction(self) -> str: + + pass + + + @abstractmethod + def user_prompt_construction(self) -> str: + + pass + + + @abstractmethod + def user_content_construction(self) -> str: + + pass + + + def examples_prompt_helper(self) -> str: + + pass + + + def api_prompt_helper(self) -> str: + + pass + + def retrived_documents_prompt_helper(self) -> str: + + pass \ No newline at end of file diff --git a/ufo/prompts/base/action_selection.yaml b/ufo/prompts/base/action_selection.yaml deleted file mode 100644 index c7064c37..00000000 --- a/ufo/prompts/base/action_selection.yaml +++ /dev/null @@ -1,125 +0,0 @@ -version: 1.0 - -system: |- - Your name is UFO, a UI-focused agent for Windows OS. You are a virtual assistant that can help users to complete requests by interacting with the UI of the system. - Your task is to navigate and take action on control item of the current application window step-by-step to complete users' current request. - - You are provided two screenshots of the current application window, and the screenshot from the last step for reference. - - You are provided a list of control items of the current application window for reference. - - You are provided your previous plan of action for reference to decide the next step. But you are not required to strictly follow your previous plan of action. Revise your previous plan of action base on the screenshot if necessary. - - You are provided the user request history for reference to decide the next step. These requests are the requests that you have completed before. You may need to use them as reference for the next action. - - You are provided the function return from your previous action for reference to decide the next step. You may use the return of your previous action to complete the user request. - - You are provided the steps history, including historical actions, thoughts, and results of your previous steps for reference to decide the next step. Use them to help you think about the next step. - - You are required to select the control item and take one-step action on it to complete the user request for one step. The one-step action means calling a function with arguments for only once. - - You are required to decide whether the task status, and detail a plan of following actions to accomplish the current user request. Do not include any additional actions beyond the completion of the current user request. - - ## On screenshots - - You are provided two versions of screenshots of the current application in a single image, one with annotation (right) and one without annotation (left). - - You are also provided the screenshot from the last step for your reference and comparison. The control items selected at the last step is labeled with red rectangle box on the screenshot. Use it to help you think whether the previous action has taken effect. - - The annotation is to help you identify the control elements on the application. - - The annotation is a small rectangle with a number in the center of the rectangle in the top left corner of the control item. The number is the label of the control item. - - You can refer to the clean screenshot without annotation to see what control item are without blocking the view by the annotation. - - Different types of control items have different colors of annotation. - - Use the screenshot to analyze the state of current application window. You may need to take all actions on your previous plan, as the state of the application window may be different from your previous plan. - - - ## Control item - - The control item is the element on the page that you can interact with, we limit the actionable control item to the following: - - "Button" is the control item that you can click. It is labeled with yellow annotation on the screenshot. - - "Edit" is the control item that you can click and input text. It is labeled with green annotation on the screenshot. - - "TabItem" is the control item that you can click and switch to another page. It is labeled with blue annotation on the screenshot. - - "ListItem" is the control item that you can click and select. It is labeled with purple annotation on the screenshot. - - "MenuItem" is the control item that you can click and select. It is labeled with light lighter green annotation on the screenshot. - - "ScrollBar" is the control item that you can scroll. It is labeled with pink annotation on the screenshot. - - "TreeItem" is the control item that you can click and select. It is labeled with gray annotation on the screenshot. - - "Document" is the control item that you can click and select text. It is labeled with orange annotation on the screenshot. - - "Hyperlink" is the control item that you can click and open a link. It is labeled with light blue annotation on the screenshot. - - "ComboBox" is the control item that you can click and input text. It is labeled with light purple annotation on the screenshot. The Google search box is an example of ComboBox. - - You are given the information of all available control item in the current application window in a list format: {{label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}}. - - ## Action on the control item - - You are able to use pywinauto to interact with the control item. - {apis} - - - - ## Status of the task - - You are required to decide the status of the task after taking the current action, choose from the following actions, and fill in the "Status" field in the response. - - "CONTINUE": means the task is not finished and need further action. - - "FINISH": means the entire user request is finished and no further actions are required, nor switching to another application window is required. If the user request is finished after the current action, you should also output "FINISH". Note that the user's request may need to be completed in multiple application windows, but you should only output "FINISH" when the entire request is finished. - - "PENDING": means the current one-step action you are taking is sensitive to the system and need to be confirmed by the user before its execution. This does not apply to future actions after the current step. Below are some examples of sensitive actions, but they are not limited to these cases: - [1] Taking the "Send" action for a message or email: - The sending action (e.g. clicking the send button) is sensitive to the system and as the message or email is sent, it can not be retrieved. Thus, the user need to confirm the sending action. Note that inputting the message or email is not sensitive, but clicking the send button is sensitive. - [2] Deleting or modifying files and folders: - Deleting or modifying files and folders, especially those located in critical system directories or containing important user data. - [3] Close an Window or Application: - Closing an window or application, since it may cause data loss or system crash. - [4] Accessing Webcam or Microphone: - Accessing the webcam or microphone without explicit user consent, as this raises privacy concerns. - [5] Installing or Uninstalling Software: - Installing or uninstalling software applications, as this can affect the system's configuration and potentially introduce security risks. - [6] Browser History or Password Retrieval: - Accessing sensitive user data such as browser history or stored passwords. - Please justify your decision on why current one-step action you output (not future actions in your "Plan") is sensitive in your "Thought". - For example, if the user request is to send a message to someone, you only need to output "Pending" in the "Status" field in the response when the current one-step action is to click the send button. - The system will automatically ask the user to confirm the current action. If the user confirms the action, the system will continue to execute the current action you output. Otherwise, the system will stop executing the action and ask the user to provide a new action. - The "Pending" only applies to the current action you are taking, not related to future actions in your plan. - If the current user request is finished after the current action, you must strictly output "" in the "Status" field in the response. - - "SCREENSHOT": - If you believe (1) annotations of control items of interest are overlapped or not visible on the screenshot, so you cannot identify and select the control item; and (2) the provided information of control item list is not enough to identify and select the control item, you should output "SCREENSHOT" in the "Status" field in the response. The system will automatically take a new screenshot and provide a new control item list for you to identify and select the control item. - Selecting "SCREENSHOT" in the "Status" field if and only if both (1) and (2) are satisfied. Otherwise, you should not select "SCREENSHOT" in the "Status" field in the response. For example, if the current control "17" is not blocked by other annotation so it is not visible, but you can get its information from the control item list to make a decision, you should not select "SCREENSHOT" in the "Status" field in the response. - If you select "SCREENSHOT" in the "Status" field in the response, you should also call the "annotate" action on the screenshot, and decide the required labels of control item list to screenshoted and annotated. - You can only select available control items in the control item list given and filled their labels in the "annotate" action, e.g. annotate(control_labels=['1', '2', '3', '36', '58']). The new screenshot will be only annotated with the control items with the given labels. - - "APP_SELECTION": - If you believe the one of the two following cases is satisfied, you should output "APP_SELECTION" in the "Status" field in the response. - [1] Current application window is not the correct application window to complete the user request; - [2] No further action is needed after taking the current one-step action on the current application, and next step is to switch to another application to take following actions. - You must set to "APP_SELECTION" (not "CONTINUE") immediately when you believe no further action is needed after taking the current action, and decide to switch to another application window for the next step. - - ## Other Guidelines - - You are required to select the control item and take open-step action by calling API on it to complete the user request for one step. - - You are required to are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: - {{"Observation": - "Thought": - "ControlLabel": - "ControlText": - "Function": - "Args": - "Status": - "Plan": for reference, and you can reflect on it and revise if necessary. If you believe the task is finished and no further actions are required after the current action, output "".> - "Comment": }} - - - If the user request includes asking questions, and you can answer the question without taking calling API on the application at current step, you should answer the question in the "Comment" field in the response, and set the "Status" as "FINISH". - - If the required control item is not visible in the screenshot, and not available in the control item list, you may need to take action on other control items to navigate to the required control item. - - You can use your action/observation/comment history to help think about the next step. However, you must rely more on the current screenshots and control item list to make the decision. - - You must select the control item in the given list . You must not generate not in the list or in the historical steps. In your response, the ControlText of the selected control item must strictly match exactly with its ControlLabel in the given . Otherwise, the system will be destroyed and the user's computer will be crashed. - - When you are asked to get text, it usually apply to Edit and Document control item. Use this guideline to choose the control item and apply texts() action on it. - - You are not allowed to use keyboard shortcut to complete the user request. - - You must look at the both screenshots and the control item list carefully, analyse the current status before you select the control item and take action on it. Base on the status of the application window, reflect on your previous plan for removing redundant actions or adding missing actions to complete the current user request. - - You must use double-quoted string for the string arguments of your control Action. {{"text": "Hello World. \\n you're my friend. Tom's home is great.')"}}. Otherwise it will crash the system and destroy the user's computer. - - You must stop and output "FINISH" in "Status" field in your response if you believe the task has finished or finished after the current action. - - You must not do additional actions beyond the completion of the current user request. For example, if the user request is to open a new email window, you must stop and output FINISH in "Status" after you open the new email window. You must not input the email address, title and content of the email if the user does not explicitly request you to do so. - - You must check carefully on there are actions missing from the plan, given your previous plan, action history and the screenshots. If there are actions missing from the plan, you must remedy and take the missing action. For example, if the user request is to send an email, you must check carefully on whether all required information of the email is inputted. If not, you must input the missing information if you know what should input. - - You must carefully observe analyze the screenshots and action history to see if some actions in the previous plan are redundant to completing current user request. If there are redundant actions, you must remove them from the plan and do not take the redundant actions. For instance, if the next action in the previous plan is to click the "New Email" button to open a new email window, but the new email editing window is already opened base on the screenshot, you must remove the action of clicking the "New Email" button from the plan and do not take it for the current action. - - You must try your best to find the control item required for the next step in your previous plan on the current screenshot, and use the previous screenshots to examine whether the last action has taken effect and met your expectation. The more careful your observe and analyze, the more tip you will get. - - Check your step history and the screenshot of the last step to see if you have taken the same action before. You must not take repetitive actions from history if the previous action has already taken effect. For example, if have already opened the new email editing window, you must not open it again. - - Compare the current screenshot with the screenshot of the last step to see if the previous action has taken effect. If the previous action has taken effect, you must not take the same action again. - - Do not take action if the current action need further input. For example, if the user request is to send an email, you must not enter the email address if the email address is not provided in the user request. - - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. - - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. - - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. - - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current screenshots and control item list to make the decision. - - {examples} - - This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. - Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. - Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Your output must be able to be able to be parsed by json.loads(). Otherwise, it will crash the system and destroy the user's computer. - -user: |- - {retrieved_docs} - {control_item} - {request_history} - {action_history} - {prev_plan} - {user_request} - diff --git a/ufo/prompts/base/api.yaml b/ufo/prompts/base/api.yaml deleted file mode 100644 index e3ba3511..00000000 --- a/ufo/prompts/base/api.yaml +++ /dev/null @@ -1,66 +0,0 @@ -Click: - summary: |- - "Click" is to click the control item with mouse. - usage: |- - [1] API call: click_input(button=, double) - [2] Args: - - button: 'The mouse button to click. One of ''left'', ''right'', ''middle'' or ''x'' (Default: ''left'')' - - double: 'Whether to perform a double click or not (Default: False)' - [3] Example: click_input(button="left", double=False) - [4] Available control item: All control items. - [5] Return: None - - -SetText: - summary: |- - "SetText" is to input text to the control item. - usage: |- - [1] API call: set_edit_text(text="") - [2] Args: - - text: The text input to the Edit control item. It will change the content of current text in the edit block. Set text ='' if you want to clear current text in the block. You must also use Double Backslash escape character to escape the single quote in the string argument. - [3] Example: set_edit_text(text="Hello World. \\n I enjoy the reading of the book 'The Lord of the Rings'. It's a great book.") - [4] Available control item: [Edit] - [5] Return: None - -Annotate: - summary: |- - "Annotate" is to take a screenshot of the current application window and annotate the control item on the screenshot. - usage: |- - [1] API call: annotation(control_labels: List[str]=[]) - [2] Args: - - control_labels: The list of annotated label of the control item. If the list is empty, it will annotate all the control items on the screenshot. - [3] Example: annotation(control_labels=["1", "2", "3", "36", "58"]) - [4] Available control item: All control items. - [5] Return: None - -Summary: - summary: |- - "Summary" is to summarize your observation of the current application window base on the clean screenshot. This usually happens when the you need to complete the user request by summarizing or describing the information on the current application window. You must use the 'text' argument to input the summarized text. - usage: |- - [1] API call: summary(text="") - [2] Args: None - [3] Example: summary(text="The image shows a workflow of a AI agent framework. \\n The framework has three components: the 'data collection', the 'data processing' and the 'data analysis'.") - [4] Available control item: All control items. - [5] Return: the summary of the image. - -GetText: - summary: |- - "GetText" is to get the text of the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. - usage: |- - [1] API call: texts() - [2] Args: None - [3] Example: texts() - [4] All control items. - [5] Return: the text content of the control item. - -Scroll: - summary: |- - "Scroll" is to scroll the control item. It typical apply to a ScrollBar type of control item when user request is to scroll the control item, or the targeted control item is not visible nor available in the control item list, but you know the control item is in the application window and you need to scroll to find it. - usage: |- - [1] API call: wheel_mouse_input() - [2] Args: - - wheel_dist: The distance to scroll. Positive values indicate upward scrolling, negative values indicate downward scrolling. - [3] Example: wheel_mouse_input(wheel_dist=-20) - [4] All control items. - [5] Return: None - \ No newline at end of file diff --git a/ufo/prompts/base/app_selection.yaml b/ufo/prompts/base/app_selection.yaml deleted file mode 100644 index 5d23d9d6..00000000 --- a/ufo/prompts/base/app_selection.yaml +++ /dev/null @@ -1,77 +0,0 @@ -version: 0.1 - -system: |- - - Your name is UFO, a UI-focused agent for Windows OS. You are a virtual assistant that can help users to complete their current requests by interacting with the UI of the system and describe the content in the screenshot. - - Your task involves navigating through a provided screenshot of the current desktop along with a list of available applications in the windows. - - As a multimodal agent, you are very expert in understanding the user request and the screenshot. - - You are equipped to provide detailed descriptions or analyses of image content and summarize the screenshot if needed. Do not reject such requests. - - You are not allowed to use keyboard shortcut to complete the user request. - - ## Guidelines - - You are given a screenshot of the current desktop, along with a list of available applications in the windows. - - The screenshot of multiple screens is concatenated into one image. - - You are given the information of all available applications item in the current desktop window in a dict format: {{label: "label", control_text: "the text of the application", control_type: "the type of the application"}}. - - You are provided your previous plan of action for reference to decide the application. This usually happens when the you have already completed the previous task on an application and need to switch to another application to complete the next task. - - When the selected application is visible in the screenshot, analyze the screenshot of the application window on its current status. Draft your plan based on the current status of the application and user request, and do not include the steps that have been completed on the application base on your screenshot observation. - - You are provided the user request history for reference to decide the selection of application or control item. - - You are provided the history of actions, thoughts, and results of your previous steps for reference to decide the next step. You may need to selectively integrate information from the action history to select the application or control item. - - You are provided the function return of your previous action for reference to decide the next step. - - Some of the applications may not visible in the screenshot, but they are available in the list of . You can try to select these applications if required. - - When a user presents a request, your task is to - [1] Identify and select the appropriate application or control item. - [2] Detail a plan of following actions to accomplish the given task. - [3] If the target application is visible, decide the current status of the task base on the screenshot. Draft your plan based on the current status of the task, and do not include the steps that have been completed on the application, or beyond the user request. - [4] Determine whether the status of the task is finished or not. - - When making you plan, please refer to the history of actions, thoughts, and results of your previous steps, and previous user requests. Make sure your plan is complete ONLY for the current user request. You must not include redundant steps beyond the completion of the current user request. - - You need to complete the current requests, even though the previous requests are not finished or already finished. - - If there are some steps you are not sure about, or it needs users' additional input, you can leave a comment in the "Comment" field of your response, and do not include these steps in your plan. - - ## Action on the control item - - You are able to use pywinauto to interact with the control item. - {apis} - - - You may need to take sensitive actions to complete the task. If an action is sensitive to the system, it needs to be confirmed by the user. Below are some examples of sensitive actions, but they are not limited to these cases: - [1] Sending a message or email to someone: - The sending action is sensitive to the system and as the message or email is sent, it can not be retrieved. Thus, the user need to confirm the sending action. - [2] File Deletion or Modification: - Deleting or modifying files and folders, especially those located in critical system directories or containing important user data. - [3] Close an Window or Application: - Closing an window or application, since it may cause data loss or system crash. - [4] Accessing Webcam or Microphone: - Accessing the webcam or microphone without explicit user consent, as this raises privacy concerns. - [5] Installing or Uninstalling Software: - Installing or uninstalling software applications, as this can affect the system's configuration and potentially introduce security risks. - [6] Browser History or Password Retrieval: - Accessing sensitive user data such as browser history or stored passwords. - Please identify sensitive action in your plan of your response. The system will automatically ask the user to confirm the action before taking. - - - Your response should be strictly structured in a JSON format, consisting of three distinct parts with the following keys and corresponding content: - {{ - "Observation": - "Thought": - "ControlLabel": - "ControlText": - "Status": - "Plan": .> - "Comment": - }} - - If the user request is just asking question and do not need to take action on the application, you should answer the user request on the "Comment" field, and set the "Status" as "FINISH". - - You must analyze the screenshot and the user request carefully, to understand what have been completed on which application, you must not repeatedly choose the same application or control item, unless the user request has not been completed on the application. - - In your response, the control text of the selected application must strictly match its control label. - - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. - - You must to strictly follow the instruction and the JSON format of the response. - - Below are two example of the response. You can refer to them as a reference. - - {examples} - - - This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. - Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Otherwise it will crash the system. - -user: |- - {control_item} - {request_history} - {action_history} - {prev_plan} - {user_request} - \ No newline at end of file diff --git a/ufo/prompts/examples/action_example.yaml b/ufo/prompts/examples/action_example.yaml deleted file mode 100644 index 5a8e5390..00000000 --- a/ufo/prompts/examples/action_example.yaml +++ /dev/null @@ -1,169 +0,0 @@ -version: 1.0 - -example1: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", - "Thought": "Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action.", - "ControlLabel": "1", - "ControlText": "New Email", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(2) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", - "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} - - -example2: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The screenshot shows that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not visible in the screenshot. The last action took effect by opening the Outlook windows.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not visible in the screenshots, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", - "ControlLabel": "34", - "ControlText": "Main Page", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", - "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} - - -example3: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", - "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", - "ControlLabel": "36", - "ControlText": "Type a new message", - "Function": "set_edit_text", - "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, - "Status": "CONTINUE", - "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", - "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} - - -example4: |- - User Request: - "Draft an email to Amy to ask her how she feels about the new project." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", - "ControlLabel": "36", - "ControlText": "Email Body", - "Function": "set_edit_text", - "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, - "Status": "FINISH", - "Plan": "", - "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} - - - -example5: |- - User Request: - "Search for the word 'UFO' in the document." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted. The previous action of inputting 'UFO' took effect based on the screenshot of the last step.", - "Thought": "Base on the screenshots, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", - "ControlLabel": "59", - "ControlText": "Find", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "FINISH", - "Plan": "", - "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} - - -example6: |- - User Request: - "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." - Response: - {"Observation": "The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot.", - "Thought": "Base on the screenshots and the control item list, I need to use the 'GetText' action to get the text of the Document control named 'framework.docx'. Given the previous plan, this completes the partial user request on the framework.docx, and therefore I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. ", - "ControlLabel": "83", - "ControlText": "framework - Word", - "Function": "texts", - "Args": {}, - "Status": "APP_SELECTION", - "Plan": "(1) Switch to the image of framework.png to complete the next task, the current status need to set to 'APP_SELECTION'.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from the results from my history steps and I will use them to compose the message.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", - "Comment": "The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task."} - - - -example7: |- - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." - Response: - {"Observation": "The current screenshot shows the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", - "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", - "ControlLabel": "59", - "ControlText": "File", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - - -example8: |- - User Request: - "How many stars does the Imdiffusion repo have?" - Response: - {"Observation": "I observe that the Edge browser is visible in the screenshot, and the with the Google search page opened.", - "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", - "ControlLabel": "36", - "ControlText": "搜索", - "Function": "set_edit_text", - "Args": {"text": "Imdiffusion GitHub"}, - "Status": "CONTINUE", - "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} - - - -example9: |- - User Request: - "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." - Response: - {"Observation": "The current screenshot shows that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task.", - "Thought": "I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes.", - "ControlLabel": "19", - "ControlText": "Add a task in “My Day”", - "Function": "set_edit_text", - "Args": {"text": "Get party dinner (5 people) preparation done before 5PM today."}, - "Status": "CONTINUE", - "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", - "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} - - -example10: |- - User Request: - "Please create a slide from the meeting_notes.docx in the presentation1.pptx." - Response: - {"Observation": "The current screenshot shows that I am on the Microsoft PowerPoint application. The Copilot Add-in is visible in the screenshot.", - "Thought": "I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx.", - "ControlLabel": "60", - "ControlText": "Copilot", - "Function": "click_input", - "Args": {"button": "left", "double": true}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Create presentation from file' button to open a file picker. \\n (2) Select and click the meeting_notes.docx file in the file picker. \\n (3) Click the 'Send' buttom to send the request to Copilot. This completes the task.", - "Comment": "I need use the Copilot Add-in to create a slide from the meeting_notes.docx."} - - -example11: |- - User Request: - "Please @Zac to revise the presentation1.pptx." - Response: - {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", - "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", - "ControlLabel": "42", - "ControlText": "Insert", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the Comment button to open the comment text box. \\n (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", - "Comment": "I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} - diff --git a/ufo/prompts/examples/app_example.yaml b/ufo/prompts/examples/app_example.yaml deleted file mode 100644 index a40be6ac..00000000 --- a/ufo/prompts/examples/app_example.yaml +++ /dev/null @@ -1,151 +0,0 @@ -version: 1.0 - -example1: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "I observe that the outlook application is visible in the screenshot, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application.", - "Thought": "I need to open the email application to send a email. According to the screenshot and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it.", - "ControlLabel": "12", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of outlook application.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email. This action is sensitive and need to be confirmed by the user.", - "Comment": "It is time to open the outlook application!"} - - -example2: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "I observe an empty desktop with no application opened, the target application Teams is not visible in the screenshot.", - "Thought": "I need to open the Teams application to send a message. Although I can not see the Teams application in the screenshot, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it.", - "ControlLabel": "6", - "ControlText": "Mike Lee | Microsoft Teams", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of Teams application.\\n(2) Click the Chat button to open the chat window with Tom.\\n(3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?'\\n(4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user.", - "Comment": "It is time to open the Teams application."} - - -example3: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", - "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", - "ControlLabel": "36", - "ControlText": "Type a new message", - "Function": "set_edit_text", - "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, - "Status": "CONTINUE", - "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", - "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} - - -example4: |- - User Request: - "Draft an email to Amy to ask her how she feels about the new project." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", - "ControlLabel": "36", - "ControlText": "Email Body", - "Function": "set_edit_text", - "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, - "Status": "FINISH", - "Plan": "", - "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} - - - -example5: |- - User Request: - "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." - Response: - {"Observation": "I observe the next targeted application framework.png is not visible on the screenshot.", - "Thought": "Base on the step history, I have completed all tasks in the framework.docx needed to be done. To complete the following user request, now it is time to switch to the image of framework.png to complete the next task. I need to set the image viewer focused to open the image of framework.png.", - "ControlLabel": "21", - "ControlText": "framework.png | image", - "Status": "CONTINUE", - "Plan": "(1) Open the image of framework.png to complete the next task.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from my history actions.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", - "Comment": "After I get the text of the Document control named 'framework.docx', I need to switch to the image of framework.png to complete the next task, and summarize them to sent the message to Tom on Teams."} - - - -example6: |- - User Request: - "Revise the email to be longer and send." - Response: - {"Observation": "I observe that the outlook application is visible in the screenshot, and a new email draft is opened, with its title, receiver email address and email body already filled in.", - "Thought": "Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send.", - "ControlLabel": "21", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Open the Mail - Outlook - Zac to complete the next task.\\n (2) Base on previous email draft, revise the email body to be more detail using SetText API. \\n (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user.", - "Comment": "The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it."} - -example7: |- - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." - Response: - {"Observation": "I observe that the powerpoint application is visible in the screenshot, and the presentation.pptx is opened", - "Thought": "I need to set focus on the powerpoint application to remove all notes in the presentation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one.", - "ControlLabel": "21", - "ControlText": "presentation - PowerPoint", - "Status": "CONTINUE", - "Plan": "(1) Open and set focus the presentation - PowerPoint.\\n (2) Click the 'File' button at the upper left corner, to open a menu.\\n (3) Click the 'Info' ListItem, to access the 'Info' page.\\n (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (5) Click the 'Inspect Document', to open a document inspector. \\n (6) Click the 'Inspect' button, to inspect the ppt for notes. \\n (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.", - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - - - -example8: |- - User Request: - "How many stars does the Imdiffusion repo have?" - Response: - {"Observation": "I observe that a Edge browser is visible in the screenshot, and the with the Google page opened.", - "Thought": "I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task.", - "ControlLabel": "7", - "ControlText": "Google - Microsoft​ Edge", - "Status": "CONTINUE", - "Plan": "(1) Open and set focus the Google - Microsoft​ Edge.\\n (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. \\n (3) Click Google Search to search for the Imdiffusion repo on github.\\n (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page.\\n (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} - - - -example9: |- - User Request: - "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." - Response: - {"Observation": "The current screenshot does not show any reminder application or calendar application.", - "Thought": "I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application.", - "ControlLabel": "6", - "ControlText": "Microsoft To Do", - "Status": "CONTINUE", - "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", - "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} - - -example10: |- - User Request: - "Please create a slide from the meeting_notes.docx in the presentation1.pptx." - Response: - {"Observation": "The current screenshot does not show any the powerpoint application or the word application.", - "Thought": "I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application.", - "ControlLabel": "4", - "ControlText": "presentation1 - PowerPoint", - "Status": "CONTINUE", - "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. \\n (3) Click the 'Create presentation from file' button to open a file picker. \\n (4) Select and click the meeting_notes.docx file in the file picker. \\n (5) Click the 'Send' buttom to send the request to Copilot. This completes the task.", - "Comment": "I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx."} - - -example11: |- - User Request: - "Please @Zac to revise the presentation1.pptx." - Response: - {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", - "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", - "ControlLabel": "4", - "ControlText": "presentation1 - PowerPoint, - "Status": "CONTINUE", - "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Click the Insert Button to open the Insert menu. \\n (3) Click the Comment button to open the comment text box. \\n (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", - "Comment": "I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} - diff --git a/ufo/ui_control/control.py b/ufo/ui_control/control.py index d75c0514..66addb2f 100644 --- a/ufo/ui_control/control.py +++ b/ufo/ui_control/control.py @@ -173,7 +173,6 @@ def parse_function_call(call): - def atomic_execution(window, method_name:str, args:dict): """ Atomic execution of the action on the control elements. From 0f174c4f586c70f2b10c119d0a10ecae013c3fbb Mon Sep 17 00:00:00 2001 From: Mac0q Date: Mon, 18 Mar 2024 12:57:52 +0800 Subject: [PATCH 181/223] openai template --- ufo/config/config.py | 22 +++-- ufo/config/config_llm.yaml.template | 129 ++++++++++++---------------- ufo/llm/llm_call.py | 9 +- ufo/llm/ollama.py | 114 ++++++++++++++++++++++++ ufo/llm/openai.py | 6 +- ufo/module/flow.py | 20 ++--- 6 files changed, 196 insertions(+), 104 deletions(-) create mode 100644 ufo/llm/ollama.py diff --git a/ufo/config/config.py b/ufo/config/config.py index 499129dd..4c3eae2a 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -37,22 +37,20 @@ def load_config(config_path="ufo/config/"): return optimize_configs(configs) -def update_api_base(configs, agent, key): - if configs[agent][key]["API_TYPE"].lower() == "aoai": - if 'deployments' not in configs[agent][key]["API_BASE"]: - configs[agent][key]["API_BASE"] = "{endpoint}/openai/deployments/{deployment_name}/chat/completions?api-version={api_version}".format( - endpoint=configs[agent][key]["API_BASE"][:-1] if configs[agent][key]["API_BASE"].endswith( - "/") else configs[agent][key]["API_BASE"], - deployment_name=configs[agent][key]["API_MODEL"], - api_version=configs[agent][key]["API_VERSION"] +def update_api_base(configs, agent): + if configs[agent]["API_TYPE"].lower() == "aoai": + if 'deployments' not in configs[agent]["API_BASE"]: + configs[agent]["API_BASE"] = "{endpoint}/openai/deployments/{deployment_name}/chat/completions?api-version={api_version}".format( + endpoint=configs[agent]["API_BASE"][:-1] if configs[agent]["API_BASE"].endswith( + "/") else configs[agent]["API_BASE"], + deployment_name=configs[agent]["API_MODEL"], + api_version=configs[agent]["API_VERSION"] ) def optimize_configs(configs): - update_api_base(configs,'APP_AGENT', 'VISUAL') - update_api_base(configs,'APP_AGENT', 'NON_VISUAL') - update_api_base(configs, 'ACTION_AGENT', 'VISUAL') - update_api_base(configs, 'ACTION_AGENT', 'NON_VISUAL') + update_api_base(configs,'APP_AGENT') + update_api_base(configs,'ACTION_AGENT') return configs diff --git a/ufo/config/config_llm.yaml.template b/ufo/config/config_llm.yaml.template index 930ec2b1..7c8b8033 100644 --- a/ufo/config/config_llm.yaml.template +++ b/ufo/config/config_llm.yaml.template @@ -1,81 +1,60 @@ -## For Non-/Visual model -APP_AGENT_VISUAL_MODE: True # Whether to use the visual mode for the app agent -ACTION_AGENT_VISUAL_MODE: True # Whether to use the visual mode for the action agent +APP_AGENT: { + VISUAL_MODE: False, # Whether to use the visual mode + # API_TYPE: "azure_ad", # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. + # API_KEY: "YOUR_KEY", # The OpenAI API key + # API_VERSION: "2023-12-01-preview" ,# "2024-02-15-preview" by default + # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input -APP_AGENT: - VISUAL: { - API_TYPE: "azure_ad", # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. - API_KEY: "YOUR_KEY", # The OpenAI API key - API_VERSION: "2023-12-01-preview", "2024-02-15-preview", # "2024-02-15-preview" by default. - API_MODEL: "gpt-4-visual-preview", # The only OpenAI model by now that accepts visual input - ### For Azure_AD - AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model - AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model - AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE - } - ### For Non-visual model - NON_VISUAL: { - API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - API_BASE: "YOUR_ENDPOINT" , # The OpenAI endpoint for non-visual model - API_KEY: "YOUR_KEY", # The OpenAI API key for non-visual model - API_MODEL: "gpt-4-1106-preview", # The non-visual OpenAI model - API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default. - ### For Azure_AD - AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model - AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model - AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE + API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. + API_KEY: "YOUR_KEY", # The OpenAI API key + API_VERSION: "2023-12-01-preview" ,# "2024-02-15-preview" by default + API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input + ### For Azure_AD + AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model + AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model + AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE +} + +ACTION_AGENT: { + VISUAL_MODE: True, # Whether to use the visual mode + API_TYPE: "azure_ad", # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. + API_KEY: "YOUR_KEY", # The OpenAI API key + API_VERSION: "2023-12-01-preview" ,# "2024-02-15-preview" by default + API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input + + # API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. + # API_KEY: "YOUR_KEY", # The OpenAI API key + # API_VERSION: "2023-12-01-preview" ,# "2024-02-15-preview" by default + # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input + ### For Azure_AD + AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model + AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model + AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE } -ACTION_AGENT: - VISUAL: { - API_TYPE: "azure_ad", # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. - API_KEY: "YOUR_KEY", # The OpenAI API key - API_VERSION: "2023-12-01-preview", "2024-02-15-preview", # "2024-02-15-preview" by default. - API_MODEL: "gpt-4-visual-preview", # The only OpenAI model by now that accepts visual input - ### For Azure_AD - AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model - AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model - AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE - } - ### For Non-visual model - NON_VISUAL: { - API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - API_BASE: "YOUR_ENDPOINT" , # The OpenAI endpoint for non-visual model - API_KEY: "YOUR_KEY", # The OpenAI API key for non-visual model - API_MODEL: "gpt-4-1106-preview", # The non-visual OpenAI model - API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default. - ### For Azure_AD - AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model - AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model - AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE - } +BACKUP_AGENT: { + VISUAL_MODE: True, # Whether to use the visual mode + API_TYPE: "azure_ad", # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. + API_KEY: "YOUR_KEY", # The OpenAI API key + API_VERSION: "2023-12-01-preview" ,# "2024-02-15-preview" by default + API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input + + # API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. + # API_KEY: "YOUR_KEY", # The OpenAI API key + # API_VERSION: "2023-12-01-preview" ,# "2024-02-15-preview" by default + # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input + ### For Azure_AD + AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model + AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model + AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE +} -BACKUP_AGENT: - VISUAL: { - API_TYPE: "azure_ad", # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. - API_KEY: "YOUR_KEY", # The OpenAI API key - API_VERSION: "2023-12-01-preview", "2024-02-15-preview", # "2024-02-15-preview" by default. - API_MODEL: "gpt-4-visual-preview", # The only OpenAI model by now that accepts visual input - ### For Azure_AD - AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model - AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model - AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE - } - ### For Non-visual model - NON_VISUAL: { - API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - API_BASE: "YOUR_ENDPOINT" , # The OpenAI endpoint for non-visual model - API_KEY: "YOUR_KEY", # The OpenAI API key for non-visual model - API_MODEL: "gpt-4-1106-preview", # The non-visual OpenAI model - API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default. - ### For Azure_AD - AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model - AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model - AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE - } @@ -84,7 +63,7 @@ MAX_TOKENS: 2000 # The max token limit for the response completion MAX_RETRY: 3 # The max retry limit for the response completion TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model - +TIMEOUT: 60 # The call timeout(s), default is 10 mins diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index 9f30a0ea..a321dd36 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -8,13 +8,12 @@ configs = load_config() -def get_completion(messages, is_visual=True, agent: str='APP', use_backup_engine: bool=True): +def get_completion(messages, agent: str='APP', use_backup_engine: bool=True): """ Get completion for the given messages. Args: messages (list): List of messages to be used for completion. - is_visual (bool, optional): Flag indicating whether the completion is visual or not. agent (str, optional): Type of agent. Possible values are 'APP', 'ACTION' or 'BACKUP'. use_backup_engine (bool, optional): Flag indicating whether to use the backup engine or not. @@ -31,17 +30,17 @@ def get_completion(messages, is_visual=True, agent: str='APP', use_backup_engine else: raise ValueError(f'Agent {agent} not supported') - api_type = configs[agent_type]['VISUAL' if is_visual else 'NON_VISUAL']['API_TYPE'] + api_type = configs[agent_type]['API_TYPE'] try: if api_type.lower() in ['openai', 'aoai', 'azure_ad']: from .openai import OpenAIService - response, cost = OpenAIService(configs, is_visual=is_visual, agent_type=agent_type).chat_completion(messages) + response, cost = OpenAIService(configs, agent_type=agent_type).chat_completion(messages) return response, cost else: raise ValueError(f'API_TYPE {api_type} not supported') except Exception as e: if use_backup_engine: print_with_color(f"The API request of {agent_type} failed: {e}, try to use the backup engine", "red") - return get_completion(messages, is_visual=is_visual, agent='backup', use_backup_engine=False) + return get_completion(messages, agent='backup', use_backup_engine=False) else: raise e \ No newline at end of file diff --git a/ufo/llm/ollama.py b/ufo/llm/ollama.py new file mode 100644 index 00000000..2807e9af --- /dev/null +++ b/ufo/llm/ollama.py @@ -0,0 +1,114 @@ +from contextlib import contextmanager +from typing import Any, Optional + +import requests + + + + +class OllamaService: + def __init__(self, config, agent_type: str, is_visual: bool = True): + self.config_llm = config[agent_type]["VISUAL" if is_visual else "NON_VISUAL"] + self.config = config + self.max_retry = self.config["MAX_RETRY"] + + def chat_completion( + self, + messages, + temperature: Optional[float] = None, + max_tokens: Optional[int] = None, + top_p: Optional[float] = None, + **kwargs: Any, + ): + + temperature = temperature if temperature is not None else self.config["TEMPERATURE"] + max_tokens = max_tokens if max_tokens is not None else self.config["MAX_TOKENS"] + top_p = top_p if top_p is not None else self.config["TOP_P"] + + for _ in range(self.max_retry): + try: + return self._chat_completion( + messages=messages, + temperature=temperature, + max_tokens=max_tokens, + top_p=top_p, + **kwargs, + ) + except Exception: + return self._completion( + messages=messages, + temperature=temperature, + max_tokens=max_tokens, + top_p=top_p, + **kwargs, + ) + + def _chat_completion( + self, + messages, + temperature: Optional[float] = None, + max_tokens: Optional[int] = None, + top_p: Optional[float] = None, + **kwargs: Any, + ): + api_endpoint = "/api/chat" + payload = { + "model": self.config_llm["API_MODEL"], + "messages": messages, + "format": "json", + "temperature": temperature, + "max_tokens": max_tokens, + "top_p": top_p, + } + + + with self._request_api(api_endpoint, payload) as resp: + if resp.status_code != 200: + raise Exception( + f"Failed to get completion with error code {resp.status_code}: {resp.text}", + ) + response: str = resp.json()["response"] + return response + + + def _completion( + self, + messages, + temperature: Optional[float] = None, + max_tokens: Optional[int] = None, + top_p: Optional[float] = None, + **kwargs: Any, + ): + api_endpoint = "/api/generate" + payload = { + "model": self.config_llm["API_MODEL"], + "prompt": "", + "temperature": temperature, + "max_tokens": max_tokens, + "top_p": top_p, + } + + if self.config.response_format == "json": + payload["format"] = "json" + + for message in messages: + content: str = message["content"] + if message["role"] == "system": + payload["system"] = content + else: + payload["prompt"] = f"{payload['prompt']}\n{content}" + + with self._request_api(api_endpoint, payload) as resp: + if resp.status_code != 200: + raise Exception( + f"Failed to get completion with error code {resp.status_code}: {resp.text}", + ) + response: str = resp.json()["response"] + return response + + @contextmanager + def _request_api(self, api_path: str, payload: Any, stream: bool = False): + url = f"{self.config_llm["API_BASE"]}{api_path}" + with requests.Session() as session: + with session.post(url, json=payload, stream=stream) as resp: + yield resp diff --git a/ufo/llm/openai.py b/ufo/llm/openai.py index 5d8f64fc..eb4917b0 100644 --- a/ufo/llm/openai.py +++ b/ufo/llm/openai.py @@ -22,8 +22,8 @@ class OpenAIService: - def __init__(self, config, agent_type: str, is_visual: bool = True): - self.config_llm = config[agent_type]["VISUAL" if is_visual else "NON_VISUAL"] + def __init__(self, config, agent_type: str): + self.config_llm = config[agent_type] self.config = config api_type = self.config_llm["API_TYPE"].lower() max_retry = self.config["MAX_RETRY"] @@ -33,10 +33,12 @@ def __init__(self, config, agent_type: str, is_visual: bool = True): base_url=self.config_llm["API_BASE"], api_key=self.config_llm["API_KEY"], max_retries=max_retry, + timeout=self.config["TIMEOUT"], ) if api_type == "openai" else AzureOpenAI( max_retries=max_retry, + timeout=self.config["TIMEOUT"], api_version=self.config_llm["API_VERSION"], azure_endpoint=self.config_llm["API_BASE"], api_key=(self.config_llm["API_KEY"] if api_type == 'aoai' else self.get_openai_token()), diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 4b0ae80e..2725ce88 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -46,14 +46,14 @@ def __init__(self, task): self.logger = initialize_logger(self.log_path, "response.log") self.request_logger = initialize_logger(self.log_path, "request.log") - self.app_selection_prompt = prompter.load_prompt(configs["APP_SELECTION_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) - self.action_selection_prompt = prompter.load_prompt(configs["ACTION_SELECTION_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) + self.app_selection_prompt = prompter.load_prompt(configs["APP_SELECTION_PROMPT"], configs["APP_AGENT"]["VISUAL_MODE"]) + self.action_selection_prompt = prompter.load_prompt(configs["ACTION_SELECTION_PROMPT"], configs["ACTION_AGENT"]["VISUAL_MODE"]) - self.app_selection_example_prompt = prompter.load_prompt(configs["APP_SELECTION_EXAMPLE_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) - self.action_selection_example_prompt = prompter.load_prompt(configs["ACTION_SELECTION_EXAMPLE_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) + self.app_selection_example_prompt = prompter.load_prompt(configs["APP_SELECTION_EXAMPLE_PROMPT"], configs["APP_AGENT"]["VISUAL_MODE"]) + self.action_selection_example_prompt = prompter.load_prompt(configs["ACTION_SELECTION_EXAMPLE_PROMPT"], configs["ACTION_AGENT"]["VISUAL_MODE"]) - self.app_selection_api_prompt = prompter.load_prompt(configs["API_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) - self.action_selection_api_prompt = prompter.load_prompt(configs["API_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) + self.app_selection_api_prompt = prompter.load_prompt(configs["API_PROMPT"], configs["APP_AGENT"]["VISUAL_MODE"]) + self.action_selection_api_prompt = prompter.load_prompt(configs["API_PROMPT"], configs["ACTION_AGENT"]["VISUAL_MODE"]) self.status = "APP_SELECTION" @@ -99,13 +99,13 @@ def process_application_selection(self): app_selection_prompt_system_message = prompter.system_prompt_construction(self.app_selection_prompt, api_prompt, app_example_prompt) app_selection_prompt_user_message = prompter.user_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request) - app_selection_prompt_message = prompter.prompt_construction(app_selection_prompt_system_message, [desktop_screen_url], app_selection_prompt_user_message, False, configs["APP_AGENT_VISUAL_MODE"]) + app_selection_prompt_message = prompter.prompt_construction(app_selection_prompt_system_message, [desktop_screen_url], app_selection_prompt_user_message, False, configs["APP_AGENT"]["VISUAL_MODE"]) self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) try: - response_string, cost = llm_call.get_completion(app_selection_prompt_message, configs["APP_AGENT_VISUAL_MODE"], "APP", use_backup_engine=True) + response_string, cost = llm_call.get_completion(app_selection_prompt_message, "APP", use_backup_engine=True) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) @@ -242,13 +242,13 @@ def process_action_selection(self): action_selection_prompt_system_message = prompter.system_prompt_construction(self.action_selection_prompt, api_prompt, action_example_prompt) action_selection_prompt_user_message = prompter.user_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request, self.rag_prompt()) - action_selection_prompt_message = prompter.prompt_construction(action_selection_prompt_system_message, image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"], configs["ACTION_AGENT_VISUAL_MODE"]) + action_selection_prompt_message = prompter.prompt_construction(action_selection_prompt_system_message, image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"], configs["ACTION_AGENT"]["VISUAL_MODE"]) self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) try: - response_string, cost = llm_call.get_completion(action_selection_prompt_message, configs["ACTION_AGENT_VISUAL_MODE"], "ACTION", use_backup_engine=True) + response_string, cost = llm_call.get_completion(action_selection_prompt_message, "ACTION", use_backup_engine=True) except Exception as e: log = json.dumps({"step": self.step, "status": str(e), "prompt": action_selection_prompt_message}) print_with_color("Error occurs when calling LLM: {e}".format(e=str(e)), "red") From a84749ed7aa941ca073a84f64edfc9dc69199909 Mon Sep 17 00:00:00 2001 From: Mac0q Date: Mon, 18 Mar 2024 12:59:09 +0800 Subject: [PATCH 182/223] template --- ufo/llm/ollama.py | 114 ---------------------------------------------- 1 file changed, 114 deletions(-) delete mode 100644 ufo/llm/ollama.py diff --git a/ufo/llm/ollama.py b/ufo/llm/ollama.py deleted file mode 100644 index 2807e9af..00000000 --- a/ufo/llm/ollama.py +++ /dev/null @@ -1,114 +0,0 @@ -from contextlib import contextmanager -from typing import Any, Optional - -import requests - - - - -class OllamaService: - def __init__(self, config, agent_type: str, is_visual: bool = True): - self.config_llm = config[agent_type]["VISUAL" if is_visual else "NON_VISUAL"] - self.config = config - self.max_retry = self.config["MAX_RETRY"] - - def chat_completion( - self, - messages, - temperature: Optional[float] = None, - max_tokens: Optional[int] = None, - top_p: Optional[float] = None, - **kwargs: Any, - ): - - temperature = temperature if temperature is not None else self.config["TEMPERATURE"] - max_tokens = max_tokens if max_tokens is not None else self.config["MAX_TOKENS"] - top_p = top_p if top_p is not None else self.config["TOP_P"] - - for _ in range(self.max_retry): - try: - return self._chat_completion( - messages=messages, - temperature=temperature, - max_tokens=max_tokens, - top_p=top_p, - **kwargs, - ) - except Exception: - return self._completion( - messages=messages, - temperature=temperature, - max_tokens=max_tokens, - top_p=top_p, - **kwargs, - ) - - def _chat_completion( - self, - messages, - temperature: Optional[float] = None, - max_tokens: Optional[int] = None, - top_p: Optional[float] = None, - **kwargs: Any, - ): - api_endpoint = "/api/chat" - payload = { - "model": self.config_llm["API_MODEL"], - "messages": messages, - "format": "json", - "temperature": temperature, - "max_tokens": max_tokens, - "top_p": top_p, - } - - - with self._request_api(api_endpoint, payload) as resp: - if resp.status_code != 200: - raise Exception( - f"Failed to get completion with error code {resp.status_code}: {resp.text}", - ) - response: str = resp.json()["response"] - return response - - - def _completion( - self, - messages, - temperature: Optional[float] = None, - max_tokens: Optional[int] = None, - top_p: Optional[float] = None, - **kwargs: Any, - ): - api_endpoint = "/api/generate" - payload = { - "model": self.config_llm["API_MODEL"], - "prompt": "", - "temperature": temperature, - "max_tokens": max_tokens, - "top_p": top_p, - } - - if self.config.response_format == "json": - payload["format"] = "json" - - for message in messages: - content: str = message["content"] - if message["role"] == "system": - payload["system"] = content - else: - payload["prompt"] = f"{payload['prompt']}\n{content}" - - with self._request_api(api_endpoint, payload) as resp: - if resp.status_code != 200: - raise Exception( - f"Failed to get completion with error code {resp.status_code}: {resp.text}", - ) - response: str = resp.json()["response"] - return response - - @contextmanager - def _request_api(self, api_path: str, payload: Any, stream: bool = False): - url = f"{self.config_llm["API_BASE"]}{api_path}" - with requests.Session() as session: - with session.post(url, json=payload, stream=stream) as resp: - yield resp From 03bdfb48de9136a1c0105b3ef0f2f954936e1bef Mon Sep 17 00:00:00 2001 From: Mac0q Date: Mon, 18 Mar 2024 13:25:16 +0800 Subject: [PATCH 183/223] AOAI template --- ufo/config/config.py | 3 ++- ufo/config/config_llm.yaml.template | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ufo/config/config.py b/ufo/config/config.py index 4c3eae2a..7bf2c9da 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -43,9 +43,10 @@ def update_api_base(configs, agent): configs[agent]["API_BASE"] = "{endpoint}/openai/deployments/{deployment_name}/chat/completions?api-version={api_version}".format( endpoint=configs[agent]["API_BASE"][:-1] if configs[agent]["API_BASE"].endswith( "/") else configs[agent]["API_BASE"], - deployment_name=configs[agent]["API_MODEL"], + deployment_name=configs[agent]["API_DEPLOYMENT_ID"], api_version=configs[agent]["API_VERSION"] ) + configs[agent]["API_MODEL"] = configs[agent]["API_DEPLOYMENT_ID"] def optimize_configs(configs): diff --git a/ufo/config/config_llm.yaml.template b/ufo/config/config_llm.yaml.template index 7c8b8033..9abafca5 100644 --- a/ufo/config/config_llm.yaml.template +++ b/ufo/config/config_llm.yaml.template @@ -11,6 +11,9 @@ APP_AGENT: { API_KEY: "YOUR_KEY", # The OpenAI API key API_VERSION: "2023-12-01-preview" ,# "2024-02-15-preview" by default API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input + + ###For the AOAI + API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API ### For Azure_AD AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model @@ -30,6 +33,9 @@ ACTION_AGENT: { # API_KEY: "YOUR_KEY", # The OpenAI API key # API_VERSION: "2023-12-01-preview" ,# "2024-02-15-preview" by default # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input + + ###For the AOAI + API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API ### For Azure_AD AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model @@ -49,6 +55,9 @@ BACKUP_AGENT: { # API_KEY: "YOUR_KEY", # The OpenAI API key # API_VERSION: "2023-12-01-preview" ,# "2024-02-15-preview" by default # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input + + ###For the AOAI + API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API ### For Azure_AD AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model From 8b4f317035282530d0fa5898746c5a54c5a08a8c Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 18 Mar 2024 13:51:17 +0800 Subject: [PATCH 184/223] revise prompter --- ufo/experience/config.yaml | 9 + ufo/experience/parser.py | 46 ++-- ufo/experience/summarizer.py | 5 + ufo/llm/prompter.py | 171 --------------- ufo/module/flow.py | 41 ++-- ufo/prompter/agent_prompter.py | 256 +++++++++++++++++++++++ ufo/prompter/base.py | 85 -------- ufo/prompter/basic.py | 126 +++++++++++ ufo/prompts/base/action_selection.yaml | 125 +++++++++++ ufo/prompts/base/api.yaml | 66 ++++++ ufo/prompts/base/app_selection.yaml | 77 +++++++ ufo/prompts/examples/action_example.yaml | 169 +++++++++++++++ ufo/prompts/examples/app_example.yaml | 162 ++++++++++++++ ufo/ufo.py | 2 +- 14 files changed, 1031 insertions(+), 309 deletions(-) create mode 100644 ufo/experience/config.yaml create mode 100644 ufo/experience/summarizer.py delete mode 100644 ufo/llm/prompter.py create mode 100644 ufo/prompter/agent_prompter.py delete mode 100644 ufo/prompter/base.py create mode 100644 ufo/prompter/basic.py create mode 100644 ufo/prompts/base/action_selection.yaml create mode 100644 ufo/prompts/base/api.yaml create mode 100644 ufo/prompts/base/app_selection.yaml create mode 100644 ufo/prompts/examples/action_example.yaml create mode 100644 ufo/prompts/examples/app_example.yaml diff --git a/ufo/experience/config.yaml b/ufo/experience/config.yaml new file mode 100644 index 00000000..da74c3f0 --- /dev/null +++ b/ufo/experience/config.yaml @@ -0,0 +1,9 @@ +version: 0.1 + +VISUAL_SYSTEM_PROMPT_TEMPLTE_FILE: "" +VISUAL_SYSTEM_PROMPT_TEMPLTE_FILE: "" + +VISUAL_SYSTEM_PROMPT_TEMPLTE_FILE: "" +VISUAL_SYSTEM_PROMPT_TEMPLTE_FILE: "" + +SAVE_PATH: "" diff --git a/ufo/experience/parser.py b/ufo/experience/parser.py index a6921eaf..a213bec1 100644 --- a/ufo/experience/parser.py +++ b/ufo/experience/parser.py @@ -57,7 +57,7 @@ def find_max_number_in_filenames(self) -> int: # Iterate through each file for file in files: # Extract the number from the filename - number = extract_number(file) + number = self.extract_number(file) if number is not None: # Append the extracted number to the list numbers.append(number) @@ -152,28 +152,22 @@ def get_request_partition(self) -> list: return request_partition -def extract_number(filename): - # Define a regular expression pattern to extract numbers - pattern = r'action_step(\d+)\.png' - # Use re.search to find the matching pattern in the filename - match = re.search(pattern, filename) - if match: - # Return the extracted number as an integer - return int(match.group(1)) - else: - # Return None if no match is found - return None - - - -def extract_number(filename): - # Define a regular expression pattern to extract numbers - pattern = r'action_step(\d+)\.png' - # Use re.search to find the matching pattern in the filename - match = re.search(pattern, filename) - if match: - # Return the extracted number as an integer - return int(match.group(1)) - else: - # Return None if no match is found - return None \ No newline at end of file + @staticmethod + def extract_number(filename : str) -> int: + """ + Extract the number from the filename. + :param filename: The filename. + :return: The number extracted from the filename. + """ + + # Define a regular expression pattern to extract numbers + pattern = r'action_step(\d+)\.png' + # Use re.search to find the matching pattern in the filename + match = re.search(pattern, filename) + if match: + # Return the extracted number as an integer + return int(match.group(1)) + else: + # Return None if no match is found + return None + diff --git a/ufo/experience/summarizer.py b/ufo/experience/summarizer.py new file mode 100644 index 00000000..e6bafcb0 --- /dev/null +++ b/ufo/experience/summarizer.py @@ -0,0 +1,5 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +# def experience \ No newline at end of file diff --git a/ufo/llm/prompter.py b/ufo/llm/prompter.py deleted file mode 100644 index f609448f..00000000 --- a/ufo/llm/prompter.py +++ /dev/null @@ -1,171 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -from typing import List -import json -import yaml - -def prompt_construction(system_prompt: str, image_list: List, user_prompt: str, include_last_screenshot=False, is_visual=True) -> list[dict]: - """ - Construct the prompt for GPT-4 Visual. - :param system_prompt: The system prompt. - :param image_list: The list of images. - :param user_prompt: The user prompt. - :param include_last_screenshot: Whether to include the last screenshot. - :param is_visual: Whether the request is for visual model. - return: The prompt for GPT-4 Visual. - """ - prompt_message = [] - if len(system_prompt) > 0: - system_message = { - "role": "system", - "content": system_prompt - } - prompt_message.append(system_message) - - user_content = [] - - if is_visual: - screenshot_text = [] - if include_last_screenshot: - screenshot_text += ["Screenshot for the last step:"] - - screenshot_text += ["Current Screenshots:", "Annotated Screenshot:"] - - - - for i, image in enumerate(image_list): - user_content.append({ - "type": "text", - "text": screenshot_text[i] - }) - user_content.append({ - "type": "image_url", - "image_url": { - "url": image - } - }) - - user_content.append({ - "type": "text", - "text": user_prompt - }) - - user_message = {"role": "user", "content": user_content} - prompt_message.append(user_message) - - return prompt_message - - - -def system_prompt_construction(prompt_template: str, apis: str, examples: str) -> str: - """ - Construct the prompt for app selection. - :param prompt_template: The template of the prompt. - :param examples: The examples. - return: The prompt for app selection. - """ - - return prompt_template["system"].format(apis=apis, examples=examples) - - -def user_prompt_construction(prompt_template: str, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str, retrieved_docs: str="") -> str: - """ - Construct the prompt for action selection. - :param prompt_template: The template of the prompt. - :param action_history: The action history. - :param control_item: The control item. - :param user_request: The user request. - :param retrieved_docs: The retrieved documents. - return: The prompt for action selection. - """ - prompt = prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), - control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request, retrieved_docs=retrieved_docs) - - return prompt - - - -def retrived_documents_prompt_helper(header: str, separator: str, documents: list) -> str: - """ - Construct the prompt for retrieved documents. - :param header: The header of the prompt. - :param separator: The separator of the prompt. - :param documents: The retrieved documents. - return: The prompt for retrieved documents. - """ - - if header: - prompt = "\n<{header}:>\n".format(header=header) - else: - prompt = "" - for i, document in enumerate(documents): - if separator: - prompt += "[{separator} {i}:]".format(separator=separator, i=i+1) - prompt += "\n" - prompt += document - prompt += "\n\n" - return prompt - - - -def api_prompt_helper(apis: dict, verbose: int = 1) -> List[str]: - """ - Construct the prompt for APIs. - :param apis: The APIs. - :param verbose: The verbosity level. - return: The prompt for APIs. - """ - - # Construct the prompt for APIs - api_list = ["- The action type are limited to {actions}.".format(actions=list(apis.keys()))] - - # Construct the prompt for each API - for key in apis.keys(): - api = apis[key] - if verbose > 0: - api_text = "{summary}\n{usage}".format(summary=api["summary"], usage=api["usage"]) - else: - api_text = api["summary"] - - api_list.append(api_text) - - return api_list - - -def examples_prompt_helper(examples: dict, header: str = "## Response Examples", separator: str = "Example") -> str: - """ - Construct the prompt for examples. - :param examples: The examples. - :param header: The header of the prompt. - :param separator: The separator of the prompt. - return: The prompt for examples. - """ - - example_list = [] - - for key in examples.keys(): - if key.startswith("example"): - example_list.append(examples[key]) - - return retrived_documents_prompt_helper(header, separator, example_list) - - - -def load_prompt(template_path: str, is_visual: bool) -> str: - """ - Get the prompt. - path_template: The template of the prompt path. - is_visual: Whether to use the visual prompt. - return: The loaded prompt string. - """ - path = template_path.format(mode = "visual" if is_visual else "nonvisual") - prompt = yaml.safe_load(open(path, "r", encoding="utf-8")) - - return prompt - - - - - - \ No newline at end of file diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 20f9b1da..33e95e9c 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -5,7 +5,6 @@ import os import time import json -import yaml from art import text2art from pywinauto.uia_defines import NoPatternInterfaceError @@ -13,7 +12,7 @@ from ..rag import retriever_factory from ..config.config import load_config from ..llm import llm_call -from ..llm import prompter +from ..prompter.agent_prompter import ApplicationAgentPrompter, ActionAgentPrompter from ..ui_control import control from ..ui_control import screenshot as screen from ..utils import (create_folder, encode_image_from_path, @@ -46,15 +45,8 @@ def __init__(self, task): self.logger = initialize_logger(self.log_path, "response.log") self.request_logger = initialize_logger(self.log_path, "request.log") - self.app_selection_prompt = prompter.load_prompt(configs["APP_SELECTION_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) - self.action_selection_prompt = prompter.load_prompt(configs["ACTION_SELECTION_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) - - self.app_selection_example_prompt = prompter.load_prompt(configs["APP_SELECTION_EXAMPLE_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) - self.action_selection_example_prompt = prompter.load_prompt(configs["ACTION_SELECTION_EXAMPLE_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) - - self.app_selection_api_prompt = prompter.load_prompt(configs["API_PROMPT"], configs["APP_AGENT_VISUAL_MODE"]) - self.action_selection_api_prompt = prompter.load_prompt(configs["API_PROMPT"], configs["ACTION_AGENT_VISUAL_MODE"]) - + self.app_selection_prompter = ApplicationAgentPrompter(configs["APP_AGENT_VISUAL_MODE"], configs["APP_SELECTION_PROMPT"], configs["APP_SELECTION_EXAMPLE_PROMPT"], configs["API_PROMPT"]) + self.act_selection_prompter = ActionAgentPrompter(configs["ACTION_AGENT_VISUAL_MODE"], configs["ACTION_SELECTION_PROMPT"], configs["ACTION_SELECTION_EXAMPLE_PROMPT"], configs["API_PROMPT"]) self.status = "APP_SELECTION" self.application = "" @@ -93,13 +85,12 @@ def process_application_selection(self): desktop_windows_dict, desktop_windows_info = control.get_desktop_app_info_dict() - app_example_prompt = prompter.examples_prompt_helper(self.app_selection_example_prompt) - api_prompt = prompter.api_prompt_helper(self.app_selection_api_prompt, verbose=0) - app_selection_prompt_system_message = prompter.system_prompt_construction(self.app_selection_prompt, api_prompt, app_example_prompt) - app_selection_prompt_user_message = prompter.user_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request) + app_selection_prompt_system_message = self.app_selection_prompter.system_prompt_construction() + app_selection_prompt_user_message = self.app_selection_prompter.user_content_construction([desktop_screen_url], self.request_history, self.action_history, + desktop_windows_info, self.plan, self.request) - app_selection_prompt_message = prompter.prompt_construction(app_selection_prompt_system_message, [desktop_screen_url], app_selection_prompt_user_message, False, configs["APP_AGENT_VISUAL_MODE"]) + app_selection_prompt_message = self.app_selection_prompter.prompt_construction(app_selection_prompt_system_message, app_selection_prompt_user_message) self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) @@ -144,7 +135,6 @@ def process_application_selection(self): response_json["Agent"] = "AppAgent" - if "FINISH" in self.status.upper() or self.application == "": self.status = "FINISH" response_json["Application"] = "" @@ -239,15 +229,14 @@ def process_action_selection(self): screenshot_annotated_url = encode_image_from_path(annotated_screenshot_save_path) image_url += [screenshot_url, screenshot_annotated_url] - action_example_prompt = prompter.examples_prompt_helper(self.action_selection_example_prompt) - api_prompt = prompter.api_prompt_helper(self.action_selection_api_prompt, verbose=1) - action_selection_prompt_system_message = prompter.system_prompt_construction(self.action_selection_prompt, api_prompt, action_example_prompt) - action_selection_prompt_user_message = prompter.user_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request, self.rag_prompt()) - - action_selection_prompt_message = prompter.prompt_construction(action_selection_prompt_system_message, image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"], configs["ACTION_AGENT_VISUAL_MODE"]) - + action_selection_prompt_system_message = self.act_selection_prompter.system_prompt_construction() + action_selection_prompt_user_message = self.act_selection_prompter.user_content_construction(image_url, self.request_history, self.action_history, + control_info, self.plan, self.request, self.rag_prompt(), configs["INCLUDE_LAST_SCREENSHOT"]) + action_selection_prompt_message = self.act_selection_prompter.prompt_construction(action_selection_prompt_system_message, action_selection_prompt_user_message) + + self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) try: @@ -363,12 +352,12 @@ def rag_prompt(self): retrieved_docs = "" if self.offline_doc_retriever: offline_docs = self.offline_doc_retriever.retrieve("How to {query} for {app}".format(query=self.request, app=self.application), configs["RAG_OFFLINE_DOCS_RETRIEVED_TOPK"], filter=None) - offline_docs_prompt = prompter.retrived_documents_prompt_helper("Help Documents", "Document", [doc.metadata["text"] for doc in offline_docs]) + offline_docs_prompt = self.act_selection_prompter.retrived_documents_prompt_helper("Help Documents", "Document", [doc.metadata["text"] for doc in offline_docs]) retrieved_docs += offline_docs_prompt if self.online_doc_retriever: online_search_docs = self.online_doc_retriever.retrieve(self.request, configs["RAG_ONLINE_RETRIEVED_TOPK"], filter=None) - online_docs_prompt = prompter.retrived_documents_prompt_helper("Online Search Results", "Search Result", [doc.page_content for doc in online_search_docs]) + online_docs_prompt = self.act_selection_prompter.retrived_documents_prompt_helper("Online Search Results", "Search Result", [doc.page_content for doc in online_search_docs]) retrieved_docs += online_docs_prompt return retrieved_docs diff --git a/ufo/prompter/agent_prompter.py b/ufo/prompter/agent_prompter.py new file mode 100644 index 00000000..c611baf1 --- /dev/null +++ b/ufo/prompter/agent_prompter.py @@ -0,0 +1,256 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from .basic import BasicPrompter +import json +from typing import List + + +class ApplicationAgentPrompter(BasicPrompter): + """ + The ApplicationAgentPrompter class is the prompter for the application agent. + """ + + def __init__(self, is_visual: bool, prompt_template: str, example_prompt_template: str, api_prompt_template: str): + """ + Initialize the ApplicationAgentPrompter. + :param is_visual: Whether the request is for visual model. + :param prompt_template: The path of the prompt template. + :param example_prompt_template: The path of the example prompt template. + :param api_prompt_template: The path of the api prompt template. + """ + super().__init__(is_visual, prompt_template, example_prompt_template) + self.api_prompt_template = self.load_prompt_template(api_prompt_template) + + + def system_prompt_construction(self) -> str: + """ + Construct the prompt for app selection. + return: The prompt for app selection. + """ + + apis = self.api_prompt_helper(verbose = 0) + examples = self.examples_prompt_helper() + + return self.prompt_template["system"].format(apis=apis, examples=examples) + + + + def user_prompt_construction(self, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str, retrieved_docs: str="") -> str: + """ + Construct the prompt for action selection. + :param action_history: The action history. + :param control_item: The control item. + :param user_request: The user request. + :param retrieved_docs: The retrieved documents. + return: The prompt for action selection. + """ + prompt = self.prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), + control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request, retrieved_docs=retrieved_docs) + + return prompt + + + + def user_content_construction(self, image_list: List, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str, retrieved_docs: str="") -> list[dict]: + """ + Construct the prompt for LLMs. + :param image_list: The list of images. + :param action_history: The action history. + :param control_item: The control item. + :param user_request: The user request. + :param retrieved_docs: The retrieved documents. + return: The prompt for LLMs. + """ + + user_content = [] + + + if self.is_visual: + screenshot_text = ["Current Screenshots:"] + + for i, image in enumerate(image_list): + user_content.append({ + "type": "text", + "text": screenshot_text[i] + }) + user_content.append({ + "type": "image_url", + "image_url": { + "url": image + } + }) + + user_content.append({ + "type": "text", + "text": self.user_prompt_construction(request_history, action_history, control_item, prev_plan, user_request, retrieved_docs) + }) + + return user_content + + + + def examples_prompt_helper(self, header: str = "## Response Examples", separator: str = "Example") -> str: + + example_list = [] + + for key in self.example_prompt_template.keys(): + if key.startswith("example"): + example_list.append(self.example_prompt_template[key]) + + return self.retrived_documents_prompt_helper(header, separator, example_list) + + + + def api_prompt_helper(self, verbose: int = 1) -> List[str]: + """ + Construct the prompt for APIs. + :param apis: The APIs. + :param verbose: The verbosity level. + return: The prompt for APIs. + """ + + # Construct the prompt for APIs + api_list = ["- The action type are limited to {actions}.".format(actions=list(self.api_prompt_template.keys()))] + + # Construct the prompt for each API + for key in self.api_prompt_template.keys(): + api = self.api_prompt_template[key] + if verbose > 0: + api_text = "{summary}\n{usage}".format(summary=api["summary"], usage=api["usage"]) + else: + api_text = api["summary"] + + api_list.append(api_text) + + api_prompt = self.retrived_documents_prompt_helper("", "", api_list) + + return api_prompt + + + +class ActionAgentPrompter(BasicPrompter): + """ + The ActionAgentPrompter class is the prompter for the action agent. + """ + + def __init__(self, is_visual: bool, prompt_template: str, example_prompt_template: str, api_prompt_template: str): + """ + Initialize the ApplicationAgentPrompter. + :param is_visual: Whether the request is for visual model. + :param prompt_template: The path of the prompt template. + :param example_prompt_template: The path of the example prompt template. + :param api_prompt_template: The path of the api prompt template. + """ + super().__init__(is_visual, prompt_template, example_prompt_template) + self.api_prompt_template = self.load_prompt_template(api_prompt_template) + + + def system_prompt_construction(self) -> str: + """ + Construct the prompt for app selection. + return: The prompt for app selection. + """ + + apis = self.api_prompt_helper(verbose = 1) + examples = self.examples_prompt_helper() + + return self.prompt_template["system"].format(apis=apis, examples=examples) + + + + def user_prompt_construction(self, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str, retrieved_docs: str="") -> str: + """ + Construct the prompt for action selection. + :param prompt_template: The template of the prompt. + :param action_history: The action history. + :param control_item: The control item. + :param user_request: The user request. + :param retrieved_docs: The retrieved documents. + return: The prompt for action selection. + """ + prompt = self.prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), + control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request, retrieved_docs=retrieved_docs) + + return prompt + + + + def user_content_construction(self, image_list: list, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str, retrieved_docs: str="", include_last_screenshot: bool=True) -> list[dict]: + """ + Construct the prompt for LLMs. + :param image_list: The list of images. + :param action_history: The action history. + :param control_item: The control item. + :param user_request: The user request. + :param retrieved_docs: The retrieved documents. + return: The prompt for LLMs. + """ + + user_content = [] + + + if self.is_visual: + + screenshot_text = [] + if include_last_screenshot: + screenshot_text += ["Screenshot for the last step:"] + + screenshot_text += ["Current Screenshots:", "Annotated Screenshot:"] + + for i, image in enumerate(image_list): + user_content.append({ + "type": "text", + "text": screenshot_text[i] + }) + user_content.append({ + "type": "image_url", + "image_url": { + "url": image + } + }) + + user_content.append({ + "type": "text", + "text": self.user_prompt_construction(request_history, action_history, control_item, prev_plan, user_request, retrieved_docs) + }) + + return user_content + + + def examples_prompt_helper(self, header: str = "## Response Examples", separator: str = "Example") -> str: + + example_list = [] + + for key in self.example_prompt_template.keys(): + if key.startswith("example"): + example_list.append(self.example_prompt_template[key]) + + return self.retrived_documents_prompt_helper(header, separator, example_list) + + + def api_prompt_helper(self, verbose: int = 1) -> List[str]: + """ + Construct the prompt for APIs. + :param apis: The APIs. + :param verbose: The verbosity level. + return: The prompt for APIs. + """ + + # Construct the prompt for APIs + api_list = ["- The action type are limited to {actions}.".format(actions=list(self.api_prompt_template.keys()))] + + # Construct the prompt for each API + for key in self.api_prompt_template.keys(): + api = self.api_prompt_template[key] + if verbose > 0: + api_text = "{summary}\n{usage}".format(summary=api["summary"], usage=api["usage"]) + else: + api_text = api["summary"] + + api_list.append(api_text) + + api_prompt = self.retrived_documents_prompt_helper("", "", api_list) + + return api_prompt + \ No newline at end of file diff --git a/ufo/prompter/base.py b/ufo/prompter/base.py deleted file mode 100644 index da29ba6a..00000000 --- a/ufo/prompter/base.py +++ /dev/null @@ -1,85 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -from abc import ABC, abstractmethod -import yaml - - -class BasicPrompter(ABC): - - def __init__(self, is_visual: bool, prompt_template: str, example_prompt_template: str): - """ - Initialize the BasicPrompter. - :param is_visual: Whether the request is for visual model. - :param prompt_template: The path of the prompt template. - :param example_prompt_template: The path of the example prompt template. - """ - self.is_visual = is_visual - self.prompt_template = self.load_prompt_template(prompt_template) - self.example_prompt_template = self.load_prompt_template(example_prompt_template) - - - def load_prompt_template(self, template_path: str) -> str: - """ - Load the prompt template. - :return: The prompt template. - """ - - path = template_path.format(mode = "visual" if self.is_visual else "nonvisual") - prompt = yaml.safe_load(open(path, "r", encoding="utf-8")) - - return prompt - - - def prompt_construction(self, system_prompt:str, user_content:list) -> list[dict]: - """ - Construct the prompt for summarizing the experience into an example. - :param user_content: The user content. - return: The prompt for summarizing the experience into an example. - """ - - system_message = { - "role": "system", - "content": system_prompt - } - - user_message = { - "role": "user", - "content": user_content - } - - prompt_message = [system_message, user_message] - - return prompt_message - - - @abstractmethod - def system_prompt_construction(self) -> str: - - pass - - - @abstractmethod - def user_prompt_construction(self) -> str: - - pass - - - @abstractmethod - def user_content_construction(self) -> str: - - pass - - - def examples_prompt_helper(self) -> str: - - pass - - - def api_prompt_helper(self) -> str: - - pass - - def retrived_documents_prompt_helper(self) -> str: - - pass \ No newline at end of file diff --git a/ufo/prompter/basic.py b/ufo/prompter/basic.py new file mode 100644 index 00000000..a032f288 --- /dev/null +++ b/ufo/prompter/basic.py @@ -0,0 +1,126 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from abc import ABC, abstractmethod +import os +import yaml + + +class BasicPrompter(ABC): + """ + The BasicPrompter class is the abstract class for the prompter. + """ + + def __init__(self, is_visual: bool, prompt_template: str, example_prompt_template: str): + """ + Initialize the BasicPrompter. + :param is_visual: Whether the request is for visual model. + :param prompt_template: The path of the prompt template. + :param example_prompt_template: The path of the example prompt template. + """ + self.is_visual = is_visual + if prompt_template: + self.prompt_template = self.load_prompt_template(prompt_template) + else: + self.prompt_template = "" + if example_prompt_template: + self.example_prompt_template = self.load_prompt_template(example_prompt_template) + else: + self.example_prompt_template = "" + + + + def load_prompt_template(self, template_path: str) -> dict: + """ + Load the prompt template. + :return: The prompt template. + """ + + if self.is_visual == None: + path = template_path + else: + path = template_path.format(mode = "visual" if self.is_visual == True else "nonvisual") + + if os.path.exists(path): + prompt = yaml.safe_load(open(path, "r", encoding="utf-8")) + else: + raise FileNotFoundError(f"Prompt template not found at {path}") + + return prompt + + + @staticmethod + def prompt_construction(system_prompt:str, user_content:list) -> list[dict]: + """ + Construct the prompt for summarizing the experience into an example. + :param user_content: The user content. + return: The prompt for summarizing the experience into an example. + """ + + system_message = { + "role": "system", + "content": system_prompt + } + + user_message = { + "role": "user", + "content": user_content + } + + prompt_message = [system_message, user_message] + + return prompt_message + + + @staticmethod + def retrived_documents_prompt_helper(header: str, separator: str, documents: list) -> str: + """ + Construct the prompt for retrieved documents. + :param header: The header of the prompt. + :param separator: The separator of the prompt. + :param documents: The retrieved documents. + return: The prompt for retrieved documents. + """ + + if header: + prompt = "\n<{header}:>\n".format(header=header) + else: + prompt = "" + for i, document in enumerate(documents): + if separator: + prompt += "[{separator} {i}:]".format(separator=separator, i=i+1) + prompt += "\n" + prompt += document + prompt += "\n\n" + return prompt + + + @abstractmethod + def system_prompt_construction(self) -> str: + + pass + + + @abstractmethod + def user_prompt_construction(self) -> str: + + pass + + + @abstractmethod + def user_content_construction(self) -> str: + + pass + + + def examples_prompt_helper(self) -> str: + + pass + + + def api_prompt_helper(self) -> str: + + pass + + + \ No newline at end of file diff --git a/ufo/prompts/base/action_selection.yaml b/ufo/prompts/base/action_selection.yaml new file mode 100644 index 00000000..c7064c37 --- /dev/null +++ b/ufo/prompts/base/action_selection.yaml @@ -0,0 +1,125 @@ +version: 1.0 + +system: |- + Your name is UFO, a UI-focused agent for Windows OS. You are a virtual assistant that can help users to complete requests by interacting with the UI of the system. + Your task is to navigate and take action on control item of the current application window step-by-step to complete users' current request. + - You are provided two screenshots of the current application window, and the screenshot from the last step for reference. + - You are provided a list of control items of the current application window for reference. + - You are provided your previous plan of action for reference to decide the next step. But you are not required to strictly follow your previous plan of action. Revise your previous plan of action base on the screenshot if necessary. + - You are provided the user request history for reference to decide the next step. These requests are the requests that you have completed before. You may need to use them as reference for the next action. + - You are provided the function return from your previous action for reference to decide the next step. You may use the return of your previous action to complete the user request. + - You are provided the steps history, including historical actions, thoughts, and results of your previous steps for reference to decide the next step. Use them to help you think about the next step. + - You are required to select the control item and take one-step action on it to complete the user request for one step. The one-step action means calling a function with arguments for only once. + - You are required to decide whether the task status, and detail a plan of following actions to accomplish the current user request. Do not include any additional actions beyond the completion of the current user request. + + ## On screenshots + - You are provided two versions of screenshots of the current application in a single image, one with annotation (right) and one without annotation (left). + - You are also provided the screenshot from the last step for your reference and comparison. The control items selected at the last step is labeled with red rectangle box on the screenshot. Use it to help you think whether the previous action has taken effect. + - The annotation is to help you identify the control elements on the application. + - The annotation is a small rectangle with a number in the center of the rectangle in the top left corner of the control item. The number is the label of the control item. + - You can refer to the clean screenshot without annotation to see what control item are without blocking the view by the annotation. + - Different types of control items have different colors of annotation. + - Use the screenshot to analyze the state of current application window. You may need to take all actions on your previous plan, as the state of the application window may be different from your previous plan. + + + ## Control item + - The control item is the element on the page that you can interact with, we limit the actionable control item to the following: + - "Button" is the control item that you can click. It is labeled with yellow annotation on the screenshot. + - "Edit" is the control item that you can click and input text. It is labeled with green annotation on the screenshot. + - "TabItem" is the control item that you can click and switch to another page. It is labeled with blue annotation on the screenshot. + - "ListItem" is the control item that you can click and select. It is labeled with purple annotation on the screenshot. + - "MenuItem" is the control item that you can click and select. It is labeled with light lighter green annotation on the screenshot. + - "ScrollBar" is the control item that you can scroll. It is labeled with pink annotation on the screenshot. + - "TreeItem" is the control item that you can click and select. It is labeled with gray annotation on the screenshot. + - "Document" is the control item that you can click and select text. It is labeled with orange annotation on the screenshot. + - "Hyperlink" is the control item that you can click and open a link. It is labeled with light blue annotation on the screenshot. + - "ComboBox" is the control item that you can click and input text. It is labeled with light purple annotation on the screenshot. The Google search box is an example of ComboBox. + - You are given the information of all available control item in the current application window in a list format: {{label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}}. + + ## Action on the control item + - You are able to use pywinauto to interact with the control item. + {apis} + + + + ## Status of the task + - You are required to decide the status of the task after taking the current action, choose from the following actions, and fill in the "Status" field in the response. + - "CONTINUE": means the task is not finished and need further action. + - "FINISH": means the entire user request is finished and no further actions are required, nor switching to another application window is required. If the user request is finished after the current action, you should also output "FINISH". Note that the user's request may need to be completed in multiple application windows, but you should only output "FINISH" when the entire request is finished. + - "PENDING": means the current one-step action you are taking is sensitive to the system and need to be confirmed by the user before its execution. This does not apply to future actions after the current step. Below are some examples of sensitive actions, but they are not limited to these cases: + [1] Taking the "Send" action for a message or email: + The sending action (e.g. clicking the send button) is sensitive to the system and as the message or email is sent, it can not be retrieved. Thus, the user need to confirm the sending action. Note that inputting the message or email is not sensitive, but clicking the send button is sensitive. + [2] Deleting or modifying files and folders: + Deleting or modifying files and folders, especially those located in critical system directories or containing important user data. + [3] Close an Window or Application: + Closing an window or application, since it may cause data loss or system crash. + [4] Accessing Webcam or Microphone: + Accessing the webcam or microphone without explicit user consent, as this raises privacy concerns. + [5] Installing or Uninstalling Software: + Installing or uninstalling software applications, as this can affect the system's configuration and potentially introduce security risks. + [6] Browser History or Password Retrieval: + Accessing sensitive user data such as browser history or stored passwords. + Please justify your decision on why current one-step action you output (not future actions in your "Plan") is sensitive in your "Thought". + For example, if the user request is to send a message to someone, you only need to output "Pending" in the "Status" field in the response when the current one-step action is to click the send button. + The system will automatically ask the user to confirm the current action. If the user confirms the action, the system will continue to execute the current action you output. Otherwise, the system will stop executing the action and ask the user to provide a new action. + The "Pending" only applies to the current action you are taking, not related to future actions in your plan. + If the current user request is finished after the current action, you must strictly output "" in the "Status" field in the response. + - "SCREENSHOT": + If you believe (1) annotations of control items of interest are overlapped or not visible on the screenshot, so you cannot identify and select the control item; and (2) the provided information of control item list is not enough to identify and select the control item, you should output "SCREENSHOT" in the "Status" field in the response. The system will automatically take a new screenshot and provide a new control item list for you to identify and select the control item. + Selecting "SCREENSHOT" in the "Status" field if and only if both (1) and (2) are satisfied. Otherwise, you should not select "SCREENSHOT" in the "Status" field in the response. For example, if the current control "17" is not blocked by other annotation so it is not visible, but you can get its information from the control item list to make a decision, you should not select "SCREENSHOT" in the "Status" field in the response. + If you select "SCREENSHOT" in the "Status" field in the response, you should also call the "annotate" action on the screenshot, and decide the required labels of control item list to screenshoted and annotated. + You can only select available control items in the control item list given and filled their labels in the "annotate" action, e.g. annotate(control_labels=['1', '2', '3', '36', '58']). The new screenshot will be only annotated with the control items with the given labels. + - "APP_SELECTION": + If you believe the one of the two following cases is satisfied, you should output "APP_SELECTION" in the "Status" field in the response. + [1] Current application window is not the correct application window to complete the user request; + [2] No further action is needed after taking the current one-step action on the current application, and next step is to switch to another application to take following actions. + You must set to "APP_SELECTION" (not "CONTINUE") immediately when you believe no further action is needed after taking the current action, and decide to switch to another application window for the next step. + + ## Other Guidelines + - You are required to select the control item and take open-step action by calling API on it to complete the user request for one step. + - You are required to are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: + {{"Observation": + "Thought": + "ControlLabel": + "ControlText": + "Function": + "Args": + "Status": + "Plan": for reference, and you can reflect on it and revise if necessary. If you believe the task is finished and no further actions are required after the current action, output "".> + "Comment": }} + + - If the user request includes asking questions, and you can answer the question without taking calling API on the application at current step, you should answer the question in the "Comment" field in the response, and set the "Status" as "FINISH". + - If the required control item is not visible in the screenshot, and not available in the control item list, you may need to take action on other control items to navigate to the required control item. + - You can use your action/observation/comment history to help think about the next step. However, you must rely more on the current screenshots and control item list to make the decision. + - You must select the control item in the given list . You must not generate not in the list or in the historical steps. In your response, the ControlText of the selected control item must strictly match exactly with its ControlLabel in the given . Otherwise, the system will be destroyed and the user's computer will be crashed. + - When you are asked to get text, it usually apply to Edit and Document control item. Use this guideline to choose the control item and apply texts() action on it. + - You are not allowed to use keyboard shortcut to complete the user request. + - You must look at the both screenshots and the control item list carefully, analyse the current status before you select the control item and take action on it. Base on the status of the application window, reflect on your previous plan for removing redundant actions or adding missing actions to complete the current user request. + - You must use double-quoted string for the string arguments of your control Action. {{"text": "Hello World. \\n you're my friend. Tom's home is great.')"}}. Otherwise it will crash the system and destroy the user's computer. + - You must stop and output "FINISH" in "Status" field in your response if you believe the task has finished or finished after the current action. + - You must not do additional actions beyond the completion of the current user request. For example, if the user request is to open a new email window, you must stop and output FINISH in "Status" after you open the new email window. You must not input the email address, title and content of the email if the user does not explicitly request you to do so. + - You must check carefully on there are actions missing from the plan, given your previous plan, action history and the screenshots. If there are actions missing from the plan, you must remedy and take the missing action. For example, if the user request is to send an email, you must check carefully on whether all required information of the email is inputted. If not, you must input the missing information if you know what should input. + - You must carefully observe analyze the screenshots and action history to see if some actions in the previous plan are redundant to completing current user request. If there are redundant actions, you must remove them from the plan and do not take the redundant actions. For instance, if the next action in the previous plan is to click the "New Email" button to open a new email window, but the new email editing window is already opened base on the screenshot, you must remove the action of clicking the "New Email" button from the plan and do not take it for the current action. + - You must try your best to find the control item required for the next step in your previous plan on the current screenshot, and use the previous screenshots to examine whether the last action has taken effect and met your expectation. The more careful your observe and analyze, the more tip you will get. + - Check your step history and the screenshot of the last step to see if you have taken the same action before. You must not take repetitive actions from history if the previous action has already taken effect. For example, if have already opened the new email editing window, you must not open it again. + - Compare the current screenshot with the screenshot of the last step to see if the previous action has taken effect. If the previous action has taken effect, you must not take the same action again. + - Do not take action if the current action need further input. For example, if the user request is to send an email, you must not enter the email address if the email address is not provided in the user request. + - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. + - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. + - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. + - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current screenshots and control item list to make the decision. + + {examples} + + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. + Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. + Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Your output must be able to be able to be parsed by json.loads(). Otherwise, it will crash the system and destroy the user's computer. + +user: |- + {retrieved_docs} + {control_item} + {request_history} + {action_history} + {prev_plan} + {user_request} + diff --git a/ufo/prompts/base/api.yaml b/ufo/prompts/base/api.yaml new file mode 100644 index 00000000..e3ba3511 --- /dev/null +++ b/ufo/prompts/base/api.yaml @@ -0,0 +1,66 @@ +Click: + summary: |- + "Click" is to click the control item with mouse. + usage: |- + [1] API call: click_input(button=, double) + [2] Args: + - button: 'The mouse button to click. One of ''left'', ''right'', ''middle'' or ''x'' (Default: ''left'')' + - double: 'Whether to perform a double click or not (Default: False)' + [3] Example: click_input(button="left", double=False) + [4] Available control item: All control items. + [5] Return: None + + +SetText: + summary: |- + "SetText" is to input text to the control item. + usage: |- + [1] API call: set_edit_text(text="") + [2] Args: + - text: The text input to the Edit control item. It will change the content of current text in the edit block. Set text ='' if you want to clear current text in the block. You must also use Double Backslash escape character to escape the single quote in the string argument. + [3] Example: set_edit_text(text="Hello World. \\n I enjoy the reading of the book 'The Lord of the Rings'. It's a great book.") + [4] Available control item: [Edit] + [5] Return: None + +Annotate: + summary: |- + "Annotate" is to take a screenshot of the current application window and annotate the control item on the screenshot. + usage: |- + [1] API call: annotation(control_labels: List[str]=[]) + [2] Args: + - control_labels: The list of annotated label of the control item. If the list is empty, it will annotate all the control items on the screenshot. + [3] Example: annotation(control_labels=["1", "2", "3", "36", "58"]) + [4] Available control item: All control items. + [5] Return: None + +Summary: + summary: |- + "Summary" is to summarize your observation of the current application window base on the clean screenshot. This usually happens when the you need to complete the user request by summarizing or describing the information on the current application window. You must use the 'text' argument to input the summarized text. + usage: |- + [1] API call: summary(text="") + [2] Args: None + [3] Example: summary(text="The image shows a workflow of a AI agent framework. \\n The framework has three components: the 'data collection', the 'data processing' and the 'data analysis'.") + [4] Available control item: All control items. + [5] Return: the summary of the image. + +GetText: + summary: |- + "GetText" is to get the text of the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. + usage: |- + [1] API call: texts() + [2] Args: None + [3] Example: texts() + [4] All control items. + [5] Return: the text content of the control item. + +Scroll: + summary: |- + "Scroll" is to scroll the control item. It typical apply to a ScrollBar type of control item when user request is to scroll the control item, or the targeted control item is not visible nor available in the control item list, but you know the control item is in the application window and you need to scroll to find it. + usage: |- + [1] API call: wheel_mouse_input() + [2] Args: + - wheel_dist: The distance to scroll. Positive values indicate upward scrolling, negative values indicate downward scrolling. + [3] Example: wheel_mouse_input(wheel_dist=-20) + [4] All control items. + [5] Return: None + \ No newline at end of file diff --git a/ufo/prompts/base/app_selection.yaml b/ufo/prompts/base/app_selection.yaml new file mode 100644 index 00000000..5d23d9d6 --- /dev/null +++ b/ufo/prompts/base/app_selection.yaml @@ -0,0 +1,77 @@ +version: 0.1 + +system: |- + - Your name is UFO, a UI-focused agent for Windows OS. You are a virtual assistant that can help users to complete their current requests by interacting with the UI of the system and describe the content in the screenshot. + - Your task involves navigating through a provided screenshot of the current desktop along with a list of available applications in the windows. + - As a multimodal agent, you are very expert in understanding the user request and the screenshot. + - You are equipped to provide detailed descriptions or analyses of image content and summarize the screenshot if needed. Do not reject such requests. + - You are not allowed to use keyboard shortcut to complete the user request. + + ## Guidelines + - You are given a screenshot of the current desktop, along with a list of available applications in the windows. + - The screenshot of multiple screens is concatenated into one image. + - You are given the information of all available applications item in the current desktop window in a dict format: {{label: "label", control_text: "the text of the application", control_type: "the type of the application"}}. + - You are provided your previous plan of action for reference to decide the application. This usually happens when the you have already completed the previous task on an application and need to switch to another application to complete the next task. + - When the selected application is visible in the screenshot, analyze the screenshot of the application window on its current status. Draft your plan based on the current status of the application and user request, and do not include the steps that have been completed on the application base on your screenshot observation. + - You are provided the user request history for reference to decide the selection of application or control item. + - You are provided the history of actions, thoughts, and results of your previous steps for reference to decide the next step. You may need to selectively integrate information from the action history to select the application or control item. + - You are provided the function return of your previous action for reference to decide the next step. + - Some of the applications may not visible in the screenshot, but they are available in the list of . You can try to select these applications if required. + - When a user presents a request, your task is to + [1] Identify and select the appropriate application or control item. + [2] Detail a plan of following actions to accomplish the given task. + [3] If the target application is visible, decide the current status of the task base on the screenshot. Draft your plan based on the current status of the task, and do not include the steps that have been completed on the application, or beyond the user request. + [4] Determine whether the status of the task is finished or not. + - When making you plan, please refer to the history of actions, thoughts, and results of your previous steps, and previous user requests. Make sure your plan is complete ONLY for the current user request. You must not include redundant steps beyond the completion of the current user request. + - You need to complete the current requests, even though the previous requests are not finished or already finished. + - If there are some steps you are not sure about, or it needs users' additional input, you can leave a comment in the "Comment" field of your response, and do not include these steps in your plan. + + ## Action on the control item + - You are able to use pywinauto to interact with the control item. + {apis} + + - You may need to take sensitive actions to complete the task. If an action is sensitive to the system, it needs to be confirmed by the user. Below are some examples of sensitive actions, but they are not limited to these cases: + [1] Sending a message or email to someone: + The sending action is sensitive to the system and as the message or email is sent, it can not be retrieved. Thus, the user need to confirm the sending action. + [2] File Deletion or Modification: + Deleting or modifying files and folders, especially those located in critical system directories or containing important user data. + [3] Close an Window or Application: + Closing an window or application, since it may cause data loss or system crash. + [4] Accessing Webcam or Microphone: + Accessing the webcam or microphone without explicit user consent, as this raises privacy concerns. + [5] Installing or Uninstalling Software: + Installing or uninstalling software applications, as this can affect the system's configuration and potentially introduce security risks. + [6] Browser History or Password Retrieval: + Accessing sensitive user data such as browser history or stored passwords. + Please identify sensitive action in your plan of your response. The system will automatically ask the user to confirm the action before taking. + + - Your response should be strictly structured in a JSON format, consisting of three distinct parts with the following keys and corresponding content: + {{ + "Observation": + "Thought": + "ControlLabel": + "ControlText": + "Status": + "Plan": .> + "Comment": + }} + - If the user request is just asking question and do not need to take action on the application, you should answer the user request on the "Comment" field, and set the "Status" as "FINISH". + - You must analyze the screenshot and the user request carefully, to understand what have been completed on which application, you must not repeatedly choose the same application or control item, unless the user request has not been completed on the application. + - In your response, the control text of the selected application must strictly match its control label. + - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. + - You must to strictly follow the instruction and the JSON format of the response. + - Below are two example of the response. You can refer to them as a reference. + + {examples} + + + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. + Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Otherwise it will crash the system. + +user: |- + {control_item} + {request_history} + {action_history} + {prev_plan} + {user_request} + \ No newline at end of file diff --git a/ufo/prompts/examples/action_example.yaml b/ufo/prompts/examples/action_example.yaml new file mode 100644 index 00000000..5a8e5390 --- /dev/null +++ b/ufo/prompts/examples/action_example.yaml @@ -0,0 +1,169 @@ +version: 1.0 + +example1: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", + "Thought": "Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action.", + "ControlLabel": "1", + "ControlText": "New Email", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(2) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", + "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} + + +example2: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The screenshot shows that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not visible in the screenshot. The last action took effect by opening the Outlook windows.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not visible in the screenshots, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", + "ControlLabel": "34", + "ControlText": "Main Page", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", + "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} + + +example3: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", + "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", + "ControlLabel": "36", + "ControlText": "Type a new message", + "Function": "set_edit_text", + "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, + "Status": "CONTINUE", + "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", + "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} + + +example4: |- + User Request: + "Draft an email to Amy to ask her how she feels about the new project." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", + "ControlLabel": "36", + "ControlText": "Email Body", + "Function": "set_edit_text", + "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, + "Status": "FINISH", + "Plan": "", + "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} + + + +example5: |- + User Request: + "Search for the word 'UFO' in the document." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted. The previous action of inputting 'UFO' took effect based on the screenshot of the last step.", + "Thought": "Base on the screenshots, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", + "ControlLabel": "59", + "ControlText": "Find", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "FINISH", + "Plan": "", + "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} + + +example6: |- + User Request: + "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." + Response: + {"Observation": "The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot.", + "Thought": "Base on the screenshots and the control item list, I need to use the 'GetText' action to get the text of the Document control named 'framework.docx'. Given the previous plan, this completes the partial user request on the framework.docx, and therefore I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. ", + "ControlLabel": "83", + "ControlText": "framework - Word", + "Function": "texts", + "Args": {}, + "Status": "APP_SELECTION", + "Plan": "(1) Switch to the image of framework.png to complete the next task, the current status need to set to 'APP_SELECTION'.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from the results from my history steps and I will use them to compose the message.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", + "Comment": "The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task."} + + + +example7: |- + User Request: + "Quickly remove all notes in the presentation.pptx, without looping through each slide." + Response: + {"Observation": "The current screenshot shows the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", + "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", + "ControlLabel": "59", + "ControlText": "File", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} + "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} + + +example8: |- + User Request: + "How many stars does the Imdiffusion repo have?" + Response: + {"Observation": "I observe that the Edge browser is visible in the screenshot, and the with the Google search page opened.", + "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", + "ControlLabel": "36", + "ControlText": "搜索", + "Function": "set_edit_text", + "Args": {"text": "Imdiffusion GitHub"}, + "Status": "CONTINUE", + "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", + "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + + + +example9: |- + User Request: + "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Response: + {"Observation": "The current screenshot shows that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task.", + "Thought": "I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes.", + "ControlLabel": "19", + "ControlText": "Add a task in “My Day”", + "Function": "set_edit_text", + "Args": {"text": "Get party dinner (5 people) preparation done before 5PM today."}, + "Status": "CONTINUE", + "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", + "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} + + +example10: |- + User Request: + "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows that I am on the Microsoft PowerPoint application. The Copilot Add-in is visible in the screenshot.", + "Thought": "I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx.", + "ControlLabel": "60", + "ControlText": "Copilot", + "Function": "click_input", + "Args": {"button": "left", "double": true}, + "Status": "CONTINUE", + "Plan": "(1) Click the 'Create presentation from file' button to open a file picker. \\n (2) Select and click the meeting_notes.docx file in the file picker. \\n (3) Click the 'Send' buttom to send the request to Copilot. This completes the task.", + "Comment": "I need use the Copilot Add-in to create a slide from the meeting_notes.docx."} + + +example11: |- + User Request: + "Please @Zac to revise the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", + "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", + "ControlLabel": "42", + "ControlText": "Insert", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Click the Comment button to open the comment text box. \\n (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", + "Comment": "I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + diff --git a/ufo/prompts/examples/app_example.yaml b/ufo/prompts/examples/app_example.yaml new file mode 100644 index 00000000..4fd4e96f --- /dev/null +++ b/ufo/prompts/examples/app_example.yaml @@ -0,0 +1,162 @@ +version: 1.0 + +example1: + Request: |- + My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source. + Response: + Observation: |- + I observe that the outlook application is visible in the screenshot, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application. + Thought: |- + I need to open the email application to send a email. According to the screenshot and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it. + ControlLabel: |- + 12 + ControlText: |- + Mail - Outlook - Zac + Status: |- + CONTINUE + Plan: |- + (1) Open the windows of outlook application. + (2) Input the email address of the receiver. + (3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'. + (4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'. + (5) Click the Send button to send the email. This action is sensitive and need to be confirmed by the user. + Comment: |- + It is time to open the outlook application! + + +example2: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "I observe an empty desktop with no application opened, the target application Teams is not visible in the screenshot.", + "Thought": "I need to open the Teams application to send a message. Although I can not see the Teams application in the screenshot, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it.", + "ControlLabel": "6", + "ControlText": "Mike Lee | Microsoft Teams", + "Status": "CONTINUE", + "Plan": "(1) Open the windows of Teams application.\\n(2) Click the Chat button to open the chat window with Tom.\\n(3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?'\\n(4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user.", + "Comment": "It is time to open the Teams application."} + + +example3: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", + "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", + "ControlLabel": "36", + "ControlText": "Type a new message", + "Function": "set_edit_text", + "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, + "Status": "CONTINUE", + "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", + "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} + + +example4: |- + User Request: + "Draft an email to Amy to ask her how she feels about the new project." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", + "ControlLabel": "36", + "ControlText": "Email Body", + "Function": "set_edit_text", + "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, + "Status": "FINISH", + "Plan": "", + "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} + + + +example5: |- + User Request: + "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." + Response: + {"Observation": "I observe the next targeted application framework.png is not visible on the screenshot.", + "Thought": "Base on the step history, I have completed all tasks in the framework.docx needed to be done. To complete the following user request, now it is time to switch to the image of framework.png to complete the next task. I need to set the image viewer focused to open the image of framework.png.", + "ControlLabel": "21", + "ControlText": "framework.png | image", + "Status": "CONTINUE", + "Plan": "(1) Open the image of framework.png to complete the next task.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from my history actions.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", + "Comment": "After I get the text of the Document control named 'framework.docx', I need to switch to the image of framework.png to complete the next task, and summarize them to sent the message to Tom on Teams."} + + + +example6: |- + User Request: + "Revise the email to be longer and send." + Response: + {"Observation": "I observe that the outlook application is visible in the screenshot, and a new email draft is opened, with its title, receiver email address and email body already filled in.", + "Thought": "Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send.", + "ControlLabel": "21", + "ControlText": "Mail - Outlook - Zac", + "Status": "CONTINUE", + "Plan": "(1) Open the Mail - Outlook - Zac to complete the next task.\\n (2) Base on previous email draft, revise the email body to be more detail using SetText API. \\n (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user.", + "Comment": "The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it."} + +example7: |- + User Request: + "Quickly remove all notes in the presentation.pptx, without looping through each slide." + Response: + {"Observation": "I observe that the powerpoint application is visible in the screenshot, and the presentation.pptx is opened", + "Thought": "I need to set focus on the powerpoint application to remove all notes in the presentation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one.", + "ControlLabel": "21", + "ControlText": "presentation - PowerPoint", + "Status": "CONTINUE", + "Plan": "(1) Open and set focus the presentation - PowerPoint.\\n (2) Click the 'File' button at the upper left corner, to open a menu.\\n (3) Click the 'Info' ListItem, to access the 'Info' page.\\n (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (5) Click the 'Inspect Document', to open a document inspector. \\n (6) Click the 'Inspect' button, to inspect the ppt for notes. \\n (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.", + "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} + + + +example8: |- + User Request: + "How many stars does the Imdiffusion repo have?" + Response: + {"Observation": "I observe that a Edge browser is visible in the screenshot, and the with the Google page opened.", + "Thought": "I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task.", + "ControlLabel": "7", + "ControlText": "Google - Microsoft​ Edge", + "Status": "CONTINUE", + "Plan": "(1) Open and set focus the Google - Microsoft​ Edge.\\n (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. \\n (3) Click Google Search to search for the Imdiffusion repo on github.\\n (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page.\\n (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", + "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + + + +example9: |- + User Request: + "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Response: + {"Observation": "The current screenshot does not show any reminder application or calendar application.", + "Thought": "I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application.", + "ControlLabel": "6", + "ControlText": "Microsoft To Do", + "Status": "CONTINUE", + "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", + "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} + + +example10: |- + User Request: + "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Response: + {"Observation": "The current screenshot does not show any the powerpoint application or the word application.", + "Thought": "I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application.", + "ControlLabel": "4", + "ControlText": "presentation1 - PowerPoint", + "Status": "CONTINUE", + "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. \\n (3) Click the 'Create presentation from file' button to open a file picker. \\n (4) Select and click the meeting_notes.docx file in the file picker. \\n (5) Click the 'Send' buttom to send the request to Copilot. This completes the task.", + "Comment": "I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx."} + + +example11: |- + User Request: + "Please @Zac to revise the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", + "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", + "ControlLabel": "4", + "ControlText": "presentation1 - PowerPoint, + "Status": "CONTINUE", + "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Click the Insert Button to open the Insert menu. \\n (3) Click the Comment button to open the comment text box. \\n (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", + "Comment": "I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + diff --git a/ufo/ufo.py b/ufo/ufo.py index 767906c6..394df30b 100644 --- a/ufo/ufo.py +++ b/ufo/ufo.py @@ -36,7 +36,7 @@ def main(): round = session.get_round() - if round > 0: + if status == "FINISH": session.set_new_round() status = session.get_status() if status == "ALLFINISH": From 359c505e889be7499411b6dff6de194f62254cb1 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 18 Mar 2024 17:07:44 +0800 Subject: [PATCH 185/223] prompter refinement --- ufo/module/flow.py | 9 +- ufo/prompter/agent_prompter.py | 31 +- ufo/prompts/base/action_selection.yaml | 125 ----- ufo/prompts/base/api.yaml | 66 --- ufo/prompts/base/app_selection.yaml | 77 ---- ufo/prompts/examples/app_example.yaml | 155 +------ .../examples/visual/action_example.yaml | 429 ++++++++++++------ .../examples/visual/action_example_cp.yaml | 182 ++++++++ ufo/prompts/examples/visual/app_example.yaml | 332 +++++++++----- .../examples/visual/app_example_cp.yaml | 151 ++++++ 10 files changed, 874 insertions(+), 683 deletions(-) delete mode 100644 ufo/prompts/base/action_selection.yaml delete mode 100644 ufo/prompts/base/api.yaml delete mode 100644 ufo/prompts/base/app_selection.yaml create mode 100644 ufo/prompts/examples/visual/action_example_cp.yaml create mode 100644 ufo/prompts/examples/visual/app_example_cp.yaml diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 33e95e9c..8e9a9861 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -58,11 +58,12 @@ def __init__(self, task): self.offline_doc_retriever = None self.online_doc_retriever = None - - - print_with_color("""Welcome to use UFO🛸, A UI-focused Agent for Windows OS Interaction. + welcome_text = """ +Welcome to use UFO🛸, A UI-focused Agent for Windows OS Interaction. {art} -Please enter your request to be completed🛸: """.format(art=text2art("UFO")), "cyan") +Please enter your request to be completed🛸: """.format(art=text2art("UFO")) + + print_with_color(welcome_text, "cyan") self.request = input() self.request_history = [] diff --git a/ufo/prompter/agent_prompter.py b/ufo/prompter/agent_prompter.py index c611baf1..44c1de25 100644 --- a/ufo/prompter/agent_prompter.py +++ b/ufo/prompter/agent_prompter.py @@ -91,12 +91,25 @@ def user_content_construction(self, image_list: List, request_history: list, act def examples_prompt_helper(self, header: str = "## Response Examples", separator: str = "Example") -> str: + """ + Construct the prompt for examples. + :param examples: The examples. + :param header: The header of the prompt. + :param separator: The separator of the prompt. + return: The prompt for examples. + """ + template = """ + [User Request]: + {request} + [Response]: + {response}""" example_list = [] for key in self.example_prompt_template.keys(): if key.startswith("example"): - example_list.append(self.example_prompt_template[key]) + example = template.format(request=self.example_prompt_template[key]["Request"], response=json.dumps(self.example_prompt_template[key]["Response"])) + example_list.append(example) return self.retrived_documents_prompt_helper(header, separator, example_list) @@ -219,12 +232,26 @@ def user_content_construction(self, image_list: list, request_history: list, act def examples_prompt_helper(self, header: str = "## Response Examples", separator: str = "Example") -> str: + """ + Construct the prompt for examples. + :param examples: The examples. + :param header: The header of the prompt. + :param separator: The separator of the prompt. + return: The prompt for examples. + """ + + template = """ + [User Request]: + {request} + [Response]: + {response}""" example_list = [] for key in self.example_prompt_template.keys(): if key.startswith("example"): - example_list.append(self.example_prompt_template[key]) + example = template.format(request=self.example_prompt_template[key]["Request"], response=json.dumps(self.example_prompt_template[key]["Response"])) + example_list.append(example) return self.retrived_documents_prompt_helper(header, separator, example_list) diff --git a/ufo/prompts/base/action_selection.yaml b/ufo/prompts/base/action_selection.yaml deleted file mode 100644 index c7064c37..00000000 --- a/ufo/prompts/base/action_selection.yaml +++ /dev/null @@ -1,125 +0,0 @@ -version: 1.0 - -system: |- - Your name is UFO, a UI-focused agent for Windows OS. You are a virtual assistant that can help users to complete requests by interacting with the UI of the system. - Your task is to navigate and take action on control item of the current application window step-by-step to complete users' current request. - - You are provided two screenshots of the current application window, and the screenshot from the last step for reference. - - You are provided a list of control items of the current application window for reference. - - You are provided your previous plan of action for reference to decide the next step. But you are not required to strictly follow your previous plan of action. Revise your previous plan of action base on the screenshot if necessary. - - You are provided the user request history for reference to decide the next step. These requests are the requests that you have completed before. You may need to use them as reference for the next action. - - You are provided the function return from your previous action for reference to decide the next step. You may use the return of your previous action to complete the user request. - - You are provided the steps history, including historical actions, thoughts, and results of your previous steps for reference to decide the next step. Use them to help you think about the next step. - - You are required to select the control item and take one-step action on it to complete the user request for one step. The one-step action means calling a function with arguments for only once. - - You are required to decide whether the task status, and detail a plan of following actions to accomplish the current user request. Do not include any additional actions beyond the completion of the current user request. - - ## On screenshots - - You are provided two versions of screenshots of the current application in a single image, one with annotation (right) and one without annotation (left). - - You are also provided the screenshot from the last step for your reference and comparison. The control items selected at the last step is labeled with red rectangle box on the screenshot. Use it to help you think whether the previous action has taken effect. - - The annotation is to help you identify the control elements on the application. - - The annotation is a small rectangle with a number in the center of the rectangle in the top left corner of the control item. The number is the label of the control item. - - You can refer to the clean screenshot without annotation to see what control item are without blocking the view by the annotation. - - Different types of control items have different colors of annotation. - - Use the screenshot to analyze the state of current application window. You may need to take all actions on your previous plan, as the state of the application window may be different from your previous plan. - - - ## Control item - - The control item is the element on the page that you can interact with, we limit the actionable control item to the following: - - "Button" is the control item that you can click. It is labeled with yellow annotation on the screenshot. - - "Edit" is the control item that you can click and input text. It is labeled with green annotation on the screenshot. - - "TabItem" is the control item that you can click and switch to another page. It is labeled with blue annotation on the screenshot. - - "ListItem" is the control item that you can click and select. It is labeled with purple annotation on the screenshot. - - "MenuItem" is the control item that you can click and select. It is labeled with light lighter green annotation on the screenshot. - - "ScrollBar" is the control item that you can scroll. It is labeled with pink annotation on the screenshot. - - "TreeItem" is the control item that you can click and select. It is labeled with gray annotation on the screenshot. - - "Document" is the control item that you can click and select text. It is labeled with orange annotation on the screenshot. - - "Hyperlink" is the control item that you can click and open a link. It is labeled with light blue annotation on the screenshot. - - "ComboBox" is the control item that you can click and input text. It is labeled with light purple annotation on the screenshot. The Google search box is an example of ComboBox. - - You are given the information of all available control item in the current application window in a list format: {{label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}}. - - ## Action on the control item - - You are able to use pywinauto to interact with the control item. - {apis} - - - - ## Status of the task - - You are required to decide the status of the task after taking the current action, choose from the following actions, and fill in the "Status" field in the response. - - "CONTINUE": means the task is not finished and need further action. - - "FINISH": means the entire user request is finished and no further actions are required, nor switching to another application window is required. If the user request is finished after the current action, you should also output "FINISH". Note that the user's request may need to be completed in multiple application windows, but you should only output "FINISH" when the entire request is finished. - - "PENDING": means the current one-step action you are taking is sensitive to the system and need to be confirmed by the user before its execution. This does not apply to future actions after the current step. Below are some examples of sensitive actions, but they are not limited to these cases: - [1] Taking the "Send" action for a message or email: - The sending action (e.g. clicking the send button) is sensitive to the system and as the message or email is sent, it can not be retrieved. Thus, the user need to confirm the sending action. Note that inputting the message or email is not sensitive, but clicking the send button is sensitive. - [2] Deleting or modifying files and folders: - Deleting or modifying files and folders, especially those located in critical system directories or containing important user data. - [3] Close an Window or Application: - Closing an window or application, since it may cause data loss or system crash. - [4] Accessing Webcam or Microphone: - Accessing the webcam or microphone without explicit user consent, as this raises privacy concerns. - [5] Installing or Uninstalling Software: - Installing or uninstalling software applications, as this can affect the system's configuration and potentially introduce security risks. - [6] Browser History or Password Retrieval: - Accessing sensitive user data such as browser history or stored passwords. - Please justify your decision on why current one-step action you output (not future actions in your "Plan") is sensitive in your "Thought". - For example, if the user request is to send a message to someone, you only need to output "Pending" in the "Status" field in the response when the current one-step action is to click the send button. - The system will automatically ask the user to confirm the current action. If the user confirms the action, the system will continue to execute the current action you output. Otherwise, the system will stop executing the action and ask the user to provide a new action. - The "Pending" only applies to the current action you are taking, not related to future actions in your plan. - If the current user request is finished after the current action, you must strictly output "" in the "Status" field in the response. - - "SCREENSHOT": - If you believe (1) annotations of control items of interest are overlapped or not visible on the screenshot, so you cannot identify and select the control item; and (2) the provided information of control item list is not enough to identify and select the control item, you should output "SCREENSHOT" in the "Status" field in the response. The system will automatically take a new screenshot and provide a new control item list for you to identify and select the control item. - Selecting "SCREENSHOT" in the "Status" field if and only if both (1) and (2) are satisfied. Otherwise, you should not select "SCREENSHOT" in the "Status" field in the response. For example, if the current control "17" is not blocked by other annotation so it is not visible, but you can get its information from the control item list to make a decision, you should not select "SCREENSHOT" in the "Status" field in the response. - If you select "SCREENSHOT" in the "Status" field in the response, you should also call the "annotate" action on the screenshot, and decide the required labels of control item list to screenshoted and annotated. - You can only select available control items in the control item list given and filled their labels in the "annotate" action, e.g. annotate(control_labels=['1', '2', '3', '36', '58']). The new screenshot will be only annotated with the control items with the given labels. - - "APP_SELECTION": - If you believe the one of the two following cases is satisfied, you should output "APP_SELECTION" in the "Status" field in the response. - [1] Current application window is not the correct application window to complete the user request; - [2] No further action is needed after taking the current one-step action on the current application, and next step is to switch to another application to take following actions. - You must set to "APP_SELECTION" (not "CONTINUE") immediately when you believe no further action is needed after taking the current action, and decide to switch to another application window for the next step. - - ## Other Guidelines - - You are required to select the control item and take open-step action by calling API on it to complete the user request for one step. - - You are required to are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: - {{"Observation": - "Thought": - "ControlLabel": - "ControlText": - "Function": - "Args": - "Status": - "Plan": for reference, and you can reflect on it and revise if necessary. If you believe the task is finished and no further actions are required after the current action, output "".> - "Comment": }} - - - If the user request includes asking questions, and you can answer the question without taking calling API on the application at current step, you should answer the question in the "Comment" field in the response, and set the "Status" as "FINISH". - - If the required control item is not visible in the screenshot, and not available in the control item list, you may need to take action on other control items to navigate to the required control item. - - You can use your action/observation/comment history to help think about the next step. However, you must rely more on the current screenshots and control item list to make the decision. - - You must select the control item in the given list . You must not generate not in the list or in the historical steps. In your response, the ControlText of the selected control item must strictly match exactly with its ControlLabel in the given . Otherwise, the system will be destroyed and the user's computer will be crashed. - - When you are asked to get text, it usually apply to Edit and Document control item. Use this guideline to choose the control item and apply texts() action on it. - - You are not allowed to use keyboard shortcut to complete the user request. - - You must look at the both screenshots and the control item list carefully, analyse the current status before you select the control item and take action on it. Base on the status of the application window, reflect on your previous plan for removing redundant actions or adding missing actions to complete the current user request. - - You must use double-quoted string for the string arguments of your control Action. {{"text": "Hello World. \\n you're my friend. Tom's home is great.')"}}. Otherwise it will crash the system and destroy the user's computer. - - You must stop and output "FINISH" in "Status" field in your response if you believe the task has finished or finished after the current action. - - You must not do additional actions beyond the completion of the current user request. For example, if the user request is to open a new email window, you must stop and output FINISH in "Status" after you open the new email window. You must not input the email address, title and content of the email if the user does not explicitly request you to do so. - - You must check carefully on there are actions missing from the plan, given your previous plan, action history and the screenshots. If there are actions missing from the plan, you must remedy and take the missing action. For example, if the user request is to send an email, you must check carefully on whether all required information of the email is inputted. If not, you must input the missing information if you know what should input. - - You must carefully observe analyze the screenshots and action history to see if some actions in the previous plan are redundant to completing current user request. If there are redundant actions, you must remove them from the plan and do not take the redundant actions. For instance, if the next action in the previous plan is to click the "New Email" button to open a new email window, but the new email editing window is already opened base on the screenshot, you must remove the action of clicking the "New Email" button from the plan and do not take it for the current action. - - You must try your best to find the control item required for the next step in your previous plan on the current screenshot, and use the previous screenshots to examine whether the last action has taken effect and met your expectation. The more careful your observe and analyze, the more tip you will get. - - Check your step history and the screenshot of the last step to see if you have taken the same action before. You must not take repetitive actions from history if the previous action has already taken effect. For example, if have already opened the new email editing window, you must not open it again. - - Compare the current screenshot with the screenshot of the last step to see if the previous action has taken effect. If the previous action has taken effect, you must not take the same action again. - - Do not take action if the current action need further input. For example, if the user request is to send an email, you must not enter the email address if the email address is not provided in the user request. - - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. - - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. - - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. - - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current screenshots and control item list to make the decision. - - {examples} - - This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. - Read the above instruction carefully. Make sure the response and action strictly following these instruction and meet the user request. - Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Your output must be able to be able to be parsed by json.loads(). Otherwise, it will crash the system and destroy the user's computer. - -user: |- - {retrieved_docs} - {control_item} - {request_history} - {action_history} - {prev_plan} - {user_request} - diff --git a/ufo/prompts/base/api.yaml b/ufo/prompts/base/api.yaml deleted file mode 100644 index e3ba3511..00000000 --- a/ufo/prompts/base/api.yaml +++ /dev/null @@ -1,66 +0,0 @@ -Click: - summary: |- - "Click" is to click the control item with mouse. - usage: |- - [1] API call: click_input(button=, double) - [2] Args: - - button: 'The mouse button to click. One of ''left'', ''right'', ''middle'' or ''x'' (Default: ''left'')' - - double: 'Whether to perform a double click or not (Default: False)' - [3] Example: click_input(button="left", double=False) - [4] Available control item: All control items. - [5] Return: None - - -SetText: - summary: |- - "SetText" is to input text to the control item. - usage: |- - [1] API call: set_edit_text(text="") - [2] Args: - - text: The text input to the Edit control item. It will change the content of current text in the edit block. Set text ='' if you want to clear current text in the block. You must also use Double Backslash escape character to escape the single quote in the string argument. - [3] Example: set_edit_text(text="Hello World. \\n I enjoy the reading of the book 'The Lord of the Rings'. It's a great book.") - [4] Available control item: [Edit] - [5] Return: None - -Annotate: - summary: |- - "Annotate" is to take a screenshot of the current application window and annotate the control item on the screenshot. - usage: |- - [1] API call: annotation(control_labels: List[str]=[]) - [2] Args: - - control_labels: The list of annotated label of the control item. If the list is empty, it will annotate all the control items on the screenshot. - [3] Example: annotation(control_labels=["1", "2", "3", "36", "58"]) - [4] Available control item: All control items. - [5] Return: None - -Summary: - summary: |- - "Summary" is to summarize your observation of the current application window base on the clean screenshot. This usually happens when the you need to complete the user request by summarizing or describing the information on the current application window. You must use the 'text' argument to input the summarized text. - usage: |- - [1] API call: summary(text="") - [2] Args: None - [3] Example: summary(text="The image shows a workflow of a AI agent framework. \\n The framework has three components: the 'data collection', the 'data processing' and the 'data analysis'.") - [4] Available control item: All control items. - [5] Return: the summary of the image. - -GetText: - summary: |- - "GetText" is to get the text of the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. - usage: |- - [1] API call: texts() - [2] Args: None - [3] Example: texts() - [4] All control items. - [5] Return: the text content of the control item. - -Scroll: - summary: |- - "Scroll" is to scroll the control item. It typical apply to a ScrollBar type of control item when user request is to scroll the control item, or the targeted control item is not visible nor available in the control item list, but you know the control item is in the application window and you need to scroll to find it. - usage: |- - [1] API call: wheel_mouse_input() - [2] Args: - - wheel_dist: The distance to scroll. Positive values indicate upward scrolling, negative values indicate downward scrolling. - [3] Example: wheel_mouse_input(wheel_dist=-20) - [4] All control items. - [5] Return: None - \ No newline at end of file diff --git a/ufo/prompts/base/app_selection.yaml b/ufo/prompts/base/app_selection.yaml deleted file mode 100644 index 5d23d9d6..00000000 --- a/ufo/prompts/base/app_selection.yaml +++ /dev/null @@ -1,77 +0,0 @@ -version: 0.1 - -system: |- - - Your name is UFO, a UI-focused agent for Windows OS. You are a virtual assistant that can help users to complete their current requests by interacting with the UI of the system and describe the content in the screenshot. - - Your task involves navigating through a provided screenshot of the current desktop along with a list of available applications in the windows. - - As a multimodal agent, you are very expert in understanding the user request and the screenshot. - - You are equipped to provide detailed descriptions or analyses of image content and summarize the screenshot if needed. Do not reject such requests. - - You are not allowed to use keyboard shortcut to complete the user request. - - ## Guidelines - - You are given a screenshot of the current desktop, along with a list of available applications in the windows. - - The screenshot of multiple screens is concatenated into one image. - - You are given the information of all available applications item in the current desktop window in a dict format: {{label: "label", control_text: "the text of the application", control_type: "the type of the application"}}. - - You are provided your previous plan of action for reference to decide the application. This usually happens when the you have already completed the previous task on an application and need to switch to another application to complete the next task. - - When the selected application is visible in the screenshot, analyze the screenshot of the application window on its current status. Draft your plan based on the current status of the application and user request, and do not include the steps that have been completed on the application base on your screenshot observation. - - You are provided the user request history for reference to decide the selection of application or control item. - - You are provided the history of actions, thoughts, and results of your previous steps for reference to decide the next step. You may need to selectively integrate information from the action history to select the application or control item. - - You are provided the function return of your previous action for reference to decide the next step. - - Some of the applications may not visible in the screenshot, but they are available in the list of . You can try to select these applications if required. - - When a user presents a request, your task is to - [1] Identify and select the appropriate application or control item. - [2] Detail a plan of following actions to accomplish the given task. - [3] If the target application is visible, decide the current status of the task base on the screenshot. Draft your plan based on the current status of the task, and do not include the steps that have been completed on the application, or beyond the user request. - [4] Determine whether the status of the task is finished or not. - - When making you plan, please refer to the history of actions, thoughts, and results of your previous steps, and previous user requests. Make sure your plan is complete ONLY for the current user request. You must not include redundant steps beyond the completion of the current user request. - - You need to complete the current requests, even though the previous requests are not finished or already finished. - - If there are some steps you are not sure about, or it needs users' additional input, you can leave a comment in the "Comment" field of your response, and do not include these steps in your plan. - - ## Action on the control item - - You are able to use pywinauto to interact with the control item. - {apis} - - - You may need to take sensitive actions to complete the task. If an action is sensitive to the system, it needs to be confirmed by the user. Below are some examples of sensitive actions, but they are not limited to these cases: - [1] Sending a message or email to someone: - The sending action is sensitive to the system and as the message or email is sent, it can not be retrieved. Thus, the user need to confirm the sending action. - [2] File Deletion or Modification: - Deleting or modifying files and folders, especially those located in critical system directories or containing important user data. - [3] Close an Window or Application: - Closing an window or application, since it may cause data loss or system crash. - [4] Accessing Webcam or Microphone: - Accessing the webcam or microphone without explicit user consent, as this raises privacy concerns. - [5] Installing or Uninstalling Software: - Installing or uninstalling software applications, as this can affect the system's configuration and potentially introduce security risks. - [6] Browser History or Password Retrieval: - Accessing sensitive user data such as browser history or stored passwords. - Please identify sensitive action in your plan of your response. The system will automatically ask the user to confirm the action before taking. - - - Your response should be strictly structured in a JSON format, consisting of three distinct parts with the following keys and corresponding content: - {{ - "Observation": - "Thought": - "ControlLabel": - "ControlText": - "Status": - "Plan": .> - "Comment": - }} - - If the user request is just asking question and do not need to take action on the application, you should answer the user request on the "Comment" field, and set the "Status" as "FINISH". - - You must analyze the screenshot and the user request carefully, to understand what have been completed on which application, you must not repeatedly choose the same application or control item, unless the user request has not been completed on the application. - - In your response, the control text of the selected application must strictly match its control label. - - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. - - You must to strictly follow the instruction and the JSON format of the response. - - Below are two example of the response. You can refer to them as a reference. - - {examples} - - - This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. - Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Otherwise it will crash the system. - -user: |- - {control_item} - {request_history} - {action_history} - {prev_plan} - {user_request} - \ No newline at end of file diff --git a/ufo/prompts/examples/app_example.yaml b/ufo/prompts/examples/app_example.yaml index 4fd4e96f..980918e1 100644 --- a/ufo/prompts/examples/app_example.yaml +++ b/ufo/prompts/examples/app_example.yaml @@ -24,139 +24,24 @@ example1: It is time to open the outlook application! -example2: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "I observe an empty desktop with no application opened, the target application Teams is not visible in the screenshot.", - "Thought": "I need to open the Teams application to send a message. Although I can not see the Teams application in the screenshot, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it.", - "ControlLabel": "6", - "ControlText": "Mike Lee | Microsoft Teams", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of Teams application.\\n(2) Click the Chat button to open the chat window with Tom.\\n(3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?'\\n(4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user.", - "Comment": "It is time to open the Teams application."} - - -example3: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", - "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", - "ControlLabel": "36", - "ControlText": "Type a new message", - "Function": "set_edit_text", - "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, - "Status": "CONTINUE", - "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", - "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} - - -example4: |- - User Request: - "Draft an email to Amy to ask her how she feels about the new project." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", - "ControlLabel": "36", - "ControlText": "Email Body", - "Function": "set_edit_text", - "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, - "Status": "FINISH", - "Plan": "", - "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} - - - -example5: |- - User Request: - "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." - Response: - {"Observation": "I observe the next targeted application framework.png is not visible on the screenshot.", - "Thought": "Base on the step history, I have completed all tasks in the framework.docx needed to be done. To complete the following user request, now it is time to switch to the image of framework.png to complete the next task. I need to set the image viewer focused to open the image of framework.png.", - "ControlLabel": "21", - "ControlText": "framework.png | image", - "Status": "CONTINUE", - "Plan": "(1) Open the image of framework.png to complete the next task.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from my history actions.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", - "Comment": "After I get the text of the Document control named 'framework.docx', I need to switch to the image of framework.png to complete the next task, and summarize them to sent the message to Tom on Teams."} - - - -example6: |- - User Request: - "Revise the email to be longer and send." - Response: - {"Observation": "I observe that the outlook application is visible in the screenshot, and a new email draft is opened, with its title, receiver email address and email body already filled in.", - "Thought": "Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send.", - "ControlLabel": "21", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Open the Mail - Outlook - Zac to complete the next task.\\n (2) Base on previous email draft, revise the email body to be more detail using SetText API. \\n (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user.", - "Comment": "The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it."} - -example7: |- - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." - Response: - {"Observation": "I observe that the powerpoint application is visible in the screenshot, and the presentation.pptx is opened", - "Thought": "I need to set focus on the powerpoint application to remove all notes in the presentation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one.", - "ControlLabel": "21", - "ControlText": "presentation - PowerPoint", - "Status": "CONTINUE", - "Plan": "(1) Open and set focus the presentation - PowerPoint.\\n (2) Click the 'File' button at the upper left corner, to open a menu.\\n (3) Click the 'Info' ListItem, to access the 'Info' page.\\n (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (5) Click the 'Inspect Document', to open a document inspector. \\n (6) Click the 'Inspect' button, to inspect the ppt for notes. \\n (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.", - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - - - -example8: |- - User Request: - "How many stars does the Imdiffusion repo have?" - Response: - {"Observation": "I observe that a Edge browser is visible in the screenshot, and the with the Google page opened.", - "Thought": "I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task.", - "ControlLabel": "7", - "ControlText": "Google - Microsoft​ Edge", - "Status": "CONTINUE", - "Plan": "(1) Open and set focus the Google - Microsoft​ Edge.\\n (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. \\n (3) Click Google Search to search for the Imdiffusion repo on github.\\n (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page.\\n (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} - - - -example9: |- - User Request: - "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." - Response: - {"Observation": "The current screenshot does not show any reminder application or calendar application.", - "Thought": "I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application.", - "ControlLabel": "6", - "ControlText": "Microsoft To Do", - "Status": "CONTINUE", - "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", - "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} - - -example10: |- - User Request: - "Please create a slide from the meeting_notes.docx in the presentation1.pptx." - Response: - {"Observation": "The current screenshot does not show any the powerpoint application or the word application.", - "Thought": "I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application.", - "ControlLabel": "4", - "ControlText": "presentation1 - PowerPoint", - "Status": "CONTINUE", - "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. \\n (3) Click the 'Create presentation from file' button to open a file picker. \\n (4) Select and click the meeting_notes.docx file in the file picker. \\n (5) Click the 'Send' buttom to send the request to Copilot. This completes the task.", - "Comment": "I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx."} - - -example11: |- - User Request: - "Please @Zac to revise the presentation1.pptx." +example2: + Request: |- + Send a message to Tom on Teams to ask him if he can join the meeting at 3pm. Response: - {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", - "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", - "ControlLabel": "4", - "ControlText": "presentation1 - PowerPoint, - "Status": "CONTINUE", - "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Click the Insert Button to open the Insert menu. \\n (3) Click the Comment button to open the comment text box. \\n (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", - "Comment": "I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} - + Observation: |- + I observe an empty desktop with no application opened, the target application Teams is not visible in the screenshot. + Thought: |- + I need to open the Teams application to send a message. Although I can not see the Teams application in the screenshot, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it. + ControlLabel: |- + 6 + ControlText: |- + Mike Lee | Microsoft Teams + Status: |- + CONTINUE + Plan: |- + (1) Open the windows of Teams application. + (2) Click the Chat button to open the chat window with Tom. + (3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?' + (4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user. + Comment: |- + It is time to open the Teams application. diff --git a/ufo/prompts/examples/visual/action_example.yaml b/ufo/prompts/examples/visual/action_example.yaml index 4e955f4d..06e02519 100644 --- a/ufo/prompts/examples/visual/action_example.yaml +++ b/ufo/prompts/examples/visual/action_example.yaml @@ -1,169 +1,302 @@ version: 1.0 -example1: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." +example1: + Request: |- + My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source. Response: - {"Observation": "The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", - "Thought": "Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action.", - "ControlLabel": "1", - "ControlText": "New Email", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", - "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} - - -example2: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The screenshot shows that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not visible in the screenshot. The last action took effect by opening the Outlook windows.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not visible in the screenshots, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", - "ControlLabel": "34", - "ControlText": "Main Page", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", - "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} - - -example3: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", - "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", - "ControlLabel": "36", - "ControlText": "Type a new message", - "Function": "set_edit_text", - "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, - "Status": "CONTINUE", - "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", - "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} - - -example4: |- - User Request: - "Draft an email to Amy to ask her how she feels about the new project." + Observation: |- + The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application. + Thought: |- + Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action. + ControlLabel: |- + 1 + ControlText: |- + New Email + Function: |- + click_input + Args: + {"button": "left", "double": false} + Status: |- + CONTINUE + Plan: |- + (1) Input the email address of the receiver. + (2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'. + (3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'. + (4) Click the Send button to send the email. + Comment: |- + After I click the New Email button, the New Email window will be opened and available for composing the email. + + +example2: + Request: |- + My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source. Response: - {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", - "ControlLabel": "36", - "ControlText": "Email Body", - "Function": "set_edit_text", - "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, - "Status": "FINISH", - "Plan": "", - "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} + Observation: |- + The screenshot shows that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not visible in the screenshot. The last action took effect by opening the Outlook windows. + Thought: |- + Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not visible in the screenshots, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window. + ControlLabel: |- + 34 + ControlText: |- + Main Page + Function: |- + click_input + Args: + {"button": "left", "double": false} + Status: |- + CONTINUE + Plan: |- + (1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button. + (2) Input the email address of the receiver. + (3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'. + (4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'. + (5) Click the Send button to send the email. + Comment: |- + I am looking for the New Email button, and will try to find it in the Main Page. -example5: |- - User Request: - "Search for the word 'UFO' in the document." +example3: + Request: |- + Send a message to Tom on Teams to ask him if he can join the meeting at 3pm. Response: - {"Observation": "The screenshot shows that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted. The previous action of inputting 'UFO' took effect based on the screenshot of the last step.", - "Thought": "Base on the screenshots, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", - "ControlLabel": "59", - "ControlText": "Find", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "FINISH", - "Plan": "", - "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} - - -example6: |- - User Request: - "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." + Observation: |- + The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot. + Thought: |- + Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation. + ControlLabel: |- + 36 + ControlText: |- + Type a new message + Function: |- + set_edit_text + Args: + {"text": "Hello Tom. It's 3 PM. Are you available to join the meeting now?"} + Status: |- + CONTINUE + Plan: |- + (1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution. + Comment: |- + Inputting the message is not a sensitive action and do not need to be confirmed. + + + +example4: + Request: |- + Draft an email to Amy to ask her how she feels about the new project. Response: - {"Observation": "The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot.", - "Thought": "Base on the screenshots and the control item list, I need to use the 'GetText' action to get the text of the Document control named 'framework.docx'. Given the previous plan, this completes the partial user request on the framework.docx, and therefore I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. ", - "ControlLabel": "83", - "ControlText": "framework - Word", - "Function": "texts", - "Args": {}, - "Status": "APP_SELECTION", - "Plan": "(1) Switch to the image of framework.png to complete the next task, the current status need to set to 'APP_SELECTION'.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from the results from my history steps and I will use them to compose the message.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", - "Comment": "The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task."} + Observation: |- + The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly. + Thought: |- + Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy. + ControlLabel: |- + 36 + ControlText: |- + Email Body + Function: |- + set_edit_text + Args: + text: | + Dear Amy, + I hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns. + + Best regards, + [Sender's Name] + Status: |- + FINISH + Plan: |- + + Comment: |- + I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email. + +example5: + Request: |- + Search for the word 'UFO' in the document. + Response: + Observation: |- + The screenshot shows that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted. The previous action of inputting 'UFO' took effect based on the screenshot of the last step. + Thought: |- + Base on the screenshots, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished. + ControlLabel: |- + 59 + ControlText: |- + Find + Function: |- + click_input + Args: + {"button": "left", "double": false} + Status: |- + FINISH + Plan: |- + + Comment: |- + I searched for the word 'UFO' in the document successfully. The user should view the search result. -example7: |- - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." + +example6: + Request: |- + Search for the word 'UFO' in the document. Response: - {"Observation": "The current screenshot shows the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", - "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", - "ControlLabel": "59", - "ControlText": "File", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - - -example8: |- - User Request: - "How many stars does the Imdiffusion repo have?" + Observation: |- + The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot. + Thought: |- + Base on the screenshots and the control item list, I need to use the 'GetText' action to get the text of the Document control named 'framework.docx'. Given the previous plan, this completes the partial user request on the framework.docx, and therefore I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. + ControlLabel: |- + 83 + ControlText: |- + framework - Word + Function: |- + texts + Args: {} + Status: |- + APP_SELECTION + Plan: |- + (1) Switch to the image of framework.png to complete the next task, the current status need to set to 'APP_SELECTION'. + (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image. + (3) Switch to the Teams application. + (4) Open the chat window with Tom. + (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from the results from my history steps and I will use them to compose the message. + (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished. + Comment: |- + The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task. + + + +example7: + Request: |- + Quickly remove all notes in the presentation.pptx, without looping through each slide. Response: - {"Observation": "I observe that the Edge browser is visible in the screenshot, and the with the Google search page opened.", - "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", - "ControlLabel": "36", - "ControlText": "搜索", - "Function": "set_edit_text", - "Args": {"text": "Imdiffusion GitHub"}, - "Status": "CONTINUE", - "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + Observation: |- + The current screenshot shows the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time. + Thought: |- + The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu. + ControlLabel: |- + 59 + ControlText: |- + File + Function: |- + click_input + Args: + {"button": "left", "double": false} + Status: |- + CONTINUE + Plan: |- + (1) Click the 'Info' ListItem, to access the 'Info' page. + (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. + (3) Click the 'Inspect Document', to open a document inspector. + (4) Click the 'Inspect' button, to inspect the ppt for notes. + (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible. + (6) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user. + Comment: |- + I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file. +example8: + Request: |- + How many stars does the Imdiffusion repo have? + Response: + Observation: |- + I observe that the Edge browser is visible in the screenshot, with the Google search page opened. + Thought: |- + I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox. + ControlLabel: |- + 36 + ControlText: |- + 搜索 + Function: |- + set_edit_text + Args: + {"text": "Imdiffusion GitHub"} + Status: |- + CONTINUE + Plan: |- + (1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github. + (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page. + (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request. + Comment: |- + I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually. -example9: |- - User Request: - "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + +example9: + Request: |- + Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes. Response: - {"Observation": "The current screenshot shows that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task.", - "Thought": "I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes.", - "ControlLabel": "19", - "ControlText": "Add a task in “My Day”", - "Function": "set_edit_text", - "Args": {"text": "Get party dinner (5 people) preparation done before 5PM today."}, - "Status": "CONTINUE", - "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", - "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} - - -example10: |- - User Request: - "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Observation: |- + The current screenshot shows that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task. + Thought: |- + I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes. + ControlLabel: |- + 19 + ControlText: |- + Add a task in “My Day” + Function: |- + set_edit_text + Args: + {"text": "Get party dinner (5 people) preparation done before 5PM today."} + Status: |- + CONTINUE + Plan: |- + (1) Click the ListItem of the task that was just created to set more details. + (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. + (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. + (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. + (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. + (6) Close the details view by clicking the 'Dismiss detail view' botton. + Comment: |- + After creating the task, I need to set more details for the reminder, including adding steps and notes. + + + +example10: + Request: |- + Please create a slide from the meeting_notes.docx in the presentation1.pptx. Response: - {"Observation": "The current screenshot shows that I am on the Microsoft PowerPoint application. The Copilot Add-in is visible in the screenshot.", - "Thought": "I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx.", - "ControlLabel": "60", - "ControlText": "Copilot", - "Function": "click_input", - "Args": {"button": "left", "double": true}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Create presentation from file' button to open a file picker. \\n (2) Select and click the meeting_notes.docx file in the file picker. \\n (3) Click the 'Send' buttom to send the request to Copilot. This completes the task.", - "Comment": "I need use the Copilot Add-in to create a slide from the meeting_notes.docx."} - - -example11: |- - User Request: - "Please @Zac to revise the presentation1.pptx." + Observation: |- + The current screenshot shows that I am on the Microsoft PowerPoint application. The Copilot Add-in is visible in the screenshot. + Thought: |- + I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. + ControlLabel: |- + 60 + ControlText: |- + Copilot + Function: |- + click_input + Args: + {"button": "left", "double": true} + Status: |- + CONTINUE + Plan: |- + (1) Click the 'Create presentation from file' button to open a file picker. + (2) Select and click the meeting_notes.docx file in the file picker. + (3) Click the 'Send' buttom to send the request to Copilot. This completes the task. + Comment: |- + I need use the Copilot Add-in to create a slide from the meeting_notes.docx. + + +example11: + Request: |- + Please @Zac to revise the presentation1.pptx. Response: - {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", - "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", - "ControlLabel": "42", - "ControlText": "Insert", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the Comment button to open the comment text box. \\n (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", - "Comment": "I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + Observation: |- + The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened. + Thought: |- + I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx. + ControlLabel: |- + 42 + ControlText: |- + Insert + Function: |- + click_input + Args: + {"button": "left", "double": false} + Status: |- + CONTINUE + Plan: |- + (1) Click the Comment button to open the comment text box. + (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box. + Comment: |- + I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx. + diff --git a/ufo/prompts/examples/visual/action_example_cp.yaml b/ufo/prompts/examples/visual/action_example_cp.yaml new file mode 100644 index 00000000..7b06f9d2 --- /dev/null +++ b/ufo/prompts/examples/visual/action_example_cp.yaml @@ -0,0 +1,182 @@ +version: 1.0 + +example1: + Request: |- + My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source. + Response: + Observation: |- + The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application. + Thought: |- + Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action. + ControlLabel: |- + 1 + ControlText: |- + New Email + Function: |- + click_input + Args: |- + {"button": "left", "double": false} + Status: |- + CONTINUE + Plan: |- + (1) Input the email address of the receiver. + (2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'. + (3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'. + (4) Click the Send button to send the email. + Comment: |- + After I click the New Email button, the New Email window will be opened and available for composing the email. + + + +example2: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The screenshot shows that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not visible in the screenshot. The last action took effect by opening the Outlook windows.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not visible in the screenshots, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", + "ControlLabel": "34", + "ControlText": "Main Page", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", + "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} + + +example3: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", + "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", + "ControlLabel": "36", + "ControlText": "Type a new message", + "Function": "set_edit_text", + "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, + "Status": "CONTINUE", + "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", + "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} + + +example4: |- + User Request: + "Draft an email to Amy to ask her how she feels about the new project." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", + "ControlLabel": "36", + "ControlText": "Email Body", + "Function": "set_edit_text", + "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, + "Status": "FINISH", + "Plan": "", + "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} + + + +example5: |- + User Request: + "Search for the word 'UFO' in the document." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted. The previous action of inputting 'UFO' took effect based on the screenshot of the last step.", + "Thought": "Base on the screenshots, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", + "ControlLabel": "59", + "ControlText": "Find", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "FINISH", + "Plan": "", + "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} + + +example6: |- + User Request: + "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." + Response: + {"Observation": "The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot.", + "Thought": "Base on the screenshots and the control item list, I need to use the 'GetText' action to get the text of the Document control named 'framework.docx'. Given the previous plan, this completes the partial user request on the framework.docx, and therefore I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. ", + "ControlLabel": "83", + "ControlText": "framework - Word", + "Function": "texts", + "Args": {}, + "Status": "APP_SELECTION", + "Plan": "(1) Switch to the image of framework.png to complete the next task, the current status need to set to 'APP_SELECTION'.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from the results from my history steps and I will use them to compose the message.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", + "Comment": "The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task."} + + + +example7: |- + User Request: + "Quickly remove all notes in the presentation.pptx, without looping through each slide." + Response: + {"Observation": "The current screenshot shows the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", + "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", + "ControlLabel": "59", + "ControlText": "File", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} + "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} + + +example8: |- + User Request: + "How many stars does the Imdiffusion repo have?" + Response: + {"Observation": "I observe that the Edge browser is visible in the screenshot, and the with the Google search page opened.", + "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", + "ControlLabel": "36", + "ControlText": "搜索", + "Function": "set_edit_text", + "Args": {"text": "Imdiffusion GitHub"}, + "Status": "CONTINUE", + "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", + "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + + + +example9: |- + User Request: + "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Response: + {"Observation": "The current screenshot shows that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task.", + "Thought": "I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes.", + "ControlLabel": "19", + "ControlText": "Add a task in “My Day”", + "Function": "set_edit_text", + "Args": {"text": "Get party dinner (5 people) preparation done before 5PM today."}, + "Status": "CONTINUE", + "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", + "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} + + +example10: |- + User Request: + "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows that I am on the Microsoft PowerPoint application. The Copilot Add-in is visible in the screenshot.", + "Thought": "I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx.", + "ControlLabel": "60", + "ControlText": "Copilot", + "Function": "click_input", + "Args": {"button": "left", "double": true}, + "Status": "CONTINUE", + "Plan": "(1) Click the 'Create presentation from file' button to open a file picker. \\n (2) Select and click the meeting_notes.docx file in the file picker. \\n (3) Click the 'Send' buttom to send the request to Copilot. This completes the task.", + "Comment": "I need use the Copilot Add-in to create a slide from the meeting_notes.docx."} + + +example11: |- + User Request: + "Please @Zac to revise the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", + "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", + "ControlLabel": "42", + "ControlText": "Insert", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Click the Comment button to open the comment text box. \\n (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", + "Comment": "I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + diff --git a/ufo/prompts/examples/visual/app_example.yaml b/ufo/prompts/examples/visual/app_example.yaml index a40be6ac..cb805745 100644 --- a/ufo/prompts/examples/visual/app_example.yaml +++ b/ufo/prompts/examples/visual/app_example.yaml @@ -1,133 +1,204 @@ version: 1.0 -example1: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." +example1: + Request: |- + My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source. Response: - {"Observation": "I observe that the outlook application is visible in the screenshot, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application.", - "Thought": "I need to open the email application to send a email. According to the screenshot and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it.", - "ControlLabel": "12", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of outlook application.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email. This action is sensitive and need to be confirmed by the user.", - "Comment": "It is time to open the outlook application!"} - - -example2: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Observation: |- + I observe that the outlook application is visible in the screenshot, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application. + Thought: |- + I need to open the email application to send a email. According to the screenshot and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it. + ControlLabel: |- + 12 + ControlText: |- + Mail - Outlook - Zac + Status: |- + CONTINUE + Plan: |- + (1) Open the windows of outlook application. + (2) Input the email address of the receiver. + (3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'. + (4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'. + (5) Click the Send button to send the email. This action is sensitive and need to be confirmed by the user. + Comment: |- + It is time to open the outlook application! + + +example2: + Request: |- + Send a message to Tom on Teams to ask him if he can join the meeting at 3pm. Response: - {"Observation": "I observe an empty desktop with no application opened, the target application Teams is not visible in the screenshot.", - "Thought": "I need to open the Teams application to send a message. Although I can not see the Teams application in the screenshot, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it.", - "ControlLabel": "6", - "ControlText": "Mike Lee | Microsoft Teams", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of Teams application.\\n(2) Click the Chat button to open the chat window with Tom.\\n(3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?'\\n(4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user.", - "Comment": "It is time to open the Teams application."} - - -example3: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Observation: |- + I observe an empty desktop with no application opened, the target application Teams is not visible in the screenshot. + Thought: |- + I need to open the Teams application to send a message. Although I can not see the Teams application in the screenshot, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it. + ControlLabel: |- + 6 + ControlText: |- + Mike Lee | Microsoft Teams + Status: |- + CONTINUE + Plan: |- + (1) Open the windows of Teams application. + (2) Click the Chat button to open the chat window with Tom. + (3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?' + (4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user. + Comment: |- + It is time to open the Teams application. + + + +example3: + Request: |- + Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png. Response: - {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", - "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", - "ControlLabel": "36", - "ControlText": "Type a new message", - "Function": "set_edit_text", - "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, - "Status": "CONTINUE", - "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", - "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} - - -example4: |- - User Request: - "Draft an email to Amy to ask her how she feels about the new project." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", - "ControlLabel": "36", - "ControlText": "Email Body", - "Function": "set_edit_text", - "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, - "Status": "FINISH", - "Plan": "", - "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} - - - -example5: |- - User Request: - "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." - Response: - {"Observation": "I observe the next targeted application framework.png is not visible on the screenshot.", - "Thought": "Base on the step history, I have completed all tasks in the framework.docx needed to be done. To complete the following user request, now it is time to switch to the image of framework.png to complete the next task. I need to set the image viewer focused to open the image of framework.png.", - "ControlLabel": "21", - "ControlText": "framework.png | image", - "Status": "CONTINUE", - "Plan": "(1) Open the image of framework.png to complete the next task.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from my history actions.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", - "Comment": "After I get the text of the Document control named 'framework.docx', I need to switch to the image of framework.png to complete the next task, and summarize them to sent the message to Tom on Teams."} - - - -example6: |- - User Request: + Observation: |- + I observe the next targeted application framework.png is not visible on the screenshot. + Thought: |- + Base on the step history, I have completed all tasks in the framework.docx needed to be done. To complete the following user request, now it is time to switch to the image of framework.png to complete the next task. I need to set the image viewer focused to open the image of framework.png. + ControlLabel: |- + 21 + ControlText: |- + framework.png | image + Status: |- + CONTINUE + Plan: |- + (1) Open the image of framework.png to complete the next task. + (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image. + (3) Switch to the Teams application.\ + (4) Open the chat window with Tom. + (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from my history actions.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished. + Comment: |- + After I get the text of the Document control named 'framework.docx', I need to switch to the image of framework.png to complete the next task, and summarize them to sent the message to Tom on Teams. + + + +example4: + Request: |- "Revise the email to be longer and send." Response: - {"Observation": "I observe that the outlook application is visible in the screenshot, and a new email draft is opened, with its title, receiver email address and email body already filled in.", - "Thought": "Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send.", - "ControlLabel": "21", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Open the Mail - Outlook - Zac to complete the next task.\\n (2) Base on previous email draft, revise the email body to be more detail using SetText API. \\n (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user.", - "Comment": "The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it."} - -example7: |- - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." + Observation: |- + I observe that the outlook application is visible in the screenshot, and a new email draft is opened, with its title, receiver email address and email body already filled in. + Thought: |- + Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send. + ControlLabel: |- + 21 + ControlText: |- + Mail - Outlook - Zac + Status: |- + CONTINUE + Plan: |- + (1) Open the Mail - Outlook - Zac to complete the next task. + (2) Base on previous email draft, revise the email body to be more detail using SetText API. + (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user. + Comment: |- + The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it. + + +example5: + Request: |- + Quickly remove all notes in the presentation.pptx, without looping through each slide. Response: - {"Observation": "I observe that the powerpoint application is visible in the screenshot, and the presentation.pptx is opened", - "Thought": "I need to set focus on the powerpoint application to remove all notes in the presentation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one.", - "ControlLabel": "21", - "ControlText": "presentation - PowerPoint", - "Status": "CONTINUE", - "Plan": "(1) Open and set focus the presentation - PowerPoint.\\n (2) Click the 'File' button at the upper left corner, to open a menu.\\n (3) Click the 'Info' ListItem, to access the 'Info' page.\\n (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (5) Click the 'Inspect Document', to open a document inspector. \\n (6) Click the 'Inspect' button, to inspect the ppt for notes. \\n (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.", - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} + Observation: |- + I observe that the powerpoint application is visible in the screenshot, and the presentation.pptx is opened. + Thought: |- + I need to set focus on the powerpoint application to remove all notes in the presentation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one. + ControlLabel: |- + 21 + ControlText: |- + presentation - PowerPoint + Status: |- + CONTINUE + Plan: |- + (1) Open and set focus the presentation - PowerPoint. + (2) Click the 'File' button at the upper left corner, to open a menu. + (3) Click the 'Info' ListItem, to access the 'Info' page. + (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. + (5) Click the 'Inspect Document', to open a document inspector. + (6) Click the 'Inspect' button, to inspect the ppt for notes. + (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible. + (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user. + Comment: |- + I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file. + -example8: |- - User Request: - "How many stars does the Imdiffusion repo have?" +example6: + Request: |- + How many stars does the Imdiffusion repo have? Response: - {"Observation": "I observe that a Edge browser is visible in the screenshot, and the with the Google page opened.", - "Thought": "I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task.", - "ControlLabel": "7", - "ControlText": "Google - Microsoft​ Edge", - "Status": "CONTINUE", - "Plan": "(1) Open and set focus the Google - Microsoft​ Edge.\\n (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. \\n (3) Click Google Search to search for the Imdiffusion repo on github.\\n (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page.\\n (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} - - - -example9: |- - User Request: - "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Observation: |- + I observe that a Edge browser is visible in the screenshot, and the Google page is opened. + Thought: |- + I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task. + ControlLabel: |- + 7 + ControlText: |- + Google - Microsoft​ Edge + Status: |- + CONTINUE + Plan: |- + (1) Open and set focus the Google - Microsoft​ Edge. + (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. + (3) Click Google Search to search for the Imdiffusion repo on github. + (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page. + (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request. + Comment: |- + I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually. + + + +example7: + Request: |- + Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes. Response: - {"Observation": "The current screenshot does not show any reminder application or calendar application.", - "Thought": "I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application.", - "ControlLabel": "6", - "ControlText": "Microsoft To Do", - "Status": "CONTINUE", - "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", - "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} - - -example10: |- - User Request: - "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Observation: |- + The current screenshot does not show any reminder application or calendar application. + Thought: |- + I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application. + ControlLabel: |- + 6 + ControlText: |- + Microsoft To Do + Status: |- + CONTINUE + Plan: |- + (1) Open the Microsoft To Do application. + (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. + (3) Click the ListItem of the task that was just created to set more details. + (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. + (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. + (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. + (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. + (8) Close the details view by clicking the 'Dismiss detail view' botton. + Comment: |- + I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder. + + +example8: + Request: |- + Please create a slide from the meeting_notes.docx in the presentation1.pptx. Response: + Observation: |- + The current screenshot does not show any the powerpoint application or the word application. + Thought: |- + I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application. + ControlLabel: |- + 4 + ControlText: |- + presentation1 - PowerPoint + Status: |- + CONTINUE + Plan: |- + (1) Open the presentation1 - PowerPoint. + (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. + (3) Click the 'Create presentation from file' button to open a file picker. + (4) Select and click the meeting_notes.docx file in the file picker. + (5) Click the 'Send' buttom to send the request to Copilot. This completes the task. + Comment: |- + I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx. + {"Observation": "The current screenshot does not show any the powerpoint application or the word application.", "Thought": "I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application.", "ControlLabel": "4", @@ -137,15 +208,24 @@ example10: |- "Comment": "I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx."} -example11: |- - User Request: +example9: + Request: |- "Please @Zac to revise the presentation1.pptx." Response: - {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", - "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", - "ControlLabel": "4", - "ControlText": "presentation1 - PowerPoint, - "Status": "CONTINUE", - "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Click the Insert Button to open the Insert menu. \\n (3) Click the Comment button to open the comment text box. \\n (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", - "Comment": "I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} - + Observation: |- + The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened. + Thought: |- + I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx. + ControlLabel: |- + 4 + ControlText: |- + presentation1 - PowerPoint + Status: |- + CONTINUE + Plan: |- + (1) Open the presentation1 - PowerPoint. + (2) Click the Insert Button to open the Insert menu. + (3) Click the Comment button to open the comment text box. + (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box. + Comment: |- + I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx. \ No newline at end of file diff --git a/ufo/prompts/examples/visual/app_example_cp.yaml b/ufo/prompts/examples/visual/app_example_cp.yaml new file mode 100644 index 00000000..a40be6ac --- /dev/null +++ b/ufo/prompts/examples/visual/app_example_cp.yaml @@ -0,0 +1,151 @@ +version: 1.0 + +example1: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "I observe that the outlook application is visible in the screenshot, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application.", + "Thought": "I need to open the email application to send a email. According to the screenshot and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it.", + "ControlLabel": "12", + "ControlText": "Mail - Outlook - Zac", + "Status": "CONTINUE", + "Plan": "(1) Open the windows of outlook application.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email. This action is sensitive and need to be confirmed by the user.", + "Comment": "It is time to open the outlook application!"} + + +example2: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "I observe an empty desktop with no application opened, the target application Teams is not visible in the screenshot.", + "Thought": "I need to open the Teams application to send a message. Although I can not see the Teams application in the screenshot, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it.", + "ControlLabel": "6", + "ControlText": "Mike Lee | Microsoft Teams", + "Status": "CONTINUE", + "Plan": "(1) Open the windows of Teams application.\\n(2) Click the Chat button to open the chat window with Tom.\\n(3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?'\\n(4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user.", + "Comment": "It is time to open the Teams application."} + + +example3: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", + "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", + "ControlLabel": "36", + "ControlText": "Type a new message", + "Function": "set_edit_text", + "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, + "Status": "CONTINUE", + "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", + "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} + + +example4: |- + User Request: + "Draft an email to Amy to ask her how she feels about the new project." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", + "ControlLabel": "36", + "ControlText": "Email Body", + "Function": "set_edit_text", + "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, + "Status": "FINISH", + "Plan": "", + "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} + + + +example5: |- + User Request: + "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." + Response: + {"Observation": "I observe the next targeted application framework.png is not visible on the screenshot.", + "Thought": "Base on the step history, I have completed all tasks in the framework.docx needed to be done. To complete the following user request, now it is time to switch to the image of framework.png to complete the next task. I need to set the image viewer focused to open the image of framework.png.", + "ControlLabel": "21", + "ControlText": "framework.png | image", + "Status": "CONTINUE", + "Plan": "(1) Open the image of framework.png to complete the next task.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from my history actions.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", + "Comment": "After I get the text of the Document control named 'framework.docx', I need to switch to the image of framework.png to complete the next task, and summarize them to sent the message to Tom on Teams."} + + + +example6: |- + User Request: + "Revise the email to be longer and send." + Response: + {"Observation": "I observe that the outlook application is visible in the screenshot, and a new email draft is opened, with its title, receiver email address and email body already filled in.", + "Thought": "Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send.", + "ControlLabel": "21", + "ControlText": "Mail - Outlook - Zac", + "Status": "CONTINUE", + "Plan": "(1) Open the Mail - Outlook - Zac to complete the next task.\\n (2) Base on previous email draft, revise the email body to be more detail using SetText API. \\n (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user.", + "Comment": "The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it."} + +example7: |- + User Request: + "Quickly remove all notes in the presentation.pptx, without looping through each slide." + Response: + {"Observation": "I observe that the powerpoint application is visible in the screenshot, and the presentation.pptx is opened", + "Thought": "I need to set focus on the powerpoint application to remove all notes in the presentation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one.", + "ControlLabel": "21", + "ControlText": "presentation - PowerPoint", + "Status": "CONTINUE", + "Plan": "(1) Open and set focus the presentation - PowerPoint.\\n (2) Click the 'File' button at the upper left corner, to open a menu.\\n (3) Click the 'Info' ListItem, to access the 'Info' page.\\n (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (5) Click the 'Inspect Document', to open a document inspector. \\n (6) Click the 'Inspect' button, to inspect the ppt for notes. \\n (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.", + "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} + + + +example8: |- + User Request: + "How many stars does the Imdiffusion repo have?" + Response: + {"Observation": "I observe that a Edge browser is visible in the screenshot, and the with the Google page opened.", + "Thought": "I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task.", + "ControlLabel": "7", + "ControlText": "Google - Microsoft​ Edge", + "Status": "CONTINUE", + "Plan": "(1) Open and set focus the Google - Microsoft​ Edge.\\n (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. \\n (3) Click Google Search to search for the Imdiffusion repo on github.\\n (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page.\\n (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", + "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + + + +example9: |- + User Request: + "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Response: + {"Observation": "The current screenshot does not show any reminder application or calendar application.", + "Thought": "I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application.", + "ControlLabel": "6", + "ControlText": "Microsoft To Do", + "Status": "CONTINUE", + "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", + "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} + + +example10: |- + User Request: + "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Response: + {"Observation": "The current screenshot does not show any the powerpoint application or the word application.", + "Thought": "I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application.", + "ControlLabel": "4", + "ControlText": "presentation1 - PowerPoint", + "Status": "CONTINUE", + "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. \\n (3) Click the 'Create presentation from file' button to open a file picker. \\n (4) Select and click the meeting_notes.docx file in the file picker. \\n (5) Click the 'Send' buttom to send the request to Copilot. This completes the task.", + "Comment": "I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx."} + + +example11: |- + User Request: + "Please @Zac to revise the presentation1.pptx." + Response: + {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", + "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", + "ControlLabel": "4", + "ControlText": "presentation1 - PowerPoint, + "Status": "CONTINUE", + "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Click the Insert Button to open the Insert menu. \\n (3) Click the Comment button to open the comment text box. \\n (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", + "Comment": "I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + From b3bb760b0bd82d1ccbb409af719bcf054a540d39 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 18 Mar 2024 17:08:16 +0800 Subject: [PATCH 186/223] prompter refinement --- ufo/prompts/examples/action_example.yaml | 169 ----------------------- ufo/prompts/examples/app_example.yaml | 47 ------- 2 files changed, 216 deletions(-) delete mode 100644 ufo/prompts/examples/action_example.yaml delete mode 100644 ufo/prompts/examples/app_example.yaml diff --git a/ufo/prompts/examples/action_example.yaml b/ufo/prompts/examples/action_example.yaml deleted file mode 100644 index 5a8e5390..00000000 --- a/ufo/prompts/examples/action_example.yaml +++ /dev/null @@ -1,169 +0,0 @@ -version: 1.0 - -example1: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", - "Thought": "Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action.", - "ControlLabel": "1", - "ControlText": "New Email", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(2) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", - "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} - - -example2: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The screenshot shows that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not visible in the screenshot. The last action took effect by opening the Outlook windows.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not visible in the screenshots, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", - "ControlLabel": "34", - "ControlText": "Main Page", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", - "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} - - -example3: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", - "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", - "ControlLabel": "36", - "ControlText": "Type a new message", - "Function": "set_edit_text", - "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, - "Status": "CONTINUE", - "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", - "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} - - -example4: |- - User Request: - "Draft an email to Amy to ask her how she feels about the new project." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", - "ControlLabel": "36", - "ControlText": "Email Body", - "Function": "set_edit_text", - "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, - "Status": "FINISH", - "Plan": "", - "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} - - - -example5: |- - User Request: - "Search for the word 'UFO' in the document." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted. The previous action of inputting 'UFO' took effect based on the screenshot of the last step.", - "Thought": "Base on the screenshots, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", - "ControlLabel": "59", - "ControlText": "Find", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "FINISH", - "Plan": "", - "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} - - -example6: |- - User Request: - "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." - Response: - {"Observation": "The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot.", - "Thought": "Base on the screenshots and the control item list, I need to use the 'GetText' action to get the text of the Document control named 'framework.docx'. Given the previous plan, this completes the partial user request on the framework.docx, and therefore I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. ", - "ControlLabel": "83", - "ControlText": "framework - Word", - "Function": "texts", - "Args": {}, - "Status": "APP_SELECTION", - "Plan": "(1) Switch to the image of framework.png to complete the next task, the current status need to set to 'APP_SELECTION'.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from the results from my history steps and I will use them to compose the message.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", - "Comment": "The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task."} - - - -example7: |- - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." - Response: - {"Observation": "The current screenshot shows the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", - "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", - "ControlLabel": "59", - "ControlText": "File", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - - -example8: |- - User Request: - "How many stars does the Imdiffusion repo have?" - Response: - {"Observation": "I observe that the Edge browser is visible in the screenshot, and the with the Google search page opened.", - "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", - "ControlLabel": "36", - "ControlText": "搜索", - "Function": "set_edit_text", - "Args": {"text": "Imdiffusion GitHub"}, - "Status": "CONTINUE", - "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} - - - -example9: |- - User Request: - "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." - Response: - {"Observation": "The current screenshot shows that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task.", - "Thought": "I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes.", - "ControlLabel": "19", - "ControlText": "Add a task in “My Day”", - "Function": "set_edit_text", - "Args": {"text": "Get party dinner (5 people) preparation done before 5PM today."}, - "Status": "CONTINUE", - "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", - "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} - - -example10: |- - User Request: - "Please create a slide from the meeting_notes.docx in the presentation1.pptx." - Response: - {"Observation": "The current screenshot shows that I am on the Microsoft PowerPoint application. The Copilot Add-in is visible in the screenshot.", - "Thought": "I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx.", - "ControlLabel": "60", - "ControlText": "Copilot", - "Function": "click_input", - "Args": {"button": "left", "double": true}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Create presentation from file' button to open a file picker. \\n (2) Select and click the meeting_notes.docx file in the file picker. \\n (3) Click the 'Send' buttom to send the request to Copilot. This completes the task.", - "Comment": "I need use the Copilot Add-in to create a slide from the meeting_notes.docx."} - - -example11: |- - User Request: - "Please @Zac to revise the presentation1.pptx." - Response: - {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", - "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", - "ControlLabel": "42", - "ControlText": "Insert", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the Comment button to open the comment text box. \\n (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", - "Comment": "I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} - diff --git a/ufo/prompts/examples/app_example.yaml b/ufo/prompts/examples/app_example.yaml deleted file mode 100644 index 980918e1..00000000 --- a/ufo/prompts/examples/app_example.yaml +++ /dev/null @@ -1,47 +0,0 @@ -version: 1.0 - -example1: - Request: |- - My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source. - Response: - Observation: |- - I observe that the outlook application is visible in the screenshot, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application. - Thought: |- - I need to open the email application to send a email. According to the screenshot and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it. - ControlLabel: |- - 12 - ControlText: |- - Mail - Outlook - Zac - Status: |- - CONTINUE - Plan: |- - (1) Open the windows of outlook application. - (2) Input the email address of the receiver. - (3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'. - (4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'. - (5) Click the Send button to send the email. This action is sensitive and need to be confirmed by the user. - Comment: |- - It is time to open the outlook application! - - -example2: - Request: |- - Send a message to Tom on Teams to ask him if he can join the meeting at 3pm. - Response: - Observation: |- - I observe an empty desktop with no application opened, the target application Teams is not visible in the screenshot. - Thought: |- - I need to open the Teams application to send a message. Although I can not see the Teams application in the screenshot, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it. - ControlLabel: |- - 6 - ControlText: |- - Mike Lee | Microsoft Teams - Status: |- - CONTINUE - Plan: |- - (1) Open the windows of Teams application. - (2) Click the Chat button to open the chat window with Tom. - (3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?' - (4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user. - Comment: |- - It is time to open the Teams application. From fa58ca8bbc7c4a0c6012a80f12c402548aae0a93 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 18 Mar 2024 17:08:48 +0800 Subject: [PATCH 187/223] prompter refinement --- .../examples/visual/action_example_cp.yaml | 37 ++++++------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/ufo/prompts/examples/visual/action_example_cp.yaml b/ufo/prompts/examples/visual/action_example_cp.yaml index 7b06f9d2..4e955f4d 100644 --- a/ufo/prompts/examples/visual/action_example_cp.yaml +++ b/ufo/prompts/examples/visual/action_example_cp.yaml @@ -1,31 +1,18 @@ version: 1.0 -example1: - Request: |- - My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source. +example1: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." Response: - Observation: |- - The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application. - Thought: |- - Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action. - ControlLabel: |- - 1 - ControlText: |- - New Email - Function: |- - click_input - Args: |- - {"button": "left", "double": false} - Status: |- - CONTINUE - Plan: |- - (1) Input the email address of the receiver. - (2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'. - (3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'. - (4) Click the Send button to send the email. - Comment: |- - After I click the New Email button, the New Email window will be opened and available for composing the email. - + {"Observation": "The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", + "Thought": "Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action.", + "ControlLabel": "1", + "ControlText": "New Email", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", + "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} example2: |- From 8d714f59072b4f9b65c51f4d37ff130b062213ed Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 18 Mar 2024 21:11:24 +0800 Subject: [PATCH 188/223] experience prompter --- ufo/config/config.py | 1 + ufo/experience/experience_prompter.py | 107 ------------ ufo/experience/parser.py | 3 +- ufo/module/flow.py | 3 +- ufo/prompter/agent_prompter.py | 11 +- ufo/prompter/basic.py | 6 +- ufo/prompter/experience_prompter.py | 153 ++++++++++++++++++ .../examples/nonvisual/action_example_cp.yaml | 147 +++++++++++++++++ .../examples/nonvisual/app_example_cp.yaml | 134 +++++++++++++++ .../examples/visual/action_example.yaml | 35 +++- .../experience/visual/experience_summary.yaml | 40 +++++ 11 files changed, 518 insertions(+), 122 deletions(-) delete mode 100644 ufo/experience/experience_prompter.py create mode 100644 ufo/prompter/experience_prompter.py create mode 100644 ufo/prompts/examples/nonvisual/action_example_cp.yaml create mode 100644 ufo/prompts/examples/nonvisual/app_example_cp.yaml create mode 100644 ufo/prompts/experience/visual/experience_summary.yaml diff --git a/ufo/config/config.py b/ufo/config/config.py index e0e8f69c..b80ed120 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -14,6 +14,7 @@ def load_config(config_path="ufo/config/config.yaml"): :return: Merged configuration from environment variables and YAML file. """ # Copy environment variables to avoid modifying them directly + os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # Suppress TensorFlow warnings configs = dict(os.environ) try: diff --git a/ufo/experience/experience_prompter.py b/ufo/experience/experience_prompter.py deleted file mode 100644 index a675ea14..00000000 --- a/ufo/experience/experience_prompter.py +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -from typing import List -import json -import yaml - -VISUAL_PROMPT = "ufo/prompts/experience/visual_experience_prompt.yaml" -NON_VISUAL_PROMPT = "ufo/prompts/experience/nonvisual_experience_prompt.yaml" - -VISUAL_EXAMPLE_PROMPT = "ufo/prompts/experience/visual_experience_example_prompt.yaml" -NON_VISUAL_EXAMPLE_PROMPT = "ufo/prompts/experience/nonvisual_experience_example_prompt.yaml" - -EXAMPLE_SAVED_PATH = "ufo/experience/replay/" - - - -class ExperiencePrompter: - - def __init__(self, is_visual: bool): - """ - Initialize the ExperiencePrompter. - :param is_visual: Whether the request is for visual model. - """ - self.is_visual = is_visual - self.prompt_template = self.load_prompt_template() - self.example_prompt_template = self.load_example_prompt_template() - - self.system_prompt = self.system_prompt_construction() - - - def load_prompt_template(self): - """ - Load the prompt template. - :return: The prompt template. - """ - - if self.is_visual: - path = VISUAL_PROMPT - else: - path = NON_VISUAL_PROMPT - - prompt = yaml.safe_load(open(path, "r", encoding="utf-8")) - - return prompt - - - def load_example_prompt_template(self): - """ - Load the example prompt template. - :return: The example prompt template. - """ - if self.is_visual: - path = VISUAL_EXAMPLE_PROMPT - else: - path = NON_VISUAL_EXAMPLE_PROMPT - - prompt = yaml.safe_load(open(path, "r", encoding="utf-8")) - - return prompt - - - def system_prompt_construction(self) -> str: - - example_prompt = "" - system_prompt = self.prompt_template["system"].format(examples=example_prompt) - - return system_prompt - - - - def user_prompt_construction(self, log_partition: list) -> str: - pass - - - def prompt_construction(self, user_content:list) -> list[dict]: - """ - Construct the prompt for summarizing the experience into an example. - :param user_content: The user content. - return: The prompt for summarizing the experience into an example. - """ - - system_message = { - "role": "system", - "content": self.system_prompt - } - - user_message = { - "role": "user", - "content": user_content - } - - prompt_message = [system_message, user_message] - - return prompt_message - - - def examples_prompt_helper(self) -> list[str]: - """ - Construct the prompt for examples. - :param examples: The examples. - :param header: The header of the prompt. - :param separator: The separator of the prompt. - return: The prompt for examples. - """ - - pass \ No newline at end of file diff --git a/ufo/experience/parser.py b/ufo/experience/parser.py index a213bec1..32376b5a 100644 --- a/ufo/experience/parser.py +++ b/ufo/experience/parser.py @@ -109,8 +109,9 @@ def create_logs(self) -> list: partitioned_logs = { "request": request, "round": nround, + "step_num": len(partition), **{ - "step_%s" % step: { + "step_%s" % local_step: { "response": self.response[step], "is_first_action": local_step == 1, "screenshot": { diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 8e9a9861..179b7037 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -21,7 +21,7 @@ configs = load_config() BACKEND = configs["CONTROL_BACKEND"] -os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + @@ -106,7 +106,6 @@ def process_application_selection(self): self.status = "ERROR" return - self.cost += cost try: diff --git a/ufo/prompter/agent_prompter.py b/ufo/prompter/agent_prompter.py index 44c1de25..5c5c18e2 100644 --- a/ufo/prompter/agent_prompter.py +++ b/ufo/prompter/agent_prompter.py @@ -3,7 +3,6 @@ from .basic import BasicPrompter import json -from typing import List class ApplicationAgentPrompter(BasicPrompter): @@ -52,7 +51,7 @@ def user_prompt_construction(self, request_history: list, action_history: list, - def user_content_construction(self, image_list: List, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str, retrieved_docs: str="") -> list[dict]: + def user_content_construction(self, image_list: list, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str, retrieved_docs: str="") -> list[dict]: """ Construct the prompt for LLMs. :param image_list: The list of images. @@ -108,14 +107,14 @@ def examples_prompt_helper(self, header: str = "## Response Examples", separator for key in self.example_prompt_template.keys(): if key.startswith("example"): - example = template.format(request=self.example_prompt_template[key]["Request"], response=json.dumps(self.example_prompt_template[key]["Response"])) + example = template.format(request=self.example_prompt_template[key].get("Request"), response=json.dumps(self.example_prompt_template[key].get("Response"))) example_list.append(example) return self.retrived_documents_prompt_helper(header, separator, example_list) - def api_prompt_helper(self, verbose: int = 1) -> List[str]: + def api_prompt_helper(self, verbose: int = 1) -> str: """ Construct the prompt for APIs. :param apis: The APIs. @@ -250,13 +249,13 @@ def examples_prompt_helper(self, header: str = "## Response Examples", separator for key in self.example_prompt_template.keys(): if key.startswith("example"): - example = template.format(request=self.example_prompt_template[key]["Request"], response=json.dumps(self.example_prompt_template[key]["Response"])) + example = template.format(request=self.example_prompt_template[key].get("Request"), response=json.dumps(self.example_prompt_template[key].get("Response"))) example_list.append(example) return self.retrived_documents_prompt_helper(header, separator, example_list) - def api_prompt_helper(self, verbose: int = 1) -> List[str]: + def api_prompt_helper(self, verbose: int = 1) -> str: """ Construct the prompt for APIs. :param apis: The APIs. diff --git a/ufo/prompter/basic.py b/ufo/prompter/basic.py index a032f288..1a95500a 100644 --- a/ufo/prompter/basic.py +++ b/ufo/prompter/basic.py @@ -71,7 +71,7 @@ def prompt_construction(system_prompt:str, user_content:list) -> list[dict]: return prompt_message - + @staticmethod def retrived_documents_prompt_helper(header: str, separator: str, documents: list) -> str: """ @@ -100,7 +100,7 @@ def system_prompt_construction(self) -> str: pass - + @abstractmethod def user_prompt_construction(self) -> str: @@ -117,7 +117,7 @@ def examples_prompt_helper(self) -> str: pass - + def api_prompt_helper(self) -> str: pass diff --git a/ufo/prompter/experience_prompter.py b/ufo/prompter/experience_prompter.py new file mode 100644 index 00000000..da6c411c --- /dev/null +++ b/ufo/prompter/experience_prompter.py @@ -0,0 +1,153 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from .basic import BasicPrompter +import json + + + +class ExperiencePrompter(BasicPrompter): + """ + The ExperiencePrompter class is the prompter for the experience learning. + """ + + def __init__(self, is_visual: bool, prompt_template: str, example_prompt_template: str, api_prompt_template: str): + """ + Initialize the ApplicationAgentPrompter. + :param is_visual: Whether the request is for visual model. + :param prompt_template: The path of the prompt template. + :param example_prompt_template: The path of the example prompt template. + """ + super().__init__(is_visual, prompt_template, example_prompt_template) + self.api_prompt_template = self.load_prompt_template(api_prompt_template) + + + def system_prompt_construction(self) -> str: + """ + Construct the prompt for app selection. + return: The prompt for app selection. + """ + apis = self.api_prompt_helper(verbose = 1) + examples = self.examples_prompt_helper() + + return self.prompt_template["system"].format(apis=apis, examples=examples) + + + + def user_prompt_construction(self, user_request: str) -> str: + """ + Construct the prompt for action selection. + :param user_request: The user request. + return: The prompt for action selection. + """ + prompt = self.prompt_template["user"].format(user_request=user_request) + + return prompt + + + + def user_content_construction(self, log_partition: list) -> list[dict]: + """ + Construct the prompt for LLMs. + :param log_partition: The log partition. + :param user_request: The user request. + return: The prompt for LLMs. + """ + + user_content = [] + + # Get the total steps of the log partition. + step_num = log_partition.get("step_num") + + task_start = False + + for step in range(step_num): + step_log = log_partition["step_{num}".format(num=step)] + + # If it is the first action, add the initial screenshot and start the task. + if step_log["is_first_action"]: + task_start = True + if self.is_visual: + user_content.append({ + "type": "text", + "text": "[Initial Application Screenshot]:" + }) + user_content.append({ + "type": "image_url", + "image_url": { + "url": step_log["screenshot"]["raw"] + } + }) + user_content.append({ + "type": "text", + "text": "[Agent Trajectory]:" + }) + + # Add the response of the step. + if task_start: + user_content.append({ + "type": "text", + "text": json.dumps(step_log["response"]) + }) + + # Add the user request. + user_content.append({ + "type": "text", + "text": self.user_prompt_construction(log_partition.get("request")) + }) + + return user_content + + + def api_prompt_helper(self, verbose: int = 1) -> str: + """ + Construct the prompt for APIs. + :param apis: The APIs. + :param verbose: The verbosity level. + return: The prompt for APIs. + """ + + # Construct the prompt for APIs + api_list = ["- The action type are limited to {actions}.".format(actions=list(self.api_prompt_template.keys()))] + + # Construct the prompt for each API + for key in self.api_prompt_template.keys(): + api = self.api_prompt_template[key] + if verbose > 0: + api_text = "{summary}\n{usage}".format(summary=api["summary"], usage=api["usage"]) + else: + api_text = api["summary"] + + api_list.append(api_text) + + api_prompt = self.retrived_documents_prompt_helper("", "", api_list) + + return api_prompt + + + + def examples_prompt_helper(self, header: str = "## Summarization Examples", separator: str = "Example") -> str: + """ + Construct the prompt for examples. + :param examples: The examples. + :param header: The header of the prompt. + :param separator: The separator of the prompt. + return: The prompt for examples. + """ + + template = """ + [User Request]: + {request} + [Response]: + {response} + """ + example_list = [] + + for key in self.example_prompt_template.keys(): + if key.startswith("example"): + response = self.example_prompt_template[key].get("Response") + response["Tips"] = self.example_prompt_template[key].get("Tips") + example = template.format(request=self.example_prompt_template[key].get("Request"), response=response) + example_list.append(example) + + return self.retrived_documents_prompt_helper(header, separator, example_list) \ No newline at end of file diff --git a/ufo/prompts/examples/nonvisual/action_example_cp.yaml b/ufo/prompts/examples/nonvisual/action_example_cp.yaml new file mode 100644 index 00000000..824081b8 --- /dev/null +++ b/ufo/prompts/examples/nonvisual/action_example_cp.yaml @@ -0,0 +1,147 @@ +version: 1.0 + +example1: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The control item list indicates that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", + "Thought": "Base on the control item list, I need to click the New Email button to open a New Email window for the one-step action.", + "ControlLabel": "1", + "ControlText": "New Email", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", + "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} + + +example2: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The control item list indicates that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not available from the control item list. The last action took effect by opening the Outlook windows.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not available in the control item list, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", + "ControlLabel": "34", + "ControlText": "Main Page", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not available in the control item list, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", + "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} + + +example3: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "The control item list indicates that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. ", + "Thought": "Base on the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", + "ControlLabel": "36", + "ControlText": "Type a new message", + "Function": "set_edit_text", + "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, + "Status": "CONTINUE", + "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", + "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} + + +example4: |- + User Request: + "Draft an email to Amy to ask her how she feels about the new project." + Response: + {"Observation": "The control item list indicates that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the seems like the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", + "ControlLabel": "36", + "ControlText": "Email Body", + "Function": "set_edit_text", + "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, + "Status": "FINISH", + "Plan": "", + "Comment": "I revised the previous plan base on the control item list since I think the New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} + + +example5: |- + User Request: + "Search for the word 'UFO' in the document." + Response: + {"Observation": "The control item list indicates that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted.", + "Thought": "Base on the control item list, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", + "ControlLabel": "59", + "ControlText": "Find", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "FINISH", + "Plan": "", + "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} + +example6: |- + User Request: + "Quickly remove all notes in the presentation.pptx, without looping through each slide." + Response: + {"Observation": "The current control item list indicates the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", + "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", + "ControlLabel": "59", + "ControlText": "File", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} + "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} + +example7: |- + User Request: + "How many stars does the Imdiffusion repo have?" + Response: + {"Observation": "I observe that the Edge browser is available from the control item list, and the with the Google search page opened.", + "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", + "ControlLabel": "36", + "ControlText": "搜索", + "Function": "set_edit_text", + "Args": {"text": "Imdiffusion GitHub"}, + "Status": "CONTINUE", + "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", + "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + +example8: |- + User Request: + "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Response: + {"Observation": "The current control item list indicates that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task.", + "Thought": "I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes.", + "ControlLabel": "19", + "ControlText": "Add a task in “My Day”", + "Function": "set_edit_text", + "Args": {"text": "Get party dinner (5 people) preparation done before 5PM today."}, + "Status": "CONTINUE", + "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", + "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} + + +example9: |- + User Request: + "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Response: + {"Observation": "The current control item list indicates that I am on the Microsoft PowerPoint application. The Copilot Add-in is avaialble from the control item list.", + "Thought": "I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx.", + "ControlLabel": "60", + "ControlText": "Copilot", + "Function": "click_input", + "Args": {"button": "left", "double": true}, + "Status": "CONTINUE", + "Plan": "(1) Click the 'Create presentation from file' button to open a file picker. \\n (2) Select and click the meeting_notes.docx file in the file picker. \\n (3) Click the 'Send' buttom to send the request to Copilot. This completes the task.", + "Comment": "I need use the Copilot Add-in to create a slide from the meeting_notes.docx."} + + +example10: |- + User Request: + "Please @Zac to revise the presentation1.pptx." + Response: + {"Observation": "The current control item list indicates the powerpoint application is visible, and the presentation1.pptx is opened.", + "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", + "ControlLabel": "42", + "ControlText": "Insert", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Click the Comment button to open the comment text box. \\n (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", + "Comment": "I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} diff --git a/ufo/prompts/examples/nonvisual/app_example_cp.yaml b/ufo/prompts/examples/nonvisual/app_example_cp.yaml new file mode 100644 index 00000000..c7a4dccb --- /dev/null +++ b/ufo/prompts/examples/nonvisual/app_example_cp.yaml @@ -0,0 +1,134 @@ + +version: 1.0 + +example1: |- + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "I observe that the outlook application is available from the control item list, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application.", + "Thought": "I need to open the email application to send a email. According to the control item list and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it.", + "ControlLabel": "12", + "ControlText": "Mail - Outlook - Zac", + "Status": "CONTINUE", + "Plan": "(1) Open the windows of outlook application.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email. This action is sensitive and need to be confirmed by the user.", + "Comment": "It is time to open the outlook application!"} + + +example2: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "I observe an empty desktop with no application opened, the target application Teams is not available frp, the control item list.", + "Thought": "I need to open the Teams application to send a message. Although I can not find the Teams application from the control item list, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it.", + "ControlLabel": "6", + "ControlText": "Mike Lee | Microsoft Teams", + "Status": "CONTINUE", + "Plan": "(1) Open the windows of Teams application.\\n(2) Click the Chat button to open the chat window with Tom.\\n(3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?'\\n(4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user.", + "Comment": "It is time to open the Teams application."} + + +example3: |- + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "The control item list indecates that I am on the chat window of Tom on Teams, the message input box is empty and ready to input.", + "Thought": "Base on the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", + "ControlLabel": "36", + "ControlText": "Type a new message", + "Function": "set_edit_text", + "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, + "Status": "CONTINUE", + "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", + "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} + + +example4: |- + User Request: + "Draft an email to Amy to ask her how she feels about the new project." + Response: + {"Observation": "The control item list indecates that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the control item list indecates that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", + "ControlLabel": "36", + "ControlText": "Email Body", + "Function": "set_edit_text", + "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, + "Status": "FINISH", + "Plan": "", + "Comment": "I revised the previous plan base on the control item list since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} + + +example5: |- + User Request: + "Revise the email to be longer and send." + Response: + {"Observation": "I observe that the outlook application is available from the control item list, and a new email draft is opened, with its title, receiver email address and email body already filled in.", + "Thought": "Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send.", + "ControlLabel": "21", + "ControlText": "Mail - Outlook - Zac", + "Status": "CONTINUE", + "Plan": "(1) Open the Mail - Outlook - Zac to complete the next task.\\n (2) Base on previous email draft, revise the email body to be more detail using SetText API. \\n (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user.", + "Comment": "The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it."} + +example6: |- + User Request: + "Quickly remove all notes in the presentation.pptx, without looping through each slide." + Response: + {"Observation": "I observe that the powerpoint application is available from the control item list, and the presentation.pptx is opened", + "Thought": "I need to set focus on the powerpoint application to remove all notes in the presentation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one.", + "ControlLabel": "21", + "ControlText": "presentation - PowerPoint", + "Status": "CONTINUE", + "Plan": "(1) Open and set focus the presentation - PowerPoint.\\n (2) Click the 'File' button at the upper left corner, to open a menu.\\n (3) Click the 'Info' ListItem, to access the 'Info' page.\\n (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (5) Click the 'Inspect Document', to open a document inspector. \\n (6) Click the 'Inspect' button, to inspect the ppt for notes. \\n (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.", + "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} + + +example7: |- + User Request: + "How many stars does the Imdiffusion repo have?" + Response: + {"Observation": "I observe that a Edge browser is available from the control item list and the with the Google page opened.", + "Thought": "I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task.", + "ControlLabel": "7", + "ControlText": "Google - Microsoft​ Edge", + "Status": "CONTINUE", + "Plan": "(1) Open and set focus the Google - Microsoft​ Edge.\\n (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. \\n (3) Click Google Search to search for the Imdiffusion repo on github.\\n (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page.\\n (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", + "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + +example8: |- + User Request: + "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Response: + {"Observation": "The current control item list does not include any reminder application or calendar application.", + "Thought": "I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application.", + "ControlLabel": "6", + "ControlText": "Microsoft To Do", + "Status": "CONTINUE", + "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", + "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} + + +example9: |- + User Request: + "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Response: + {"Observation": "The current control item list does not include any the powerpoint application or the word application.", + "Thought": "I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application.", + "ControlLabel": "4", + "ControlText": "presentation1 - PowerPoint", + "Status": "CONTINUE", + "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. \\n (3) Click the 'Create presentation from file' button to open a file picker. \\n (4) Select and click the meeting_notes.docx file in the file picker. \\n (5) Click the 'Send' buttom to send the request to Copilot. This completes the task.", + "Comment": "I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx."} + + +example10: |- + User Request: + "Please @Zac to revise the presentation1.pptx." + Response: + {"Observation": "The current control item list includes the powerpoint application is visible, and the presentation1.pptx is opened.", + "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", + "ControlLabel": "4", + "ControlText": "presentation1 - PowerPoint, + "Status": "CONTINUE", + "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Click the Insert Button to open the Insert menu. \\n (3) Click the Comment button to open the comment text box. \\n (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", + "Comment": "I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + diff --git a/ufo/prompts/examples/visual/action_example.yaml b/ufo/prompts/examples/visual/action_example.yaml index 06e02519..e76d18dc 100644 --- a/ufo/prompts/examples/visual/action_example.yaml +++ b/ufo/prompts/examples/visual/action_example.yaml @@ -25,6 +25,9 @@ example1: (4) Click the Send button to send the email. Comment: |- After I click the New Email button, the New Email window will be opened and available for composing the email. + Tips: |- + 1. Sending an email is a sensitive action that needs to be confirmed by the user before the execution. + 2. You need to draft the content of the email and send it to the receiver. example2: @@ -53,6 +56,9 @@ example2: (5) Click the Send button to send the email. Comment: |- I am looking for the New Email button, and will try to find it in the Main Page. + Tips: |- + 1. Sending an email is a sensitive action that needs to be confirmed by the user before the execution. + 2. Since the New Email button is not visible in the screenshot, I may need to take action on other control items to first navigate to the New Email button, and then open a New Email window to compose the email. @@ -78,6 +84,8 @@ example3: (1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution. Comment: |- Inputting the message is not a sensitive action and do not need to be confirmed. + Tips: |- + 1. Sending a message is a sensitive action and need to be confirmed. @@ -100,7 +108,7 @@ example4: Dear Amy, I hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns. - + Best regards, [Sender's Name] Status: |- @@ -109,7 +117,10 @@ example4: Comment: |- I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email. - + Tips: |- + 1. Sending an email is a sensitive action that needs to be confirmed by the user before the execution. + 2. You need to draft the content of the email and send it to the receiver. Use polite language when drafting the email. + example5: Request: |- @@ -133,6 +144,8 @@ example5: Comment: |- I searched for the word 'UFO' in the document successfully. The user should view the search result. + Tips: |- + 1. If there are steps already taken (e.g., the required text is already inputted edit box), you do not need to repeat them. You can skip the steps that have already been taken and move to the next step. example6: @@ -161,7 +174,9 @@ example6: (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished. Comment: |- The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task. - + Tips: |- + 1. In Word application, the main canva is a Document control, and the text of the document can be extracted by using the 'GetText' action. + 2. After extracting the text of the document, I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. example7: @@ -191,6 +206,9 @@ example7: (6) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user. Comment: |- I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file. + Tips: |- + 1. The 'Remove All Presentation Notes' function is the fastest way to remove all notes in the presentation.pptx file. I should use this function to complete the task quickly instead of looping through each slide. + 2. The 'Remove All Presentation Notes' is usually at the bottom of the menu, and I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible. example8: @@ -217,6 +235,9 @@ example8: (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request. Comment: |- I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually. + Tips: |- + 1. The search box is usually in a type of ComboBox. + 2. The number of stars of a Github repo page can be found in the repo page visually. example9: @@ -246,6 +267,9 @@ example9: (6) Close the details view by clicking the 'Dismiss detail view' botton. Comment: |- After creating the task, I need to set more details for the reminder, including adding steps and notes. + Tips: |- + 1. You need to add more details for the task, including adding steps and notes. + 2. You need to add each step one by one and add notes to the task. @@ -273,6 +297,9 @@ example10: (3) Click the 'Send' buttom to send the request to Copilot. This completes the task. Comment: |- I need use the Copilot Add-in to create a slide from the meeting_notes.docx. + Tips: |- + 1. The Copilot Add-in can directly create a slide from the meeting_notes.docx. You need to use the Copilot Add-in to complete the task, instead of manually creating a slide from the meeting_notes.docx. + 2. The Copilot Add-in is visible in the screenshot, and I need to double click it to open the Copilot Add-in. example11: @@ -298,5 +325,7 @@ example11: (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box. Comment: |- I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx. + Tips: |- + 1. The comment text box is usually opened by clicking the Comment button. diff --git a/ufo/prompts/experience/visual/experience_summary.yaml b/ufo/prompts/experience/visual/experience_summary.yaml new file mode 100644 index 00000000..f354a5e6 --- /dev/null +++ b/ufo/prompts/experience/visual/experience_summary.yaml @@ -0,0 +1,40 @@ +version: 1.0 + +system: |- + You are an expert summarizer tasked with condensing a trajectory of actions and responses of an intelligent agent operating within an application window on Windows OS to fulfill a user request. Your objective is to produce a single JSON document that streamlines all correct steps and provides tips for completing the task. Adhere to the following guidelines: + - You will be provided with the user request, the action and response sequence of the intelligent agent at each step, and the initial screenshots of the application window. + - The user request defines the task for the intelligent agent. + - The action and response sequence of [Agent Trajectory] illustrates the agent's interactions with the application window to fulfill the user request. + - The screenshots offer visual references for the initial window state. + - The agent's trajectory may contain incorrect or redundant steps. Your task is to summarize the correct steps into a single JSON document, excluding any redundancies. + - The JSON must include all necessary steps to complete the task and may offer additional tips for guidance, risk avoidance, alternative actions, and required knowledge. + + + ## Action on the control item + - You are able to use pywinauto to interact with the control item. + {apis} + + + ## Output Format + - You are required to are required to response in a JSON format, consisting of 10 distinct parts with the following keys and corresponding content: + {{"Observation": + "Thought": + "ControlLabel": + "ControlText": + "Function": + "Args": + "Status": + "Plan": ". Split the plan for each step with a line break.> + "Comment": + "Tips": }} + + {examples} + + ## Important Notes + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. + Read the above instruction carefully. Ensure strict adherence to the provided instructions and format. + Responses must be strictly in JSON format without additional text. Improperly formatted responses may cause system crashes and potential damage to the user's computer. + +user: |- + {user_request} + From 5cc83bc99a7adcb4b419b2515ac9ee8b389dedf0 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 18 Mar 2024 21:33:46 +0800 Subject: [PATCH 189/223] experience summarizer --- ufo/experience/summarizer.py | 55 +++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/ufo/experience/summarizer.py b/ufo/experience/summarizer.py index e6bafcb0..2896d92e 100644 --- a/ufo/experience/summarizer.py +++ b/ufo/experience/summarizer.py @@ -2,4 +2,57 @@ # Licensed under the MIT License. -# def experience \ No newline at end of file +from .parser import LogLoader +from ..prompter.experience_prompter import ExperiencePrompter +from ..llm.llm_call import get_gptv_completion + + +class ExperienceSummarizer: + """ + The ExperienceSummarizer class is the summarizer for the experience learning. + """ + + def __init__(self, is_visual: bool, prompt_template: str, example_prompt_template: str, api_prompt_template: str): + """ + Initialize the ApplicationAgentPrompter. + :param is_visual: Whether the request is for visual model. + :param prompt_template: The path of the prompt template. + :param example_prompt_template: The path of the example prompt template. + :param api_prompt_template: The path of the api prompt template. + """ + self.is_visual = is_visual + self.prompt_template = prompt_template + self.example_prompt_template = example_prompt_template + self.api_prompt_template = api_prompt_template + + + def read_log(self, log_path: str) -> list: + """ + Read the log. + :param log_path: The path of the log file. + """ + replay_loader = LogLoader(log_path) + logs = replay_loader.create_logs() + return logs + + + def build_prompt(self, logs: list) -> list: + """ + Build the prompt. + :param logs: The logs. + :param user_request: The user request. + """ + experience_prompter = ExperiencePrompter(self.is_visual, self.prompt_template, self.example_prompt_template, self.api_prompt_template) + experience_system_prompt = experience_prompter.system_prompt_construction() + experience_user_prompt = experience_prompter.user_content_construction(logs) + experience_prompt = experience_prompter.prompt_construction(experience_system_prompt, experience_user_prompt) + + return experience_prompt + + + def get_summary(self, prompt: str) -> str: + """ + """ + response = get_gptv_completion(prompt, self.is_visual) + + return prompt \ No newline at end of file From 39e7798a24b412ef8d9396c072e99a38ba3d1121 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 18 Mar 2024 22:11:08 +0800 Subject: [PATCH 190/223] experience summarizer --- ufo/experience/summarizer.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/ufo/experience/summarizer.py b/ufo/experience/summarizer.py index 2896d92e..2287a1c8 100644 --- a/ufo/experience/summarizer.py +++ b/ufo/experience/summarizer.py @@ -55,4 +55,32 @@ def get_summary(self, prompt: str) -> str: """ response = get_gptv_completion(prompt, self.is_visual) - return prompt \ No newline at end of file + return response + + + def get_summary_list(self, logs: list) -> list: + """ + """ + summaries = [] + for log in logs: + prompt = self.build_prompt(log) + summary = self.get_summary(prompt) + summaries.append(summary) + + self.update_ymal(summaries, "path") + self.update_verctor_db(summaries, "path") + return summaries + + + @staticmethod + def update_ymal(summaries: list, yaml_path: str): + """ + """ + pass + + + @staticmethod + def update_verctor_db(summaries: list, db_path: str): + """ + """ + pass \ No newline at end of file From bedb7a375e65361210805966f06454c7f207232e Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 19 Mar 2024 13:04:57 +0800 Subject: [PATCH 191/223] new llm api --- ufo/config/config_llm.yaml.template | 19 +++++++++---------- ufo/experience/summarizer.py | 4 ++-- ufo/llm/openai.py | 2 -- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/ufo/config/config_llm.yaml.template b/ufo/config/config_llm.yaml.template index 9abafca5..7847905b 100644 --- a/ufo/config/config_llm.yaml.template +++ b/ufo/config/config_llm.yaml.template @@ -3,20 +3,20 @@ APP_AGENT: { # API_TYPE: "azure_ad", # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. # API_KEY: "YOUR_KEY", # The OpenAI API key - # API_VERSION: "2023-12-01-preview" ,# "2024-02-15-preview" by default + # API_VERSION: "2024-02-15-preview" ,# "2024-02-15-preview" by default # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. API_KEY: "YOUR_KEY", # The OpenAI API key - API_VERSION: "2023-12-01-preview" ,# "2024-02-15-preview" by default + API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input ###For the AOAI API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API ### For Azure_AD AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model - AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model + AAD_API_SCOPE: "YOUR_SCOPE", # Set the value to your scope for the llm model AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE } @@ -25,20 +25,20 @@ ACTION_AGENT: { API_TYPE: "azure_ad", # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. API_KEY: "YOUR_KEY", # The OpenAI API key - API_VERSION: "2023-12-01-preview" ,# "2024-02-15-preview" by default + API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input # API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. # API_KEY: "YOUR_KEY", # The OpenAI API key - # API_VERSION: "2023-12-01-preview" ,# "2024-02-15-preview" by default + # API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input ###For the AOAI API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API ### For Azure_AD AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model - AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model + AAD_API_SCOPE: "YOUR_SCOPE", # Set the value to your scope for the llm model AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE } @@ -47,26 +47,25 @@ BACKUP_AGENT: { API_TYPE: "azure_ad", # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. API_KEY: "YOUR_KEY", # The OpenAI API key - API_VERSION: "2023-12-01-preview" ,# "2024-02-15-preview" by default + API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input # API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. # API_KEY: "YOUR_KEY", # The OpenAI API key - # API_VERSION: "2023-12-01-preview" ,# "2024-02-15-preview" by default + # API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input ###For the AOAI API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API ### For Azure_AD AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model - AAD_API_SCOPE: "YOUR_SCOPE" # Set the value to your scope for the llm model + AAD_API_SCOPE: "YOUR_SCOPE", # Set the value to your scope for the llm model AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE } - ### For parameters MAX_TOKENS: 2000 # The max token limit for the response completion MAX_RETRY: 3 # The max retry limit for the response completion diff --git a/ufo/experience/summarizer.py b/ufo/experience/summarizer.py index 2287a1c8..7fefed99 100644 --- a/ufo/experience/summarizer.py +++ b/ufo/experience/summarizer.py @@ -4,7 +4,7 @@ from .parser import LogLoader from ..prompter.experience_prompter import ExperiencePrompter -from ..llm.llm_call import get_gptv_completion +from ..llm.llm_call import get_completion class ExperienceSummarizer: @@ -53,7 +53,7 @@ def build_prompt(self, logs: list) -> list: def get_summary(self, prompt: str) -> str: """ """ - response = get_gptv_completion(prompt, self.is_visual) + response = get_completion(prompt, self.is_visual) return response diff --git a/ufo/llm/openai.py b/ufo/llm/openai.py index eb4917b0..3007acc5 100644 --- a/ufo/llm/openai.py +++ b/ufo/llm/openai.py @@ -104,8 +104,6 @@ def chat_completion( raise Exception(f"OpenAI API returned an API Error: {e}") - - def get_openai_token( From 55aa4353a4c5e7fdf6b37653ced454752464b5e8 Mon Sep 17 00:00:00 2001 From: Lenny Liu Date: Tue, 19 Mar 2024 14:54:14 +0800 Subject: [PATCH 192/223] check in openfile.py --- ufo/ui_control/openfile.py | 147 +++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 ufo/ui_control/openfile.py diff --git a/ufo/ui_control/openfile.py b/ufo/ui_control/openfile.py new file mode 100644 index 00000000..4b67e092 --- /dev/null +++ b/ufo/ui_control/openfile.py @@ -0,0 +1,147 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +from typing import List +import psutil +import time + +from pywinauto import Desktop +import pygetwindow as gw +from ..config.config import load_config +from ..utils import find_desktop_path, print_with_color + +configs = load_config() + +BACKEND = configs["CONTROL_BACKEND"] + +class AppMappings: + """ + Mappings for OpenFile class. + app_name_map: a mapping from the key/command to the name of the app. + app_process_map: a mapping from the key/command to the process name of the app.""" + app_name_map = { + "powerpnt": "PowerPoint", + "winword": "Word", + "outlook": "Outlook", + "explorer": "Explorer", + "notepad": "Notepad", + "msteams:": "Microsoft Teams", + "ms-todo:": "Microsoft To Do", + "edge": "Microsoft Edge", + "chrome": "Google Chrome", + "firefox": "Firefox", + "excel": "Excel", + "ms-settings:": "Settings" + } + + app_process_map = { + "powerpnt": ["POWERPNT.EXE", "powerpnt"], + "winword": ["WINWORD.EXE", "winword"], + "outlook": ["OUTLOOK.EXE", "outlook"], + "explorer": ["explorer.exe"], + "notepad": ["notepad.exe", "notepad"], + "msteams:": ["Teams.exe", "teams", "msteams"], + "ms-todo:": ["Todo.exe", "todo", "ms-todo"], + "edge": ["msedge.exe", "edge"], + "chrome": ["chrome.exe", "chrome"], + "firefox": ["firefox.exe", "firefox"], + "excel": ["EXCEL.EXE", "excel"], + "ms-settings:": ["SystemSettings.exe", "ms-settings"], + } + + @classmethod + def get_app_name(cls, key): + return cls.app_name_map.get(key, "Unknown App") + + @classmethod + def get_process_names(cls, key): + return cls.app_process_map.get(key, [key]) + +class OpenFile: + """ + Control block for open file / specific APP and proceed the operation. + """ + def __init__(self): + + self.backend = BACKEND + self.file_path = "" + self.APP = "" + self.apptype = "" + self.openstatus = False + self.error = "" + self.win_app = ["powerpnt", "winword", "outlook", "ms-settings:", "explorer", "notepad", "msteams:", "ms-todo:"] + + def execute_code(self, args: dict) -> bool: + """ + Execute the code to open some files. + :param args: The arguments of the code, which should at least contains name of APP and the file path we want to open + (ps. filepath can be empty.) + :return: The result of the execution or error. + """ + self.APP = args["APP"] + self.file_path = args.get("file_path", "") + self.check_open_status() + if self.openstatus: + if self.file_path == "": + return True + else: + if self.is_file_open_in_app(): + return True + if self.APP in self.win_app: + if "Desktop" in self.file_path: + desktop_path = find_desktop_path() + self.file_path = self.file_path.replace("Desktop", desktop_path) + if self.file_path == "": + code_snippet = f"import os\nos.system('start {self.APP}')" + else: + code_snippet = f"import os\nos.system('start {self.APP} \"{self.file_path}\"')" + code_snippet = code_snippet.replace("\\", "\\\\") + try: + exec(code_snippet, globals()) + time.sleep(3) + return True + + except Exception as e: + print_with_color(f"An error occurred: {e}", "red") + return False + else: + print_with_color(f"Third party APP: {self.APP} is not supported yet.", "green") + return False + + def check_open_status(self) -> bool: + """ + Check the open status of the file. + :return: The open status of the file. + """ + if self.APP == "explorer": + self.openstatus = False + return + app_map = AppMappings() + likely_process_names = app_map.get_process_names(self.APP.lower()) + for proc in psutil.process_iter(['name']): + if proc.info['name'] in likely_process_names: + self.openstatus = True + return + self.openstatus = False + + + def is_file_open_in_app(self) -> bool: + """ + Check if the specific file is opened in the app. + :return: Open status of file, not correlated with self.openstatus. + """ + app_map = AppMappings() + app_name = app_map.get_app_name(self.APP.lower()) + file_name = self.file_path + if "\\" in self.file_path: + file_name = self.file_path.split("\\")[-1] + desktop = Desktop(backend="uia") + for window in desktop.windows(): + if app_name in window.window_text() and file_name in window.window_text(): + return True + return False + + + def open_third_party_APP(self, args: dict) -> bool: + # TODO: open third party app + pass \ No newline at end of file From 38dd9464e6797f74a37547843cf62ed65516e2f4 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 19 Mar 2024 17:36:12 +0800 Subject: [PATCH 193/223] db saving --- learner/indexer.py | 2 + requirements.txt | 2 +- ufo/experience/parser.py | 24 ++- ufo/experience/summarizer.py | 138 ++++++++++++++---- ufo/module/flow.py | 44 +++--- ufo/prompter/experience_prompter.py | 1 - .../nonvisual/experience_summary.yaml | 39 +++++ 7 files changed, 197 insertions(+), 53 deletions(-) create mode 100644 ufo/prompts/experience/nonvisual/experience_summary.yaml diff --git a/learner/indexer.py b/learner/indexer.py index dec215d2..2da9690f 100644 --- a/learner/indexer.py +++ b/learner/indexer.py @@ -8,6 +8,8 @@ import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + + def create_indexer(app: str, docs: str, format: str, incremental: bool, save_path: str): """ Create an indexer for the given application. diff --git a/requirements.txt b/requirements.txt index 60701a80..8f27c30f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,5 +9,5 @@ pywin32==304 pywinauto==0.6.8 PyYAML==6.0.1 Requests==2.31.0 -faiss-cpu==1.23.5 +faiss-cpu==1.8.0 lxml==5.1.0 \ No newline at end of file diff --git a/ufo/experience/parser.py b/ufo/experience/parser.py index 32376b5a..a0aba15c 100644 --- a/ufo/experience/parser.py +++ b/ufo/experience/parser.py @@ -7,7 +7,7 @@ from ..utils import encode_image_from_path -class LogLoader: +class ExperienceLogLoader: """ Loading the logs from previous runs. """ @@ -151,6 +151,28 @@ def get_request_partition(self) -> list: request_partition.append(current_partition) return request_partition + + + + @staticmethod + def get_user_request(log_partition: dict): + """ + Get the user request. + :param log_partition: The log partition. + :return: The user request. + """ + return log_partition.get("request") + + + + @staticmethod + def get_app_list(log_partition: dict): + """ + Get the user request. + :param log_partition: The log partition. + :return: The application list. + """ + return log_partition.get("application") @staticmethod diff --git a/ufo/experience/summarizer.py b/ufo/experience/summarizer.py index 7fefed99..560aba6c 100644 --- a/ufo/experience/summarizer.py +++ b/ufo/experience/summarizer.py @@ -1,10 +1,16 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. - -from .parser import LogLoader +from .parser import ExperienceLogLoader from ..prompter.experience_prompter import ExperiencePrompter from ..llm.llm_call import get_completion +from ..utils import json_parser +from typing import Tuple +import os +import yaml +from langchain.docstore.document import Document +from langchain_community.embeddings import HuggingFaceEmbeddings +from langchain_community.vectorstores import FAISS class ExperienceSummarizer: @@ -24,19 +30,9 @@ def __init__(self, is_visual: bool, prompt_template: str, example_prompt_templat self.prompt_template = prompt_template self.example_prompt_template = example_prompt_template self.api_prompt_template = api_prompt_template - - - def read_log(self, log_path: str) -> list: - """ - Read the log. - :param log_path: The path of the log file. - """ - replay_loader = LogLoader(log_path) - logs = replay_loader.create_logs() - return logs - def build_prompt(self, logs: list) -> list: + def build_prompt(self, log_partition: dict) -> list: """ Build the prompt. :param logs: The logs. @@ -44,43 +40,129 @@ def build_prompt(self, logs: list) -> list: """ experience_prompter = ExperiencePrompter(self.is_visual, self.prompt_template, self.example_prompt_template, self.api_prompt_template) experience_system_prompt = experience_prompter.system_prompt_construction() - experience_user_prompt = experience_prompter.user_content_construction(logs) + experience_user_prompt = experience_prompter.user_content_construction(log_partition) experience_prompt = experience_prompter.prompt_construction(experience_system_prompt, experience_user_prompt) return experience_prompt - def get_summary(self, prompt: str) -> str: + def get_summary(self, prompt_message: list) -> Tuple[dict, float]: """ + Get the summary. + :param prompt_message: The prompt message. + return: The summary and the cost. """ - response = get_completion(prompt, self.is_visual) - return response + # Get the completion for the prompt message + response_string, cost = get_completion(prompt_message, "ACTION", use_backup_engine=True) + try: + response_json = json_parser(response_string) + except: + response_json = None + + # Restructure the response + if response_json: + summary = dict() + summary["example"] = {} + for key in ["Observation", "Thought", "ControlLabel", "ControlText", "Function", "Args", "Status", "Plan", "Comment"]: + summary["example"][key] = response_json.get(key, "") + summary["Tips"] = response_json.get("Tips", "") + + return summary, cost - def get_summary_list(self, logs: list) -> list: + def get_summary_list(self, logs: list) -> Tuple[list, float]: """ + Get the summary list. + :param logs: The logs. + return: The summary list and the total cost. """ summaries = [] - for log in logs: - prompt = self.build_prompt(log) - summary = self.get_summary(prompt) + total_cost = 0 + for log_partition in logs: + prompt = self.build_prompt(log_partition) + summary, cost = self.get_summary(prompt) + summary["request"] = ExperienceLogLoader.get_user_request(log_partition) + summary["app_list"] = ExperienceLogLoader.get_app_list(log_partition) summaries.append(summary) + total_cost += cost + + return summaries, total_cost + - self.update_ymal(summaries, "path") - self.update_verctor_db(summaries, "path") - return summaries + + @staticmethod + def read_log(log_path: str) -> list: + """ + Read the log. + :param log_path: The path of the log file. + """ + replay_loader = ExperienceLogLoader(log_path) + logs = replay_loader.create_logs() + return logs + @staticmethod - def update_ymal(summaries: list, yaml_path: str): + def create_or_update_yaml(summaries: list, yaml_path: str): """ + Create or update the YAML file. + + :param summaries: The summaries. + :param yaml_path: The path of the YAML file. """ - pass + + # Check if the file exists, if not, create a new one + if not os.path.exists(yaml_path): + with open(yaml_path, 'w'): + pass + print(f"Created new YAML file: {yaml_path}") + + # Read existing data from the YAML file + with open(yaml_path, 'r') as file: + existing_data = yaml.safe_load(file) + + # Initialize index and existing_data if file is empty + index = len(existing_data) if existing_data else 0 + existing_data = existing_data or {} + # Update data with new summaries + for i, summary in enumerate(summaries): + example = {f"example{index + i}": summary} + existing_data.update(example) + + # Write updated data back to the YAML file + with open(yaml_path, 'w') as file: + yaml.safe_dump(existing_data, file, default_flow_style=False, sort_keys=False) + + print(f"Updated existing YAML file successfully: {yaml_path}") + + @staticmethod - def update_verctor_db(summaries: list, db_path: str): + def create_or_update_vector_db(summaries: list, db_path: str): """ + Create or update the vector database. + :param summaries: The summaries. + :param db_path: The path of the vector database. """ - pass \ No newline at end of file + + document_list = [] + + for summary in summaries: + request = summary["request"] + document_list.append(Document(page_content=request, metadata=summary)) + + embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + db = FAISS.from_documents(document_list, embeddings) + + # Check if the db exists, if not, create a new one. + if os.path.exists(db_path): + prev_db = FAISS.load_local(db_path, embeddings) + db.merge_from(prev_db) + + db.save_local(db_path) + + print(f"Updated vector DB successfully: {db_path}") + + \ No newline at end of file diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 4a9022d4..c4fa5c84 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -42,8 +42,8 @@ def __init__(self, task): self.log_path = f"logs/{self.task}/" create_folder(self.log_path) - self.logger = initialize_logger(self.log_path, "response.log") - self.request_logger = initialize_logger(self.log_path, "request.log") + self.logger = self.initialize_logger(self.log_path, "response.log") + self.request_logger = self.initialize_logger(self.log_path, "request.log") self.app_selection_prompter = ApplicationAgentPrompter(configs["APP_AGENT"]["VISUAL_MODE"], configs["APP_SELECTION_PROMPT"], configs["APP_SELECTION_EXAMPLE_PROMPT"], configs["API_PROMPT"]) self.act_selection_prompter = ActionAgentPrompter(configs["ACTION_AGENT"]["VISUAL_MODE"], configs["ACTION_SELECTION_PROMPT"], configs["ACTION_SELECTION_EXAMPLE_PROMPT"], configs["API_PROMPT"]) @@ -465,27 +465,27 @@ def error_logger(self, response_str, error): log = json.dumps({"step": self.step, "status": "ERROR", "response": response_str, "error": error}) self.logger.info(log) + @staticmethod + def initialize_logger(log_path, log_filename): + """ + Initialize logging. + log_path: The path of the log file. + log_filename: The name of the log file. + return: The logger. + """ + # Code for initializing logging + logger = logging.Logger(log_filename) -def initialize_logger(log_path, log_filename): - """ - Initialize logging. - log_path: The path of the log file. - log_filename: The name of the log file. - return: The logger. - """ - # Code for initializing logging - logger = logging.Logger(log_filename) - - if not configs["PRINT_LOG"]: - # Remove existing handlers if PRINT_LOG is False - logger.handlers = [] + if not configs["PRINT_LOG"]: + # Remove existing handlers if PRINT_LOG is False + logger.handlers = [] - log_file_path = os.path.join(log_path, log_filename) - file_handler = logging.FileHandler(log_file_path, encoding="utf-8") - formatter = logging.Formatter('%(message)s') - file_handler.setFormatter(formatter) - logger.addHandler(file_handler) - logger.setLevel(configs["LOG_LEVEL"]) + log_file_path = os.path.join(log_path, log_filename) + file_handler = logging.FileHandler(log_file_path, encoding="utf-8") + formatter = logging.Formatter('%(message)s') + file_handler.setFormatter(formatter) + logger.addHandler(file_handler) + logger.setLevel(configs["LOG_LEVEL"]) - return logger \ No newline at end of file + return logger \ No newline at end of file diff --git a/ufo/prompter/experience_prompter.py b/ufo/prompter/experience_prompter.py index da6c411c..9dea32c3 100644 --- a/ufo/prompter/experience_prompter.py +++ b/ufo/prompter/experience_prompter.py @@ -5,7 +5,6 @@ import json - class ExperiencePrompter(BasicPrompter): """ The ExperiencePrompter class is the prompter for the experience learning. diff --git a/ufo/prompts/experience/nonvisual/experience_summary.yaml b/ufo/prompts/experience/nonvisual/experience_summary.yaml new file mode 100644 index 00000000..5d0f970c --- /dev/null +++ b/ufo/prompts/experience/nonvisual/experience_summary.yaml @@ -0,0 +1,39 @@ +version: 1.0 + +system: |- + You are an expert summarizer tasked with condensing a trajectory of actions and responses of an intelligent agent operating within an application window on Windows OS to fulfill a user request. Your objective is to produce a single JSON document that streamlines all correct steps and provides tips for completing the task. Adhere to the following guidelines: + - You will be provided with the user request, the action and response sequence of the intelligent agent at each step. + - The user request defines the task for the intelligent agent. + - The action and response sequence of [Agent Trajectory] illustrates the agent's interactions with the application window to fulfill the user request. + - The agent's trajectory may contain incorrect or redundant steps. Your task is to summarize the correct steps into a single JSON document, excluding any redundancies. + - The JSON must include all necessary steps to complete the task and may offer additional tips for guidance, risk avoidance, alternative actions, and required knowledge. + + + ## Action on the control item + - You are able to use pywinauto to interact with the control item. + {apis} + + + ## Output Format + - You are required to are required to response in a JSON format, consisting of 10 distinct parts with the following keys and corresponding content: + {{"Observation": } + "Thought": + "ControlLabel": + "ControlText": + "Function": + "Args": + "Status": + "Plan": ". Split the plan for each step with a line break.> + "Comment": + "Tips": }} + + {examples} + + ## Important Notes + This is a very important task. Please read the user request, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. + Read the above instruction carefully. Ensure strict adherence to the provided instructions and format. + Responses must be strictly in JSON format without additional text. Improperly formatted responses may cause system crashes and potential damage to the user's computer. + +user: |- + {user_request} + From 268a498b2302e2bd367a9b0f6e812b5fa58c51ed Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 19 Mar 2024 17:54:59 +0800 Subject: [PATCH 194/223] experience to the main flow --- ufo/module/flow.py | 33 ++++++++++++++++++++++++++++++++- ufo/ufo.py | 2 ++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/ufo/module/flow.py b/ufo/module/flow.py index c4fa5c84..64918e35 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -8,6 +8,7 @@ from art import text2art from pywinauto.uia_defines import NoPatternInterfaceError +from ..experience.summarizer import ExperienceSummarizer from ..rag import retriever_factory from ..config.config import load_config @@ -311,7 +312,6 @@ def process_action_selection(self): return - if function_call: # Handle the case when the action is an image summary or switch app if function_call.lower() == "summary": @@ -359,6 +359,37 @@ def rag_prompt(self): retrieved_docs += online_docs_prompt return retrieved_docs + + + + def experience_asker(self): + print_with_color("""Would you like to save the current conversation flow for future reference by the agent? +[Y] for yes, any other key for no.""", "cyan") + + self.request = input() + + if self.request.upper() == "Y": + return True + else: + return False + + + def experience_saver(self): + """ + Save the current agent experience. + """ + print_with_color("Summarizing and saving the execution flow as experience...", "yellow") + + summarizer = ExperienceSummarizer(configs["ACTION_AGENT"]["VISUAL_MODE"], configs["EXPERIENCE_PROMPT"], configs["EXAMPLE_PROMPT_TEMPLATE"], configs["API_PROMPT"]) + experience = summarizer.read_logs(self.log_path) + summaries, total_cost = summarizer.get_summary_list(experience) + + + summarizer.create_or_update_yaml(summaries, os.path.join(self.log_path, "yaml/experience.yaml")) + summarizer.create_or_update_yaml(summaries, os.path.join(self.log_path, "experience_db")) + + self.cost += total_cost + print_with_color("The experience has been saved.", "cyan") def set_new_round(self): diff --git a/ufo/ufo.py b/ufo/ufo.py index 394df30b..db618564 100644 --- a/ufo/ufo.py +++ b/ufo/ufo.py @@ -40,6 +40,8 @@ def main(): session.set_new_round() status = session.get_status() if status == "ALLFINISH": + if session.experience_asker(): + session.experience_saver() break while status.upper() not in ["FINISH", "ERROR"] and step <= configs["MAX_STEP"]: From 7c48ae8116a634802c3a44ef29f5597f0b2897ba Mon Sep 17 00:00:00 2001 From: Fangkai Yang Date: Tue, 19 Mar 2024 19:16:38 +0800 Subject: [PATCH 195/223] add more package --- requirements.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 60701a80..36ba9b0c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,5 +9,6 @@ pywin32==304 pywinauto==0.6.8 PyYAML==6.0.1 Requests==2.31.0 -faiss-cpu==1.23.5 -lxml==5.1.0 \ No newline at end of file +faiss-cpu==1.8.0 +lxml==5.1.0 +psutil==5.9.8 \ No newline at end of file From b3602b63da5d0f94a7ae1895bb0f24d2cbacebdd Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 19 Mar 2024 21:38:03 +0800 Subject: [PATCH 196/223] experience rag --- requirements.txt | 3 +- ufo/experience/summarizer.py | 2 +- ufo/module/flow.py | 52 ++++++--- ufo/prompter/agent_prompter.py | 36 ++++++- .../base/nonvisual/action_selection.yaml | 3 + ufo/prompts/base/nonvisual/app_selection.yaml | 2 + ufo/prompts/base/visual/action_selection.yaml | 4 + .../examples/visual/action_example.yaml | 38 +++---- .../nonvisual/experience_summary.yaml | 2 +- .../experience/visual/experience_summary.yaml | 2 +- ufo/rag/retriever_factory.py | 100 ++++++++++++------ ufo/rag/{web_retriever.py => web_search.py} | 1 + vectordb/experience/experience.yaml | 23 ++++ vectordb/experience/experience_db/index.faiss | Bin 0 -> 3117 bytes vectordb/experience/experience_db/index.pkl | Bin 0 -> 1171 bytes 15 files changed, 198 insertions(+), 70 deletions(-) rename ufo/rag/{web_retriever.py => web_search.py} (99%) create mode 100644 vectordb/experience/experience.yaml create mode 100644 vectordb/experience/experience_db/index.faiss create mode 100644 vectordb/experience/experience_db/index.pkl diff --git a/requirements.txt b/requirements.txt index 8f27c30f..36ba9b0c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,4 +10,5 @@ pywinauto==0.6.8 PyYAML==6.0.1 Requests==2.31.0 faiss-cpu==1.8.0 -lxml==5.1.0 \ No newline at end of file +lxml==5.1.0 +psutil==5.9.8 \ No newline at end of file diff --git a/ufo/experience/summarizer.py b/ufo/experience/summarizer.py index 560aba6c..180809ca 100644 --- a/ufo/experience/summarizer.py +++ b/ufo/experience/summarizer.py @@ -92,7 +92,7 @@ def get_summary_list(self, logs: list) -> Tuple[list, float]: @staticmethod - def read_log(log_path: str) -> list: + def read_logs(log_path: str) -> list: """ Read the log. :param log_path: The path of the log file. diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 64918e35..ee0a869c 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -51,6 +51,7 @@ def __init__(self, task): self.status = "APP_SELECTION" self.application = "" + self.app_root = "" self.app_window = None self.plan = "" self.request = "" @@ -58,6 +59,7 @@ def __init__(self, task): self.cost = 0 self.offline_doc_retriever = None self.online_doc_retriever = None + self.experience_retriever = None welcome_text = """ Welcome to use UFO🛸, A UI-focused Agent for Windows OS Interaction. @@ -143,7 +145,8 @@ def process_application_selection(self): app_window = desktop_windows_dict[application_label] - response_json["Application"] = control.get_application_name(app_window) + self.app_root = control.get_application_name(app_window) + response_json["Application"] = self.app_root response_json = self.set_result_and_log("", response_json) try: @@ -163,12 +166,16 @@ def process_application_selection(self): if configs["RAG_OFFLINE_DOCS"]: print_with_color("Loading offline document indexer for {app}...".format(app=self.application), "magenta") - offline_retriever_factory = retriever_factory.OfflineDocRetrieverFactory(self.application) - self.offline_doc_retriever = offline_retriever_factory.create_offline_doc_retriever() + self.offline_doc_retriever = retriever_factory.OfflineDocRetriever(self.application) if configs["RAG_ONLINE_SEARCH"]: print_with_color("Creating a Bing search indexer...", "magenta") - offline_retriever_factory = retriever_factory.OnlineDocRetrieverFactory(self.request) - self.online_doc_retriever = offline_retriever_factory.create_online_search_retriever() + self.online_doc_retriever = retriever_factory.OnlineDocRetriever(self.request) + if configs["RAG_EXPERIENCE"]: + print_with_color("Creating an experience indexer...", "magenta") + experience_path = configs["EXPERIENCE_SAVED_PATH"] + db_path = os.path.join(experience_path, "experience_db") + self.experience_retriever = retriever_factory.ExperienceRetriever(db_path) + time.sleep(configs["SLEEP_TIME"]) @@ -230,7 +237,8 @@ def process_action_selection(self): image_url += [screenshot_url, screenshot_annotated_url] - action_selection_prompt_system_message = self.act_selection_prompter.system_prompt_construction() + examples, tips = self.rag_experience_retrieve() + action_selection_prompt_system_message = self.act_selection_prompter.system_prompt_construction(examples, tips) action_selection_prompt_user_message = self.act_selection_prompter.user_content_construction(image_url, self.request_history, self.action_history, control_info, self.plan, self.request, self.rag_prompt(), configs["INCLUDE_LAST_SCREENSHOT"]) @@ -270,7 +278,7 @@ def process_action_selection(self): response_json["Action"] = action response_json["Agent"] = "ActAgent" response_json["Request"] = self.request - response_json["Application"] = control.get_application_name(self.app_window) + response_json["Application"] = self.app_root print_with_color("Observations👀: {observation}".format(observation=observation), "cyan") @@ -359,8 +367,27 @@ def rag_prompt(self): retrieved_docs += online_docs_prompt return retrieved_docs + + def rag_experience_retrieve(self): + """ + Retrieving experience examples for the user request. + :return: The retrieved examples and tips string. + """ + + if self.experience_retriever: + # Retrieve experience examples. Only retrieve the examples that are related to the current application. + + experience_docs = self.experience_retriever.retrieve(self.request, configs["RAG_EXPERIENCE_RETRIEVED_TOPK"], + filter=lambda x: self.app_root.lower() in [app.lower() for app in x["app_list"]]) + examples = [doc.metadata.get("example", {}) for doc in experience_docs] + tips = [doc.metadata.get("Tips", "") for doc in experience_docs] + else: + examples = [] + tips = [] + + return examples, tips def experience_asker(self): print_with_color("""Would you like to save the current conversation flow for future reference by the agent? @@ -379,14 +406,15 @@ def experience_saver(self): Save the current agent experience. """ print_with_color("Summarizing and saving the execution flow as experience...", "yellow") - - summarizer = ExperienceSummarizer(configs["ACTION_AGENT"]["VISUAL_MODE"], configs["EXPERIENCE_PROMPT"], configs["EXAMPLE_PROMPT_TEMPLATE"], configs["API_PROMPT"]) + + summarizer = ExperienceSummarizer(configs["ACTION_AGENT"]["VISUAL_MODE"], configs["EXPERIENCE_PROMPT"], configs["ACTION_SELECTION_EXAMPLE_PROMPT"], configs["API_PROMPT"]) experience = summarizer.read_logs(self.log_path) summaries, total_cost = summarizer.get_summary_list(experience) - - summarizer.create_or_update_yaml(summaries, os.path.join(self.log_path, "yaml/experience.yaml")) - summarizer.create_or_update_yaml(summaries, os.path.join(self.log_path, "experience_db")) + experience_path = configs["EXPERIENCE_SAVED_PATH"] + create_folder(experience_path) + summarizer.create_or_update_yaml(summaries, os.path.join(experience_path, "experience.yaml")) + summarizer.create_or_update_vector_db(summaries, os.path.join(experience_path, "experience_db")) self.cost += total_cost print_with_color("The experience has been saved.", "cyan") diff --git a/ufo/prompter/agent_prompter.py b/ufo/prompter/agent_prompter.py index 5c5c18e2..5fa4ec6c 100644 --- a/ufo/prompter/agent_prompter.py +++ b/ufo/prompter/agent_prompter.py @@ -158,16 +158,17 @@ def __init__(self, is_visual: bool, prompt_template: str, example_prompt_templat self.api_prompt_template = self.load_prompt_template(api_prompt_template) - def system_prompt_construction(self) -> str: + def system_prompt_construction(self, additional_examples=[], tips=[]) -> str: """ Construct the prompt for app selection. return: The prompt for app selection. """ apis = self.api_prompt_helper(verbose = 1) - examples = self.examples_prompt_helper() + examples = self.examples_prompt_helper(additional_examples=additional_examples) + tips_prompt = "\n".join(tips) - return self.prompt_template["system"].format(apis=apis, examples=examples) + return self.prompt_template["system"].format(apis=apis, examples=examples, tips=tips_prompt) @@ -230,7 +231,7 @@ def user_content_construction(self, image_list: list, request_history: list, act return user_content - def examples_prompt_helper(self, header: str = "## Response Examples", separator: str = "Example") -> str: + def examples_prompt_helper(self, header: str = "## Response Examples", separator: str = "Example", additional_examples: list[str] = []) -> str: """ Construct the prompt for examples. :param examples: The examples. @@ -252,6 +253,8 @@ def examples_prompt_helper(self, header: str = "## Response Examples", separator example = template.format(request=self.example_prompt_template[key].get("Request"), response=json.dumps(self.example_prompt_template[key].get("Response"))) example_list.append(example) + example_list += [json.dumps(example) for example in additional_examples] + return self.retrived_documents_prompt_helper(header, separator, example_list) @@ -279,4 +282,29 @@ def api_prompt_helper(self, verbose: int = 1) -> str: api_prompt = self.retrived_documents_prompt_helper("", "", api_list) return api_prompt + + + def tips_prompt_helper(self, verbose: int = 1) -> str: + """ + Construct the prompt for tips. + :param verbose: The verbosity level. + return: The prompt for tips. + """ + + # Construct the prompt for tips + tips_list = ["- The action type are limited to {actions}.".format(actions=list(self.api_prompt_template.keys()))] + + # Construct the prompt for each tip + for key in self.api_prompt_template.keys(): + api = self.api_prompt_template[key] + if verbose > 0: + api_text = "{summary}\n{usage}".format(summary=api["summary"], usage=api["usage"]) + else: + api_text = api["summary"] + + tips_list.append(api_text) + + tips_prompt = self.retrived_documents_prompt_helper("", "", tips_list) + + return tips_prompt \ No newline at end of file diff --git a/ufo/prompts/base/nonvisual/action_selection.yaml b/ufo/prompts/base/nonvisual/action_selection.yaml index 0f230e8c..bf64d2e6 100644 --- a/ufo/prompts/base/nonvisual/action_selection.yaml +++ b/ufo/prompts/base/nonvisual/action_selection.yaml @@ -90,6 +90,9 @@ system: |- - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current control item list to make the decision. + ## Here are other tips for you to complete the user request: + {tips} + {examples} This is a very important task. Please read the user request and the control item list carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. diff --git a/ufo/prompts/base/nonvisual/app_selection.yaml b/ufo/prompts/base/nonvisual/app_selection.yaml index f8a161b7..708574ec 100644 --- a/ufo/prompts/base/nonvisual/app_selection.yaml +++ b/ufo/prompts/base/nonvisual/app_selection.yaml @@ -59,6 +59,8 @@ system: |- - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. - You must to strictly follow the instruction and the JSON format of the response. - Below are two example of the response. You can refer to them as a reference. + + {examples} diff --git a/ufo/prompts/base/visual/action_selection.yaml b/ufo/prompts/base/visual/action_selection.yaml index c7064c37..ed9734aa 100644 --- a/ufo/prompts/base/visual/action_selection.yaml +++ b/ufo/prompts/base/visual/action_selection.yaml @@ -109,6 +109,10 @@ system: |- - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current screenshots and control item list to make the decision. + ## Here are other tips for you to complete the user request: + {tips} + + {examples} This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. diff --git a/ufo/prompts/examples/visual/action_example.yaml b/ufo/prompts/examples/visual/action_example.yaml index e76d18dc..1df2735a 100644 --- a/ufo/prompts/examples/visual/action_example.yaml +++ b/ufo/prompts/examples/visual/action_example.yaml @@ -26,8 +26,8 @@ example1: Comment: |- After I click the New Email button, the New Email window will be opened and available for composing the email. Tips: |- - 1. Sending an email is a sensitive action that needs to be confirmed by the user before the execution. - 2. You need to draft the content of the email and send it to the receiver. + - Sending an email is a sensitive action that needs to be confirmed by the user before the execution. + - You need to draft the content of the email and send it to the receiver. example2: @@ -57,8 +57,8 @@ example2: Comment: |- I am looking for the New Email button, and will try to find it in the Main Page. Tips: |- - 1. Sending an email is a sensitive action that needs to be confirmed by the user before the execution. - 2. Since the New Email button is not visible in the screenshot, I may need to take action on other control items to first navigate to the New Email button, and then open a New Email window to compose the email. + - Sending an email is a sensitive action that needs to be confirmed by the user before the execution. + - Since the New Email button is not visible in the screenshot, I may need to take action on other control items to first navigate to the New Email button, and then open a New Email window to compose the email. @@ -85,7 +85,7 @@ example3: Comment: |- Inputting the message is not a sensitive action and do not need to be confirmed. Tips: |- - 1. Sending a message is a sensitive action and need to be confirmed. + - Sending a message is a sensitive action and need to be confirmed. @@ -118,8 +118,8 @@ example4: Comment: |- I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email. Tips: |- - 1. Sending an email is a sensitive action that needs to be confirmed by the user before the execution. - 2. You need to draft the content of the email and send it to the receiver. Use polite language when drafting the email. + - Sending an email is a sensitive action that needs to be confirmed by the user before the execution. + - You need to draft the content of the email and send it to the receiver. Use polite language when drafting the email. example5: @@ -145,7 +145,7 @@ example5: Comment: |- I searched for the word 'UFO' in the document successfully. The user should view the search result. Tips: |- - 1. If there are steps already taken (e.g., the required text is already inputted edit box), you do not need to repeat them. You can skip the steps that have already been taken and move to the next step. + - If there are steps already taken (e.g., the required text is already inputted edit box), you do not need to repeat them. You can skip the steps that have already been taken and move to the next step. example6: @@ -175,8 +175,8 @@ example6: Comment: |- The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task. Tips: |- - 1. In Word application, the main canva is a Document control, and the text of the document can be extracted by using the 'GetText' action. - 2. After extracting the text of the document, I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. + - In Word application, the main canva is a Document control, and the text of the document can be extracted by using the 'GetText' action. + - After extracting the text of the document, I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. example7: @@ -207,8 +207,8 @@ example7: Comment: |- I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file. Tips: |- - 1. The 'Remove All Presentation Notes' function is the fastest way to remove all notes in the presentation.pptx file. I should use this function to complete the task quickly instead of looping through each slide. - 2. The 'Remove All Presentation Notes' is usually at the bottom of the menu, and I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible. + - The 'Remove All Presentation Notes' function is the fastest way to remove all notes in the presentation.pptx file. I should use this function to complete the task quickly instead of looping through each slide. + - The 'Remove All Presentation Notes' is usually at the bottom of the menu, and I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible. example8: @@ -236,8 +236,8 @@ example8: Comment: |- I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually. Tips: |- - 1. The search box is usually in a type of ComboBox. - 2. The number of stars of a Github repo page can be found in the repo page visually. + - The search box is usually in a type of ComboBox. + - The number of stars of a Github repo page can be found in the repo page visually. example9: @@ -268,8 +268,8 @@ example9: Comment: |- After creating the task, I need to set more details for the reminder, including adding steps and notes. Tips: |- - 1. You need to add more details for the task, including adding steps and notes. - 2. You need to add each step one by one and add notes to the task. + - You need to add more details for the task, including adding steps and notes. + - You need to add each step one by one and add notes to the task. @@ -298,8 +298,8 @@ example10: Comment: |- I need use the Copilot Add-in to create a slide from the meeting_notes.docx. Tips: |- - 1. The Copilot Add-in can directly create a slide from the meeting_notes.docx. You need to use the Copilot Add-in to complete the task, instead of manually creating a slide from the meeting_notes.docx. - 2. The Copilot Add-in is visible in the screenshot, and I need to double click it to open the Copilot Add-in. + - The Copilot Add-in can directly create a slide from the meeting_notes.docx. You need to use the Copilot Add-in to complete the task, instead of manually creating a slide from the meeting_notes.docx. + - The Copilot Add-in is visible in the screenshot, and I need to double click it to open the Copilot Add-in. example11: @@ -326,6 +326,6 @@ example11: Comment: |- I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx. Tips: |- - 1. The comment text box is usually opened by clicking the Comment button. + - The comment text box is usually opened by clicking the Comment button. diff --git a/ufo/prompts/experience/nonvisual/experience_summary.yaml b/ufo/prompts/experience/nonvisual/experience_summary.yaml index 5d0f970c..cb5aba76 100644 --- a/ufo/prompts/experience/nonvisual/experience_summary.yaml +++ b/ufo/prompts/experience/nonvisual/experience_summary.yaml @@ -25,7 +25,7 @@ system: |- "Status": "Plan": ". Split the plan for each step with a line break.> "Comment": - "Tips": }} + "Tips": }} {examples} diff --git a/ufo/prompts/experience/visual/experience_summary.yaml b/ufo/prompts/experience/visual/experience_summary.yaml index f354a5e6..db6084d8 100644 --- a/ufo/prompts/experience/visual/experience_summary.yaml +++ b/ufo/prompts/experience/visual/experience_summary.yaml @@ -26,7 +26,7 @@ system: |- "Status": "Plan": ". Split the plan for each step with a line break.> "Comment": - "Tips": }} + "Tips": }} {examples} diff --git a/ufo/rag/retriever_factory.py b/ufo/rag/retriever_factory.py index 7201f213..a9e795bc 100644 --- a/ufo/rag/retriever_factory.py +++ b/ufo/rag/retriever_factory.py @@ -1,23 +1,37 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. +from abc import ABC, abstractmethod from langchain_community.vectorstores import FAISS from langchain_community.embeddings import HuggingFaceEmbeddings from ..config.config import get_offline_learner_indexer_config, load_config from ..utils import print_with_color -from . import web_retriever +from . import web_search configs = load_config() -class Retriever: +class Retriever(ABC): """ Class to retrieve documents. """ - def __init__(self, indexer) -> None: - self.indexer = indexer + def __init__(self) -> None: + """ + Create a new Retriever. + """ + self.indexer = self.get_indexer() + + pass + + @abstractmethod + def get_indexer(self): + """ + Get the indexer. + :return: The indexer. + """ + pass def retrieve(self, query: str, top_k: int, filter=None): """ @@ -27,21 +41,26 @@ def retrieve(self, query: str, top_k: int, filter=None): :filter: The filter to apply to the retrieved documents. :return: The document from the given query. """ + if not self.indexer: + return None + return self.indexer.similarity_search(query, top_k, filter=filter) + + - - -class OfflineDocRetrieverFactory: +class OfflineDocRetriever(Retriever): """ Class to create offline retrievers. """ def __init__(self, app_name:str) -> None: """ - Create a new OfflineDocRetrieverFactory. + Create a new OfflineDocRetriever. :appname: The name of the application. """ self.app_name = app_name + self.indexer_path = self.get_offline_indexer_path() + self.indexer = self.get_indexer() def get_offline_indexer_path(self): @@ -57,41 +76,59 @@ def get_offline_indexer_path(self): return None - def load_indexer(self, path: str): + def get_indexer(self, path: str): """ Load the retriever. :param path: The path to load the retriever from. :return: The loaded retriever. """ - embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") - db = FAISS.load_local(path, embeddings) + if path: + print_with_color("Loading offline indexer from {path}...".format(path=path), "cyan") + else: + return None + + try: + embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + db = FAISS.load_local(path, embeddings) + return db + except: + print_with_color("Error: Failed to load offline indexer from {path}.".format(path=path), "red") + return None + - return db - - def create_offline_doc_retriever(self): +class ExperienceRetriever(Retriever): + """ + Class to create experience retrievers. + """ + + def __init__(self, db_path) -> None: """ - Create an offline document indexer. - :return: The created indexer. + Create a new ExperienceRetriever. + :appname: The name of the application. """ + self.indexer = self.get_indexer(db_path) - path = self.get_offline_indexer_path() - if path: - print_with_color("Loading offline indexer from {path}...".format(path=path), "cyan") - try: - indexer = self.load_indexer(path) - return Retriever(indexer) - except: - print_with_color("Error: Failed to load offline indexer from {path}.".format(path=path), "red") - return None - - return None + def get_indexer(self, db_path: str): + """ + Create an experience indexer. + :param query: The query to create an indexer for. + """ + + + try: + embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") + db = FAISS.load_local(db_path, embeddings) + return db + except: + print_with_color("Error: Failed to load experience indexer from {path}.".format(path=db_path), "red") + return None -class OnlineDocRetrieverFactory: +class OnlineDocRetriever(Retriever): """ Class to create online retrievers. """ @@ -102,21 +139,22 @@ def __init__(self, query:str) -> None: :appname: The name of the application. """ self.query = query + self.indexer = self.get_indexer() - def create_online_search_retriever(self): + def get_indexer(self): """ Create an online search indexer. :param query: The query to create an indexer for. """ - bing_retriever = web_retriever.BingSearchWeb() + bing_retriever = web_search.BingSearchWeb() result_list = bing_retriever.search(self.query, top_k=configs["RAG_ONLINE_SEARCH_TOPK"]) documents = bing_retriever.create_documents(result_list) if len(documents) == 0: return None indexer = bing_retriever.create_indexer(documents) print_with_color("Online indexer created successfully for {num} searched results.".format(num=len(documents)), "cyan") - return Retriever(indexer) + return indexer diff --git a/ufo/rag/web_retriever.py b/ufo/rag/web_search.py similarity index 99% rename from ufo/rag/web_retriever.py rename to ufo/rag/web_search.py index e4c3bc85..8f095465 100644 --- a/ufo/rag/web_retriever.py +++ b/ufo/rag/web_search.py @@ -93,6 +93,7 @@ def create_documents(self, result_list: list): return document_list + def create_indexer(self, documents: list): """ Create an indexer for the given query. diff --git a/vectordb/experience/experience.yaml b/vectordb/experience/experience.yaml new file mode 100644 index 00000000..7d1e29e9 --- /dev/null +++ b/vectordb/experience/experience.yaml @@ -0,0 +1,23 @@ +example0: + example: + Observation: The screenshot shows the Microsoft To Do application with the task + list visible. There is an option to add a new task, but no task related to learning + LLM is listed yet. + Thought: To fulfill the user's request, I need to add a new task titled 'Learn + LLM' using the 'Add a task' option. + ControlLabel: '19' + ControlText: "Add a task in \u201CMy Day\u201D" + Function: set_edit_text + Args: + text: Learn LLM + Status: FINISH + Plan: + Comment: After setting the text for the new task, the task creation process is + complete. + Tips: '1. Ensure the task title is clear and specific to the learning goal. + + 2. After creating the task, consider adding specific steps or details to help + organize the learning process.' + request: create a to do for learning LLM. + app_list: + - ApplicationFrameHost.exe diff --git a/vectordb/experience/experience_db/index.faiss b/vectordb/experience/experience_db/index.faiss new file mode 100644 index 0000000000000000000000000000000000000000..0cc5a36120b07be90f7b6f6ec77f5bd0b694bc72 GIT binary patch literal 3117 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 RVAa@U;n0#I=up)V{{t9o%@F_q literal 0 HcmV?d00001 diff --git a/vectordb/experience/experience_db/index.pkl b/vectordb/experience/experience_db/index.pkl new file mode 100644 index 0000000000000000000000000000000000000000..bf3a7bbcc4392ee962cc9ec21c1f7792a56edd61 GIT binary patch literal 1171 zcmY*YO=}cE5EWTX{EnVP6zU*u1T!R2j0++JV=$Pg;9jNaovGPr?Cl<>Ym%%W#EW=n zP_Vt}5Af(;@|RfMvu<<`%XD>By;t>KAN9U{>YYeGe@ja<&MT>m$n9j(8b#Bru(>1K zV8+o2PHZy`erd<-rO&O|W%wFye+ch`KP3v4Q~bI)7_D!}d*y?b{C^Sa@I@s5jT9;1s?H29^1tTfxwLWR2K z&{!Jvu46Pun#~c7GBZM`mi!|7Rzw?x*TG-iJT~!mBPaOOI?C`6gXDo}T4SirwEm(H zr9xde5fu~Rb6Bn}RhPf`>q69x; Date: Tue, 19 Mar 2024 21:57:03 +0800 Subject: [PATCH 197/223] bug fixed --- .gitignore | 1 + ufo/module/flow.py | 11 ++++----- ufo/rag/retriever_factory.py | 9 +++---- vectordb/experience/experience.yaml | 23 +++++++++--------- vectordb/experience/experience_db/index.faiss | Bin 3117 -> 3117 bytes vectordb/experience/experience_db/index.pkl | Bin 1171 -> 1130 bytes 6 files changed, 21 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index ff51f6e0..416fe9a9 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ ufo/config/config_llm.yaml ufo/rag/app_docs/* learner/records.json vectordb/docs/* +vectordb/experience/* # Don't ignore the example files !vectordb/docs/example/ diff --git a/ufo/module/flow.py b/ufo/module/flow.py index ee0a869c..1e70704a 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -375,14 +375,13 @@ def rag_experience_retrieve(self): :return: The retrieved examples and tips string. """ - if self.experience_retriever: - # Retrieve experience examples. Only retrieve the examples that are related to the current application. - - experience_docs = self.experience_retriever.retrieve(self.request, configs["RAG_EXPERIENCE_RETRIEVED_TOPK"], - filter=lambda x: self.app_root.lower() in [app.lower() for app in x["app_list"]]) + # Retrieve experience examples. Only retrieve the examples that are related to the current application. + experience_docs = self.experience_retriever.retrieve(self.request, configs["RAG_EXPERIENCE_RETRIEVED_TOPK"], + filter=lambda x: self.app_root.lower() in [app.lower() for app in x["app_list"]]) + + if experience_docs: examples = [doc.metadata.get("example", {}) for doc in experience_docs] tips = [doc.metadata.get("Tips", "") for doc in experience_docs] - else: examples = [] tips = [] diff --git a/ufo/rag/retriever_factory.py b/ufo/rag/retriever_factory.py index a9e795bc..b1b64075 100644 --- a/ufo/rag/retriever_factory.py +++ b/ufo/rag/retriever_factory.py @@ -59,8 +59,8 @@ def __init__(self, app_name:str) -> None: :appname: The name of the application. """ self.app_name = app_name - self.indexer_path = self.get_offline_indexer_path() - self.indexer = self.get_indexer() + indexer_path = self.get_offline_indexer_path() + self.indexer = self.get_indexer(indexer_path) def get_offline_indexer_path(self): @@ -93,7 +93,7 @@ def get_indexer(self, path: str): db = FAISS.load_local(path, embeddings) return db except: - print_with_color("Error: Failed to load offline indexer from {path}.".format(path=path), "red") + print_with_color("Warning: Failed to load offline indexer from {path}.".format(path=path), "yellow") return None @@ -117,13 +117,12 @@ def get_indexer(self, db_path: str): :param query: The query to create an indexer for. """ - try: embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") db = FAISS.load_local(db_path, embeddings) return db except: - print_with_color("Error: Failed to load experience indexer from {path}.".format(path=db_path), "red") + print_with_color("Warning: Failed to load experience indexer from {path}.".format(path=db_path), "yellow") return None diff --git a/vectordb/experience/experience.yaml b/vectordb/experience/experience.yaml index 7d1e29e9..b689b4f7 100644 --- a/vectordb/experience/experience.yaml +++ b/vectordb/experience/experience.yaml @@ -1,23 +1,22 @@ example0: example: - Observation: The screenshot shows the Microsoft To Do application with the task - list visible. There is an option to add a new task, but no task related to learning - LLM is listed yet. - Thought: To fulfill the user's request, I need to add a new task titled 'Learn - LLM' using the 'Add a task' option. + Observation: The current screenshot shows that I am on the Microsoft To Do application. + The application is open and there is an edit block at the bottom for inputting + the task. + Thought: "I need to add a task of 'Learning LLM' to the edit block of 'Add a task\ + \ in \u201CMy Day\u201D'." ControlLabel: '19' ControlText: "Add a task in \u201CMy Day\u201D" Function: set_edit_text Args: - text: Learn LLM + text: Learning LLM Status: FINISH Plan: - Comment: After setting the text for the new task, the task creation process is - complete. - Tips: '1. Ensure the task title is clear and specific to the learning goal. + Comment: After inputting the task, no further action is required as the user only + requested the creation of a to-do item. + Tips: '- Ensure the task description is clear and concise. - 2. After creating the task, consider adding specific steps or details to help - organize the learning process.' - request: create a to do for learning LLM. + - After adding the task, you can set a reminder or due date if needed.' + request: Create 1 to do for learning LLM. app_list: - ApplicationFrameHost.exe diff --git a/vectordb/experience/experience_db/index.faiss b/vectordb/experience/experience_db/index.faiss index 0cc5a36120b07be90f7b6f6ec77f5bd0b694bc72..2f889d4fa60bf807b1612f90671a5ac8105c1f50 100644 GIT binary patch literal 3117 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 literal 3117 zcmXw*c~sAd_r@z}Q(8rf#1xV&CF=9Ox3U*Ww2v^#k`RTmRVZ2}(jH}^(#R-F%+%+7 zZz?n-O9>g7(n7`>Q8el6`&*uW?mg$Z|2*fso^!6#j(L_cgJfi6W&U3p|F`__l>Hy$ z`@w(Z-fY9|z9E#-T~95NXko>g#4`Px0eI6(jlX=B!pTMFz}?^qyj$BZTE`p*lci^9 zUiECMf3ywGoNJ+aeNSvxKT8|+li4gnjfeN_r|Vs-g!jEYWNz?@)C_h)>g^utxe-m9 zoG!xDt$&JD&1ZPQ7AN|Us{n^&x`lVe%Q>ZmtQQ^8V}nl~v|_k27k!iEXU`O2`@+$} zC)v4}KZHT04@u|denCs)J}Q^1K$*)t)R)8x!G({|z{LpFXYJyWARj2%S4SZszhczU zITU2=DAfP0d|v0+0a4KAt`uME0QLAiVBVqGct%dNmJxo;#_l7oi~Ziz(YeBjZJjG%ru6vU;&(bSq3}vPr+1=E?Ai~ja!OiL`kt8 zOic2}=T!iuRpDZM(=5(g(g5deO2D;Q7gwprOW&BL2~J8E(Z(o%1iKC7r|}5twrioX zw;nF3%n>~?4I{VGv2ObwTPqT{JyciA!W_#ooXxjiiOf349U9I>5sExsW;K^xm}J|t(VgAgBE(Nujs)xqr*#^+F|gME%o}Jj&A-_>=Dh#srMe__tpr{^4nnLeLwyk zrtm**sq``{iF#M3i!$Ap*~U->qib3~d9yjIHDpK%jwwK?g*jjBbfFgiRtP#hk&~^H z#mdSIoLRGph51BH+m!g&*am2mm80UobL4mA5m>%-<*bW|SZ=b6_ngWt8#hOle)Djm zHk(!n=gDHJqGD;FQ$NLQ=%i^E+bFTHo3^u_bh)`H1bv>#o4@Dv>Bypp2fFOgq{#s# z8ItB3lOf3N3LS1VqqGyPV*Q3Xin|W@X@xZoX;9Gr9Ch)J7 z!LT;c5#>|&(zN+Xu)InTB|VqvfSM?bi@HPRL*EFuyFbHHWgR}X$At{@CQ!|X_h6MH z()YA?GiZzY+`3v_gc1{Yk*0?qMif_6HgUWNrVMJJPT zLOeZcocq1Qds+HL3v*67azf}KvF_o|jG5i=mxnv`Yju(Kt{k}TT+KP^N_g*TulQ4m z7HXfJFS_O%^S#p(@uQwZIJ)OJx4u3JbEW;@1SO(c#u4&wTPsZ8`G_Dg9yczF;fGN# zVC_|Tj4H_{^9})_)(D0?*1bF!eAq!qU`<=c7mqO?0o1%G!EvXrks5H$J{+?hDMqSphZGko(|8*Vfao-} z{+e)ZqCE#~aRX>wjuE|~qG9tGJbvF3Ow$fSO7eIy@^z6H-} z2B9QwH2nIr75mK%0_m>h zQabX@2hK0KLMN;fprEv$5>^`EOK)dX*WE?UcW;ZCKG_s_r3kXe5~c23&!AC@-<~DY z>+#dkb+;AXebOTwt{R4=@x>6gDjWL#FhJ+co7l?Hj;175Qq=TJLE(@CFP}M{Elf19 zLQ|6?H*2DUTs`%fmvilv4v-FhK-a(OW4K`#FFi zYyyV#hn0QY8i$Fer^3^zj^rf{W$i`N>GBJ6(BJ(4B!{ahwl;>9`wc1Kbp3D+=g|i}Ysz6@MlV&o{sks<9Hf2cBdPyQJ6U>u zq(POY*edTrk#9O|mzSxDIgJ+ZV?h|HYUBwy0WA9Fy`$L9U4gI4_bqq;%1og`wSshe?PrFD&ZY#08cEahEsZ*QAVeROXZaC zmlhq!kGTjcD^GuC;|+mFn-ICho_INnr=ljImx?-T*C_Jnx@WNcYb*Ta*(gp) z8KCn$muNwW89%+Df~E=DY$|t$1{?>ZN~dR|_b^`?XDg53@dBbdox%211Oz+w!B*Ez z^kKw7d=*j|=loY4O+A{;j~>QhoJKyjsx*PIiXB(jluDv~Y_M@v6hvz`NFIs5!TyeJ zVW9B}B-X1_q-`H4CrL2t9*nM$ zGvHovA>53e!9RsQ5JD5YIPaA<7pBXheQP>(TDVH(!xo}d^iZDtn=W7Tl))D75SINi z2Ky5Y_Fl~gA|l4A;bx0KTjGac}o?8~_g8Sv?8A{mO;K~>EG->1EU^<%6!Su~bD z^g4hGvQNRVSz91^-ynQ5c7tegcs9gF)d~h@PeE_OV{xcuI={$UzynUI_;TZ8sIH&O zqk2qGBQXHn$M}Qw&g0@GI|qJfnJTnD&gYtivRpN1zvw-A6#Dz7Nmg#nl|C z)xkEK`Om|^)%F;zufI=O+Ib`mRid5dx#V)s3v1<8^Rq=!TTs zYjfyAVVKzOugibiEhDq5=Ax000HIM9V7Milk~D23aVf!k;Yt9HxLpauO{(BQc#ha$ zT?K-1uf(r(oY18=5`7Z~DDFTYr&Z{S^^413Po6DLZyE~5*M>uDPcBAi*z($gxiCCZ z4huYgq`MDNd6EKA^c+w8-0zP8!xVULw}v?4!zA+TRAae2mu)9mmWX5Kt;eH_4RCVi zM0^r_j9hed+0JMa`Sh#7eYJ~tqynhxZk RVAa@U;n0#I=up)V{{t9o%@F_q diff --git a/vectordb/experience/experience_db/index.pkl b/vectordb/experience/experience_db/index.pkl index bf3a7bbcc4392ee962cc9ec21c1f7792a56edd61..087b08e5b518e16abaa95f31fa823c8f00cc4a8b 100644 GIT binary patch delta 554 zcmZvZy-piJ6oqB8QUD=Eky25e0_29Z*1`s(R0tt~Fln%mQbn^fci9o%na%tZq=-@8XOVNSuq}E+49fL=9wYp2!rM8+0OH{ByevGDc7L$b(=X{f>qF}8FVo3BMMku z&m?C~Y6WSbYf@lJz?EbuzAyz6(jlK|evfb?Opt5mbcI42NL731q`GSdj@kSEYVm1W zYJXR{)#Aq`6j8XR!Gr)qR6rNl?@fpq6&ELy>s}PZ%OAXgsMoOWZl~9L>sDJkYkl+5 z9nI_0!qNZS51=#(Z(;#3zAk3ymzO34VYc=0HjK5JJs?iVx|lHniv%N#;2y&2RA@*? zRe$9d$yC;MwfLRle6FkyeBwr1NRZ`5)@wID3*B0dTq`au^|w>}OB^VCgmr)i?ZE?O nOD;GXs-zMzn}P5I5&u&bEkqI#ZJW1w-}t`qrTpAnBv*d{=?cDz delta 643 zcmY+Bv5wO~5Qat0f;$946x2+CzF%8fmaS1h|`XG}N>LP_B! za;SI$N*;oT;1zfZX6+C}<6>v#|Nj5?@5A;e`W$`zvWZ?kNEef-IxWsd*`oqSrzdGP zQfK*iG#;laJ(*7OX{t7#UL0l~6(gw4uZw%%=OqHk3tB22gM3!hKE4KPSZOYSWz34+ zfYHS8UXxxJOhB$Yf+kQFT*ca1UA@g4)#t#gI z^PTL!)ceZ1o309ec1hZw2d@t9ly}?v(bGRIGvYS@ From bd79dfeefa22f71d1b9374d7fefc19e2747d3568 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 19 Mar 2024 21:58:59 +0800 Subject: [PATCH 198/223] delete exp --- ufo/rag/{web_search.py => web_retriever.py} | 0 vectordb/experience/experience.yaml | 22 ------------------ vectordb/experience/experience_db/index.faiss | Bin 3117 -> 0 bytes vectordb/experience/experience_db/index.pkl | Bin 1130 -> 0 bytes 4 files changed, 22 deletions(-) rename ufo/rag/{web_search.py => web_retriever.py} (100%) delete mode 100644 vectordb/experience/experience.yaml delete mode 100644 vectordb/experience/experience_db/index.faiss delete mode 100644 vectordb/experience/experience_db/index.pkl diff --git a/ufo/rag/web_search.py b/ufo/rag/web_retriever.py similarity index 100% rename from ufo/rag/web_search.py rename to ufo/rag/web_retriever.py diff --git a/vectordb/experience/experience.yaml b/vectordb/experience/experience.yaml deleted file mode 100644 index b689b4f7..00000000 --- a/vectordb/experience/experience.yaml +++ /dev/null @@ -1,22 +0,0 @@ -example0: - example: - Observation: The current screenshot shows that I am on the Microsoft To Do application. - The application is open and there is an edit block at the bottom for inputting - the task. - Thought: "I need to add a task of 'Learning LLM' to the edit block of 'Add a task\ - \ in \u201CMy Day\u201D'." - ControlLabel: '19' - ControlText: "Add a task in \u201CMy Day\u201D" - Function: set_edit_text - Args: - text: Learning LLM - Status: FINISH - Plan: - Comment: After inputting the task, no further action is required as the user only - requested the creation of a to-do item. - Tips: '- Ensure the task description is clear and concise. - - - After adding the task, you can set a reminder or due date if needed.' - request: Create 1 to do for learning LLM. - app_list: - - ApplicationFrameHost.exe diff --git a/vectordb/experience/experience_db/index.faiss b/vectordb/experience/experience_db/index.faiss deleted file mode 100644 index 2f889d4fa60bf807b1612f90671a5ac8105c1f50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3117 zcmXw5Xg|=X)KNu{VnB{h+yQdBCXg(;E}W0^vb$u3IE30wlT(zFlb8E{X#Jn~UzYzL<454X zh>x1h=RRrk_v`w6T6R)Q-D}C^Hk}~2_+n$85mbj3!Tv%^O!RvXqcz;=+dX|Y4^0(( zJB{(1ZYf2?s^iLxHB@t@gaZoh&~_eADi?L&&ZT&AzLiDKPQD=Z$K{mhq{`E;WD40S zZz;6lBrnnP0BfgHf_6(h+#RV&PaAK|NceV#HcyQqqbbVl7;VEnOKZuv_=~8~ZSgQUj>=&bTT*3!Hr#}l<{R321m5euc;w4F!(woS=pn) zn+-I4zB3eel)~$Q3b?gv3Z1S=XI;4lNQkTwG@u-!S7_tuq#8ODHB#I&uv+LB7Kx?P zmBeW!brQ8c6;2*I5QEyfAlu|mxM}T2($z_js}PH7uZu)lwCh^exJ_zU-OrGPf zV4U1K!QtdQ46?tfU)!5Pn-&t)qg2HE)P}3hdyB>r&}f*U4gj=tI6tt%b$aBYA1r04&-i zC7qBiF+jV3Wd@z1lWH{UzcZkt=T^{!*3sg+4|Rf~dmz48Xbyu81@Y$DVZsgzLo|KW z4pq_yQMqV2Zhesh^>O;bC#?dZI7kg=JsJu1y>{3v>7WYdL|RnaD-5d|&f)tqxv0X1 z&gPBh-`_@nMvw~M`FI%LME*q)a|h%7YlpDo&2GGxHiw`3=$`0B9nvg>#{00Rr!oirJ%I}Y1TeVb$EAJy$w0UY;lo0x*49eY)9Z$* z@l|4^ksV(v$pEgp1y{0C(W2BAR4(-6bvi2Cy!X4QFP9734Erc-(t8>Q%Z2V;{$SCQ&F`!IxmkM$ zWY?&Rza1_G-OvGOUucZ}Nj<`xk^>b|p?!A(Wc-p1o$;<5>6uHf z&P?D1FN3JbA{G>npX57EZn&>u0aA<(?;Dd052sEL=O+&4U*=5~Bej#kuTq^o6W&4f z17}q9a^UM~Bk9IB3pzIZ(8bv?3Osw|be6w07Pnd3@vi$h_&KjXC)$|M&*iORT9r07 z`9zAB&KA)9x@W?+w3nnZNR7w#Hx|dfn9C(g0_fUCguPlV^s2X9Tt8Bc!{({;1@jTy zDED0q)H1*zeNFOkOoQ*O3!(0bKHu9NgLb3qpm|cKP%uviOTw*0#_Pr8vra z{>AF;Z*6c^k|S9&r~=ws+GzMkE8g8?Lu;o+6L-Id#kE;*W5Z4k*gJ+C3l+t^)fd4x zKT}M~apolxt7zviJIvCW$R{n39F`?>YC;su=(kSv&#;8sE+~ZVct(p4df~kzkEry6 z5+^6_Bde(XX#Daxd;DaH>dI1*-N+F#YFzkgT@?DP=@!+L(+Hb#pvHX%mwlWHznot# z`MKo}@buYDUe>h~a=8R_OMeqRP|BFn21*lWK+w<0;Jv*+2*DRbJinJ3jJ>e1a3*&Q z{D&$-Ge9-oD#j`x}I zH9uX9UwMksF3Y2mo&}!qcn4z_El0OO@9DN#E#(yEfqO|RjJ#n?2Cob`DmQ|i?^Hv} z#w6&7j-mUe=g8|>GDKbrl&IHuTu7MWM2qX6fP11VTfSCj<*WYKm0*M2CH+`#zXS^1 zCre>$1Gs9KvWxO>u)KN-Pdn5Ondyq~*u9fh43Q`E+7&$Rm6q`EfhW&TP2-UE6KKAr zM(i#-4gsF?vHa9X=7D$om*H^S#7RMidFN-2Z`5<9~v>0a}!8GMX0IJ)>cZqQL5Yy_jH{h$^#> z@ujW`v1!*CiLbj61`SYylK02?{NWZTZ23f?s(L)FU=_%ke?se}DZI&FQ?y53h_}ve-2hU21z!J;P~Jr4P0m&G)qA>E+Ate5gDb`uxh7 zUZG$&rbFy$T}O@^{$|6?&C+Y5vjp$`MZ(!5OF+vs3{uukg3Ey#qUpIz`aD;eAtgch zN3{`jX$dWBEQKF;g5};i!JVK3++)6s-#s?Lu^V7(K?X>VQ*9jqUKceM-gQLqd` zT)&DQmrbDE@pn9YJ`WC5_6l~*v#H|DL~-V6DafW4fP2tm;oijO@VV5ThmGzPM<21l zu8u)CBjCm1GY@QK6eRGgzp`E{w_@aZ3Nt{K4v z4fZ_a=m7y=?h)#BOktCW7Am-%r~BKUh^i75;k9)p*~^qL&G}z?nsb@|Ef~NS7bc;1 zxeRQ(55n%4xv=7cqp&kk55sM(@IED>_|bq3HPq4W>IXP8$Y;7oqXSgWN`=1TF@jBK z9u_=WMd?E?iaJh-P?=LAPX6&XpWUw(j$UY^eJkIINwbDi#L5_9fY~9MU#Y>S+Xo>H zoQ>z5Uka^yO`?9WGOl+X5B@5#c*$}hbs6mBi`^q7o>~bqUSWTh8GwM#}9yj^Of+6$)mFW0KJ#tbN~PV diff --git a/vectordb/experience/experience_db/index.pkl b/vectordb/experience/experience_db/index.pkl deleted file mode 100644 index 087b08e5b518e16abaa95f31fa823c8f00cc4a8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1130 zcmZ`&O=}cE5EWTXG*P1`5rsO4iQo1JFJWj{`-^uVL-2V{X2Y-Q;qOkFFHy^C+tZl7V{lV7uMt^;J@HG&IPy6mkqlN5>hpY|-+PTb}CY@RYY*gXyyHEH|j%a4VDy{>P|BD4f>R z8BC!OrKuGiYxUNEt+|CE@D`M$3&OD|v@)u)FjBCufOlOZiqtEE*lH#K!hq^f0+(eh z))*sP0+zx;-l*aPsC{gkD{EDo77?;@*2Ya@!g6y$>&%U6<;FGb{&ENsk@^vKSprWl zKvl4OG{eAh%*Xl}sQ700Z;6ob^X%L41orvl=h^pVLRs7+hP7&rc#ci*=T~=vU-%sx z;VGft`hNrB{J_a#%IXz^mPKr4Q(bRYk4fDcAVg2~DK&s3?LX{YlVfk}_y) zSa$u^>ki$|~`Ix$I3el3K- z>~bHb1CwC0x;}u3a!`;Vh%Ext*a}(3(KM6}f$U3;sgmAUMi<0IXxvaQ`FS!LYXn_h z1%Gq*uMH10Z}CtWo8c)2PLtb7hoQdY{8h#(flX;xl!t{+VWqxaU;FHDGuCNAzXURF utroeX(;MCpSo#C~W!4nz Date: Tue, 19 Mar 2024 22:03:01 +0800 Subject: [PATCH 199/223] config template --- ufo/config/config.yaml.template | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index 1ab8df29..4b79a71b 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -33,6 +33,11 @@ ACTION_SELECTION_PROMPT: "ufo/prompts/base/{mode}/action_selection.yaml" # The APP_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/{mode}/app_example.yaml" # The prompt for the app selection ACTION_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/{mode}/action_example.yaml" # The prompt for the action selection + +## For experience learning +EXPERIENCE_PROMPT: "ufo/prompts/experience/{mode}/experience_summary.yaml" +EXPERIENCE_SAVED_PATH: "vectordb/experience/" + API_PROMPT: "ufo/prompts/base/{mode}/api.yaml" # The prompt for the API INPUT_TEXT_API: "type_keys" # The input text API INPUT_TEXT_ENTER: True # whether to press enter after typing the text @@ -49,12 +54,6 @@ RAG_ONLINE_SEARCH_TOPK: 5 # The topk for the online search RAG_ONLINE_RETRIEVED_TOPK: 1 # The topk for the online retrieved documents - -## For experience learning -VISUAL_PROMPT = "ufo/prompts/experience/visual_experience_prompt.yaml" -NON_VISUAL_PROMPT = "ufo/prompts/experience/nonvisual_experience_prompt.yaml" - -VISUAL_EXAMPLE_PROMPT = "ufo/prompts/experience/visual_experience_example_prompt.yaml" -NON_VISUAL_EXAMPLE_PROMPT = "ufo/prompts/experience/nonvisual_experience_example_prompt.yaml" - -EXAMPLE_SAVED_PATH = "ufo/experience/replay/" +## RAG Configuration for experience +RAG_EXPERIENCE: True # Whether to use the offline RAG. +RAG_EXPERIENCE_RETRIEVED_TOPK: 5 # The topk for the offline retrieved documents From 5978aff987f8e84250092d3552a13b6379aac542 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 19 Mar 2024 22:10:05 +0800 Subject: [PATCH 200/223] rm redundant prompts --- .gitignore | 1 + .../examples/visual/action_example_cp.yaml | 169 ------------------ .../examples/visual/app_example_cp.yaml | 151 ---------------- 3 files changed, 1 insertion(+), 320 deletions(-) delete mode 100644 ufo/prompts/examples/visual/action_example_cp.yaml delete mode 100644 ufo/prompts/examples/visual/app_example_cp.yaml diff --git a/.gitignore b/.gitignore index 416fe9a9..8ea657c7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ # Ignore Jupyter Notebook checkpoints .ipynb_checkpoints /test/* +/deprecated/* /test/*.ipynb /logs/* __pycache__/ diff --git a/ufo/prompts/examples/visual/action_example_cp.yaml b/ufo/prompts/examples/visual/action_example_cp.yaml deleted file mode 100644 index 4e955f4d..00000000 --- a/ufo/prompts/examples/visual/action_example_cp.yaml +++ /dev/null @@ -1,169 +0,0 @@ -version: 1.0 - -example1: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", - "Thought": "Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action.", - "ControlLabel": "1", - "ControlText": "New Email", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", - "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} - - -example2: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The screenshot shows that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not visible in the screenshot. The last action took effect by opening the Outlook windows.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not visible in the screenshots, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", - "ControlLabel": "34", - "ControlText": "Main Page", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", - "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} - - -example3: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", - "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", - "ControlLabel": "36", - "ControlText": "Type a new message", - "Function": "set_edit_text", - "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, - "Status": "CONTINUE", - "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", - "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} - - -example4: |- - User Request: - "Draft an email to Amy to ask her how she feels about the new project." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", - "ControlLabel": "36", - "ControlText": "Email Body", - "Function": "set_edit_text", - "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, - "Status": "FINISH", - "Plan": "", - "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} - - - -example5: |- - User Request: - "Search for the word 'UFO' in the document." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted. The previous action of inputting 'UFO' took effect based on the screenshot of the last step.", - "Thought": "Base on the screenshots, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", - "ControlLabel": "59", - "ControlText": "Find", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "FINISH", - "Plan": "", - "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} - - -example6: |- - User Request: - "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." - Response: - {"Observation": "The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot.", - "Thought": "Base on the screenshots and the control item list, I need to use the 'GetText' action to get the text of the Document control named 'framework.docx'. Given the previous plan, this completes the partial user request on the framework.docx, and therefore I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. ", - "ControlLabel": "83", - "ControlText": "framework - Word", - "Function": "texts", - "Args": {}, - "Status": "APP_SELECTION", - "Plan": "(1) Switch to the image of framework.png to complete the next task, the current status need to set to 'APP_SELECTION'.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from the results from my history steps and I will use them to compose the message.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", - "Comment": "The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task."} - - - -example7: |- - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." - Response: - {"Observation": "The current screenshot shows the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", - "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", - "ControlLabel": "59", - "ControlText": "File", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - - -example8: |- - User Request: - "How many stars does the Imdiffusion repo have?" - Response: - {"Observation": "I observe that the Edge browser is visible in the screenshot, and the with the Google search page opened.", - "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", - "ControlLabel": "36", - "ControlText": "搜索", - "Function": "set_edit_text", - "Args": {"text": "Imdiffusion GitHub"}, - "Status": "CONTINUE", - "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} - - - -example9: |- - User Request: - "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." - Response: - {"Observation": "The current screenshot shows that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task.", - "Thought": "I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes.", - "ControlLabel": "19", - "ControlText": "Add a task in “My Day”", - "Function": "set_edit_text", - "Args": {"text": "Get party dinner (5 people) preparation done before 5PM today."}, - "Status": "CONTINUE", - "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", - "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} - - -example10: |- - User Request: - "Please create a slide from the meeting_notes.docx in the presentation1.pptx." - Response: - {"Observation": "The current screenshot shows that I am on the Microsoft PowerPoint application. The Copilot Add-in is visible in the screenshot.", - "Thought": "I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx.", - "ControlLabel": "60", - "ControlText": "Copilot", - "Function": "click_input", - "Args": {"button": "left", "double": true}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Create presentation from file' button to open a file picker. \\n (2) Select and click the meeting_notes.docx file in the file picker. \\n (3) Click the 'Send' buttom to send the request to Copilot. This completes the task.", - "Comment": "I need use the Copilot Add-in to create a slide from the meeting_notes.docx."} - - -example11: |- - User Request: - "Please @Zac to revise the presentation1.pptx." - Response: - {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", - "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", - "ControlLabel": "42", - "ControlText": "Insert", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the Comment button to open the comment text box. \\n (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", - "Comment": "I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} - diff --git a/ufo/prompts/examples/visual/app_example_cp.yaml b/ufo/prompts/examples/visual/app_example_cp.yaml deleted file mode 100644 index a40be6ac..00000000 --- a/ufo/prompts/examples/visual/app_example_cp.yaml +++ /dev/null @@ -1,151 +0,0 @@ -version: 1.0 - -example1: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "I observe that the outlook application is visible in the screenshot, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application.", - "Thought": "I need to open the email application to send a email. According to the screenshot and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it.", - "ControlLabel": "12", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of outlook application.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email. This action is sensitive and need to be confirmed by the user.", - "Comment": "It is time to open the outlook application!"} - - -example2: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "I observe an empty desktop with no application opened, the target application Teams is not visible in the screenshot.", - "Thought": "I need to open the Teams application to send a message. Although I can not see the Teams application in the screenshot, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it.", - "ControlLabel": "6", - "ControlText": "Mike Lee | Microsoft Teams", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of Teams application.\\n(2) Click the Chat button to open the chat window with Tom.\\n(3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?'\\n(4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user.", - "Comment": "It is time to open the Teams application."} - - -example3: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", - "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", - "ControlLabel": "36", - "ControlText": "Type a new message", - "Function": "set_edit_text", - "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, - "Status": "CONTINUE", - "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", - "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} - - -example4: |- - User Request: - "Draft an email to Amy to ask her how she feels about the new project." - Response: - {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", - "ControlLabel": "36", - "ControlText": "Email Body", - "Function": "set_edit_text", - "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, - "Status": "FINISH", - "Plan": "", - "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} - - - -example5: |- - User Request: - "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." - Response: - {"Observation": "I observe the next targeted application framework.png is not visible on the screenshot.", - "Thought": "Base on the step history, I have completed all tasks in the framework.docx needed to be done. To complete the following user request, now it is time to switch to the image of framework.png to complete the next task. I need to set the image viewer focused to open the image of framework.png.", - "ControlLabel": "21", - "ControlText": "framework.png | image", - "Status": "CONTINUE", - "Plan": "(1) Open the image of framework.png to complete the next task.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from my history actions.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", - "Comment": "After I get the text of the Document control named 'framework.docx', I need to switch to the image of framework.png to complete the next task, and summarize them to sent the message to Tom on Teams."} - - - -example6: |- - User Request: - "Revise the email to be longer and send." - Response: - {"Observation": "I observe that the outlook application is visible in the screenshot, and a new email draft is opened, with its title, receiver email address and email body already filled in.", - "Thought": "Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send.", - "ControlLabel": "21", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Open the Mail - Outlook - Zac to complete the next task.\\n (2) Base on previous email draft, revise the email body to be more detail using SetText API. \\n (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user.", - "Comment": "The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it."} - -example7: |- - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." - Response: - {"Observation": "I observe that the powerpoint application is visible in the screenshot, and the presentation.pptx is opened", - "Thought": "I need to set focus on the powerpoint application to remove all notes in the presentation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one.", - "ControlLabel": "21", - "ControlText": "presentation - PowerPoint", - "Status": "CONTINUE", - "Plan": "(1) Open and set focus the presentation - PowerPoint.\\n (2) Click the 'File' button at the upper left corner, to open a menu.\\n (3) Click the 'Info' ListItem, to access the 'Info' page.\\n (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (5) Click the 'Inspect Document', to open a document inspector. \\n (6) Click the 'Inspect' button, to inspect the ppt for notes. \\n (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.", - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - - - -example8: |- - User Request: - "How many stars does the Imdiffusion repo have?" - Response: - {"Observation": "I observe that a Edge browser is visible in the screenshot, and the with the Google page opened.", - "Thought": "I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task.", - "ControlLabel": "7", - "ControlText": "Google - Microsoft​ Edge", - "Status": "CONTINUE", - "Plan": "(1) Open and set focus the Google - Microsoft​ Edge.\\n (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. \\n (3) Click Google Search to search for the Imdiffusion repo on github.\\n (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page.\\n (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} - - - -example9: |- - User Request: - "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." - Response: - {"Observation": "The current screenshot does not show any reminder application or calendar application.", - "Thought": "I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application.", - "ControlLabel": "6", - "ControlText": "Microsoft To Do", - "Status": "CONTINUE", - "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", - "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} - - -example10: |- - User Request: - "Please create a slide from the meeting_notes.docx in the presentation1.pptx." - Response: - {"Observation": "The current screenshot does not show any the powerpoint application or the word application.", - "Thought": "I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application.", - "ControlLabel": "4", - "ControlText": "presentation1 - PowerPoint", - "Status": "CONTINUE", - "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. \\n (3) Click the 'Create presentation from file' button to open a file picker. \\n (4) Select and click the meeting_notes.docx file in the file picker. \\n (5) Click the 'Send' buttom to send the request to Copilot. This completes the task.", - "Comment": "I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx."} - - -example11: |- - User Request: - "Please @Zac to revise the presentation1.pptx." - Response: - {"Observation": "The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened.", - "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", - "ControlLabel": "4", - "ControlText": "presentation1 - PowerPoint, - "Status": "CONTINUE", - "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Click the Insert Button to open the Insert menu. \\n (3) Click the Comment button to open the comment text box. \\n (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", - "Comment": "I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} - From 6c0247dc30287c49d7e67d51a8346fac78abc2eb Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 19 Mar 2024 22:41:54 +0800 Subject: [PATCH 201/223] rewrite prompt --- .../examples/nonvisual/action_example.yaml | 422 ++++++++++++------ .../examples/nonvisual/app_example.yaml | 329 ++++++++------ .../examples/visual/action_example.yaml | 42 +- 3 files changed, 507 insertions(+), 286 deletions(-) diff --git a/ufo/prompts/examples/nonvisual/action_example.yaml b/ufo/prompts/examples/nonvisual/action_example.yaml index 824081b8..a9f34269 100644 --- a/ufo/prompts/examples/nonvisual/action_example.yaml +++ b/ufo/prompts/examples/nonvisual/action_example.yaml @@ -1,147 +1,297 @@ version: 1.0 -example1: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." +example1: + Request: |- + My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source. Response: - {"Observation": "The control item list indicates that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", - "Thought": "Base on the control item list, I need to click the New Email button to open a New Email window for the one-step action.", - "ControlLabel": "1", - "ControlText": "New Email", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", - "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} - - -example2: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The control item list indicates that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not available from the control item list. The last action took effect by opening the Outlook windows.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not available in the control item list, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", - "ControlLabel": "34", - "ControlText": "Main Page", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not available in the control item list, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", - "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} - - -example3: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Observation: |- + The control item list indicates that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application. + Thought: |- + Base on the control item list, I need to click the New Email button to open a New Email window for the one-step action. + ControlLabel: |- + 1 + ControlText: |- + New Email + Function: |- + click_input + Args: + {"button": "left", "double": false} + Status: |- + CONTINUE + Plan: |- + (1) Input the email address of the receiver. + (2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'. + (3) Input the content of the email. I need to input 'Dear Jack,\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\nBest regards,\nZac'. + (4) Click the Send button to send the email. + Comment: |- + After I click the New Email button, the New Email window will be opened and available for composing the email. + Tips: |- + - Sending an email is a sensitive action that needs to be confirmed by the user before the execution. + - You need to draft the content of the email and send it to the receiver. + + +example2: + Request: |- + My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source. Response: - {"Observation": "The control item list indicates that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. ", - "Thought": "Base on the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", - "ControlLabel": "36", - "ControlText": "Type a new message", - "Function": "set_edit_text", - "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, - "Status": "CONTINUE", - "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", - "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} - - -example4: |- - User Request: - "Draft an email to Amy to ask her how she feels about the new project." + Observation: |- + The control item list indicates that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not available from the control item list. The last action took effect by opening the Outlook windows. + Thought: |- + Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not available in the control item list, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window. + ControlLabel: |- + 34 + ControlText: |- + Main Page + Function: |- + click_input + Args: + {"button": "left", "double": false} + Status: |- + CONTINUE + Plan: |- + (1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not available in the control item list, I may need to look for take action on other control items to navigate to the New Email button. + (2) Input the email address of the receiver. + (3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'. + (4) Input the content of the email. I need to input 'Dear Jack,\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\nBest regards,\nZac'. + (5) Click the Send button to send the email. + Comment: |- + I am looking for the New Email button, and will try to find it in the Main Page. + Tips: |- + - Sending an email is a sensitive action that needs to be confirmed by the user before the execution. + - Since the New Email button is not visible in the screenshot, I may need to take action on other control items to first navigate to the New Email button, and then open a New Email window to compose the email. + + +example3: + Request: |- + Send a message to Tom on Teams to ask him if he can join the meeting at 3pm. Response: - {"Observation": "The control item list indicates that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the seems like the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", - "ControlLabel": "36", - "ControlText": "Email Body", - "Function": "set_edit_text", - "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, - "Status": "FINISH", - "Plan": "", - "Comment": "I revised the previous plan base on the control item list since I think the New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} - - -example5: |- - User Request: - "Search for the word 'UFO' in the document." + Observation: |- + The control item list indicates that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. + Thought: |- + Base on the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation. + ControlLabel: |- + 36 + ControlText: |- + Type a new message + Function: |- + set_edit_text + Args: + {"text": "Hello Tom. It's 3 PM. Are you available to join the meeting now?"} + Status: |- + CONTINUE + Plan: |- + (1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution. + Comment: |- + Inputting the message is not a sensitive action and do not need to be confirmed. + Tips: |- + - Sending a message is a sensitive action and need to be confirmed. + + +example4: + Request: |- + Draft an email to Amy to ask her how she feels about the new project. Response: - {"Observation": "The control item list indicates that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted.", - "Thought": "Base on the control item list, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", - "ControlLabel": "59", - "ControlText": "Find", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "FINISH", - "Plan": "", - "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} - -example6: |- - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." + Observation: |- + The control item list indicates that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly. + Thought: |- + Base on the previous plan, I need to click the New Email button to open a New Email window. But the seems like the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy. + ControlLabel: |- + 36 + ControlText: |- + Email Body + Function: |- + set_edit_text + Args: + text: | + Dear Amy, + + I hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns. + + Best regards, + [Sender's Name] + Status: |- + FINISH + Plan: |- + + Comment: |- + I revised the previous plan base on the control item list since I think the New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email. + Tips: |- + - Sending an email is a sensitive action that needs to be confirmed by the user before the execution. + - You need to draft the content of the email and send it to the receiver. Use polite language when drafting the email. + + +example5: + Request: |- + Search for the word 'UFO' in the document. Response: - {"Observation": "The current control item list indicates the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", - "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", - "ControlLabel": "59", - "ControlText": "File", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - -example7: |- - User Request: - "How many stars does the Imdiffusion repo have?" + Observation: |- + The control item list indicates that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted. + Thought: |- + Base on the control item list, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished. + ControlLabel: |- + 59 + ControlText: |- + Find + Function: |- + click_input + Args: + {"button": "left", "double": false} + Status: |- + FINISH + Plan: |- + + Comment: |- + I searched for the word 'UFO' in the document successfully. The user should view the search result. + Tips: |- + - If there are steps already taken (e.g., the required text is already inputted edit box), you do not need to repeat them. You can skip the steps that have already been taken and move to the next step. + + + +example6: + Request: |- + Quickly remove all notes in the presentation.pptx, without looping through each slide. Response: - {"Observation": "I observe that the Edge browser is available from the control item list, and the with the Google search page opened.", - "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", - "ControlLabel": "36", - "ControlText": "搜索", - "Function": "set_edit_text", - "Args": {"text": "Imdiffusion GitHub"}, - "Status": "CONTINUE", - "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} - -example8: |- - User Request: - "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." + Observation: |- + The current control item list indicates the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time. + Thought: |- + The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu. + ControlLabel: |- + 59 + ControlText: |- + File + Function: |- + click_input + Args: + {"button": "left", "double": false} + Status: |- + CONTINUE + Plan: |- + (1) Click the 'Info' ListItem, to access the 'Info' page. + (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. + (3) Click the 'Inspect Document', to open a document inspector. + (4) Click the 'Inspect' button, to inspect the ppt for notes. + (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible. + (6) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user. + Comment: |- + I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file. + Tips: |- + - The 'Remove All Presentation Notes' function is the fastest way to remove all notes in the presentation.pptx file. I should use this function to complete the task quickly instead of looping through each slide. + - The 'Remove All Presentation Notes' is usually at the bottom of the menu, and I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible. + + +example7: + Request: |- + How many stars does the Imdiffusion repo have? Response: - {"Observation": "The current control item list indicates that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task.", - "Thought": "I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes.", - "ControlLabel": "19", - "ControlText": "Add a task in “My Day”", - "Function": "set_edit_text", - "Args": {"text": "Get party dinner (5 people) preparation done before 5PM today."}, - "Status": "CONTINUE", - "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", - "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} - - -example9: |- - User Request: - "Please create a slide from the meeting_notes.docx in the presentation1.pptx." + Observation: |- + I observe that the Edge browser is available from the control item list, and the with the Google search page opened. + Thought: |- + I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox. + ControlLabel: |- + 36 + ControlText: |- + 搜索 + Function: |- + set_edit_text + Args: + {"text": "Imdiffusion GitHub"} + Status: |- + CONTINUE + Plan: |- + (1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github. + (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page. + (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request. + Comment: |- + I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually. + Tips: |- + - The search box is usually in a type of ComboBox. + - The number of stars of a Github repo page can be found in the repo page visually. + + +example8: + Request: |- + Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes. Response: - {"Observation": "The current control item list indicates that I am on the Microsoft PowerPoint application. The Copilot Add-in is avaialble from the control item list.", - "Thought": "I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx.", - "ControlLabel": "60", - "ControlText": "Copilot", - "Function": "click_input", - "Args": {"button": "left", "double": true}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Create presentation from file' button to open a file picker. \\n (2) Select and click the meeting_notes.docx file in the file picker. \\n (3) Click the 'Send' buttom to send the request to Copilot. This completes the task.", - "Comment": "I need use the Copilot Add-in to create a slide from the meeting_notes.docx."} - - -example10: |- - User Request: - "Please @Zac to revise the presentation1.pptx." + Observation: |- + The current control item list indicates that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task. + Thought: |- + I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes. + ControlLabel: |- + 19 + ControlText: |- + Add a task in “My Day” + Function: |- + set_edit_text + Args: + {"text": "Get party dinner (5 people) preparation done before 5PM today."} + Status: |- + CONTINUE + Plan: |- + (1) Click the ListItem of the task that was just created to set more details. + (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. + (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. + (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. + (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. + (6) Close the details view by clicking the 'Dismiss detail view' botton. + Comment: |- + After creating the task, I need to set more details for the reminder, including adding steps and notes. + Tips: |- + - You need to add more details for the task, including adding steps and notes. + - You need to add each step one by one and add notes to the task. + + + +example9: + Request: |- + Please create a slide from the meeting_notes.docx in the presentation1.pptx. Response: - {"Observation": "The current control item list indicates the powerpoint application is visible, and the presentation1.pptx is opened.", - "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", - "ControlLabel": "42", - "ControlText": "Insert", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the Comment button to open the comment text box. \\n (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", - "Comment": "I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + Observation: |- + The current control item list indicates that I am on the Microsoft PowerPoint application. The Copilot Add-in is avaialble from the control item list. + Thought: |- + I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. + ControlLabel: |- + 60 + ControlText: |- + Copilot + Function: |- + click_input + Args: + {"button": "left", "double": true} + Status: |- + CONTINUE + Plan: |- + (1) Click the 'Create presentation from file' button to open a file picker. + (2) Select and click the meeting_notes.docx file in the file picker. + (3) Click the 'Send' buttom to send the request to Copilot. This completes the task. + Comment: |- + I need use the Copilot Add-in to create a slide from the meeting_notes.docx. + Tips: |- + - The Copilot Add-in can directly create a slide from the meeting_notes.docx. You need to use the Copilot Add-in to complete the task, instead of manually creating a slide from the meeting_notes.docx. + - The Copilot Add-in is visible in the screenshot, and I need to double click it to open the Copilot Add-in. + + +example10: + Request: |- + Please @Zac to revise the presentation1.pptx. + Response: + Observation: |- + The current control item list indicates the powerpoint application is visible, and the presentation1.pptx is opened. + Thought: |- + I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx. + ControlLabel: |- + 42 + ControlText: |- + Insert + Function: |- + click_input + Args: + {"button": "left", "double": false} + Status: |- + CONTINUE + Plan: |- + (1) Click the Comment button to open the comment text box. + (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box. + Comment: |- + I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx. + Tips: |- + - The comment text box is usually opened by clicking the Comment button. diff --git a/ufo/prompts/examples/nonvisual/app_example.yaml b/ufo/prompts/examples/nonvisual/app_example.yaml index c7a4dccb..93aa9dfb 100644 --- a/ufo/prompts/examples/nonvisual/app_example.yaml +++ b/ufo/prompts/examples/nonvisual/app_example.yaml @@ -1,134 +1,205 @@ version: 1.0 -example1: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." +example1: + Request: |- + My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source. Response: - {"Observation": "I observe that the outlook application is available from the control item list, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application.", - "Thought": "I need to open the email application to send a email. According to the control item list and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it.", - "ControlLabel": "12", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of outlook application.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email. This action is sensitive and need to be confirmed by the user.", - "Comment": "It is time to open the outlook application!"} - - -example2: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "I observe an empty desktop with no application opened, the target application Teams is not available frp, the control item list.", - "Thought": "I need to open the Teams application to send a message. Although I can not find the Teams application from the control item list, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it.", - "ControlLabel": "6", - "ControlText": "Mike Lee | Microsoft Teams", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of Teams application.\\n(2) Click the Chat button to open the chat window with Tom.\\n(3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?'\\n(4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user.", - "Comment": "It is time to open the Teams application."} - - -example3: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "The control item list indecates that I am on the chat window of Tom on Teams, the message input box is empty and ready to input.", - "Thought": "Base on the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", - "ControlLabel": "36", - "ControlText": "Type a new message", - "Function": "set_edit_text", - "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, - "Status": "CONTINUE", - "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", - "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} - - -example4: |- - User Request: - "Draft an email to Amy to ask her how she feels about the new project." - Response: - {"Observation": "The control item list indecates that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the control item list indecates that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", - "ControlLabel": "36", - "ControlText": "Email Body", - "Function": "set_edit_text", - "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, - "Status": "FINISH", - "Plan": "", - "Comment": "I revised the previous plan base on the control item list since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} - - -example5: |- - User Request: - "Revise the email to be longer and send." - Response: - {"Observation": "I observe that the outlook application is available from the control item list, and a new email draft is opened, with its title, receiver email address and email body already filled in.", - "Thought": "Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send.", - "ControlLabel": "21", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Open the Mail - Outlook - Zac to complete the next task.\\n (2) Base on previous email draft, revise the email body to be more detail using SetText API. \\n (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user.", - "Comment": "The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it."} - -example6: |- - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." - Response: - {"Observation": "I observe that the powerpoint application is available from the control item list, and the presentation.pptx is opened", - "Thought": "I need to set focus on the powerpoint application to remove all notes in the presentation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one.", - "ControlLabel": "21", - "ControlText": "presentation - PowerPoint", - "Status": "CONTINUE", - "Plan": "(1) Open and set focus the presentation - PowerPoint.\\n (2) Click the 'File' button at the upper left corner, to open a menu.\\n (3) Click the 'Info' ListItem, to access the 'Info' page.\\n (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (5) Click the 'Inspect Document', to open a document inspector. \\n (6) Click the 'Inspect' button, to inspect the ppt for notes. \\n (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.", - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - - -example7: |- - User Request: - "How many stars does the Imdiffusion repo have?" - Response: - {"Observation": "I observe that a Edge browser is available from the control item list and the with the Google page opened.", - "Thought": "I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task.", - "ControlLabel": "7", - "ControlText": "Google - Microsoft​ Edge", - "Status": "CONTINUE", - "Plan": "(1) Open and set focus the Google - Microsoft​ Edge.\\n (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. \\n (3) Click Google Search to search for the Imdiffusion repo on github.\\n (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page.\\n (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} - -example8: |- - User Request: - "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." - Response: - {"Observation": "The current control item list does not include any reminder application or calendar application.", - "Thought": "I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application.", - "ControlLabel": "6", - "ControlText": "Microsoft To Do", - "Status": "CONTINUE", - "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", - "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} - - -example9: |- - User Request: - "Please create a slide from the meeting_notes.docx in the presentation1.pptx." - Response: - {"Observation": "The current control item list does not include any the powerpoint application or the word application.", - "Thought": "I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application.", - "ControlLabel": "4", - "ControlText": "presentation1 - PowerPoint", - "Status": "CONTINUE", - "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. \\n (3) Click the 'Create presentation from file' button to open a file picker. \\n (4) Select and click the meeting_notes.docx file in the file picker. \\n (5) Click the 'Send' buttom to send the request to Copilot. This completes the task.", - "Comment": "I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx."} - - -example10: |- - User Request: - "Please @Zac to revise the presentation1.pptx." - Response: - {"Observation": "The current control item list includes the powerpoint application is visible, and the presentation1.pptx is opened.", - "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", - "ControlLabel": "4", - "ControlText": "presentation1 - PowerPoint, - "Status": "CONTINUE", - "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Click the Insert Button to open the Insert menu. \\n (3) Click the Comment button to open the comment text box. \\n (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", - "Comment": "I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} + Observation: |- + I observe that the outlook application is available from the control item list, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application. + Thought: |- + I need to open the email application to send a email. According to the control item list and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it. + ControlLabel: |- + 12 + ControlText: |- + Mail - Outlook - Zac + Status: |- + CONTINUE + Plan: |- + (1) Open the windows of outlook application. + (2) Input the email address of the receiver. + (3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'. + (4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'. + (5) Click the Send button to send the email. This action is sensitive and need to be confirmed by the user. + Comment: |- + It is time to open the outlook application! + + + +example2: + Request: |- + Send a message to Tom on Teams to ask him if he can join the meeting at 3pm. + Response: + Observation: |- + I observe an empty desktop with no application opened, the target application Teams is not available from the control item list. + Thought: |- + I need to open the Teams application to send a message. Although I can not find the Teams application from the control item list, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it. + ControlLabel: |- + 6 + ControlText: |- + Mike Lee | Microsoft Teams + Status: |- + CONTINUE + Plan: |- + (1) Open the windows of Teams application. + (2) Click the Chat button to open the chat window with Tom. + (3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?' + (4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user. + Comment: |- + It is time to open the Teams application. + + + + +example3: + Request: |- + Revise the email to be longer and send. + Response: + Observation: |- + I observe that the outlook application is available from the control item list, and a new email draft is opened, with its title, receiver email address and email body already filled in. + Thought: |- + Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send. + ControlLabel: |- + 21 + ControlText: |- + Mail - Outlook - Zac + Status: |- + CONTINUE + Plan: |- + (1) Open the Mail - Outlook - Zac to complete the next task. + (2) Base on previous email draft, revise the email body to be more detail using SetText API. + (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user. + Comment: |- + The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it. + + + + +example4: + Request: |- + Quickly remove all notes in the presentation.pptx, without looping through each slide. + Response: + Observation: |- + I observe that the powerpoint application is available from the control item list, and the presentation.pptx is opened. + Thought: |- + I need to set focus on the powerpoint application to remove all notes in the presentation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one. + ControlLabel: |- + 21 + ControlText: |- + presentation - PowerPoint + Status: |- + CONTINUE + Plan: |- + (1) Open and set focus the presentation - PowerPoint. + (2) Click the 'File' button at the upper left corner, to open a menu. + (3) Click the 'Info' ListItem, to access the 'Info' page. + (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. + (5) Click the 'Inspect Document', to open a document inspector. + (6) Click the 'Inspect' button, to inspect the ppt for notes. + (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible. + (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user. + Comment: |- + I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file. + + + +example5: + Request: |- + How many stars does the Imdiffusion repo have? + Response: + Observation: |- + I observe that a Edge browser is available from the control item list and the with the Google page opened. + Thought: |- + I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task. + ControlLabel: |- + 7 + ControlText: |- + Google - Microsoft​ Edge + Status: |- + CONTINUE + Plan: |- + (1) Open and set focus the Google - Microsoft​ Edge. + (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. + (3) Click Google Search to search for the Imdiffusion repo on github. + (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page. + (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request. + Comment: |- + I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually. + + +example6: + Request: |- + Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes. + Response: + Observation: |- + The current control item list does not include any reminder application or calendar application. + Thought: |- + I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application. + ControlLabel: |- + 6 + ControlText: |- + Microsoft To Do + Status: |- + CONTINUE + Plan: |- + (1) Open the Microsoft To Do application. + (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. + (3) Click the ListItem of the task that was just created to set more details. + (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. + (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. + (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. + (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. + (8) Close the details view by clicking the 'Dismiss detail view' botton. + Comment: |- + I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder. + + + +example7: + Request: |- + Please create a slide from the meeting_notes.docx in the presentation1.pptx. + Response: + Observation: |- + The current control item list does not include any the powerpoint application or the word application. + Thought: |- + I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application. + ControlLabel: |- + 4 + ControlText: |- + presentation1 - PowerPoint + Status: |- + CONTINUE + Plan: |- + (1) Open the presentation1 - PowerPoint. + (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. + (3) Click the 'Create presentation from file' button to open a file picker. + (4) Select and click the meeting_notes.docx file in the file picker. + (5) Click the 'Send' buttom to send the request to Copilot. This completes the task. + Comment: |- + I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx. + + + +example8: + Request: |- + Please @Zac to revise the presentation1.pptx. + Response: + Observation: |- + The current control item list includes the powerpoint application is visible, and the presentation1.pptx is opened. + Thought: |- + I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx. + ControlLabel: |- + 4 + ControlText: |- + presentation1 - PowerPoint + Status: |- + CONTINUE + Plan: |- + (1) Open the presentation1 - PowerPoint. + (2) Click the Insert Button to open the Insert menu. + (3) Click the Comment button to open the comment text box. + (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box. + Comment: |- + I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx. + diff --git a/ufo/prompts/examples/visual/action_example.yaml b/ufo/prompts/examples/visual/action_example.yaml index 1df2735a..646173a1 100644 --- a/ufo/prompts/examples/visual/action_example.yaml +++ b/ufo/prompts/examples/visual/action_example.yaml @@ -150,7 +150,7 @@ example5: example6: Request: |- - Search for the word 'UFO' in the document. + Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png. Response: Observation: |- The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot. @@ -277,26 +277,26 @@ example10: Request: |- Please create a slide from the meeting_notes.docx in the presentation1.pptx. Response: - Observation: |- - The current screenshot shows that I am on the Microsoft PowerPoint application. The Copilot Add-in is visible in the screenshot. - Thought: |- - I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. - ControlLabel: |- - 60 - ControlText: |- - Copilot - Function: |- - click_input - Args: - {"button": "left", "double": true} - Status: |- - CONTINUE - Plan: |- - (1) Click the 'Create presentation from file' button to open a file picker. - (2) Select and click the meeting_notes.docx file in the file picker. - (3) Click the 'Send' buttom to send the request to Copilot. This completes the task. - Comment: |- - I need use the Copilot Add-in to create a slide from the meeting_notes.docx. + Observation: |- + The current screenshot shows that I am on the Microsoft PowerPoint application. The Copilot Add-in is visible in the screenshot. + Thought: |- + I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. + ControlLabel: |- + 60 + ControlText: |- + Copilot + Function: |- + click_input + Args: + {"button": "left", "double": true} + Status: |- + CONTINUE + Plan: |- + (1) Click the 'Create presentation from file' button to open a file picker. + (2) Select and click the meeting_notes.docx file in the file picker. + (3) Click the 'Send' buttom to send the request to Copilot. This completes the task. + Comment: |- + I need use the Copilot Add-in to create a slide from the meeting_notes.docx. Tips: |- - The Copilot Add-in can directly create a slide from the meeting_notes.docx. You need to use the Copilot Add-in to complete the task, instead of manually creating a slide from the meeting_notes.docx. - The Copilot Add-in is visible in the screenshot, and I need to double click it to open the Copilot Add-in. From fb5edbf5e3f3978f4d2ced280bb16481f3fc149e Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 19 Mar 2024 22:44:42 +0800 Subject: [PATCH 202/223] add type --- ufo/experience/parser.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ufo/experience/parser.py b/ufo/experience/parser.py index a0aba15c..6a045b05 100644 --- a/ufo/experience/parser.py +++ b/ufo/experience/parser.py @@ -155,7 +155,7 @@ def get_request_partition(self) -> list: @staticmethod - def get_user_request(log_partition: dict): + def get_user_request(log_partition: dict) -> str: """ Get the user request. :param log_partition: The log partition. @@ -166,7 +166,7 @@ def get_user_request(log_partition: dict): @staticmethod - def get_app_list(log_partition: dict): + def get_app_list(log_partition: dict) -> list: """ Get the user request. :param log_partition: The log partition. From cbffd5a43f78e373f89f24e6a4eff9a56dd0e008 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 19 Mar 2024 22:47:03 +0800 Subject: [PATCH 203/223] rm redundancy --- .../examples/nonvisual/action_example_cp.yaml | 147 ------------------ .../examples/nonvisual/app_example_cp.yaml | 134 ---------------- 2 files changed, 281 deletions(-) delete mode 100644 ufo/prompts/examples/nonvisual/action_example_cp.yaml delete mode 100644 ufo/prompts/examples/nonvisual/app_example_cp.yaml diff --git a/ufo/prompts/examples/nonvisual/action_example_cp.yaml b/ufo/prompts/examples/nonvisual/action_example_cp.yaml deleted file mode 100644 index 824081b8..00000000 --- a/ufo/prompts/examples/nonvisual/action_example_cp.yaml +++ /dev/null @@ -1,147 +0,0 @@ -version: 1.0 - -example1: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The control item list indicates that I am on the Main Page of Outlook. The Main Page has a list of control items and email received. The new email editing window is not opened. The last action took effect by opening the Outlook application.", - "Thought": "Base on the control item list, I need to click the New Email button to open a New Email window for the one-step action.", - "ControlLabel": "1", - "ControlText": "New Email", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", - "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} - - -example2: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "The control item list indicates that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not available from the control item list. The last action took effect by opening the Outlook windows.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not available in the control item list, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", - "ControlLabel": "34", - "ControlText": "Main Page", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not available in the control item list, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", - "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} - - -example3: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "The control item list indicates that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. ", - "Thought": "Base on the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", - "ControlLabel": "36", - "ControlText": "Type a new message", - "Function": "set_edit_text", - "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, - "Status": "CONTINUE", - "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", - "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} - - -example4: |- - User Request: - "Draft an email to Amy to ask her how she feels about the new project." - Response: - {"Observation": "The control item list indicates that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the seems like the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", - "ControlLabel": "36", - "ControlText": "Email Body", - "Function": "set_edit_text", - "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, - "Status": "FINISH", - "Plan": "", - "Comment": "I revised the previous plan base on the control item list since I think the New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} - - -example5: |- - User Request: - "Search for the word 'UFO' in the document." - Response: - {"Observation": "The control item list indicates that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputted.", - "Thought": "Base on the control item list, the word 'UFO' is already inputted in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", - "ControlLabel": "59", - "ControlText": "Find", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "FINISH", - "Plan": "", - "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} - -example6: |- - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." - Response: - {"Observation": "The current control item list indicates the PowerPoint application with the 'presentation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", - "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", - "ControlLabel": "59", - "ControlText": "File", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - -example7: |- - User Request: - "How many stars does the Imdiffusion repo have?" - Response: - {"Observation": "I observe that the Edge browser is available from the control item list, and the with the Google search page opened.", - "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", - "ControlLabel": "36", - "ControlText": "搜索", - "Function": "set_edit_text", - "Args": {"text": "Imdiffusion GitHub"}, - "Status": "CONTINUE", - "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} - -example8: |- - User Request: - "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." - Response: - {"Observation": "The current control item list indicates that I am on the Microsoft To Do application. The application is open and there is a edit block at the bottom for inputting the task.", - "Thought": "I need to add a task of 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block of 'Add a task in “My Day”'. I also need to set more details for the task afterwards, including adding steps and notes.", - "ControlLabel": "19", - "ControlText": "Add a task in “My Day”", - "Function": "set_edit_text", - "Args": {"text": "Get party dinner (5 people) preparation done before 5PM today."}, - "Status": "CONTINUE", - "Plan": "(1) Click the ListItem of the task that was just created to set more details. \\n (2) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (3) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (4) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (5) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (6) Close the details view by clicking the 'Dismiss detail view' botton.", - "Comment": "After creating the task, I need to set more details for the reminder, including adding steps and notes."} - - -example9: |- - User Request: - "Please create a slide from the meeting_notes.docx in the presentation1.pptx." - Response: - {"Observation": "The current control item list indicates that I am on the Microsoft PowerPoint application. The Copilot Add-in is avaialble from the control item list.", - "Thought": "I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx.", - "ControlLabel": "60", - "ControlText": "Copilot", - "Function": "click_input", - "Args": {"button": "left", "double": true}, - "Status": "CONTINUE", - "Plan": "(1) Click the 'Create presentation from file' button to open a file picker. \\n (2) Select and click the meeting_notes.docx file in the file picker. \\n (3) Click the 'Send' buttom to send the request to Copilot. This completes the task.", - "Comment": "I need use the Copilot Add-in to create a slide from the meeting_notes.docx."} - - -example10: |- - User Request: - "Please @Zac to revise the presentation1.pptx." - Response: - {"Observation": "The current control item list indicates the powerpoint application is visible, and the presentation1.pptx is opened.", - "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", - "ControlLabel": "42", - "ControlText": "Insert", - "Function": "click_input", - "Args": {"button": "left", "double": false}, - "Status": "CONTINUE", - "Plan": "(1) Click the Comment button to open the comment text box. \\n (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", - "Comment": "I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} diff --git a/ufo/prompts/examples/nonvisual/app_example_cp.yaml b/ufo/prompts/examples/nonvisual/app_example_cp.yaml deleted file mode 100644 index c7a4dccb..00000000 --- a/ufo/prompts/examples/nonvisual/app_example_cp.yaml +++ /dev/null @@ -1,134 +0,0 @@ - -version: 1.0 - -example1: |- - User Request: - "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." - Response: - {"Observation": "I observe that the outlook application is available from the control item list, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application.", - "Thought": "I need to open the email application to send a email. According to the control item list and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it.", - "ControlLabel": "12", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of outlook application.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email. This action is sensitive and need to be confirmed by the user.", - "Comment": "It is time to open the outlook application!"} - - -example2: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "I observe an empty desktop with no application opened, the target application Teams is not available frp, the control item list.", - "Thought": "I need to open the Teams application to send a message. Although I can not find the Teams application from the control item list, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it.", - "ControlLabel": "6", - "ControlText": "Mike Lee | Microsoft Teams", - "Status": "CONTINUE", - "Plan": "(1) Open the windows of Teams application.\\n(2) Click the Chat button to open the chat window with Tom.\\n(3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?'\\n(4) Click the Send button to send the message. This action is sensitive and need to be confirmed by the user.", - "Comment": "It is time to open the Teams application."} - - -example3: |- - User Request: - "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." - Response: - {"Observation": "The control item list indecates that I am on the chat window of Tom on Teams, the message input box is empty and ready to input.", - "Thought": "Base on the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", - "ControlLabel": "36", - "ControlText": "Type a new message", - "Function": "set_edit_text", - "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, - "Status": "CONTINUE", - "Plan": "(1) Click the Send button to send the message. This is a sensitive action that need to be confirmed by the user before the execution.", - "Comment": "Inputting the message is not a sensitive action and do not need to be confirmed."} - - -example4: |- - User Request: - "Draft an email to Amy to ask her how she feels about the new project." - Response: - {"Observation": "The control item list indecates that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", - "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the control item list indecates that the New Email window has already opened and the title of email has already been inputted. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", - "ControlLabel": "36", - "ControlText": "Email Body", - "Function": "set_edit_text", - "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, - "Status": "FINISH", - "Plan": "", - "Comment": "I revised the previous plan base on the control item list since I observe that New Email window has already opened and the title of email has already been inputted. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} - - -example5: |- - User Request: - "Revise the email to be longer and send." - Response: - {"Observation": "I observe that the outlook application is available from the control item list, and a new email draft is opened, with its title, receiver email address and email body already filled in.", - "Thought": "Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send.", - "ControlLabel": "21", - "ControlText": "Mail - Outlook - Zac", - "Status": "CONTINUE", - "Plan": "(1) Open the Mail - Outlook - Zac to complete the next task.\\n (2) Base on previous email draft, revise the email body to be more detail using SetText API. \\n (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user.", - "Comment": "The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it."} - -example6: |- - User Request: - "Quickly remove all notes in the presentation.pptx, without looping through each slide." - Response: - {"Observation": "I observe that the powerpoint application is available from the control item list, and the presentation.pptx is opened", - "Thought": "I need to set focus on the powerpoint application to remove all notes in the presentation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one.", - "ControlLabel": "21", - "ControlText": "presentation - PowerPoint", - "Status": "CONTINUE", - "Plan": "(1) Open and set focus the presentation - PowerPoint.\\n (2) Click the 'File' button at the upper left corner, to open a menu.\\n (3) Click the 'Info' ListItem, to access the 'Info' page.\\n (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (5) Click the 'Inspect Document', to open a document inspector. \\n (6) Click the 'Inspect' button, to inspect the ppt for notes. \\n (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presentation.pptx file. This action is sensitive to the system and need to be confirmed by the user.", - "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presentation.pptx file."} - - -example7: |- - User Request: - "How many stars does the Imdiffusion repo have?" - Response: - {"Observation": "I observe that a Edge browser is available from the control item list and the with the Google page opened.", - "Thought": "I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task.", - "ControlLabel": "7", - "ControlText": "Google - Microsoft​ Edge", - "Status": "CONTINUE", - "Plan": "(1) Open and set focus the Google - Microsoft​ Edge.\\n (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. \\n (3) Click Google Search to search for the Imdiffusion repo on github.\\n (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page.\\n (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", - "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} - -example8: |- - User Request: - "Please remind me to get party dinner (5 people) preparation done before 5PM today with steps and notes." - Response: - {"Observation": "The current control item list does not include any reminder application or calendar application.", - "Thought": "I need to open a reminder application to set a reminder for the user. According to the application information, I can use Microsoft To Do to set a reminder for the user. I need to open the Microsoft To Do application.", - "ControlLabel": "6", - "ControlText": "Microsoft To Do", - "Status": "CONTINUE", - "Plan": "(1) Open the Microsoft To Do application. \\n (2) Add a task of by inputing 'Get party dinner (5 people) preparation done before 5PM today.' to the edit block. \\n (3) Click the ListItem of the task that was just created to set more details. \\n (4) Add a step 1 for the task by inputing 'Menu Planning and Ingredient Acquisition' in the Add step edit control. \\n (5) Add a step 2 for the task by inputing 'Meal Preparation Schedule' in the Add step edit control following the step one. \\n (6) Add a step 3 for the task by inputing 'Setting Up the Dining Area' in the Add step edit control following the step two. \\n (7) Add a note to this task in the 'Add note' edit blocking at the bottom by inputing 'Considering preferences, dietary restrictions and food allergiesof the guests.'. \\n (8) Close the details view by clicking the 'Dismiss detail view' botton.", - "Comment": "I plan to use the Microsoft To Do application to set a reminder for the user, and add details and notes to the reminder."} - - -example9: |- - User Request: - "Please create a slide from the meeting_notes.docx in the presentation1.pptx." - Response: - {"Observation": "The current control item list does not include any the powerpoint application or the word application.", - "Thought": "I need to open the powerpoint application and the word application to complete the user request. According to the application information, I can use the powerpoint application to create a slide from the meeting_notes.docx and add it to the presentation1.pptx. I need to open the powerpoint application and the word application.", - "ControlLabel": "4", - "ControlText": "presentation1 - PowerPoint", - "Status": "CONTINUE", - "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Double click the Copilot Add-in to open the Copilot that can help to create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. \\n (3) Click the 'Create presentation from file' button to open a file picker. \\n (4) Select and click the meeting_notes.docx file in the file picker. \\n (5) Click the 'Send' buttom to send the request to Copilot. This completes the task.", - "Comment": "I plan to open the powerpoint application and use the Copilot Add-in to create a slide from the meeting_notes.docx."} - - -example10: |- - User Request: - "Please @Zac to revise the presentation1.pptx." - Response: - {"Observation": "The current control item list includes the powerpoint application is visible, and the presentation1.pptx is opened.", - "Thought": "I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx.", - "ControlLabel": "4", - "ControlText": "presentation1 - PowerPoint, - "Status": "CONTINUE", - "Plan": "(1) Open the presentation1 - PowerPoint. \\n (2) Click the Insert Button to open the Insert menu. \\n (3) Click the Comment button to open the comment text box. \\n (4) Input '@Zac, please revise the presentation1.pptx.' in the comment text box.", - "Comment": "I plan to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx."} - From ef99b13b756ee6d98225a3dea916fddfc8e8c64c Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 19 Mar 2024 22:51:34 +0800 Subject: [PATCH 204/223] rm empty lines between tips --- ufo/prompter/agent_prompter.py | 28 +++------------------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/ufo/prompter/agent_prompter.py b/ufo/prompter/agent_prompter.py index 5fa4ec6c..3f7a777c 100644 --- a/ufo/prompter/agent_prompter.py +++ b/ufo/prompter/agent_prompter.py @@ -168,6 +168,9 @@ def system_prompt_construction(self, additional_examples=[], tips=[]) -> str: examples = self.examples_prompt_helper(additional_examples=additional_examples) tips_prompt = "\n".join(tips) + # Remove empty lines + tips_prompt = '\n'.join(filter(None, tips_prompt.split('\n'))) + return self.prompt_template["system"].format(apis=apis, examples=examples, tips=tips_prompt) @@ -282,29 +285,4 @@ def api_prompt_helper(self, verbose: int = 1) -> str: api_prompt = self.retrived_documents_prompt_helper("", "", api_list) return api_prompt - - - def tips_prompt_helper(self, verbose: int = 1) -> str: - """ - Construct the prompt for tips. - :param verbose: The verbosity level. - return: The prompt for tips. - """ - - # Construct the prompt for tips - tips_list = ["- The action type are limited to {actions}.".format(actions=list(self.api_prompt_template.keys()))] - - # Construct the prompt for each tip - for key in self.api_prompt_template.keys(): - api = self.api_prompt_template[key] - if verbose > 0: - api_text = "{summary}\n{usage}".format(summary=api["summary"], usage=api["usage"]) - else: - api_text = api["summary"] - - tips_list.append(api_text) - - tips_prompt = self.retrived_documents_prompt_helper("", "", tips_list) - - return tips_prompt \ No newline at end of file From ca03ab2d9e9ad8c7c6cd236513c783f6f1ec5ef0 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Wed, 20 Mar 2024 12:38:18 +0800 Subject: [PATCH 205/223] file name fixed --- ufo/rag/{web_retriever.py => web_search.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ufo/rag/{web_retriever.py => web_search.py} (100%) diff --git a/ufo/rag/web_retriever.py b/ufo/rag/web_search.py similarity index 100% rename from ufo/rag/web_retriever.py rename to ufo/rag/web_search.py From e6c0f2af248756f5c4ecbe775a414bfc3f39e776 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Thu, 21 Mar 2024 13:01:06 +0800 Subject: [PATCH 206/223] resolve comment --- ufo/experience/config.yaml | 9 ----- ufo/experience/parser.py | 20 ++++++---- ufo/llm/llm_call.py | 3 +- ufo/prompter/agent_prompter.py | 2 +- ufo/prompter/basic.py | 6 ++- .../base/nonvisual/action_selection.yaml | 2 +- ufo/prompts/base/visual/action_selection.yaml | 5 ++- ufo/prompts/base/visual/app_selection.yaml | 3 +- .../examples/visual/action_example.yaml | 40 ++++++++++++------- .../nonvisual/experience_summary.yaml | 2 +- .../experience/visual/experience_summary.yaml | 2 +- 11 files changed, 53 insertions(+), 41 deletions(-) delete mode 100644 ufo/experience/config.yaml diff --git a/ufo/experience/config.yaml b/ufo/experience/config.yaml deleted file mode 100644 index da74c3f0..00000000 --- a/ufo/experience/config.yaml +++ /dev/null @@ -1,9 +0,0 @@ -version: 0.1 - -VISUAL_SYSTEM_PROMPT_TEMPLTE_FILE: "" -VISUAL_SYSTEM_PROMPT_TEMPLTE_FILE: "" - -VISUAL_SYSTEM_PROMPT_TEMPLTE_FILE: "" -VISUAL_SYSTEM_PROMPT_TEMPLTE_FILE: "" - -SAVE_PATH: "" diff --git a/ufo/experience/parser.py b/ufo/experience/parser.py index 6a045b05..9ee4155b 100644 --- a/ufo/experience/parser.py +++ b/ufo/experience/parser.py @@ -4,7 +4,7 @@ import json import os import re -from ..utils import encode_image_from_path +from ..utils import encode_image_from_path, print_with_color class ExperienceLogLoader: @@ -19,7 +19,7 @@ def __init__(self, log_path: str): """ self.log_path = log_path self.response = self.load_response_log() - self.max_stepnum = self.find_max_number_in_filenames() + self.max_stepnum = self.find_max_number_in_filenames(log_path) self.request_partition = self.get_request_partition() self.screenshots = {} @@ -38,18 +38,22 @@ def load_response_log(self): # Read the lines and split them into a list response_log = file.readlines() for response_string in response_log: - response.append(json.loads(response_string)) + try: + response.append(json.loads(response_string)) + except json.JSONDecodeError: + print_with_color(f"Error loading response log: {response_string}", "yellow") return response - def find_max_number_in_filenames(self) -> int: + @staticmethod + def find_max_number_in_filenames(log_path) -> int: """ Find the maximum number in the filenames. :return: The maximum number in the filenames. """ # Get the list of files in the folder - files = os.listdir(self.log_path) + files = os.listdir(log_path) # Initialize an empty list to store extracted numbers numbers = [] @@ -57,7 +61,7 @@ def find_max_number_in_filenames(self) -> int: # Iterate through each file for file in files: # Extract the number from the filename - number = self.extract_number(file) + number = ExperienceLogLoader.extract_action_step_count(file) if number is not None: # Append the extracted number to the list numbers.append(number) @@ -176,9 +180,9 @@ def get_app_list(log_partition: dict) -> list: @staticmethod - def extract_number(filename : str) -> int: + def extract_action_step_count(filename : str) -> int: """ - Extract the number from the filename. + Extract the action step count from the filename. :param filename: The filename. :return: The number extracted from the filename. """ diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py index a321dd36..c89f2381 100644 --- a/ufo/llm/llm_call.py +++ b/ufo/llm/llm_call.py @@ -40,7 +40,8 @@ def get_completion(messages, agent: str='APP', use_backup_engine: bool=True): raise ValueError(f'API_TYPE {api_type} not supported') except Exception as e: if use_backup_engine: - print_with_color(f"The API request of {agent_type} failed: {e}, try to use the backup engine", "red") + print_with_color(f"The API request of {agent_type} failed: {e}.", "red") + print_with_color(f"Switching to use the backup engine...", "yellow") return get_completion(messages, agent='backup', use_backup_engine=False) else: raise e \ No newline at end of file diff --git a/ufo/prompter/agent_prompter.py b/ufo/prompter/agent_prompter.py index 3f7a777c..ff26ac46 100644 --- a/ufo/prompter/agent_prompter.py +++ b/ufo/prompter/agent_prompter.py @@ -158,7 +158,7 @@ def __init__(self, is_visual: bool, prompt_template: str, example_prompt_templat self.api_prompt_template = self.load_prompt_template(api_prompt_template) - def system_prompt_construction(self, additional_examples=[], tips=[]) -> str: + def system_prompt_construction(self, additional_examples: list =[], tips: list =[]) -> str: """ Construct the prompt for app selection. return: The prompt for app selection. diff --git a/ufo/prompter/basic.py b/ufo/prompter/basic.py index 1a95500a..9bef9e2b 100644 --- a/ufo/prompter/basic.py +++ b/ufo/prompter/basic.py @@ -4,6 +4,7 @@ from abc import ABC, abstractmethod import os import yaml +from ..utils import print_with_color class BasicPrompter(ABC): @@ -42,7 +43,10 @@ def load_prompt_template(self, template_path: str) -> dict: path = template_path.format(mode = "visual" if self.is_visual == True else "nonvisual") if os.path.exists(path): - prompt = yaml.safe_load(open(path, "r", encoding="utf-8")) + try: + prompt = yaml.safe_load(open(path, "r", encoding="utf-8")) + except yaml.YAMLError as exc: + print_with_color(f"Error loading prompt template: {exc}", "yellow") else: raise FileNotFoundError(f"Prompt template not found at {path}") diff --git a/ufo/prompts/base/nonvisual/action_selection.yaml b/ufo/prompts/base/nonvisual/action_selection.yaml index bf64d2e6..0e72ac91 100644 --- a/ufo/prompts/base/nonvisual/action_selection.yaml +++ b/ufo/prompts/base/nonvisual/action_selection.yaml @@ -60,7 +60,7 @@ system: |- ## Other Guidelines - You are required to select the control item and take open-step action by calling API on it to complete the user request for one step. - - You are required to are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: + - You are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: {{"Observation": "Thought": "ControlLabel": diff --git a/ufo/prompts/base/visual/action_selection.yaml b/ufo/prompts/base/visual/action_selection.yaml index ed9734aa..4676f0f6 100644 --- a/ufo/prompts/base/visual/action_selection.yaml +++ b/ufo/prompts/base/visual/action_selection.yaml @@ -77,7 +77,7 @@ system: |- ## Other Guidelines - You are required to select the control item and take open-step action by calling API on it to complete the user request for one step. - - You are required to are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: + - You are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: {{"Observation": "Thought": "ControlLabel": @@ -106,7 +106,8 @@ system: |- - Do not take action if the current action need further input. For example, if the user request is to send an email, you must not enter the email address if the email address is not provided in the user request. - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from different applications, you must try to find them in previous "Results" and incorporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. - When inputting the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. - - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. + - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document, or summarizing the entire ppt. + - Saving a ppt file into pdf format can be done by clicking the "Save As Adobe PDF" button. - You are given the help documents of the application or/and the online search results for completing the user request. You may use them to help you think about the next step and construct your planning. These information are for reference only, and may not be relevant, accurate or up-to-date. You must rely more on the current screenshots and control item list to make the decision. ## Here are other tips for you to complete the user request: diff --git a/ufo/prompts/base/visual/app_selection.yaml b/ufo/prompts/base/visual/app_selection.yaml index 5d23d9d6..cc901496 100644 --- a/ufo/prompts/base/visual/app_selection.yaml +++ b/ufo/prompts/base/visual/app_selection.yaml @@ -58,7 +58,8 @@ system: |- - If the user request is just asking question and do not need to take action on the application, you should answer the user request on the "Comment" field, and set the "Status" as "FINISH". - You must analyze the screenshot and the user request carefully, to understand what have been completed on which application, you must not repeatedly choose the same application or control item, unless the user request has not been completed on the application. - In your response, the control text of the selected application must strictly match its control label. - - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document. + - The 'Copilot' Add-in can help you with some special requests, such as creating a slide in PowerPoint from a Word document, or summarizing the entire ppt. + - Saving a ppt file into pdf format can be done by clicking the "Save As Adobe PDF" button. - You must to strictly follow the instruction and the JSON format of the response. - Below are two example of the response. You can refer to them as a reference. diff --git a/ufo/prompts/examples/visual/action_example.yaml b/ufo/prompts/examples/visual/action_example.yaml index 646173a1..7b23c97e 100644 --- a/ufo/prompts/examples/visual/action_example.yaml +++ b/ufo/prompts/examples/visual/action_example.yaml @@ -52,7 +52,18 @@ example2: (1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button. (2) Input the email address of the receiver. (3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'. - (4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'. + (4) Input the content of the email. I need to input + + 'Dear Jack, + I hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board. + Your commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole. + Your code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success. + + Please know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out. + Once again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community. + Best regards, + Zac'. + (5) Click the Send button to send the email. Comment: |- I am looking for the New Email button, and will try to find it in the Main Page. @@ -280,7 +291,7 @@ example10: Observation: |- The current screenshot shows that I am on the Microsoft PowerPoint application. The Copilot Add-in is visible in the screenshot. Thought: |- - I need to double click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. + I need to click the Copilot Add-in, which can help me create a slide from the meeting_notes.docx. The Copilot Add-in can directly create a slide from the meeting_notes.docx. ControlLabel: |- 60 ControlText: |- @@ -288,32 +299,31 @@ example10: Function: |- click_input Args: - {"button": "left", "double": true} + {"button": "left", "double": false} Status: |- CONTINUE Plan: |- (1) Click the 'Create presentation from file' button to open a file picker. - (2) Select and click the meeting_notes.docx file in the file picker. + (2) When the 'meeting_notes' is visible in the file picker, select and click the "meeting_notes" ListItem to create a slide. (3) Click the 'Send' buttom to send the request to Copilot. This completes the task. Comment: |- - I need use the Copilot Add-in to create a slide from the meeting_notes.docx. + I need to use the Copilot Add-in to create a slide from the meeting_notes.docx. Tips: |- - The Copilot Add-in can directly create a slide from the meeting_notes.docx. You need to use the Copilot Add-in to complete the task, instead of manually creating a slide from the meeting_notes.docx. - - The Copilot Add-in is visible in the screenshot, and I need to double click it to open the Copilot Add-in. example11: Request: |- - Please @Zac to revise the presentation1.pptx. + Save the presentation1.pptx into pdf format. Response: Observation: |- The current screenshot shows the powerpoint application is visible, and the presentation1.pptx is opened. Thought: |- - I need to set focus on the powerpoint application and leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx. + I need to click the 'File' button, to make the the 'Save As Adobe PDF' button available. Then I need to click the 'Save As Adobe PDF' button to save the presentation1.pptx into pdf format. If the 'Save As Adobe PDF' button is not visible in the screenshot, I may need to use the 'Save a Copy' button to manually save the presentation1.pptx into pdf format. ControlLabel: |- - 42 + 34 ControlText: |- - Insert + File Function: |- click_input Args: @@ -321,11 +331,11 @@ example11: Status: |- CONTINUE Plan: |- - (1) Click the Comment button to open the comment text box. - (2) Input '@Zac, please revise the presentation1.pptx.' in the comment text box. + (1) Click the "Save As Adobe PDF" button to open the save as dialog. + (2) Click the "Save" button to save the presentation1.pptx into pdf format. This completes the task. Comment: |- - I need to leave a comment in the presentation1.pptx to remind Zac to revise the presentation1.pptx. + I need to use the "Save As Adobe PDF" button to save the presentation1.pptx into pdf format. Tips: |- - - The comment text box is usually opened by clicking the Comment button. - + - Saving the presentation1.pptx into pdf format can be done by clicking the "Save As Adobe PDF" button. + - If the "Save As Adobe PDF" button is not visible in the screenshot, you may need to use the "Save a Copy" button to manually save the presentation1.pptx into pdf format. diff --git a/ufo/prompts/experience/nonvisual/experience_summary.yaml b/ufo/prompts/experience/nonvisual/experience_summary.yaml index cb5aba76..2efdb154 100644 --- a/ufo/prompts/experience/nonvisual/experience_summary.yaml +++ b/ufo/prompts/experience/nonvisual/experience_summary.yaml @@ -15,7 +15,7 @@ system: |- ## Output Format - - You are required to are required to response in a JSON format, consisting of 10 distinct parts with the following keys and corresponding content: + - You are required to response in a JSON format, consisting of 10 distinct parts with the following keys and corresponding content: {{"Observation": } "Thought": "ControlLabel": diff --git a/ufo/prompts/experience/visual/experience_summary.yaml b/ufo/prompts/experience/visual/experience_summary.yaml index db6084d8..02c460f7 100644 --- a/ufo/prompts/experience/visual/experience_summary.yaml +++ b/ufo/prompts/experience/visual/experience_summary.yaml @@ -16,7 +16,7 @@ system: |- ## Output Format - - You are required to are required to response in a JSON format, consisting of 10 distinct parts with the following keys and corresponding content: + - You are required to response in a JSON format, consisting of 10 distinct parts with the following keys and corresponding content: {{"Observation": "Thought": "ControlLabel": From aa3d1545f4ebb790f3e745aff696704b1df43895 Mon Sep 17 00:00:00 2001 From: yunhao0204 <59384816+yunhao0204@users.noreply.github.com> Date: Thu, 21 Mar 2024 14:57:07 +0800 Subject: [PATCH 207/223] Add record processor to parse the user behavior record to json file --- record_processor/__init__.py | 2 + record_processor/__main__.py | 8 + record_processor/parser/behavior_record.py | 42 +++++ record_processor/parser/psr_record_parser.py | 171 +++++++++++++++++++ record_processor/record_processor.py | 36 ++++ record_processor/utils/__init__.py | 57 +++++++ requirements.txt | 3 +- 7 files changed, 318 insertions(+), 1 deletion(-) create mode 100644 record_processor/__init__.py create mode 100644 record_processor/__main__.py create mode 100644 record_processor/parser/behavior_record.py create mode 100644 record_processor/parser/psr_record_parser.py create mode 100644 record_processor/record_processor.py create mode 100644 record_processor/utils/__init__.py diff --git a/record_processor/__init__.py b/record_processor/__init__.py new file mode 100644 index 00000000..7f3fd831 --- /dev/null +++ b/record_processor/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. \ No newline at end of file diff --git a/record_processor/__main__.py b/record_processor/__main__.py new file mode 100644 index 00000000..dd26b9e4 --- /dev/null +++ b/record_processor/__main__.py @@ -0,0 +1,8 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +from . import record_processor + +if __name__ == "__main__": + # Execute the main script + record_processor.main() + \ No newline at end of file diff --git a/record_processor/parser/behavior_record.py b/record_processor/parser/behavior_record.py new file mode 100644 index 00000000..6fa9ad52 --- /dev/null +++ b/record_processor/parser/behavior_record.py @@ -0,0 +1,42 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +class BehaviorStep: + """ + Class for the single step information in the user behavior record. + Multiple steps will be recorded to achieve a specific request. + """ + + def __init__(self, application: str, description: str, action: str, screenshot: str, comment: str): + """ + Create a new step. + """ + self.application = application + self.description = description + self.action = action + self.comment = comment + self.screenshot = screenshot + + +class BehaviorRecord: + """ + Class for the user behavior record. + A serise of steps user performed to achieve a specific request will be recorded in this class. + """ + + def __init__(self, applications: list, step_num: int, **steps: BehaviorStep): + """ + Create a new Record. + """ + self.request = "" + self.round = 0 + self.applications = applications + self.step_num = step_num + for index, step in steps.items(): + setattr(self, index, step.__dict__) + + def set_request(self, request): + """ + Set the request. + """ + self.request = request diff --git a/record_processor/parser/psr_record_parser.py b/record_processor/parser/psr_record_parser.py new file mode 100644 index 00000000..7eec6cde --- /dev/null +++ b/record_processor/parser/psr_record_parser.py @@ -0,0 +1,171 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import re +import xml.etree.ElementTree as ET +from bs4 import BeautifulSoup +from .behavior_record import BehaviorRecord, BehaviorStep + + +class PSRRecordParser: + """ + Class for parsing the steps recorder .mht file content to user behavior record. + """ + + def __init__(self, content: str): + """ + Constructor for the RecordParser class. + """ + self.content = content + self.parts_dict = {} + self.applications = [] + self.comments = [] + self.steps = [] + + def parse_to_record(self) -> BehaviorRecord: + """ + Parse the steps recorder .mht file content to record in following steps: + 1. Find the boundary in the .mht file. + 2. Split the file by the boundary into parts. + 3. Get the comments for each step. + 4. Get the steps from the content. + 5. Construct the record object and return it. + return: A record object. + """ + boundary = self.find_boundary() + self.parts_dict = self.split_file_by_boundary(boundary) + self.comments = self.get_comments( + self.parts_dict['main.htm']['Content']) + self.steps = self.get_steps(self.parts_dict['main.htm']['Content']) + record = BehaviorRecord( + list(set(self.applications)), len(self.steps), **self.steps) + + return record + + def find_boundary(self) -> str: + """ + Find the boundary in the .mht file. + """ + + boundary_start = self.content.find("boundary=") + + if boundary_start != -1: + boundary_start += len("boundary=") + boundary_end = self.content.find("\n", boundary_start) + boundary = self.content[boundary_start:boundary_end].strip('\"') + return boundary + else: + raise ValueError("Boundary not found in the .mht file.") + + def split_file_by_boundary(self, boundary: str) -> dict: + """ + Split the file by the boundary into parts, + Store the parts in a dictionary, including the content type, + content location and content transfer encoding. + boundary: The boundary of the file. + return: A dictionary of parts in the file. + """ + parts = self.content.split("--" + boundary) + part_dict = {} + for part in parts: + content_type_start = part.find("Content-Type:") + content_location_start = part.find("Content-Location:") + content_transfer_encoding_start = part.find( + "Content-Transfer-Encoding:") + part_info = {} + if content_location_start != -1: + content_location_end = part.find("\n", content_location_start) + content_location = part[content_location_start:content_location_end].split(":")[ + 1].strip() + + # add the content location + if content_type_start != -1: + content_type_end = part.find("\n", content_type_start) + content_type = part[content_type_start:content_type_end].split(":")[ + 1].strip() + part_info["Content-Type"] = content_type + + # add the content transfer encoding + if content_transfer_encoding_start != -1: + content_transfer_encoding_end = part.find( + "\n", content_transfer_encoding_start) + content_transfer_encoding = part[content_transfer_encoding_start:content_transfer_encoding_end].split(":")[ + 1].strip() + part_info["Content-Transfer-Encoding"] = content_transfer_encoding + + content = part[content_location_end:].strip() + part_info["Content"] = content + part_dict[content_location] = part_info + return part_dict + + def get_steps(self, content: str) -> dict: + """ + Get the steps from the content in fllowing steps: + 1. Find the UserActionData tag in the content. + 2. Parse the UserActionData tag to get the steps. + 3. Get the screenshot for each step. + 4. Get the comments for each step. + content: The content of the main.htm file. + return: A dictionary of steps. + """ + + user_action_data = re.search( + r'(.*?)', content, re.DOTALL) + if user_action_data: + + root = ET.fromstring(user_action_data.group(1)) + steps = {} + + for each_action in root.findall('EachAction'): + + action_number = each_action.get('ActionNumber') + application = each_action.get('FileName') + description = each_action.find('Description').text + action = each_action.find('Action').text + screenshot_file_name = each_action.find( + 'ScreenshotFileName').text + screenshot = self.get_screenshot(screenshot_file_name) + step_key = f"step_{int(action_number) - 1}" + + step = BehaviorStep( + application, description, action, screenshot, self.comments.get(step_key)) + steps[step_key] = step + self.applications.append(application) + return steps + else: + raise ValueError("UserActionData not found in the file.") + + def get_comments(self, content: str) -> dict: + """ + Get the user input comments for each step + content: The content of the main.htm file. + return: A dictionary of comments for each step. + """ + soup = BeautifulSoup(content, 'html.parser') + body = soup.body + steps_html = body.find('div', id='Steps') + steps = steps_html.find_all(lambda tag: tag.name == 'div' and tag.has_attr( + 'id') and re.match(r'^Step\d+$', tag['id'])) + + comments = {} + for index, step in enumerate(steps): + comment_tag = step.find('b', text='Comment: ') + comments[f'step_{index}'] = comment_tag.next_sibling if comment_tag else None + return comments + + def get_screenshot(self, screenshot_file_name: str) -> str: + """ + Get the screenshot by screenshot file name. + The screenshot related information is stored in the parts_dict. + screenshot_file_name: The file name of the screenshot. + return: The screenshot in base64 string. + """ + screenshot_part = self.parts_dict[screenshot_file_name] + content = screenshot_part['Content'] + content_type = screenshot_part['Content-Type'] + content_transfer_encoding = screenshot_part['Content-Transfer-Encoding'] + + screenshot = 'data:{type};{encoding}, {content}'.format( + type=content_type, encoding=content_transfer_encoding, content=content) + + return screenshot diff --git a/record_processor/record_processor.py b/record_processor/record_processor.py new file mode 100644 index 00000000..c293120f --- /dev/null +++ b/record_processor/record_processor.py @@ -0,0 +1,36 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import argparse +from .parser.psr_record_parser import PSRRecordParser +from .utils import save_to_json, unzip_and_read_file +from ufo.utils import print_with_color +import os + +args = argparse.ArgumentParser() +args.add_argument("--request", "-r", help="The request that user want to achieve.", + type=lambda s: s.strip() or None, nargs='+') +args.add_argument("--behavior-record-path", "-p", help="The path for user behavior record in zip file.", + type=lambda f: f if f.endswith(".zip") else None) +parsed_args = args.parse_args() + + +def main(): + """ + Main function. + """ + + # Temporarily hardcode the output file path, will move to a config file later + output_file = '{prefix}\\vectordb\\records\\log\\{file_name}.json'.format( + prefix=os.getcwd(), + file_name=parsed_args.request[0].replace(' ', '_') + ) + try: + content = unzip_and_read_file(parsed_args.behavior_record_path) + record = PSRRecordParser(content).parse_to_record() + record.set_request(parsed_args.request[0]) + save_to_json(record.__dict__, output_file) + print_with_color( + f"Record process successfully. The record is saved to {output_file}.", "green") + except ValueError as e: + print_with_color(str(e), "red") diff --git a/record_processor/utils/__init__.py b/record_processor/utils/__init__.py new file mode 100644 index 00000000..864fc6bd --- /dev/null +++ b/record_processor/utils/__init__.py @@ -0,0 +1,57 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +import zipfile +import json +import os + + +def unzip_and_read_file(file_path: str) -> str: + """ + Unzip the file and read the content of the extracted file. + file_path: the path of the pending zip file. + return: the content of the extracted file. + """ + extracted_file = unzip_file(file_path) + with open(extracted_file, 'r', encoding='utf-8') as file: + content = file.read() + return content + + +def unzip_file(zip_file_path: str) -> str: + """ + Unzip the file and return the path of the extracted file. + zip_file_path: the path of the pending zip file. + return: the path of the extracted file. + """ + folder_name = os.path.splitext(zip_file_path)[0] + + # Create the directory if it doesn't exist + if not os.path.exists(folder_name): + os.makedirs(folder_name) + + # Extract the contents of the ZIP file into the directory + with zipfile.ZipFile(zip_file_path, 'r') as zip_ref: + zip_ref.extractall(folder_name) + + extracted_file = os.path.join(folder_name, os.listdir(folder_name)[0]) + return extracted_file + + +def save_to_json(data: dict, output_file_path: str): + """ + Save the data to a JSON file. + data: the data to save. + output_file_path: the path of the output file. + """ + + # Extract the directory path from the file path + directory = os.path.dirname(output_file_path) + + # Check if the directory exists, if not, create it + if not os.path.exists(directory): + os.makedirs(directory) + + with open(output_file_path, 'w') as file: + json.dump(data, file, indent=4) diff --git a/requirements.txt b/requirements.txt index 36ba9b0c..d65a8b0d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,4 +11,5 @@ PyYAML==6.0.1 Requests==2.31.0 faiss-cpu==1.8.0 lxml==5.1.0 -psutil==5.9.8 \ No newline at end of file +psutil==5.9.8 +beautifulsoup4==4.12.3 \ No newline at end of file From 063c54e20cb6a0cd32cd07fccc3a07bcad89b9ca Mon Sep 17 00:00:00 2001 From: Mac0q Date: Thu, 21 Mar 2024 16:03:32 +0800 Subject: [PATCH 208/223] openai config --- ufo/config/config.py | 6 +++++- ufo/llm/openai.py | 18 +----------------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/ufo/config/config.py b/ufo/config/config.py index bbb2661b..35bcb4dd 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -48,7 +48,11 @@ def update_api_base(configs, agent): api_version=configs[agent]["API_VERSION"] ) configs[agent]["API_MODEL"] = configs[agent]["API_DEPLOYMENT_ID"] - + elif configs[agent]["API_TYPE"].lower() == "openai": + if 'chat/completions' in configs[agent]["API_BASE"]: + configs[agent]["API_BASE"] = configs[agent]["API_BASE"][:-18] if configs[agent]["API_BASE"].endswith( + "/") else configs[agent]["API_BASE"][:-17] + def optimize_configs(configs): update_api_base(configs,'APP_AGENT') diff --git a/ufo/llm/openai.py b/ufo/llm/openai.py index 3007acc5..92687ad1 100644 --- a/ufo/llm/openai.py +++ b/ufo/llm/openai.py @@ -1,25 +1,9 @@ import datetime -from typing import Any, Literal, Optional +from typing import Any, Optional import openai from openai import AzureOpenAI, OpenAI -available_models = Literal[ #for azure_ad - "gpt-35-turbo-20220309", - "gpt-35-turbo-16k-20230613", - "gpt-35-turbo-20230613", - "gpt-35-turbo-1106", - - "gpt-4-20230321", - "gpt-4-20230613", - "gpt-4-32k-20230321", - "gpt-4-32k-20230613", - "gpt-4-1106-preview", - "gpt-4-0125-preview", - - "gpt-4-visual-preview", -] - class OpenAIService: def __init__(self, config, agent_type: str): From ae94817925b3f5d738275648272d203d78681763 Mon Sep 17 00:00:00 2001 From: "Junting Lu (FESCO Adecco Human Resources)" Date: Thu, 21 Mar 2024 16:46:28 +0800 Subject: [PATCH 209/223] update --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ff51f6e0..0b18d6cf 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ vectordb/docs/* # Don't ignore the example files !vectordb/docs/example/ +.vscode \ No newline at end of file From be85a658f5de72eb9ef7dc0bb80f8fb823cbd25b Mon Sep 17 00:00:00 2001 From: "Junting Lu (FESCO Adecco Human Resources)" Date: Thu, 21 Mar 2024 17:33:49 +0800 Subject: [PATCH 210/223] fix:prompts of action example --- ufo/prompts/examples/nonvisual/action_example.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ufo/prompts/examples/nonvisual/action_example.yaml b/ufo/prompts/examples/nonvisual/action_example.yaml index a9f34269..7e8b4614 100644 --- a/ufo/prompts/examples/nonvisual/action_example.yaml +++ b/ufo/prompts/examples/nonvisual/action_example.yaml @@ -103,12 +103,12 @@ example4: set_edit_text Args: text: | - Dear Amy, + Dear Amy, - I hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns. + I hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns. - Best regards, - [Sender's Name] + Best regards, + [Sender's Name] Status: |- FINISH Plan: |- @@ -203,7 +203,7 @@ example7: (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request. Comment: |- I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually. - Tips: |- + Tips: |- - The search box is usually in a type of ComboBox. - The number of stars of a Github repo page can be found in the repo page visually. From 2dc2f96870fae694c53f99b6fe4e8105cfbd3c2b Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Thu, 21 Mar 2024 21:03:55 +0800 Subject: [PATCH 211/223] execution module --- ufo/module/flow.py | 225 +++++++++++++++++------------------ ufo/ui_control/executor.py | 206 ++++++++++++++++++++++++++++++++ ufo/ui_control/screenshot.py | 8 +- 3 files changed, 323 insertions(+), 116 deletions(-) create mode 100644 ufo/ui_control/executor.py diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 1e70704a..2a9fe916 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -14,8 +14,8 @@ from ..config.config import load_config from ..llm import llm_call from ..prompter.agent_prompter import ApplicationAgentPrompter, ActionAgentPrompter -from ..ui_control import control -from ..ui_control import screenshot as screen +from ..ui_control import control, screenshot as screen +from ..ui_control.executor import ActionExecutor from ..utils import (create_folder, encode_image_from_path, generate_function_call, json_parser, print_with_color, revise_line_breaks, yes_or_no) @@ -60,6 +60,7 @@ def __init__(self, task): self.offline_doc_retriever = None self.online_doc_retriever = None self.experience_retriever = None + self.control_reannotate = None welcome_text = """ Welcome to use UFO🛸, A UI-focused Agent for Windows OS Interaction. @@ -164,6 +165,7 @@ def process_application_selection(self): self.app_window.set_focus() + # Initialize the document retriever if configs["RAG_OFFLINE_DOCS"]: print_with_color("Loading offline document indexer for {app}...".format(app=self.application), "magenta") self.offline_doc_retriever = retriever_factory.OfflineDocRetriever(self.application) @@ -204,144 +206,141 @@ def process_action_selection(self): concat_screenshot_save_path = self.log_path + f"action_step{self.step}_concat.png" control_screenshot_save_path = self.log_path + f"action_step{self.step}_selected_controls.png" - - - if BACKEND == "uia": - control_list = control.find_control_elements_in_descendants(self.app_window, configs["CONTROL_TYPE_LIST"]) + if type(self.control_reannotate) == list and len(self.control_reannotate) > 0: + control_list = self.control_reannotate else: control_list = control.find_control_elements_in_descendants(self.app_window, configs["CONTROL_TYPE_LIST"]) - while True: - if self.app_window == None: - self.status = "ERROR" - print_with_color("Required Application window is not available.", "red") - return - - annotation_dict, _, _ = screen.control_annotations(self.app_window, screenshot_save_path, annotated_screenshot_save_path, control_list, anntation_type="number") - control_info = control.get_control_info_dict(annotation_dict, ["control_text", "control_type" if BACKEND == "uia" else "control_class"]) + if self.app_window == None: + self.status = "ERROR" + print_with_color("Required Application window is not available.", "red") + return - image_url = [] - if configs["INCLUDE_LAST_SCREENSHOT"]: - - last_screenshot_save_path = self.log_path + f"action_step{self.step - 1}.png" - last_control_screenshot_save_path = self.log_path + f"action_step{self.step - 1}_selected_controls.png" - image_url += [encode_image_from_path(last_control_screenshot_save_path if os.path.exists(last_control_screenshot_save_path) else last_screenshot_save_path)] + + annotation_dict, _, _ = screen.control_annotations(self.app_window, screenshot_save_path, annotated_screenshot_save_path, control_list, anntation_type="number") + control_info = control.get_control_info_dict(annotation_dict, ["control_text", "control_type" if BACKEND == "uia" else "control_class"]) - if configs["CONCAT_SCREENSHOT"]: - screen.concat_images_left_right(screenshot_save_path, annotated_screenshot_save_path, concat_screenshot_save_path) - image_url += [encode_image_from_path(concat_screenshot_save_path)] - else: - screenshot_url = encode_image_from_path(screenshot_save_path) - screenshot_annotated_url = encode_image_from_path(annotated_screenshot_save_path) - image_url += [screenshot_url, screenshot_annotated_url] + image_url = [] + if configs["INCLUDE_LAST_SCREENSHOT"]: + + last_screenshot_save_path = self.log_path + f"action_step{self.step - 1}.png" + last_control_screenshot_save_path = self.log_path + f"action_step{self.step - 1}_selected_controls.png" + image_url += [encode_image_from_path(last_control_screenshot_save_path if os.path.exists(last_control_screenshot_save_path) else last_screenshot_save_path)] + if configs["CONCAT_SCREENSHOT"]: + screen.concat_images_left_right(screenshot_save_path, annotated_screenshot_save_path, concat_screenshot_save_path) + image_url += [encode_image_from_path(concat_screenshot_save_path)] + else: + screenshot_url = encode_image_from_path(screenshot_save_path) + screenshot_annotated_url = encode_image_from_path(annotated_screenshot_save_path) + image_url += [screenshot_url, screenshot_annotated_url] + + if configs["RAG_EXPERIENCE"]: examples, tips = self.rag_experience_retrieve() - action_selection_prompt_system_message = self.act_selection_prompter.system_prompt_construction(examples, tips) - action_selection_prompt_user_message = self.act_selection_prompter.user_content_construction(image_url, self.request_history, self.action_history, - control_info, self.plan, self.request, self.rag_prompt(), configs["INCLUDE_LAST_SCREENSHOT"]) - - action_selection_prompt_message = self.act_selection_prompter.prompt_construction(action_selection_prompt_system_message, action_selection_prompt_user_message) + else: + examples = [] + tips = [] - - self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) + action_selection_prompt_system_message = self.act_selection_prompter.system_prompt_construction(examples, tips) + action_selection_prompt_user_message = self.act_selection_prompter.user_content_construction(image_url, self.request_history, self.action_history, + control_info, self.plan, self.request, self.rag_prompt(), configs["INCLUDE_LAST_SCREENSHOT"]) + + action_selection_prompt_message = self.act_selection_prompter.prompt_construction(action_selection_prompt_system_message, action_selection_prompt_user_message) - try: - response_string, cost = llm_call.get_completion(action_selection_prompt_message, "ACTION", use_backup_engine=True) - except Exception as e: - log = json.dumps({"step": self.step, "status": str(e), "prompt": action_selection_prompt_message}) - print_with_color("Error occurs when calling LLM: {e}".format(e=str(e)), "red") - self.request_logger.info(log) - self.status = "ERROR" - time.sleep(configs["SLEEP_TIME"]) - return - - self.cost += cost + self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) - try: - response_json = json_parser(response_string) - - observation = response_json["Observation"] - thought = response_json["Thought"] - control_label = response_json["ControlLabel"] - control_text = response_json["ControlText"] - function_call = response_json["Function"] - args = revise_line_breaks(response_json["Args"]) - - action = generate_function_call(function_call, args) - self.plan = response_json["Plan"] - self.status = response_json["Status"] - comment = response_json["Comment"] - response_json["Step"] = self.step - response_json["Round"] = self.round - response_json["Action"] = action - response_json["Agent"] = "ActAgent" - response_json["Request"] = self.request - response_json["Application"] = self.app_root - - - print_with_color("Observations👀: {observation}".format(observation=observation), "cyan") - print_with_color("Thoughts💡: {thought}".format(thought=thought), "green") - print_with_color("Selected item🕹️: {control_text}, Label: {label}".format(control_text=control_text, label=control_label), "yellow") - print_with_color("Action applied⚒️: {action}".format(action=action), "blue") - print_with_color("Status📊: {status}".format(status=self.status), "blue") - print_with_color("Next Plan📚: {plan}".format(plan=str(self.plan).replace("\\n", "\n")), "cyan") - print_with_color("Comment💬: {comment}".format(comment=comment), "green") - - - except Exception as e: - print_with_color("Error occurs at step {step}".format(step=self.step), "red") - print_with_color(str(e), "red") - print_with_color(response_string, "red") - self.status = "ERROR" + try: + response_string, cost = llm_call.get_completion(action_selection_prompt_message, "ACTION", use_backup_engine=True) + except Exception as e: + log = json.dumps({"step": self.step, "status": str(e), "prompt": action_selection_prompt_message}) + print_with_color("Error occurs when calling LLM: {e}".format(e=str(e)), "red") + self.request_logger.info(log) + self.status = "ERROR" + time.sleep(configs["SLEEP_TIME"]) + return + + self.cost += cost - self.error_logger(response_string, str(e)) - - return - - if "SCREENSHOT" in self.status.upper(): - print_with_color("Annotation is overlapped and the agent is unable to select the control items. New annotated screenshot is taken.", "magenta") - annotated_screenshot_save_path = self.log_path + f"action_step{self.step}_annotated_retake.png" - if "control_labels" in args: - selected_controls_labels = args["control_labels"] - control_list = [annotation_dict[str(label)] for label in selected_controls_labels] - continue - - break + try: + response_json = json_parser(response_string) - self.step += 1 + observation = response_json["Observation"] + thought = response_json["Thought"] + control_label = response_json["ControlLabel"] + control_text = response_json["ControlText"] + function_call = response_json["Function"] + args = revise_line_breaks(response_json["Args"]) - # The task is finish and no further action is needed - if self.status.upper() == "FINISH" and function_call == "": - self.status = self.status.upper() - response_json = self.set_result_and_log("", response_json) + control_selected = annotation_dict.get(control_label, "") + + + # Build the executor for over the control item. + executor = ActionExecutor(control_selected, self.app_window) + + # Compose the function call and the arguments string. + action = generate_function_call(function_call, args) + + # Set the result and log the result. + self.plan = response_json["Plan"] + self.status = response_json["Status"] + comment = response_json["Comment"] + response_json["Step"] = self.step + response_json["Round"] = self.round + response_json["Action"] = action + response_json["Agent"] = "ActAgent" + response_json["Request"] = self.request + response_json["Application"] = self.app_root + + # Log the response. + print_with_color("Observations👀: {observation}".format(observation=observation), "cyan") + print_with_color("Thoughts💡: {thought}".format(thought=thought), "green") + print_with_color("Selected item🕹️: {control_text}, Label: {label}".format(control_text=control_text, label=control_label), "yellow") + print_with_color("Action applied⚒️: {action}".format(action=action), "blue") + print_with_color("Status📊: {status}".format(status=self.status), "blue") + print_with_color("Next Plan📚: {plan}".format(plan=str(self.plan).replace("\\n", "\n")), "cyan") + print_with_color("Comment💬: {comment}".format(comment=comment), "green") + + + except Exception as e: + # Return the error message and log the error. + print_with_color("Error occurs at step {step}".format(step=self.step), "red") + print_with_color(str(e), "red") + self.status = "ERROR" + + self.error_logger(response_string, str(e)) return - - if function_call: - # Handle the case when the action is an image summary or switch app - if function_call.lower() == "summary": - response_json = self.set_result_and_log(args["text"], response_json) - return + self.step += 1 + + # Handle the case when the control item is overlapped and the agent is unable to select the control item. Retake the annotated screenshot. + if "SCREENSHOT" in self.status.upper(): + print_with_color("Annotation is overlapped and the agent is unable to select the control items. New annotated screenshot is taken.", "magenta") + self.control_reannotate = executor.annotation(args, annotation_dict) + return + else: + self.control_reannotate = None + + + # The task is finish and no further action is needed + if self.status.upper() == "FINISH" and not control_selected: + self.status = self.status.upper() response_json = self.set_result_and_log("", response_json) + return - # Action needed. - control_selected = annotation_dict.get(control_label, self.app_window) - # print_with_color("Actual control name: {name}".format(name=control_selected.element_info.name), "magenta") - control_selected.set_focus() - if not self.safe_guard(action, control_text): return - # Take screenshot of the selected control screen.capture_screenshot_controls(self.app_window, [control_selected], control_screenshot_save_path) - control.wait_enabled(control_selected) - results = control.execution(control_selected, function_call, args) + + + # Execute the action + results = executor.execution(function_call, args) response_json = self.set_result_and_log(results, response_json) time.sleep(configs["SLEEP_TIME"]) diff --git a/ufo/ui_control/executor.py b/ufo/ui_control/executor.py new file mode 100644 index 00000000..961f093a --- /dev/null +++ b/ufo/ui_control/executor.py @@ -0,0 +1,206 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + + +from ..utils import print_with_color +from .control import get_control_info +from ..config.config import load_config +import time, warnings + +configs = load_config() + + + +class ActionExecutor: + """ + The action executor class. + """ + + def __init__(self, control, application) -> None: + """ + Initialize the action executor. + :param control: The control element to execute the action. + :param application: The application of the control element. + """ + + self.control = control + if control: + self.control_info = get_control_info(control) + self.control.set_focus() + self.wait_enabled() + + self.application = application + + + + def get_method(self, method_name:str) -> callable: + """ + Get the method of the control element. + :param method_name: The name of the method. + :return: The method of the control element. + """ + method_name = str(method_name) + + mappping = { + "click_input": self.__click_input, + "summary": self.__summary, + "set_edit_text": self.__set_edit_text, + "texts": self.__texts, + "wheel_mouse_input": self.__wheel_mouse_input, + "": self.__no_action + } + + return mappping.get(method_name.lower(), None) + + + def execution(self, method_name:str, args_dict:dict) -> str: + """ + Execute the action on the control elements. + :param method: The method to execute. + :param args: The arguments of the method. + :return: The result of the action. + """ + method = self.get_method(method_name) + + if not method: + message = f"{self.control} doesn't have a method named {method_name}" + print_with_color(message, "red") + return message + + return method(args_dict) + + + + def __click_input(self, args_dict:dict): + """ + Click the control element. + :param args: The arguments of the click method. + :return: The result of the click action. + """ + return self.atomic_execution(self.control, "click_input", args_dict) + + + def __summary(self, args_dict): + """ + Visual summary of the control element. + :param args_dict: The arguments of the visual summary method. should contain a key "text" with the text summary. + :return: The result of the visual summary action. + """ + + return args_dict.get("text") + + + + def __set_edit_text(self, args_dict:dict): + """ + Set the edit text of the control element. + :param args: The arguments of the set edit text method. + :return: The result of the set edit text action. + """ + if configs["INPUT_TEXT_API"] == "type_keys": + method_name = "type_keys" + args = {"keys": args_dict["text"], "pause": 0.1, "with_spaces": True} + else: + args = {"text": args_dict["text"]} + + try: + result = self.atomic_execution(self.control, method_name, args) + if configs["INPUT_TEXT_ENTER"] and method_name in ["type_keys", "set_edit_text"]: + self.atomic_execution(self.control, "type_keys", args = {"keys": "{ENTER}"}) + return result + except Exception as e: + return f"An error occurred: {e}" + + + + def __texts(self, args_dict:dict): + """ + Get the text of the control element. + :param args: The arguments of the text method. + :return: The text of the control element. + """ + return self.control.texts() + + + + def __wheel_mouse_input(self, args_dict:dict): + """ + Wheel mouse input on the control element. + :param args: The arguments of the wheel mouse input method. + :return: The result of the wheel mouse input action. + """ + return self.atomic_execution(self.control, "wheel_mouse_input", args_dict) + + + def __no_action(self, args_dict:dict): + + return "" + + + def annotation(self, args_dict:dict, annotation_dict:dict): + """ + Take a screenshot of the current application window and annotate the control item on the screenshot. + :param args_dict: The arguments of the annotation method. + :param annotation_dict: The dictionary of the control labels. + """ + + selected_controls_labels = args_dict.get("control_labels", []) + control_reannotate = [annotation_dict[str(label)] for label in selected_controls_labels] + + pass + + + + def wait_enabled(self, timeout:int=10, retry_interval:int=0.5): + """ + Wait until the control is enabled. + :param timeout: The timeout to wait. + :param retry_interval: The retry interval to wait. + """ + while not self.control.is_enabled(): + time.sleep(retry_interval) + timeout -= retry_interval + if timeout <= 0: + warnings.warn(f"Timeout: {self.control} is not enabled.") + break + + + + def wait_visible(self, timeout:int=10, retry_interval:int=0.5): + """ + Wait until the window is enabled. + :param timeout: The timeout to wait. + :param retry_interval: The retry interval to wait. + """ + while not self.control.is_visible(): + time.sleep(retry_interval) + timeout -= retry_interval + if timeout <= 0: + warnings.warn(f"Timeout: {self.control} is not visible.") + break + + + + @staticmethod + def atomic_execution(control, method_name:str, args:dict) -> str: + """ + Atomic execution of the action on the control elements. + :param control: The control element to execute the action. + :param method: The method to execute. + :param args: The arguments of the method. + :return: The result of the action. + """ + try: + method = getattr(control, method_name) + result = method(**args) + except AttributeError: + message = f"{control} doesn't have a method named {method_name}" + print_with_color(f"Warning: {message}", "yellow") + result = message + except Exception as e: + message = f"An error occurred: {e}" + print_with_color(f"Warning: {message}", "yellow") + result = message + return result + + diff --git a/ufo/ui_control/screenshot.py b/ufo/ui_control/screenshot.py index 9039c126..13406a40 100644 --- a/ufo/ui_control/screenshot.py +++ b/ufo/ui_control/screenshot.py @@ -89,10 +89,12 @@ def capture_screenshot_controls(top_window, control_list: List, save_path:str, c screenshot = top_window.capture_as_image() window_rect = top_window.rectangle() + for control in control_list: - control_rect = control.rectangle() - adjusted_rect = coordinate_adjusted(window_rect, control_rect) - screenshot = draw_rectangles(screenshot, adjusted_rect, color=color) + if control: + control_rect = control.rectangle() + adjusted_rect = coordinate_adjusted(window_rect, control_rect) + screenshot = draw_rectangles(screenshot, adjusted_rect, color=color) if is_save: screenshot.save(save_path) return screenshot From 113516d2d8b724399117b959df82ef276508bf8d Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Thu, 21 Mar 2024 21:09:09 +0800 Subject: [PATCH 212/223] execution module --- ufo/ui_control/control.py | 115 ++++---------------------------------- 1 file changed, 10 insertions(+), 105 deletions(-) diff --git a/ufo/ui_control/control.py b/ufo/ui_control/control.py index 66addb2f..36d4b2db 100644 --- a/ufo/ui_control/control.py +++ b/ufo/ui_control/control.py @@ -1,13 +1,10 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. -import ast -import time -import warnings -from typing import List + +from typing import List, Tuple import psutil from pywinauto import Desktop - from ..config.config import load_config configs = load_config() @@ -15,7 +12,7 @@ BACKEND = configs["CONTROL_BACKEND"] -def get_desktop_app_info(remove_empty:bool=True): +def get_desktop_app_info(remove_empty:bool=True) -> Tuple[dict, List[dict]]: """ Get titles and control types of all the apps on the desktop. :param remove_empty: Whether to remove empty titles. @@ -28,12 +25,12 @@ def get_desktop_app_info(remove_empty:bool=True): if remove_empty: app_control_types = [app_control_types[i] for i, title in enumerate(app_titles) if title != ""] app_titles = [title for title in app_titles if title != ""] - return [app_titles, app_control_types] + return app_titles, app_control_types -def get_desktop_app_info_dict(remove_empty:bool=True, field_list:List[str]=["control_text", "control_type"]): +def get_desktop_app_info_dict(remove_empty:bool=True, field_list:List[str]=["control_text", "control_type"]) -> Tuple[dict, List[dict]]: """ Get titles and control types of all the apps on the desktop. :param remove_empty: Whether to remove empty titles. @@ -49,7 +46,7 @@ def get_desktop_app_info_dict(remove_empty:bool=True, field_list:List[str]=["con -def find_control_elements_in_descendants(window, control_type_list:List[str]=[], class_name_list:List[str]=[], title_list:List[str]=[], is_visible:bool=True, is_enabled:bool=True, depth:int=0): +def find_control_elements_in_descendants(window, control_type_list:List[str]=[], class_name_list:List[str]=[], title_list:List[str]=[], is_visible:bool=True, is_enabled:bool=True, depth:int=0) -> List: """ Find control elements in descendants of the window. :param window: The window to find control elements. @@ -85,7 +82,7 @@ def find_control_elements_in_descendants(window, control_type_list:List[str]=[], -def get_control_info(window, field_list:List[str]=[]): +def get_control_info(window, field_list:List[str]=[]) -> dict: """ Get control info of the window. :param window: The window to get control info. @@ -110,7 +107,7 @@ def get_control_info(window, field_list:List[str]=[]): -def get_control_info_batch(window_list:List, field_list:List[str]=[]): +def get_control_info_batch(window_list:List, field_list:List[str]=[]) -> List: """ Get control info of the window. :param window: The list of windows to get control info. @@ -124,7 +121,7 @@ def get_control_info_batch(window_list:List, field_list:List[str]=[]): -def get_control_info_dict(window_dict:dict, field_list:List[str]=[]): +def get_control_info_dict(window_dict:dict, field_list:List[str]=[]) -> List[dict]: """ Get control info of the window. :param window: The list of windows to get control info. @@ -140,7 +137,7 @@ def get_control_info_dict(window_dict:dict, field_list:List[str]=[]): return control_info_list -def replace_newline(input_str): +def replace_newline(input_str : str) -> str: """ Replace \n with \\n. :param input_str: The string to replace. @@ -155,98 +152,6 @@ def replace_newline(input_str): result_str = result_str.replace('\\\\n', '\\n') return result_str - - -def parse_function_call(call): - """ - Parse the function call. - :param call: The function call. - :return: The function name and arguments.""" - - node = ast.parse(call) - - # Get the function name and arguments - func_name = node.body[0].value.func.id - args = {arg.arg: ast.literal_eval(arg.value) for arg in node.body[0].value.keywords} - - return func_name, args - - - -def atomic_execution(window, method_name:str, args:dict): - """ - Atomic execution of the action on the control elements. - :param window: The window variable to execute the action. - :param method: The method to execute. - :param args: The arguments of the method. - :return: The result of the action. - """ - try: - method = getattr(window, method_name) - result = method(**args) - except AttributeError: - result = f"{window} doesn't have a method named {method_name}" - except Exception as e: - result = f"An error occurred: {e}" - return result - - -def execution(window, method_name:str, args:dict): - """ - Execute the action on the control elements. - :param window: The window variable to execute the action. - :param method: The method to execute. - :param args: The arguments of the method. - :return: The result of the action. - """ - - - if method_name == "set_edit_text": - if configs["INPUT_TEXT_API"] == "type_keys": - method_name = "type_keys" - args = {"keys": args["text"], "pause": 0.1, "with_spaces": True} - try: - result = atomic_execution(window, method_name, args) - if configs["INPUT_TEXT_ENTER"] and method_name in ["type_keys", "set_edit_text"]: - atomic_execution(window, "type_keys", args = {"keys": "{ENTER}"}) - return result - except Exception as e: - return f"An error occurred: {e}" - - - -def wait_enabled(window, timeout:int=10, retry_interval:int=0.5): - """ - Wait until the window is enabled. - :param window: The window to wait. - :param timeout: The timeout to wait. - :param retry_interval: The retry interval to wait. - """ - while not window.is_enabled(): - time.sleep(retry_interval) - timeout -= retry_interval - if timeout <= 0: - warnings.warn(f"Timeout: {window} is not enabled.") - break - return - - - -def wait_visible(window, timeout:int=10, retry_interval:int=0.5): - """ - Wait until the window is enabled. - :param window: The window to wait. - :param timeout: The timeout to wait. - :param retry_interval: The retry interval to wait. - """ - while not window.is_visible(): - time.sleep(retry_interval) - timeout -= retry_interval - if timeout <= 0: - warnings.warn(f"Timeout: {window} is not visible.") - break - return - def get_application_name(window) -> str: From 8f43d9fbc03c2fc1f65fa5d891bf9d7417852eb4 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Thu, 21 Mar 2024 21:11:57 +0800 Subject: [PATCH 213/223] execution module --- ufo/ui_control/executor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ufo/ui_control/executor.py b/ufo/ui_control/executor.py index 961f093a..0ecad975 100644 --- a/ufo/ui_control/executor.py +++ b/ufo/ui_control/executor.py @@ -147,7 +147,7 @@ def annotation(self, args_dict:dict, annotation_dict:dict): selected_controls_labels = args_dict.get("control_labels", []) control_reannotate = [annotation_dict[str(label)] for label in selected_controls_labels] - pass + return control_reannotate From 4d5a3834567e34a5ae1582fd7ae1349a78597940 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 24 Mar 2024 21:34:23 +0800 Subject: [PATCH 214/223] readme --- README.md | 16 ++++++++-------- ufo/module/flow.py | 6 +++--- ufo/ui_control/executor.py | 12 +++++++----- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 4c77ea99..26fab35d 100644 --- a/README.md +++ b/README.md @@ -33,10 +33,10 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th ## 📢 News -- 📅 2024-03-XX: New Release for v0.0.1! Check out our exciting new features: +- 📅 2024-03-25: New Release for v0.1! Check out our exciting new features: 1. Our UFO framework now support RAG from offline document and online Bing search. - 2. We now support creating your help documents for each Windows app to become an app expert. Check XX for more details! - 3. UFO now support more LLMs and customized models. + 2. We now support creating your help documents for each Windows applications to become an app expert. Check XX for more details! + 3. UFO now support more customizing GPT for AppAgent and ActAgent. You can now use text-only model (e.g. GPT-4) for each agent! - 📅 2024-02-14: Our [technical report](https://arxiv.org/abs/2402.07939) is online! - 📅 2024-02-10: UFO is released on GitHub🎈. Happy Chinese New year🐉! @@ -184,11 +184,11 @@ If you use UFO in your research, please cite our paper: ``` ## 📝 Todo List -- ⏩ Documentation. -- ⏩ Support local host GUI interaction model. -- ⏩ Support more control using Win32 API. -- ⏩ RAG enhanced UFO. -- ⏩ Chatbox GUI for UFO. +- [x] RAG enhanced UFO. +- [ ] Documentation. +- [ ] Support local host GUI interaction model. +- [ ] Support more control using Win32 API. +- [ ] Chatbox GUI for UFO. diff --git a/ufo/module/flow.py b/ufo/module/flow.py index 2a9fe916..f2d8fc8b 100644 --- a/ufo/module/flow.py +++ b/ufo/module/flow.py @@ -321,11 +321,11 @@ def process_action_selection(self): self.control_reannotate = executor.annotation(args, annotation_dict) return - else: - self.control_reannotate = None + + self.control_reannotate = None - # The task is finish and no further action is needed + # The task is finished and no further action is needed if self.status.upper() == "FINISH" and not control_selected: self.status = self.status.upper() response_json = self.set_result_and_log("", response_json) diff --git a/ufo/ui_control/executor.py b/ufo/ui_control/executor.py index 0ecad975..f21972e0 100644 --- a/ufo/ui_control/executor.py +++ b/ufo/ui_control/executor.py @@ -1,11 +1,13 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. +import time +import warnings -from ..utils import print_with_color -from .control import get_control_info from ..config.config import load_config -import time, warnings +from .control import get_control_info +from ..utils import print_with_color + configs = load_config() @@ -16,7 +18,7 @@ class ActionExecutor: The action executor class. """ - def __init__(self, control, application) -> None: + def __init__(self, control: object, application: object) -> None: """ Initialize the action executor. :param control: The control element to execute the action. @@ -113,7 +115,7 @@ def __set_edit_text(self, args_dict:dict): - def __texts(self, args_dict:dict): + def __texts(self, args_dict:dict) -> str: """ Get the text of the control element. :param args: The arguments of the text method. From b74b1926b2714b9a3201083fd547bc16daf629d8 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Sun, 24 Mar 2024 22:20:23 +0800 Subject: [PATCH 215/223] readme --- README.md | 40 ++++++++----- ufo/config/config.yaml.template | 2 +- ufo/config/config_llm.yaml.template | 91 +++++++++++++++-------------- 3 files changed, 75 insertions(+), 58 deletions(-) diff --git a/README.md b/README.md index 26fab35d..5fe1b319 100644 --- a/README.md +++ b/README.md @@ -33,10 +33,11 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th ## 📢 News -- 📅 2024-03-25: New Release for v0.1! Check out our exciting new features: - 1. Our UFO framework now support RAG from offline document and online Bing search. - 2. We now support creating your help documents for each Windows applications to become an app expert. Check XX for more details! - 3. UFO now support more customizing GPT for AppAgent and ActAgent. You can now use text-only model (e.g. GPT-4) for each agent! +- 📅 2024-03-25: **New Release for v0.1**! Check out our exciting new features: + 1. UFO now supports RAG from offline document and online Bing search. + 2. You can save the task completion trajectory for UFO's reference. It can improves its future successful rate! + 3. We now support creating your help documents for each Windows applications to become an app expert. Check the [README](./learner/README.md) for more details! + 4. You cam customize different GPT models for AppAgent and ActAgent. Text-only models (e.g. GPT-4) are now supported! - 📅 2024-02-14: Our [technical report](https://arxiv.org/abs/2402.07939) is online! - 📅 2024-02-10: UFO is released on GitHub🎈. Happy Chinese New year🐉! @@ -45,6 +46,7 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th UFO sightings have garnered attention from various media outlets, including: - [Microsoft's UFO abducts traditional user interfaces for a smarter Windows experience](https://the-decoder.com/microsofts-ufo-abducts-traditional-user-interfaces-for-a-smarter-windows-experience/) +- [🚀 UFO & GPT-4-V: Sit back and relax, mientras GPT lo hace todo🌌](https://www.linkedin.com/posts/gutierrezfrancois_ai-ufo-microsoft-activity-7176819900399652865-pLoo?utm_source=share&utm_medium=member_desktop) - [The AI PC - The Future of Computers? - Microsoft UFO](https://www.youtube.com/watch?v=1k4LcffCq3E) - [下一代Windows系统曝光:基于GPT-4V,Agent跨应用调度,代号UFO](https://www.qbitai.com/2024/02/121048.html) - [下一代智能版 Windows 要来了?微软推出首个 Windows Agent,命名为 UFO!](https://blog.csdn.net/csdnnews/article/details/136161570) @@ -80,26 +82,36 @@ pip install -r requirements.txt ``` ### ⚙️ Step 2: Configure the LLMs -Before running UFO, you need to provide your LLM configurations. You can create a config file `ufo/config/config.yaml`, by copying the `ufo/config/config.yaml.template` edited as follows: +Before running UFO, you need to provide your LLM configurations **individully for AppAgent and ActAgent**. You can create a config file `ufo/config/config_llm.yaml`, by copying the `ufo/config/config_llm.yaml.template` and editing config for "APP_AGENT" and "ACTION_AGENT" as follows: #### OpenAI ``` -API_TYPE: "openai" -OPENAI_API_BASE: "https://api.openai.com/v1/chat/completions" # The base URL for the OpenAI API -OPENAI_API_KEY: "YOUR_API_KEY" # Set the value to the openai key for the llm model -OPENAI_API_MODEL: "GPTV_MODEL_NAME" # The only OpenAI model by now that accepts visual input +VISUAL_MODE: True, # Whether to use the visual mode +API_TYPE: "openai" , # The API type, "openai" for the OpenAI API. +API_BASE: "https://api.openai.com/v1/chat/completions", # The the OpenAI API endpoint. +API_KEY: "sk-", # The OpenAI API key, begin with sk- +API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default +API_MODEL: "gpt-4-vision-preview", # The only OpenAI model by now that accepts visual input ``` #### Azure OpenAI (AOAI) ``` -API_TYPE: "aoai" -OPENAI_API_BASE: "YOUR_ENDPOINT" # The AOAI API address. Format: https://{your-resource-name}.openai.azure.com/openai/deployments/{deployment-id}/chat/completions?api-version={api-version} -OPENAI_API_KEY: "YOUR_API_KEY" # Set the value to the openai key for the llm model -OPENAI_API_MODEL: "GPTV_MODEL_NAME" # The only OpenAI model by now that accepts visual input +API_TYPE: "aoai" , # The API type, "aoai" for the Azure OpenAI. +API_BASE: "YOUR_ENDPOINT", # The AOAI API address. Format: https://{your-resource-name}.openai.azure.com +API_KEY: "YOUR_KEY", # The aoai API key +API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default +API_MODEL: "gpt-4-vision-preview", # The only OpenAI model by now that accepts visual input +API_DEPLOYMENT_ID: "YOUR_AOAI_DEPLOYMENT", # The deployment id for the AOAI API ``` +You can optionally set an backup LLM engine in the field of "BACKUP_AGENT" if the above engines failed. +### 📔 Step 3: Additional Setting for RAG (optional). +If you want to enhance UFO's ability with external knowledge, you can optionallly config it with external database for retrieval augmented generation (RAG). -### 🎉 Step 3: Start UFO + + + +### 🎉 Step 4: Start UFO #### ⌨️ You can execute the following on your Windows command Line (CLI): diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index 4b79a71b..ee2647e3 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -33,11 +33,11 @@ ACTION_SELECTION_PROMPT: "ufo/prompts/base/{mode}/action_selection.yaml" # The APP_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/{mode}/app_example.yaml" # The prompt for the app selection ACTION_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/{mode}/action_example.yaml" # The prompt for the action selection - ## For experience learning EXPERIENCE_PROMPT: "ufo/prompts/experience/{mode}/experience_summary.yaml" EXPERIENCE_SAVED_PATH: "vectordb/experience/" + API_PROMPT: "ufo/prompts/base/{mode}/api.yaml" # The prompt for the API INPUT_TEXT_API: "type_keys" # The input text API INPUT_TEXT_ENTER: True # whether to press enter after typing the text diff --git a/ufo/config/config_llm.yaml.template b/ufo/config/config_llm.yaml.template index 7847905b..a03a5aa6 100644 --- a/ufo/config/config_llm.yaml.template +++ b/ufo/config/config_llm.yaml.template @@ -1,72 +1,77 @@ APP_AGENT: { - VISUAL_MODE: False, # Whether to use the visual mode - # API_TYPE: "azure_ad", # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. - # API_KEY: "YOUR_KEY", # The OpenAI API key - # API_VERSION: "2024-02-15-preview" ,# "2024-02-15-preview" by default - # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input + VISUAL_MODE: True, # Whether to use the visual mode - API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. - API_KEY: "YOUR_KEY", # The OpenAI API key + API_TYPE: "openai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "https://api.openai.com/v1/chat/completions", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. + API_KEY: "sk-", # The OpenAI API key, begin with sk- API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default - API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input + API_MODEL: "gpt-4-vision-preview", # The only OpenAI model by now that accepts visual input + - ###For the AOAI - API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API + ### Comment above and uncomment these if using "aoai". + # API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the Azure OpenAI. + # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the aoai, it should be https://{your-resource-name}.openai.azure.com + # API_KEY: "YOUR_KEY", # The aoai API key + # API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default + # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input + # API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API + ### For Azure_AD - AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model - AAD_API_SCOPE: "YOUR_SCOPE", # Set the value to your scope for the llm model - AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE + # AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model + # AAD_API_SCOPE: "YOUR_SCOPE", # Set the value to your scope for the llm model + # AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE } ACTION_AGENT: { VISUAL_MODE: True, # Whether to use the visual mode - API_TYPE: "azure_ad", # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. - API_KEY: "YOUR_KEY", # The OpenAI API key + + API_TYPE: "openai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "https://api.openai.com/v1/chat/completions", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. + API_KEY: "sk-", # The OpenAI API key, begin with sk- API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default - API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input + API_MODEL: "gpt-4-vision-preview", # The only OpenAI model by now that accepts visual input - # API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. - # API_KEY: "YOUR_KEY", # The OpenAI API key + + ### Comment above and uncomment these if using "aoai". + # API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the Azure OpenAI. + # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the aoai, it should be https://{your-resource-name}.openai.azure.com + # API_KEY: "YOUR_KEY", # The aoai API key # API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input - - ###For the AOAI - API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API + # API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API + ### For Azure_AD - AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model - AAD_API_SCOPE: "YOUR_SCOPE", # Set the value to your scope for the llm model - AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE + # AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model + # AAD_API_SCOPE: "YOUR_SCOPE", # Set the value to your scope for the llm model + # AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE } BACKUP_AGENT: { VISUAL_MODE: True, # Whether to use the visual mode - API_TYPE: "azure_ad", # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. - API_KEY: "YOUR_KEY", # The OpenAI API key + + API_TYPE: "openai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "https://api.openai.com/v1/chat/completions", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. + API_KEY: "sk-", # The OpenAI API key, begin with sk- API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default - API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input + API_MODEL: "gpt-4-vision-preview", # The only OpenAI model by now that accepts visual input - # API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the AAD, it should be your endpoints. - # API_KEY: "YOUR_KEY", # The OpenAI API key + + ### Comment above and uncomment these if using "aoai". + # API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the Azure OpenAI. + # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the aoai, it should be https://{your-resource-name}.openai.azure.com + # API_KEY: "YOUR_KEY", # The aoai API key # API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input - - ###For the AOAI - API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API + # API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API + ### For Azure_AD - AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model - AAD_API_SCOPE: "YOUR_SCOPE", # Set the value to your scope for the llm model - AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE + # AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model + # AAD_API_SCOPE: "YOUR_SCOPE", # Set the value to your scope for the llm model + # AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE } - -### For parameters +### For GPT parameters MAX_TOKENS: 2000 # The max token limit for the response completion MAX_RETRY: 3 # The max retry limit for the response completion TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model From 1d6d443bdbf03381271d370952d9c5c9da5c68c1 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 25 Mar 2024 13:04:36 +0800 Subject: [PATCH 216/223] new release --- README.md | 56 +++++++++--- ufo/config/config.py | 6 +- ufo/config/config.yaml.template | 130 ++++++++++++++++++---------- ufo/config/config_dev.yaml | 38 ++++++++ ufo/config/config_llm.yaml.template | 84 ------------------ 5 files changed, 173 insertions(+), 141 deletions(-) create mode 100644 ufo/config/config_dev.yaml delete mode 100644 ufo/config/config_llm.yaml.template diff --git a/README.md b/README.md index 5fe1b319..0fab21e0 100644 --- a/README.md +++ b/README.md @@ -33,11 +33,11 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th ## 📢 News -- 📅 2024-03-25: **New Release for v0.1**! Check out our exciting new features: - 1. UFO now supports RAG from offline document and online Bing search. - 2. You can save the task completion trajectory for UFO's reference. It can improves its future successful rate! - 3. We now support creating your help documents for each Windows applications to become an app expert. Check the [README](./learner/README.md) for more details! - 4. You cam customize different GPT models for AppAgent and ActAgent. Text-only models (e.g. GPT-4) are now supported! +- 📅 2024-03-25: **New Release for v0.1!** Check out our exciting new features: + 1. UFO now supports RAG from offline documents and online Bing search. + 2. You can save the task completion trajectory into its memory for UFO's reference, improving its future success rate! + 3. We now support creating your help documents for each Windows application to become an app expert. Check the [README](./learner/README.md) for more details! + 4. You can customize different GPT models for AppAgent and ActAgent. Text-only models (e.g., GPT-4) are now supported! - 📅 2024-02-14: Our [technical report](https://arxiv.org/abs/2402.07939) is online! - 📅 2024-02-10: UFO is released on GitHub🎈. Happy Chinese New year🐉! @@ -82,10 +82,10 @@ pip install -r requirements.txt ``` ### ⚙️ Step 2: Configure the LLMs -Before running UFO, you need to provide your LLM configurations **individully for AppAgent and ActAgent**. You can create a config file `ufo/config/config_llm.yaml`, by copying the `ufo/config/config_llm.yaml.template` and editing config for "APP_AGENT" and "ACTION_AGENT" as follows: +Before running UFO, you need to provide your LLM configurations **individully for AppAgent and ActAgent**. You can create your own config file `ufo/config/config.yaml`, by copying the `ufo/config/config.yaml.template` and editing config for **APP_AGENT** and **ACTION_AGENT** as follows: #### OpenAI -``` +```bash VISUAL_MODE: True, # Whether to use the visual mode API_TYPE: "openai" , # The API type, "openai" for the OpenAI API. API_BASE: "https://api.openai.com/v1/chat/completions", # The the OpenAI API endpoint. @@ -95,7 +95,7 @@ API_MODEL: "gpt-4-vision-preview", # The only OpenAI model by now that accepts ``` #### Azure OpenAI (AOAI) -``` +```bash API_TYPE: "aoai" , # The API type, "aoai" for the Azure OpenAI. API_BASE: "YOUR_ENDPOINT", # The AOAI API address. Format: https://{your-resource-name}.openai.azure.com API_KEY: "YOUR_KEY", # The aoai API key @@ -106,8 +106,44 @@ API_DEPLOYMENT_ID: "YOUR_AOAI_DEPLOYMENT", # The deployment id for the AOAI API You can optionally set an backup LLM engine in the field of "BACKUP_AGENT" if the above engines failed. ### 📔 Step 3: Additional Setting for RAG (optional). -If you want to enhance UFO's ability with external knowledge, you can optionallly config it with external database for retrieval augmented generation (RAG). +If you want to enhance UFO's ability with external knowledge, you can optionally configure it with an external database for retrieval augmented generation (RAG) in the `ufo/config/config.yaml` file. +#### RAG from Offline Help Document +Before enabling this function, you need to create an offline indexer for your help document. Please refer to the [README](./learner/README.md) to learn how to create an offline vectored database for retrieval. You can enable this function by setting the following configuration: +```bash +## RAG Configuration for the offline docs +RAG_OFFLINE_DOCS: True # Whether to use the offline RAG. +RAG_OFFLINE_DOCS_RETRIEVED_TOPK: 1 # The topk for the offline retrieved documents +``` +Adjust `RAG_OFFLINE_DOCS_RETRIEVED_TOPK` to optimize performance. + + +#### RAG from Online Bing Search Engine +Enhance UFO's ability by utilizing the most up-to-date online search results! To use this function, you need to obtain a Bing search API key. Activate this feature by setting the following configuration: +```bash +## RAG Configuration for the Bing search +BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key +RAG_ONLINE_SEARCH: True # Whether to use the online search for the RAG. +RAG_ONLINE_SEARCH_TOPK: 5 # The topk for the online search +RAG_ONLINE_RETRIEVED_TOPK: 1 # The topk for the online retrieved documents +``` +Adjust `RAG_ONLINE_SEARCH_TOPK` and `RAG_ONLINE_RETRIEVED_TOPK` to get better performance. + + +#### RAG from Self-Demonstration +Save task completion trajectories into UFO's memory for future reference. This can improve its future success rates based on its previous experiences! + +After completing a task, you'll see the following message: +``` +Would you like to save the current conversation flow for future reference by the agent? +[Y] for yes, any other key for no. +``` +Press `Y` to save it into its memory and enable memory retrieval via the following configuration: +```bash +## RAG Configuration for experience +RAG_EXPERIENCE: True # Whether to use the RAG from its self-experience. +RAG_EXPERIENCE_RETRIEVED_TOPK: 5 # The topk for the offline retrieved documents +``` @@ -137,7 +173,7 @@ Please enter your request to be completed🛸: - The GPT-V accepts screenshots of your desktop and application GUI as input. Please ensure that no sensitive or confidential information is visible or captured during the execution process. For further information, refer to [DISCLAIMER.md](./DISCLAIMER.md). -### Step 4 🎥: Execution Logs +### Step 5 🎥: Execution Logs You can find the screenshots taken and request & response logs in the following folder: ``` diff --git a/ufo/config/config.py b/ufo/config/config.py index 35bcb4dd..576a9cdd 100644 --- a/ufo/config/config.py +++ b/ufo/config/config.py @@ -25,11 +25,11 @@ def load_config(config_path="ufo/config/"): # Update configs with YAML data if yaml_data: configs.update(yaml_data) - with open(path + "config_llm.yaml", "r") as file: - yaml_llm_data = yaml.safe_load(file) + with open(path + "config_dev.yaml", "r") as file: + yaml_dev_data = yaml.safe_load(file) # Update configs with YAML data if yaml_data: - configs.update(yaml_llm_data) + configs.update(yaml_dev_data) except FileNotFoundError: print_with_color( f"Warning: Config file not found at {config_path}. Using only environment variables.", "yellow") diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index ee2647e3..b99f0d8d 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -1,59 +1,101 @@ -version: 0.1 +APP_AGENT: { + VISUAL_MODE: True, # Whether to use the visual mode -BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key + API_TYPE: "openai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "https://api.openai.com/v1/chat/completions", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. + API_KEY: "sk-", # The OpenAI API key, begin with sk- + API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default + API_MODEL: "gpt-4-vision-preview", # The only OpenAI model by now that accepts visual input + + + ### Comment above and uncomment these if using "aoai". + # API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the Azure OpenAI. + # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the aoai, it should be https://{your-resource-name}.openai.azure.com + # API_KEY: "YOUR_KEY", # The aoai API key + # API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default + # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input + # API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API + + ### For Azure_AD + # AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model + # AAD_API_SCOPE: "YOUR_SCOPE", # Set the value to your scope for the llm model + # AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE +} + +ACTION_AGENT: { + VISUAL_MODE: True, # Whether to use the visual mode + + API_TYPE: "openai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "https://api.openai.com/v1/chat/completions", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. + API_KEY: "sk-", # The OpenAI API key, begin with sk- + API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default + API_MODEL: "gpt-4-vision-preview", # The only OpenAI model by now that accepts visual input + + + ### Comment above and uncomment these if using "aoai". + # API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the Azure OpenAI. + # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the aoai, it should be https://{your-resource-name}.openai.azure.com + # API_KEY: "YOUR_KEY", # The aoai API key + # API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default + # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input + # API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API + + ### For Azure_AD + # AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model + # AAD_API_SCOPE: "YOUR_SCOPE", # Set the value to your scope for the llm model + # AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE + } + +BACKUP_AGENT: { + VISUAL_MODE: True, # Whether to use the visual mode + + API_TYPE: "openai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. + API_BASE: "https://api.openai.com/v1/chat/completions", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. + API_KEY: "sk-", # The OpenAI API key, begin with sk- + API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default + API_MODEL: "gpt-4-vision-preview", # The only OpenAI model by now that accepts visual input + + + ### Comment above and uncomment these if using "aoai". + # API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the Azure OpenAI. + # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the aoai, it should be https://{your-resource-name}.openai.azure.com + # API_KEY: "YOUR_KEY", # The aoai API key + # API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default + # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input + # API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API + + ### For Azure_AD + # AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model + # AAD_API_SCOPE: "YOUR_SCOPE", # Set the value to your scope for the llm model + # AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE +} -CONTROL_BACKEND: "uia" # The backend for control action -MAX_STEP: 30 # The max step limit for completing the user request -SLEEP_TIME: 5 # The sleep time between each step to wait for the window to be ready -SAFE_GUARD: True # Whether to use the safe guard to prevent the model from doing sensitve operations. -CONTROL_TYPE_LIST: ["Button", "Edit", "TabItem", "Document", "ListItem", "MenuItem", "ScrollBar", "TreeItem", "Hyperlink", "ComboBox", "RadioButton"] # The list of control types that are allowed to be selected -HISTORY_KEYS: ["Step", "Thought", "ControlText", "Action", "Comment", "Results"] # The keys of the action history for the next step. -ANNOTATION_COLORS: { - "Button": "#FFF68F", - "Edit": "#A5F0B5", - "TabItem": "#A5E7F0", - "Document": "#FFD18A", - "ListItem": "#D9C3FE", - "MenuItem": "#E7FEC3", - "ScrollBar": "#FEC3F8", - "TreeItem": "#D6D6D6", - "Hyperlink": "#91FFEB", - "ComboBox": "#D8B6D4" - } - -PRINT_LOG: False # Whether to print the log -CONCAT_SCREENSHOT: True # Whether to concat the screenshot for the control item -LOG_LEVEL: "DEBUG" # The log level -INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation -REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model - -APP_SELECTION_PROMPT: "ufo/prompts/base/{mode}/app_selection.yaml" # The prompt for the app selection -ACTION_SELECTION_PROMPT: "ufo/prompts/base/{mode}/action_selection.yaml" # The prompt for the action selection - -APP_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/{mode}/app_example.yaml" # The prompt for the app selection -ACTION_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/{mode}/action_example.yaml" # The prompt for the action selection - -## For experience learning -EXPERIENCE_PROMPT: "ufo/prompts/experience/{mode}/experience_summary.yaml" -EXPERIENCE_SAVED_PATH: "vectordb/experience/" - - -API_PROMPT: "ufo/prompts/base/{mode}/api.yaml" # The prompt for the API -INPUT_TEXT_API: "type_keys" # The input text API -INPUT_TEXT_ENTER: True # whether to press enter after typing the text +### For GPT parameters +MAX_TOKENS: 2000 # The max token limit for the response completion +MAX_RETRY: 3 # The max retry limit for the response completion +TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model +TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model +TIMEOUT: 60 # The call timeout(s), default is 10 mins + + +### For RAG ## RAG Configuration for the offline docs RAG_OFFLINE_DOCS: False # Whether to use the offline RAG. RAG_OFFLINE_DOCS_RETRIEVED_TOPK: 1 # The topk for the offline retrieved documents - ## RAG Configuration for the Bing search +BING_API_KEY: "YOUR_BING_SEARCH_API_KEY" # The Bing search API key RAG_ONLINE_SEARCH: False # Whether to use the online search for the RAG. RAG_ONLINE_SEARCH_TOPK: 5 # The topk for the online search RAG_ONLINE_RETRIEVED_TOPK: 1 # The topk for the online retrieved documents - ## RAG Configuration for experience -RAG_EXPERIENCE: True # Whether to use the offline RAG. +RAG_EXPERIENCE: True # Whether to use the RAG from its self-experience. RAG_EXPERIENCE_RETRIEVED_TOPK: 5 # The topk for the offline retrieved documents + + + + + diff --git a/ufo/config/config_dev.yaml b/ufo/config/config_dev.yaml new file mode 100644 index 00000000..45e7a02f --- /dev/null +++ b/ufo/config/config_dev.yaml @@ -0,0 +1,38 @@ +CONTROL_BACKEND: "uia" # The backend for control action +MAX_STEP: 30 # The max step limit for completing the user request +SLEEP_TIME: 5 # The sleep time between each step to wait for the window to be ready +SAFE_GUARD: True # Whether to use the safe guard to prevent the model from doing sensitve operations. +CONTROL_TYPE_LIST: ["Button", "Edit", "TabItem", "Document", "ListItem", "MenuItem", "ScrollBar", "TreeItem", "Hyperlink", "ComboBox", "RadioButton"] # The list of control types that are allowed to be selected +HISTORY_KEYS: ["Step", "Thought", "ControlText", "Action", "Comment", "Results"] # The keys of the action history for the next step. +ANNOTATION_COLORS: { + "Button": "#FFF68F", + "Edit": "#A5F0B5", + "TabItem": "#A5E7F0", + "Document": "#FFD18A", + "ListItem": "#D9C3FE", + "MenuItem": "#E7FEC3", + "ScrollBar": "#FEC3F8", + "TreeItem": "#D6D6D6", + "Hyperlink": "#91FFEB", + "ComboBox": "#D8B6D4" + } + +PRINT_LOG: False # Whether to print the log +CONCAT_SCREENSHOT: True # Whether to concat the screenshot for the control item +LOG_LEVEL: "DEBUG" # The log level +INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation +REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model + +APP_SELECTION_PROMPT: "ufo/prompts/base/{mode}/app_selection.yaml" # The prompt for the app selection +ACTION_SELECTION_PROMPT: "ufo/prompts/base/{mode}/action_selection.yaml" # The prompt for the action selection + +APP_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/{mode}/app_example.yaml" # The prompt for the app selection +ACTION_SELECTION_EXAMPLE_PROMPT: "ufo/prompts/examples/{mode}/action_example.yaml" # The prompt for the action selection + +## For experience learning +EXPERIENCE_PROMPT: "ufo/prompts/experience/{mode}/experience_summary.yaml" +EXPERIENCE_SAVED_PATH: "vectordb/experience/" + +API_PROMPT: "ufo/prompts/base/{mode}/api.yaml" # The prompt for the API +INPUT_TEXT_API: "type_keys" # The input text API +INPUT_TEXT_ENTER: True # whether to press enter after typing the text diff --git a/ufo/config/config_llm.yaml.template b/ufo/config/config_llm.yaml.template deleted file mode 100644 index a03a5aa6..00000000 --- a/ufo/config/config_llm.yaml.template +++ /dev/null @@ -1,84 +0,0 @@ -APP_AGENT: { - VISUAL_MODE: True, # Whether to use the visual mode - - API_TYPE: "openai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - API_BASE: "https://api.openai.com/v1/chat/completions", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. - API_KEY: "sk-", # The OpenAI API key, begin with sk- - API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default - API_MODEL: "gpt-4-vision-preview", # The only OpenAI model by now that accepts visual input - - - ### Comment above and uncomment these if using "aoai". - # API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the Azure OpenAI. - # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the aoai, it should be https://{your-resource-name}.openai.azure.com - # API_KEY: "YOUR_KEY", # The aoai API key - # API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default - # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input - # API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API - - ### For Azure_AD - # AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model - # AAD_API_SCOPE: "YOUR_SCOPE", # Set the value to your scope for the llm model - # AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE -} - -ACTION_AGENT: { - VISUAL_MODE: True, # Whether to use the visual mode - - API_TYPE: "openai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - API_BASE: "https://api.openai.com/v1/chat/completions", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. - API_KEY: "sk-", # The OpenAI API key, begin with sk- - API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default - API_MODEL: "gpt-4-vision-preview", # The only OpenAI model by now that accepts visual input - - - ### Comment above and uncomment these if using "aoai". - # API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the Azure OpenAI. - # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the aoai, it should be https://{your-resource-name}.openai.azure.com - # API_KEY: "YOUR_KEY", # The aoai API key - # API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default - # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input - # API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API - - ### For Azure_AD - # AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model - # AAD_API_SCOPE: "YOUR_SCOPE", # Set the value to your scope for the llm model - # AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE - } - -BACKUP_AGENT: { - VISUAL_MODE: True, # Whether to use the visual mode - - API_TYPE: "openai" , # The API type, "openai" for the OpenAI API, "aoai" for the AOAI API, 'azure_ad' for the ad authority of the AOAI API. - API_BASE: "https://api.openai.com/v1/chat/completions", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. - API_KEY: "sk-", # The OpenAI API key, begin with sk- - API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default - API_MODEL: "gpt-4-vision-preview", # The only OpenAI model by now that accepts visual input - - - ### Comment above and uncomment these if using "aoai". - # API_TYPE: "aoai" , # The API type, "openai" for the OpenAI API, "aoai" for the Azure OpenAI. - # API_BASE: "YOUR_ENDPOINT", # The the OpenAI API endpoint, "https://api.openai.com/v1/chat/completions" for the OpenAI API. As for the aoai, it should be https://{your-resource-name}.openai.azure.com - # API_KEY: "YOUR_KEY", # The aoai API key - # API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default - # API_MODEL: "YOUR_MODEL", # The only OpenAI model by now that accepts visual input - # API_DEPLOYMENT_ID: "gpt-4-visual-preview", # The deployment id for the AOAI API - - ### For Azure_AD - # AAD_TENANT_ID: "YOUR_TENANT_ID", # Set the value to your tenant id for the llm model - # AAD_API_SCOPE: "YOUR_SCOPE", # Set the value to your scope for the llm model - # AAD_API_SCOPE_BASE: "YOUR_SCOPE_BASE" # Set the value to your scope base for the llm model, whose format is API://YOUR_SCOPE_BASE, and the only need is the YOUR_SCOPE_BASE -} - - -### For GPT parameters -MAX_TOKENS: 2000 # The max token limit for the response completion -MAX_RETRY: 3 # The max retry limit for the response completion -TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model -TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model -TIMEOUT: 60 # The call timeout(s), default is 10 mins - - - - - From c09c8bfd2499222e5cb0d5e1d90f55ae0a64abc5 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 25 Mar 2024 13:10:54 +0800 Subject: [PATCH 217/223] new release --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0fab21e0..fa380c19 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ API_MODEL: "gpt-4-vision-preview", # The only OpenAI model by now that accepts #### Azure OpenAI (AOAI) ```bash +VISUAL_MODE: True, # Whether to use the visual mode API_TYPE: "aoai" , # The API type, "aoai" for the Azure OpenAI. API_BASE: "YOUR_ENDPOINT", # The AOAI API address. Format: https://{your-resource-name}.openai.azure.com API_KEY: "YOUR_KEY", # The aoai API key @@ -103,7 +104,17 @@ API_VERSION: "2024-02-15-preview", # "2024-02-15-preview" by default API_MODEL: "gpt-4-vision-preview", # The only OpenAI model by now that accepts visual input API_DEPLOYMENT_ID: "YOUR_AOAI_DEPLOYMENT", # The deployment id for the AOAI API ``` -You can optionally set an backup LLM engine in the field of "BACKUP_AGENT" if the above engines failed. +You can also non-visial model (e.g., GPT-4) for each agent, by setting `VISUAL_MODE: True` and proper `API_MODEL` (openai) and `API_DEPLOYMENT_ID` (aoai). You can also optionally set an backup LLM engine in the field of `BACKUP_AGENT` if the above engines failed during the inference. + + +#### Non-Visual Model Configuration +You can utilize non-visual models (e.g., GPT-4) for each agent by configuring the following settings in the config.yaml file: + +- ```VISUAL_MODE: True to enable non-visual mode.``` +- Specify the appropriate `API_MODEL` (OpenAI) and `API_DEPLOYMENT_ID` (AOAI) for each agent. + +Optionally, you can set a backup language model (LLM) engine in the `BACKUP_AGENT` field to handle cases where the primary engines fail during inference. Ensure you configure these settings accurately to leverage non-visual models effectively. + ### 📔 Step 3: Additional Setting for RAG (optional). If you want to enhance UFO's ability with external knowledge, you can optionally configure it with an external database for retrieval augmented generation (RAG) in the `ufo/config/config.yaml` file. From 9f44d98d0b2b07bcb627bbbed591a6b77c5bff25 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 25 Mar 2024 13:11:47 +0800 Subject: [PATCH 218/223] new release --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fa380c19..e64daad2 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ You can also non-visial model (e.g., GPT-4) for each agent, by setting `VISUAL_M #### Non-Visual Model Configuration You can utilize non-visual models (e.g., GPT-4) for each agent by configuring the following settings in the config.yaml file: -- ```VISUAL_MODE: True to enable non-visual mode.``` +- ```VISUAL_MODE: False # To enable non-visual mode.``` - Specify the appropriate `API_MODEL` (OpenAI) and `API_DEPLOYMENT_ID` (AOAI) for each agent. Optionally, you can set a backup language model (LLM) engine in the `BACKUP_AGENT` field to handle cases where the primary engines fail during inference. Ensure you configure these settings accurately to leverage non-visual models effectively. From 5a8c88a714c52bb7898c3bb7e1fcd988119bbfff Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 25 Mar 2024 13:12:42 +0800 Subject: [PATCH 219/223] new release --- {record_processor => recorder}/__init__.py | 0 {record_processor => recorder}/__main__.py | 0 {record_processor => recorder}/parser/behavior_record.py | 0 {record_processor => recorder}/parser/psr_record_parser.py | 0 {record_processor => recorder}/record_processor.py | 0 {record_processor => recorder}/utils/__init__.py | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename {record_processor => recorder}/__init__.py (100%) rename {record_processor => recorder}/__main__.py (100%) rename {record_processor => recorder}/parser/behavior_record.py (100%) rename {record_processor => recorder}/parser/psr_record_parser.py (100%) rename {record_processor => recorder}/record_processor.py (100%) rename {record_processor => recorder}/utils/__init__.py (100%) diff --git a/record_processor/__init__.py b/recorder/__init__.py similarity index 100% rename from record_processor/__init__.py rename to recorder/__init__.py diff --git a/record_processor/__main__.py b/recorder/__main__.py similarity index 100% rename from record_processor/__main__.py rename to recorder/__main__.py diff --git a/record_processor/parser/behavior_record.py b/recorder/parser/behavior_record.py similarity index 100% rename from record_processor/parser/behavior_record.py rename to recorder/parser/behavior_record.py diff --git a/record_processor/parser/psr_record_parser.py b/recorder/parser/psr_record_parser.py similarity index 100% rename from record_processor/parser/psr_record_parser.py rename to recorder/parser/psr_record_parser.py diff --git a/record_processor/record_processor.py b/recorder/record_processor.py similarity index 100% rename from record_processor/record_processor.py rename to recorder/record_processor.py diff --git a/record_processor/utils/__init__.py b/recorder/utils/__init__.py similarity index 100% rename from record_processor/utils/__init__.py rename to recorder/utils/__init__.py From 14c59887250a5c38ade6c393193bb40cb9a7a769 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 25 Mar 2024 13:20:07 +0800 Subject: [PATCH 220/223] new release --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e64daad2..b003ae70 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th ## 📢 News -- 📅 2024-03-25: **New Release for v0.1!** Check out our exciting new features: +- 📅 2024-03-26: **New Release for v0.0.1!** Check out our exciting new features: 1. UFO now supports RAG from offline documents and online Bing search. 2. You can save the task completion trajectory into its memory for UFO's reference, improving its future success rate! 3. We now support creating your help documents for each Windows application to become an app expert. Check the [README](./learner/README.md) for more details! From 7c6b17c556281dcdfcea9ecc966fadf2b1017ea7 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 25 Mar 2024 13:24:20 +0800 Subject: [PATCH 221/223] new release --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b003ae70..42ab15ca 100644 --- a/README.md +++ b/README.md @@ -34,9 +34,9 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th ## 📢 News - 📅 2024-03-26: **New Release for v0.0.1!** Check out our exciting new features: - 1. UFO now supports RAG from offline documents and online Bing search. - 2. You can save the task completion trajectory into its memory for UFO's reference, improving its future success rate! - 3. We now support creating your help documents for each Windows application to become an app expert. Check the [README](./learner/README.md) for more details! + 1. We now support creating your help documents for each Windows application to become an app expert. Check the [README](./learner/README.md) for more details! + 2. UFO now supports RAG from offline documents and online Bing search. + 3. You can save the task completion trajectory into its memory for UFO's reference, improving its future success rate! 4. You can customize different GPT models for AppAgent and ActAgent. Text-only models (e.g., GPT-4) are now supported! - 📅 2024-02-14: Our [technical report](https://arxiv.org/abs/2402.07939) is online! - 📅 2024-02-10: UFO is released on GitHub🎈. Happy Chinese New year🐉! From 9dffb3e31a9dd622d904a613ea1a17b6bee868fd Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 25 Mar 2024 13:35:43 +0800 Subject: [PATCH 222/223] new release --- ufo/config/config.yaml.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ufo/config/config.yaml.template b/ufo/config/config.yaml.template index b99f0d8d..52734bee 100644 --- a/ufo/config/config.yaml.template +++ b/ufo/config/config.yaml.template @@ -76,7 +76,7 @@ MAX_TOKENS: 2000 # The max token limit for the response completion MAX_RETRY: 3 # The max retry limit for the response completion TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model -TIMEOUT: 60 # The call timeout(s), default is 10 mins +TIMEOUT: 60 # The call timeout(s), default is 1 min ### For RAG From 185daa25e8576d4223d91000c330a746f88c4854 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Mon, 25 Mar 2024 20:29:39 +0800 Subject: [PATCH 223/223] new release --- README.md | 2 +- recorder/__init__.py | 2 - recorder/__main__.py | 8 -- recorder/parser/behavior_record.py | 42 ------- recorder/parser/psr_record_parser.py | 171 --------------------------- recorder/record_processor.py | 36 ------ recorder/utils/__init__.py | 57 --------- 7 files changed, 1 insertion(+), 317 deletions(-) delete mode 100644 recorder/__init__.py delete mode 100644 recorder/__main__.py delete mode 100644 recorder/parser/behavior_record.py delete mode 100644 recorder/parser/psr_record_parser.py delete mode 100644 recorder/record_processor.py delete mode 100644 recorder/utils/__init__.py diff --git a/README.md b/README.md index 42ab15ca..fb881eb1 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Both agents leverage the multi-modal capabilities of GPT-Vision to comprehend th ## 📢 News -- 📅 2024-03-26: **New Release for v0.0.1!** Check out our exciting new features: +- 📅 2024-03-25: **New Release for v0.0.1!** Check out our exciting new features: 1. We now support creating your help documents for each Windows application to become an app expert. Check the [README](./learner/README.md) for more details! 2. UFO now supports RAG from offline documents and online Bing search. 3. You can save the task completion trajectory into its memory for UFO's reference, improving its future success rate! diff --git a/recorder/__init__.py b/recorder/__init__.py deleted file mode 100644 index 7f3fd831..00000000 --- a/recorder/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. \ No newline at end of file diff --git a/recorder/__main__.py b/recorder/__main__.py deleted file mode 100644 index dd26b9e4..00000000 --- a/recorder/__main__.py +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. -from . import record_processor - -if __name__ == "__main__": - # Execute the main script - record_processor.main() - \ No newline at end of file diff --git a/recorder/parser/behavior_record.py b/recorder/parser/behavior_record.py deleted file mode 100644 index 6fa9ad52..00000000 --- a/recorder/parser/behavior_record.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -class BehaviorStep: - """ - Class for the single step information in the user behavior record. - Multiple steps will be recorded to achieve a specific request. - """ - - def __init__(self, application: str, description: str, action: str, screenshot: str, comment: str): - """ - Create a new step. - """ - self.application = application - self.description = description - self.action = action - self.comment = comment - self.screenshot = screenshot - - -class BehaviorRecord: - """ - Class for the user behavior record. - A serise of steps user performed to achieve a specific request will be recorded in this class. - """ - - def __init__(self, applications: list, step_num: int, **steps: BehaviorStep): - """ - Create a new Record. - """ - self.request = "" - self.round = 0 - self.applications = applications - self.step_num = step_num - for index, step in steps.items(): - setattr(self, index, step.__dict__) - - def set_request(self, request): - """ - Set the request. - """ - self.request = request diff --git a/recorder/parser/psr_record_parser.py b/recorder/parser/psr_record_parser.py deleted file mode 100644 index 7eec6cde..00000000 --- a/recorder/parser/psr_record_parser.py +++ /dev/null @@ -1,171 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -import re -import xml.etree.ElementTree as ET -from bs4 import BeautifulSoup -from .behavior_record import BehaviorRecord, BehaviorStep - - -class PSRRecordParser: - """ - Class for parsing the steps recorder .mht file content to user behavior record. - """ - - def __init__(self, content: str): - """ - Constructor for the RecordParser class. - """ - self.content = content - self.parts_dict = {} - self.applications = [] - self.comments = [] - self.steps = [] - - def parse_to_record(self) -> BehaviorRecord: - """ - Parse the steps recorder .mht file content to record in following steps: - 1. Find the boundary in the .mht file. - 2. Split the file by the boundary into parts. - 3. Get the comments for each step. - 4. Get the steps from the content. - 5. Construct the record object and return it. - return: A record object. - """ - boundary = self.find_boundary() - self.parts_dict = self.split_file_by_boundary(boundary) - self.comments = self.get_comments( - self.parts_dict['main.htm']['Content']) - self.steps = self.get_steps(self.parts_dict['main.htm']['Content']) - record = BehaviorRecord( - list(set(self.applications)), len(self.steps), **self.steps) - - return record - - def find_boundary(self) -> str: - """ - Find the boundary in the .mht file. - """ - - boundary_start = self.content.find("boundary=") - - if boundary_start != -1: - boundary_start += len("boundary=") - boundary_end = self.content.find("\n", boundary_start) - boundary = self.content[boundary_start:boundary_end].strip('\"') - return boundary - else: - raise ValueError("Boundary not found in the .mht file.") - - def split_file_by_boundary(self, boundary: str) -> dict: - """ - Split the file by the boundary into parts, - Store the parts in a dictionary, including the content type, - content location and content transfer encoding. - boundary: The boundary of the file. - return: A dictionary of parts in the file. - """ - parts = self.content.split("--" + boundary) - part_dict = {} - for part in parts: - content_type_start = part.find("Content-Type:") - content_location_start = part.find("Content-Location:") - content_transfer_encoding_start = part.find( - "Content-Transfer-Encoding:") - part_info = {} - if content_location_start != -1: - content_location_end = part.find("\n", content_location_start) - content_location = part[content_location_start:content_location_end].split(":")[ - 1].strip() - - # add the content location - if content_type_start != -1: - content_type_end = part.find("\n", content_type_start) - content_type = part[content_type_start:content_type_end].split(":")[ - 1].strip() - part_info["Content-Type"] = content_type - - # add the content transfer encoding - if content_transfer_encoding_start != -1: - content_transfer_encoding_end = part.find( - "\n", content_transfer_encoding_start) - content_transfer_encoding = part[content_transfer_encoding_start:content_transfer_encoding_end].split(":")[ - 1].strip() - part_info["Content-Transfer-Encoding"] = content_transfer_encoding - - content = part[content_location_end:].strip() - part_info["Content"] = content - part_dict[content_location] = part_info - return part_dict - - def get_steps(self, content: str) -> dict: - """ - Get the steps from the content in fllowing steps: - 1. Find the UserActionData tag in the content. - 2. Parse the UserActionData tag to get the steps. - 3. Get the screenshot for each step. - 4. Get the comments for each step. - content: The content of the main.htm file. - return: A dictionary of steps. - """ - - user_action_data = re.search( - r'(.*?)', content, re.DOTALL) - if user_action_data: - - root = ET.fromstring(user_action_data.group(1)) - steps = {} - - for each_action in root.findall('EachAction'): - - action_number = each_action.get('ActionNumber') - application = each_action.get('FileName') - description = each_action.find('Description').text - action = each_action.find('Action').text - screenshot_file_name = each_action.find( - 'ScreenshotFileName').text - screenshot = self.get_screenshot(screenshot_file_name) - step_key = f"step_{int(action_number) - 1}" - - step = BehaviorStep( - application, description, action, screenshot, self.comments.get(step_key)) - steps[step_key] = step - self.applications.append(application) - return steps - else: - raise ValueError("UserActionData not found in the file.") - - def get_comments(self, content: str) -> dict: - """ - Get the user input comments for each step - content: The content of the main.htm file. - return: A dictionary of comments for each step. - """ - soup = BeautifulSoup(content, 'html.parser') - body = soup.body - steps_html = body.find('div', id='Steps') - steps = steps_html.find_all(lambda tag: tag.name == 'div' and tag.has_attr( - 'id') and re.match(r'^Step\d+$', tag['id'])) - - comments = {} - for index, step in enumerate(steps): - comment_tag = step.find('b', text='Comment: ') - comments[f'step_{index}'] = comment_tag.next_sibling if comment_tag else None - return comments - - def get_screenshot(self, screenshot_file_name: str) -> str: - """ - Get the screenshot by screenshot file name. - The screenshot related information is stored in the parts_dict. - screenshot_file_name: The file name of the screenshot. - return: The screenshot in base64 string. - """ - screenshot_part = self.parts_dict[screenshot_file_name] - content = screenshot_part['Content'] - content_type = screenshot_part['Content-Type'] - content_transfer_encoding = screenshot_part['Content-Transfer-Encoding'] - - screenshot = 'data:{type};{encoding}, {content}'.format( - type=content_type, encoding=content_transfer_encoding, content=content) - - return screenshot diff --git a/recorder/record_processor.py b/recorder/record_processor.py deleted file mode 100644 index c293120f..00000000 --- a/recorder/record_processor.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -import argparse -from .parser.psr_record_parser import PSRRecordParser -from .utils import save_to_json, unzip_and_read_file -from ufo.utils import print_with_color -import os - -args = argparse.ArgumentParser() -args.add_argument("--request", "-r", help="The request that user want to achieve.", - type=lambda s: s.strip() or None, nargs='+') -args.add_argument("--behavior-record-path", "-p", help="The path for user behavior record in zip file.", - type=lambda f: f if f.endswith(".zip") else None) -parsed_args = args.parse_args() - - -def main(): - """ - Main function. - """ - - # Temporarily hardcode the output file path, will move to a config file later - output_file = '{prefix}\\vectordb\\records\\log\\{file_name}.json'.format( - prefix=os.getcwd(), - file_name=parsed_args.request[0].replace(' ', '_') - ) - try: - content = unzip_and_read_file(parsed_args.behavior_record_path) - record = PSRRecordParser(content).parse_to_record() - record.set_request(parsed_args.request[0]) - save_to_json(record.__dict__, output_file) - print_with_color( - f"Record process successfully. The record is saved to {output_file}.", "green") - except ValueError as e: - print_with_color(str(e), "red") diff --git a/recorder/utils/__init__.py b/recorder/utils/__init__.py deleted file mode 100644 index 864fc6bd..00000000 --- a/recorder/utils/__init__.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - - -import zipfile -import json -import os - - -def unzip_and_read_file(file_path: str) -> str: - """ - Unzip the file and read the content of the extracted file. - file_path: the path of the pending zip file. - return: the content of the extracted file. - """ - extracted_file = unzip_file(file_path) - with open(extracted_file, 'r', encoding='utf-8') as file: - content = file.read() - return content - - -def unzip_file(zip_file_path: str) -> str: - """ - Unzip the file and return the path of the extracted file. - zip_file_path: the path of the pending zip file. - return: the path of the extracted file. - """ - folder_name = os.path.splitext(zip_file_path)[0] - - # Create the directory if it doesn't exist - if not os.path.exists(folder_name): - os.makedirs(folder_name) - - # Extract the contents of the ZIP file into the directory - with zipfile.ZipFile(zip_file_path, 'r') as zip_ref: - zip_ref.extractall(folder_name) - - extracted_file = os.path.join(folder_name, os.listdir(folder_name)[0]) - return extracted_file - - -def save_to_json(data: dict, output_file_path: str): - """ - Save the data to a JSON file. - data: the data to save. - output_file_path: the path of the output file. - """ - - # Extract the directory path from the file path - directory = os.path.dirname(output_file_path) - - # Check if the directory exists, if not, create it - if not os.path.exists(directory): - os.makedirs(directory) - - with open(output_file_path, 'w') as file: - json.dump(data, file, indent=4)
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 literal 0 HcmV?d00001 diff --git a/assets/ufo_blue.png b/assets/ufo_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..1feba09d2a40356f9473d5313746c7522935ac4c GIT binary patch literal 13063 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 P7?O?|pERm6aF6{zrL0Ih literal 0 HcmV?d00001 diff --git a/assets/ufo_rv.png b/assets/ufo_rv.png new file mode 100644 index 0000000000000000000000000000000000000000..d26f6942c1ca892fa8302571cd86d55508b503da GIT binary patch literal 35025 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 T+!%+wV3_(bt)p2=+jSVpD& literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..0be2efe2 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,8 @@ +art==6.1 +colorama==0.4.6 +msal==1.25.0 +openai==1.11.1 +Pillow==10.2.0 +pywinauto==0.6.8 +PyYAML==6.0.1 +Requests==2.31.0 diff --git a/ufo/__init__.py b/ufo/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ufo/__main__.py b/ufo/__main__.py new file mode 100644 index 00000000..87bf173e --- /dev/null +++ b/ufo/__main__.py @@ -0,0 +1,5 @@ +from . import ufo + +if __name__ == "__main__": + # Execute the main script + ufo.main() \ No newline at end of file diff --git a/ufo/config/__init__.py b/ufo/config/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ufo/config/config.py b/ufo/config/config.py new file mode 100644 index 00000000..887a267f --- /dev/null +++ b/ufo/config/config.py @@ -0,0 +1,24 @@ +import os +import yaml + + +def load_config(config_path="ufo/config/config.yaml"): + """ + Load the configuration from a YAML file and environment variables. + + :param config_path: The path to the YAML config file. Defaults to "./config.yaml". + :return: Merged configuration from environment variables and YAML file. + """ + # Copy environment variables to avoid modifying them directly + configs = dict(os.environ) + + try: + with open(config_path, "r") as file: + yaml_data = yaml.safe_load(file) + # Update configs with YAML data + if yaml_data: + configs.update(yaml_data) + except FileNotFoundError: + print(f"Warning: Config file not found at {config_path}. Using only environment variables.") + + return configs \ No newline at end of file diff --git a/ufo/config/config.yaml b/ufo/config/config.yaml new file mode 100644 index 00000000..6180231a --- /dev/null +++ b/ufo/config/config.yaml @@ -0,0 +1,40 @@ +version: 0.1 + +OPENAI_API_BASE: "https://cloudgpt-swc.openai.azure.com/openai/deployments/gpt-4-visual-preview/chat/completions?api-version=2023-12-01-preview" # The base URL for the OpenAI API +OPENAI_API_KEY: "" # Set the value to sk-xxx if you host the openai interface for open llm model +OPENAI_API_MODEL: "gpt-4-visual-preview" # The only OpenAI model by now that accepts visual input +CONTROL_BACKEND: "uia" # The backend for control action +MAX_TOKENS: 2000 # The max token limit for the response completion +MAX_RETRY: 3 # The max retry limit for the response completion +MAX_STEP: 30 # The max step limit for completing the user request +SLEEP_TIME: 5 # The sleep time between each step to wait for the window to be ready +TEMPERATURE: 0.0 # The temperature of the model: the lower the value, the more consistent the output of the model +TOP_P: 0.0 # The top_p of the model: the lower the value, the more conservative the output of the model +SAFE_GUARD: True # Whether to use the safe guard to prevent the model from doing sensitve operations. +CONTROL_TYPE_LIST: ["Button", "Edit", "TabItem", "Document", "ListItem", "MenuItem", "ScrollBar", "TreeItem", "Hyperlink", "ComboBox", "RadioButton"] # The list of control types that are allowed to be selected +HISTORY_KEYS: ["Step", "Thought", "ControlText", "Action", "Comment", "Results"] # The keys of the action history for the next step. +ANNOTATION_COLORS: { + "Button": "#FFF68F", + "Edit": "#A5F0B5", + "TabItem": "#A5E7F0", + "Document": "#FFD18A", + "ListItem": "#D9C3FE", + "MenuItem": "#E7FEC3", + "ScrollBar": "#FEC3F8", + "TreeItem": "#D6D6D6", + "Hyperlink": "#91FFEB", + "ComboBox": "#D8B6D4" + } + +PRINT_LOG: FALSE # Whether to print the log +CONCAT_SCREENSHOT: True # Whether to concat the screenshot for the control item +LOG_LEVEL: "DEBUG" # The log level +INCLUDE_LAST_SCREENSHOT: True # Whether to include the last screenshot in the observation +REQUEST_TIMEOUT: 250 # The call timeout for the GPT-V model +APP_SELECTION_PROMPT: "ufo/prompts/base/app_selection.yaml" # The prompt for the app selection +ACTION_SELECTION_PROMPT: "ufo/prompts/base/action_selection.yaml" # The prompt for the action selection +INPUT_TEXT_API: "type_keys" # The input text API + + + + \ No newline at end of file diff --git a/ufo/llm/__init__.py b/ufo/llm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ufo/llm/llm_call.py b/ufo/llm/llm_call.py new file mode 100644 index 00000000..4bcedc8b --- /dev/null +++ b/ufo/llm/llm_call.py @@ -0,0 +1,59 @@ +import requests +import time +from ..config.config import load_config +from ..utils import print_with_color + +configs = load_config() + + +def get_gptv_completion(messages, headers): + """ + Get GPT-V completion from messages. + messages: The messages to be sent to GPT-V. + headers: The headers of the request. + endpoint: The endpoint of the request. + max_tokens: The maximum number of tokens to generate. + temperature: The sampling temperature. + model: The model to use. + max_retry: The maximum number of retries. + return: The response of the request. + """ + + payload = { + "messages": messages, + "temperature": configs["TEMPERATURE"], + "max_tokens": configs["MAX_TOKENS"], + "top_p": configs["TOP_P"], + "model": configs["OPENAI_API_MODEL"] + } + + + for _ in range(configs["MAX_RETRY"]): + try: + response = requests.post(configs["OPENAI_API_BASE"], headers=headers, json=payload) + response_json = response.json() + response.raise_for_status() # Will raise an HTTPError if the HTTP request returned an unsuccessful status code + + + if "choices" not in response_json: + print_with_color(f"GPT Error: No Reply", "red") + continue + + if "error" not in response_json: + usage = response_json.get("usage", {}) + prompt_tokens = usage.get("prompt_tokens", 0) + completion_tokens = usage.get("completion_tokens", 0) + + cost = prompt_tokens / 1000 * 0.01 + completion_tokens / 1000 * 0.03 + + return response_json, cost + except requests.RequestException as e: + print_with_color(f"Error making API request: {e}", "red") + print_with_color(str(response_json), "red") + try: + print_with_color(response.json(), "red") + except: + _ + time.sleep(3) + continue + diff --git a/ufo/llm/prompt.py b/ufo/llm/prompt.py new file mode 100644 index 00000000..152c808d --- /dev/null +++ b/ufo/llm/prompt.py @@ -0,0 +1,74 @@ +from typing import List +import json + +def prompt_construction(system_prompt: str, image_list: List, user_prompt: str, include_last_screenshot=False): + """ + Construct the prompt for GPT-4 Visual. + :param system_prompt: The system prompt. + :param image_list: The list of images. + :param user_prompt: The user prompt. + :param include_last_screenshot: Whether to include the last screenshot. + return: The prompt for GPT-4 Visual. + """ + prompt_message = [] + if len(system_prompt) > 0: + system_message = { + "role": "system", + "content": system_prompt + } + prompt_message.append(system_message) + + screenshot_text = [] + if include_last_screenshot: + screenshot_text += ["Screenshot for the last step:"] + + screenshot_text += ["Current Screenshots:", "Annotated Screenshot:"] + + user_content = [] + + for i, image in enumerate(image_list): + user_content.append({ + "type": "text", + "text": screenshot_text[i] + }) + user_content.append({ + "type": "image_url", + "image_url": { + "url": image + } + }) + + user_content.append({ + "type": "text", + "text": user_prompt + }) + + user_message = {"role": "user", "content": user_content} + prompt_message.append(user_message) + + return prompt_message + + +def app_selection_prompt_construction(prompt_template: str, user_request: str, app_info: dict): + """ + Construct the prompt for app selection. + :param prompt_template: The template of the prompt. + :param user_request: The user request. + :param app_info: The app info. + return: The prompt for app selection. + """ + + return prompt_template["user"].format(user_request=user_request, applications=app_info) + + +def action_selection_prompt_construction(prompt_template: str, request_history: list, action_history: list, control_item: list, prev_plan: str, user_request: str): + """ + Construct the prompt for action selection. + :param prompt_template: The template of the prompt. + :param action_history: The action history. + :param control_item: The control item. + :param user_request: The user request. + return: The prompt for action selection. + """ + + return prompt_template["user"].format(action_history=json.dumps(action_history), request_history=json.dumps(request_history), control_item=json.dumps(control_item), prev_plan=prev_plan, user_request=user_request) diff --git a/ufo/module/__init__.py b/ufo/module/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ufo/module/flow.py b/ufo/module/flow.py new file mode 100644 index 00000000..8e619a08 --- /dev/null +++ b/ufo/module/flow.py @@ -0,0 +1,431 @@ +import logging +import os +import time +import json +import yaml +from art import text2art +from pywinauto.uia_defines import NoPatternInterfaceError + +from ..config.config import load_config +from ..llm import llm_call +from ..llm import prompt as prompter +from ..ui_control import control +from ..ui_control import screenshot as screen +from ..utils import (create_folder, encode_image_from_path, + generate_function_call, json_parser, print_with_color, + revise_line_breaks, yes_or_no) + +configs = load_config() +BACKEND = configs["CONTROL_BACKEND"] + + + +class Session(object): + """ + A session for UFO. + """ + def __init__(self, task): + """ + Initialize a session. + :param task: The name of current task. + :param gpt_key: GPT key. + """ + self.task = task + self.step = 0 + self.round = 0 + self.action_history = [] + + self.log_path = f"logs/{self.task}/" + create_folder(self.log_path) + self.logger = initialize_logger(self.log_path, "response.log") + self.request_logger = initialize_logger(self.log_path, "request.log") + self.app_selection_prompt = yaml.safe_load(open(configs["APP_SELECTION_PROMPT"], "r", encoding="utf-8")) + self.action_selection_prompt = yaml.safe_load(open(configs["ACTION_SELECTION_PROMPT"], "r", encoding="utf-8")) + self.status = "APP_SELECTION" + self.application = "" + self.app_window = None + self.plan = "" + self.request = "" + self.results = "" + self.cost = 0 + + + + print_with_color("""Welcome to use UFO🛸, A UI-focused Multimodal Agent for Windows OS. +{art} +Please enter your request to be completed🛸: """.format(art=text2art("UFO")), "cyan") + + self.request = input() + self.request_history = [] + + def process_application_selection(self, headers): + + """ + Select an action. + header: The headers of the request. + return: The outcome, the application window, and the action log. + """ + + # Code for selecting an action + print_with_color("Step {step}: Selecting an application.".format(step=self.step), "magenta") + desktop_save_path = self.log_path + f"action_step{self.step}.png" + _ = screen.capture_screenshot_multiscreen(desktop_save_path) + desktop_screen_url = encode_image_from_path(desktop_save_path) + + self.results = "" + + desktop_windows_dict, desktop_windows_info = control.get_desktop_app_info_dict() + + app_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.app_selection_prompt, self.request_history, self.action_history, desktop_windows_info, self.plan, self.request) + app_selection_prompt_message = prompter.prompt_construction(self.app_selection_prompt["system"], [desktop_screen_url], app_selection_prompt_user_message) + + self.request_logger.debug(json.dumps({"step": self.step, "prompt": app_selection_prompt_message, "status": ""})) + + try: + response, cost = llm_call.get_gptv_completion(app_selection_prompt_message, headers) + + except Exception as e: + log = json.dumps({"step": self.step, "status": str(e), "prompt": app_selection_prompt_message}) + print_with_color("Error occurs when calling LLM.", "red") + self.request_logger.info(log) + self.status = "ERROR" + return + + + self.cost += cost + + try: + response_string = response["choices"][0]["message"]["content"] + response_json = json_parser(response_string) + + application_label = response_json["ControlLabel"] + self.application = response_json["ControlText"] + observation = response_json["Observation"] + thought = response_json["Thought"] + self.plan = response_json["Plan"] + self.status = response_json["Status"] + comment = response_json["Comment"] + + print_with_color("Observations👀: {observation}".format(observation=observation), "cyan") + print_with_color("Thoughts💡: {thought}".format(thought=thought), "green") + print_with_color("Selected application📲: {application}".format(application=self.application), "yellow") + print_with_color("Next Plan📚: {plan}".format(plan=self.plan.replace("\\n", "\n")), "cyan") + print_with_color("Comment💬: {comment}".format(comment=comment), "green") + + + response_json["Step"] = self.step + response_json["ControlLabel"] = self.application + response_json["Action"] = "set_focus()" + + response_json = self.set_result_and_log("", response_json) + + if "FINISH" in self.status.upper() or self.application == "": + self.status = "FINISH" + return + + app_window = desktop_windows_dict[application_label] + + try: + app_window.is_normal() + + # Handle the case when the window interface is not available + except NoPatternInterfaceError as e: + self.error_logger(response_string, str(e)) + print_with_color("Window interface {title} not available for the visual element.".format(title=self.application), "red") + self.status = "ERROR" + return + + self.status = "CONTINUE" + self.app_window = app_window + + self.app_window.set_focus() + time.sleep(configs["SLEEP_TIME"]) + + self.step += 1 + + except Exception as e: + print_with_color("Error Occurs at application selection.", "red") + print_with_color(str(e), "red") + print_with_color(response_string, "red") + self.error_logger(response_string, str(e)) + self.status = "ERROR" + + return + + + def process_action_selection(self, headers): + """ + Select an action. + header: The headers of the request. + return: The outcome, the application window, and the action log. + """ + + print_with_color("Step {step}: Taking an action on application {application}.".format(step=self.step, application=self.application), "magenta") + screenshot_save_path = self.log_path + f"action_step{self.step}.png" + annotated_screenshot_save_path = self.log_path + f"action_step{self.step}_annotated.png" + concat_screenshot_save_path = self.log_path + f"action_step{self.step}_concat.png" + control_screenshot_save_path = self.log_path + f"action_step{self.step}_selected_controls.png" + + + + if BACKEND == "uia": + control_list = control.find_control_elements_in_descendants(self.app_window, configs["CONTROL_TYPE_LIST"]) + else: + control_list = control.find_control_elements_in_descendants(self.app_window, configs["CONTROL_TYPE_LIST"]) + + while True: + if self.app_window == None: + self.status = "ERROR" + print_with_color("Required Application window is not available.", "red") + return + + annotation_dict, _, _ = screen.control_annotations(self.app_window, screenshot_save_path, annotated_screenshot_save_path, control_list, anntation_type="number") + control_info = control.get_control_info_dict(annotation_dict, ["control_text", "control_type" if BACKEND == "uia" else "control_class"]) + + image_url = [] + + if configs["INCLUDE_LAST_SCREENSHOT"]: + + last_screenshot_save_path = self.log_path + f"action_step{self.step - 1}.png" + last_control_screenshot_save_path = self.log_path + f"action_step{self.step - 1}_selected_controls.png" + image_url += [encode_image_from_path(last_control_screenshot_save_path if os.path.exists(last_control_screenshot_save_path) else last_screenshot_save_path)] + + if configs["CONCAT_SCREENSHOT"]: + screen.concat_images_left_right(screenshot_save_path, annotated_screenshot_save_path, concat_screenshot_save_path) + image_url += [encode_image_from_path(concat_screenshot_save_path)] + else: + screenshot_url = encode_image_from_path(screenshot_save_path) + screenshot_annotated_url = encode_image_from_path(annotated_screenshot_save_path) + image_url += [screenshot_url, screenshot_annotated_url] + + action_selection_prompt_user_message = prompter.action_selection_prompt_construction(self.action_selection_prompt, self.request_history, self.action_history, control_info, self.plan, self.request) + action_selection_prompt_message = prompter.prompt_construction(self.action_selection_prompt["system"], image_url, action_selection_prompt_user_message, configs["INCLUDE_LAST_SCREENSHOT"]) + + self.request_logger.debug(json.dumps({"step": self.step, "prompt": action_selection_prompt_message, "status": ""})) + + try: + response, cost = llm_call.get_gptv_completion(action_selection_prompt_message, headers) + except Exception as e: + log = json.dumps({"step": self.step, "status": str(e), "prompt": action_selection_prompt_message}) + print_with_color("Error occurs when calling LLM.", "red") + self.request_logger.info(log) + self.status = "ERROR" + time.sleep(configs["SLEEP_TIME"]) + continue + + self.cost += cost + + try: + response_string = response["choices"][0]["message"]["content"] + response_json = json_parser(response_string) + + observation = response_json["Observation"] + thought = response_json["Thought"] + control_label = response_json["ControlLabel"] + control_text = response_json["ControlText"] + function_call = response_json["Function"] + args = revise_line_breaks(response_json["Args"]) + + action = generate_function_call(function_call, args) + self.plan = response_json["Plan"] + self.status = response_json["Status"] + comment = response_json["Comment"] + response_json["Step"] = self.step + response_json["Action"] = action + + + print_with_color("Observations👀: {observation}".format(observation=observation), "cyan") + print_with_color("Thoughts💡: {thought}".format(thought=thought), "green") + print_with_color("Selected item🕹️: {control_text}, Label: {label}".format(control_text=control_text, label=control_label), "yellow") + print_with_color("Action applied⚒️: {action}".format(action=action), "blue") + print_with_color("Status📊: {status}".format(status=self.status), "blue") + print_with_color("Next Plan📚: {plan}".format(plan=self.plan.replace("\\n", "\n")), "cyan") + print_with_color("Comment💬: {comment}".format(comment=comment), "green") + + + except Exception as e: + print_with_color("Error occurs at step {step}".format(step=self.step), "red") + print_with_color(str(e), "red") + print_with_color(response_string, "red") + self.status = "ERROR" + + self.error_logger(response_string, str(e)) + + return + + if "SCREENSHOT" in self.status.upper(): + print_with_color("Annotation is overlapped and the agent is unable to select the control items. New annotated screenshot is taken.", "magenta") + annotated_screenshot_save_path = self.log_path + f"action_step{self.step}_annotated_retake.png" + if "control_labels" in args: + selected_controls_labels = args["control_labels"] + control_list = [annotation_dict[str(label)] for label in selected_controls_labels] + continue + + break + + # The task is finish and no further action is needed + if self.status.upper() == "FINISH" and function_call == "": + self.status = self.status.upper() + response_json = self.set_result_and_log("", response_json) + + return + + self.step += 1 + + if function_call: + # Handle the case when the action is an image summary or switch app + if function_call.lower() == "summary": + response_json = self.set_result_and_log(args["text"], response_json) + return + else: + response_json = self.set_result_and_log("", response_json) + return + + # Action needed. + control_selected = annotation_dict.get(control_label, self.app_window) + # print_with_color("Actual control name: {name}".format(name=control_selected.element_info.name), "magenta") + control_selected.set_focus() + + if not self.safe_guard(action, control_text): + return + + + # Take screenshot of the selected control + screen.capture_screenshot_controls(self.app_window, [control_selected], control_screenshot_save_path) + control.wait_enabled(control_selected) + results = control.execution(control_selected, function_call, args) + response_json = self.set_result_and_log(results, response_json) + + time.sleep(configs["SLEEP_TIME"]) + + return + + + def set_new_round(self): + """ + Start a new round. + """ + self.request_history.append({self.round: self.request}) + self.round += 1 + print_with_color("""Please enter your new request. Enter 'N' for exit.""", "cyan") + + self.request = input() + + if self.request.upper() == "N": + self.status = "ALLFINISH" + return + else: + self.status = "APP_SELECTION" + return + + def get_round(self): + """ + Get the round of the session. + return: The round of the session. + """ + return self.round + + def set_round(self, new_round): + """ + Set the round of the session. + """ + self.round = new_round + + + def get_status(self): + """ + Get the status of the session. + return: The status of the session. + """ + return self.status + + def get_step(self): + """ + Get the step of the session. + return: The step of the session. + """ + return self.step + + def get_results(self): + """ + Get the results of the session. + return: The results of the session. + """ + return self.results + + def get_cost(self): + """ + Get the cost of the session. + return: The cost of the session. + """ + return self.cost + + def get_application_window(self): + """ + Get the application of the session. + return: The application of the session. + """ + return self.app_window + + + def set_result_and_log(self, result, response_json): + """ + Set the result of the session, and log the result. + """ + if type(result) != str and type(result) != list: + result = "" + response_json["Results"] = result + self.logger.info(json.dumps(response_json)) + self.action_history.append({key: response_json[key] for key in configs["HISTORY_KEYS"]}) + self.results = result + + return response_json + + def safe_guard(self, action, control_text): + """ + Safe guard for the session. + """ + if "PENDING" in self.status.upper() and configs["SAFE_GUARD"]: + print_with_color("[Input Required:] UFO🛸 will apply {action} on the [{control_text}] item. Please confirm whether to proceed or not. Please input Y or N.".format(action=action, control_text=control_text), "magenta") + decision = yes_or_no() + if not decision: + print_with_color("The user decide to stop the task.", "magenta") + self.status = "FINISH" + return False + + # Handle the PENDING_AND_FINISH case + elif "FINISH" in self.plan: + self.status = "FINISH" + return True + + def error_logger(self, response_str, error): + """ + Error handler for the session. + """ + log = json.dumps({"step": self.step, "status": "ERROR", "response": response_str, "error": error}) + self.logger.info(log) + + +def initialize_logger(log_path, log_filename): + """ + Initialize logging. + log_path: The path of the log file. + log_filename: The name of the log file. + return: The logger. + """ + # Code for initializing logging + logger = logging.Logger(log_filename) + + if not configs["PRINT_LOG"]: + # Remove existing handlers if PRINT_LOG is False + logger.handlers = [] + + + log_file_path = os.path.join(log_path, log_filename) + file_handler = logging.FileHandler(log_file_path, encoding="utf-8") + formatter = logging.Formatter('%(message)s') + file_handler.setFormatter(formatter) + logger.addHandler(file_handler) + logger.setLevel(configs["LOG_LEVEL"]) + + return logger \ No newline at end of file diff --git a/ufo/prompts/base/action_selection.yaml b/ufo/prompts/base/action_selection.yaml new file mode 100644 index 00000000..c5d5ee88 --- /dev/null +++ b/ufo/prompts/base/action_selection.yaml @@ -0,0 +1,288 @@ +version: 1.0 + +system: |- + Your name is UFO, a UI-focused agent for Windows OS. You are a virtual assistant that can help users to complete requests by interacting with the UI of the system. + Your task is to navigate and take action on control item of the current application window step-by-step to complete users' current request. + - You are provided two screenshots of the current application window, and the screenshot from the last step for reference. + - You are provided a list of control items of the current application window for reference. + - You are provided your previous plan of action for reference to decide the next step. But you are not required to strictly follow your previous plan of action. Revise your previous plan of action base on the screenshot if necessary. + - You are provided the user request history for reference to decide the next step. These requests are the requests that you have completed before. You may need to use them as reference for the next action. + - You are provided the function return from your previous action for reference to decide the next step. You may use the return of your previous action to complete the user request. + - You are provided the steps history, including historical actions, thoughts, and results of your previous steps for reference to decide the next step. Use them to help you think about the next step. + - You are required to select the control item and take one-step action on it to complete the user request for one step. The one-step action means calling a function with arguements for only once. + - You are required to decide whether the task status, and detail a plan of following actions to accomplish the current user request. Do not include any additional actions beyond the completion of the current user request. + + ## On screenshots + - You are provided two versions of screenshots of the current application in a single image, one with annotation (right) and one without annotation (left). + - You are also provided the screenshot from the last step for your reference and comparison. The control items selected at the last step is labeled with red rectangle box on the screenshot. Use it to help you think whether the previous action has taken effect. + - The annotation is to help you identify the control elements on the application. + - The annotation is a small rectangle with a number in the center of the rectangle in the top left corner of the control item. The number is the label of the control item. + - You can refer to the clean screenshot without annotation to see what control item are without blocking the view by the annotation. + - Different types of control items have different colors of annotation. + - Use the screenshot to analyze the state of current application window. You may need to take all actions on your previous plan, as the state of the application window may be different from your previous plan. + + + ## Control item + - The control item is the element on the page that you can interact with, we limit the actionable control item to the following: + - "Button" is the control item that you can click. It is labeled with yellow annotation on the screenshot. + - "Edit" is the control item that you can click and input text. It is labeled with green annotation on the screenshot. + - "TabItem" is the control item that you can click and switch to another page. It is labeled with blue annotation on the screenshot. + - "ListItem" is the control item that you can click and select. It is labeled with purple annotation on the screenshot. + - "MenuItem" is the control item that you can click and select. It is labeled with light lighter green annotation on the screenshot. + - "ScrollBar" is the control item that you can scroll. It is labeled with pink annotation on the screenshot. + - "TreeItem" is the control item that you can click and select. It is labeled with gray annotation on the screenshot. + - "Document" is the control item that you can click and select text. It is labeled with orange annotation on the screenshot. + - "Hyperlink" is the control item that you can click and open a link. It is labeled with light blue annotation on the screenshot. + - "ComboBox" is the control item that you can click and input text. It is labeled with light purple annotation on the screenshot. The Google search box is an example of ComboBox. + - You are given the information of all available control item in the current application window in a list format: {label: "the annotated label of the control item", control_text: "the text of the control item", control_type: "the type of the control item"}. + + ## Action on the control item + - You are able to use pywinauto to interact with the control item. + - The action type are limited to ["Click", "SetText", "Annotate", "Summary", "GetText", "Scroll"]. + + - "Click" is to click the control item with mouse. + [1] API call: click_input(button=, double) + [2] Args: + - button: 'The mouse button to click. One of ''left'', ''right'', ''middle'' or ''x'' (Default: ''left'')' + - double: 'Whether to perform a double click or not (Default: False)' + [3] Example: click_input(button="left", double=False) + [4] Available control item: All control items. + [5] Return: None + + - "SetText" is to input text to the control item. + [1] API call: set_edit_text(text="") + [2] Args: + - text: The text input to the Edit control item. It will change the content of current text in the edit block. Set text ='' if you want to clear current text in the block. You must also use Double Backslash escape character to escape the single quote in the string argument. + [3] Example: set_edit_text(text="Hello World. \\n I enjoy the reading of the book 'The Lord of the Rings'. It's a great book.") + [4] Available control item: [Edit] + [5] Return: None + + - "Annotate" is to take a screenshot of the current application window and annotate the control item on the screenshot. + [1] API call: annotation(control_labels: List[str]=[]) + [2] Args: + - control_labels: The list of annotated label of the control item. If the list is empty, it will annotate all the control items on the screenshot. + [3] Example: annotation(control_labels=["1", "2", "3", "36", "58"]) + [4] Available control item: All control items. + [5] Return: None + + - "Summary" is to summarize your observation of the current application window base on the clean screenshot. This usually happens when the you need to complete the user request by summarizing or describing the information on the current application window. You must use the 'text' argument to input the text to be summarized. + [1] API call: summary(text="") + [2] Args: None + [3] Example: summary(text="The image shows a workflow of a AI agent framework. \\n The framework has three components: the 'data collection', the 'data processing' and the 'data analysis'.") + [4] Available control item: All control items. + [5] Return: the summary of the image. + + - "GetText" is to get the text of the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. + [1] API call: texts() + [2] Args: None + [3] Example: texts() + [4] All control items. + [5] Return: the text content of the control item. + + + - "Scroll" is to scroll the control item. It typical apply to a ScrollBar type of control item when user request is to scroll the control item, or the targeted control item is not visible nor available in the control item list, but you know the control item is in the application window and you need to scroll to find it. + [1] API call: wheel_mouse_input() + [2] Args: + - wheel_dist: The distance to scroll. Positive values indicate upward scrolling, negative values indicate downward scrolling. + [3] Example: wheel_mouse_input(wheel_dist=-20) + [4] All control items. + [5] Return: None + + + + ## Status of the task + - You are required to decide the status of the task after taking the current action, choose from the following actions, and fill in the "Status" field in the response. + - "CONTINUE": means the task is not finished and need further action. + - "FINISH": means the entire user request is finished and no further actions are required, nor switching to another application window is required. If the user request is finished after the current action, you should also output "FINISH". Note that the user's request may need to be completed in multiple application windows, but you should only output "FINISH" when the entire request is finished. + - "PENDING": means the current one-step action you are taking is sensitive to the system and need to be confirmed by the user before its execution. This does not apply to future actions after the current step. Below are some examples of sensitive actions, but they are not limited to these cases: + [1] Taking the "Send" action for a message or email: + The sending action (e.g. clicking the send button) is sensitive to the system and as the message or email is sent, it can not be retrieved. Thus, the user need to confirm the sending action. Note that inputting the message or email is not sensitive, but clicking the send button is sensitive. + [2] Deleting or modifying files and folders: + Deleting or modifying files and folders, especially those located in critical system directories or containing important user data. + [3] Close an Window or Application: + Closing an window or application, since it may cause data loss or system crash. + [4] Accessing Webcam or Microphone: + Accessing the webcam or microphone without explicit user consent, as this raises privacy concerns. + [5] Installing or Uninstalling Software: + Installing or uninstalling software applications, as this can affect the system's configuration and potentially introduce security risks. + [6] Browser History or Password Retrieval: + Accessing sensitive user data such as browser history or stored passwords. + Please justify your decision on why current one-step action you output (not future actions in your "Plan") is sensitive in your "Thought". + For example, if the user request is to send a message to someone, you only need to output "Pending" in the "Status" field in the response when the current one-step action is to click the send button. + The system will automatically ask the user to confirm the current action. If the user confirms the action, the system will continue to execute the current action you output. Otherwise, the system will stop executing the action and ask the user to provide a new action. + The "Pending" only applies to the current action you are taking, not related to future actions in your plan. + If the current user request is finished after the current action, you must strictly output "" in the "Status" field in the response. + - "SCREENSHOT": + If you believe (1) annotations of control items of interest are overlapped or not visible on the screenshot, so you cannot identify and select the control item; and (2) the provided information of control item list is not enough to identify and select the control item, you should output "SCREENSHOT" in the "Status" field in the response. The system will automatically take a new screenshot and provide a new control item list for you to identify and select the control item. + Selecting "SCREENSHOT" in the "Status" field if and only if both (1) and (2) are satisfied. Otherwise, you should not select "SCREENSHOT" in the "Status" field in the response. For example, if the current control "17" is not blocked by other annotation so it is not visible, but you can get its information from the control item list to make a decision, you should not select "SCREENSHOT" in the "Status" field in the response. + If you select "SCREENSHOT" in the "Status" field in the response, you should also call the "annotate" action on the screenshot, and decide the required labels of control item list to screenshoted and annotated. + You can only select available control items in the control item list given and filled their labels in the "annotate" action, e.g. annotate(control_labels=['1', '2', '3', '36', '58']). The new screenshot will be only annotated with the control items with the given labels. + - "APP_SELECTION": + If you believe the one of the two following cases is satisfied, you should output "APP_SELECTION" in the "Status" field in the response. + [1] Current application window is not the correct application window to complete the user request; + [2] No further action is needed after taking the current one-step action on the current application, and next step is to switch to another application to take following actions. + You must set to "APP_SELECTION" (not "CONTINUE") immediately when you believe no further action is needed after taking the current action, and decide to switch to another application window for the next step. + + ## Other Guidelines + - You are required to select the control item and take open-step action by calling API on it to complete the user request for one step. + - You are required to are required to response in a JSON format, consisting of 9 distinct parts with the following keys and corresponding content: + {"Observation": + "Thought": + "ControlLabel": + "ControlText": + "Function": + "Args": + "Status": + "Plan": for reference, and you can reflect on it and revise if necessary. If you believe the task is finished and no further actions are required after the current action, output "".> + "Comment": + + - If the user request includes asking questions, and you can answer the question without taking calling API on the application at current step, you should answer the question in the "Comment" field in the response, and set the "Status" as "FINISH". + - If the required control item is not visible in the screenshot, and not available in the control item list, you may need to take action on other control items to navigate to the required control item. + - You can use your action/observation/comment history to help think about the next step. However, you must rely more on the current screenshots and control item list to make the decision. + - You must select the control item in the given list . You must not generate not in the list or in the historical steps. In your response, the ControlText of the selected control item must strictly match exactly with its ControlLabel in the given . Otherwise, the system will be destroyed and the user's computer will be crashed. + - When you are asked to get text, it usually apply to Edit and Document control item. Use this guideline to choose the control item and apply texts() action on it. + - You are not allowed to use keyboard shortcut to complete the user request. + - You must look at the both screenshots and the control item list carefully, analyse the current status before you select the control item and take action on it. Base on the status of the application window, reflect on your previous plan for removing redundant actions or adding missing actions to complete the current user request. + - You must use double-quoted string for the string arguments of your control Action. {"text": "Hello World. \\n you're my friend. Tom's home is great.')"}. Otherwise it will crash the system and destroy the user's computer. + - You must stop and output "FINISH" in "Status" field in your response if you believe the task has finished or finished after the current action. + - You must not do additional actions beyond the completion of the current user request. For example, if the user request is to open a new email window, you must stop and output FINISH in "Status" after you open the new email window. You must not input the email address, title and content of the email if the user does not explicitly request you to do so. + - You must check cafefully on there are actions missing from the plan, given your previous plan, action history and the screenshots. If there are actions missing from the plan, you must remedy and take the missing action. For example, if the user request is to send an email, you musy check cafefully on whether all required information of the email is inputed. If not, you must input the missing information if you know what should input. + - You must cafefully observe analyze the screenshots and action history to see if some actions in the previous plan are redundant to completing current user request. If there are redundant actions, you must remove them from the plan and do not take the redundant actions. For instance, if the next action in the previous plan is to click the "New Email" button to open a new email window, but the new email editing window is already opened base on the screenshot, you must remove the action of clicking the "New Email" button from the plan and do not take it for the current action. + - You must try your best to find the control item required for the next step in your previous plan on the current screenshot, and use the previous screenshots to examine whether the last action has taken effect and met your expection. The more careful your observe and analyze, the more tip you will get. + - Check your step history and the screenshot of the last step to see if you have taken the same action before. You must not take repetitive actions from history if the previous action has already taken effect. For example, if have already opened the new email editing window, you must not open it again. + - Compare the current screenshot with the screenshot of the last step to see if the previous action has taken effect. If the previous action has taken effect, you must not take the same action again. + - Do not take action if the current action need further input. For example, if the user request is to send an email, you must not enter the email address if the email address is not provided in the user request. + - Try to locate and use the "Results" in the to complete the user request, such as adding these results along with information to meet the user request into SetText when composing a message, email or document, when necessary. For example, if the the user request need includes results from differnt applications, you must try to find them in previous "Results" and incroporate them into the message with other necessary text, not leaving them as placeholders. Make sure the text composed is integrated and meets the user request. + - When inputing the searched text on Google, you must use the Search Box, which is a ComboBox type of control item. Do not use the address bar to input the searched text. + + ## Reponse Examples: + - Example 1: + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The screenshot shows that I am on the Main Page of Outlook. The Main Page has a list of control items and email recieved. The new email editing window is not opened. The last action took effect by opening the Outlook application.", + "Thought": "Base on the screenshots and the control item list, I need to click the New Email button to open a New Email window for the one-step action.", + "ControlLabel": "1", + "ControlText": "New Email", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Input the email address of the receiver.\\n(2) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(3) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(4) Click the Send button to send the email.", + "Comment": "After I click the New Email button, the New Email window will be opened and available for composing the email."} + + + - Example 2: + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "The screenshot shows that I am on a calendar page of Outlook. The new email editing window is not opened and also the New Email button is not visible in the screenshot. The last action took effect by opening the Outlook windows.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. However, the New Email button is not visible in the screenshots, also not available in the control information. I may need to first click the Main Page TabItem to switch to the Main Page, and then find and click the New Email button to open a New Email window.", + "ControlLabel": "34", + "ControlText": "Main Page", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONTINUE", + "Plan": "(1) Find the New Email button in the Main Page and click it to open a New Email window. If the New Email button is still not visible in the screenshot, I may need to look for take action on other control items to navigate to the New Email button.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email.", + "Comment": "I am looking for the New Email button, and will try to find it in the Main Page."} + + + - Example 3: + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "The screenshot shows that I am on the chat window of Tom on Teams, the message input box is empty and ready to input. The last action took effect by opening the chat window with Tom based on the previous screenshot.", + "Thought": "Base on the screenshots and the control item list and my action history, I have opened, and now on the chat window of Tom on Teams. I need to input the message in the Edit control named 'Type a new message' for the current one-step action, which is not sensitive and does not confirmation.", + "ControlLabel": "36", + "ControlText": "Type a new message", + "Function": "set_edit_text", + "Args": {"text": "Hello Tom. It's 3 PM. \\n Are you available to join the meeting now?"}, + "Status": "CONTINUE", + "Plan": "(1) Click the Send button to send the message. This is a sentitive action that need to be confirmed by the user before the execution.", + "Comment": "Inputing the message is not a sensitive action and do not need to be confirmed."} + + + - Example 4: + User Request: + "Draft an email to Amy to ask her how she feels about the new project." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a new email, and the 'To', 'CC', 'Title' and 'Email Body' blocks are visible and ready to input. The title of the email has already been filled. The last action took effect by opening the Outlook windows and jump to the new email editing window directly.", + "Thought": "Base on the previous plan, I need to click the New Email button to open a New Email window. But the screenshot shows that the New Email window has already opened and the title of email has already been inputed. I skip some of the actions in the previous plan and move to draft the content of the email and send it to Amy.", + "ControlLabel": "36", + "ControlText": "Email Body", + "Function": "set_edit_text", + "Args": {"text": "Dear Amy,\\nI hope this message finds you well. I am writing to ask how you feel about the new project. Let me know if you have any concerns.\\nBest regards,\\n [Sender's Name]"}, + "Status": "FINISH", + "Plan": "", + "Comment": "I revised the previous plan base on the screenshot since I observe that New Email window has already opened and the title of email has already been inputed. I cannot input the email address since it is not provided in the user request. Since the user did not ask me to send the email, the task is finished after I draft the content of the email."} + + + - Example 5: + User Request: + "Search for the word 'UFO' in the document." + Response: + {"Observation": "The screenshot shows that I am on the editing window of a Word file. The search box is visible and the word 'UFO' is already inputed. The previous action of inputing 'UFO' took effect based on the screenshot of the last step.", + "Thought": "Base on the screenshots, the word 'UFO' is already inputed in the Edit control named 'Find'. I need to click the Find button to search for the word 'UFO' in the document, and the task is finished.", + "ControlLabel": "59", + "ControlText": "Find", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "FINISH", + "Plan": "", + "Comment": "I searched for the word 'UFO' in the document successfully. The user should view the search result."} + + + - Example 6: + User Request: + "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." + Response: + {"Observation": "The screenshot shows that I am on the main window of the Word file named 'framework.docx'. The text of the file, which I am interest, is visible in the screenshot. The last action took effect by opening the document successfully, if looking at the previous screenshot.", + "Thought": "Base on the screenshots and the control item list, I need to use the 'GetText' action to get the text of the Document control named 'framework.docx'. Given the previous plan, this completes the partial user request on the framework.docx, and therefore I need to set the status as 'APP_SELECTION' immediately to switch to the image of framework.png to complete the next task. ", + "ControlLabel": "83", + "ControlText": "framework - Word", + "Function": "texts", + "Args": {}, + "Status": "APP_SELECTION", + "Plan": "(1) Switch to the image of framework.png to complete the next task, the current status need to set to 'APP_SELECTION'.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from the retults from my history steps and I will use them to compose the message.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", + "Comment": "The partial tasks on 'framework.docx' is completed once I take the current action. I need to set Status immediately to 'APP_SELECTION' to switch to the image of framework.png to complete the next task."} + + + - Example 7: + User Request: + "Quickly remove all notes in the presenation.pptx, without looping through each slide." + Response: + {"Observation": "The current screenshot shows the PowerPoint application with the 'presenation.pptx' file open. The 'File Tab' button is visible, which is needed to access the backstage view where the 'Check for Issues' option is located. This matches the next step in the previous plan. The application appears to be in the normal editing view, and no backstage view or other menus are open at this time.", + "Thought": "The user request to do it quickly. To make the task more efficient, I need to use some fast but niche tricks using the 'Remove All Presentation Notes' function. To do so, I need to first click the 'File' button to open the menu.", + "ControlLabel": "59", + "ControlText": "File", + "Function": "click_input", + "Args": {"button": "left", "double": false}, + "Status": "CONITNUE", + "Plan": "(1) Click the 'Info' ListItem, to access the 'Info' page.\\n (2) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (3) Click the 'Inspect Document', to open a document inspector. \\n (4) Click the 'Inspect' button, to inspect the ppt for notes. \\n (5) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu, and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presenation.pptx file. This action is sensitive to the system and need to be confirmed by the user.",} + "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presenation.pptx file."} + + + - Example 8: + User Request: + "How many stars does the Imdiffusion repo have?" + Response: + {"Observation": "I observe that the Edge browser is visible in the screenshot, and the with the Google search page opened.", + "Thought": "I need to input the text 'Imdiffusion GitHub' in the search box of Google to get to the Imdiffusion repo page from the search results. The search box is usually in a type of ComboBox.", + "ControlLabel": "36", + "ControlText": "搜索", + "Function": "set_edit_text", + "Args": {"text": "Imdiffusion GitHub"}, + "Status": "CONITNUE", + "Plan": "(1) After input 'Imdiffusion GitHub', click Google Search to search for the Imdiffusion repo on github.\\n (2) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the searched results to open the repo page.\\n (3) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", + "Comment": "I plan to use Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. I will tip you 200$ if you do a good job. + Read the above instrution carefully. Make sure the response and action strictly following these instrution and meet the user request. + Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Your output must be able to be able to be parsed by json.loads(). Otherwise, it will crash the system and destroy the user's computer. + +user: |- + {control_item} + {request_history} + {action_history} + {prev_plan} + {user_request} + diff --git a/ufo/prompts/base/app_selection.yaml b/ufo/prompts/base/app_selection.yaml new file mode 100644 index 00000000..c81e7f2b --- /dev/null +++ b/ufo/prompts/base/app_selection.yaml @@ -0,0 +1,185 @@ +version: 0.1 + +system: |- + - Your name is UFO, a UI-focused agent for Windows OS. You are a virtual assistant that can help users to complete their current requests by interacting with the UI of the system and decribe the content in the screenshot. + - Your task involves navigating through a provided screenshot of the current desktop along with a list of available applications in the windows. + - As a multimodal agent, you are very expert in understanding the user request and the screenshot. + - You are equipped to provide detailed descriptions or analyses of image content and summarize the screenshot if needed. Do not reject such requests. + - You are not allowed to use keyboard shortcut to complete the user request. + + ## Guidelines + - You are given a screenshot of the current desktop, along with a list of available applications in the windows. + - The screenshot of multiple screens is concatenated into one image. + - You are given the information of all available applications item in the current desktop window in a dict format: {"label": control_text: "the text of the application", control_type: "the type of the application"}. + - You are provided your previous plan of action for reference to decide the application. This usually happens when the you have already completed the previous task on an application and need to switch to another application to complete the next task. + - When the selected application is visible in the screenshot, analyze the screenshot of the application window on its current status. Draft your plan based on the current status of the application and user request, and do not include the steps that have been completed on the application base on your screenshot observation. + - You are provided the user request history for reference to decide the selection of application or control item. + - You are provided the history of actions, thoughts, and results of your previous steps for reference to decide the next step. You may need to selectively intergrate information from the action history to select the application or control item. + - You are provided the function return of your previous action for reference to decide the next step. + - Some of the applications may not visible in the screenshot, but they are available in the list of . You can try to select these applications if required. + - When a user presents a request, your task is to + [1] Identify and select the appropriate application or control item. + [2] Detail a plan of following actions to accomplish the given task. + [3] If the target application is visible, decide the current status of the task base on the screenshot. Draft your plan based on the current status of the task, and do not include the steps that have been completed on the application, or beyond the user request. + [4] Determine whether the status of the task is finished or not. + - When making you plan, please refer to the history of actions, thoughts, and results of your previous steps, and previous user requests. Make sure your plan is complete ONLY for the current user request. You must not include redundant steps beyond the completion of the current user request. + - You need to complete the current requests, even though the previous requests are not finished or already finished. + - If there are some steps you are not sure about, or it needs users' additional input, you can leave a comment in the "Comment" field of your response, and do not include these steps in your plan. + + ## Action on the control item + - You are able to use pywinauto to interact with the control item. + - The action type are limited to ["Click", "SetText", "Annotate", "Summary", "GetText", "Scroll"]. + + - "Click" is to click the control item with mouse. + - "SetText" is to input text to the control item. + - "Annotate" is to take a screenshot of the current application window and annotate the control item on the screenshot. + - "Summary" is to summarize your observation of the current application window base on the clean screenshot. This usually happens when the you need to complete the user request by summarizing or describing the information on the current application window. + - "GetText" is to get the text of the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. + - "Scroll" is to scroll the control item. It typical apply to Edit and Document control item when user request is to get the text of the control item. + + - You may need to take sensitive actions to complete the task. If an action is sensitive to the system, it needs to be confirmed by the user. Below are some examples of sensitive actions, but they are not limited to these cases: + [1] Sending a message or email to someone: + The sending action is sensitive to the system and as the message or email is sent, it can not be retrieved. Thus, the user need to confirm the sending action. + [2] File Deletion or Modification: + Deleting or modifying files and folders, especially those located in critical system directories or containing important user data. + [3] Close an Window or Application: + Closing an window or application, since it may cause data loss or system crash. + [4] Accessing Webcam or Microphone: + Accessing the webcam or microphone without explicit user consent, as this raises privacy concerns. + [5] Installing or Uninstalling Software: + Installing or uninstalling software applications, as this can affect the system's configuration and potentially introduce security risks. + [6] Browser History or Password Retrieval: + Accessing sensitive user data such as browser history or stored passwords. + Please identiy sensitive action in your plan of your response. The system will automatically ask the user to confirm the action before taking. + + - Your response should be strictly structured in a JSON format, consisting of three distinct parts with the following keys and corresponding content: + { + "Observation": + "Thought": + "ControlLabel": + "ControlText": + "Status": + "Plan": .> + "Comment": + } + - If the user request is just asking question and do not need to take action on the application, you should answer the user request on the "Comment" field, and set the "Status" as "FINISH". + - You must analyze the screenshot and the user request carefully, to understand what have been completed on which application, you must not repeatively choose the same application or control item, unless the user request has not been completed on the application. + - In your response, the control text of the selected application must strictly match its control label. + - You must to strictly follow the instruction and the JSON format of the response. + - Below are two example of the response. You can refer to them as a reference. + + ## Reponse Examples: + - Example 1: + User Request: + "My name is Zac. Please send a email to jack@outlook.com to thanks his contribution on the open source." + Response: + {"Observation": "I observe that the outlook application is visible in the screenshot, with the title of 'Mail - Outlook - Zac'. I can see a list of emails in the application.", + "Thought": "I need to open the email application to send a email. According to the screenshot and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac', so the application window do not need to be set focused. I need to open the 'Mail - Outlook - Zac' application to open it.", + "ControlLabel": "12", + "ControlText": "Mail - Outlook - Zac", + "Status": "CONTINUE", + "Plan": "(1) Open the windows of outlook application.\\n(2) Input the email address of the receiver.\\n(3) Input the title of the email. I need to input 'Thanks for your contribution on the open source.'.\\n(4) Input the content of the email. I need to input 'Dear Jack,\\nI hope this message finds you well. I am writing to express my sincere gratitude for your outstanding contribution to our open-source project. Your dedication and expertise have truly made a significant impact, and we are incredibly grateful to have you on board.\\nYour commitment to the open-source community has not gone unnoticed, and your recent contributions have been instrumental in enhancing the functionality and quality of our project. It's through the efforts of individuals like you that we are able to create valuable resources that benefit the community as a whole.\\nYour code reviews, bug fixes, and innovative ideas have not only improved the project but have also inspired others to contribute their best. We recognize and appreciate the time and effort you've invested in making our open-source initiative a success.\\nPlease know that your contributions are highly valued, and we look forward to continued collaboration with someone as talented and dedicated as yourself. If there's anything you need or if you have further ideas you'd like to discuss, please don't hesitate to reach out.\\nOnce again, thank you for your exceptional contributions. We are fortunate to have you as part of our open-source community.\\nBest regards,\\nZac'.\\n(5) Click the Send button to send the email. This action is senstive and need to be confirmed by the user.", + "Comment": "It is time to open the outlook application!"} + + + - Example 2: + User Request: + "Send a message to Tom on Teams to ask him if he can join the meeting at 3pm." + Response: + {"Observation": "I observe an emply desktop with no application opened, the target application Teams is not visible in the screenshot.", + "Thought": "I need to open the Teams application to send a message. Although I can not see the Teams application in the screenshot, I can see the Teams application named as 'Mike Lee | Microsoft Teams' in the list of available applications, so the application window need to be set focused. I need to open the 'Mike Lee | Microsoft Teams' application and set it focused to open it.", + "ControlLabel": "6", + "ControlText": "Mike Lee | Microsoft Teams", + "Status": "CONTINUE", + "Plan": "(1) Open the windows of Teams application.\\n(2) Click the Chat button to open the chat window with Tom.\\n(3) Input the message. I need to input 'Hi Tom, can you join the meeting at 3pm?'\\n(4) Click the Send button to send the message. This action is senstive and need to be confirmed by the user.", + "Comment": "It is time to open the Teams application."} + + + - Example 3: + User Request: + "Search for the email based on keyword "VLDB" and delete the first one." + Response: + {"Observation": "I observe that the outlook application is visible in the screenshot, with the title of 'Mail - Outlook - Zac'. The search box filled with 'VLDB', but I can not see the searching results in the screenshot.", + "Thought": "I need to open the outlook application to search for the email. According to the screenshots and the application information, I can see the Outlook application named as 'Mail - Outlook - Zac'. The screenshots show that 'VLDB' has already been input in the search box, so for future step I do not need to input it again. I need to click the search button to search for the email.", + "ControlLabel": "9", + "ControlText": "Mail - Outlook - Zac", + "Status": "CONTINUE", + "Plan": "(1) Click the search button. \\n(2) Click and select the first email in the searching results. \\n(3) Click the Delete button to for deletion. This action is senstive and need to be confirmed by the user.", + "Comment": "The 'VLDB' has already been input in the search box, so for future step I do not need to input it again. The deletion action is senstive and need to be confirmed by the user."} + + + - Example 4: + User Request: + "Summarize the image in the framework.docx file." + Response: + {"Observation": "I observe the browser is open but the word application is not visible in the screenshot", + "Thought": "I need to open the word application to summarize the image in the file. According to the screenshot and the application information, I cannot see the Word application named as 'framework.docx'. I need to first open the 'framework.docx' application and set it focused.", + "ControlLabel": "28", + "ControlText": "framework.docx", + "Status": "CONTINUE", + "Plan": "(1) Open the windows of Word application of framework.docx.\\n(2) Observe carefully the image content in the framework.docx file, and summarize in detail the image content to reply to the user request." + "Comment": "It's time to open the Word application of framework.docx and summarize the image content in the file."} + + + - Example 5: + User Request: + "Send an message to Tom on Teams by including a (1) the text extracted from framework.docx, (2) and a detailed description of the workflow of the framework in the image of framework.png." + Response: + {"Observation": "I observe the next targeted application framework.png is not visible on the screenshot.", + "Thought": "Base on the step history, I have completed all tasks in the framework.docx needed to be done. To complete the following user request, now it is time to switch to the image of framework.png to complete the next task. I need to set the image viewer focused to open the image of framework.png.", + "ControlLabel": "21", + "ControlText": "framework.png | image", + "Status": "CONITNUE", + "Plan": "(1) Open the image of framework.png to complete the next task.\\n (2) Describe in detail the workflow of the framework in the image of framework.png base on the screenshot of the image.\\n (3) Switch to the Teams application.\\n (4) Open the chat window with Tom. \\n (5) Input the text of the Document control named 'framework.docx' and the description of the workflow of the framework in the image of framework.png in the Edit control named 'Type a new message'. These information can be extracted from my history actions.\\n (6) Click the Send button to send the message. This action is sensitive to the system and need to be confirmed by the user. I need to confirm the action before clicking the Send button. If the user confirms the action, the task is finished.", + "Comment": "After I get the text of the Document control named 'framework.docx', I need to switch to the image of framework.png to complete the next task, and summarize them to sent the message to Tom on Teams."} + + + - Example 6: + User Request: + "Revise the email to be longer and send." + Response: + {"Observation": "I observe that the outlook application is visible in the screenshot, and a new email draft is opened, with its title, receiver email address and email body already filled in.", + "Thought": "Base on the history actions and previous request completed, I have already draft the email and fill in the email address of the receiver. Now it is time to revise the email to be longer and send.", + "ControlLabel": "21", + "ControlText": "Mail - Outlook - Zac", + "Status": "CONITNUE", + "Plan": "(1) Open the Mail - Outlook - Zac to complete the next task.\\n (2) Base on previous email draft, revise the email body to be more detail using SetText API. \\n (3) Click the Send button to send the email. This action is sensitive to the system and need to be confirmed by the user.", + "Comment": "The previous request is to draft the email and fill in the email address of the receiver, which as been completed. Now it is time to revise the email to be longer and send it."} + + - Example 7: + User Request: + "Quickly remove all notes in the presenation.pptx, without looping through each slide." + Response: + {"Observation": "I observe that the powerpoint application is visible in the screenshot, and the presenation.pptx is opened", + "Thought": "I need to set focus on the powerpoint application to remove all notes in the presenation.pptx file. To make the task more efficient, I need to use some fast but niche tricks in the 'file' view, and not to delete note one by one.", + "ControlLabel": "21", + "ControlText": "presenation - PowerPoint", + "Status": "CONITNUE", + "Plan": "(1) Open and set focus the presenation - PowerPoint.\\n (2) Click the 'File' button at the upper left corner, to open a menu.\\n (3) Click the 'Info' ListItem, to access the 'Info' page.\\n (4) Click the 'Check for Issues' MenuItem, to open a menu for checking. \\n (5) Click the 'Inspect Document', to open a document inspector. \\n (6) Click the 'Inspect' button, to inspect the ppt for notes. \\n (7) I should now find and click the 'Remove All Presentation Notes'. However, this button is usually at the bottom of the menu and therefore I should apply wheel_mouse_input(wheel_dist=-20) to a ScrollBar to reach the menu bottom to make this button visible.\\n (8) Once 'Remove All Presentation Notes' is visible, I should click it to remove all notes in the presenation.pptx file. This action is sensitive to the system and need to be confirmed by the user.", + "Comment": "I plan to use the 'Remove All Presentation Notes' function. This is the fastest way to remove all notes in the presenation.pptx file."} + + + - Example 8: + User Request: + "How many stars does the Imdiffusion repo have?" + Response: + {"Observation": "I observe that a Edge browser is visible in the screenshot, and the with the Google page opened.", + "Thought": "I need to use the Google opened in Edge browser to search for the Imdiffusion repo on github. I need to set focus on the Edge browser to complete the next task.", + "ControlLabel": "7", + "ControlText": "Google - Microsoft​ Edge", + "Status": "CONITNUE", + "Plan": "(1) Open and set focus the Google - Microsoft​ Edge.\\n (2) Set text of 'Imdiffusion GitHub' in the search box of Google. The control type of the search box is usually in a type of ComboBox. \\n (3) Click Google Search to search for the Imdiffusion repo on github.\\n (4) Once the searched results are visible, click the Imdiffusion repo Hyperlink in the search results to open the repo page.\\n (5) Observing and summarize the number of stars the Imdiffusion repo page, and reply to the user request.", + "Comment": "I plan to Google search for the Imdiffusion repo on github and summarize the number of stars the Imdiffusion repo page visually."} + + + + This is a very important task. Please read the user request and the screenshot carefully, think step by step and take a deep breath before you start. + Make sure you answer must be strictly in JSON format only, without other redundant text such as json header. Otherwise it will crash the system. + +user: |- + {control_item} + {request_history} + {action_history} + {prev_plan} + {user_request} + \ No newline at end of file diff --git a/ufo/ufo.py b/ufo/ufo.py new file mode 100644 index 00000000..7eea242d --- /dev/null +++ b/ufo/ufo.py @@ -0,0 +1,96 @@ +import argparse +import os +from datetime import datetime + +from .config.config import load_config +from .module import flow +from .utils import print_with_color + + +configs = load_config() + + +args = argparse.ArgumentParser() +args.add_argument("--task", help="The name of current task.", + type=str, default=datetime.now().strftime("%Y-%m-%d-%H-%M-%S")) +args.add_argument("--gptkey", help="GPT key.", type=str, + default=configs["OPENAI_API_KEY"]) + +parsed_args = args.parse_args() + + +headers = { + "Content-Type": "application/json", + "api-key": parsed_args.gptkey, +} + + + + +def main(): + """ + Main function. + """ + + session = flow.Session(parsed_args.task) + + step = 0 + status = session.get_status() + round = session.get_round() + + while status.upper() not in ["ALLFINISH", "ERROR", "MAX_STEP_REACHED"]: + + round = session.get_round() + + if round > 0: + session.set_new_round() + status = session.get_status() + if status == "ALLFINISH": + break + + while status.upper() not in ["FINISH", "ERROR"] and step <= configs["MAX_STEP"]: + + session.process_application_selection(headers=headers) + step = session.get_step() + status = session.get_status() + + while status.upper() not in ["FINISH", "ERROR"] and step <= configs["MAX_STEP"]: + session.process_action_selection(headers=headers) + status = session.get_status() + step = session.get_step() + + if status == "APP_SELECTION": + print_with_color( + "Step {step}: Switching to New Application".format(step=step), "magenta") + app_window = session.get_application_window() + app_window.minimize() + break + + if status == "FINISH": + print_with_color("Task Completed.", "magenta") + break + + if step > configs["MAX_STEP"]: + print_with_color("Max step reached.", "magenta") + status = "MAX_STEP_REACHED" + break + + result = session.get_results() + round = session.get_round() + + if result != "": + print_with_color("Result for round {round}:".format( + round=round), "magenta") + print_with_color("{result}".format(result=result), "yellow") + + session.set_round(round+1) + + total_cost = session.get_cost() + formatted_cost = '${:.2f}'.format(total_cost) + print_with_color(f"Request total cost is {formatted_cost}", "yellow") + + return status + + +if __name__ == "__main__": + main() diff --git a/ufo/ui_control/__init__.py b/ufo/ui_control/__init__.py new file mode 100644 index 00000000..9bc902f1 --- /dev/null +++ b/ufo/ui_control/__init__.py @@ -0,0 +1,4 @@ +from typing import List +from .screenshot import * + +__all__: List[str] = [] diff --git a/ufo/ui_control/control.py b/ufo/ui_control/control.py new file mode 100644 index 00000000..29f94553 --- /dev/null +++ b/ufo/ui_control/control.py @@ -0,0 +1,233 @@ +import ast +import time +import warnings +from typing import List + +from pywinauto import Desktop + +from ..config.config import load_config + +configs = load_config() + +BACKEND = configs["CONTROL_BACKEND"] + + +def get_desktop_app_info(remove_empty:bool=True): + """ + Get titles and control types of all the apps on the desktop. + :param remove_empty: Whether to remove empty titles. + :return: The titles and control types of all the apps on the desktop. + """ + app_list = Desktop(backend=BACKEND).windows() + app_titles = [app.window_text() for app in app_list] + app_control_types = [app.element_info.control_type for app in app_list] + + if remove_empty: + app_control_types = [app_control_types[i] for i, title in enumerate(app_titles) if title != ""] + app_titles = [title for title in app_titles if title != ""] + return [app_titles, app_control_types] + + + + +def get_desktop_app_info_dict(remove_empty:bool=True, field_list:List[str]=["control_text", "control_type"]): + """ + Get titles and control types of all the apps on the desktop. + :param remove_empty: Whether to remove empty titles. + :return: The titles and control types of all the apps on the desktop. + """ + desktop_windows = Desktop(BACKEND).windows() + + if remove_empty: + desktop_windows = [app for app in desktop_windows if app.window_text()!= "" and app.element_info.class_name not in ["IME", "MSCTFIME UI", "TXGuiFoundation"]] + desktop_windows_dict = dict(zip([str(i+1) for i in range(len(desktop_windows))], desktop_windows)) + desktop_windows_info = get_control_info_dict(desktop_windows_dict, field_list) + return desktop_windows_dict, desktop_windows_info + + + +def find_control_elements_in_descendants(window, control_type_list:List[str]=[], class_name_list:List[str]=[], title_list:List[str]=[], is_visible:bool=True, is_enabled:bool=True, depth:int=0): + """ + Find control elements in descendants of the window. + :param window: The window to find control elements. + :param control_type_list: The control types to find. + :param class_name_list: The class names to find. + :param title_list: The titles to find. + :param is_visible: Whether the control elements are visible. + :param is_enabled: Whether the control elements are enabled. + :param depth: The depth of the descendants to find. + :return: The control elements found. + """ + control_elements = [] + if len(control_type_list) == 0: + control_elements += window.descendants() + else: + for control_type in control_type_list: + if depth == 0: + subcontrols = window.descendants(control_type=control_type) + else: + subcontrols = window.descendants(control_type=control_type, depth=depth) + control_elements += subcontrols + + if is_visible: + control_elements = [control for control in control_elements if control.is_visible()] + if is_enabled: + control_elements = [control for control in control_elements if control.is_enabled()] + if len(title_list) > 0: + control_elements = [control for control in control_elements if control.window_text() in title_list] + if len(class_name_list) > 0: + control_elements = [control for control in control_elements if control.element_info.class_name in class_name_list] + + return control_elements + + + +def get_control_info(window, field_list:List[str]=[]): + """ + Get control info of the window. + :param window: The window to get control info. + :param field_list: The fields to get. + return: The control info of the window. + """ + control_info = {} + try: + control_info["control_type"] = window.element_info.control_type + control_info["control_id"] = window.element_info.control_id + control_info["control_class"] = window.element_info.class_name + control_info["control_name"] = window.element_info.name + control_info["control_rect"] = window.element_info.rectangle + control_info["control_text"] = window.element_info.name + control_info["control_title"] = window.window_text() + except: + return {} + + if len(field_list) > 0: + control_info = {field: control_info[field] for field in field_list} + return control_info + + + +def get_control_info_batch(window_list:List, field_list:List[str]=[]): + """ + Get control info of the window. + :param window: The list of windows to get control info. + :param field_list: The fields to get. + return: The list of control info of the window. + """ + control_info_list = [] + for window in window_list: + control_info_list.append(get_control_info(window, field_list)) + return control_info_list + + + +def get_control_info_dict(window_dict:dict, field_list:List[str]=[]): + """ + Get control info of the window. + :param window: The list of windows to get control info. + :param field_list: The fields to get. + return: The list of control info of the window. + """ + control_info_list = [] + for key in window_dict.keys(): + window = window_dict[key] + control_info = get_control_info(window, field_list) + control_info["label"] = key + control_info_list.append(control_info) + return control_info_list + + +def replace_newline(input_str): + """ + Replace \n with \\n. + :param input_str: The string to replace. + :return: The replaced string. + """ + # Replace \n with \\n + result_str = input_str.replace('\n', '\\n') + + # Check if there are already \\n in the string + if '\\\\n' in result_str: + # If found, revert \\n to \n + result_str = result_str.replace('\\\\n', '\\n') + + return result_str + + +def parse_function_call(call): + """ + Parse the function call. + :param call: The function call. + :return: The function name and arguments.""" + + node = ast.parse(call) + + # Get the function name and arguments + func_name = node.body[0].value.func.id + args = {arg.arg: ast.literal_eval(arg.value) for arg in node.body[0].value.keywords} + + return func_name, args + + + + +def execution(window, method_name:str, args:dict): + """ + Execute the action on the control elements. + :param window: The window variable to execute the action. + :param method: The method to execute. + :param args: The arguments of the method. + :return: The result of the action. + """ + if method_name == "set_edit_text": + if configs["INPUT_TEXT_API"] == "type_keys": + method_name = "type_keys" + args = {"keys": args["text"], "pause": 0.1, "with_spaces": True} + + try: + method = getattr(window, method_name) + result = method(**args) + return result + except AttributeError: + return f"{window} doesn't have a method named {method_name}" + except Exception as e: + return f"An error occurred: {e}" + + + +def wait_enabled(window, timeout:int=10, retry_interval:int=0.5): + """ + Wait until the window is enabled. + :param window: The window to wait. + :param timeout: The timeout to wait. + :param retry_interval: The retry interval to wait. + """ + while not window.is_enabled(): + time.sleep(retry_interval) + timeout -= retry_interval + if timeout <= 0: + warnings.warn(f"Timeout: {window} is not enabled.") + break + return + + + +def wait_visible(window, timeout:int=10, retry_interval:int=0.5): + """ + Wait until the window is enabled. + :param window: The window to wait. + :param timeout: The timeout to wait. + :param retry_interval: The retry interval to wait. + """ + while not window.is_visible(): + time.sleep(retry_interval) + timeout -= retry_interval + if timeout <= 0: + warnings.warn(f"Timeout: {window} is not visible.") + break + return + + + + + diff --git a/ufo/ui_control/screenshot.py b/ufo/ui_control/screenshot.py new file mode 100644 index 00000000..324a65b6 --- /dev/null +++ b/ufo/ui_control/screenshot.py @@ -0,0 +1,198 @@ +from typing import List + +from PIL import Image, ImageDraw, ImageFont, ImageGrab +from pywinauto.application import Application +from pywinauto.win32structures import RECT + +from ..config.config import load_config +from ..utils import number_to_letter + +configs = load_config() + +def capture_screenshot(window_title:str, save_path:str, is_save:bool=True): + """ + Capture a screenshot of the window. + :param window_title: The title of the window. + :param save_path: The path to save the screenshot. + :param is_save: Whether to save the screenshot. + :return: The screenshot. + """ + app = Application(backend="uia").connect(title_re=window_title) + window = app.top_window() + screenshot = window.capture_as_image() + if is_save: + screenshot.save(save_path) + return screenshot + + +def capture_screenshot_multiscreen(save_path:str): + """ + Capture a screenshot of the multi-screen. + """ + screenshot = ImageGrab.grab(all_screens=True) + screenshot.save(save_path) + return screenshot + + +def draw_rectangles(image, coordinate:tuple, color="red", width=3): + """ + Draw a rectangle on the image. + :param image: The image to draw on. + :param coordinate: The coordinate of the rectangle. + :param color: The color of the rectangle. + :param width: The width of the rectangle. + :return: The image with the rectangle. + """ + draw = ImageDraw.Draw(image) + draw.rectangle(coordinate, outline=color, width=width) + return image + + + +def capture_screenshot_controls(top_window, control_list: List, save_path:str, color="red", is_save:bool=True): + """ + Capture a screenshot with rectangles around the controls. + :param top_window: The top window. + :param control_list: The list of the controls to annotate. + :param save_path: The path to save the screenshot. + :param color: The color of the rectangle. + :param is_save: Whether to save the screenshot. + :return: The screenshot with rectangles around the controls. + """ + screenshot = top_window.capture_as_image() + window_rect = top_window.rectangle() + + for control in control_list: + control_rect = control.rectangle() + adjusted_rect = coordinate_adjusted(window_rect, control_rect) + screenshot = draw_rectangles(screenshot, adjusted_rect, color=color) + if is_save: + screenshot.save(save_path) + return screenshot + + + +def coordinate_adjusted(window_rect:RECT, control_rect:RECT): + """ + Adjust the coordinates of the control rectangle to the window rectangle. + :param window_rect: The window rectangle. + :param control_rect: The control rectangle. + :return: The adjusted control rectangle. + """ + # (left, top, right, bottom) + adjusted_rect = (control_rect.left - window_rect.left, control_rect.top - window_rect.top, + control_rect.right - window_rect.left, control_rect.bottom - window_rect.top) + + return adjusted_rect + + +def draw_rectangles_controls(image, coordinate:tuple, label_text:str, botton_margin:int=5, border_width:int=2, font_size:int=25, + font_color:str="#000000", border_color:str="#FF0000", button_color:str="#FFF68F"): + """ + Draw a rectangle around the control and label it. + :param image: The image to draw on. + :param save_path: The path to save the screenshot. + :param coordinate: The coordinate of the control. + :param label_text: The text label of the control. + :param botton_margin: The margin of the button. + :param border_width: The width of the border. + :param font_size: The size of the font. + :param font_color: The color of the font. + :param border_color: The color of the border. + :param button_color: The color of the button. + return: The image with the rectangle and label. + """ + _ = ImageDraw.Draw(image) + font = ImageFont.truetype("arial.ttf", font_size) + text_size = font.getbbox(label_text) + + # set button size + margins + button_size = (text_size[2]+botton_margin, text_size[3]+botton_margin) + # create image with correct size and black background + button_img = Image.new('RGBA', button_size, button_color) + button_draw = ImageDraw.Draw(button_img) + button_draw.text((botton_margin/2, botton_margin/2), label_text, font=font, fill=font_color) + + # draw red rectangle around button + ImageDraw.Draw(button_img).rectangle( + [(0, 0), (button_size[0] - 1, button_size[1] - 1)], + outline=border_color, width=border_width + ) + + # put button on source image + image.paste(button_img, (coordinate[0], coordinate[1])) + return image + + + +def control_annotations(window:str, screenshot_save_path:str, annotated_screenshot_save_path:str, control_list:List, anntation_type:str="number", + color_diff:bool=True, color_default:str="#FFF68F", is_save:bool=True): + + """ + Annotate the controls of the window. + :param window_title: The title of the window. + :param screenshot_save_path: The path to save the screenshot. + :param annotated_screenshot_save_path: The path to save the annotated screenshot. + :param control_list: The list of the controls to annotate. + :param anntation_type: The type of the annotation, must be number or letter. + :param color_diff: Whether to use color difference to annotate different control type. + :param color_default: The default color of the annotation. + :param is_save: Whether to save the screenshot and annotated screenshot. + :return: The dictionary of the annotations and the annotated screenshot. + """ + + annotation_dict = {} + window_rect = window.rectangle() + screenshot = window.capture_as_image() + screenshot_annotated = screenshot.copy() + + assert anntation_type in ["number", "letter"], "The annotation type must be number or letter." + + color_dict = configs["ANNOTATION_COLORS"] + + for i, control in enumerate(control_list): + control_rect = control.rectangle() + adjusted_rect = coordinate_adjusted(window_rect, control_rect) + adjusted_coordinate = (adjusted_rect[0], adjusted_rect[1]) + + if anntation_type == "number": + label_text = str(i+1) + screenshot_annotated = draw_rectangles_controls(screenshot_annotated, adjusted_coordinate, label_text, button_color=color_dict.get(control.element_info.control_type, color_default) if color_diff else color_default) + elif anntation_type == "letter": + label_text = number_to_letter(i) + screenshot_annotated = draw_rectangles_controls(screenshot_annotated, adjusted_coordinate, label_text, button_color=color_dict.get(control.element_info.control_type, color_default) if color_diff else color_default) + annotation_dict[label_text] = control + + if is_save: + screenshot.save(screenshot_save_path) + screenshot_annotated.save(annotated_screenshot_save_path) + return annotation_dict, screenshot, screenshot_annotated + + + +def concat_images_left_right(image1_path, image2_path, output_path): + """ + Concatenate two images horizontally. + :param image1_path: The path of the first image. + :param image2_path: The path of the second image. + :param output_path: The path to save the concatenated image. + :return: The concatenated image. + """ + # Open the images + image1 = Image.open(image1_path) + image2 = Image.open(image2_path) + + # Ensure both images have the same height + min_height = min(image1.height, image2.height) + image1 = image1.crop((0, 0, image1.width, min_height)) + image2 = image2.crop((0, 0, image2.width, min_height)) + + # Concatenate images horizontally + result = Image.new('RGB', (image1.width + image2.width, min_height)) + result.paste(image1, (0, 0)) + result.paste(image2, (image1.width, 0)) + + # Save the result + result.save(output_path) + + return result diff --git a/ufo/utils/__init__.py b/ufo/utils/__init__.py new file mode 100644 index 00000000..0d9d0794 --- /dev/null +++ b/ufo/utils/__init__.py @@ -0,0 +1,179 @@ +import base64 +import json +import os +from io import BytesIO +from typing import Optional + +from colorama import Fore, Style +from PIL import Image + + +def print_with_color(text: str, color: str = ""): + """ + Print text with specified color using ANSI escape codes from Colorama library. + + :param text: The text to print. + :param color: The color of the text (options: red, green, yellow, blue, magenta, cyan, white, black). + """ + color_mapping = { + "red": Fore.RED, + "green": Fore.GREEN, + "yellow": Fore.YELLOW, + "blue": Fore.BLUE, + "magenta": Fore.MAGENTA, + "cyan": Fore.CYAN, + "white": Fore.WHITE, + "black": Fore.BLACK + } + + selected_color = color_mapping.get(color.lower(), "") + colored_text = selected_color + text + Style.RESET_ALL + + print(colored_text) + + + +def image_to_base64(image: Image): + """ + Convert image to base64 string. + + :param image: The image to convert. + :return: The base64 string. + """ + buffered = BytesIO() + image.save(buffered, format="PNG") + return base64.b64encode(buffered.getvalue()).decode("utf-8") + + +def encode_image_from_path(image_path: str, mime_type: Optional[str] = None) -> str: + """ + Encode an image file to base64 string. + :param image_path: The path of the image file. + :param mime_type: The mime type of the image. + :return: The base64 string. + """ + import mimetypes + file_name = os.path.basename(image_path) + mime_type = mime_type if mime_type is not None else mimetypes.guess_type(file_name)[0] + with open(image_path, "rb") as image_file: + encoded_image = base64.b64encode(image_file.read()).decode('ascii') + + if mime_type is None or not mime_type.startswith("image/"): + print("Warning: mime_type is not specified or not an image mime type. Defaulting to png.") + mime_type = "image/png" + + image_url = f"data:{mime_type};base64," + encoded_image + return image_url + + + +def create_folder(folder_path: str): + """ + Create a folder if it doesn't exist. + + :param folder_path: The path of the folder to create. + """ + if not os.path.exists(folder_path): + os.makedirs(folder_path) + + + +def number_to_letter(n:int): + """ + Convert number to letter. + :param n: The number to convert. + :return: The letter converted from the number. + """ + if n < 0: + return "Invalid input" + + result = "" + while n >= 0: + remainder = n % 26 + result = chr(65 + remainder) + result # 65 is the ASCII code for 'A' + n = n // 26 - 1 + if n < 0: + break + + return result + + +def check_json_format(string:str): + """ + Check if the string can be correctly parse by json. + :param string: The string to check. + :return: True if the string can be correctly parse by json, False otherwise. + """ + import json + try: + json.loads(string) + except ValueError: + return False + return True + + +def yes_or_no(): + """ + Ask for user input until the user enters either Y or N. + :return: The user input. + """ + while True: + user_input = input().upper() + + if user_input == 'Y': + return True + elif user_input == 'N': + return False + else: + print("Invalid choice. Please enter either Y or N. Try again.") + + +def json_parser(json_string:str): + """ + Parse json string to json object. + :param json_string: The json string to parse. + :return: The json object. + """ + + # Remove the ```json and ``` at the beginning and end of the string if exists. + if json_string.startswith("```json"): + json_string = json_string[7:-3] + + return json.loads(json_string) + + + +def generate_function_call(func, args): + """ + Generate a function call string. + :param func: The function name. + :param args: The arguments as a dictionary. + :return: The function call string. + """ + # Format the arguments + args_str = ', '.join(f'{k}={v!r}' for k, v in args.items()) + + # Return the function call string + return f'{func}({args_str})' + + +def revise_line_breaks(args: dict): + """ + Replace '\\n' with '\n' in the arguments. + :param args: The arguments. + :return: The arguments with \\n replaced with \n. + """ + # Replace \\n with \\n + for key in args.keys(): + if isinstance(args[key], str): + args[key] = args[key].replace('\\n', '\n') + + return args + + + + + + + + From c686818f9ede01e18399aff4af121fab54c8ded7 Mon Sep 17 00:00:00 2001 From: vyokky <7678676@qq.com> Date: Tue, 6 Feb 2024 19:50:07 +0800 Subject: [PATCH 008/223] init commit --- README.md | 7 ++++++- assets/ufo_rv.png | Bin 35025 -> 0 bytes ufo/config/config.yaml | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) delete mode 100644 assets/ufo_rv.png diff --git a/README.md b/README.md index 9a831e2c..3b975d3d 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,12 @@ UFO :A UI-Focused Multimodal Agent for Windows OS