diff --git a/.github/workflows/compile.yml b/.github/workflows/compile.yml index 736073f..2638364 100644 --- a/.github/workflows/compile.yml +++ b/.github/workflows/compile.yml @@ -18,11 +18,11 @@ jobs: - uses: actions/checkout@v2 with: submodules: "recursive" - - name: Compiles (MQL4) - uses: fx31337/mql-compile-action@master - with: - path: MT4.mq4 - verbose: true + # - name: Compiles (MQL4) + # uses: fx31337/mql-compile-action@master + # with: + # path: server/MQL4/wisefinance-socket-server.mq4 + # verbose: true - name: Compiles (MQL5) uses: fx31337/mql-compile-action@master with: diff --git a/.github/workflows/metatrader5.yml b/.github/workflows/metatrader5.yml index d91bdea..002d682 100644 --- a/.github/workflows/metatrader5.yml +++ b/.github/workflows/metatrader5.yml @@ -1,9 +1,6 @@ name: Push MetaTrader5 Release to Docker Hub on: - push: - branches: - - main release: types: - created @@ -18,14 +15,14 @@ jobs: - name: Checkout code uses: actions/checkout@v2 - - name: Check if MT5 folder has changed + - name: Check if MQL5 folder has changed id: folder-changed run: | - if git diff --quiet HEAD^ HEAD -- MT5/; then - echo "MT5 folder has not changed" + if git diff --quiet HEAD^ HEAD -- server/MQL5/; then + echo "MQL5 folder has not changed" echo "FOLDER_CHANGED=false" >> $GITHUB_OUTPUT else - echo "MT5 folder has changed" + echo "MQL5 folder has changed" echo "FOLDER_CHANGED=true" >> $GITHUB_OUTPUT fi @@ -37,7 +34,7 @@ jobs: DOCKER_REPO: metatrader DOCKER_TAG: 5 run: | - docker build -t $DOCKER_REPO:$DOCKER_TAG -f MT5/Dockerfile.MetaTrader5 ./MT5 + docker build -t $DOCKER_REPO:$DOCKER_TAG -f server/MQL5/Dockerfile.MetaTrader5 ./server/MQL5 docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD docker tag $DOCKER_REPO:$DOCKER_TAG $DOCKER_USERNAME/$DOCKER_REPO:$DOCKER_TAG docker push $DOCKER_USERNAME/$DOCKER_REPO:$DOCKER_TAG diff --git a/.gitignore b/.gitignore index ab0c3b9..be76434 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ samples .\...config.json .local.session.sql + +resources/ diff --git a/resources/MT4-Ticks-To-MT5/.github/ISSUE_TEMPLATE/bug_report.md b/resources/MT4-Ticks-To-MT5/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index dd84ea7..0000000 --- a/resources/MT4-Ticks-To-MT5/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/resources/MT4-Ticks-To-MT5/.github/ISSUE_TEMPLATE/custom.md b/resources/MT4-Ticks-To-MT5/.github/ISSUE_TEMPLATE/custom.md deleted file mode 100644 index 48d5f81..0000000 --- a/resources/MT4-Ticks-To-MT5/.github/ISSUE_TEMPLATE/custom.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Custom issue template -about: Describe this issue template's purpose here. -title: '' -labels: '' -assignees: '' - ---- - - diff --git a/resources/MT4-Ticks-To-MT5/.github/ISSUE_TEMPLATE/feature_request.md b/resources/MT4-Ticks-To-MT5/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index bbcbbe7..0000000 --- a/resources/MT4-Ticks-To-MT5/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/resources/MT4-Ticks-To-MT5/.github/workflows/compile.yml b/resources/MT4-Ticks-To-MT5/.github/workflows/compile.yml deleted file mode 100644 index fd8ebc6..0000000 --- a/resources/MT4-Ticks-To-MT5/.github/workflows/compile.yml +++ /dev/null @@ -1,30 +0,0 @@ ---- -name: Compile - -on: - pull_request: - paths: - - '**.mq?' - - '.github/workflows/compile.yml' - push: - paths: - - '**.mq?' - - '.github/workflows/compile.yml' - -jobs: - Compile: - runs-on: windows-latest - steps: - - uses: actions/checkout@v2 - with: - submodules: 'recursive' - - name: Compiles (MQL4) - uses: fx31337/mql-compile-action@master - with: - path: MT4.mq4 - verbose: true - - name: Compiles (MQL5) - uses: fx31337/mql-compile-action@master - with: - path: MT5.mq5 - verbose: true diff --git a/resources/MT4-Ticks-To-MT5/CODE_OF_CONDUCT.md b/resources/MT4-Ticks-To-MT5/CODE_OF_CONDUCT.md deleted file mode 100644 index 09827eb..0000000 --- a/resources/MT4-Ticks-To-MT5/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,76 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or - advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at . All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq diff --git a/resources/MT4-Ticks-To-MT5/CONTRIBUTING.md b/resources/MT4-Ticks-To-MT5/CONTRIBUTING.md deleted file mode 100644 index c994de4..0000000 --- a/resources/MT4-Ticks-To-MT5/CONTRIBUTING.md +++ /dev/null @@ -1 +0,0 @@ -Thank you for your contribution. diff --git a/resources/MT4-Ticks-To-MT5/LICENSE b/resources/MT4-Ticks-To-MT5/LICENSE deleted file mode 100644 index 0a04128..0000000 --- a/resources/MT4-Ticks-To-MT5/LICENSE +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/resources/MT4-Ticks-To-MT5/MT4.mq4 b/resources/MT4-Ticks-To-MT5/MT4.mq4 deleted file mode 100644 index 7601c77..0000000 --- a/resources/MT4-Ticks-To-MT5/MT4.mq4 +++ /dev/null @@ -1,129 +0,0 @@ -//+------------------------------------------------------------------+ -//| MT5.mq5 | -//| jaffer wilson, 2020 | -//+------------------------------------------------------------------+ -#property copyright "© 2020Jaffer Wilson" -#property link "jafferwilson@gmail.com" -#property version "1.00" - -#include "socket-library-mt4-mt5.mqh" -input string Hostname = "localhost"; // Server hostname or IP address -ushort ServerPort = 0; // Server port -ClientSocket * glbClientSocket = NULL; -// -------------------------------------------------------------------- -// Initialisation (no action required) -// -------------------------------------------------------------------- -datetime last_visit = 0; -bool is_History_Written = false; -//+------------------------------------------------------------------+ -//| | -//+------------------------------------------------------------------+ -void OnInit() - { - ServerPort = 0; - int file = FileOpen("sym_port.txt",FILE_READ|FILE_SHARE_READ|FILE_ANSI|FILE_TXT,'\n'); - if(file==INVALID_HANDLE) - { - Print("Error Opening File : ",GetLastError()); - FileClose(file); - ExpertRemove(); - } - else - { - while(!FileIsEnding(file) && !IsStopped()) - { - string text = FileReadString(file); - if(StringFind(text,_Symbol)>=0) - { - int replace_length = StringReplace(text,_Symbol+"=",""); - ServerPort = ushort(text); - break; - } - } - } - FileClose(file); - if(ServerPort<=0) - { - Print("The Symbol is found"); - ExpertRemove(); - } - Print(_Symbol," is assigned with Port: ",ServerPort); - last_visit = Time[0]; - Write_To_File_History(); - } -void OnDeinit(const int reason) - { - if(glbClientSocket) - { - delete glbClientSocket; - glbClientSocket = NULL; - } - } -void OnTick() - { - if(!glbClientSocket) - { - glbClientSocket = new ClientSocket(Hostname, ServerPort); - - if(glbClientSocket.IsSocketConnected()) - { - //MqlTick tick; - //MqlRates rates[]; - //SymbolInfoTick(_Symbol,tick); - //CopyRates(_Symbol,0,Time[0],Time[0],rates); - string strMsg = StringFormat("quote,%s,%ld,%lf,%lf,%ld,%ld,%lf,%lf,%lf,%lf,%d,%ld,%ld,%lf,%lf,%lf,%lf,%d,%ld",_Symbol,long(TimeCurrent()),Ask,Bid,long(TimeCurrent()), - long(Time[0]),Open[0],High[0],Low[0],Close[0],int(fabs(Ask-Bid)/Point),Volume[0]); - //,long(rates[1].time),rates[1].open,rates[1].high,rates[1].low,rates[1].close,rates[1].spread,rates[1].tick_volume); - //Print(strMsg); - glbClientSocket.Send(strMsg); - } - if(last_visit != Time[0]) - { - last_visit = Time[0]; - if(FileIsExist(StringFormat("MT4Hist//%s.csv",_Symbol),FILE_COMMON)) - { - int file = FileOpen(StringFormat("MT4Hist//%s.csv",_Symbol),FILE_COMMON|FILE_CSV|FILE_WRITE|FILE_READ|FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_ANSI,','); - if(file!=INVALID_HANDLE) - { - FileSeek(file,0,SEEK_END); - MqlRates rates[]; - CopyRates(_Symbol,0,Time[1],Time[1],rates); - FileWrite(file,rates[0].time,rates[0].open,rates[0].high,rates[0].low,rates[0].close,rates[0].spread,rates[0].tick_volume); - } - FileClose(file); - } - } - if(CheckPointer(glbClientSocket)!=POINTER_INVALID) - { - delete glbClientSocket; - glbClientSocket = NULL; - } - } - - } -//+------------------------------------------------------------------+ -void Write_To_File_History() - { - MqlRates rates[]; - if(FileIsExist(StringFormat("MT4Hist//%s.csv",_Symbol),FILE_COMMON)) - FileDelete(StringFormat("MT4Hist//%s.csv",_Symbol),FILE_COMMON); - int file = FileOpen(StringFormat("MT4Hist//%s.csv",_Symbol),FILE_COMMON|FILE_SHARE_WRITE|FILE_CSV|FILE_WRITE|FILE_READ|FILE_SHARE_READ|FILE_ANSI,','); - datetime start_time = datetime(Time[0] - 1000*3600);//525600*60); - Print(start_time); - int length = CopyRates(_Symbol,0,start_time,Time[1],rates); - Print("Length Data: ",length); - if(file==INVALID_HANDLE) - { - Print("The file has Issues : ",GetLastError()); - } - else - { - for(int i=0; i Files Directory. (I could not load the file from the same folder. So I have to move it to teh files folder. I was not able to find a method for its inclusion, if someone has idea please share so I can neglect this step.) - 3) Compile the MT4.mq4 file once to make sure it is working. -### Note: - -##### First apply the MT4.mq4 on the chart. - -##### Then apply the MT5 on the chart of the same symbol. Otherwise it will not work. - -Have a look at the image: -![Demo Image](/image/image.png) -### Note: - -This is free code and I am always open for suggestions to improve it. I will not permit anyone to make a product and sell the code. Please try remaining ethical. diff --git a/resources/MT4-Ticks-To-MT5/image/image.png b/resources/MT4-Ticks-To-MT5/image/image.png deleted file mode 100644 index 3bcf175..0000000 Binary files a/resources/MT4-Ticks-To-MT5/image/image.png and /dev/null differ diff --git a/resources/MT4-Ticks-To-MT5/sym_port.txt b/resources/MT4-Ticks-To-MT5/sym_port.txt deleted file mode 100644 index 789949f..0000000 --- a/resources/MT4-Ticks-To-MT5/sym_port.txt +++ /dev/null @@ -1,61 +0,0 @@ -EURUSD=2000 -GBPUSD=2001 -USDCHF=2002 -USDJPY=2003 -USDCAD=2004 -AUDUSD=2005 -AUDNZD=2006 -AUDCAD=2007 -AUDCHF=2008 -AUDJPY=2009 -CHFJPY=2010 -EURGBP=2011 -EURAUD=2012 -EURCHF=2013 -EURJPY=2014 -EURNZD=2015 -EURCAD=2016 -GBPCHF=2017 -GBPJPY=2018 -CADCHF=2019 -CADJPY=2020 -GBPAUD=2021 -GBPCAD=2022 -GBPNZD=2023 -NZDCAD=2024 -NZDCHF=2025 -NZDJPY=2026 -NZDUSD=2027 -USDSGD=2028 -AUDSGD=2029 -CHFSGD=2030 -EURDKK=2031 -EURHKD=2032 -EURNOK=2033 -EURPLN=2034 -EURSEK=2035 -EURSGD=2036 -EURTRY=2037 -EURZAR=2038 -GBPDKK=2039 -GBPNOK=2040 -GBPSEK=2041 -GBPSGD=2042 -GBPTRY=2043 -NOKJPY=2044 -NOKSEK=2045 -SEKJPY=2046 -SGDJPY=2047 -USDCNH=2048 -USDCZK=2049 -USDDKK=2050 -USDHKD=2051 -USDHUF=2052 -USDMXN=2053 -USDNOK=2054 -USDPLN=2055 -USDRUB=2056 -USDSEK=2057 -USDTHB=2058 -USDTRY=2059 -USDZAR=2060 diff --git a/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/Instrument.conf b/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/Instrument.conf deleted file mode 100644 index 85a09fb..0000000 --- a/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/Instrument.conf +++ /dev/null @@ -1,102 +0,0 @@ -[ICMarkets] -AUDCAD: AUDCAD -AUDCHF: AUDCHF -AUDJPY: AUDJPY -AUDNZD: AUDNZD -AUDUSD: AUDUSD -BTCUSD: BTCUSD -CADCHF: CADCHF -CADJPY: CADJPY -CHFJPY: CHFJPY -CHFSGD: CHFSGD -EURAUD: EURAUD -EURCAD: EURCAD -EURCHF: EURCHF -EURGBP: EURGBP -EURJPY: EURJPY -EURNOK: EURNOK -EURPLN: EURPLN -EURNZD: EURNZD -EURSGD: EURSGD -EURUSD: EURUSD -EURZAR: EURZAR -GBPAUD: GBPAUD -GBPCAD: GBPCAD -GBPCHF: GBPCHF -GBPJPY: GBPJPY -GBPNOK: GBPNOK -GBPNZD: GBPNZD -GBPSGD: GBPSGD -GBPUSD: GBPUSD -NOKJPY: NOKJPY -NOKSEK: NOKSEK -NZDCAD: NZDCAD -NZDCHF: NZDCHF -NZDJPY: NZDJPY -NZDUSD: NZDUSD -USDCAD: USDCAD -USDCHF: USDCHF -USDJPY: USDJPY -USDNOK: USDNOK -USDPLN: USDPLN -USDSEK: USDSEK -USDZAR: USDZAR -GOLD: XAUUSD -[ICM_2] -AUDCAD: AUDCAD -AUDCHF: AUDCHF -AUDUSD: AUDUSD -AUDNZD: AUDNZD -AUDJPY: AUDJPY -CADCHF: CADCHF -CADJPY: CADJPY -CHFJPY: CHFJPY -EURAUD: EURAUD -EURCAD: EURCAD -EURCHF: EURCHF -EURJPY: EURJPY -EURNZD: EURNZD -EURGBP: EURGBP -EURUSD: EURUSD -GBPAUD: GBPAUD -GBPCAD: GBPCAD -GBPCHF: GBPCHF -GBPJPY: GBPJPY -GBPNZD: GBPNZD -GBPUSD: GBPUSD -NZDCAD: NZDCAD -NZDCHF: NZDCHF -NZDJPY: NZDJPY -NZDUSD: NZDUSD -USDCAD: USDCAD -USDCHF: USDCHF -USDJPY: USDJPY -XAUUSD: XAUUSD -BTCUSD: BTCUSD -USDZAR: USDZAR -USDPLN: USDPLN -USDSEK: USDSEK -USDNOK: USDNOK -CHFSGD: CHFSGD -EURPLN: EURPLN -EURNOK: EURNOK -EURSGD: EURSGD -GBPSGD: GBPSGD -GBPNOK: GBPNOK -EURZAR: EURZAR -NOKSEK: NOKSEK -NOKJPY: NOKJPY -AUDSGD: AUDSGD -[FXPIG] -AUDCAD: AUDCAD.spa -AUDCHF: AUDCHF.spa -AUDUSD: AUDUSD.spa -AUDNZD: AUDNZD.spa -AUDJPY: AUDJPY.spa -[ICMarkets-Stocks] -Chevron: CVX.NYSE -J.P. Morgan: JPM.NYSE -Master Card: MA.NYSE -Oracle: ORCL.NYSE -Visa Card: V.NYSE -Uber: UBER.NYSE diff --git a/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/Python_script_example_PyTrader.py b/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/Python_script_example_PyTrader.py deleted file mode 100644 index 9bd0a53..0000000 --- a/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/Python_script_example_PyTrader.py +++ /dev/null @@ -1,312 +0,0 @@ -""" - PyTrader api - script example for easy connection with Metatrader5 EA - This is an example file with all calling functions to metatrader terminal and get it back to your script - For closing/deleting trades, ticket numbers must be known. - Also opening orders openprice, sl and tp must be appropriate - -""" - -import numpy as np -import pandas as pd -import configparser -from datetime import datetime -import pytz -# from utils.api.Pytrader_API_V3_01a import Pytrader_API -from utils.api.Pytrader_API_V2_081a import Pytrader_API - - -instrument_list = ['EURUSD', 'GBPJPY', 'AUDNZD'] - -# instantiation -# documentation reference 1 -MT = Pytrader_API() - -# There are diffferent ways to connect to the MT connector. - - -# Option #1: if the EA is on same computer -# you need a list with universal instrument names(you use in the python application) and the broker -# specific instrument names. -# by this you can make your python application broker independent - -# Optional way of building the list -brokerInstrumentsLookup = { - 'EURUSD': 'EURUSD', - 'GBPNZD': 'GBPNZD', - 'GOLD': 'XAUUSD', - 'DAX': 'GER30'} - -# Option #2: a different way is by working with a configuration file shown below. -# example is added -# example script for reading the configuration file and building the list - - -def config_instruments(config, section): - dict1 = {} - options = config.options(section) - for option in options: - try: - option = option.upper() - dict1[option] = config.get(section, option) - if dict1[option] == -1: - print("skip: %s" % option) - except BaseException: - print("exception on %s!" % option) - dict1[option] = None - return dict1 - - -# Read in config -# CONFIG_FILE = "Instrument.conf" -# config = configparser.ConfigParser() -# config.read(CONFIG_FILE) - -# brokerInstrumentsLookup = config_instruments(config, "ICMarkets") -# or -# brokerInstrumentsLookup = config_instruments(config,'FXPIG') - -# Connection line of code -# (documentation reference 2) -# Connected: boolean -Connected = MT.Connect( - server='127.0.0.1', - port=1110, #1122, - instrument_lookup=brokerInstrumentsLookup) - -# 2, EA is on other computer in same local network -# (documentation reference 2) -# ok: boolean -# ok = MT.Connect(server='192.168.0.103', port=22222, instrument_lookup=brokerInstrumentsLookup) - - -# setting the debug characteristic of the MT connector to false, default is false -# this will give extra information in case of troubles/feedback -MT.debug = False - -# IsAlive - you can always check if the connection is still OK -# IsAlive = boolean -IsAlive = MT.connected -print(IsAlive) - - -# check connection, renew connection check -# (documentation reference 3) -# KeepAliveCheck = boolean -CheckAlive = MT.Check_connection() - -# Change the time out, for retrieving long bar history or slow systems you can set an other connection time out -# (documentation reference 4) -MT.Set_timeout(timeout_in_seconds=120) - -# Retrieve broker server time -# (documentation reference 5) -# ServerTime = datetime -ServerTime = MT.Get_broker_server_time() - -print(ServerTime) -print('') - -# Get static account information -# (documentation reference 6) -# StaticInfo = dictionairy -StaticInfo = MT.Get_static_account_info() -for prop in StaticInfo: - print(" {}={}".format(prop, StaticInfo[prop])) -print('') - -# Get dynamic account information -# (documentation reference 7) -# DynamicInfo = dictionairy -DynamicInfo = MT.Get_dynamic_account_info() -for prop in DynamicInfo: - print(" {}={}".format(prop, DynamicInfo[prop])) -print('') - -# Get instrument information -# (documentation reference 8) -# InstrumentInfo = dictionairy, if instrument not known at broker the -# value 'None' will be returned -InstrumentInfo = MT.Get_instrument_info(instrument='EURUSD') -for prop in InstrumentInfo: - print(" {}={}".format(prop, InstrumentInfo[prop])) -print('') - - -# Get last tick information -# (documentation reference 9) -## LastTick = dictionary -LastTick = MT.Get_last_tick_info(instrument='EURUSD') -print('') -for prop in LastTick: - print(" {}={}".format(prop, LastTick[prop])) -print('') - -# For Live/Paper trading -# The above function can be used for live streaming of data - -# Get actual bar information -# (documentation reference 10) -# ActualBar = dictionary -ActualBar = MT.Get_actual_bar_info( - instrument='GBPUSD', - timeframe=MT.get_timeframe_value('H4')) -for prop in ActualBar: - print(" {}={}".format(prop, ActualBar[prop])) -print('') - - - -# List of all instruments in brokers market watch -# (documentation reference 22) -# Broker_marketwatch_list = list[] -Broker_marketwatch_list = MT.Get_instruments() - -# Get a specific bar (d, o, h, l, c, v) by index for a list of instruments -# (documentation reference 23) -# Specific_bars = dict{} -Specific_bars = MT.Get_specific_bar(instrument_list = instrument_list, specific_bar_index=1, timeframe = MT.get_timeframe_value('H1')) - -# For Live/Paper trading -# The above function can be used for live streaming of data - - -# Get last x ticks from now, working for MT5 Only. -# if MT terminal does not have this in history it may take some time to download -# MT terminal needs first to retrieve from broker -# the max amount of ticks is broker dependent -# socket time out is set to 60 seconds as default, if needed change time out -# (documentation reference 11) -# LastTicks = data frame -LastTicks = MT.Get_last_x_ticks_from_now(instrument='EURUSD', nbrofticks=500) -ticks = pd.DataFrame(LastTicks) -print(ticks.head()) -print('') - -# Get last x bars from MT terminal -# if MT terminal does not have this in history it may take some time to download -# MT terminal needs first to retrieve from broker -# the max amount of bars is broker dependent -# socket time out is set to 60 seconds -# (documentation reference 12) -# LastBars = data array -LastBars = MT.Get_last_x_bars_from_now( - instrument='GBPUSD', - timeframe=MT.get_timeframe_value('M1'), - nbrofbars=1000) - - -# Open a new order (market or pending) -# (documentation reference 13) -# Send a new order, in this case pending order : -# NewOrder = int, order ticket -NewOrder = MT.Open_order( - instrument='EURUSD', - ordertype='buy_stop', - volume=0.01, - openprice=1.136, - slippage=10, - magicnumber=2000, - stoploss=1.12, - takeprofit=1.14, - comment='Test') -if (NewOrder == -1): # opening order failed - print(MT.order_error) - print(MT.order_return_message) - -# Send a new order, in this case market order -NewOrder = MT.Open_order( - instrument='EURUSD', - ordertype='buy', - volume=0.01, - openprice=0.0, - slippage=10, - magicnumber=2000, - stoploss=0.0, - takeprofit=0.0, - comment='Test') -if (NewOrder == -1): # opening order failed - print(MT.order_error) - print(MT.order_return_message) - -# set/change stopploss and takeprofit for position -# (documentation reference 14) -# ChangePosition = boolean -ChangePosition = MT.Set_sl_and_tp_for_position( - ticket=53136604, stoploss=0.0, takeprofit=1.11001) -if (ChangePosition == False): # setting sl/tp failed for position - print(MT.order_error) - print(MT.order_return_message) - -# Set stopploss and takeprofit for order (pendings) -# (documentation reference 15) -# ChangeOrder = boolean -ChangeOrder = MT.Set_sl_and_tp_for_order( - ticket=53136804, stoploss=0.0, takeprofit=1.12001) -if (ChangeOrder == False): # setting sl/tp failed for order - print(MT.order_error) - print(MT.order_return_message) - -# Get all orders (pendings) -# (documentation reference 16) -# AllOrders = data frame -AllOrders = MT.Get_all_orders() -print('') -print(AllOrders) - -# Get all (open) positions -# (documentation reference 17) -# AllPositions = data frame -AllPositions = MT.Get_all_open_positions() -print('') -print(AllPositions) - -# Get all closed position in a specified time period -# (documentation reference 18) -# AllClosedPositions = data frame -print('') -print('closed positions') -timezone = pytz.timezone("Etc/UTC") -AllClosedPositions = MT.Get_all_closed_positions( - date_from=datetime(2020, 3, 3, tzinfo=timezone), date_to=datetime.now()) -print(AllClosedPositions) - -# Close position by ticket -# (documentation reference 19) -# ClosePosition = boolean -ClosePosition = MT.Close_position_by_ticket(ticket=597318718) - -# close position partly -# documentation reference 20 -PartialClose = MT.Close_position_partial_by_ticket( - ticket=367014000, volume_to_close=0.01) -if (PartialClose == False): - print(MT.order_return_message) - -# Delete order by ticket -# (documentation reference 21) -# DeleteOrder = boolean -DeleteOrder = MT.Delete_order_by_ticket(ticket=49988037) - -# result check -if (DeleteOrder == False): - print(MT.order_error) - print(MT.order_return_message) - - -# List of all instruments in brokers market watch -# (documentation reference 22) -# Broker_marketwatch_list = list[] -Broker_marketwatch_list = MT.Get_instruments() - -# Get a specific bar (d, o, h, l, c, v) by index for a list of instruments -# (documentation reference 23) -# Specific_bars = dict{} -Specific_bars = MT.Get_specific_bar(instrument_list = instrument_list, specific_bar_index=1, timeframe = MT.get_timeframe_value('H1')) - -# Get profit and loss info -# (documentation reference 24) -# PnL information = dict{} -timezone = pytz.timezone("Etc/UTC") -PnL = MT.Get_PnL( - date_from=datetime(2020, 3, 3, tzinfo=timezone), date_to=datetime.now()) -print(PnL) diff --git a/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/Pytrader_MT5_EA_V2.081a.ex5 b/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/Pytrader_MT5_EA_V2.081a.ex5 deleted file mode 100644 index ccd2f72..0000000 Binary files a/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/Pytrader_MT5_EA_V2.081a.ex5 and /dev/null differ diff --git a/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/Pytrader_MT5_EA_V2.081b.ex5 b/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/Pytrader_MT5_EA_V2.081b.ex5 deleted file mode 100644 index 566a17b..0000000 Binary files a/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/Pytrader_MT5_EA_V2.081b.ex5 and /dev/null differ diff --git a/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/utils/api/Pytrader_API_V2_081a.py b/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/utils/api/Pytrader_API_V2_081a.py deleted file mode 100644 index 271130b..0000000 --- a/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/utils/api/Pytrader_API_V2_081a.py +++ /dev/null @@ -1,1986 +0,0 @@ -# Pytrader API for MT4 and MT5 -# Version V2_081 - -import socket -import numpy as np -import pandas as pd -from datetime import datetime -import pytz -import io - -TZ_SERVER = 'Europe/Tallinn' # EET -TZ_LOCAL = 'Europe/Budapest' -TZ_UTC = 'UTC' - -ERROR_DICT = {} -ERROR_DICT['00001'] = 'Undefined check connection error' - -ERROR_DICT['00101'] = 'IP address error' -ERROR_DICT['00102'] = 'Port number error' -ERROR_DICT['00103'] = 'Connection error with license EA' -ERROR_DICT['00104'] = 'Undefined answer from license EA' - -ERROR_DICT['00301'] = 'Unknown instrument for broker' -ERROR_DICT['00302'] = 'Instrument not in demo' - -ERROR_DICT['00401'] = 'Instrument not in demo' -ERROR_DICT['00402'] = 'Instrument not exists for broker' - -ERROR_DICT['00501'] = 'No instrument defined/configured' - -ERROR_DICT['02001'] = 'Instrument not in demo' -ERROR_DICT['02002'] = 'No valid instrument' - -ERROR_DICT['02101'] = 'Instrument not in demo' -ERROR_DICT['02102'] = 'No ticks' -ERROR_DICT['02103'] = 'Not imlemented in MT4' - -ERROR_DICT['04101'] = 'Instrument not in demo' -ERROR_DICT['04102'] = 'Wrong/unknown time frame' -ERROR_DICT['04103'] = 'No records' -ERROR_DICT['04104'] = 'Undefined error' - - -ERROR_DICT['04201'] = 'Instrument not in demo' -ERROR_DICT['04202'] = 'Wrong/unknown time frame' -ERROR_DICT['04203'] = 'No records' - -ERROR_DICT['04501'] = 'Instrument not in demo' -ERROR_DICT['04502'] = 'Wrong/unknown time frame' -ERROR_DICT['04503'] = 'No records' -ERROR_DICT['04504'] = 'Missing market instrument' - -ERROR_DICT['06201'] = 'Wrong time window' -ERROR_DICT['06401'] = 'Wrong time window' - -ERROR_DICT['07001'] = 'Trading not allowed, check MT terminal settings' -ERROR_DICT['07002'] = 'Instrument not in demo' -ERROR_DICT['07003'] = 'Instrument not in market watch' -ERROR_DICT['07004'] = 'Instrument not known for broker' -ERROR_DICT['07005'] = 'Unknown order type' -ERROR_DICT['07006'] = 'Wrong SL value' -ERROR_DICT['07007'] = 'Wrong TP value' -ERROR_DICT['07008'] = 'Wrong volume value' -ERROR_DICT['07009'] = 'Error opening market order' -ERROR_DICT['07010'] = 'Error opening pending order' - -ERROR_DICT['07101'] = 'Trading not allowed' -ERROR_DICT['07102'] = 'Position not found/error' - -ERROR_DICT['07201'] = 'Trading not allowed' -ERROR_DICT['07202'] = 'Position not found/error' -ERROR_DICT['07203'] = 'Wrong volume' -ERROR_DICT['07204'] = 'Error in partial close' - -ERROR_DICT['07301'] = 'Trading not allowed' -ERROR_DICT['07302'] = 'Error in delete' - -ERROR_DICT['07501'] = 'Trading not allowed' -ERROR_DICT['07502'] = 'Position not open' -ERROR_DICT['07503'] = 'Error in modify' - -ERROR_DICT['07601'] = 'Trading not allowed' -ERROR_DICT['07602'] = 'Position not open' -ERROR_DICT['07603'] = 'Error in modify' - -ERROR_DICT['07701'] = 'Trading not allowed' -ERROR_DICT['07702'] = 'Position not open' -ERROR_DICT['07703'] = 'Error in modify' - -ERROR_DICT['07801'] = 'Trading not allowed' -ERROR_DICT['07802'] = 'Position not open' -ERROR_DICT['07803'] = 'Error in modify' - -ERROR_DICT['99901'] = 'Undefined error' - - -class Pytrader_API: - - def __init__(self): - self.socket_error: int = 0 - self.socket_error_message: str = '' - self.order_return_message: str = '' - self.order_error: int = 0 - self.connected: bool = False - self.timeout: bool = False - self.command_OK: bool = False - self.command_return_error: str = '' - self.debug: bool = False - self.version: str = 'V2.081a' - self.max_bars: int = 5000 - self.max_ticks: int = 5000 - self.timeout_value: int = 60 - self.instrument_conversion_list: dict = {} - self.instrument_name_broker: str = '' - self.instrument_name_universal: str = '' - self.date_from: datetime = '2000/01/01, 00:00:00' - self.date_to: datetime = datetime.now() - self.instrument: str = '' - self.license = 'Demo' - self.invert_array = False - - def Set_timeout(self, - timeout_in_seconds: int = 60 - ): - """ - Set time out value for socket communication with MT4 or MT5 EA/Bot. - - Args: - timeout_in_seconds: the time out value - Returns: - None - """ - self.timeout_value = timeout_in_seconds - self.sock.settimeout(self.timeout_value) - self.sock.setblocking(1) - return - - def Disconnect(self): - """ - Closes the socket connection to a MT4 or MT5 EA bot. - - Args: - None - Returns: - bool: True or False - """ - - self.sock.close() - return True - - def Connect(self, - server: str = '', - port: int = 2345, - instrument_lookup: dict = []) -> bool: - """ - Connects to a MT4 or MT5 EA/Bot. - - Args: - server: Server IP address, like -> '127.0.0.1', '192.168.5.1' - port: port number - instrument_lookup: dictionairy with general instrument names and broker intrument names - Returns: - bool: True or False - """ - self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.sock.setblocking(1) - self.port = port - self.server = server - self.instrument_conversion_list = instrument_lookup - - if (len(self.instrument_conversion_list) == 0): - print('Broker Instrument list not available or empty') - self.socket_error_message = 'Broker Instrument list not available' - return False - - try: - self.sock.connect((self.server, self.port)) - try: - data_received = self.sock.recv(1000000) - self.connected = True - self.socket_error = 0 - self.socket_error_message = '' - return True - except socket.error as msg: - self.socket_error = 100 - self.socket_error_message = 'Could not connect to server.' - self.connected = False - return False - except socket.error as msg: - print( - "Couldnt connect with the socket-server: %self.sock\n terminating program" % - msg) - self.connected = False - self.socket_error = 101 - self.socket_error_message = 'Could not connect to server.' - return False - - def Check_connection(self) -> bool: - """ - Checks if connection with MT terminal/Ea bot is still active. - Args: - None - Returns: - bool: True or False - """ - - self.command = 'F000^0^' - self.command_return_error = '' - ok, dataString = self.send_command(self.command) - - try: - if (ok == False): - self.command_OK = False - return False - - x = dataString.split('^') - - if x[1] == 'OK': - self.timeout = True - self.command_OK = True - return True - else: - self.timeout = False - self.command_OK = True - return False - except: - self.command_return_error = ERROR_DICT['00001'] - self.command_OK = False - return False - - @property - def IsConnected(self) -> bool: - """Returns connection status. - Returns: - bool: True or False - """ - return self.connected - - def Get_static_account_info(self) -> dict: - """ - Retrieves static account information. - - Returns: Dictionary with: - Account name, - Account number, - Account currency, - Account type, - Account leverage, - Account trading allowed, - Account maximum number of pending orders, - Account margin call percentage, - Account close open trades margin percentage - """ - self.command_return_error = '' - - ok, dataString = self.send_command('F001^0^') - if (ok == False): - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if x[0] != 'F001': - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - returnDict = {} - del x[0:2] - x.pop(-1) - - returnDict['name'] = str(x[0]) - returnDict['login'] = str(x[1]) - returnDict['currency'] = str(x[2]) - returnDict['type'] = str(x[3]) - returnDict['leverage'] = int(x[4]) - returnDict['trade_allowed'] = bool(x[5]) - returnDict['limit_orders'] = int(x[6]) - returnDict['margin_call'] = float(x[7]) - returnDict['margin_close'] = float(x[8]) - - self.command_OK = True - return returnDict - - def Get_dynamic_account_info(self) -> dict: - """ - Retrieves dynamic account information. - - Returns: Dictionary with: - Account balance, - Account equity, - Account profit, - Account margin, - Account margin level, - Account margin free - """ - self.command_return_error = '' - - ok, dataString = self.send_command('F002^0^') - if (ok == False): - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if x[0] != 'F002': - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - returnDict = {} - del x[0:2] - x.pop(-1) - - returnDict['balance'] = float(x[0]) - returnDict['equity'] = float(x[1]) - returnDict['profit'] = float(x[2]) - returnDict['margin'] = float(x[3]) - returnDict['margin_level'] = float(x[4]) - returnDict['margin_free'] = float(x[5]) - - self.command_OK = True - return returnDict - - def Check_license(self) -> bool: - - """ - Check for license. - - Returns: - bool: True or False. True=licensed, False=Demo - """ - self.license = 'Demo' - self.command = 'F006^0^' - self.command_return_error = '' - ok, dataString = self.send_command(self.command) - - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if x[0] != 'F006': - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - self.license = str(x[3]) - if (self.license == 'Demo'): - return False - - return True - - def Check_trading_allowed(self, - instrument = 'EURUSD') -> bool: - - """ - Check for trading allowed for specified symbol. - - Returns: - bool: True or False. True=allowed, False=not allowed - """ - - self.command = 'F008^1^' + instrument + '^' - self.command_return_error = '' - ok, dataString = self.send_command(self.command) - - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if x[0] != 'F008': - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - if (str(x[2]) == 'NOK'): - return False - - return True - - def Set_bar_date_asc_desc(self, - asc_desc: bool = False) -> bool: - """ - Sets first row of array as first bar or as last bar - In MT4/5 element[0] of an array is normaliter actual bar/candle - Depending on the math you want to apply, this has to be the opposite - Args: - asc_dec: True = row[0] is oldest bar - False = row[0] is latest bar - Returns: - bool: True or False - """ - self.invert_array = asc_desc - return True - - def Get_PnL(self, - date_from: datetime = datetime(2021, 3, 1, tzinfo = pytz.timezone("Etc/UTC")), - date_to: datetime = datetime.now()) -> pd.DataFrame: - ''' - Retrieves profit loss info. - - Args: - date_from: start date - date_to: end date - Returns: Dictionary with: - realized_profit profit of all closed positions - unrealized_profit profit of all open positions - buy_profit profit of closed buy positions - sell_profit profit of closed sell positions - positions_in_profit number of profit positions - positions in loss number of loss positions - volume_in_profit total volume of positions in profit - volume_in_loss total volume of positions in loss - ''' - total_profit = 0.0 - buy_profit = 0.0 - sell_profit = 0.0 - trades_in_loss = 0 - trades_in_profit = 0 - volume_in_loss = 0.0 - volume_in_profit = 0.0 - commission_in_loss = 0.0 - commission_in_profit = 0.0 - swap_in_loss = 0.0 - swap_in_profit = 0.0 - unrealized_profit = 0.0 - - - # retrieve closed positions - closed_positions = self.Get_closed_positions_within_window(date_from, date_to) - if type(closed_positions) == pd.DataFrame: - for position in closed_positions.itertuples(): - profit = position.profit + position.commission + position.swap - total_profit = total_profit + profit - if (profit > 0.0): - trades_in_profit = trades_in_profit + 1 - volume_in_profit = volume_in_profit + position.volume - commission_in_profit = commission_in_profit + position.commission - swap_in_profit = swap_in_profit + position.swap - else: - trades_in_loss = trades_in_loss + 1 - volume_in_loss = volume_in_loss + position.volume - commission_in_loss = commission_in_loss + position.commission - swap_in_loss = swap_in_loss + position.swap - if (position.position_type == 'sell'): - sell_profit = sell_profit + profit - if (position.position_type == 'buy'): - buy_profit = buy_profit + profit - - # retrieve dynamic account info - dynamic_info = self.Get_dynamic_account_info() - unrealized_profit = dynamic_info['equity'] - dynamic_info['balance'] - result = {} - result['realized_profit'] = total_profit - result['unrealized_profit'] = unrealized_profit - result['buy_profit'] = buy_profit - result['sell_profit'] = sell_profit - result['positions_in_profit'] = trades_in_profit - result['positions_in_loss'] = trades_in_loss - result['volume_in_profit'] = volume_in_profit - result['volume_in_loss'] = volume_in_loss - - return result - else: - return pd.DataFrame() - - def Get_instrument_info(self, - instrument: str = 'EURUSD') -> dict: - """ - Retrieves instrument information. - - Args: - instrument: instrument name - Returns: Dictionary with: - instrument, - digits, - max_lotsize, - min_lotsize, - lot_step, - point, - tick_size, - tick_value - swap_long - swap_short - stop_level for sl and tp distance - """ - - self.command_return_error = '' - self.instrument_name_universal = instrument.upper() - self.instrument = self.get_broker_instrument_name(self.instrument_name_universal) - if (self.instrument == 'none' or self.instrument == None): - self.command_return_error = 'Instrument not in broker list' - self.command_OK = False - return None - - - self.command = 'F003^1^' + self.instrument + '^' - - ok, dataString = self.send_command(self.command) - - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if x[0] != 'F003': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - returnDict = {} - del x[0:2] - x.pop(-1) - - returnDict['instrument'] = str(self.instrument_name_universal) - returnDict['digits'] = int(x[0]) - returnDict['max_lotsize'] = float(x[1]) - returnDict['min_lotsize'] = float(x[2]) - returnDict['lot_step'] = float(x[3]) - returnDict['point'] = float(x[4]) - returnDict['tick_size'] = float(x[5]) - returnDict['tick_value'] = float(x[6]) - returnDict['swap_long'] = float(x[7]) - returnDict['swap_short'] = float(x[8]) - returnDict['stop_level'] = int(x[9]) - - self.command_OK = True - return returnDict - - def Check_instrument(self, - instrument: str = 'EURUSD') -> str: - """ - Check if instrument known / market watch at broker. - - Args: - instrument: instrument name - Returns: - bool: True or False - """ - self.instrument_name_universal = instrument.upper() - self.instrument = self.get_broker_instrument_name(self.instrument_name_universal) - if (self.instrument == 'none'): - self.command_return_error = 'Instrument not in list' - self.command_OK = False - return None - - self.command = 'F004^1^' + self.instrument + '^' - ok, dataString = self.send_command(self.command) - - if not ok: - self.command_OK = False - return False, 'Error' - - if self.debug: - print(dataString) - - x = dataString.split('^') - if x[0] != 'F004': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return False, str(x[2]) - - return True, str(x[2]) - - def Get_instruments(self) ->list: - """ - Retrieves broker market instruments list. - - Args: - None - Returns: - List: All market symbols as universal instrument names - """ - self.command_return_error = '' - - self.command = 'F007^1^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - # analyze the answer - return_list = [] - x = dataString.split('^') - if x[0] != 'F007': - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return return_list - - del x[0:2] - x.pop(-1) - for item in range(0, len(x)): - _instrument = str(x[item]) - instrument = self.get_universal_instrument_name(_instrument) - if (instrument != None): - return_list.append(instrument) - return return_list - - def Get_broker_server_time(self) -> datetime: - """ - Retrieves broker server time. - - Args: - None - Returns: - datetime: Boker time - """ - self.command_return_error = '' - self.command = 'F005^0^' - ok, dataString = self.send_command(self.command) - - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if x[0] != 'F005': - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - y = x[0].split('-') - d = datetime(int(y[0]), int(y[1]), int(y[2]), - int(y[3]), int(y[4]), int(y[5])) - return d - - def Get_last_tick_info(self, - instrument: str = 'EURUSD') -> dict: - """ - Retrieves instrument last tick data. - - Args: - instrument: instrument name - Returns: Dictionary with: - instrument name, - date, - ask, - bid, - last deal price, - volume - spread, in points - """ - self.command_return_error = '' - self.instrument_name_universal = instrument.upper() - self.instrument = self.get_broker_instrument_name(self.instrument_name_universal) - if (self.instrument == 'none' or self.instrument == None): - self.command_return_error = 'Instrument not in list' - self.command_OK = False - return None - ok, dataString = self.send_command('F020^1^' + self.instrument + '^') - - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if x[0] != 'F020': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - returnDict = {} - del x[0:2] - x.pop(-1) - - returnDict['instrument'] = str(self.instrument_name_universal) - returnDict['date'] = int(x[0]) - returnDict['ask'] = float(x[1]) - returnDict['bid'] = float(x[2]) - returnDict['last'] = float(x[3]) - returnDict['volume'] = int(x[4]) - returnDict['spread'] = float(x[5]) - - self.command_OK = True - return returnDict - - def Get_last_x_ticks_from_now(self, - instrument: str = 'EURUSD', - nbrofticks: int = 2000) -> np.array: - """ - Retrieves last x ticks from an instrument. - - Args: - instrument: instrument name - nbrofticks: number of ticks to retriev - Returns: numpy array with: - date, - ask, - bid, - last volume, - volume - """ - self.command_return_error = '' - self.instrument_name_universal = instrument.upper() - self.instrument = self.get_broker_instrument_name(self.instrument_name_universal) - if (self.instrument == 'none' or self.instrument == None): - self.command_return_error = 'Instrument not in list' - self.command_OK = False - return None - - self.nbrofticks = nbrofticks - - dt = np.dtype([('date', np.int64), ('ask', np.float64), ('bid', np.float64), ('last', np.float64), ('volume', np.int32)]) - - ticks = np.zeros(nbrofticks, dtype=dt) - - if (self.nbrofticks > self.max_ticks): - iloop = self.nbrofticks // self.max_ticks - itail = self.nbrofticks % self.max_ticks - - for index in range(0, iloop): - self.command = 'F021^3^' + self.instrument + '^' + str(index * self.max_ticks) + '^' + str(self.max_ticks) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return None - if self.debug: - print(dataString) - print('') - print(len(dataString)) - - x = dataString.split('^') - if str(x[0]) != 'F021': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - - for value in range(0, len(x)): - y = x[value].split('$') - - ticks[value + index * self.max_ticks][0] = int(y[0]) - ticks[value + index * self.max_ticks][1] = float(y[1]) - ticks[value + index * self.max_ticks][2] = float(y[2]) - ticks[value + index * self.max_ticks][3] = float(y[3]) - ticks[value + index * self.max_ticks][4] = int(y[4]) - - if (len(x) < self.max_ticks): - ticks = np.sort(ticks[ticks[:]['date']!=0]) - self.command_OK = True - if (self.invert_array == True): - ticks = np.flipud(ticks) - return ticks - - if (itail == 0): - ticks = np.sort(ticks[ticks[:]['date']!=0]) - self.command_OK = True - return ticks - - if (itail > 0): - self.command = 'F021^3^' + self.instrument + '^' + str(iloop * self.max_ticks) + '^' + str(itail) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return None - if self.debug: - print(dataString) - print('') - print(len(dataString)) - - x = dataString.split('^') - if str(x[0]) != 'F021': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - - for value in range(0, len(x)): - y = x[value].split('$') - - ticks[value + iloop * self.max_ticks][0] = int(y[0]) - ticks[value + iloop * self.max_ticks][1] = float(y[1]) - ticks[value + iloop * self.max_ticks][2] = float(y[2]) - ticks[value + iloop * self.max_ticks][3] = float(y[3]) - ticks[value + iloop * self.max_ticks][4] = int(y[4]) - - self.command_OK = True - ticks = np.sort(ticks[ticks[:]['date']!=0]) - if (self.invert_array == True): - ticks = np.flipud(ticks) - return ticks - else: - self.command = 'F021^3^' + self.instrument + '^' + str(0) + '^' + str(self.nbrofticks) + '^' - ok, dataString = self.send_command(self.command) - - if not ok: - self.command_OK = False - return None - if self.debug: - print(dataString) - print('') - print(len(dataString)) - - x = dataString.split('^') - if str(x[0]) != 'F021': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - - for value in range(0, len(x)): - y = x[value].split('$') - - ticks[value][0] = int(y[0]) - ticks[value][1] = float(y[1]) - ticks[value][2] = float(y[2]) - ticks[value][3] = float(y[3]) - ticks[value][4] = int(y[4]) - - self.command_OK = True - ticks = np.sort(ticks[ticks[:]['date']!=0]) - if (self.invert_array == True): - ticks = np.flipud(ticks) - #return ticks - return ticks[:len(x)] - - def Get_actual_bar_info(self, - instrument: str = 'EURUSD', - timeframe: int = 16408) -> dict: - """ - Retrieves instrument last actual data. - - Args: - instrument: instrument name - timeframe: time frame like H1, H4 - Returns: Dictionary with: - instrument name, - date, - open, - high, - low, - close, - volume, - """ - self.command_return_error = '' - self.instrument_name_universal = instrument.upper() - self.instrument = self.get_broker_instrument_name(self.instrument_name_universal) - if (self.instrument == 'none' or self.instrument == None): - self.command_return_error = 'Instrument not in list' - self.command_OK = False - return None - self.command = 'F041^2^' + self.instrument + '^' + str(timeframe) + '^' - ok, dataString = self.send_command(self.command) - - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F041': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - returnDict = {} - returnDict['instrument'] = str(self.instrument_name_universal) - returnDict['date'] = int(x[0]) - returnDict['open'] = float(x[1]) - returnDict['high'] = float(x[2]) - returnDict['low'] = float(x[3]) - returnDict['close'] = float(x[4]) - returnDict['volume'] = int(x[5]) - - self.command_OK = True - return returnDict - - def Get_specific_bar(self, - instrument_list: list = ['EURUSD', 'GBPUSD'], - specific_bar_index: int = 1, - timeframe: int = 16408) -> dict: - """ - Retrieves instrument data(d, o, h, l, c, v) of one bar(index) for the instruments in the list. - - Args: - instrument: instrument name - specific_bar_index: the specific bar (0 = actual bar) - timeframe: time frame like H1, H4 - Returns: Dictionary with: {instrument:{instrument data}} - instrument name, - [date, - open, - high, - low, - close, - volume] - """ - self.command_return_error = '' - # compose MT5 command string - self.command = 'F045^3^' - for index in range (0, len(instrument_list), 1): - _instr = self.get_broker_instrument_name(instrument_list[index].upper()) - self.command = self.command + _instr + '$' - - self.command = self.command + '^' + str(specific_bar_index) + '^' + str(timeframe) + '^' - ok, dataString = self.send_command(self.command) - - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F045': - self.command_return_error = str(x[2]) - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - result = {} - - for value in range(0, len(x)): - y = x[value].split('$') - symbol_result = {} - symbol = str(y[0]) - symbol_result['date'] = int(y[1]) - symbol_result['open'] = float(y[2]) - symbol_result['high'] = float(y[3]) - symbol_result['low'] = float(y[4]) - symbol_result['close'] = float(y[5]) - symbol_result['volume'] = float(y[6]) - result[symbol] = symbol_result - - return result - - def Get_last_x_bars_from_now(self, - instrument: str = 'EURUSD', - timeframe: int = 16408, - nbrofbars: int = 1000) -> np.array: - """ - Retrieves last x bars from a MT4 or MT5 EA bot. - - Args: - instrument: name of instrument like EURUSD - timeframe: timeframe like 'H4' - nbrofbars: Number of bars to retrieve - Returns: numpy array with: - date, - open, - high, - low, - close, - volume - """ - self.command_return_error = '' - self.instrument_name_universal = instrument.upper() - self.instrument = self.get_broker_instrument_name(self.instrument_name_universal) - if (self.instrument == 'none' or self.instrument == None): - self.command_return_error = 'Instrument not in list' - self.command_OK = False - return None - self.numberofbars = nbrofbars - - dt = np.dtype([('date', np.int64), ('open', np.float64), ('high', np.float64), - ('low', np.float64), ('close', np.float64), ('volume', np.int32)]) - - rates = np.zeros(self.numberofbars, dtype=dt) - - if (self.numberofbars > self.max_bars): - iloop = self.numberofbars // self.max_bars - itail = self.numberofbars % self.max_bars - - - for index in range(0, iloop): - self.command = 'F042^4^' + self.instrument + '^' + \ - str(timeframe) + '^' + str(index * self.max_bars) + '^' + str(self.max_bars) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return None - if self.debug: - print(dataString) - print('') - print(len(dataString)) - - x = dataString.split('^') - if str(x[0]) != 'F042': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - - for value in range(0, len(x)): - y = x[value].split('$') - - rates[value + index * self.max_bars][0] = int(y[0]) - rates[value + index * self.max_bars][1] = float(y[1]) - rates[value + index * self.max_bars][2] = float(y[2]) - rates[value + index * self.max_bars][3] = float(y[3]) - rates[value + index * self.max_bars][4] = float(y[4]) - rates[value + index * self.max_bars][5] = int(y[5]) - - if (len(x) < self.max_bars): - #rates = np.sort(rates) - rates = np.sort(rates[rates[:]['date']!=0]) - self.command_OK = True - if (self.invert_array == True): - rates = np.flipud(rates) - return rates - - if (itail == 0): - #rates = np.sort(rates) - rates = np.sort(rates[rates[:]['date']!=0]) - self.command_OK = True - if (self.invert_array == True): - rates = np.flipud(rates) - return rates - - if (itail > 0): - self.command = 'F042^4^' + self.instrument + '^' + str(timeframe) + '^' + str( - iloop * self.max_bars) + '^' + str(itail) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return None - if self.debug: - print(dataString) - print('') - print(len(dataString)) - - x = dataString.split('^') - if str(x[0]) != 'F042': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - - for value in range(0, len(x)): - y = x[value].split('$') - - rates[value + iloop * self.max_bars][0] = int(y[0]) - rates[value + iloop * self.max_bars][1] = float(y[1]) - rates[value + iloop * self.max_bars][2] = float(y[2]) - rates[value + iloop * self.max_bars][3] = float(y[3]) - rates[value + iloop * self.max_bars][4] = float(y[4]) - rates[value + iloop * self.max_bars][5] = int(y[5]) - - self.command_OK = True - #rates = np.sort(rates) - rates = np.sort(rates[rates[:]['date']!=0]) - if (self.invert_array == True): - rates = np.flipud(rates) - return rates - else: - self.command = 'F042^4^' + str(self.instrument) + '^' + \ - str(timeframe) + '^' + str(0) + '^' + str(self.numberofbars) + '^' - #print(self.command) - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - print('not ok') - return None - if self.debug: - print(dataString) - print('') - print(len(dataString)) - - x = dataString.split('^') - if str(x[0]) != 'F042': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - - for value in range(0, len(x)): - y = x[value].split('$') - - rates[value][0] = int(y[0]) - rates[value][1] = float(y[1]) - rates[value][2] = float(y[2]) - rates[value][3] = float(y[3]) - rates[value][4] = float(y[4]) - rates[value][5] = int(y[5]) - - self.command_OK = True - rates = np.sort(rates[rates[:]['date']!=0]) - if (self.invert_array == True): - rates = np.flipud(rates) - return rates[:len(x)] - - def Get_all_deleted_orders(self) -> pd.DataFrame: - """ - Retrieves all deleted pending orders. - - Args: - - Returns: - data array(panda) with all position information: - ticket, - instrument, - order_type, - magic_number, - volume, - open_price, - open_time, - stop_loss, - take_profit, - delete_price, - delete_time, - comment - """ - - # reset parameters - self.command_return_error = '' - - # get all pending orders - ok, resp = self.send_command("F065^0^") - - if self.debug: - print(resp) - - if ok==True and resp[0:5]=="F065^" and resp[-1]=="!": - nbr = resp[resp.index('^',3)+1:resp.index('^',5)] - if int(nbr) != 0: - df = pd.read_table(io.StringIO(resp[resp.index('^',5)+1:-1]), sep='$', lineterminator='^', - header=None, - names=np.array(self.columnsDeletedOrders[1:])[:,0], - dtype=self.columnsDeletedOrders[1:] - ).fillna('') - # no time conversion - # df.open_time = pd.to_datetime(df.open_time, unit='s').dt.tz_localize(TZ_SERVER).dt.tz_convert(TZ_UTC) - # sort by open_time ascending - df.sort_values(by=['open_time'], ascending= True,inplace=True) - return df - else: - # return empty dataframe - return self.create_empty_DataFrame( - self.columnsDeletedOrders, 'id') - else: - # error - if not ok: - self.command_OK = False - return None - else: - x = resp.split('^') - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - def Get_deleted_orders_within_window(self, - date_from: datetime = datetime(2021, 3, 25, tzinfo = pytz.timezone("Etc/UTC")), - date_to: datetime = datetime.now()) -> pd.DataFrame: - - """ - Retrieves all deleted pending orders within time window. - Open and close time of order must be within the time window - - Args: - date_from: date to start retrieving orders from - date_to: date to stop retrieving to - Returns: - data array(panda) with all position information: - ticket, - instrument, - order_type, - magic_number, - volume, - open_price, - open_time, - stop_loss, - take_profit, - delete_price, - delete_time, - comment - """ - - - # reset/set parameters - self.command_return_error = '' - self.date_from = date_from - self.date_to = date_to - - # get all pending orders - self.command = 'F064^2^' + self.date_from.strftime( - '%Y/%m/%d/%H/%M/%S') + '^' + self.date_to.strftime('%Y/%m/%d/%H/%M/%S') + '^' - ok, resp = self.send_command(self.command) - - if self.debug: - print(resp) - - if ok==True and resp[0:5]=="F064^" and resp[-1]=="!": - nbr = resp[resp.index('^',3)+1:resp.index('^',5)] - if int(nbr) != 0: - df = pd.read_table(io.StringIO(resp[resp.index('^',5)+1:-1]), sep='$', lineterminator='^', - header=None, - names=np.array(self.columnsDeletedOrders[1:])[:,0], - dtype=self.columnsDeletedOrders[1:] - ).fillna('') - # no time conversion - # df.open_time = pd.to_datetime(df.open_time, unit='s').dt.tz_localize(TZ_SERVER).dt.tz_convert(TZ_UTC) - # sort by open_time ascending - df.sort_values(by=['open_time'], ascending= True,inplace=True) - return df - else: - # return empty dataframe - return self.create_empty_DataFrame( - self.columnsDeletedOrders, 'id') - else: - # error - if not ok: - self.command_OK = False - return None - else: - x = resp.split('^') - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - def Get_all_orders(self) -> pd.DataFrame: - - """ - Retrieves all pending orders. - - Args: - - Returns: - data array(panda) with all order information: - ticket, - instrument, - order_type, - magic number, - volume/lotsize, - open price, - open_time, - stop_loss, - take_profit, - comment - """ - - # reset parameters - self.command_return_error = '' - - # get all pending orders - ok, resp = self.send_command("F060^0^") - - if self.debug: - print(resp) - - if ok==True and resp[0:5]=="F060^" and resp[-1]=="!": - nbr = resp[resp.index('^',3)+1:resp.index('^',5)] - if int(nbr) != 0: - df = pd.read_table(io.StringIO(resp[resp.index('^',5)+1:-1]), sep='$', lineterminator='^', - header=None, - names=np.array(self.columnsOpenOrders[1:])[:,0], - dtype=self.columnsOpenOrders[1:] - ).fillna('') - # no time conversion - # df.open_time = pd.to_datetime(df.open_time, unit='s').dt.tz_localize(TZ_SERVER).dt.tz_convert(TZ_UTC) - # sort by open_time ascending - df.sort_values(by=['open_time'], ascending= True,inplace=True) - return df - else: - # return empty dataframe - return self.create_empty_DataFrame( - self.columnsOpenOrders, 'id') - else: - # error - if not ok: - self.command_OK = False - return None - else: - x = resp.split('^') - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - def Get_all_open_positions(self) -> pd.DataFrame: - - """ - Retrieves all open positions, market orders for MT4. - - Args: - none - - Returns: - data array(panda) with all position information: - ticket, - instrument, - order_ticket, for MT5 deal ticket, for MT4 order ticket - position_type, - magic_number, - volume/lotsize, - open_price, - open_time, - stopp_loss, - take_profit, - comment, - profit, - swap, - commission - """ - # reset parameters - self.command_return_error = '' - self.command = 'F061^0^' - - # get all open positions - ok, resp = self.send_command(self.command) - - if self.debug: - print(resp) - - if ok==True and resp[0:5]=="F061^" and resp[-1]=="!": - nbr = resp[resp.index('^',3)+1:resp.index('^',5)] - if int(nbr) != 0: - df = pd.read_table(io.StringIO(resp[resp.index('^',5)+1:-1]), sep='$', lineterminator='^', - header=None, - names=np.array(self.columnsOpenPositions[1:])[:,0], - dtype=self.columnsOpenPositions[1:] - ).fillna('') - # no time conversion - # df.open_time = pd.to_datetime(df.open_time, unit='s').dt.tz_localize(TZ_SERVER).dt.tz_convert(TZ_UTC) - # sort by open_time ascending - df.sort_values(by=['open_time'], ascending= True,inplace=True) - return df - else: - # return empty dataframe - return self.create_empty_DataFrame( - self.columnsOpenPositions, 'id') - else: - # error - if not ok: - self.command_OK = False - return None - else: - x = resp.split('^') - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - def Get_closed_positions_within_window(self, - date_from: datetime = datetime(2021, 3, 20, tzinfo = pytz.timezone("Etc/UTC")), - date_to: datetime = datetime.now()) -> pd.DataFrame: - - """ - Retrieves all closed positions/orders within time window. - Open and close time must be within the time window - - Args: - date_from: date to start retrieving orders from - date_to: date to stop retrieving to - Returns: - data array(panda) with all position information: - ticket, - instrument, - order_ticket, - position_type, - magic_number, - volume, - open_price, - open_time, - stop_loss, - take_profit, - close_price, - close_time, - comment, - profit, - swap, - commission - """ - self.command_return_error = '' - self.date_from = date_from - self.date_to = date_to - self.command = 'F062^2^' + self.date_from.strftime( - '%Y/%m/%d/%H/%M/%S') + '^' + self.date_to.strftime('%Y/%m/%d/%H/%M/%S') + '^' - - - ok, resp = self.send_command(self.command) - - if self.debug: - print(resp) - - if not ok: - self.command_OK = False - return None - - if ok==True and resp[0:5]=="F062^" and resp[-1]=="!": - nbr = resp[resp.index('^',3)+1:resp.index('^',5)] - if int(nbr) != 0: - df = pd.read_table(io.StringIO(resp[resp.index('^',5)+1:-1]), sep='$', lineterminator='^', - header=None, - names=np.array(self.columnsClosedPositions[1:])[:,0], - dtype=self.columnsClosedPositions[1:] - ).fillna('') - # no time conversion - # df.open_time = pd.to_datetime(df.open_time, unit='s').dt.tz_localize(TZ_SERVER).dt.tz_convert(TZ_UTC) - # sort by open_time ascending - df.sort_values(by=['open_time'], ascending= True,inplace=True) - return df - else: - # return empty dataframe - return self.create_empty_DataFrame( - self.columnsClosedPositions, 'id') - else: - # error - if not ok: - self.command_OK = False - return None - else: - x = resp.split('^') - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - def Get_all_closed_positions(self) -> pd.DataFrame: - """ - Retrieves all closed positions/orders. - For MT4 all must be visible in the history tab of the MT4 terminal - - Args: - - Returns: - data array(panda) with all position information: - ticket, - instrument, - order_ticket, - position_type, - magic_number, - volume, - open_price, - open_time, - stop_loss, - take_profit, - close_price, - close_time, - comment, - profit, - swap, - commission - """ - self.command_return_error = '' - - self.command = 'F063^0^' - ok, resp = self.send_command(self.command) - if not ok: - self.command_OK = False - return None - - if self.debug: - print(resp) - - if ok==True and resp[0:5]=="F063^" and resp[-1]=="!": - nbr = resp[resp.index('^',3)+1:resp.index('^',5)] - if int(nbr) != 0: - df = pd.read_table(io.StringIO(resp[resp.index('^',5)+1:-1]), sep='$', lineterminator='^', - header=None, - names=np.array(self.columnsClosedPositions[1:])[:,0], - dtype=self.columnsClosedPositions[1:] - ).fillna('') - # no time conversion - # df.open_time = pd.to_datetime(df.open_time, unit='s').dt.tz_localize(TZ_SERVER).dt.tz_convert(TZ_UTC) - # sort by open_time ascending - df.sort_values(by=['open_time'], ascending= True,inplace=True) - return df - else: - # return empty dataframe - return self.create_empty_DataFrame( - self.columnsClosedPositions, 'id') - else: - # error - if not ok: - self.command_OK = False - return None - else: - x = resp.split('^') - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - def Open_order(self, - instrument: str = '', - ordertype: str = 'buy', - volume: float = 0.01, - openprice: float = 0.0, - slippage: int = 5, - magicnumber: int = 0, - stoploss: float = 0.0, - takeprofit: float = 0.0, - comment: str = '', - market: bool = False - ) -> int: - """ - Open an order. - - Args: - instrument: instrument - ordertype: type of order, buy, sell, buy stop, sell stop, buy limit, sell limit - volume: order volume/lot size - open price: open price for order, 0.0 for market orders - slippage: allowed slippage - magicnumber: magic number for this order - stoploss: order stop loss price, actual price, so not relative to open price - takeprofit: order take profit, actual price, so not relative to open price - comment: order comment - Returns: - int: ticket number. If -1, open order failed - """ - - self.command_return_error = '' - self.instrument_name_universal = instrument.upper() - # check the command for '^' , '$', '!' character - # these are not allowed, used as delimiters - comment.replace('^', '') - comment.replace('$', '') - comment.replace('!', '') - broker_instrument = self.get_broker_instrument_name(self.instrument_name_universal) - if (broker_instrument == None): - self.command_return_error = 'Instrument not known, check brookerlookuptable' - self.command_OK = False - self.order_return_message = 'Instrument not known, check brookerlookuptable' - return int(-1) - - self.command = 'F070^10^' + self.get_broker_instrument_name(self.instrument_name_universal) + '^' + ordertype + '^' + str(volume) + '^' + \ - str(openprice) + '^' + str(slippage) + '^' + str(magicnumber) + '^' + str(stoploss) + '^' + str(takeprofit) + '^' + str(comment) + '^' + str(market) + '^' - #print(self.command) - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return int(-1) - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F070': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - self.order_error = int(x[4]) - return int(-1) - - self.command_OK = True - - if (int(x[1]) == 3): - self.order_return_message = str(x[2]) - return int(x[3]) - - def Close_position_by_ticket(self, - ticket: int = 0) -> bool: - """ - Close a position. - - Args: - ticket: ticket of position to close - - Returns: - bool: True or False - """ - self.command_return_error = '' - self.command = 'F071^1^' + str(ticket) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F071': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - self.order_error = int(x[4]) - return False - - return True - - def Close_position_partial_by_ticket(self, - ticket: int = 0, - volume_to_close: float = 0.01) -> bool: - """ - Close a position partial. - - Args: - ticket: ticket of position to close - volume_to_close: volume part to close, must be small then order volume - Returns: - bool: True or False - """ - self.command_return_error = '' - self.command = 'F072^2^' + \ - str(ticket) + '^' + str(volume_to_close) + '^' - - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F072': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - #self.order_error = ERROR_DICT[str(x[3])] - return False - - return True - - def Delete_order_by_ticket(self, - ticket: int = 0) -> bool: - """ - Delete an order. - - Args: - ticket: ticket of order(pending) to delete - - Returns: - bool: True or False - """ - self.command_return_error = '' - self.command = 'F073^1^' + str(ticket) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F073': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - self.order_error = int(x[4]) - return False - - return True - - def Set_sl_and_tp_for_position(self, - ticket: int = 0, - stoploss: float = 0.0, - takeprofit: float = 0.0) -> bool: - """ - Change stop loss and take profit for a position. - - Args: - ticket: ticket of position to change - stoploss; new stop loss value, must be actual price value - takeprofit: new take profit value, must be actual price value - - Returns: - bool: True or False - """ - self.command_return_error = '' - self.command = 'F075^3^' + \ - str(ticket) + '^' + str(stoploss) + '^' + str(takeprofit) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F075': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - self.order_error = int(x[4]) - return False - - self.command_OK = True - return True - - def Set_sl_and_tp_for_order(self, - ticket: int = 0, - stoploss: float = 0.0, - takeprofit: float = 0.0) -> bool: - """ - Change stop loss and take profit for an order. - - Args: - ticket: ticket of order to change - stoploss; new stop loss value, must be actual price value - takeprofit: new take profit value, must be actual price value - - Returns: - bool: True or False - """ - self.command_return_error = '' - self.command = 'F076^3^' + \ - str(ticket) + '^' + str(stoploss) + '^' + str(takeprofit) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F076': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - self.order_error = int(x[4]) - return False - - self.command_OK = True - return True - - def Reset_sl_and_tp_for_position(self, - ticket: int = 0) -> bool: - """ - Reset stop loss and take profit for a position. - - Args: - ticket: ticket of position to change - - Returns: - bool: True or False - """ - self.command_return_error = '' - self.command = 'F077^1^' + str(ticket) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F077': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - self.order_error = int(x[4]) - return False - - self.command_OK = True - return True - - def Reset_sl_and_tp_for_order(self, - ticket: int = 0) -> bool: - """ - Reset stop loss and take profit for an order. - - Args: - ticket: ticket of order to change - - - Returns: - bool: True or False - """ - self.command_return_error = '' - self.command = 'F078^1^' + str(ticket) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F078': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - self.order_error = int(x[4]) - return False - - self.command_OK = True - return True - - def send_command(self, - command): - self.command = command + "!" - self.timeout = False - #print(self.command) - #print(self.socket) - #self.sock.send(bytes(self.command, "utf-8")) - try: - self.sock.send(bytes(self.command, "utf-8")) - data_received = '' - while True: - data_received = data_received + self.sock.recv(500000).decode() - if data_received.endswith('!'): - break - return True, data_received - except socket.timeout as msg: - self.timeout = True - self.command_return_error = 'Unexpected socket communication error' - print(msg) - return False, None - - def get_timeframe_value(self, - timeframe: str = 'D1') -> int: - - self.tf = 16408 # mt5.TIMEFRAME_D1 - timeframe.upper() - if timeframe == 'MN1': - self.tf = 49153 # mt5.TIMEFRAME_MN1 - if timeframe == 'W1': - self.tf = 32769 # mt5.TIMEFRAME_W1 - if timeframe == 'D1': - self.tf = 16408 # mt5.TIMEFRAME_D1 - if timeframe == 'H12': - self.tf = 16396 # mt5.TIMEFRAME_H12 - if timeframe == 'H8': - self.tf = 16392 # mt5.TIMEFRAME_H8 - if timeframe == 'H6': - self.tf = 16390 # mt5.TIMEFRAME_H6 - if timeframe == 'H4': - self.tf = 16388 # mt5.TIMEFRAME_H4 - if timeframe == 'H3': - self.tf = 16387 # mt5.TIMEFRAME_H3 - if timeframe == 'H2': - self.tf = 16386 # mt5.TIMEFRAME_H2 - if timeframe == 'H1': - self.tf = 16385 # mt5.TIMEFRAME_H1 - if timeframe == 'M30': - self.tf = 30 # mt5.TIMEFRAME_M30 - if timeframe == 'M20': - self.tf = 20 # mt5.TIMEFRAME_M20 - if timeframe == 'M15': - self.tf = 15 # mt5.TIMEFRAME_M15 - if timeframe == 'M12': - self.tf = 12 # mt5.TIMEFRAME_M12 - if timeframe == 'M10': - self.tf = 10 # mt5.TIMEFRAME_M10 - if timeframe == 'M6': - self.tf = 6 # mt5.TIMEFRAME_M6 - if timeframe == 'M5': - self.tf = 5 # mt5.TIMEFRAME_M5 - if timeframe == 'M4': - self.tf = 4 # mt5.TIMEFRAME_M4 - if timeframe == 'M3': - self.tf = 3 # mt5.TIMEFRAME_M3 - if timeframe == 'M2': - self.tf = 2 # mt5.TIMEFRAME_M2 - if timeframe == 'M1': - self.tf = 1 # mt5.TIMEFRAME_M1 - - return self.tf - - def get_broker_instrument_name(self, - instrumentname: str = '') -> str: - self.intrumentname = instrumentname - try: - # str result = - # (string)self.instrument_conversion_list.get(str(instrumentname)) - return self.instrument_conversion_list.get(str(instrumentname)) - except BaseException: - return 'none' - - def get_universal_instrument_name(self, - instrumentname: str = '') -> str: - self.instrumentname = instrumentname - try: - for item in self.instrument_conversion_list: - key = str(item) - value = self.instrument_conversion_list.get(item) - if (value == instrumentname): - return str(key) - except BaseException: - return 'none' - return 'none' - - def create_empty_DataFrame(self, - columns, index_col) -> pd.DataFrame: - index_type = next((t for name, t in columns if name == index_col)) - df = pd.DataFrame({name: pd.Series(dtype=t) for name, - t in columns if name != index_col}, - index=pd.Index([], - dtype=index_type)) - cols = [name for name, _ in columns] - cols.remove(index_col) - return df[cols] - - columnsOpenOrders = [ - ('id', int), - ('ticket', int), - ('instrument', str), - ('order_type', str), - ('magic_number', int), - ('volume', float), - ('open_price', float), - ('open_time', int), - ('stop_loss', float), - ('take_profit', float), - ('comment', str)] - - columnsDeletedOrders = [ - ('id', int), - ('ticket', int), - ('instrument', str), - ('order_type', str), - ('magic_number', int), - ('volume', float), - ('open_price', float), - ('open_time', int), - ('stop_loss', float), - ('take_profit', float), - ('delete_price', float), - ('delete_time', int), - ('comment', str)] - - columnsOpenPositions = [ - ('id', int), - ('ticket', int), - ('instrument', str), - ('order_ticket', int), - ('position_type', str), - ('magic_number', int), - ('volume', float), - ('open_price', float), - ('open_time', int), - ('stop_loss', float), - ('take_profit', float), - ('comment', str), - ('profit', float), - ('swap', float), - ('commission', float)] - - columnsClosedPositions = [ - ('id', int), - ('ticket', int), - ('instrument', str), - ('order_ticket', int), - ('position_type', str), - ('magic_number', int), - ('volume', float), - ('open_price', float), - ('open_time', int), - ('stop_loss', float), - ('take_profit', float), - ('close_price', float), - ('close_time', int), - ('comment', str), - ('profit', float), - ('swap', float), - ('commission', float)] - - diff --git a/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/utils/api/Pytrader_API_V3_01a.py b/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/utils/api/Pytrader_API_V3_01a.py deleted file mode 100644 index f44c712..0000000 --- a/resources/PyTrader-python-mt4-mt5-trading-api-connector-drag-n-drop-test/utils/api/Pytrader_API_V3_01a.py +++ /dev/null @@ -1,2274 +0,0 @@ -# Pytrader API for MT4 and MT5 -# Version V3_01 - -import socket -import numpy as np -import pandas as pd -from datetime import datetime -import pytz -import io - -TZ_SERVER = 'Europe/Tallinn' # EET -TZ_LOCAL = 'Europe/Budapest' -TZ_UTC = 'UTC' - -ERROR_DICT = {} -ERROR_DICT['00001'] = 'Undefined check connection error' - -ERROR_DICT['00101'] = 'IP address error' -ERROR_DICT['00102'] = 'Port number error' -ERROR_DICT['00103'] = 'Connection error with license EA' -ERROR_DICT['00104'] = 'Undefined answer from license EA' - -ERROR_DICT['00301'] = 'Unknown instrument for broker' -ERROR_DICT['00302'] = 'Instrument not in demo' -ERROR_DICT['00304'] = 'Unknown instrument for broker' - -ERROR_DICT['00401'] = 'Instrument not in demo' -ERROR_DICT['00402'] = 'Instrument not exists for broker' - -ERROR_DICT['00501'] = 'No instrument defined/configured' - -ERROR_DICT['02001'] = 'Instrument not in demo' -ERROR_DICT['02004'] = 'Unknown instrument for broker' -ERROR_DICT['02003'] = 'Unknown instrument for broker' - -ERROR_DICT['02101'] = 'Instrument not in demo' -ERROR_DICT['02102'] = 'No ticks' -ERROR_DICT['02103'] = 'Not imlemented in MT4' - -ERROR_DICT['04101'] = 'Instrument not in demo' -ERROR_DICT['04102'] = 'Wrong/unknown time frame' -ERROR_DICT['04103'] = 'No records' -ERROR_DICT['04104'] = 'Undefined error' -ERROR_DICT['04105'] = 'Unknown instrument for broker' - - -ERROR_DICT['04201'] = 'Instrument not in demo' -ERROR_DICT['04202'] = 'Wrong/unknown time frame' -ERROR_DICT['04203'] = 'No records' -ERROR_DICT['04204'] = 'Unknown instrument for broker' - -ERROR_DICT['04501'] = 'Instrument not in demo' -ERROR_DICT['04502'] = 'Wrong/unknown time frame' -ERROR_DICT['04503'] = 'No records' -ERROR_DICT['04504'] = 'Missing market instrument' - -ERROR_DICT['06201'] = 'Wrong time window' -ERROR_DICT['06401'] = 'Wrong time window' - -ERROR_DICT['07001'] = 'Trading not allowed, check MT terminal settings' -ERROR_DICT['07002'] = 'Instrument not in demo' -ERROR_DICT['07003'] = 'Instrument not in market watch' -ERROR_DICT['07004'] = 'Instrument not known for broker' -ERROR_DICT['07005'] = 'Unknown order type' -ERROR_DICT['07006'] = 'Wrong SL value' -ERROR_DICT['07007'] = 'Wrong TP value' -ERROR_DICT['07008'] = 'Wrong volume value' -ERROR_DICT['07009'] = 'Error opening market order' -ERROR_DICT['07010'] = 'Error opening pending order' -ERROR_DICT['07011'] = 'Unknown instrument for broker' - -ERROR_DICT['07101'] = 'Trading not allowed' -ERROR_DICT['07102'] = 'Position not found/error' - -ERROR_DICT['07201'] = 'Trading not allowed' -ERROR_DICT['07202'] = 'Position not found/error' -ERROR_DICT['07203'] = 'Wrong volume' -ERROR_DICT['07204'] = 'Error in partial close' - -ERROR_DICT['07301'] = 'Trading not allowed' -ERROR_DICT['07302'] = 'Error in delete' - -ERROR_DICT['07401'] = 'Trading not allowed, check MT terminal settings' -ERROR_DICT['07402'] = 'Error check number' -ERROR_DICT['07403'] = 'Position does not exist' -ERROR_DICT['07404'] = 'Opposite position does not exist' -ERROR_DICT['07405'] = 'Both position of same type' - -ERROR_DICT['07501'] = 'Trading not allowed' -ERROR_DICT['07502'] = 'Position not open' -ERROR_DICT['07503'] = 'Error in modify' - -ERROR_DICT['07601'] = 'Trading not allowed' -ERROR_DICT['07602'] = 'Position not open' -ERROR_DICT['07603'] = 'Error in modify' - -ERROR_DICT['07701'] = 'Trading not allowed' -ERROR_DICT['07702'] = 'Position not open' -ERROR_DICT['07703'] = 'Error in modify' - -ERROR_DICT['07801'] = 'Trading not allowed' -ERROR_DICT['07802'] = 'Position not open' -ERROR_DICT['07803'] = 'Error in modify' - -ERROR_DICT['07901'] = 'Trading not allowed' -ERROR_DICT['07902'] = 'Instrument not in demo' -ERROR_DICT['07903'] = 'Order does not exist' -ERROR_DICT['07904'] = 'Wrong order type' -ERROR_DICT['07905'] = 'Wrong price' -ERROR_DICT['07906'] = 'Wrong TP value' -ERROR_DICT['07907'] = 'Wrong SL value' -ERROR_DICT['07908'] = 'Check error code' -ERROR_DICT['07909'] = 'Something wrong' - -ERROR_DICT['08101'] = 'Unknown global variable' - -ERROR_DICT['08201'] = 'Log file not existing' -ERROR_DICT['08202'] = 'Log file empty' -ERROR_DICT['08203'] = 'Error in reading log file' - -ERROR_DICT['99900'] = 'Wrong authorizaton code' - -ERROR_DICT['99901'] = 'Undefined error' - -ERROR_DICT['99999'] = 'Dummy' - - -class Pytrader_API: - - def __init__(self): - self.socket_error: int = 0 - self.socket_error_message: str = '' - self.order_return_message: str = '' - self.order_error: int = 0 - self.connected: bool = False - self.timeout: bool = False - self.command_OK: bool = False - self.command_return_error: str = '' - self.debug: bool = False - self.version: str = 'V3.01' - self.max_bars: int = 5000 - self.max_ticks: int = 5000 - self.timeout_value: int = 60 - self.instrument_conversion_list: dict = {} - self.instrument_name_broker: str = '' - self.instrument_name_universal: str = '' - self.date_from: datetime = '2000/01/01, 00:00:00' - self.date_to: datetime = datetime.now() - self.instrument: str = '' - self.license = 'Demo' - self.invert_array = False - self.authorization_code: str = 'None' - - def Set_timeout(self, - timeout_in_seconds: int = 60 - ): - """ - Set time out value for socket communication with MT4 or MT5 EA/Bot. - - Args: - timeout_in_seconds: the time out value - Returns: - None - """ - self.timeout_value = timeout_in_seconds - self.sock.settimeout(self.timeout_value) - self.sock.setblocking(1) - return - - def Disconnect(self): - """ - Closes the socket connection to a MT4 or MT5 EA bot. - - Args: - None - Returns: - bool: True or False - """ - - self.sock.close() - return True - - def Connect(self, - server: str = '', - port: int = 2345, - instrument_lookup: dict = [], - authorization_code: str = 'None') -> bool: - """ - Connects to a MT4 or MT5 EA/Bot. - - Args: - server: Server IP address, like -> '127.0.0.1', '192.168.5.1' - port: port number - instrument_lookup: dictionairy with general instrument names and broker intrument names - authorization_code: authorization code, this can be used as extra security. The code has also to be set in the EA's - Returns: - bool: True or False - """ - self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.sock.setblocking(1) - self.port = port - self.server = server - self.instrument_conversion_list = instrument_lookup - self.authorization_code = authorization_code - - if (len(self.instrument_conversion_list) == 0): - print('Broker Instrument list not available or empty') - self.socket_error_message = 'Broker Instrument list not available' - return False - - try: - self.sock.connect((self.server, self.port)) - try: - data_received = self.sock.recv(1000000) - self.connected = True - self.socket_error = 0 - self.socket_error_message = '' - return True - except socket.error as msg: - self.socket_error = 100 - self.socket_error_message = 'Could not connect to server.' - self.connected = False - return False - except socket.error as msg: - print( - "Couldnt connect with the socket-server: %self.sock\n terminating program" % - msg) - self.connected = False - self.socket_error = 101 - self.socket_error_message = 'Could not connect to server.' - return False - - def Check_connection(self) -> bool: - """ - Checks if connection with MT terminal/Ea bot is still active. - Args: - None - Returns: - bool: True or False - """ - - self.command = 'F000^1^' - self.command_return_error = '' - ok, dataString = self.send_command(self.command) - - try: - if (ok == False): - self.command_OK = False - return False - - x = dataString.split('^') - - if x[1] == 'OK': - self.timeout = True - self.command_OK = True - return True - else: - self.timeout = False - self.command_return_error = ERROR_DICT['99900'] - self.command_OK = True - return False - except: - self.command_return_error = ERROR_DICT['00001'] - self.command_OK = False - return False - - @property - def IsConnected(self) -> bool: - """Returns connection status. - Returns: - bool: True or False - """ - return self.connected - - def Get_static_account_info(self) -> dict: - """ - Retrieves static account information. - - Returns: Dictionary with: - Account name, - Account number, - Account currency, - Account type, - Account leverage, - Account trading allowed, - Account maximum number of pending orders, - Account margin call percentage, - Account close open trades margin percentage, - Account company - """ - self.command_return_error = '' - - ok, dataString = self.send_command('F001^1^') - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if x[0] != 'F001': - self.command_return_error = ERROR_DICT['99900'] - self.command_OK = False - return None - - returnDict = { - 'name': str(x[2]), - 'login': str(x[3]), - 'currency': str(x[4]), - 'type': str(x[5]), - 'leverage': int(x[6]), - 'trade_allowed': bool(int(x[7])), - 'limit_orders': int(x[8]), - 'margin_call': float(x[9]), - 'margin_close': float(x[10]), - 'company': str(x[11]) - } - - self.command_OK = True - return returnDict - - - def Get_dynamic_account_info(self) -> dict: - """ - Retrieves dynamic account information. - - Returns: Dictionary with: - Account balance, - Account equity, - Account profit, - Account margin, - Account margin level, - Account margin free - """ - self.command_return_error = '' - - ok, dataString = self.send_command('F002^1^') - if (ok == False): - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if x[0] != 'F002': - self.command_return_error = ERROR_DICT['99900'] - self.command_OK = False - return None - - returnDict = {} - del x[0:2] - x.pop(-1) - - returnDict['balance'] = float(x[0]) - returnDict['equity'] = float(x[1]) - returnDict['profit'] = float(x[2]) - returnDict['margin'] = float(x[3]) - returnDict['margin_level'] = float(x[4]) - returnDict['margin_free'] = float(x[5]) - - self.command_OK = True - return returnDict - - def Check_license(self) -> bool: - """ - Check for license. - - Returns: - bool: True or False. True=licensed, False=Demo - """ - self.license = 'Demo' - self.command = 'F006^1^' - self.command_return_error = '' - ok, dataString = self.send_command(self.command) - - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if x[0] != 'F006': - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - self.license = str(x[3]) - if (self.license == 'Demo'): - return False - - return True - - def Check_trading_allowed(self, - instrument='EURUSD') -> bool: - """ - Check for trading allowed for specified symbol. - - Returns: - bool: True or False. True=allowed, False=not allowed - """ - - self.command = 'F008^2^' + instrument + '^' - self.command_return_error = '' - ok, dataString = self.send_command(self.command) - - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if x[0] != 'F008': - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - if (str(x[2]) == 'NOK'): - return False - - return True - - def Set_bar_date_asc_desc(self, - asc_desc: bool = False) -> bool: - """ - Sets first row of array as first bar or as last bar - In MT4/5 element[0] of an array is normaliter actual bar/candle - Depending on the math you want to apply, this has to be the opposite - Args: - asc_dec: True = row[0] is oldest bar - False = row[0] is latest bar - Returns: - bool: True or False - """ - self.invert_array = asc_desc - return True - - def Get_PnL(self, - date_from: datetime = datetime( - 2021, 3, 1, tzinfo=pytz.timezone("Etc/UTC")), - date_to: datetime = datetime.now()) -> pd.DataFrame: - ''' - Retrieves profit loss info. - - Args: - date_from: start date - date_to: end date - Returns: Dictionary with: - realized_profit profit of all closed positions - unrealized_profit profit of all open positions - buy_profit profit of closed buy positions - sell_profit profit of closed sell positions - positions_in_profit number of profit positions - positions in loss number of loss positions - volume_in_profit total volume of positions in profit - volume_in_loss total volume of positions in loss - ''' - total_profit = 0.0 - buy_profit = 0.0 - sell_profit = 0.0 - trades_in_loss = 0 - trades_in_profit = 0 - volume_in_loss = 0.0 - volume_in_profit = 0.0 - commission_in_loss = 0.0 - commission_in_profit = 0.0 - swap_in_loss = 0.0 - swap_in_profit = 0.0 - unrealized_profit = 0.0 - - # retrieve closed positions - closed_positions = self.Get_closed_positions_within_window( - date_from, date_to) - if type(closed_positions) == pd.DataFrame: - for position in closed_positions.itertuples(): - profit = position.profit + position.commission + position.swap - total_profit = total_profit + profit - if (profit > 0.0): - trades_in_profit = trades_in_profit + 1 - volume_in_profit = volume_in_profit + position.volume - commission_in_profit = commission_in_profit + position.commission - swap_in_profit = swap_in_profit + position.swap - else: - trades_in_loss = trades_in_loss + 1 - volume_in_loss = volume_in_loss + position.volume - commission_in_loss = commission_in_loss + position.commission - swap_in_loss = swap_in_loss + position.swap - if (position.position_type == 'sell'): - sell_profit = sell_profit + profit - if (position.position_type == 'buy'): - buy_profit = buy_profit + profit - - # retrieve dynamic account info - dynamic_info = self.Get_dynamic_account_info() - unrealized_profit = dynamic_info['equity'] - \ - dynamic_info['balance'] - result = {} - result['realized_profit'] = total_profit - result['unrealized_profit'] = unrealized_profit - result['buy_profit'] = buy_profit - result['sell_profit'] = sell_profit - result['positions_in_profit'] = trades_in_profit - result['positions_in_loss'] = trades_in_loss - result['volume_in_profit'] = volume_in_profit - result['volume_in_loss'] = volume_in_loss - - return result - else: - return pd.DataFrame() - - def Get_instrument_info(self, - instrument: str = 'EURUSD') -> dict: - """ - Retrieves instrument information. - - Args: - instrument: instrument name - Returns: Dictionary with: - instrument, - digits, - max_lotsize, - min_lotsize, - lot_step, - point, - tick_size, - tick_value - swap_long - swap_short - stop_level minimal distance for sl and tp distance in points - min_distance for pendings in points - """ - - self.command_return_error = '' - self.instrument_name_universal = instrument.upper() - self.instrument = self.get_broker_instrument_name( - self.instrument_name_universal) - if (self.instrument == 'none' or self.instrument == None): - self.command_return_error = 'Instrument not in broker list' - self.command_OK = False - return None - - self.command = 'F003^2^' + self.instrument + '^' - - ok, dataString = self.send_command(self.command) - - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if x[0] != 'F003': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - returnDict = {} - del x[0:2] - x.pop(-1) - - returnDict['instrument'] = str(self.instrument_name_universal) - returnDict['digits'] = int(x[0]) - returnDict['max_lotsize'] = float(x[1]) - returnDict['min_lotsize'] = float(x[2]) - returnDict['lot_step'] = float(x[3]) - returnDict['point'] = float(x[4]) - returnDict['tick_size'] = float(x[5]) - returnDict['tick_value'] = float(x[6]) - returnDict['swap_long'] = float(x[7]) - returnDict['swap_short'] = float(x[8]) - returnDict['stop_level'] = int(x[9]) - returnDict['min_distance'] = int(x[10]) - - self.command_OK = True - return returnDict - - def Check_instrument(self, - instrument: str = 'EURUSD') -> str: - """ - Check if instrument known / market watch at broker. - - Args: - instrument: instrument name - Returns: - bool: True or False - """ - self.instrument_name_universal = instrument.upper() - self.instrument = self.get_broker_instrument_name( - self.instrument_name_universal) - if (self.instrument == 'none' or self.instrument == None): - self.command_return_error = 'Instrument not in list' - self.command_OK = False - return None - - self.command = 'F004^2^' + self.instrument + '^' - ok, dataString = self.send_command(self.command) - - if not ok: - self.command_OK = False - return False, 'Error' - - if self.debug: - print(dataString) - - x = dataString.split('^') - if x[0] != 'F004': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return False, str(x[2]) - - return True, str(x[2]) - - def Get_instruments(self) -> list: - """ - Retrieves broker market instruments list. - - Args: - None - Returns: - List: All market symbols as universal instrument names - """ - self.command_return_error = '' - - self.command = 'F007^2^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - # analyze the answer - return_list = [] - x = dataString.split('^') - if x[0] != 'F007': - self.command_return_error = ERROR_DICT[x[3]] - self.command_OK = False - return return_list - - del x[0:2] - x.pop(-1) - for item in range(0, len(x)): - _instrument = str(x[item]) - instrument = self.get_universal_instrument_name(_instrument) - if (instrument != None): - return_list.append(instrument) - return return_list - - def Get_broker_server_time(self) -> datetime: - """ - Retrieves broker server time. - - Args: - None - Returns: - datetime: Boker time - """ - self.command_return_error = '' - self.command = 'F005^1^' - ok, dataString = self.send_command(self.command) - - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if x[0] != 'F005': - self.command_return_error = ERROR_DICT[x[3]] - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - y = x[0].split('-') - d = datetime(int(y[0]), int(y[1]), int(y[2]), - int(y[3]), int(y[4]), int(y[5])) - return d - - def Get_last_tick_info(self, - instrument: str = 'EURUSD') -> dict: - """ - Retrieves instrument last tick data. - - Args: - instrument: instrument name - Returns: Dictionary with: - instrument name, - date, - ask, - bid, - last deal price, - volume - spread, in points - date_in_ms - """ - self.command_return_error = '' - self.instrument_name_universal = instrument.upper() - self.instrument = self.get_broker_instrument_name( - self.instrument_name_universal) - if (self.instrument == 'none' or self.instrument == None): - self.command_return_error = 'Instrument not in broker list' - self.command_OK = False - return None - ok, dataString = self.send_command('F020^2^' + self.instrument + '^') - - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if x[0] != 'F020': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - returnDict = {} - del x[0:2] - x.pop(-1) - - returnDict['instrument'] = str(self.instrument_name_universal) - returnDict['date'] = int(x[0]) - returnDict['ask'] = float(x[1]) - returnDict['bid'] = float(x[2]) - returnDict['last'] = float(x[3]) - returnDict['volume'] = int(x[4]) - returnDict['spread'] = float(x[5]) - returnDict['date_in_ms'] = int(x[6]) - - self.command_OK = True - return returnDict - - def Get_last_x_ticks_from_now(self, - instrument: str = 'EURUSD', - nbrofticks: int = 2000) -> np.array: - """ - Retrieves last x ticks from an instrument. - - Args: - instrument: instrument name - nbrofticks: number of ticks to retriev - Returns: numpy array with: - date, - ask, - bid, - last volume, - volume - """ - self.command_return_error = '' - self.instrument_name_universal = instrument.upper() - self.instrument = self.get_broker_instrument_name( - self.instrument_name_universal) - if (self.instrument == 'none' or self.instrument == None): - self.command_return_error = 'Instrument not in broker list' - self.command_OK = False - return None - - self.nbrofticks = nbrofticks - - dt = np.dtype([('date', np.int64), ('ask', np.float64), ('bid', - np.float64), ('last', np.float64), ('volume', np.int32)]) - - ticks = np.zeros(nbrofticks, dtype=dt) - - if (self.nbrofticks > self.max_ticks): - iloop = self.nbrofticks // self.max_ticks - itail = self.nbrofticks % self.max_ticks - - for index in range(0, iloop): - self.command = 'F021^4^' + self.instrument + '^' + \ - str(index * self.max_ticks) + \ - '^' + str(self.max_ticks) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return None - if self.debug: - print(dataString) - print('') - print(len(dataString)) - - x = dataString.split('^') - if str(x[0]) != 'F021': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - - for value in range(0, len(x)): - y = x[value].split('$') - - ticks[value + index * self.max_ticks][0] = int(y[0]) - ticks[value + index * self.max_ticks][1] = float(y[1]) - ticks[value + index * self.max_ticks][2] = float(y[2]) - ticks[value + index * self.max_ticks][3] = float(y[3]) - ticks[value + index * self.max_ticks][4] = int(y[4]) - - if (len(x) < self.max_ticks): - ticks = np.sort(ticks[ticks[:]['date'] != 0]) - self.command_OK = True - if (self.invert_array == True): - ticks = np.flipud(ticks) - return ticks - - if (itail == 0): - ticks = np.sort(ticks[ticks[:]['date'] != 0]) - self.command_OK = True - return ticks - - if (itail > 0): - self.command = 'F021^4^' + self.instrument + '^' + \ - str(iloop * self.max_ticks) + '^' + str(itail) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return None - if self.debug: - print(dataString) - print('') - print(len(dataString)) - - x = dataString.split('^') - if str(x[0]) != 'F021': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - - for value in range(0, len(x)): - y = x[value].split('$') - - ticks[value + iloop * self.max_ticks][0] = int(y[0]) - ticks[value + iloop * self.max_ticks][1] = float(y[1]) - ticks[value + iloop * self.max_ticks][2] = float(y[2]) - ticks[value + iloop * self.max_ticks][3] = float(y[3]) - ticks[value + iloop * self.max_ticks][4] = int(y[4]) - - self.command_OK = True - ticks = np.sort(ticks[ticks[:]['date'] != 0]) - if (self.invert_array == True): - ticks = np.flipud(ticks) - return ticks - else: - self.command = 'F021^4^' + self.instrument + \ - '^' + str(0) + '^' + str(self.nbrofticks) + '^' - ok, dataString = self.send_command(self.command) - - if not ok: - self.command_OK = False - return None - if self.debug: - print(dataString) - print('') - print(len(dataString)) - - x = dataString.split('^') - if str(x[0]) != 'F021': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - - for value in range(0, len(x)): - y = x[value].split('$') - - ticks[value][0] = int(y[0]) - ticks[value][1] = float(y[1]) - ticks[value][2] = float(y[2]) - ticks[value][3] = float(y[3]) - ticks[value][4] = int(y[4]) - - self.command_OK = True - ticks = np.sort(ticks[ticks[:]['date'] != 0]) - if (self.invert_array == True): - ticks = np.flipud(ticks) - # return ticks - return ticks[:len(x)] - - def Get_actual_bar_info(self, - instrument: str = 'EURUSD', - timeframe: int = 16408) -> dict: - """ - Retrieves instrument last actual data. - - Args: - instrument: instrument name - timeframe: time frame like H1, H4 - Returns: Dictionary with: - instrument name, - date, - open, - high, - low, - close, - volume, - """ - self.command_return_error = '' - self.instrument_name_universal = instrument.upper() - self.instrument = self.get_broker_instrument_name( - self.instrument_name_universal) - if (self.instrument == 'none' or self.instrument == None): - self.command_return_error = 'Instrument not in broker list' - self.command_OK = False - return None - self.command = 'F041^3^' + self.instrument + '^' + str(timeframe) + '^' - ok, dataString = self.send_command(self.command) - - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F041': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - returnDict = {} - returnDict['instrument'] = str(self.instrument_name_universal) - returnDict['date'] = int(x[0]) - returnDict['open'] = float(x[1]) - returnDict['high'] = float(x[2]) - returnDict['low'] = float(x[3]) - returnDict['close'] = float(x[4]) - returnDict['volume'] = int(x[5]) - - self.command_OK = True - return returnDict - - def Get_specific_bar(self, - instrument_list: list = ['EURUSD', 'GBPUSD'], - specific_bar_index: int = 1, - timeframe: int = 16408) -> dict: - """ - Retrieves instrument data(d, o, h, l, c, v) of one bar(index) for the instruments in the list. - - Args: - instrument: instrument name - specific_bar_index: the specific bar (0 = actual bar) - timeframe: time frame like H1, H4 - Returns: Dictionary with: {instrument:{instrument data}} - instrument name, - [date, - open, - high, - low, - close, - volume] - """ - self.command_return_error = '' - # compose MT5 command string - self.command = 'F045^3^' - for index in range(0, len(instrument_list), 1): - _instr = self.get_broker_instrument_name( - instrument_list[index].upper()) - if (self.instrument == 'none' or self.instrument == None): - self.command_return_error = 'Instrument not in broker list' - self.command_OK = False - return None - self.command = self.command + _instr + '$' - - self.command = self.command + '^' + \ - str(specific_bar_index) + '^' + str(timeframe) + '^' - ok, dataString = self.send_command(self.command) - - if not ok: - self.command_OK = False - return None - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F045': - self.command_return_error = str(x[2]) - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - result = {} - - for value in range(0, len(x)): - y = x[value].split('$') - symbol_result = {} - symbol = str(y[0]) - symbol_result['date'] = int(y[1]) - symbol_result['open'] = float(y[2]) - symbol_result['high'] = float(y[3]) - symbol_result['low'] = float(y[4]) - symbol_result['close'] = float(y[5]) - symbol_result['volume'] = float(y[6]) - result[symbol] = symbol_result - - return result - - def Get_last_x_bars_from_now(self, - instrument: str = 'EURUSD', - timeframe: int = 16408, - nbrofbars: int = 1000) -> np.array: - """ - Retrieves last x bars from a MT4 or MT5 EA bot. - - Args: - instrument: name of instrument like EURUSD - timeframe: timeframe like 'H4' - nbrofbars: Number of bars to retrieve - Returns: numpy array with: - date, - open, - high, - low, - close, - volume - """ - self.command_return_error = '' - self.instrument_name_universal = instrument.upper() - self.instrument = self.get_broker_instrument_name( - self.instrument_name_universal) - if (self.instrument == 'none' or self.instrument == None): - self.command_return_error = 'Instrument not in broker list' - self.command_OK = False - return None - self.numberofbars = nbrofbars - - dt = np.dtype([('date', np.int64), ('open', np.float64), ('high', np.float64), - ('low', np.float64), ('close', np.float64), ('volume', np.int32)]) - - rates = np.zeros(self.numberofbars, dtype=dt) - - if (self.numberofbars > self.max_bars): - iloop = self.numberofbars // self.max_bars - itail = self.numberofbars % self.max_bars - - for index in range(0, iloop): - self.command = 'F042^5^' + self.instrument + '^' + \ - str(timeframe) + '^' + str(index * self.max_bars) + \ - '^' + str(self.max_bars) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return None - if self.debug: - print(dataString) - print('') - print(len(dataString)) - - x = dataString.split('^') - if str(x[0]) != 'F042': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - - for value in range(0, len(x)): - y = x[value].split('$') - - rates[value + index * self.max_bars][0] = int(y[0]) - rates[value + index * self.max_bars][1] = float(y[1]) - rates[value + index * self.max_bars][2] = float(y[2]) - rates[value + index * self.max_bars][3] = float(y[3]) - rates[value + index * self.max_bars][4] = float(y[4]) - rates[value + index * self.max_bars][5] = int(y[5]) - - if (len(x) < self.max_bars): - # rates = np.sort(rates) - rates = np.sort(rates[rates[:]['date'] != 0]) - self.command_OK = True - if (self.invert_array == True): - rates = np.flipud(rates) - return rates - - if (itail == 0): - # rates = np.sort(rates) - rates = np.sort(rates[rates[:]['date'] != 0]) - self.command_OK = True - if (self.invert_array == True): - rates = np.flipud(rates) - return rates - - if (itail > 0): - self.command = 'F042^5^' + self.instrument + '^' + str(timeframe) + '^' + str( - iloop * self.max_bars) + '^' + str(itail) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return None - if self.debug: - print(dataString) - print('') - print(len(dataString)) - - x = dataString.split('^') - if str(x[0]) != 'F042': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - - for value in range(0, len(x)): - y = x[value].split('$') - - rates[value + iloop * self.max_bars][0] = int(y[0]) - rates[value + iloop * self.max_bars][1] = float(y[1]) - rates[value + iloop * self.max_bars][2] = float(y[2]) - rates[value + iloop * self.max_bars][3] = float(y[3]) - rates[value + iloop * self.max_bars][4] = float(y[4]) - rates[value + iloop * self.max_bars][5] = int(y[5]) - - self.command_OK = True - # rates = np.sort(rates) - rates = np.sort(rates[rates[:]['date'] != 0]) - if (self.invert_array == True): - rates = np.flipud(rates) - return rates - else: - self.command = 'F042^5^' + str(self.instrument) + '^' + \ - str(timeframe) + '^' + str(0) + \ - '^' + str(self.numberofbars) + '^' - # print(self.command) - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - print('not ok') - return None - if self.debug: - print(dataString) - print('') - print(len(dataString)) - - x = dataString.split('^') - if str(x[0]) != 'F042': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - del x[0:2] - x.pop(-1) - - for value in range(0, len(x)): - y = x[value].split('$') - - rates[value][0] = int(y[0]) - rates[value][1] = float(y[1]) - rates[value][2] = float(y[2]) - rates[value][3] = float(y[3]) - rates[value][4] = float(y[4]) - rates[value][5] = int(y[5]) - - self.command_OK = True - rates = np.sort(rates[rates[:]['date'] != 0]) - if (self.invert_array == True): - rates = np.flipud(rates) - return rates[:len(x)] - - def Get_all_deleted_orders(self) -> pd.DataFrame: - """ - Retrieves all deleted pending orders. - - Args: - - Returns: - data array(panda) with all position information: - ticket, - instrument, - order_type, - magic_number, - volume, - open_price, - open_time, - stop_loss, - take_profit, - delete_price, - delete_time, - comment - """ - - # reset parameters - self.command_return_error = '' - - # get all pending orders - ok, resp = self.send_command("F065^1^") - - if self.debug: - print(resp) - - if ok == True and resp[0:5] == "F065^" and resp[-1] == "!": - nbr = resp[resp.index('^', 3)+1:resp.index('^', 5)] - if int(nbr) != 0: - df = pd.read_table(io.StringIO(resp[resp.index('^', 5)+1:-1]), sep='$', lineterminator='^', - header=None, - names=np.array(self.columnsDeletedOrders[1:])[ - :, 0], - dtype=self.columnsDeletedOrders[1:] - ).fillna('') - # no time conversion - # df.open_time = pd.to_datetime(df.open_time, unit='s').dt.tz_localize(TZ_SERVER).dt.tz_convert(TZ_UTC) - # sort by open_time ascending - df.sort_values(by=['open_time'], ascending=True, inplace=True) - return df - else: - # return empty dataframe - return self.create_empty_DataFrame( - self.columnsDeletedOrders, 'id') - else: - # error - if not ok: - self.command_OK = False - return None - else: - x = resp.split('^') - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - def Get_deleted_orders_within_window(self, - date_from: datetime = datetime( - 2021, 3, 25, tzinfo=pytz.timezone("Etc/UTC")), - date_to: datetime = datetime.now()) -> pd.DataFrame: - """ - Retrieves all deleted pending orders within time window. - Open and close time of order must be within the time window - - Args: - date_from: date to start retrieving orders from - date_to: date to stop retrieving to - Returns: - data array(panda) with all position information: - ticket, - instrument, - order_type, - magic_number, - volume, - open_price, - open_time, - stop_loss, - take_profit, - delete_price, - delete_time, - comment - """ - - # reset/set parameters - self.command_return_error = '' - self.date_from = date_from - self.date_to = date_to - - # get all pending orders - self.command = 'F064^3^' + self.date_from.strftime( - '%Y/%m/%d/%H/%M/%S') + '^' + self.date_to.strftime('%Y/%m/%d/%H/%M/%S') + '^' - ok, resp = self.send_command(self.command) - - if self.debug: - print(resp) - - if ok == True and resp[0:5] == "F064^" and resp[-1] == "!": - nbr = resp[resp.index('^', 3)+1:resp.index('^', 5)] - if int(nbr) != 0: - df = pd.read_table(io.StringIO(resp[resp.index('^', 5)+1:-1]), sep='$', lineterminator='^', - header=None, - names=np.array(self.columnsDeletedOrders[1:])[ - :, 0], - dtype=self.columnsDeletedOrders[1:] - ).fillna('') - # no time conversion - # df.open_time = pd.to_datetime(df.open_time, unit='s').dt.tz_localize(TZ_SERVER).dt.tz_convert(TZ_UTC) - # sort by open_time ascending - df.sort_values(by=['open_time'], ascending=True, inplace=True) - return df - else: - # return empty dataframe - return self.create_empty_DataFrame( - self.columnsDeletedOrders, 'id') - else: - # error - if not ok: - self.command_OK = False - return None - else: - x = resp.split('^') - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - return None - - def Get_all_orders(self) -> pd.DataFrame: - """ - Retrieves all pending orders. - - Args: - - Returns: - data array(panda) with all order information: - ticket, - instrument, - order_type, - magic number, - volume/lotsize, - open price, - open_time, - stop_loss, - take_profit, - comment - """ - - # reset parameters - self.command_return_error = '' - - # get all pending orders - ok, resp = self.send_command("F060^1^") - - if self.debug: - print(resp) - - if ok == True and resp[0:5] == "F060^" and resp[-1] == "!": - nbr = resp[resp.index('^', 3)+1:resp.index('^', 5)] - if int(nbr) != 0: - df = pd.read_table(io.StringIO(resp[resp.index('^', 5)+1:-1]), sep='$', lineterminator='^', - header=None, - names=np.array(self.columnsOpenOrders[1:])[ - :, 0], - dtype=self.columnsOpenOrders[1:] - ).fillna('') - # no time conversion - # df.open_time = pd.to_datetime(df.open_time, unit='s').dt.tz_localize(TZ_SERVER).dt.tz_convert(TZ_UTC) - # sort by open_time ascending - df.sort_values(by=['open_time'], ascending=True, inplace=True) - return df - else: - # return empty dataframe - return self.create_empty_DataFrame( - self.columnsOpenOrders, 'id') - else: - # error - if not ok: - self.command_OK = False - return None - else: - x = resp.split('^') - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - def Get_all_open_positions(self) -> pd.DataFrame: - """ - Retrieves all open positions, market orders for MT4. - - Args: - none - - Returns: - data array(panda) with all position information: - ticket, - instrument, - order_ticket, for MT5 deal ticket, for MT4 order ticket - position_type, - magic_number, - volume/lotsize, - open_price, - open_time, - stopp_loss, - take_profit, - comment, - profit, - swap, - commission - """ - # reset parameters - self.command_return_error = '' - self.command = 'F061^1^' - - # get all open positions - ok, resp = self.send_command(self.command) - - if self.debug: - print(resp) - - if ok == True and resp[0:5] == "F061^" and resp[-1] == "!": - nbr = resp[resp.index('^', 3)+1:resp.index('^', 5)] - if int(nbr) != 0: - df = pd.read_table(io.StringIO(resp[resp.index('^', 5)+1:-1]), sep='$', lineterminator='^', - header=None, - names=np.array(self.columnsOpenPositions[1:])[ - :, 0], - dtype=self.columnsOpenPositions[1:] - ).fillna('') - # no time conversion - # df.open_time = pd.to_datetime(df.open_time, unit='s').dt.tz_localize(TZ_SERVER).dt.tz_convert(TZ_UTC) - # sort by open_time ascending - df.sort_values(by=['open_time'], ascending=True, inplace=True) - return df - else: - # return empty dataframe - return self.create_empty_DataFrame( - self.columnsOpenPositions, 'id') - else: - # error - if not ok: - self.command_OK = False - return None - else: - x = resp.split('^') - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - def Get_closed_positions_within_window(self, - date_from: datetime = datetime( - 2021, 3, 20, tzinfo=pytz.timezone("Etc/UTC")), - date_to: datetime = datetime.now()) -> pd.DataFrame: - """ - Retrieves all closed positions/orders within time window. - Open and close time must be within the time window - - Args: - date_from: date to start retrieving orders from - date_to: date to stop retrieving to - Returns: - data array(panda) with all position information: - ticket, - instrument, - order_ticket, - position_type, - magic_number, - volume, - open_price, - open_time, - stop_loss, - take_profit, - close_price, - close_time, - comment, - profit, - swap, - commission - """ - self.command_return_error = '' - self.date_from = date_from - self.date_to = date_to - self.command = 'F062^3^' + self.date_from.strftime( - '%Y/%m/%d/%H/%M/%S') + '^' + self.date_to.strftime('%Y/%m/%d/%H/%M/%S') + '^' - - ok, resp = self.send_command(self.command) - - if self.debug: - print(resp) - - if not ok: - self.command_OK = False - return None - - if ok == True and resp[0:5] == "F062^" and resp[-1] == "!": - nbr = resp[resp.index('^', 3)+1:resp.index('^', 5)] - if int(nbr) != 0: - df = pd.read_table(io.StringIO(resp[resp.index('^', 5)+1:-1]), sep='$', lineterminator='^', - header=None, - names=np.array(self.columnsClosedPositions[1:])[ - :, 0], - dtype=self.columnsClosedPositions[1:] - ).fillna('') - # no time conversion - # df.open_time = pd.to_datetime(df.open_time, unit='s').dt.tz_localize(TZ_SERVER).dt.tz_convert(TZ_UTC) - # sort by open_time ascending - df.sort_values(by=['open_time'], ascending=True, inplace=True) - return df - else: - # return empty dataframe - return self.create_empty_DataFrame( - self.columnsClosedPositions, 'id') - else: - # error - if not ok: - self.command_OK = False - return None - else: - x = resp.split('^') - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - def Get_all_closed_positions(self) -> pd.DataFrame: - """ - Retrieves all closed positions/orders. - For MT4 all must be visible in the history tab of the MT4 terminal - - Args: - - Returns: - data array(panda) with all position information: - ticket, - instrument, - order_ticket, - position_type, - magic_number, - volume, - open_price, - open_time, - stop_loss, - take_profit, - close_price, - close_time, - comment, - profit, - swap, - commission - """ - self.command_return_error = '' - - self.command = 'F063^1^' - ok, resp = self.send_command(self.command) - if not ok: - self.command_OK = False - return None - - if self.debug: - print(resp) - - if ok == True and resp[0:5] == "F063^" and resp[-1] == "!": - nbr = resp[resp.index('^', 3)+1:resp.index('^', 5)] - if int(nbr) != 0: - df = pd.read_table(io.StringIO(resp[resp.index('^', 5)+1:-1]), sep='$', lineterminator='^', - header=None, - names=np.array(self.columnsClosedPositions[1:])[ - :, 0], - dtype=self.columnsClosedPositions[1:] - ).fillna('') - # no time conversion - # df.open_time = pd.to_datetime(df.open_time, unit='s').dt.tz_localize(TZ_SERVER).dt.tz_convert(TZ_UTC) - # sort by open_time ascending - df.sort_values(by=['open_time'], ascending=True, inplace=True) - return df - else: - # return empty dataframe - return self.create_empty_DataFrame( - self.columnsClosedPositions, 'id') - else: - # error - if not ok: - self.command_OK = False - return None - else: - x = resp.split('^') - self.command_return_error = ERROR_DICT['99901'] - self.command_OK = False - return None - - def Open_order(self, - instrument: str = '', - ordertype: str = 'buy', - volume: float = 0.01, - openprice: float = 0.0, - slippage: int = 5, - magicnumber: int = 0, - stoploss: float = 0.0, - takeprofit: float = 0.0, - comment: str = '', - market: bool = False - ) -> int: - """ - Open an order. - - Args: - instrument: instrument - ordertype: type of order, buy, sell, buy stop, sell stop, buy limit, sell limit - volume: order volume/lot size - open price: open price for order, 0.0 for market orders - slippage: allowed slippage - magicnumber: magic number for this order - stoploss: order stop loss price, actual price, so not relative to open price - takeprofit: order take profit, actual price, so not relative to open price - comment: order comment - Returns: - int: ticket number. If -1, open order failed - """ - - self.command_return_error = '' - self.instrument_name_universal = instrument.upper() - # check the command for '^' , '$', '!' character - # these are not allowed, used as delimiters - comment.replace('^', '') - comment.replace('$', '') - comment.replace('!', '') - broker_instrument = self.get_broker_instrument_name( - self.instrument_name_universal) - if (self.instrument == 'none' or self.instrument == None): - self.command_return_error = 'Instrument not known, check brookerlookuptable' - self.command_OK = False - self.order_return_message = 'Instrument not known, check brookerlookuptable' - return int(-1) - - self.command = 'F070^11^' + self.get_broker_instrument_name(self.instrument_name_universal) + '^' + ordertype + '^' + str(volume) + '^' + \ - str(openprice) + '^' + str(slippage) + '^' + str(magicnumber) + '^' + \ - str(stoploss) + '^' + str(takeprofit) + '^' + \ - str(comment) + '^' + str(market) + '^' - # print(self.command) - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return int(-1) - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F070': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - self.order_error = int(x[4]) - return int(-1) - - self.command_OK = True - - if (int(x[1]) == 3): - self.order_return_message = str(x[2]) - return int(x[3]) - - def Close_position_by_ticket(self, - ticket: int = 0) -> bool: - """ - Close a position. - - Args: - ticket: ticket of position to close - - Returns: - bool: True or False - """ - self.command_return_error = '' - self.command = 'F071^2^' + str(ticket) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F071': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - self.order_error = int(x[4]) - return False - - return True - - def CloseBy_position_by_ticket(self, - ticket: int = 0, - ticket_opposite: int = 0) -> bool: - """ - Close a position. - - Args: - ticket: ticket of position to close - ticket_opposite: opposite ticket for closing - - Returns: - bool: True or False - """ - self.command_return_error = '' - self.command = 'F074^3^' + \ - str(ticket) + '^' + str(ticket_opposite) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F074': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - self.order_error = int(x[4]) - return False - - return True - - def Close_position_partial_by_ticket(self, - ticket: int = 0, - volume_to_close: float = 0.01) -> bool: - """ - Close a position partial. - - Args: - ticket: ticket of position to close - volume_to_close: volume part to close, must be small then order volume - Returns: - bool: True or False - """ - self.command_return_error = '' - self.command = 'F072^3^' + \ - str(ticket) + '^' + str(volume_to_close) + '^' - - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F072': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - # self.order_error = ERROR_DICT[str(x[3])] - return False - - return True - - def Delete_order_by_ticket(self, - ticket: int = 0) -> bool: - """ - Delete an order. - - Args: - ticket: ticket of order(pending) to delete - - Returns: - bool: True or False - """ - self.command_return_error = '' - self.command = 'F073^2^' + str(ticket) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F073': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - self.order_error = int(x[4]) - return False - - return True - - def Set_sl_and_tp_for_position(self, - ticket: int = 0, - stoploss: float = 0.0, - takeprofit: float = 0.0) -> bool: - """ - Change stop loss and take profit for a position. - - Args: - ticket: ticket of position to change - stoploss; new stop loss value, must be actual price value - takeprofit: new take profit value, must be actual price value - - Returns: - bool: True or False - """ - self.command_return_error = '' - self.command = 'F075^4^' + \ - str(ticket) + '^' + str(stoploss) + '^' + str(takeprofit) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F075': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - self.order_error = int(x[4]) - return False - - self.command_OK = True - return True - - def Set_sl_and_tp_for_order(self, - ticket: int = 0, - stoploss: float = 0.0, - takeprofit: float = 0.0) -> bool: - """ - Change stop loss and take profit for an order. - - Args: - ticket: ticket of order to change - stoploss; new stop loss value, must be actual price value - takeprofit: new take profit value, must be actual price value - - Returns: - bool: True or False - """ - self.command_return_error = '' - self.command = 'F076^4^' + \ - str(ticket) + '^' + str(stoploss) + '^' + str(takeprofit) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F076': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - self.order_error = int(x[4]) - return False - - self.command_OK = True - return True - - def Reset_sl_and_tp_for_position(self, - ticket: int = 0) -> bool: - """ - Reset stop loss and take profit for a position. - - Args: - ticket: ticket of position to change - - Returns: - bool: True or False - """ - self.command_return_error = '' - self.command = 'F077^2^' + str(ticket) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F077': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - self.order_error = int(x[4]) - return False - - self.command_OK = True - return True - - def Reset_sl_and_tp_for_order(self, - ticket: int = 0) -> bool: - """ - Reset stop loss and take profit for an order. - - Args: - ticket: ticket of order to change - - - Returns: - bool: True or False - """ - self.command_return_error = '' - self.command = 'F078^2^' + str(ticket) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F078': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - self.order_error = int(x[4]) - return False - - self.command_OK = True - return True - - def Change_settings_for_pending_order(self, - ticket: int = 0, - price: float = -1.0, - stoploss: float = -1.0, - takeprofit: float = -1.0) -> bool: - """ - Change settings for a pending order. - - Args: - ticket: ticket of order to change - price: new price value, if value=-1.0 no change - stoploss: new stop loss value, if value=-1.0 no change - takeprofit: new take profit value, if value=-1.0 no change - - Returns: - bool: True or False - - """ - self.command_return_error = '' - self.command = 'F079^5^' + \ - str(ticket) + '^' + str(price) + '^' + \ - str(stoploss) + '^' + str(takeprofit) + '^' - - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F079': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - self.order_error = int(x[4]) - return False - - self.command_OK = True - return True - - def Set_global_variable(self, global_name: str = '', global_value: float = 0.0) -> bool: - """ - Set global variable. - - Args: - global_name: name of global variable - global_value: value of global variable - - Returns: - bool: True or False - """ - self.command_return_error = '' - self.command = 'F080^3^' + global_name + '^' + str(global_value) + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F080': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - # self.order_error = int(x[4]) - return False - - self.command_OK = True - return True - - def Get_global_variable(self, global_name: str = 'GlobalVariableName') -> float: - """ - Get global variable. - - Args: - global_name: name of global variable - - Returns: - value of global variable - """ - - self.command_return_error = '' - self.command = 'F081^1^' + global_name + '^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(dataString) - - x = dataString.split('^') - if str(x[0]) != 'F081': - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - self.order_return_message = ERROR_DICT[str(x[3])] - # self.order_error = int(x[4]) - return False - - self.command_OK = True - return float(x[3]) - - def Get_logfile(self, date: datetime = datetime.now()) -> pd.DataFrame(): - """ - Get logfile. - - Args: - date: logfile date - - Returns: - dataframe: logfile records - """ - - self.command_return_error = '' - self.order_return_message = '' - self.date_to = date - self.command = 'F082^2^' + \ - self.date_to.strftime('%Y/%m/%d/%H/%M/%S') + '^' - ok, resp = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - - if self.debug: - print(resp) - - if ok == True and resp[0:5] == "F082^" and resp[-1] == "!": - nbr = resp[resp.index('^', 3)+1:resp.index('^', 5)] - if int(nbr) != 0: - df = pd.read_table(io.StringIO(resp[resp.index('^', 5)+1:-1]), sep='$', lineterminator='^', - header=None, - names=np.array(self.columnsLogInfo[1:])[ - :, 0], - dtype=self.columnsLogInfo[1:] - ).fillna('') - # no time conversion - - return df - else: - # return empty dataframe - return self.create_empty_DataFrame( - self.columnsLogInfo, 'id') - - else: - # error - if not ok: - self.command_OK = False - return None - else: - x = resp.split('^') - self.command_return_error = ERROR_DICT[str(x[3])] - self.command_OK = False - # self.order_return_message = ERROR_DICT[str(x[3])] - # self.order_error = int(x[4]) - return None - - def Switch_autotrading_on_off(self, on_off: bool = True) -> bool: - """ - Switch autotrading on or off. - - Args: - on_off: True or False - Returns: - bool: True or False - """ - - self.command_return_error = '' - if (on_off): - self.command = 'F084^2^On^' - else: - self.command = 'F084^2^Off^' - ok, dataString = self.send_command(self.command) - if not ok: - self.command_OK = False - return False - x = dataString.split('^') - if str(x[0]) != 'F084': - return False - else: - return True - - def send_command(self, command): - self.command = command + self.authorization_code + "^" "!" - self.timeout = False - - try: - self.sock.send(bytes(self.command, "utf-8")) - data_received = '' - try: - while not data_received.endswith('!'): - data_received += self.sock.recv(500000).decode() - except socket.error as msg: - self.connected = False - self.command_return_error = 'Unexpected socket communication error' - print(msg) - return False, None - return True, data_received - except socket.timeout as msg: - self.timeout = True - self.connected = False - self.command_return_error = 'Unexpected socket communication error' - print(msg) - return False, None - - def get_timeframe_value(self, - timeframe: str = 'D1') -> int: - - self.tf = 16408 # mt5.TIMEFRAME_D1 - timeframe.upper() - if timeframe == 'MN1': - self.tf = 49153 # mt5.TIMEFRAME_MN1 - if timeframe == 'W1': - self.tf = 32769 # mt5.TIMEFRAME_W1 - if timeframe == 'D1': - self.tf = 16408 # mt5.TIMEFRAME_D1 - if timeframe == 'H12': - self.tf = 16396 # mt5.TIMEFRAME_H12 - if timeframe == 'H8': - self.tf = 16392 # mt5.TIMEFRAME_H8 - if timeframe == 'H6': - self.tf = 16390 # mt5.TIMEFRAME_H6 - if timeframe == 'H4': - self.tf = 16388 # mt5.TIMEFRAME_H4 - if timeframe == 'H3': - self.tf = 16387 # mt5.TIMEFRAME_H3 - if timeframe == 'H2': - self.tf = 16386 # mt5.TIMEFRAME_H2 - if timeframe == 'H1': - self.tf = 16385 # mt5.TIMEFRAME_H1 - if timeframe == 'M30': - self.tf = 30 # mt5.TIMEFRAME_M30 - if timeframe == 'M20': - self.tf = 20 # mt5.TIMEFRAME_M20 - if timeframe == 'M15': - self.tf = 15 # mt5.TIMEFRAME_M15 - if timeframe == 'M12': - self.tf = 12 # mt5.TIMEFRAME_M12 - if timeframe == 'M10': - self.tf = 10 # mt5.TIMEFRAME_M10 - if timeframe == 'M6': - self.tf = 6 # mt5.TIMEFRAME_M6 - if timeframe == 'M5': - self.tf = 5 # mt5.TIMEFRAME_M5 - if timeframe == 'M4': - self.tf = 4 # mt5.TIMEFRAME_M4 - if timeframe == 'M3': - self.tf = 3 # mt5.TIMEFRAME_M3 - if timeframe == 'M2': - self.tf = 2 # mt5.TIMEFRAME_M2 - if timeframe == 'M1': - self.tf = 1 # mt5.TIMEFRAME_M1 - - return self.tf - - def get_broker_instrument_name(self, - instrumentname: str = '') -> str: - self.intrumentname = instrumentname - try: - # str result = - # (string)self.instrument_conversion_list.get(str(instrumentname)) - return self.instrument_conversion_list.get(str(instrumentname)) - except BaseException: - return 'none' - - def get_universal_instrument_name(self, - instrumentname: str = '') -> str: - self.instrumentname = instrumentname - try: - for item in self.instrument_conversion_list: - key = str(item) - value = self.instrument_conversion_list.get(item) - if (value == instrumentname): - return str(key) - except BaseException: - return 'none' - return 'none' - - def create_empty_DataFrame(self, - columns, index_col) -> pd.DataFrame: - index_type = next((t for name, t in columns if name == index_col)) - df = pd.DataFrame({name: pd.Series(dtype=t) for name, - t in columns if name != index_col}, - index=pd.Index([], - dtype=index_type)) - cols = [name for name, _ in columns] - cols.remove(index_col) - return df[cols] - - columnsOpenOrders = [ - ('id', int), - ('ticket', int), - ('instrument', str), - ('order_type', str), - ('magic_number', int), - ('volume', float), - ('open_price', float), - ('open_time', int), - ('stop_loss', float), - ('take_profit', float), - ('comment', str)] - - columnsDeletedOrders = [ - ('id', int), - ('ticket', int), - ('instrument', str), - ('order_type', str), - ('magic_number', int), - ('volume', float), - ('open_price', float), - ('open_time', int), - ('stop_loss', float), - ('take_profit', float), - ('delete_price', float), - ('delete_time', int), - ('comment', str)] - - columnsOpenPositions = [ - ('id', int), - ('ticket', int), - ('instrument', str), - ('order_ticket', int), - ('position_type', str), - ('magic_number', int), - ('volume', float), - ('open_price', float), - ('open_time', int), - ('stop_loss', float), - ('take_profit', float), - ('comment', str), - ('profit', float), - ('swap', float), - ('commission', float)] - - columnsClosedPositions = [ - ('id', int), - ('ticket', int), - ('instrument', str), - ('order_ticket', int), - ('position_type', str), - ('magic_number', int), - ('volume', float), - ('open_price', float), - ('open_time', int), - ('stop_loss', float), - ('take_profit', float), - ('close_price', float), - ('close_time', int), - ('comment', str), - ('profit', float), - ('swap', float), - ('commission', float)] - - columnsLogInfo = [ - ('id', int), - ('index', int), - ('time', str), - ('comment', str)] diff --git a/resources/client-test/MT5/Experts/wisefinance-socket-client.mq5 b/resources/client-test/MT5/Experts/wisefinance-socket-client.mq5 deleted file mode 100644 index 2f5887c..0000000 --- a/resources/client-test/MT5/Experts/wisefinance-socket-client.mq5 +++ /dev/null @@ -1,651 +0,0 @@ -//+------------------------------------------------------------------+ - -//| WiseFinanceSocketClient | - -//| Copyright 2023, Fortesense Labs. | - -//| https://www.wisefinance.com | - -//+------------------------------------------------------------------+ - -/* Reference: - - - https://github.com/ejtraderLabs/Metatrader5-Docker - - - https://www.mql5.com/en/code/280 - - */ - -#property copyright "Copyright 2023, Fortesense Labs." - -#property link "https://www.wisefinance.com" - -#property version "0.10" - -#property description "Wise Finance Socket Client" - -// #define SYMBOLS_TRADING "EURUSD","GBPUSD","USDJPY","USDCHF" - -#define SYMBOLS_TRADING "Step Index", "Boom 1000 Index", "Volatility 100 Index", "Volatility 25 Index" - -#define CHART_EVENT_SYMBOL CHARTEVENT_ALL - -#include - -#include - -// Set host and Port -input string HOST = "localhost"; -input int PORT = 9090; - -bool ExtTLS = false; // for TLS socket connections - -// Global variables -int timerInterval = 3 * 1000; // Timer interval in milliseconds -bool debug = false; -bool liveStream = true; -bool connectedFlag = true; -int deInitReason = -1; - -// Sockets -int liveSocket; - -// Variables for handling price data stream -struct SymbolSubscription -{ - string symbol; - string chartTimeframe; - datetime lastBar; -}; -SymbolSubscription symbolSubscriptions[]; -int symbolSubscriptionCount = 0; - -//+------------------------------------------------------------------+ -//| Function to establish a socket connection | -//+------------------------------------------------------------------+ -int ConnectSocket(string host, int port) -{ - int socket = SocketCreate(); - if (socket != INVALID_HANDLE) - { - if (SocketConnect(socket, host, port, 1000)) - { - Print("Established connection to ", host, ":", port); - string subject, issuer, serial, thumbprint; - datetime expiration; - if (SocketTlsCertificate(socket, subject, issuer, serial, thumbprint, expiration)) - { - Print("TLS certificate:"); - Print(" Owner: ", subject); - Print(" Issuer: ", issuer); - Print(" Number: ", serial); - Print(" Print: ", thumbprint); - Print(" Expiration: ", expiration); - ExtTLS = true; - } - return socket; - } - else - { - Print("Connection to ", host, ":", port, " failed, error ", GetLastError()); - } - SocketClose(socket); - } - else - { - Print("Failed to create a socket, error ", GetLastError()); - } - return INVALID_HANDLE; -} - -//+------------------------------------------------------------------+ -//| Send command to the server | -//+------------------------------------------------------------------+ -bool HTTPSend(int socket, string request) -{ - char req[]; - int len = StringToCharArray(request, req) - 1; - if (len < 0) - return (false); - //--- if secure TLS connection is used via the port 443 - if (ExtTLS) - return (SocketTlsSend(socket, req, len) == len); - //--- if standard TCP connection is used - return (SocketSend(socket, req, len) == len); -} - -//+------------------------------------------------------------------+ -//| Read server response | -//+------------------------------------------------------------------+ -bool HTTPRecv(int socket, uint timeout) -{ - char rsp[]; - string result; - uint timeout_check = GetTickCount() + timeout; - //--- read data from sockets till they are still present but not longer than timeout - do - { - uint len = SocketIsReadable(socket); - if (len) - { - int rsp_len; - //--- various reading commands depending on whether the connection is secure or not - if (ExtTLS) - rsp_len = SocketTlsRead(socket, rsp, len); - else - rsp_len = SocketRead(socket, rsp, len, timeout); - //--- analyze the response - if (rsp_len > 0) - { - result += CharArrayToString(rsp, 0, rsp_len); - //--- print only the response header - int header_end = StringFind(result, "\r\n\r\n"); - if (header_end > 0) - { - // Print("HTTP header received:"); // debug - Print(StringSubstr(result, 0, header_end)); - //--- parse the body - string body = StringSubstr(result, header_end + 4); - // Print("HTTP body received:"); // debug - Print(body); - return (true); - } - } - } - } while (GetTickCount() < timeout_check && !IsStopped()); - return (false); -} - -//+------------------------------------------------------------------+ -//| Send POST request to the server | -//+------------------------------------------------------------------+ - -bool HTTPPostRequest(int socket, string endpoint, string data) - -{ - - string request = "POST " + endpoint + " HTTP/1.1\r\n" - - "Host: www.mql5.com\r\n" - - "Content-Type: application/json\r\n" - - "Content-Length: " + - - IntegerToString(StringLen(data)) + "\r\n" - - "\r\n" + - data; - - return HTTPSend(socket, request); -} - -//+------------------------------------------------------------------+ -//| Send GET request to the server | -//+------------------------------------------------------------------+ - -bool HTTPGetRequest(int socket, string endpoint, string data) - -{ - string request = "GET " + endpoint + " HTTP/1.1\r\n" - "Host: www.mql5.com\r\n" - "User-Agent: MT5 EA\r\n" - "\r\n"; - - return HTTPSend(socket, request); -} - -//+------------------------------------------------------------------+ -//| Inform Server via socket | -//+------------------------------------------------------------------+ -void InformServerSocket(int socket, string endpoint, string data, string socketType) -{ - if (socket != INVALID_HANDLE) - { - Print("[POST] Sending Data: ", data); // debug - //--- send POST request to the server - if (HTTPPostRequest(socket, endpoint, data)) - { - // Print("POST request sent"); - //--- read the response - if (!HTTPRecv(socket, 1024)) - { - int err = GetLastError(); - Print("Failed to get a response, error ", err); - - // Check for connection failed errors - if (err != 0) - { - Print("Retrying..."); - liveSocket = ConnectSocket(HOST, PORT); - } - } - } - else - Print("Failed to send POST request, error ", GetLastError()); - } -} - -//+------------------------------------------------------------------+ -//| Convert chart timeframe from string to enum | -//+------------------------------------------------------------------+ -ENUM_TIMEFRAMES StringToTimeframe(string timeframe) -{ - - ENUM_TIMEFRAMES tf; - tf = NULL; - - if (timeframe == "TICK") - tf = PERIOD_CURRENT; - - if (timeframe == "M1") - tf = PERIOD_M1; - - if (timeframe == "M5") - tf = PERIOD_M5; - - if (timeframe == "M15") - tf = PERIOD_M15; - - if (timeframe == "M30") - tf = PERIOD_M30; - - if (timeframe == "H1") - tf = PERIOD_H1; - - if (timeframe == "H2") - tf = PERIOD_H2; - - if (timeframe == "H3") - tf = PERIOD_H3; - - if (timeframe == "H4") - tf = PERIOD_H4; - - if (timeframe == "H6") - tf = PERIOD_H6; - - if (timeframe == "H8") - tf = PERIOD_H8; - - if (timeframe == "H12") - tf = PERIOD_H12; - - if (timeframe == "D1") - tf = PERIOD_D1; - - if (timeframe == "W1") - tf = PERIOD_W1; - - if (timeframe == "MN1") - tf = PERIOD_MN1; - - // if tf == NULL an error will be raised in config function - return (tf); -} - -//+------------------------------------------------------------------+ -//| Convert enum chart timeframe to string | -//+------------------------------------------------------------------+ -string TimeframeToString(ENUM_TIMEFRAMES timeframe) -{ - string tf; - - switch (timeframe) - { - case PERIOD_CURRENT: - tf = "TICK"; - break; - case PERIOD_M1: - tf = "M1"; - break; - case PERIOD_M5: - tf = "M5"; - break; - case PERIOD_M15: - tf = "M15"; - break; - case PERIOD_M30: - tf = "M30"; - break; - case PERIOD_H1: - tf = "H1"; - break; - case PERIOD_H2: - tf = "H2"; - break; - case PERIOD_H3: - tf = "H3"; - break; - case PERIOD_H4: - tf = "H4"; - break; - case PERIOD_H6: - tf = "H6"; - break; - case PERIOD_H8: - tf = "H8"; - break; - case PERIOD_H12: - tf = "H12"; - break; - case PERIOD_D1: - tf = "D1"; - break; - case PERIOD_W1: - tf = "W1"; - break; - case PERIOD_MN1: - tf = "MN1"; - break; - default: - tf = "UNKNOWN"; - break; - } - - return tf; -} - -//+------------------------------------------------------------------+ -//| Function to split a string into an array of strings | -//+------------------------------------------------------------------+ -void SplitString(const string in, const string delimiter, string &out[]) -{ - int count = 0; - string remaining = in; - - while (StringFind(remaining, delimiter) != -1) - { - string value = StringSubstr(remaining, 0, StringFind(remaining, delimiter)); - out[count] = value; - remaining = StringSubstr(remaining, StringLen(value) + 1); - count++; - } - - out[count] = remaining; -} - -//+------------------------------------------------------------------+ -//| Function to send tick data to the server | -//+------------------------------------------------------------------+ -void SendTickData(string symbol) -{ - MqlTick tick; - - ENUM_TIMEFRAMES timeframe = PERIOD_CURRENT; - - if (SymbolInfoTick(symbol, tick)) - { - CJAVal Data; - Data[0] = (string)tick.time_msc; - Data[1] = (double)tick.bid; - Data[2] = (double)tick.ask; - - CJAVal tickData; - tickData["symbol"] = symbol; - tickData["timeframe"] = TimeframeToString(timeframe); - tickData["tick"].Set(Data); - - CJAVal jsonData; - jsonData["event"] = "tick"; - jsonData["data"].Set(tickData); - - string jsonStr = jsonData.Serialize(); - InformServerSocket(liveSocket, "/api/price/stream/tick", jsonStr, "TICK"); - - Print("[TICK] Sent Tick Data for ", symbol, " (", timeframe, ")"); - - // Debug - if (debug) - { - Print("New event on symbol: ", symbol); - Print("data: ", jsonStr); - } - } - else - { - Print("Failed to get tick data for ", symbol, " (", timeframe, ")"); - } -} - -//+------------------------------------------------------------------+ -//| Function to send bar data to the server | -//+------------------------------------------------------------------+ -void SendBarData(string symbol, string timeframe) -{ - MqlRates rates[1]; - int spread[1]; - - ENUM_TIMEFRAMES period = StringToTimeframe(timeframe); - - if (CopyRates(symbol, period, 1, 1, rates) != -1 && CopySpread(symbol, period, 1, 1, spread) != -1) - { - CJAVal Data; - Data[0] = "" + (long)rates[0].time; - Data[1] = (double)rates[0].open; - Data[2] = (double)rates[0].high; - Data[3] = (double)rates[0].low; - Data[4] = (double)rates[0].close; - Data[5] = (double)rates[0].tick_volume; - Data[6] = (double)spread[0]; - Data[7] = (double)rates[0].real_volume; - - CJAVal Vars; - Vars[0] = Data; - - CJAVal barData; - barData["symbol"] = symbol; - barData["timeframe"] = timeframe; - barData["bar"].Set(Vars); - - CJAVal jsonData; - jsonData["event"] = "bar"; - jsonData["data"].Set(barData); - - string jsonStr = jsonData.Serialize(); - InformServerSocket(liveSocket, "/api/price/stream/bar", jsonStr, "BAR"); - - Print("[BAR] Sent Bar Data for ", symbol, " (", timeframe, ")"); - } - else - { - Print("Failed to get bar data for ", symbol, " (", timeframe, ")"); - } -} - -//+------------------------------------------------------------------+ -//| Function to subscribe to bar data | -//+------------------------------------------------------------------+ -void SubscribeToBars(const string &symbol, const string &timeframe) -{ - SymbolSubscription sub; - - sub.symbol = symbol; - - sub.chartTimeframe = timeframe; - - sub.lastBar = 0; - - ArrayResize(symbolSubscriptions, symbolSubscriptionCount + 1); - - symbolSubscriptions[symbolSubscriptionCount] = sub; - - symbolSubscriptionCount++; - - Print("[BAR] Subscribed to ", symbol, " (", timeframe, ")"); -} - -//+------------------------------------------------------------------+ -//| Expert multi tick function | -//| Use this function instead of the standard OnTick() function | -//| OnTick handler | -//+------------------------------------------------------------------+ -void OnTick(string symbol) -{ - if (!liveStream || IsStopped()) - return; - - // Send tick data - SendTickData(symbol); -} -//+------------------------------------------------------------------+ -//| ChartEvent function | -//| This function must be declared, even if it empty. | -//+------------------------------------------------------------------+ -void OnChartEvent(const int id, // event id - - const long &lparam, // event param of long type - - const double &dparam, // event param of double type - - const string &sparam) // event param of string type - -{ - - //--- Add code here... - // Print("OnChartEvent id: ", id); - // Print("OnChartEvent lparam: ", lparam); - // Print("OnChartEvent dparam: ", dparam); - // Print("OnChartEvent sparam: ", sparam); -} - -//+------------------------------------------------------------------+ -//| Timer event handler | -//+------------------------------------------------------------------+ -void OnTimer() -{ - // Send bar data for subscribed symbols - for (int i = 0; i < symbolSubscriptionCount; i++) - { - SymbolSubscription sub = symbolSubscriptions[i]; - datetime lastBar = sub.lastBar; - datetime currentBar = iTime(sub.symbol, StringToTimeframe(sub.chartTimeframe), 0); - if (currentBar > lastBar) - { - SendBarData(sub.symbol, sub.chartTimeframe); - sub.lastBar = currentBar; - symbolSubscriptions[i] = sub; - } - } - - // Test socket connection - int pingSocket = ConnectSocket(HOST, PORT); - if (pingSocket != INVALID_HANDLE) - { - // Also, Check for connection failed errors - reconnect the liveSocket - if (liveSocket == INVALID_HANDLE) - { - Print("Failed to establish socket connection"); - Print("Retrying..."); - - OnInit(); - } - - // Send GET request to the server - if (HTTPGetRequest(pingSocket, "/health", "")) - { - // Print("GET request sent"); // debug - - // Read the response - if (!HTTPRecv(pingSocket, 1024)) - { - int err = GetLastError(); - Print("Failed to get a response, error ", err); - } - } - else - { - int err = GetLastError(); - Print("Failed to send GET request, error ", err); - } - - SocketClose(pingSocket); - } -} - -//+------------------------------------------------------------------+ -//| OnDeinit handler | -//+------------------------------------------------------------------+ -void OnDeinit(const int reason) -{ - deInitReason = reason; - - EventKillTimer(); - - // Cleanup - SocketClose(liveSocket); - Print("Socket connection closed"); -} - -//+------------------------------------------------------------------+ -//| Expert initialization function | -//+------------------------------------------------------------------+ -void OnInit() -{ - // Establish socket connection - liveSocket = ConnectSocket(HOST, PORT); - if (liveSocket == INVALID_HANDLE) - { - Print("Failed to establish socket connection"); - Print("Retrying..."); - // return; - } - - // Split the trading symbols string into an array - // string symbols = "" + SYMBOLS_TRADING; - // Define the trading symbols as a string - // string _SYMBOLS_TRADING = "Step Index,Boom 1000 Index,Volatility 100 Index,Volatility 25 Index"; - - // const int MAX_SYMBOLS = 4; // Adjust the maximum number of symbols if needed - - // string symbolsArray[]; - // SplitString(SYMBOLS_TRADING, ",", symbolsArray); - - // Get All Symbols [currently getting only the ones in marketwatch] - int totalSymbols = SymbolsTotal(true) - 1; - for (int i = totalSymbols; i > 0; i--) - - { - - string symbolName = SymbolName(i, true); - - // Print("Number: " + string(i) + " Symbol Name: " + symbolName + " Close Price: ", iClose(symbolName, 0, 0)); - Print("Number: " + string(i) + " Symbol Name: " + symbolName); - } - - string symbolsArray[] = { - "Step Index", - "Boom 1000 Index", - "Volatility 100 Index", - "Volatility 25 Index"}; - - // Subscribe to bar data - for (int i = 0; i < ArraySize(symbolsArray); i++) - { - string symbol = symbolsArray[i]; - string timeframe = "M1"; - SubscribeToBars(symbol, timeframe); - } - - // Start timer for periodic data update - EventSetMillisecondTimer(timerInterval); - // Set up the timer - // EventSetTimer(timerInterval); - - // Event loop - // while (!IsStopped()) - // { - // OnTick(); - // Sleep(10); // Yield to other tasks - // } - - // ScriptConfiguration(); -} -//+------------------------------------------------------------------+ -//| Note: Compile the Multi-currency Indicator First | -//+------------------------------------------------------------------+ - -// https://www.mql5.com/en/articles/159 -// https://www.mql5.com/en/forum/367260 -// https://www.mql5.com/en/articles/599 -// https://www.mql5.com/en/docs/constants/errorswarnings/errorcodes \ No newline at end of file diff --git a/resources/client-test/dump.mq5 b/resources/client-test/dump.mq5 deleted file mode 100644 index 0622af1..0000000 --- a/resources/client-test/dump.mq5 +++ /dev/null @@ -1,306 +0,0 @@ -//+------------------------------------------------------------------+ -//| for every symbol tick function | -//+------------------------------------------------------------------+ -// void OnTick() -// { -// MqlRates candles[]; - -// // Initializing candles -// ArraySetAsSeries(candles, true); - -// CopyRates(_Symbol, _Period, 0, 1, candles); -// Print("[INFO]\tSending close price: ", candles[0].close); - -// int socket = ConnectSocket(HOST, PORT); -// if (socket != INVALID_HANDLE) -// { -// // Prepare the POST request -// string endpoint = "/price/stream"; - -// CJAVal jv; -// jv["symbol"] = (string)_Symbol; -// jv["period"] = (string)_Period; -// jv["open"] = candles[0].open; -// jv["high"] = candles[0].high; -// jv["low"] = candles[0].low; -// jv["close"] = candles[0].close; - -// // Serialize to string -// string postData = jv.Serialize(); - -// Print("[POST] Sending Data: ", postData); - -// //--- send POST request to the server -// if (HTTPPostRequest(socket, endpoint, postData)) -// { -// Print("POST request sent"); - -// //--- read the response -// if (!HTTPRecv(socket, 1000)) -// Print("Failed to get a response, error ", GetLastError()); -// } -// else -// Print("Failed to send POST request, error ", GetLastError()); - -// SocketClose(socket); -// } -// } - -//+------------------------------------------------------------------+ -//| Check if subscribed to symbol and timeframe combination | -//+------------------------------------------------------------------+ -bool HasChartSymbol(string symbol, string chartTimeframe) -{ - for (int i = 0; i < ArraySize(symbolSubscriptions); i++) - { - if (symbolSubscriptions[i].symbol == symbol && symbolSubscriptions[i].chartTimeframe == chartTimeframe) - { - return true; - } - } - return false; -} - -//+------------------------------------------------------------------+ -//| Stream live price data | -//+------------------------------------------------------------------+ -void StreamPriceData() -{ - while (!IsStopped()) - { - if (liveStream) - { - Print("StreamPriceData()"); - CJAVal last; - if (TerminalInfoInteger(TERMINAL_CONNECTED)) - { - connectedFlag = true; - for (int i = 0; i < symbolSubscriptionCount; i++) - { - string symbol = symbolSubscriptions[i].symbol; - string chartTimeframe = symbolSubscriptions[i].chartTimeframe; - datetime lastBar = symbolSubscriptions[i].lastBar; - CJAVal Data; - ENUM_TIMEFRAMES period = GetTimeframe(chartTimeframe); - - Print("symbol: ", symbol); - Print("chartTimeframe: ", chartTimeframe); - Print("period: ", period); - - datetime thisBar = 0; - float price; - MqlTick tick; - MqlRates rates[1]; - int spread[1]; - - if (chartTimeframe == "TICK") - { - if (SymbolInfoTick(symbol, tick) != true) - { - // Handle error or continue loop - continue; - } - thisBar = (datetime)tick.time_msc; - } - else - { - if (CopyRates(symbol, period, 1, 1, rates) != 1) - { - // Handle error or continue loop - continue; - } - if (CopySpread(symbol, period, 1, 1, spread) != 1) - { - // Handle error or continue loop - continue; - } - thisBar = (datetime)rates[0].time; - } - - if (lastBar != thisBar) - { - if (lastBar != 0) // skip first price data after startup/reset - { - if (chartTimeframe == "TICK") - { - Data[0] = (long)tick.time_msc; - Data[1] = (double)tick.bid; - Data[2] = (double)tick.ask; - } - else - { - Data[0] = (long)rates[0].time; - Data[1] = (double)rates[0].open; - Data[2] = (double)rates[0].high; - Data[3] = (double)rates[0].low; - Data[4] = (double)rates[0].close; - Data[5] = (double)rates[0].tick_volume; - } - last["status"] = "CONNECTED"; - last["symbol"] = (string)symbol; - last["timeframe"] = (string)chartTimeframe; - last["data"].Set(Data); - - string t = last.Serialize(); - Print(t); - if (debug) - Print(t); - InformServerSocket(liveSocket, t, "STREAM"); - symbolSubscriptions[i].lastBar = thisBar; - } - else - symbolSubscriptions[i].lastBar = thisBar; - } - } - } - else - { - // send disconnect message only once - if (connectedFlag) - { - last["status"] = (string) "DISCONNECTED"; - string t = last.Serialize(); - if (debug) - Print(t); - InformServerSocket(liveSocket, t, "STREAM"); - connectedFlag = false; - } - } - } - Sleep(timerInterval); // Wait for 1 second before checking again - } -} - -//+------------------------------------------------------------------+ -//| Convert chart timeframe from string to enum | -//+------------------------------------------------------------------+ -ENUM_TIMEFRAMES GetTimeframe(string chartTimeframe) -{ - - ENUM_TIMEFRAMES tf; - tf = NULL; - - if (chartTimeframe == "TICK") - tf = PERIOD_CURRENT; - - if (chartTimeframe == "M1") - tf = PERIOD_M1; - - if (chartTimeframe == "M5") - tf = PERIOD_M5; - - if (chartTimeframe == "M15") - tf = PERIOD_M15; - - if (chartTimeframe == "M30") - tf = PERIOD_M30; - - if (chartTimeframe == "H1") - tf = PERIOD_H1; - - if (chartTimeframe == "H2") - tf = PERIOD_H2; - - if (chartTimeframe == "H3") - tf = PERIOD_H3; - - if (chartTimeframe == "H4") - tf = PERIOD_H4; - - if (chartTimeframe == "H6") - tf = PERIOD_H6; - - if (chartTimeframe == "H8") - tf = PERIOD_H8; - - if (chartTimeframe == "H12") - tf = PERIOD_H12; - - if (chartTimeframe == "D1") - tf = PERIOD_D1; - - if (chartTimeframe == "W1") - tf = PERIOD_W1; - - if (chartTimeframe == "MN1") - tf = PERIOD_MN1; - - // if tf == NULL an error will be raised in config function - return (tf); -} - -//+------------------------------------------------------------------+ - -//| Reconfigure the script params | - -//+------------------------------------------------------------------+ - -void ScriptConfiguration() - -{ - - // string symbol = dataObject["symbol"].ToStr(); - - // string chartTimeframe = dataObject["chartTimeframe"].ToStr(); - - string symbol = "Step Index"; - - string chartTimeframe = "H1"; - - ArrayResize(symbolSubscriptions, symbolSubscriptionCount + 1); - - symbolSubscriptions[symbolSubscriptionCount].symbol = symbol; - - symbolSubscriptions[symbolSubscriptionCount].chartTimeframe = chartTimeframe; - - // to initialze with value 0 skips the first price - - symbolSubscriptions[symbolSubscriptionCount].lastBar = 0; - - symbolSubscriptionCount++; - - // mControl.mResetLastError(); - - SymbolInfoString(symbol, SYMBOL_DESCRIPTION); - - // if (!CheckError(__FUNCTION__)) - - // ActionDoneOrError(ERR_SUCCESS, __FUNCTION__, "ERR_SUCCESS"); -} - -void OnTick(string symbol) - -{ - - MqlTick tick; - - CJAVal last; - - CJAVal Data; - - if (!SymbolInfoTick(symbol, tick)) - { - } - - Data[0] = (long)tick.time_msc; - - Data[1] = (double)tick.bid; - - Data[2] = (double)tick.ask; - - last["symbol"] = symbol; - - last["timeframe"] = (string)PERIOD_CURRENT; - - last["data"].Set(Data); - - string ticks = last.Serialize(); - - InformServerSocket(liveSocket, "/price/tick", ticks, ""); - - if (debug) - { - Print("New event on symbol: ", symbol); - Print("ticks: ", ticks); - } -} \ No newline at end of file diff --git a/resources/client.mq5 b/resources/client.mq5 deleted file mode 100644 index abc7cde..0000000 --- a/resources/client.mq5 +++ /dev/null @@ -1,21 +0,0 @@ -string address = "localhost"; -int port = 8466; - - -void OnInit() { - // Initializing the socket - int socket = SocketCreate(); - if (socket == INVALID_HANDLE) Print("Error - 1: SocketCreate failure. ", GetLastError()); - else { - if (SocketConnect(socket, address, port, 10000)) { - Print("[INFO]\tConnection stablished"); - - // Creating the message - char req[]; - int len = StringToCharArray("END CONNECTION\0", req)-1; - - SocketSend(socket, req, len); - } else Print("Error - 2: SocketConnect failure. ", GetLastError()); - SocketClose(socket); - } -} diff --git a/resources/client_closes.mq5 b/resources/client_closes.mq5 deleted file mode 100644 index 6b299b3..0000000 --- a/resources/client_closes.mq5 +++ /dev/null @@ -1,56 +0,0 @@ -string address = "localhost"; -int port = 8466; -short num_msg = 0; -bool closed = false; -int socket; -MqlRates candles[]; - -void OnInit() -{ - - // Initializing candles - ArraySetAsSeries(candles, true); - - // Initializing the socket - socket = SocketCreate(); - if (socket == INVALID_HANDLE) - Print("Error - 1: SocketCreate failure. ", GetLastError()); - else - { - if (SocketConnect(socket, address, port, 10000)) - Print("[INFO]\tConnection stablished"); - else - Print("Error - 2: SocketConnect failure. ", GetLastError()); - } -} - -void OnTick() -{ - CopyRates(_Symbol, _Period, 0, 1, candles); - - if (num_msg < 1000) - { - Print("[INFO]\tSending close"); - num_msg++; - string msg; - StringConcatenate(msg, _Symbol, " CLOSE: ", candles[0].close); - - char req[]; - int len = StringToCharArray(msg, req) - 1; - SocketSend(socket, req, len); - } - else - { - if (!closed) - { - // Creating the message - char req[]; - int len = StringToCharArray("END CONNECTION\0", req) - 1; - - SocketSend(socket, req, len); - - SocketClose(socket); - closed = true; - } - } -} \ No newline at end of file diff --git a/resources/ejTrader/Include/ejtraderMT/Broker.mqh b/resources/ejTrader/Include/ejtraderMT/Broker.mqh deleted file mode 100644 index 49a2c5f..0000000 --- a/resources/ejTrader/Include/ejtraderMT/Broker.mqh +++ /dev/null @@ -1,311 +0,0 @@ -#property copyright "ejtrader" -#property link "https://github.com/ejtraderLabs/MQL5-ejtraderMT" - - - -//+------------------------------------------------------------------+ -//| Fetch positions information | -//+------------------------------------------------------------------+ -void GetPositions(CJAVal &dataObject) - { - CPositionInfo myposition; - CJAVal data, position; - -// Get positions - int positionsTotal=PositionsTotal(); -// Create empty array if no positions - if(!positionsTotal) - data["positions"].Add(position); -// Go through positions in a loop - for(int i=0; i -//+------------------------------------------------------------------ß -//| JAson | -//| This software is licensed under the MIT https://goo.gl/eyJgHe | -//+------------------------------------------------------------------+ -#property copyright "Copyright © 2006-2017" -#property version "1.12" -#property strict -//------------------------------------------------------------------ enum enJAType -enum enJAType -{ - jtUNDEF, - jtNULL, - jtBOOL, - jtINT, - jtDBL, - jtSTR, - jtARRAY, - jtOBJ -}; - -//------------------------------------------------------------------ class CJAVal -class CJAVal -{ -public: - virtual void Clear(enJAType jt = jtUNDEF, bool savekey = false) - { - m_parent = NULL; - - if (!savekey) - groupName = ""; - - m_type = jt; - m_bv = false; - m_iv = 0; - m_dv = 0; - m_prec = 5; - m_sv = ""; - ArrayResize(group, 0, 100); - } - virtual bool Copy(const CJAVal &a) - { - groupName = a.groupName; - CopyData(a); - return true; - } - virtual void CopyData(const CJAVal &a) - { - m_type = a.m_type; - m_bv = a.m_bv; - m_iv = a.m_iv; - m_dv = a.m_dv; - m_prec = a.m_prec; - m_sv = a.m_sv; - CopyArr(a); - } - virtual void CopyArr(const CJAVal &a) - { - int n = ArrayResize(group, ArraySize(a.group)); - - for (int i = 0; i < n; i++) - { - group[i] = a.group[i]; - group[i].m_parent = GetPointer(this); - } - } - -public: - CJAVal group[]; // group - string groupName; // group name - string m_lkey; - CJAVal *m_parent; - enJAType m_type; - bool m_bv; - long m_iv; - double m_dv; - int m_prec; - string m_sv; - static int code_page; - -public: - CJAVal() - { - Clear(); - } - CJAVal(CJAVal *aparent, enJAType atype) - { - Clear(); - m_type = atype; - m_parent = aparent; - } - CJAVal(enJAType t, string a) - { - Clear(); - FromStr(t, a); - } - CJAVal(const int a) - { - Clear(); - m_type = jtINT; - m_iv = a; - m_dv = (double)m_iv; - m_sv = IntegerToString(m_iv); - m_bv = m_iv != 0; - } - CJAVal(const long a) - { - Clear(); - m_type = jtINT; - m_iv = a; - m_dv = (double)m_iv; - m_sv = IntegerToString(m_iv); - m_bv = m_iv != 0; - } - CJAVal(const double a, int aprec = -100) - { - Clear(); - m_type = jtDBL; - m_dv = a; - - if (aprec > -100) - m_prec = aprec; - - m_iv = (long)m_dv; - m_sv = DoubleToString(m_dv, m_prec); - m_bv = m_iv != 0; - } - CJAVal(const bool a) - { - Clear(); - m_type = jtBOOL; - m_bv = a; - m_iv = m_bv; - m_dv = m_bv; - m_sv = IntegerToString(m_iv); - } - CJAVal(const CJAVal &a) - { - Clear(); - Copy(a); - } - ~CJAVal() - { - Clear(); - } - -public: - int Size() - { - return ArraySize(group); - } - virtual bool IsNumeric() - { - return m_type == jtDBL || m_type == jtINT; - } - virtual CJAVal *FindKey(string akey) - { - for (int i = Size() - 1; i >= 0; --i) - if (group[i].groupName == akey) - return GetPointer(group[i]); - return NULL; - } - virtual CJAVal *HasKey(string akey, enJAType atype = jtUNDEF) - { - CJAVal *e = FindKey(akey); - if (CheckPointer(e) != POINTER_INVALID) - { - if (atype == jtUNDEF || atype == e.m_type) - return GetPointer(e); - } - return NULL; - } - virtual CJAVal *operator[](string akey); - virtual CJAVal *operator[](int i); - void operator=(const CJAVal &a) - { - Copy(a); - } - void operator=(const int a) - { - m_type = jtINT; - m_iv = a; - m_dv = (double)m_iv; - m_bv = m_iv != 0; - } - void operator=(const long a) - { - m_type = jtINT; - m_iv = a; - m_dv = (double)m_iv; - m_bv = m_iv != 0; - } - void operator=(const double a) - { - m_type = jtDBL; - m_dv = a; - m_iv = (long)m_dv; - m_bv = m_iv != 0; - } - void operator=(const bool a) - { - m_type = jtBOOL; - m_bv = a; - m_iv = (long)m_bv; - m_dv = (double)m_bv; - } - void operator=(string a) - { - m_type = (a != NULL) ? jtSTR : jtNULL; - m_sv = a; - int err = GetLastError(); - m_iv = StringToInteger(m_sv); - m_dv = StringToDouble(m_sv); - if ((err == 0) && (GetLastError() != 0)) - { // Ignore conversion errors if they occur - ResetLastError(); - } - m_bv = a != NULL; - } - - bool operator==(const int a) - { - return m_iv == a; - } - bool operator==(const long a) - { - return m_iv == a; - } - bool operator==(const double a) - { - return m_dv == a; - } - bool operator==(const bool a) - { - return m_bv == a; - } - bool operator==(string a) - { - return m_sv == a; - } - - bool operator!=(const int a) - { - return m_iv != a; - } - bool operator!=(const long a) - { - return m_iv != a; - } - bool operator!=(const double a) - { - return m_dv != a; - } - bool operator!=(const bool a) - { - return m_bv != a; - } - bool operator!=(string a) - { - return m_sv != a; - } - - long ToInt() const - { - return m_iv; - } - double ToDbl() const - { - return m_dv; - } - bool ToBool() const - { - return m_bv; - } - string ToStr() - { - return m_sv; - } - - virtual void FromStr(enJAType t, string a) - { - m_type = t; - switch (m_type) - { - case jtBOOL: - m_bv = (StringToInteger(a) != 0); - m_iv = (long)m_bv; - m_dv = (double)m_bv; - m_sv = a; - break; - case jtINT: - m_iv = StringToInteger(a); - m_dv = (double)m_iv; - m_sv = a; - m_bv = m_iv != 0; - break; - case jtDBL: - m_dv = StringToDouble(a); - m_iv = (long)m_dv; - m_sv = a; - m_bv = m_iv != 0; - break; - case jtSTR: - m_sv = Unescape(a); - m_type = (m_sv != NULL) ? jtSTR : jtNULL; - m_iv = StringToInteger(m_sv); - m_dv = StringToDouble(m_sv); - m_bv = m_sv != NULL; - break; - } - } - virtual string GetStr(char &js[], int i, int slen) - { - if (slen == 0) - return ""; - char cc[]; - ArrayCopy(cc, js, 0, i, slen); - return CharArrayToString(cc, 0, WHOLE_ARRAY, CJAVal::code_page); - } - - virtual void Set(const CJAVal &a) - { - if (m_type == jtUNDEF) - m_type = jtOBJ; - CopyData(a); - } - virtual void Set(const CJAVal &list[]); - virtual CJAVal *Add(const CJAVal &item) - { - if (m_type == jtUNDEF) - m_type = jtARRAY; - /*ASSERT(m_type==jtOBJ || m_type==jtARRAY);*/ return AddBase(item); - } // добавление - virtual CJAVal *Add(const int a) - { - CJAVal item(a); - return Add(item); - } - virtual CJAVal *Add(const long a) - { - CJAVal item(a); - return Add(item); - } - virtual CJAVal *Add(const double a, int aprec = -2) - { - CJAVal item(a, aprec); - return Add(item); - } - virtual CJAVal *Add(const bool a) - { - CJAVal item(a); - return Add(item); - } - virtual CJAVal *Add(string a) - { - CJAVal item(jtSTR, a); - return Add(item); - } - virtual CJAVal *AddBase(const CJAVal &item) // добавление - { - int c = Size(); - ArrayResize(group, c + 1, 100); - group[c] = item; - group[c].m_parent = GetPointer(this); - return GetPointer(group[c]); - } - virtual CJAVal *New() - { - if (m_type == jtUNDEF) - m_type = jtARRAY; - /*ASSERT(m_type==jtOBJ || m_type==jtARRAY);*/ return NewBase(); - } // добавление - virtual CJAVal *NewBase() // добавление - { - int c = Size(); - ArrayResize(group, c + 1, 100); - return GetPointer(group[c]); - } - - virtual string Escape(string a); - virtual string Unescape(string a); - -public: - virtual void Serialize(string &js, bool bf = false, bool bcoma = false); - virtual string Serialize() - { - string js; - Serialize(js); - return js; - } - virtual bool Deserialize(char &js[], int slen, int &i); - virtual bool ExtrStr(char &js[], int slen, int &i); - virtual bool Deserialize(string js, int acp = CP_ACP) - { - int i = 0; - Clear(); - CJAVal::code_page = acp; - char arr[]; - int slen = StringToCharArray(js, arr, 0, WHOLE_ARRAY, CJAVal::code_page); - return Deserialize(arr, slen, i); - } - virtual bool Deserialize(char &js[], int acp = CP_ACP) - { - int i = 0; - Clear(); - CJAVal::code_page = acp; - return Deserialize(js, ArraySize(js), i); - } -}; - -int CJAVal::code_page = CP_ACP; - -//------------------------------------------------------------------ operator[] -CJAVal *CJAVal::operator[](string akey) -{ - if (m_type == jtUNDEF) - m_type = jtOBJ; - CJAVal *v = FindKey(akey); - if (v) - return v; - CJAVal b(GetPointer(this), jtUNDEF); - b.groupName = akey; - v = Add(b); - return v; -} -//------------------------------------------------------------------ operator[] -CJAVal *CJAVal::operator[](int i) -{ - if (m_type == jtUNDEF) - m_type = jtARRAY; - while (i >= Size()) - { - CJAVal b(GetPointer(this), jtUNDEF); - if (CheckPointer(Add(b)) == POINTER_INVALID) - return NULL; - } - return GetPointer(group[i]); -} -//------------------------------------------------------------------ Set -void CJAVal::Set(const CJAVal &list[]) -{ - if (m_type == jtUNDEF) - m_type = jtARRAY; - int n = ArrayResize(group, ArraySize(list), 100); - for (int i = 0; i < n; ++i) - { - group[i] = list[i]; - group[i].m_parent = GetPointer(this); - } -} -//------------------------------------------------------------------ Serialize -void CJAVal::Serialize(string &js, bool bkey /*=false*/, bool coma /*=false*/) -{ - if (m_type == jtUNDEF) - return; - if (coma) - js += ","; - if (bkey) - js += StringFormat("\"%s\":", groupName); - int _n = Size(); - switch (m_type) - { - case jtNULL: - js += "null"; - break; - case jtBOOL: - js += (m_bv ? "true" : "false"); - break; - case jtINT: - js += IntegerToString(m_iv); - break; - case jtDBL: - js += DoubleToString(m_dv, 5); - break; - case jtSTR: - { - string ss = Escape(m_sv); - if (StringLen(ss) > 0) - js += StringFormat("\"%s\"", ss); - else - js += "null"; - } - break; - case jtARRAY: - js += "["; - for (int i = 0; i < _n; i++) - group[i].Serialize(js, false, i > 0); - js += "]"; - break; - case jtOBJ: - js += "{"; - for (int i = 0; i < _n; i++) - group[i].Serialize(js, true, i > 0); - js += "}"; - break; - } -} - -//------------------------------------------------------------------ Deserialize -bool CJAVal::Deserialize(char &js[], int slen, int &i) -{ - string num = "0123456789+-.eE"; - int i0 = i; - for (; i < slen; i++) - { - char c = js[i]; - if (c == 0) - break; - switch (c) - { - case '\t': - case '\r': - case '\n': - case ' ': // пропускаем из имени пробелы - i0 = i + 1; - break; - - case '[': // начало массива. создаём объекты и забираем из js - { - i0 = i + 1; - if (m_type != jtUNDEF) // если значение уже имеет тип, то это ошибка - { - Print(groupName + " " + string(__LINE__)); - return false; - } - m_type = jtARRAY; // задали тип значения - i++; - CJAVal val(GetPointer(this), jtUNDEF); - while (val.Deserialize(js, slen, i)) - { - if (val.m_type != jtUNDEF) - Add(val); - if (val.m_type == jtINT || val.m_type == jtDBL || val.m_type == jtARRAY) - i++; - val.Clear(); - val.m_parent = GetPointer(this); - if (js[i] == ']') - break; - i++; - if (i >= slen) - { - Print(groupName + " " + string(__LINE__)); - return false; - } - } - if (i >= slen) - return false; - return js[i] == ']' || js[i] == 0; - } - break; - case ']': - if (!m_parent) - return false; - return m_parent.m_type == jtARRAY; // конец массива, текущее значение должны быть массивом - - case ':': - { - if (m_lkey == "") - { - Print(groupName + " " + string(__LINE__)); - return false; - } - CJAVal val(GetPointer(this), jtUNDEF); - CJAVal *oc = Add(val); // тип объекта пока не определён - oc.groupName = m_lkey; - m_lkey = ""; // задали имя ключа - i++; - if (!oc.Deserialize(js, slen, i)) - { - Print(groupName + " " + string(__LINE__)); - return false; - } - break; - } - case ',': // разделитель значений // тип значения уже должен быть определён - i0 = i + 1; - if (!m_parent && m_type != jtOBJ) - { - Print(groupName + " " + string(__LINE__)); - return false; - } - else if (m_parent) - { - if (m_parent.m_type != jtARRAY && m_parent.m_type != jtOBJ) - { - Print(groupName + " " + string(__LINE__)); - return false; - } - if (m_parent.m_type == jtARRAY && m_type == jtUNDEF) - return true; - } - break; - - // примитивы могут быть ТОЛЬКО в массиве / либо самостоятельно - case '{': // начало объекта. создаем объект и забираем его из js - i0 = i + 1; - if (m_type != jtUNDEF) // ошибка типа - { - Print(groupName + " " + string(__LINE__)); - return false; - } - m_type = jtOBJ; // задали тип значения - i++; - if (!Deserialize(js, slen, i)) // вытягиваем его - { - Print(groupName + " " + string(__LINE__)); - return false; - } - if (i >= slen) - return false; - return js[i] == '}' || js[i] == 0; - break; - case '}': - return m_type == jtOBJ; // конец объекта, текущее значение должно быть объектом - - case 't': - case 'T': // начало true - case 'f': - case 'F': // начало false - if (m_type != jtUNDEF) // ошибка типа - { - Print(groupName + " " + string(__LINE__)); - return false; - } - m_type = jtBOOL; // задали тип значения - if (i + 3 < slen) - { - if (StringCompare(GetStr(js, i, 4), "true", false) == 0) - { - m_bv = true; - i += 3; - return true; - } - } - if (i + 4 < slen) - { - if (StringCompare(GetStr(js, i, 5), "false", false) == 0) - { - m_bv = false; - i += 4; - return true; - } - } - Print(groupName + " " + string(__LINE__)); - return false; // не тот тип или конец строки - break; - case 'n': - case 'N': // начало null - if (m_type != jtUNDEF) // ошибка типа - { - Print(groupName + " " + string(__LINE__)); - return false; - } - m_type = jtNULL; // задали тип значения - if (i + 3 < slen) - if (StringCompare(GetStr(js, i, 4), "null", false) == 0) - { - i += 3; - return true; - } - Print(groupName + " " + string(__LINE__)); - return false; // не NULL или конец строки - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '-': - case '+': - case '.': // начало числа - { - if (m_type != jtUNDEF) // ошибка типа - { - Print(groupName + " " + string(__LINE__)); - return false; - } - bool dbl = false; // задали тип значения - int is = i; - while (js[i] != 0 && i < slen) - { - i++; - if (StringFind(num, GetStr(js, i, 1)) < 0) - break; - if (!dbl) - dbl = (js[i] == '.' || js[i] == 'e' || js[i] == 'E'); - } - m_sv = GetStr(js, is, i - is); - if (dbl) - { - m_type = jtDBL; - m_dv = StringToDouble(m_sv); - m_iv = (long)m_dv; - m_bv = m_iv != 0; - } - else // уточнии тип значения - { - m_type = jtINT; - m_iv = StringToInteger(m_sv); - m_dv = (double)m_iv; - m_bv = m_iv != 0; - } - i--; - return true; // отодвинулись на 1 символ назад и вышли - break; - } - case '\"': // начало или конец строки - if (m_type == jtOBJ) // если тип еще неопределён и ключ не задан - { - i++; - int is = i; - if (!ExtrStr(js, slen, i)) // это ключ, идём до конца строки - { - Print(groupName + " " + string(__LINE__)); - return false; - } - m_lkey = GetStr(js, is, i - is); - } - else - { - if (m_type != jtUNDEF) // ошибка типа - { - Print(groupName + " " + string(__LINE__)); - return false; - } - m_type = jtSTR; // задали тип значения - i++; - int is = i; - if (!ExtrStr(js, slen, i)) - { - Print(groupName + " " + string(__LINE__)); - return false; - } - FromStr(jtSTR, GetStr(js, is, i - is)); - return true; - } - break; - } - } - return true; -} - -//------------------------------------------------------------------ ExtrStr -bool CJAVal::ExtrStr(char &js[], int slen, int &i) -{ - for (; js[i] != 0 && i < slen; i++) - { - char c = js[i]; - if (c == '\"') - break; // конец строки - if (c == '\\' && i + 1 < slen) - { - i++; - c = js[i]; - switch (c) - { - case '/': - case '\\': - case '\"': - case 'b': - case 'f': - case 'r': - case 'n': - case 't': - break; // это разрешенные - case 'u': // \uXXXX - { - i++; - for (int j = 0; j < 4 && i < slen && js[i] != 0; j++, i++) - { - if (!((js[i] >= '0' && js[i] <= '9') || (js[i] >= 'A' && js[i] <= 'F') || (js[i] >= 'a' && js[i] <= 'f'))) // не hex - { - Print(groupName + " " + CharToString(js[i]) + " " + string(__LINE__)); - return false; - } - } - i--; - break; - } - default: - break; /*{ return false; } // неразрешенный символ с экранированием */ - } - } - } - return true; -} -//------------------------------------------------------------------ Escape -string CJAVal::Escape(string a) -{ - ushort as[], s[]; - int n = StringToShortArray(a, as); - if (ArrayResize(s, 2 * n) != 2 * n) - return NULL; - int j = 0; - for (int i = 0; i < n; i++) - { - switch (as[i]) - { - case '\\': - s[j] = '\\'; - j++; - s[j] = '\\'; - j++; - break; - case '"': - s[j] = '\\'; - j++; - s[j] = '"'; - j++; - break; - case '/': - s[j] = '\\'; - j++; - s[j] = '/'; - j++; - break; - case 8: - s[j] = '\\'; - j++; - s[j] = 'b'; - j++; - break; - case 12: - s[j] = '\\'; - j++; - s[j] = 'f'; - j++; - break; - case '\n': - s[j] = '\\'; - j++; - s[j] = 'n'; - j++; - break; - case '\r': - s[j] = '\\'; - j++; - s[j] = 'r'; - j++; - break; - case '\t': - s[j] = '\\'; - j++; - s[j] = 't'; - j++; - break; - default: - s[j] = as[i]; - j++; - break; - } - } - a = ShortArrayToString(s, 0, j); - return a; -} -//------------------------------------------------------------------ Unescape -string CJAVal::Unescape(string a) -{ - ushort as[], s[]; - int n = StringToShortArray(a, as); - if (ArrayResize(s, n) != n) - return NULL; - int j = 0, i = 0; - while (i < n) - { - ushort c = as[i]; - if (c == '\\' && i < n - 1) - { - switch (as[i + 1]) - { - case '\\': - c = '\\'; - i++; - break; - case '"': - c = '"'; - i++; - break; - case '/': - c = '/'; - i++; - break; - case 'b': - c = 8; - /*08='\b'*/; - i++; - break; - case 'f': - c = 12; - /*0c=\f*/ i++; - break; - case 'n': - c = '\n'; - i++; - break; - case 'r': - c = '\r'; - i++; - break; - case 't': - c = '\t'; - i++; - break; - case 'u': // \uXXXX - { - i += 2; - ushort k = 0; - for (int jj = 0; jj < 4 && i < n; jj++, i++) - { - c = as[i]; - ushort h = 0; - if (c >= '0' && c <= '9') - h = c - '0'; - else if (c >= 'A' && c <= 'F') - h = c - 'A' + 10; - else if (c >= 'a' && c <= 'f') - h = c - 'a' + 10; - else - break; // не hex - k += h * (ushort)pow(16, (3 - jj)); - } - i--; - c = k; - break; - } - } - } - s[j] = c; - j++; - i++; - } - a = ShortArrayToString(s, 0, j); - return a; -} -//+------------------------------------------------------------------+ diff --git a/resources/ejTrader/Indicators/ejtraderMTIndicator.ex5 b/resources/ejTrader/Indicators/ejtraderMTIndicator.ex5 deleted file mode 100644 index fc917f8..0000000 Binary files a/resources/ejTrader/Indicators/ejtraderMTIndicator.ex5 and /dev/null differ diff --git a/resources/ejTrader/Indicators/ejtraderMTIndicator.mq5 b/resources/ejTrader/Indicators/ejtraderMTIndicator.mq5 deleted file mode 100644 index d034d76..0000000 --- a/resources/ejTrader/Indicators/ejtraderMTIndicator.mq5 +++ /dev/null @@ -1,614 +0,0 @@ - -#property copyright "2021 ejtrader" -#property link "https://github.com/ejtraderLabs" -#property version "1.00" - -#include -#include -#include - -// Set ports and host for ZeroMQ -string HOST="localhost"; -int CHART_SUB_PORT=15562; - -// ZeroMQ Cnnections -Context context("EJTRADERMT"); -Socket chartSubscriptionSocket(context,ZMQ_SUB); - -//--- input parameters -#property indicator_buffers 31 -#property indicator_plots 30 - -input string IndicatorId=""; -input string ShortName="ejtraderMTIndicator"; - -//--- indicator settings -double B0[], B1[], B2[], B3[], B4[], B5[], B6[], B7[], B8[], B9[], B10[]; -double B11[], B12[], B13[], B14[], B15[], B16[], B17[], B18[], B19[], B20[]; -double B21[], B22[], B23[], B24[], B25[], B26[], B27[], B28[], B29[]; -bool debug = false; -int activeBufferCount = 0; -long mtChartId = 0; -bool setFormingCandleBlank = true; - -//+------------------------------------------------------------------+ -//| Custom indicator initialization function | -//+------------------------------------------------------------------+ -int OnInit() - - { -// TODO subscribe only to own IndicatorId topic -// Subscribe to all topics - chartSubscriptionSocket.setSubscribe(""); - chartSubscriptionSocket.setLinger(1000); -// https://www.randonomicon.com/zmq/2018/09/19/zmq-bind-vs-connect.html -// Number of messages to buffer in RAM. -// https://dzone.com/articles/zeromq-flow-control-and-other - chartSubscriptionSocket.setReceiveHighWaterMark(1000); - bool result = chartSubscriptionSocket.connect(StringFormat("tcp://%s:%d", HOST, CHART_SUB_PORT)); - if(result == false) - { - Print("Failed to subscrbe on port ", CHART_SUB_PORT); - } - else - { - Print("Accepting Chart Indicator data on port ", CHART_SUB_PORT); - } - -//--- indicator buffers mapping; - ArraySetAsSeries(B0,true); - ArraySetAsSeries(B1,true); - ArraySetAsSeries(B2,true); - ArraySetAsSeries(B3,true); - ArraySetAsSeries(B4,true); - ArraySetAsSeries(B5,true); - ArraySetAsSeries(B6,true); - ArraySetAsSeries(B7,true); - ArraySetAsSeries(B8,true); - ArraySetAsSeries(B9,true); - ArraySetAsSeries(B10,true); - ArraySetAsSeries(B11,true); - ArraySetAsSeries(B12,true); - ArraySetAsSeries(B13,true); - ArraySetAsSeries(B14,true); - ArraySetAsSeries(B15,true); - ArraySetAsSeries(B16,true); - ArraySetAsSeries(B17,true); - ArraySetAsSeries(B18,true); - ArraySetAsSeries(B19,true); - ArraySetAsSeries(B20,true); - ArraySetAsSeries(B21,true); - ArraySetAsSeries(B22,true); - ArraySetAsSeries(B23,true); - ArraySetAsSeries(B24,true); - ArraySetAsSeries(B25,true); - ArraySetAsSeries(B26,true); - ArraySetAsSeries(B27,true); - ArraySetAsSeries(B28,true); - ArraySetAsSeries(B29,true); - - SetIndexBuffer(0,B0,INDICATOR_CALCULATIONS); - SetIndexBuffer(1,B1,INDICATOR_CALCULATIONS); - SetIndexBuffer(2,B2,INDICATOR_CALCULATIONS); - SetIndexBuffer(3,B3,INDICATOR_CALCULATIONS); - SetIndexBuffer(4,B4,INDICATOR_CALCULATIONS); - SetIndexBuffer(5,B5,INDICATOR_CALCULATIONS); - SetIndexBuffer(6,B6,INDICATOR_CALCULATIONS); - SetIndexBuffer(7,B7,INDICATOR_CALCULATIONS); - SetIndexBuffer(8,B8,INDICATOR_CALCULATIONS); - SetIndexBuffer(9,B9,INDICATOR_CALCULATIONS); - SetIndexBuffer(10,B10,INDICATOR_CALCULATIONS); - SetIndexBuffer(11,B11,INDICATOR_CALCULATIONS); - SetIndexBuffer(12,B12,INDICATOR_CALCULATIONS); - SetIndexBuffer(13,B13,INDICATOR_CALCULATIONS); - SetIndexBuffer(14,B14,INDICATOR_CALCULATIONS); - SetIndexBuffer(15,B15,INDICATOR_CALCULATIONS); - SetIndexBuffer(16,B16,INDICATOR_CALCULATIONS); - SetIndexBuffer(17,B17,INDICATOR_CALCULATIONS); - SetIndexBuffer(18,B18,INDICATOR_CALCULATIONS); - SetIndexBuffer(19,B19,INDICATOR_CALCULATIONS); - SetIndexBuffer(20,B20,INDICATOR_CALCULATIONS); - SetIndexBuffer(21,B21,INDICATOR_CALCULATIONS); - SetIndexBuffer(22,B22,INDICATOR_CALCULATIONS); - SetIndexBuffer(23,B23,INDICATOR_CALCULATIONS); - SetIndexBuffer(24,B24,INDICATOR_CALCULATIONS); - SetIndexBuffer(25,B25,INDICATOR_CALCULATIONS); - SetIndexBuffer(26,B26,INDICATOR_CALCULATIONS); - SetIndexBuffer(27,B27,INDICATOR_CALCULATIONS); - SetIndexBuffer(28,B28,INDICATOR_CALCULATIONS); - SetIndexBuffer(29,B29,INDICATOR_CALCULATIONS); - -//--- - IndicatorSetString(INDICATOR_SHORTNAME,ShortName); - - return(INIT_SUCCEEDED); - } - -//+------------------------------------------------------------------+ -//| | -//+------------------------------------------------------------------+ -void OnDeinit(const int reason) - { -// Print("INDI DEINIT ",reason); - } - - -//+------------------------------------------------------------------+ -//| | -//+------------------------------------------------------------------+ -void SetStyle(int bufferIdx, string linelabel, color colorstyle, int linetype, int linestyle, int linewidth) - { - PlotIndexSetString(bufferIdx,PLOT_LABEL,linelabel); - PlotIndexSetInteger(bufferIdx,PLOT_LINE_COLOR,0,colorstyle); - PlotIndexSetInteger(bufferIdx,PLOT_DRAW_TYPE,linetype); - PlotIndexSetInteger(bufferIdx,PLOT_LINE_STYLE,linestyle); - PlotIndexSetInteger(bufferIdx,PLOT_LINE_WIDTH,linewidth); - } - -//+------------------------------------------------------------------+ -//| Custom indicator iteration function | -//+------------------------------------------------------------------+ -int OnCalculate(const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[]) - { - -// While a new candle is forming, set the current value to be empty - - - if(rates_total>prev_calculated && setFormingCandleBlank) - { - B0[0] = EMPTY_VALUE; - B1[0] = EMPTY_VALUE; - B2[0] = EMPTY_VALUE; - B3[0] = EMPTY_VALUE; - B4[0] = EMPTY_VALUE; - B5[0] = EMPTY_VALUE; - B6[0] = EMPTY_VALUE; - B7[0] = EMPTY_VALUE; - B8[0] = EMPTY_VALUE; - B9[0] = EMPTY_VALUE; - B10[0] = EMPTY_VALUE; - B11[0] = EMPTY_VALUE; - B12[0] = EMPTY_VALUE; - B13[0] = EMPTY_VALUE; - B14[0] = EMPTY_VALUE; - B15[0] = EMPTY_VALUE; - B16[0] = EMPTY_VALUE; - B17[0] = EMPTY_VALUE; - B18[0] = EMPTY_VALUE; - B19[0] = EMPTY_VALUE; - B20[0] = EMPTY_VALUE; - B21[0] = EMPTY_VALUE; - B22[0] = EMPTY_VALUE; - B23[0] = EMPTY_VALUE; - B24[0] = EMPTY_VALUE; - B25[0] = EMPTY_VALUE; - B26[0] = EMPTY_VALUE; - B27[0] = EMPTY_VALUE; - B28[0] = EMPTY_VALUE; - B29[0] = EMPTY_VALUE; - } - -//--- return value of prev_calculated for next call - return(rates_total); - } - -//+------------------------------------------------------------------+ -//| | -//+------------------------------------------------------------------+ -void SubscriptionHandler(ZmqMsg &chartMsg) - { - CJAVal message; -// Get data from request - string msg=chartMsg.getData(); - if(debug) - Print("Processing:"+msg); -// Deserialize msg to CJAVal array - if(!message.Deserialize(msg)) - { - Alert("Deserialization Error"); - ExpertRemove(); - } - if(message["chartIndicatorId"]==IndicatorId) - { - - if(message["action"]=="PLOT" && message["actionType"]=="DATA") - { - int bufferIdx = message["indicatorBufferId"].ToInt(); - if(bufferIdx == 0) - { - WriteToBuffer(message, B0); - SetIndexBuffer(0,B0,INDICATOR_DATA); - } - if(bufferIdx == 1) - { - WriteToBuffer(message, B1); - SetIndexBuffer(1,B1,INDICATOR_DATA); - } - if(bufferIdx == 2) - { - WriteToBuffer(message, B2); - SetIndexBuffer(2,B2,INDICATOR_DATA); - } - if(bufferIdx == 3) - { - WriteToBuffer(message, B3); - SetIndexBuffer(3,B3,INDICATOR_DATA); - } - if(bufferIdx == 4) - { - WriteToBuffer(message, B4); - SetIndexBuffer(4,B4,INDICATOR_DATA); - } - if(bufferIdx == 5) - { - WriteToBuffer(message, B5); - SetIndexBuffer(5,B5,INDICATOR_DATA); - } - if(bufferIdx == 6) - { - WriteToBuffer(message, B6); - SetIndexBuffer(6,B6,INDICATOR_DATA); - } - if(bufferIdx == 7) - { - WriteToBuffer(message, B7); - SetIndexBuffer(7,B7,INDICATOR_DATA); - } - if(bufferIdx == 8) - { - WriteToBuffer(message, B8); - SetIndexBuffer(8,B8,INDICATOR_DATA); - } - if(bufferIdx == 9) - { - WriteToBuffer(message, B9); - SetIndexBuffer(9,B9,INDICATOR_DATA); - } - if(bufferIdx == 10) - { - WriteToBuffer(message, B10); - SetIndexBuffer(10,B10,INDICATOR_DATA); - } - if(bufferIdx == 11) - { - WriteToBuffer(message, B11); - SetIndexBuffer(11,B11,INDICATOR_DATA); - } - if(bufferIdx == 12) - { - WriteToBuffer(message, B12); - SetIndexBuffer(12,B12,INDICATOR_DATA); - } - if(bufferIdx == 13) - { - WriteToBuffer(message, B13); - SetIndexBuffer(13,B13,INDICATOR_DATA); - } - if(bufferIdx == 14) - { - WriteToBuffer(message, B14); - SetIndexBuffer(14,B14,INDICATOR_DATA); - } - if(bufferIdx == 15) - { - WriteToBuffer(message, B15); - SetIndexBuffer(15,B15,INDICATOR_DATA); - } - if(bufferIdx == 16) - { - WriteToBuffer(message, B16); - SetIndexBuffer(16,B16,INDICATOR_DATA); - } - if(bufferIdx == 17) - { - WriteToBuffer(message, B17); - SetIndexBuffer(17,B17,INDICATOR_DATA); - } - if(bufferIdx == 18) - { - WriteToBuffer(message, B18); - SetIndexBuffer(18,B18,INDICATOR_DATA); - } - if(bufferIdx == 19) - { - WriteToBuffer(message, B19); - SetIndexBuffer(19,B19,INDICATOR_DATA); - } - if(bufferIdx == 20) - { - WriteToBuffer(message, B20); - SetIndexBuffer(20,B20,INDICATOR_DATA); - } - if(bufferIdx == 21) - { - WriteToBuffer(message, B21); - SetIndexBuffer(21,B21,INDICATOR_DATA); - } - if(bufferIdx == 22) - { - WriteToBuffer(message, B22); - SetIndexBuffer(22,B22,INDICATOR_DATA); - } - if(bufferIdx == 23) - { - WriteToBuffer(message, B23); - SetIndexBuffer(23,B23,INDICATOR_DATA); - } - if(bufferIdx == 24) - { - WriteToBuffer(message, B24); - SetIndexBuffer(24,B24,INDICATOR_DATA); - } - if(bufferIdx == 25) - { - WriteToBuffer(message, B25); - SetIndexBuffer(25,B25,INDICATOR_DATA); - } - if(bufferIdx == 26) - { - WriteToBuffer(message, B26); - SetIndexBuffer(26,B26,INDICATOR_DATA); - } - if(bufferIdx == 27) - { - WriteToBuffer(message, B27); - SetIndexBuffer(27,B27,INDICATOR_DATA); - } - if(bufferIdx == 28) - { - WriteToBuffer(message, B28); - SetIndexBuffer(28,B28,INDICATOR_DATA); - } - if(bufferIdx == 29) - { - WriteToBuffer(message, B29); - SetIndexBuffer(29,B29,INDICATOR_DATA); - } - ChartRedraw(mtChartId); - } - else - if(message["action"]=="PLOT" && message["actionType"]=="ADDBUFFER") - { - string linelabel = message["style"]["linelabel"].ToStr(); - string colorstyleStr = message["style"]["color"].ToStr(); - string linetypeStr = message["style"]["linetype"].ToStr(); - string linestyleStr = message["style"]["linestyle"].ToStr(); - int linewidth = message["style"]["linewidth"].ToInt(); - setFormingCandleBlank = message["style"]["blankforming"].ToBool(); - - color colorstyle = StringToColor(colorstyleStr); - int linetype = StringToEnumInt(linetypeStr); - int linestyle = StringToEnumInt(linestyleStr); - - SetStyle(activeBufferCount, linelabel, colorstyle, linetype, linestyle, linewidth); - activeBufferCount = activeBufferCount + 1; - - ClearBuffer(activeBufferCount-1); - } - } - } - -//+------------------------------------------------------------------+ -//| | -//+------------------------------------------------------------------+ -void Clear(double &buffer[]) - { - int bufferSize = ArraySize(buffer); - for(int i=0; i= EMPTY_VALUE) - val = EMPTY_VALUE; - buffer[i+offset] = val; - } - } - } - - -//+------------------------------------------------------------------+ -//| Check for new indicator data function | -//+------------------------------------------------------------------+ -void CheckMessages() - { -// This is a workaround for Timer(). It is needed, because OnTimer() works if the indicator is manually added to a chart, but not with ChartIndicatorAdd() - - ZmqMsg chartMsg; - -// Recieve chart instructions stream from client via live Chart socket. - chartSubscriptionSocket.recv(chartMsg,true); - -// Request recieved - if(chartMsg.size()>0) - { - // Handle subscription SubscriptionHandler() - SubscriptionHandler(chartMsg); - ChartRedraw(ChartID()); - } - } - -//+------------------------------------------------------------------+ -//| OnTimer() workaround function | -//+------------------------------------------------------------------+ -// Gets triggered by the OnTimer() function of the JsonAPI Expert script -void OnChartEvent(const int id, - const long &lparam, - const double &dparam, - const string &sparam) - { - if(id==CHARTEVENT_CUSTOM+222) - CheckMessages(); - } -//+---------------------------------------------------- diff --git a/resources/ejTrader/ejtraderMT.mq5 b/resources/ejTrader/ejtraderMT.mq5 deleted file mode 100644 index e79c815..0000000 --- a/resources/ejTrader/ejtraderMT.mq5 +++ /dev/null @@ -1,1009 +0,0 @@ -//+------------------------------------------------------------------+ -//| ProjectName | -//| Copyright 2020, CompanyName | -//| http://www.companyname.net | -//+------------------------------------------------------------------+ - -#property copyright "Copyright 2022, ejtrader." -#property link "https://github.com/ejtraderLabs" -#property version "3.04" -#property description "ejtraderMT" -#property description "See github link for documentation" - -#include -#include -#include -#include -#include -#include -#include - -// Set ports and host for ZeroMQ -string HOST = "*"; -int SYS_PORT = 15555; -int DATA_PORT = 15556; -int LIVE_PORT = 15557; -int STR_PORT = 15558; - -// ZeroMQ Connections -Context context("EJTRADERMT"); -Socket sysSocket(context, ZMQ_REP); -Socket dataSocket(context, ZMQ_PUSH); -Socket liveSocket(context, ZMQ_PUSH); -Socket streamSocket(context, ZMQ_PUSH); - -// Load ejtraderMTincludes -// Required: -#include -#include -#include -// Optional: -// #include -// #include - -// Global variables \\ -bool debug = false; -bool liveStream = false; -bool connectedFlag = true; -int deInitReason = -1; -// double chartAttached = ChartID(); // Chart id where the expert is attached to - -// Variables for handling price data stream -struct SymbolSubscription -{ - string symbol; - string chartTf; - datetime lastBar; -}; -SymbolSubscription symbolSubscriptions[]; -int symbolSubscriptionCount = 0; - -// Error handling -ControlErrors mControl; -datetime tm; -//+------------------------------------------------------------------+ -//| Bind ZMQ sockets to ports | -//+------------------------------------------------------------------+ -bool BindSockets() -{ - sysSocket.setLinger(1000); - dataSocket.setLinger(1000); - liveSocket.setLinger(1000); - streamSocket.setLinger(1000); -#ifdef START_INDICATOR - indicatorDataSocket.setLinger(1000); -#endif -#ifdef CHART_CONTROL - chartDataSocket.setLinger(1000); - chartIndicatorDataSocket.setLinger(1000); -#endif - - // Number of messages to buffer in RAM. - sysSocket.setSendHighWaterMark(1000); - dataSocket.setSendHighWaterMark(1000); - liveSocket.setSendHighWaterMark(1000); - streamSocket.setSendHighWaterMark(1000); -#ifdef START_INDICATOR - indicatorDataSocket.setSendHighWaterMark(1000); -#endif -#ifdef CHART_CONTROL - chartDataSocket.setReceiveHighWaterMark(1000); // TODO confirm settings - chartIndicatorDataSocket.setReceiveHighWaterMark(1000); -#endif - - bool result = false; - result = sysSocket.bind(StringFormat("tcp://%s:%d", HOST, SYS_PORT)); - if (result == false) - { - return result; - } - else - { - Print("Bound 'System' socket on port ", SYS_PORT); - } - result = dataSocket.bind(StringFormat("tcp://%s:%d", HOST, DATA_PORT)); - if (result == false) - { - return result; - } - else - { - Print("Bound 'Data' socket on port ", DATA_PORT); - } - result = liveSocket.bind(StringFormat("tcp://%s:%d", HOST, LIVE_PORT)); - if (result == false) - { - return result; - } - else - { - Print("Bound 'Live' socket on port ", LIVE_PORT); - } - result = streamSocket.bind(StringFormat("tcp://%s:%d", HOST, STR_PORT)); - if (result == false) - { - return result; - } - else - { - Print("Bound 'Streaming' socket on port ", STR_PORT); - } -#ifdef START_INDICATOR - result = indicatorDataSocket.bind(StringFormat("tcp://%s:%d", HOST, INDICATOR_DATA_PORT)); - if (result == false) - { - return result; - } - else - { - Print("Bound 'Indicator Data' socket on port ", INDICATOR_DATA_PORT); - } -#endif -#ifdef CHART_CONTROL - result = chartDataSocket.bind(StringFormat("tcp://%s:%d", HOST, CHART_DATA_PORT)); - if (result == false) - { - return result; - } - else - { - Print("Bound 'Chart Data' socket on port ", CHART_DATA_PORT); - } - result = chartIndicatorDataSocket.bind(StringFormat("tcp://%s:%d", HOST, CHART_INDICATOR_DATA_PORT)); - if (result == false) - { - return result; - } - else - { - Print("Bound 'JsonAPIIndicator Data' socket on port ", CHART_INDICATOR_DATA_PORT); - } -#endif - return result; -} - -//+------------------------------------------------------------------+ -//| Expert initialization function | -//+------------------------------------------------------------------+ -int OnInit() -{ - - // Setting up error reporting - mControl.SetAlert(true); - mControl.SetSound(false); - mControl.SetWriteFlag(false); - - /* Bindinig ZMQ ports on init */ - // Skip reloading of the EA script when the reason to reload is a chart timeframe change - if (deInitReason != REASON_CHARTCHANGE) - { - - EventSetMillisecondTimer(1); - - int bindSocketsDelay = 65; // Seconds to wait if binding of sockets fails. - int bindAttemtps = 2; // Number of binding attemtps - - Print("Binding sockets..."); - - for (int i = 0; i < bindAttemtps; i++) - { - if (BindSockets()) - return (INIT_SUCCEEDED); - else - { - Print("Binding sockets failed. Waiting ", bindSocketsDelay, " seconds to try again..."); - Sleep(bindSocketsDelay * 1000); - } - } - - Print("Binding of sockets failed permanently."); - return (INIT_FAILED); - } - - return (INIT_SUCCEEDED); -} - -//+------------------------------------------------------------------+ -//| Expert deinitialization function | -//+------------------------------------------------------------------+ -void OnDeinit(const int reason) -{ - /* Unbinding ZMQ ports on denit */ - - // TODO Ports do not get freed immediately under Wine. How to properly close ports? There is a timeout of about 60 sec. - // https://forum.winehq.org/viewtopic.php?t=22758 - // https://github.com/zeromq/cppzmq/issues/139 - - deInitReason = reason; - - // Skip reloading of the EA script when the reason to reload is a chart timeframe change - if (reason != REASON_CHARTCHANGE) - { - Print(__FUNCTION__, " Deinitialization reason: ", getUninitReasonText(reason)); - - Print("Unbinding 'System' socket on port ", SYS_PORT, ".."); - sysSocket.unbind(StringFormat("tcp://%s:%d", HOST, SYS_PORT)); - Print("Unbinding 'Data' socket on port ", DATA_PORT, ".."); - dataSocket.unbind(StringFormat("tcp://%s:%d", HOST, DATA_PORT)); - Print("Unbinding 'Live' socket on port ", LIVE_PORT, ".."); - liveSocket.unbind(StringFormat("tcp://%s:%d", HOST, LIVE_PORT)); - Print("Unbinding 'Streaming' socket on port ", STR_PORT, ".."); - streamSocket.unbind(StringFormat("tcp://%s:%d", HOST, STR_PORT)); -#ifdef START_INDICATOR - Print("Unbinding 'Indicator Data' socket on port ", INDICATOR_DATA_PORT, ".."); - streamSocket.unbind(StringFormat("tcp://%s:%d", HOST, INDICATOR_DATA_PORT)); -#endif -#ifdef CHART_CONTROL - Print("Unbinding 'Chart Data' socket on port ", CHART_DATA_PORT, ".."); - streamSocket.unbind(StringFormat("tcp://%s:%d", HOST, CHART_DATA_PORT)); - Print("Unbinding 'JsonAPIIndicator Data' socket on port ", CHART_INDICATOR_DATA_PORT, ".."); - streamSocket.unbind(StringFormat("tcp://%s:%d", HOST, CHART_INDICATOR_DATA_PORT)); -#endif - - // Shutdown ZeroMQ Context - context.shutdown(); - context.destroy(0); - - // Reset - ResetSubscriptionsAndIndicators(); - - EventKillTimer(); - } -} - -//+------------------------------------------------------------------+ -//| Check if subscribed to symbol and timeframe combination | -//+------------------------------------------------------------------+ -bool HasChartSymbol(string symbol, string chartTF) -{ - for (int i = 0; i < ArraySize(symbolSubscriptions); i++) - { - if (symbolSubscriptions[i].symbol == symbol && symbolSubscriptions[i].chartTf == chartTF) - { - return true; - } - } - return false; -} - -//+------------------------------------------------------------------+ -//| Stream live price data | -//+------------------------------------------------------------------+ -void StreamPriceData() -{ - // If liveStream == true, push last candle to liveSocket. - - if (liveStream) - { - CJAVal last; - if (TerminalInfoInteger(TERMINAL_CONNECTED)) - { - connectedFlag = true; - for (int i = 0; i < symbolSubscriptionCount; i++) - { - string symbol = symbolSubscriptions[i].symbol; - string chartTF = symbolSubscriptions[i].chartTf; - datetime lastBar = symbolSubscriptions[i].lastBar; - CJAVal Data; - ENUM_TIMEFRAMES period = GetTimeframe(chartTF); - - datetime thisBar = 0; - float price; - MqlTick tick; - MqlRates rates[1]; - int spread[1]; - - if (chartTF == "TICK") - { - if (SymbolInfoTick(symbol, tick) != true) - { /*mControl.Check();*/ - } - thisBar = (datetime)tick.time_msc; - } - else - { - if (CopyRates(symbol, period, 1, 1, rates) != 1) - { /*mControl.Check();*/ - } - if (CopySpread(symbol, period, 1, 1, spread) != 1) - { /*mControl.Check();*/ - ; - } - thisBar = (datetime)rates[0].time; - } - - if (lastBar != thisBar) - { - if (lastBar != 0) // skip first price data after startup/reset - { - if (chartTF == "TICK") - { - Data[0] = (long)tick.time_msc; - Data[1] = (double)tick.bid; - Data[2] = (double)tick.ask; - } - else - { - Data[0] = (long)rates[0].time; - Data[1] = (double)rates[0].open; - Data[2] = (double)rates[0].high; - Data[3] = (double)rates[0].low; - Data[4] = (double)rates[0].close; - Data[5] = (double)rates[0].tick_volume; - } - last["status"] = (string) "CONNECTED"; - last["symbol"] = (string)symbol; - last["timeframe"] = (string)chartTF; - last["data"].Set(Data); - - string t = last.Serialize(); - if (debug) - Print(t); - InformClientSocket(liveSocket, t); - symbolSubscriptions[i].lastBar = thisBar; - } - else - symbolSubscriptions[i].lastBar = thisBar; - } - } - } - else - { - // send disconnect message only once - if (connectedFlag) - { - last["status"] = (string) "DISCONNECTED"; - string t = last.Serialize(); - if (debug) - Print(t); - InformClientSocket(liveSocket, t); - connectedFlag = false; - } - } - } -} - -//+------------------------------------------------------------------+ -//| Expert timer function | -//+------------------------------------------------------------------+ -void OnTimer() -{ - tm = TimeTradeServer(); - // Stream live price data - StreamPriceData(); - - ZmqMsg request; - - // Get request from client via System socket. - sysSocket.recv(request, true); - - // Request recived - if (request.size() > 0) - { - // Pull request to RequestHandler(). - RequestHandler(request); - } -#ifdef CHART_CONTROL - // Publish indicator values for the JsonAPIIndicator indicator - ZmqMsg chartMsg; - chartDataSocket.recv(chartMsg, true); - if (chartMsg.size() > 0) - { - double values[]; - // Ensure that all indicators have finished intitailisation - for (int i = 0; i < ArraySize(chartWindowIndicators); i++) - { - // Wait for CopyBuffer to return. Ensures that indicator has been initialized - CopyBuffer(chartWindowIndicators[i].indicatorHandle, 0, 0, 1, values); - } - chartIndicatorDataSocket.send(chartMsg, true); - } - - // Trigger the indicator JsonAPIIndicator to check for new Messages - for (int i = 0; i < ArraySize(chartWindows); i++) - { - long chartId = chartWindows[i].id; - EventChartCustom(chartId, 222, 222, 222.0); - } -#endif -} -//+------------------------------------------------------------------+ -//| Request handler | -//+------------------------------------------------------------------+ -void RequestHandler(ZmqMsg &request) -{ - - CJAVal incomingMessage; - - ResetLastError(); - // Get data from reguest - string msg = request.getData(); - - if (debug) - Print("Processing:" + msg); - - if (!incomingMessage.Deserialize(msg)) - { - mControl.mSetUserError(65537, GetErrorID(65537)); - CheckError(__FUNCTION__); - } - - // Send response to System socket that request was received - // Some historical data requests can take a lot of time - InformClientSocket(sysSocket, "OK"); - - // Process action command - string action = incomingMessage["action"].ToStr(); - - if (action == "CONFIG") - ScriptConfiguration(incomingMessage); - else if (action == "ACCOUNT") - GetAccountInfo(); - else if (action == "BALANCE") - GetBalanceInfo(); - else if (action == "HISTORY") - HistoryInfo(incomingMessage); - else if (action == "TRADE") - TradingModule(incomingMessage); - else if (action == "POSITIONS") - GetPositions(incomingMessage); - else if (action == "ORDERS") - GetOrders(incomingMessage); - else if (action == "RESET") - ResetSubscriptionsAndIndicators(); - else if (action == "CALENDAR") - GetEconomicCalendar(incomingMessage); - else -#ifdef START_INDICATOR - if (action == "INDICATOR") - IndicatorControl(incomingMessage); - else -#endif -#ifdef CHART_CONTROL - if (action == "CHART") - ChartControl(incomingMessage); - else -#endif - { - mControl.mSetUserError(65538, GetErrorID(65538)); - CheckError(__FUNCTION__); - } -} - -//+------------------------------------------------------------------+ -//| Reconfigure the script params | -//+------------------------------------------------------------------+ -void ScriptConfiguration(CJAVal &dataObject) -{ - - string symbol = dataObject["symbol"].ToStr(); - string chartTF = dataObject["chartTF"].ToStr(); - - ArrayResize(symbolSubscriptions, symbolSubscriptionCount + 1); - symbolSubscriptions[symbolSubscriptionCount].symbol = symbol; - symbolSubscriptions[symbolSubscriptionCount].chartTf = chartTF; - // to initialze with value 0 skips the first price - symbolSubscriptions[symbolSubscriptionCount].lastBar = 0; - symbolSubscriptionCount++; - - mControl.mResetLastError(); - SymbolInfoString(symbol, SYMBOL_DESCRIPTION); - if (!CheckError(__FUNCTION__)) - ActionDoneOrError(ERR_SUCCESS, __FUNCTION__, "ERR_SUCCESS"); -} - -//+------------------------------------------------------------------+ -//| Account information | -//+------------------------------------------------------------------+ -void GetAccountInfo() -{ - - CJAVal info; - - info["error"] = false; - info["broker"] = AccountInfoString(ACCOUNT_COMPANY); - info["currency"] = AccountInfoString(ACCOUNT_CURRENCY); - info["server"] = AccountInfoString(ACCOUNT_SERVER); - info["trading_allowed"] = TerminalInfoInteger(TERMINAL_TRADE_ALLOWED); - info["bot_trading"] = AccountInfoInteger(ACCOUNT_TRADE_EXPERT); - info["balance"] = AccountInfoDouble(ACCOUNT_BALANCE); - info["equity"] = AccountInfoDouble(ACCOUNT_EQUITY); - info["margin"] = AccountInfoDouble(ACCOUNT_MARGIN); - info["margin_free"] = AccountInfoDouble(ACCOUNT_MARGIN_FREE); - info["margin_level"] = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL); - info["time"] = string(tm); // sendig time to ejtraderMT for localtime dataframe - - string t = info.Serialize(); - if (debug) - Print(t); - InformClientSocket(dataSocket, t); -} - -//+------------------------------------------------------------------+ -//| | -//+------------------------------------------------------------------+ -void GetEconomicCalendar(CJAVal &dataObject) -{ - string actionType = dataObject["actionType"].ToStr(); - - string symbol = dataObject["symbol"].ToStr(); - if (actionType == "DATA") - { - - CJAVal data, d; - - datetime fromDate = (datetime)dataObject["fromDate"].ToInt(); - datetime toDate = TimeCurrent(); - if (dataObject["toDate"].ToInt() != NULL) - toDate = (datetime)dataObject["toDate"].ToInt(); - - CALENDAR Calendar; - string Currencies[2]; - int Size; - - if (symbol == NULL) - { - Size = Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, TimeToString(fromDate, TIME_DATE), TimeToString(toDate, TIME_DATE)); - } - else - { - Currencies[0] = ::SymbolInfoString(symbol, SYMBOL_CURRENCY_BASE); - Currencies[1] = ::SymbolInfoString(symbol, SYMBOL_CURRENCY_PROFIT); - // Tomou eventos para todas as moedas (NULL) começando com a menor (NENHUM). - Size = Calendar.Set(Currencies, CALENDAR_IMPORTANCE_NONE, TimeToString(fromDate, TIME_DATE), TimeToString(toDate, TIME_DATE)); - } - - if (Size) - { - for (int i = 0; i < Size; i++) - { - string string_split = Calendar[i].ToString(); - - string sep = "|"; // A separator as a character - ushort u_sep; // The code of the separator character - string result[]; - u_sep = StringGetCharacter(sep, 0); - //--- Split the string to substrings - int k = StringSplit(string_split, u_sep, result); - for (int b = 0; b < k; b++) - { - - data[i][b] = result[b]; - } - } - d["data"].Set(data); - } - else - { - d["data"].Add(data); - } - Print("Finished preparing Calender data"); - - string t = d.Serialize(); - if (debug) - Print(t); - InformClientSocket(dataSocket, t); - } -} -//+------------------------------------------------------------------+ -//| Balance information | -//+------------------------------------------------------------------+ -void GetBalanceInfo() -{ - - CJAVal info; - info["balance"] = AccountInfoDouble(ACCOUNT_BALANCE); - info["equity"] = AccountInfoDouble(ACCOUNT_EQUITY); - info["margin"] = AccountInfoDouble(ACCOUNT_MARGIN); - info["margin_free"] = AccountInfoDouble(ACCOUNT_MARGIN_FREE); - - string t = info.Serialize(); - if (debug) - Print(t); - InformClientSocket(dataSocket, t); -} - -//+------------------------------------------------------------------+ -//| Push historical data to ZMQ socket | -//+------------------------------------------------------------------+ -bool PushHistoricalData(CJAVal &data) -{ - string t = data.Serialize(); - if (debug) - Print(t); - InformClientSocket(dataSocket, t); - return true; -} - -//+------------------------------------------------------------------+ -//| Convert chart timeframe from string to enum | -//+------------------------------------------------------------------+ -ENUM_TIMEFRAMES GetTimeframe(string chartTF) -{ - - ENUM_TIMEFRAMES tf; - tf = NULL; - - if (chartTF == "TICK") - tf = PERIOD_CURRENT; - - if (chartTF == "M1") - tf = PERIOD_M1; - - if (chartTF == "M5") - tf = PERIOD_M5; - - if (chartTF == "M15") - tf = PERIOD_M15; - - if (chartTF == "M30") - tf = PERIOD_M30; - - if (chartTF == "H1") - tf = PERIOD_H1; - - if (chartTF == "H2") - tf = PERIOD_H2; - - if (chartTF == "H3") - tf = PERIOD_H3; - - if (chartTF == "H4") - tf = PERIOD_H4; - - if (chartTF == "H6") - tf = PERIOD_H6; - - if (chartTF == "H8") - tf = PERIOD_H8; - - if (chartTF == "H12") - tf = PERIOD_H12; - - if (chartTF == "D1") - tf = PERIOD_D1; - - if (chartTF == "W1") - tf = PERIOD_W1; - - if (chartTF == "MN1") - tf = PERIOD_MN1; - - // if tf == NULL an error will be raised in config function - return (tf); -} - -//+------------------------------------------------------------------+ -//| Trade confirmation | -//+------------------------------------------------------------------+ -void OrderDoneOrError(bool error, string funcName, CTrade &trade) -{ - - CJAVal conf; - - conf["error"] = (bool)error; - conf["retcode"] = (int)trade.ResultRetcode(); - conf["desription"] = (string)GetRetcodeID(trade.ResultRetcode()); - // conf["deal"]=(int) trade.ResultDeal(); - conf["order"] = (int)trade.ResultOrder(); - conf["volume"] = (double)trade.ResultVolume(); - conf["price"] = (double)trade.ResultPrice(); - conf["bid"] = (double)trade.ResultBid(); - conf["ask"] = (double)trade.ResultAsk(); - conf["function"] = (string)funcName; - - string t = conf.Serialize(); - if (debug) - Print(t); - InformClientSocket(dataSocket, t); -} - -//+------------------------------------------------------------------+ -//| Error reporting | -//+------------------------------------------------------------------+ -bool CheckError(string funcName) -{ - int lastError = mControl.mGetLastError(); - if (lastError) - { - string desc = mControl.mGetDesc(); - if (debug) - Print("Error handling source: ", funcName, " description: ", desc); - Print("Error handling source: ", funcName, " description: ", desc); - mControl.Check(); - ActionDoneOrError(lastError, funcName, desc); - return true; - } - else - return false; -} - -//+------------------------------------------------------------------+ -//| Action confirmation | -//+------------------------------------------------------------------+ -void ActionDoneOrError(int lastError, string funcName, string desc) -{ - - CJAVal conf; - - conf["error"] = (bool)true; - if (lastError == 0) - conf["error"] = (bool)false; - - conf["lastError"] = (string)lastError; - conf["description"] = (string)desc; - conf["function"] = (string)funcName; - - string t = conf.Serialize(); - if (debug) - Print(t); - InformClientSocket(dataSocket, t); -} - -//+------------------------------------------------------------------+ -//| Inform Client via socket | -//+------------------------------------------------------------------+ -void InformClientSocket(Socket &workingSocket, string replyMessage) -{ - - // non-blocking - workingSocket.send(replyMessage, true); - // TODO: Array out of range error - mControl.mResetLastError(); - // mControl.Check(); -} - -//+------------------------------------------------------------------+ -//| Clear symbol subscriptions and indicators | -//+------------------------------------------------------------------+ -void ResetSubscriptionsAndIndicators() -{ - - ArrayFree(symbolSubscriptions); - symbolSubscriptionCount = 0; - - bool error = false; -#ifdef START_INDICATOR - for (int i = 0; i < indicatorCount; i++) - { - if (!IndicatorRelease(indicators[i].indicatorHandle)) - error = true; - } - ArrayFree(indicators); - indicatorCount = 0; -#endif -#ifdef CHART_CONTROL - for (int i = 0; i < chartWindowIndicatorCount; i++) - { - if (!IndicatorRelease(chartWindowIndicators[i].indicatorHandle)) - error = true; - } - ArrayFree(chartWindowIndicators); - chartWindowIndicatorCount = 0; - - for (int i = 0; i < ArraySize(chartWindows); i++) - { - // TODO check if chart exists first: if(ChartGetInteger... - // if(!IndicatorRelease(chartWindows[i].indicatorHandle)) error = true; - if (chartWindows[i].id != 0) - ChartClose(chartWindows[i].id); - } - ArrayFree(chartWindows); -#endif - - /* - if(ArraySize(symbolSubscriptions)!=0 || ArraySize(indicators)!=0 || ArraySize(chartWindows)!=0 || error){ - // Set to only Alert. Fails too often, this happens when i.e. the backtrader script gets aborted unexpectedly - mControl.Check(); - mControl.mSetUserError(65540, GetErrorID(65540)); - CheckError(__FUNCTION__); - } - */ - ActionDoneOrError(ERR_SUCCESS, __FUNCTION__, "ERR_SUCCESS"); -} - -//+------------------------------------------------------------------+ -//| Get retcode message by retcode id | -//+------------------------------------------------------------------+ -string GetRetcodeID(int retcode) -{ - - switch (retcode) - { - case 10004: - return ("TRADE_RETCODE_REQUOTE"); - break; - case 10006: - return ("TRADE_RETCODE_REJECT"); - break; - case 10007: - return ("TRADE_RETCODE_CANCEL"); - break; - case 10008: - return ("TRADE_RETCODE_PLACED"); - break; - case 10009: - return ("TRADE_RETCODE_DONE"); - break; - case 10010: - return ("TRADE_RETCODE_DONE_PARTIAL"); - break; - case 10011: - return ("TRADE_RETCODE_ERROR"); - break; - case 10012: - return ("TRADE_RETCODE_TIMEOUT"); - break; - case 10013: - return ("TRADE_RETCODE_INVALID"); - break; - case 10014: - return ("TRADE_RETCODE_INVALID_VOLUME"); - break; - case 10015: - return ("TRADE_RETCODE_INVALID_PRICE"); - break; - case 10016: - return ("TRADE_RETCODE_INVALID_STOPS"); - break; - case 10017: - return ("TRADE_RETCODE_TRADE_DISABLED"); - break; - case 10018: - return ("TRADE_RETCODE_MARKET_CLOSED"); - break; - case 10019: - return ("TRADE_RETCODE_NO_MONEY"); - break; - case 10020: - return ("TRADE_RETCODE_PRICE_CHANGED"); - break; - case 10021: - return ("TRADE_RETCODE_PRICE_OFF"); - break; - case 10022: - return ("TRADE_RETCODE_INVALID_EXPIRATION"); - break; - case 10023: - return ("TRADE_RETCODE_ORDER_CHANGED"); - break; - case 10024: - return ("TRADE_RETCODE_TOO_MANY_REQUESTS"); - break; - case 10025: - return ("TRADE_RETCODE_NO_CHANGES"); - break; - case 10026: - return ("TRADE_RETCODE_SERVER_DISABLES_AT"); - break; - case 10027: - return ("TRADE_RETCODE_CLIENT_DISABLES_AT"); - break; - case 10028: - return ("TRADE_RETCODE_LOCKED"); - break; - case 10029: - return ("TRADE_RETCODE_FROZEN"); - break; - case 10030: - return ("TRADE_RETCODE_INVALID_FILL"); - break; - case 10031: - return ("TRADE_RETCODE_CONNECTION"); - break; - case 10032: - return ("TRADE_RETCODE_ONLY_REAL"); - break; - case 10033: - return ("TRADE_RETCODE_LIMIT_ORDERS"); - break; - case 10034: - return ("TRADE_RETCODE_LIMIT_VOLUME"); - break; - case 10035: - return ("TRADE_RETCODE_INVALID_ORDER"); - break; - case 10036: - return ("TRADE_RETCODE_POSITION_CLOSED"); - break; - case 10038: - return ("TRADE_RETCODE_INVALID_CLOSE_VOLUME"); - break; - case 10039: - return ("TRADE_RETCODE_CLOSE_ORDER_EXIST"); - break; - case 10040: - return ("TRADE_RETCODE_LIMIT_POSITIONS"); - break; - case 10041: - return ("TRADE_RETCODE_REJECT_CANCEL"); - break; - case 10042: - return ("TRADE_RETCODE_LONG_ONLY"); - break; - case 10043: - return ("TRADE_RETCODE_SHORT_ONLY"); - break; - case 10044: - return ("TRADE_RETCODE_CLOSE_ONLY"); - break; - - default: - return ("TRADE_RETCODE_UNKNOWN=" + IntegerToString(retcode)); - break; - } -} - -//+------------------------------------------------------------------+ -//| Get error message by error id | -//+------------------------------------------------------------------+ -string GetErrorID(int error) -{ - - switch (error) - { - // Custom errors - case 65537: - return ("ERR_DESERIALIZATION"); - break; - case 65538: - return ("ERR_WRONG_ACTION"); - break; - case 65539: - return ("ERR_WRONG_ACTION_TYPE"); - break; - case 65540: - return ("ERR_CLEAR_SUBSCRIPTIONS_FAILED"); - break; - case 65541: - return ("ERR_RETRIEVE_DATA_FAILED"); - break; - case 65542: - return ("ERR_CVS_FILE_CREATION_FAILED"); - break; - - default: - return ("ERR_CODE_UNKNOWN=" + IntegerToString(error)); - break; - } -} - -//+------------------------------------------------------------------+ -//| Return a textual description of the deinitialization reason code | -//+------------------------------------------------------------------+ -string getUninitReasonText(int reasonCode) -{ - string text = ""; - //--- - switch (reasonCode) - { - case REASON_ACCOUNT: - text = "Account was changed"; - break; - case REASON_CHARTCHANGE: - text = "Symbol or timeframe was changed"; - break; - case REASON_CHARTCLOSE: - text = "Chart was closed"; - break; - case REASON_PARAMETERS: - text = "Input-parameter was changed"; - break; - case REASON_RECOMPILE: - text = "Program " + __FILE__ + " was recompiled"; - break; - case REASON_REMOVE: - text = "Program " + __FILE__ + " was removed from chart"; - break; - case REASON_TEMPLATE: - text = "New template was applied to chart"; - break; - default: - text = "Another reason"; - } - //--- - return text; -} -//+------------------------------------------------------------------+ - -//+------------------------------------------------------------------+ diff --git a/resources/example-file-send-script.mq4 b/resources/example-file-send-script.mq4 deleted file mode 100644 index a1d33a7..0000000 --- a/resources/example-file-send-script.mq4 +++ /dev/null @@ -1,136 +0,0 @@ -/* ################################################################### - -*SCRIPT*, not EA, which sends a file to the example socket server. - -The socket library has versions of ::Send() and ::Receive() which -take arrays as parameters, instead of strings, letting you send and -receive binary data. - -However... the issue then is that TCP/IP communication is not -message-based. The receiver/server needs some way of knowing when a -file has been completely received. In essence, what you have to do is -implement your own messaging protocol over the top of TCP/IP. -For example, you would send some sort of header meaning "I am about -to send a file"; then you would send the file size; and then you -would send the actual file data. The receiver/server then needs to -implement this protocol in reverse: look for the header; read the file -size; and keep storing up data until it has collected the expected -amount. - -In short: the string versions of ::Send() and ::Receive() provide -a simple built-in messaging protocol based around use of a terminator -such as \r\n. If you use the array versions of the functions, you then -have to implement the messaging protocol yourself. - -This script, and the corresponding functionality in the example server, -takes a different approach. - -The script does the following: - -* Reads a file -* ZIP-compresses the file (using built-in MQL CRYPT_ARCH_ZIP) -* Converts the data to a base64 string (using CRYPT_BASE64) -* Adds a header (FILE:) to the message -* Sends the file data as a string, not as an array, making use of - the \r\n terminator to tell the server that a complete message - has been received. - -The server then reverses this process, looking for the FILE: header, -and converting the received data from base64 and then unzipping it. - -This process is relatively inefficient: - -* base64 data is one-third larger than sending the raw data would be -* It involves conversions to strings, and string concatenation, which - could be avoided by sending binary data - -But, crucially, this method is simple, and is also more than acceptably -fast with any amount of binary data which you are likely to need -to send in real life. - -################################################################### */ - - -#property strict - -#ifdef __MQL5__ -#property script_show_inputs -#else -#property show_inputs -#endif - -// -------------------------------------------------------------------- -// Include socket library -// -------------------------------------------------------------------- - -#include - - -// -------------------------------------------------------------------- -// Script user inputs -// -------------------------------------------------------------------- - -input string Hostname = "localhost"; // Server hostname or IP address -input ushort ServerPort = 23456; // Server port -input string FileToSend = "send.dat"; // File to send (in MQLx\Files directory) - -// -------------------------------------------------------------------- -// Tick handling - set up a connection, if none already active, -// and send the current price quote -// -------------------------------------------------------------------- - -void OnStart() -{ - ClientSocket * socket = new ClientSocket(Hostname, ServerPort); - if (socket.IsSocketConnected()) { - Print("Client connection succeeded"); - - // Open the file and read it - int f = FileOpen(FileToSend, FILE_BIN | FILE_READ); - if (f != INVALID_HANDLE) { - // Read and close the file - uchar arrFile[]; - FileReadArray(f, arrFile); - FileClose(f); - - // Zip-compress the file data - uchar arrZip[], dummyKey[]; - if (CryptEncode(CRYPT_ARCH_ZIP, arrFile, dummyKey, arrZip)) { - - // Convert to a base64 array - uchar arrBase64[]; - if (CryptEncode(CRYPT_BASE64, arrZip, dummyKey, arrBase64)) { - - // Convert the base64 array to a string - string strBase64 = CharArrayToString(arrBase64, 0, WHOLE_ARRAY); - - // Send a header, followed by the file data, followed by CRLF as a message terminator - socket.Send("FILE:"); - socket.Send(strBase64); - socket.Send("\r\n"); - - // Need to wait before terminating the socket - Print("Sent file data (" , StringLen(strBase64) , " bytes of base64 data)"); - - // Need to WAIT before destroying the socket, or else the data can be lost. - // The length of the required delay will depend on the environment - whether we're - // sending between sockets on the local computer, or whether we're doing a true - // network send - Sleep(5000); - - } else { - Print("Failed to convert zipped data to base64"); - } - } else { - Print("Failed to zip-encode file"); - } - - } else { - Print("Unable to open " + FileToSend + " file - does it exist?"); - } - } else { - Print("Client connection failed"); - } - delete socket; -} - diff --git a/resources/example-socket-client.mq4 b/resources/example-socket-client.mq4 deleted file mode 100644 index 814ff8f..0000000 --- a/resources/example-socket-client.mq4 +++ /dev/null @@ -1,90 +0,0 @@ -/* ################################################################### - -Example socket client. -Code can be used as both MQ4 and MQ5 (on both 32-bit and 64-bit MT5) - -Simply sends each new tick to the server, as a CRLF-terminated -message. The example server then writes these to its Experts log. - -################################################################### */ - - -#property strict - -// -------------------------------------------------------------------- -// Include socket library -// -------------------------------------------------------------------- - -#include - - -// -------------------------------------------------------------------- -// EA user inputs -// -------------------------------------------------------------------- - -input string Hostname = "localhost"; // Server hostname or IP address -input ushort ServerPort = 23456; // Server port - - -// -------------------------------------------------------------------- -// Global variables and constants -// -------------------------------------------------------------------- - -ClientSocket * glbClientSocket = NULL; - -// -------------------------------------------------------------------- -// Initialisation (no action required) -// -------------------------------------------------------------------- - -void OnInit() {} - - -// -------------------------------------------------------------------- -// Termination - free the client socket, if created -// -------------------------------------------------------------------- - -void OnDeinit(const int reason) -{ - if (glbClientSocket) { - delete glbClientSocket; - glbClientSocket = NULL; - } -} - - -// -------------------------------------------------------------------- -// Tick handling - set up a connection, if none already active, -// and send the current price quote -// -------------------------------------------------------------------- - -void OnTick() -{ - if (!glbClientSocket) { - glbClientSocket = new ClientSocket(Hostname, ServerPort); - if (glbClientSocket.IsSocketConnected()) { - Print("Client connection succeeded"); - } else { - Print("Client connection failed"); - } - } - - if (glbClientSocket.IsSocketConnected()) { - // Send the current price as a CRLF-terminated message - string strMsg = Symbol() + "," + DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_BID), 6) + "," + DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_ASK), 6) + "\r\n"; - glbClientSocket.Send(strMsg); - - } else { - // Either the connection above failed, or the socket has been closed since an earlier - // connection. We handle this in the next block of code... - } - - // If the socket is closed, destroy it, and attempt a new connection - // on the next call to OnTick() - if (!glbClientSocket.IsSocketConnected()) { - // Destroy the server socket. A new connection - // will be attempted on the next tick - Print("Client disconnected. Will retry."); - delete glbClientSocket; - glbClientSocket = NULL; - } -} \ No newline at end of file diff --git a/resources/example-socket-server.mq4 b/resources/example-socket-server.mq4 deleted file mode 100644 index 5d26c7d..0000000 --- a/resources/example-socket-server.mq4 +++ /dev/null @@ -1,294 +0,0 @@ -/* ################################################################### - -Example socket server. -Code can be used as both MQ4 and MQ5 (on both 32-bit and 64-bit MT5) - -Receives messages from the example client and simply writes them -to the Experts log. - -Also contains functionality for handling files sent by the example -file-sender script. - -In addition, you can telnet into the server's port. Any CRLF-terminated -message you type is similarly printed to the Experts log. You -can also type in the commands "quote", to which the server reponds -with the current price of its chart, or "close", which causes the -server to shut down the connection. - -As well as demonstrating server functionality, the use of Receive() -and the event-driven handling are also applicable to a client -which needs to receive data from the server as well as just sending it. - -################################################################### */ - - -#property strict - -// -------------------------------------------------------------------- -// Include socket library, asking for event handling -// -------------------------------------------------------------------- - -#define SOCKET_LIBRARY_USE_EVENTS -#include - -// -------------------------------------------------------------------- -// EA user inputs -// -------------------------------------------------------------------- - -input ushort ServerPort = 23456; // Server port - - -// -------------------------------------------------------------------- -// Global variables and constants -// -------------------------------------------------------------------- - -// Frequency for EventSetMillisecondTimer(). Doesn't need to -// be very frequent, because it is just a back-up for the -// event-driven handling in OnChartEvent() -#define TIMER_FREQUENCY_MS 1000 - -// Server socket -ServerSocket * glbServerSocket = NULL; - -// Array of current clients -ClientSocket * glbClients[]; - -// Watch for need to create timer; -bool glbCreatedTimer = false; - - -// -------------------------------------------------------------------- -// Initialisation - set up server socket -// -------------------------------------------------------------------- - -void OnInit() -{ - // If the EA is being reloaded, e.g. because of change of timeframe, - // then we may already have done all the setup. See the - // termination code in OnDeinit. - if (glbServerSocket) { - Print("Reloading EA with existing server socket"); - } else { - // Create the server socket - glbServerSocket = new ServerSocket(ServerPort, false); - if (glbServerSocket.Created()) { - Print("Server socket created"); - - // Note: this can fail if MT4/5 starts up - // with the EA already attached to a chart. Therefore, - // we repeat in OnTick() - glbCreatedTimer = EventSetMillisecondTimer(TIMER_FREQUENCY_MS); - } else { - Print("Server socket FAILED - is the port already in use?"); - } - } -} - - -// -------------------------------------------------------------------- -// Termination - free server socket and any clients -// -------------------------------------------------------------------- - -void OnDeinit(const int reason) -{ - switch (reason) { - case REASON_CHARTCHANGE: - // Keep the server socket and all its clients if - // the EA is going to be reloaded because of a - // change to chart symbol or timeframe - break; - - default: - // For any other unload of the EA, delete the - // server socket and all the clients - glbCreatedTimer = false; - - // Delete all clients currently connected - for (int i = 0; i < ArraySize(glbClients); i++) { - delete glbClients[i]; - } - ArrayResize(glbClients, 0); - - // Free the server socket. *VERY* important, or else - // the port number remains in use and un-reusable until - // MT4/5 is shut down - delete glbServerSocket; - glbServerSocket = NULL; - Print("Server socket terminated"); - break; - } -} - - -// -------------------------------------------------------------------- -// Timer - accept new connections, and handle incoming data from clients. -// Secondary to the event-driven handling via OnChartEvent(). Most -// socket events should be picked up faster through OnChartEvent() -// rather than being first detected in OnTimer() -// -------------------------------------------------------------------- - -void OnTimer() -{ - // Accept any new pending connections - AcceptNewConnections(); - - // Process any incoming data on each client socket, - // bearing in mind that HandleSocketIncomingData() - // can delete sockets and reduce the size of the array - // if a socket has been closed - - for (int i = ArraySize(glbClients) - 1; i >= 0; i--) { - HandleSocketIncomingData(i); - } -} - - -// -------------------------------------------------------------------- -// Accepts new connections on the server socket, creating new -// entries in the glbClients[] array -// -------------------------------------------------------------------- - -void AcceptNewConnections() -{ - // Keep accepting any pending connections until Accept() returns NULL - ClientSocket * pNewClient = NULL; - do { - pNewClient = glbServerSocket.Accept(); - if (pNewClient != NULL) { - int sz = ArraySize(glbClients); - ArrayResize(glbClients, sz + 1); - glbClients[sz] = pNewClient; - Print("New client connection"); - - pNewClient.Send("Hello\r\n"); - } - - } while (pNewClient != NULL); -} - - -// -------------------------------------------------------------------- -// Handles any new incoming data on a client socket, identified -// by its index within the glbClients[] array. This function -// deletes the ClientSocket object, and restructures the array, -// if the socket has been closed by the client -// -------------------------------------------------------------------- - -void HandleSocketIncomingData(int idxClient) -{ - ClientSocket * pClient = glbClients[idxClient]; - - // Keep reading CRLF-terminated lines of input from the client - // until we run out of new data - bool bForceClose = false; // Client has sent a "close" message - string strCommand; - do { - strCommand = pClient.Receive("\r\n"); - if (strCommand == "quote") { - pClient.Send(Symbol() + "," + DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_BID), 6) + "," + DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_ASK), 6) + "\r\n"); - - } else if (strCommand == "close") { - bForceClose = true; - - } else if (StringFind(strCommand, "FILE:") == 0) { - // ** See the example file-send script... ** - - // Extract the base64 file data - the message minus the FILE: header - and - // put it into an array - string strFileData = StringSubstr(strCommand, 5); - uchar arrBase64[]; - StringToCharArray(strFileData, arrBase64, 0, StringLen(strFileData)); - - // Do base64 decoding on the data, converting it to the zipped data - uchar arrZipped[], dummyKey[]; - if (CryptDecode(CRYPT_BASE64, arrBase64, dummyKey, arrZipped)) { - - // Unzip the data - uchar arrOriginal[]; - if (CryptDecode(CRYPT_ARCH_ZIP, arrZipped, dummyKey, arrOriginal)) { - // Okay, we should now have the raw file - int f = FileOpen("receive.dat", FILE_BIN | FILE_WRITE); - if (f == INVALID_HANDLE) { - Print("Unable to open receive.dat for writing"); - } else { - FileWriteArray(f, arrOriginal); - FileClose(f); - - Print("Created receive.dat file"); - } - } else { - Print("Unzipping of file data failed"); - } - } else { - Print("Decoding from base64 failed"); - } - - } else if (strCommand != "") { - // Potentially handle other commands etc here. - // For example purposes, we'll simply print messages to the Experts log - Print("<- ", strCommand); - } - } while (strCommand != ""); - - // If the socket has been closed, or the client has sent a close message, - // release the socket and shuffle the glbClients[] array - if (!pClient.IsSocketConnected() || bForceClose) { - Print("Client has disconnected"); - - // Client is dead. Destroy the object - delete pClient; - - // And remove from the array - int ctClients = ArraySize(glbClients); - for (int i = idxClient + 1; i < ctClients; i++) { - glbClients[i - 1] = glbClients[i]; - } - ctClients--; - ArrayResize(glbClients, ctClients); - } -} - - -// -------------------------------------------------------------------- -// Use OnTick() to watch for failure to create the timer in OnInit() -// -------------------------------------------------------------------- - -void OnTick() -{ - if (!glbCreatedTimer) glbCreatedTimer = EventSetMillisecondTimer(TIMER_FREQUENCY_MS); -} - -// -------------------------------------------------------------------- -// Event-driven functionality, turned on by #defining SOCKET_LIBRARY_USE_EVENTS -// before including the socket library. This generates dummy key-down -// messages when socket activity occurs, with lparam being the -// .GetSocketHandle() -// -------------------------------------------------------------------- - -void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam) -{ - if (id == CHARTEVENT_KEYDOWN) { - // If the lparam matches a .GetSocketHandle(), then it's a dummy - // key press indicating that there's socket activity. Otherwise, - // it's a real key press - - if (lparam == glbServerSocket.GetSocketHandle()) { - // Activity on server socket. Accept new connections - Print("New server socket event - incoming connection"); - AcceptNewConnections(); - - } else { - // Compare lparam to each client socket handle - for (int i = 0; i < ArraySize(glbClients); i++) { - if (lparam == glbClients[i].GetSocketHandle()) { - HandleSocketIncomingData(i); - return; // Early exit - } - } - - // If we get here, then the key press does not seem - // to match any socket, and appears to be a real - // key press event... - } - } -} diff --git a/resources/experiments/MTAutoLoginService/__pycache__/app_test.cpython-39-pytest-7.1.3.pyc b/resources/experiments/MTAutoLoginService/__pycache__/app_test.cpython-39-pytest-7.1.3.pyc deleted file mode 100644 index 6222b10..0000000 Binary files a/resources/experiments/MTAutoLoginService/__pycache__/app_test.cpython-39-pytest-7.1.3.pyc and /dev/null differ diff --git a/resources/experiments/MTAutoLoginService/__pycache__/app_test.cpython-39-pytest-7.4.2.pyc b/resources/experiments/MTAutoLoginService/__pycache__/app_test.cpython-39-pytest-7.4.2.pyc deleted file mode 100644 index 0152e84..0000000 Binary files a/resources/experiments/MTAutoLoginService/__pycache__/app_test.cpython-39-pytest-7.4.2.pyc and /dev/null differ diff --git a/resources/experiments/MTAutoLoginService/app_test.py b/resources/experiments/MTAutoLoginService/app_test.py deleted file mode 100644 index 9bddc5b..0000000 --- a/resources/experiments/MTAutoLoginService/app_test.py +++ /dev/null @@ -1,148 +0,0 @@ -import pymt5adapter as mt5 -import logging -import json -import re -import asyncio -from investor.meta_trader import TradingManager -from collectors.metatrader_collector import Rates, Symbols, AccountInfo, BaseCollector, Order -from common.app_base_template import AppBaseTemplate -# import pytz -# -# from common import config -# from collectors import telegram - - -class App(AppBaseTemplate): - def __init__(self): - self.logger = mt5.get_logger(path_to_logfile='mt5_log.log', - loglevel=logging.INFO, time_utc=True) - self.mt5_connected = mt5.connected( - path=r'C:/Program Files/MetaTrader 5/terminal64.exe', - # path=r'/home/seekersoftec/Documents/Tech/Fortesense Labs/Financial_Eng/Financial Markets/lab/Metatrader5-Docker/Metatrader/terminal64.exe', - portable=True, - server='Deriv-Demo', - login=21193089, # financial => 21193089 | synthetic => 21085818 - password='@Ssc21707232', - timeout=5000, - logger=self.logger, # default is None - ensure_trade_enabled=True, # default is False - enable_real_trading=False, # default is False - raise_on_errors=True, # default is False - return_as_dict=False, # default is False - return_as_native_python_objects=False, # default is False - ) - - def data_provider_problems_exist(self): - if App.error_status != 0: - return True - if App.server_status != 0: - return True - return False - - def problems_exist(self): - if App.error_status != 0: - return True - if App.server_status != 0: - return True - if App.account_status != 0: - return True - if App.trade_state_status != 0: - return True - return False - - def load_config(self, config_file): - if config_file: - # config_file_path = PACKAGE_ROOT / config_file - config_file_path = config_file - with open(config_file_path, encoding='utf-8') as json_file: - # conf_str = json.load(json_file) - conf_str = json_file.read() - - # Remove everything starting with // and till the line end - conf_str = re.sub(r"//.*$", "", conf_str, flags=re.M) - - conf_json = json.loads(conf_str) - App.config.update(conf_json) - - def start(self): - """ - Start App - """ - with self.mt5_connected as conn: - try: - # Display data on the MetaTrader 5 package - print("MetaTrader5 package author: ", mt5.__author__) - print("MetaTrader5 package version: ", mt5.__version__) - # - # symbols_obj = Symbols(mt5) - # sym_name = "BTCUSD" # "Crash 1000 Index", "EURUSD" - # sym_info = symbols_obj.get_symbol_info(sym_name) - # print(sym_info) - # if sym_info != None: - # rates = Rates(mt5) - # print(symbols_obj.get_symbol_info_tick(sym_name)) - # print(rates.get_rates(symbol_pair=sym_name)) - - # - # print(AccountInfo(mt5).get_account_info()) - # print(AccountInfo(mt5).get_terminal_info()) - # print(Order(mt5).calc_order_margin()) - # print(Order(mt5).calc_order_profit()) - # print(Order(mt5).get_orders_history(group='*GBP*')) - # print(Order(mt5).get_deals_history()) - # - # TradingManager() - # asyncio.run() - # asyncio.create_task() - trading_manager = TradingManager(mt5) - trading_manager.main_task() - # asyncio.create_task(trading_manager.main_task()) - # loop = asyncio.get_event_loop() - # loop.run_forever() - # asyncio.run(trading_manager.main_task()) - # loop = asyncio.get_event_loop() - # loop.create_task(trading_manager.main_task()) - # try: - # loop.run_forever() # Blocking. Run until stop() is called - # except KeyboardInterrupt: - # print(f"KeyboardInterrupt.") - - except mt5.MT5Error as e: - print(f"Error = {e}") - - return None - - -App().start() - - -# -# TODO: Work on symbol pairs with less than 0.01 points like Crash 1000 Index, BTCUSD -# Error => INVALID_STOPS -# cannot process or correctly calculate the stop_loss -# https://www.mql5.com/en/forum/285056 -# https://www.mql5.com/en/forum/348327 -# https://www.forexfactory.com/thread/557391-invalid-stops-when-placing-an-order -# https://support.axi.com/hc/en-us/articles/4403609910041-What-is-an-Invalid-Stop-Loss-SL-or-Take-Profit-TP- -# -# MetaTrader5 package author: {'pymt5adapter': 'nicholishen', 'MetaTrader5': 'MetaQuotes Ltd.'} -# MetaTrader5 package version: {'pymt5adapter': '0.4.4', 'MetaTrader5': '5.0.43'} -# Error = FAIL: Terminal: Call failed -# -# .py", line 137, in __enter__ -# pymt5adapter.core.MT5Error: INTERNAL_FAIL_TIMEOUT: IPC timeout -# -# -# https://app.metaapi.cloud/accounts/add -# https://github.com/agiliumtrade-ai -# https://www.schwab.com/learn/story/3-order-types-market-limit-and-stop-orders -# https://www.mql5.com/en/docs/integration/python_metatrader5/mt5positionsget_py -# https://github.com/nicholishen/pymt5adapter -# -# -# Error = INVALID_PARAMS: Invalid "sl" argument({'action': 1, 'volume': 0.5, 'type': 0, 'price': 1248.93554, 'sl': 1248, 'tp': None, 'deviation': 5, 'magic': 234000, 'comment': 'python script open'},){} -# -# -# Solution to StopLoss => price + 5 -# -# diff --git a/resources/experiments/MTAutoLoginService/requirements.txt b/resources/experiments/MTAutoLoginService/requirements.txt deleted file mode 100644 index 1b53311..0000000 --- a/resources/experiments/MTAutoLoginService/requirements.txt +++ /dev/null @@ -1,32 +0,0 @@ -numpy>=1.23.* -pandas>=1.4.* - -pytz -click -textblob -apscheduler -MetaTrader5 -telegram_messages_dump - -numpy>=1.23.* -pandas>=1.4.* -scikit-learn>=1.* -statsmodels>=0.13.* -patsy>=0.5.* -apscheduler>=3.9.* # "conda install -c conda-forge apscheduler" - -lightgbm>=3.3.* # For Linux, glibc >= 2.14 is required. "conda install -c conda-forge lightgbm" -tensorflow>=2.9.* # pip install --upgrade tensorflow -#keras # pip install --upgrade keras -#pytorch # conda install pytorch torchvision cpuonly -c pytorch -#fastai # pip install fastai -tsfresh # For calculated features - -# python-binance>=1.0.* # pip install python-binance -# yfinance # if yahoo quotes are going to be used -#python-snappy # Compression for fastparquet (gzip is always available) -#fastparquet # "conda install -c conda-forge fastparquet" - -# ejtraderMT -# mindsdb -git+https://github.com/FortesenseLabs/pymt5adapter.git diff --git a/resources/experiments/MTAutoLoginService/run.bat b/resources/experiments/MTAutoLoginService/run.bat deleted file mode 100644 index 9fc1ede..0000000 --- a/resources/experiments/MTAutoLoginService/run.bat +++ /dev/null @@ -1,2 +0,0 @@ - -python src/app.py diff --git a/resources/experiments/MTAutoLoginService/run.sh b/resources/experiments/MTAutoLoginService/run.sh deleted file mode 100644 index 8b2897e..0000000 --- a/resources/experiments/MTAutoLoginService/run.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -WINEPREFIX=~/.mt5 wine CMD /C run.bat \ No newline at end of file diff --git a/resources/experiments/dump.zip b/resources/experiments/dump.zip deleted file mode 100644 index 1d5e887..0000000 Binary files a/resources/experiments/dump.zip and /dev/null differ diff --git a/resources/experiments/ejtrader/docker-compose.yml b/resources/experiments/ejtrader/docker-compose.yml deleted file mode 100755 index 8add93d..0000000 --- a/resources/experiments/ejtrader/docker-compose.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: '3.8' -services: - app: - container_name: metatrader - image: ejtrader/metatrader:5 - restart: unless-stopped - ports: - - '5900:5900' - - '15555:15555' - - '15556:15556' - - '15557:15557' - - '15558:15558' - volumes: - - ejtraderMT:/data - - -volumes: - ejtraderMT: {} diff --git a/resources/experiments/ejtrader/script.py b/resources/experiments/ejtrader/script.py deleted file mode 100644 index 50f7232..0000000 --- a/resources/experiments/ejtrader/script.py +++ /dev/null @@ -1,23 +0,0 @@ -from ejtraderMT import Metatrader - -''' -to change the host IP example Metatrader("192.168.1.100") ou -you can use doman example "metatraderserverdomain.com" - -for you local time on the Dataframe Metatrader(tz_local=True) -attention utc time is the default for Dataframe index "date" - - -for real volume for active like WIN futures ou centralized market use Metatrader(real_volume=True) -attention tick volume is the default - - -to use more than one option just use , example Metatrader(host='hostIP',tz_local=True) -''' -api = Metatrader(debug=True) - - -accountInfo = api.accountInfo() -print(accountInfo) -print(accountInfo['broker']) -print(accountInfo['balance']) diff --git a/resources/experiments/jimtin.zip b/resources/experiments/jimtin.zip deleted file mode 100644 index 4c5b3b9..0000000 Binary files a/resources/experiments/jimtin.zip and /dev/null differ diff --git a/resources/experiments/kecoma1.zip b/resources/experiments/kecoma1.zip deleted file mode 100644 index 0f9172a..0000000 Binary files a/resources/experiments/kecoma1.zip and /dev/null differ diff --git a/resources/experiments/metaraider-sst-bot.zip b/resources/experiments/metaraider-sst-bot.zip deleted file mode 100644 index a3f9afd..0000000 Binary files a/resources/experiments/metaraider-sst-bot.zip and /dev/null differ diff --git a/resources/experiments/mt-socket-server-rs.zip b/resources/experiments/mt-socket-server-rs.zip deleted file mode 100644 index fe8ec9f..0000000 Binary files a/resources/experiments/mt-socket-server-rs.zip and /dev/null differ diff --git a/resources/experiments/notebooks/README.md b/resources/experiments/notebooks/README.md deleted file mode 100755 index 0829c1f..0000000 --- a/resources/experiments/notebooks/README.md +++ /dev/null @@ -1,7 +0,0 @@ - -https://www.youtube.com/@PythonParseltongue/playlists - -https://www.youtube.com/user/sentdex - -[check the comments] -https://www.youtube.com/watch?v=ZNA2BpssnhM&list=PLFYcVF7huJR_v-uaYPJFs5xttdi19f2OO diff --git a/resources/experiments/notebooks/calculate_final_amount.py b/resources/experiments/notebooks/calculate_final_amount.py deleted file mode 100644 index 02759a6..0000000 --- a/resources/experiments/notebooks/calculate_final_amount.py +++ /dev/null @@ -1,15 +0,0 @@ -def calculate_final_amount(starting_amount, profit_rate, num_days): - principal = starting_amount - - for _ in range(num_days): - principal += principal * profit_rate - - return principal - - -starting_amount = 10.0 # Initial principal amount -profit_rate = 0.1 # 10% profit rate per day -num_days = 30 - -final_amount = calculate_final_amount(starting_amount, profit_rate, num_days) -print(f"The final amount after {num_days} days is: ${final_amount:.2f}") diff --git a/resources/experiments/notebooks/deshanais_model[regression].ipynb b/resources/experiments/notebooks/deshanais_model[regression].ipynb deleted file mode 100644 index 2720d47..0000000 --- a/resources/experiments/notebooks/deshanais_model[regression].ipynb +++ /dev/null @@ -1,11524 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "source": [ - "## Set Directory and Global Variables" - ], - "metadata": { - "id": "bzAcOkfNDMnj" - }, - "id": "bzAcOkfNDMnj" - }, - { - "cell_type": "code", - "source": [ - "from google.colab import drive\n", - "\n", - "drive.mount('/content/drive')\n" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "2pfBV5twfOWi", - "outputId": "fe67fb3b-2b10-4748-ca8a-fc88fc1b4023" - }, - "id": "2pfBV5twfOWi", - "execution_count": 389, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "APPLY_SMOTE = True\n", - "# \n", - "FILE_NAME = 'desharnais' # desharnais, maxwell\n", - "TARGET = 'Effort' # Effort, effort_D\n", - "# \n", - "BASE_DIR = '/content/drive/MyDrive/Seekersoftec/Mrs. Ophori-wares'\n", - "# BASE_DIR = '/content/drive/MyDrive/data'\n", - "# \n", - "PROCESSED_DATA_DIR = f'{BASE_DIR}/regression/processed_data'\n", - "# \n", - "if APPLY_SMOTE:\n", - " REPORTS_DIR = f'{BASE_DIR}/Reports/{FILE_NAME}/SMOTE'\n", - "else:\n", - " REPORTS_DIR = f'{BASE_DIR}/Reports/{FILE_NAME}/NON-SMOTE'\n", - "# " - ], - "metadata": { - "id": "_c9G3cmbfO-u" - }, - "id": "_c9G3cmbfO-u", - "execution_count": 390, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## Import Libraries" - ], - "metadata": { - "id": "T1clsI6eDHX6" - }, - "id": "T1clsI6eDHX6" - }, - { - "cell_type": "code", - "execution_count": 391, - "id": "aa8bb6ce-3d8f-45de-b23b-4f81012f8f02", - "metadata": { - "id": "aa8bb6ce-3d8f-45de-b23b-4f81012f8f02" - }, - "outputs": [], - "source": [ - "import time\n", - "import math\n", - "import csv\n", - "import pprint\n", - "import statistics\n", - "import pandas as pd\n", - "import numpy as np\n", - "import seaborn as sns\n", - "# \n", - "from math import sqrt\n", - "from tabulate import tabulate\n", - "from collections import Counter\n", - "from typing import List, Dict\n", - "# \n", - "from sklearn.impute import SimpleImputer\n", - "from sklearn.compose import make_column_transformer\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.linear_model import Lasso\n", - "from sklearn.model_selection import GridSearchCV, train_test_split, cross_val_score\n", - "from sklearn.neighbors import KNeighborsRegressor\n", - "from sklearn.ensemble import StackingRegressor\n", - "from sklearn.feature_selection import mutual_info_regression\n", - "from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score, explained_variance_score, mutual_info_score\n", - "from sklearn.cluster import KMeans\n", - "from sklearn.decomposition import PCA\n", - "# \n", - "from scipy.spatial.distance import cdist\n", - "from statistics import mean\n", - "from scipy.stats import entropy, spearmanr\n", - "# \n", - "import matplotlib.pyplot as plt\n", - "import matplotlib.pyplot as plt2\n", - "import matplotlib.pyplot as plt3\n", - "import matplotlib.pyplot as plt4\n", - "# \n", - "from sys import exit\n", - "import pickle\n", - "import urllib.parse\n", - "from copy import deepcopy\n", - "# \n", - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "id": "bd89bf6b-02f4-4fb5-a2fe-7418bae52277", - "metadata": { - "id": "bd89bf6b-02f4-4fb5-a2fe-7418bae52277" - }, - "source": [ - "## Load Dataset (Desharnias or Maxwell Dataset )" - ] - }, - { - "cell_type": "code", - "execution_count": 392, - "id": "c4c49174-126d-48fb-8b0c-6378945f36d7", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 270 - }, - "id": "c4c49174-126d-48fb-8b0c-6378945f36d7", - "outputId": "efc3fd78-cdee-49d2-e650-07077a400ec5" - }, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " TeamExp ManagerExp YearEnd Length Transactions Entities \\\n", - "0 -0.476567 0.814748 1.113045 -0.191518 0.289939 0.220432 \n", - "1 -0.448589 0.821123 1.176508 -0.164314 0.326901 0.225939 \n", - "2 -0.519772 0.830033 1.133635 -0.203787 0.298802 0.236487 \n", - "3 -0.463610 0.827532 1.134378 -0.203913 0.303049 0.210776 \n", - "4 -0.475002 0.843365 1.150256 -0.181917 0.321613 0.212459 \n", - "\n", - " PointsAdjust Envergure PointsNonAjust Language Effort \n", - "0 0.343285 0.232378 0.312488 0.839032 11328.384606 \n", - "1 0.344462 0.269884 0.342697 0.817223 11372.068227 \n", - "2 0.341432 0.259340 0.338931 0.857712 11391.238532 \n", - "3 0.329431 0.267707 0.311001 0.805868 11434.035097 \n", - "4 0.304483 0.234532 0.335723 0.829760 11393.193024 " - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TeamExpManagerExpYearEndLengthTransactionsEntitiesPointsAdjustEnvergurePointsNonAjustLanguageEffort
0-0.4765670.8147481.113045-0.1915180.2899390.2204320.3432850.2323780.3124880.83903211328.384606
1-0.4485890.8211231.176508-0.1643140.3269010.2259390.3444620.2698840.3426970.81722311372.068227
2-0.5197720.8300331.133635-0.2037870.2988020.2364870.3414320.2593400.3389310.85771211391.238532
3-0.4636100.8275321.134378-0.2039130.3030490.2107760.3294310.2677070.3110010.80586811434.035097
4-0.4750020.8433651.150256-0.1819170.3216130.2124590.3044830.2345320.3357230.82976011393.193024
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 392 - } - ], - "source": [ - "if APPLY_SMOTE:\n", - " data = pd.read_csv(f'{PROCESSED_DATA_DIR}/{FILE_NAME}_processed_SMOTE.csv').drop(['Unnamed: 0'], axis=1)\n", - "else:\n", - " data = pd.read_csv(f'{PROCESSED_DATA_DIR}/{FILE_NAME}_processed.csv').drop(['Unnamed: 0'], axis=1)\n", - "# \n", - "data.head(5)\n", - "# " - ] - }, - { - "cell_type": "code", - "source": [ - "# Check for nan/null values\n", - "data.isna().sum().sum(), data.isnull().sum().sum()" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "jFzRhr6XKfZf", - "outputId": "6e78873b-2998-4a34-cb14-4741e0bd6440" - }, - "id": "jFzRhr6XKfZf", - "execution_count": 393, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "(0, 0)" - ] - }, - "metadata": {}, - "execution_count": 393 - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Data Test" - ], - "metadata": { - "id": "jCv-TzX1Uz8q" - }, - "id": "jCv-TzX1Uz8q" - }, - { - "cell_type": "code", - "source": [ - "\"\"\"\n", - "Correlation is a statistical measure that indicates how closely two variables are related to each other. In the context of a dataset, correlation can be used to measure the relationship between two features or between a feature and the target variable.\n", - "\n", - "The correlation coefficient is a value that ranges from -1 to 1, where a value of 1 indicates a perfect positive correlation, a value of -1 indicates a perfect negative correlation, and a value of 0 indicates no correlation. A positive correlation means that as one variable increases, the other variable also tends to increase, while a negative correlation means that as one variable increases, the other variable tends to decrease.\n", - "\n", - "Correlation can be used to identify patterns and relationships in the data and to help understand the underlying structure of the dataset. It can also be used for feature selection, where features with a high correlation to the target variable are selected for the prediction task.\n", - "\n", - "However, it is important to note that correlation does not necessarily imply causation. Just because two variables are correlated does not mean that one variable causes the other. Correlation only measures the strength and direction of the relationship between two variables and does not imply any causal relationship. It is important to perform further analysis and experimentation to determine the cause-and-effect relationship between variables.\n", - "\"\"\"\n", - "\n", - "def correlation(df: pd.DataFrame):\n", - " # Compute the correlation matrix\n", - " corr = data.corr()\n", - "\n", - " # Set the plot size\n", - " plt.figure(figsize=(10,8))\n", - "\n", - " # Plot the correlation heatmap\n", - " sns.heatmap(corr, cmap='coolwarm', annot=True)\n", - "\n", - " # Show the plot\n", - " plt.show()\n", - "# \n", - "correlation(data)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 786 - }, - "id": "XklwbLDntCA_", - "outputId": "fd138a95-7721-4705-d16b-f68feb81327a" - }, - "id": "XklwbLDntCA_", - "execution_count": 394, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3cAAAMBCAYAAABMSE3KAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3wT5R/A8U+SJt2b1QF0QctsAdlT9gbHT0BlKAgoIgIO3OIWEFGcqIggIm7Ze++9oYyyoXvPpEl+f6RNCemEptX6fb9evLTP3XP3XO5yue89S2E0Go0IIYQQQgghhPhXU1Z2AYQQQgghhBBC3D0J7oQQQgghhBCiCpDgTgghhBBCCCGqAAnuhBBCCCGEEKIKkOBOCCGEEEIIIaoACe6EEEIIIYQQogqQ4E4IIYQQQgghqgAJ7oQQQgghhBCiCpDgTgghhBBCCCGqAAnuhBBCCCGEEOI2ly9f5vXXX2fQoEE0bNiQ/v37lyqf0Whk3rx5dOnShaZNmzJkyBCOHDli28LmkeBOCCGEEEIIIW5z7tw5tm7dSt26dQkODi51vm+++YZPP/2UUaNG8fXXX1O9enUef/xxrl69asPSmiiMRqPR5nsRQgghhBBCiH8Rg8GAUmmqC5s2bRonTpxgxYoVxebJycmhXbt2PPLII0yZMgUArVZL79696dSpE2+++aZNyyw1d0IIIYQQQghxm/zAriwOHTpEeno6ffr0MadpNBp69OjBtm3byrN4hbKz+R6EEEIIIYQQohJ069at2OUbN24s1/1FRUUBEBQUZJEeHBzMDz/8QHZ2Ng4ODuW6z1tJcCdKZaU6tLKLYFPtDsyr7CLY3JBZbpVdBJv68SV9ZRfBpqKU9Sq7CDZXR3G5sotgU9l2zpVdBJuqnhhZ2UWwuWznapVdBJsa+lZll8C2/poSV9lFsDnXVv0quwhFqrRnyU7+Fbq71NRUNBoN9vb2Fulubm4YjUZSUlIkuBNCCCGEEEKIsirvmrl/OulzJ4QQQgghhBDlwM3NDa1WS05OjkV6amoqCoUCd3d3m+5fau6EEEIIIYQQNqVQKyq7CBUiv6/dxYsXCQsLM6dHRUXh6+tr0yaZIDV3QgghhBBCCFEumjdvjouLC6tXrzan6XQ61q1bR6dOnWy+f6m5E0IIIYQQQtiU0u7fV3OXlZXF1q1bAbh+/Trp6emsWbMGgFatWuHl5cXIkSO5ceMG69evB8De3p5x48Yxd+5cvLy8qF+/PkuWLCE5OZnRo0fbvMwS3AkhhBBCCCHEbRISEpg0aZJFWv7fCxcupHXr1hgMBvR6yxG7n3jiCYxGI/PnzycxMZEGDRrw3XffUbt2bZuXWYI7IYQQQgghhE0p1P++3mD+/v5ERhY/zcuiRYus0hQKBePGjWPcuHG2KlqR/n2fshBCCCGEEEIIKxLcCSGEEEIIIUQVIM0yhRBCCCGEEDb1bxxQ5d9Iau6EEEIIIYQQogqQmjshhBBCCCGETf1XJjGvbFJzJ4QQQgghhBBVgAR3QgghhBBCCFEFSLNMIYQQQgghhE3JgCoVQ2ruhBBCCCGEEKIKkJo7IYQQQgghhE3JgCoVQ2ruhBBCCCGEEKIKkJo7IYQQQgghhE1Jn7uKITV3QgghhBBCCFEFSM2d+MdQOTsRNHU0Hq3C8WjZBI2XB0dHT+Pawj8ru2hWtDod85YuY832PaSlZxJc149xQwfTumnDMm1n4tsfs//4aR7s1YXnRj9sTl+xZRfvfLGgyHxvThxN746t77T4d83ZScUTQ31p18IdB3slZy5kMu+n65y/nFVsPoUCunfwosM9HoTUdcTVRUV0nJYte5L4dVUsOp2xgo7AdA6/W/Iba7fsIC0jg+C6dXji4f/RMqJJmbYz+c33OXD0BPf36cHksaOKXO/YqUgmvPIWAMt/+AoPN9e7KX6JdDotf/z0Nbs2ryYjI43adUN44NHxNI4o/ro5sHsze7ev5+L5U6QkJeBVrSYRLTsw8KHROLtYllmrzWHtsiXs2rya+NgbOLm4US+sCYOHPYF/nWBbHp5p/zod3y9eyvot20hLTycooC6jHxnKPc3Cy7Sd5157i4NHjzO4by8mjR9jTo+Ni2f1hs3sOXCQazeiUSqVBNatzfCHHqBFRNPyPhwrWp2ORYsWsWnTJtLT0wkMCGDEiBE0b9682Hw7d+1i1apVXLp0idTUVNzd3QkLC+PRRx4hICDAch9aLX/++ScbN20iNjYWFxcXGjRowKOPPELdunVteHRF0+py+er31azacYC0jCxC6vjw5IN9adMktNh8X/++hm/+XGuVrlHbsev7mbYqbrG0Oh3fLvmdtVt25t1najP24QfLfJ959s0POHD0JPf36c6UsSOLXO/oqUgmvPIOACt++MLm95lbOTupGPtIbTq09MReoyTyQgZfLbrCuUuZxeZTKKBnp2p0aOlJSKATrs52RMflsHlXIr+suGn1uzCgRw2aNXIjLMSZmtXsWbs1jhlfXrTJMZmvxZ0HScvIJKS2L08+2Kfka/GPNXzz5zqrdI3ajl3zZ1ik/bZhJ/tPnedE1GViEpLp36Elb44bVq7HIf5bqnxwFxpa/BcQ4P333+f++++vgNIUrahyajQajh8/XsGlqRyaap7Uf+1pMi9fJ+1YJN5dKi94Kcnbny9g096DDO3bndo+NVi5ZRdT3v+Uz9+YSkRYvVJtY/PeQ5w4G1XosmYN6vHG049bpf+8cgPnL1+jZZOwuyr/3VAo4J2pQQTVceTXVbGkpOUyoFs1Zr5SjwmvRXIjJqfIvPYaJc+Prcupcxms2BRPcmouDUKcGX6/DxENXXnh/fMVdhzvffo1W3bv43/9e1PbtxarN23j+Xdm8ulbr9C0Ycn3DYCtu/dzMvJciesZDAbmfPsDjg72ZGUX/fmUp28+eYsDuzbSc8AwavrWZsfGFcx+61mmvfMl9RtGFJnv+8/fw8OrOu0698Grek2uXb7AhpW/cvTgLt6avRCNvYN53a9nv87hfdvo3HMwdYOGkZwYz8ZVv/H2C2N499OfqFbDx6bH+OGcz9m6aw8PDuyLn48PazdtYdpb7/Pxu2/QpGGDUm1j2669nIw8W+iynXv3s+T3v2jfpiU9u3ZBr9ezbvNWnnv9bV545in6dL+3PA/HyuzZs9mxYweDBw/G19eXDRs28Pobb/DBBx/QuFGjIvNdunQJFxcXBg0ahLubG4lJSaxbt45nJ09m9kcfERQUZF53xowZ7Nm7l969exMSHExCYiIrVqxg8pQpfPnFF9SsWdOmx1iYN7/+iY37j/Jwr87UrlWNFdv3M2nWPL5+eQIRoUEl5p/22IM42dub/1YqK6+R0rufzmPL7v081L8X/r41Wb1pO8+98xGfvvUS4WW6z5R8bzTdZxZV6H0mn0IB771Yn+C6TixdfpPUtFwG9qjBR6834MmXT3A9uvjfhReeDOLU2XSWr48lOTWXhvVcGPk/P5o3dmPq22cs1h860AcnBxVnLqTj7aG26XG9OW9J3rXYido1q5uuxY++4euXnirdtTjqQZwcNOa/C7sWf1i5iczsHBoF1SE+ObVcy/9Po1BJs8yKUOWDu6VLl1r8PWTIEIYPH07//v3NaXXq1KnoYhXq9nJB5f4oVbScm7Fs8G9PTkw87i0a02HP75VdpEKdPH+R9bv2M/HRB3lkYE8A+nRqyyNT3+TzH3/nm3emlbiNHK2OTxf+yvBBvZj3yzKr5X41q+NXs7pFWrZWy8zvfqJF41C8PdzL52DuQMeWHjSq78Lbn15k+/5kALbtTWb+zAaMuL8WH3x5uci8ublGnn3rLKfOZZjTVm9JICZey8gHfGjWyJXDJ9NsfQicOnuBjTt289TIhxk2uB8Avbp0YOSkaXy5cAlffvBmidvI0Wr5fMFiHr5vAN8t+a3YdZet20RsfAL9u9/LryvWlMchFOvC2ZPs3b6OIaOeoe99jwLQ/t6+vDJxGEsXzOW1Gd8VmffpFz+gQZMWFmkBwWF888l0dm1dQ5eegwFITIjlwO7N9Bn8KEMfe8a8bmjDCD547SkO7N5M70EPYyunz55j0/adjH9sOEPuGwhAr66deezpKXy94Ec+m/FuidvQarV8Of8Hht0/mO9/Wmq1PKJpY5bO/xJ3Nzdz2sA+PXli0vN8/9NSmwZ3kZGRbN26ldGjR/PgAw8A0L1bN8Y/+STz589n9kcfFZn3kYetP/fevXoxfMQIVq5cycSJEwGIj49n565dPPDAA4wZPdq8buNGjZj20kvs2rWL++67r5yPrHgnLlxm3Z7DTBo2kOH9TJ9vvw4tGTJtBp/+vJz5b0wqcRvdW4Xj4epi66KWyHSf2cNTI4fycN59pneXDoyY9BJfLvyZrz54o8Rt5Gi1fLbgJx65rz/fLin+N3HZus1595ku/LrCugbTljq19qJxqCvTPz7Htr1JAGzZncgPHzdl5P/8eW/uhSLz5uYamfj6KU6dTTenrdoUR0xcDqMe8qd5YzcOnSgIeiZPP01svBaAFQtaWG2vvJivxaEDbrkW72HISzP49OcVzH/jmRK2AN1bNS3xWpz3ygRqeXuiUCjoOKbk5wchSlLlI4eIiAiLfwA+Pj4WaV5eXpVbyDy3lysiIoKmTW3f9OefwqDVkRMTX9nFKNGmPQdRKZUM7t7RnGavUTOgaweOn40iJj6xxG38uGwtRqORh/OCw9LYceAYmVnZ9OpQuTWaHVt5kJisY8eBZHNaSlou2/Ym066FO+piOkzn6o0WgV2+nXnbquNrb7XMFrbs3otKqWRgz4KHc3uNhn7dO3Mi8hwx8QklbuOnP1dgMBoYNqhfseulpqXz7U+/MnrYg7g4O9112UvjwK6NKJUq7u012Jym0djTqcdAzkceJyEupsi8twd2AC3adAHg5rVL5rTsLFNTKzcPy/unu1c18/5saevOPSiVSvr36m5O02g09O3RjZNnzhIbV/K9ZMkff2M0Ghly34BClwfWqW0R2AFo1Gpat2hGXHwCmZnFN0O+Gzt27ECpVNKnT5+CfWs09OrZk9OnTxMXF1em7Xl4eGBvb096RsH3Lysry7zsVvm/iRqNhoq2cd9RVEol993b1pxmr1EzqEtrjp27RHRCUonbMBohPTMbo7HimnkXZsvufaiUSgb17GpOs9do6N+9Myciz5fyPrMSg9HIsEF9i10vNS2db376jdHDHqiw+8ytOrX2JDFZy/Z9BecnJS2XrXsSadfCo+TfhVsCu3w79pu2VcfP0SI9P7CztY37jpmuxa63XYudW3PsfBmuxazir0Wfal4oFP+NGi2lSlEp//5rqnxwVxp//PEHAwYMoEmTJnTs2JGPP/4YvV5vXh4bG8tLL71Et27daNq0KT179mT27NlotZY3mNDQUObNm8fHH39M27Ztueeee5gxYwZGo5Hdu3czaNAgmjVrxsiRI7l582aZypibm8v999/PQw89ZFG2efPm0bhxY86cMTVbmDt3Ls2aNePYsWM8+OCDNGnShD59+rB58+a7+ITErc5evEptn5o4O1n+4DQMCTAtv3S12PzR8Qks/Gs1Ex65H4cyPDyt3bEXe42aLq2L729jayF1HTl/OZPbf6siozJwsFfhV6vsD/VeeU1rUtL0JaxZPs5dvIy/by2cnSwfghrUM/UTO3+x6NpHgJi4eBb/sZzxw4dhb1/8Ofz2p1/x8vBgYM9ud1foMrgcdZZavnVwdLJ8YxxUz9Qn9MrFwpshFiUl2fQQ6uLmYU6rUcsfL+8arPl7MYf3bScxPoYLZ0/yw5cfUL2mL607lv7FxZ04H3WR2n4+VucwrH6IafnFS8Xmj4mLY8lvfzF25KPY25ftmk1MTsbB3r7Ec383Lly4gJ+fn9Xx1c9rwn8hqvAm3bdKT08nOSWFixcvMueTT8jMzDS/5ATTC8Vq1arxxx9/sGfvXuLi44mMjGTuZ59Rq1YtOnfuXK7HVBqRl69Tp1Z1XJwcLNIbBZla2Jy9fL3EbQya8g5dxr5EpzHTeO2LH0lIsX1rgMKcvXiZ2r61rH4r8u8z50q4z0THxfPjHyt4cviQEq+1b376DS8Pd4tAsiKFBDhz7qL178KZC+k4Oqjw93EoPGMxCn4XdOVRxDIzX4uOt12LwfnX4o0StzFo6rt0GfsynZ54ide+rLxrUfy3VPlmmSX5/vvvmTlzJiNHjmTatGlcuHDBHNw999xzACQlJeHh4cFLL72Em5sbly5dYu7cucTFxfH+++9bbG/x4sW0atWKGTNmcPToUebOnYvBYGDnzp08+eSTqNVq3nnnHV555RXmz59vkddgMJCbm2uRplQqUSqV2NnZMXPmTO677z6++uorJkyYwJkzZ/j000955plnCAsr6IOl0+mYPHkyjz/+OP7+/ixZsoSnn36aP/74o1R9EEXxEpJTqOZp3SwyPy0+KbnY/J8u/JX6gXXo0b5VqfeZkp7BniMn6dQyAmfHsv9IlicvDzXHI61r3xKSTdeut6eaS9eyy7TNh/rVICNTz/5jFdPfICExGW9PT6t0b08PAOITi38j+9n3i6kXVJfuHdsWu975S1dYtm4TM157HpWq4t6lJSfF4+HlbZXu4WmqVUtOLFutz8rfF6JUqmjZruDB0c7OjqenfchXH73GnHenmtMDgsN49cNvrQZfKW8JScl43cU5/PK7hYQEBdK1U/sy7ff6jZts372Xzu3bolKpypS3LBKTkgptVZKflphQcq3P5ClTuHbtGgCOjo4MGzqUXj0Lgm47OztefeUVPpwxg+nTp5vT64WE8NGsWbi4VHzTxvjkVKp5uFmlV/M0pcUlFX2PcHN25KEeHWhaLwC1nR1HIqP4ZcMOTkZdYeFbU6wCRlsz3Wc8rNILrtHkYvN/9v1P1C/1fWYzM197rkLvM7fy9lRz/Ix14JKQpMtbruHi1bLVdA8Z4EN6Zi77jqSUSxnLqshrMS8tLrnocrk5O5muxZC6qNX51+JOTkZdZeFbk60CRiHK0386uEtPT+fTTz9lzJgxTJkyBYD27dujVqv54IMPGD16NJ6enoSGhvLiiy+a8zVv3hxHR0emTZvG66+/jqNjwVu5GjVqMHOmaVSujh07smnTJhYsWMDKlSsJDja9rYuJieHtt98mNTUVt1ua/MyaNYtZs2ZZlLFt27YsWLAAgODgYKZMmcKsWbNo27Ytb7zxBk2bNmXMmDEWeXQ6HU8++SQPPvggAB06dKBnz558/fXXzJ49u5w+vf+uHK0Wtdr6q6NRq/OWF/2W8eCJM2zee5jv3n2pTPvcvOcgutxcenUsfUBoKxqNEp3OYJWen2avKdvDxdABNWne2I1PF1wlI7Niau5ytFo0hZxDe7XGvLwoh46fZOue/Xz94fQi18n3ybcLad08nFYVMLLirbTaHOzU1m/61XlNJbXa0g+2sHvrGrZtWEbf+4dTy9eyf7Kziyt1AuvTsn03QkIbE3PzGit+W8DnM17i+emf2bRpplarNX/nbpXflFCbU/Q5PHzsBNt27+WLWe+VaZ/ZOTm8+eFs7DUaxo54pGwFLqOcnBzUhR2f+T5TctO0KZMnk5mZyc3oaNavX0+OVovBYLDoy+3i4kJQUBAdO3QgLCyMGzdv8ssvv/De++/z3rvvVnjTzBytroj7qyktR1f0/XVYb8uaxm6twmkUXIdXv/iR3zbsYNTA7kXktI2ij8V0Dm9v/XOrQ8dPsXXPAeZ9+GaJ+5nz7SJaN29KqzKOwFmeNBol2kJ+F7Tm34WyNY17eLAPLZq6M+e7SxX2u3C7HJ0OtZ31C5zS/NYP69XJ4u9uLcNpFFSHV79czG8bdjJqQMW15PgnUSj/e00kK8N/Org7fPgwmZmZ9O7d26LGrF27dmRnZ3Pu3DlatWqF0Wjkhx9+4JdffuHatWvk5BQ8GF29epX69etb5L1VYGAg8fHx5sAOMA9FHR0dbRHcjRgxgoEDB1rkv/3N6ciRI9m4cSMjR47Ezs6OZcuWFTroSo8ePcz/r1Kp6N69Oxs2bCjNxyJKYK/RoNPlWqVr8x467DWFj96Vq9cz+/uf6dOxjbkJZ2mt3b4XNxdn2kU0LnN575SdSoGri+UPW0pqLlqtAbXa+prLT8vRWv/AF6Vzaw9GPejD6i3xrNhYcf0t7TUatIWcwxyd1ry8MLl6PZ98u5BenTuYm1YVZeOO3ZyIPMsPcz68+wKXkUZjT67O+sFRlxfUlTboijx5mO8+e5cmzdrw4KNPWizLzEjnvZfG0ue+4fQZXBDoBIY04P1XxrN943K69XnwLo6ieBqNxvydu1X+A7OmiGZser2eud/Mp0eXToTVCyn1/vR6PW/P/JjLV6/xwRsvU83btn217e3t0RV2fOb7TMlBV4MGBSOGdu7UiXHjxwPwRN4LwYyMDJ5/4QUeeOABHrhlxOh69erx4osvsm79evr3K75PaXmz16iLuL+a0uwLCXiL07tdCz5e/Df7Tp6t8OCu6GMxncOiAudcvZ453y6iV+f2NKhX/IiMG3fs4UTkORbOeb/Y9cqL6XfB8tExJVWHVmtAU8jvgsb8u1D6/o9d2nrx2EP+rNoUy/L1sXdX4Ltgr1ajy7UOLEv6rS9K73Yt+PinZaZr8T8a3ImK8Z8O7pKSTM12ihoNLL9f3A8//MCHH37ImDFjaN26NW5ubhw/fpy33nrLItADLII1ALVaXWgaYJW3Vq1aNGlS/Js3hUJBv3792LdvH127dqV27dpW66jVatzdLZsNent7l7kDviict4c7cYU0p4lPMjXRqFZIMxyA1Vt3c/lGDC+OHc6NWMtAJjMrhxux8Xi5u+JwW/+f6PgEjpw5z+BuHbGzq7ivbMN6zsx6xXJah+GTT5KYrMPLw7oc3nlp+c1wStK8sSvPj6vLvqOpfPJ98f0Uy5u3lwdxCdYD3yTkNamt5mXd3A9g7ebtXLlxk+eeHM3NWMvvU2ZWNjdj4/B0d8PB3p4vfljCve1ao1bbmddNzzANQhIbn0Bubm6R+7lbHp7VSEqw/r4nJ5muOw+v6lbLbnfl4lnmvPsc/nWCePrFD1CpLM/5gd2bSElOpFmrjhbpYY2b4+jkzLnTx2wa3Hl7ehCfeAfncNNWrl6/wZSnxhEdY/ngmJmVTXRMLB4e7lbfw1mffc3u/Yd4ZcozNA+3fQ2Jl6cn8YU0vUzMO2Yvb+tmt8VxdXUlvGlTNm/ebA7uduzcSVJSEm1aWw7S1LRJE5ycnDh16lSFB3fVPNyIS7Ru7haf1xyzuqd1M7mS1PT2JCW9+LnWbMHby4P4QgbdKLhGPQrNt2bzDq7cuMnzTz5W4n3m8x9+5t52rSrsPtMo1IXZr1tOM/LwxCMkJOnMfeRu5e1pSktIKt0gKC2auPHiU0HsPZzMx99euuvy3o1qHm7EJRVyLeZNV1D9DkatruntUSnX4j+FopKaDf/X/KeDu/wA6LO8zuO38/f3B2DNmjV07dqVqVML+pVcuFD0sL62FBMTw8cff0zDhg1Zu3Ytu3fvpm1by/b4Op2OlJQUiwAvISGB6tVLfqATJasfUJtDJyPJyMyy6Ch/8txF8/LCRMcnkqvXM/Y165qcVdt2s2rbbj587kk6t2pmsWzdjv0YjUZ6VfCk5VFXsnjxA8u5lRJTdFy4kkXj+i4oFFh0ng8LdiY7R1/sfEYF6zrxxqRAzl3M5J25FzGUvrKvXIQE1OXw8VNkZGZaDFhx6qzpex0SWPjkzTHxCeTm6nnqJesmmWu2bGfNlu28O20ynVrfQ2x8Auu37WL9tl1W646e+gohAXX4/mPbvG2vE1if08cPkpWZbjGoStTZk+blxYm5eY1Z0yfh5u7JlNfn4OBoPfpeSrIpyDDcdvKMRiMGgwGD3rZNqUKCAjh8/KTVOTydN+9gSGBAofli4+LJzdUz8cVXrZat27yVdZu38vbLz9OhTUET6K++X8iajZuZMGYU3Tp3KN8DKUJQcDBHjx2zOr7IyEgAgoOKr9EpTI5WS2ZmwYNlct4LzqLOod7G57AwoXX8OHjqPOmZ2RZ95E5cMA0+Ur+uX5m2ZzQauRmfSGgZ85WHegF1OXz8tNVvRf59pl4J95knX3rbatmaLTtYs2UH702bdMt9Zjfrt+22Wvfxqa8RElCHBR+XPC1IaV24nMnz71jOO5eYrOPC5UyahBXyuxDiQla2nms3S+6HHRbizPSp9TgblcFbc85X+O/C7ULr+nLw9HnSs7It+siduHAFgPp1fcu0PaPRyM24JEIDKv5aFP8t/+ngrlmzZjg6OhIdHW3RjPF22dnZVn0fli9fbuviFeqVV17B3d2dxYsX8/zzz/Pyyy+zfPlyq+ab69evN/e50+v1bNiwgfDw8MoocpVzb5vmLF6+jr82bDfPc6fV6VixZReN6gVSs5qpuVZ0fALZOVoC/EwTOfdo37LQwO/FWV/SrlljBnXrSKN6gVbL1+3cR61qXoSHlb4JWXlIz9QXOufc9n3JdGrlSYd7PMzz3Lm5qOjYyoM9h1PR5Rb8svvUMDU7uhlb8Na2tq89b08NJiZey2sfRaHVVfxw5V3ateLnv1eybN1m8zx3Wp2O1Zu20rB+MDWrmWpFYuLiyc7RUtff9CPerUPbQgO/Vz74mDYtIhjQ414a5jXXfHfaZKv1Nu7YzaYde3hl0nhq2LBZX8t2XVn9149sXvuXeZ47nU7L9o0rCK7fGO/qpompE+KiycnJxtc/wJw3OSmemW9ORKFQ8tybn+LmXvhb//z+d3u3r+O+YWPN6Yf3bSMnO4u6QcUHkHerU7u2LP1zOSvWbjDPc6fV6VizcTMN6tejRnXT4DExcXHk5Gip4296oOraqT0hQQFW23vtvZm0vqcZ/Xt2p0H9ghrrn//4m6V/LueR/93HgwMrrharQ/v2/P7776xevdo8z51Wp2P9+vWEhoaaX9bFxsaSk5Nj0YojOTnZanqDmJgYjhw5Qr2QgvuIn5/pM9m6dSuPPvqoOX3Pnj1kZ2dbdCeoKN1ahbNo1Wb+3LzbPLeYVpfL8m37aBxcl1repusxOj6JbK2WAN+CSdaTUtPxdLP8Lfxtw06SUtNp2zSMitalXUuW/L2Kv9dtMs9zp9XpWLVpm8V9Jjounpxb7jPdO7ShXqD1/Lsvf/AJbVuEM6BHFxrmNSl+b5r1vH8bd+xh4469vDppXLnfZ9Iz9BZzzuXbtjeRzm286NjK0zzPnZurHZ1be7HnULLl70JNU634zZiCF4F1fB1474X6RMfl8MqMs5Xyu3C7bi3DWbRqC39uKuxarFP2a3HjLpLS0mnbpOKvxX+K/+K0BJXhPx3cubm58cwzzzBz5kyio6Np1aoVKpWKq1evsnHjRubOnYujoyPt2rVj4cKF/PjjjwQEBLBs2TIuXy5+COM7cfPmTY4cOWKV3rBhQzQaDUuWLGHXrl38+OOPODk58dZbb9G/f3/eeecdPvjgA/P6arWaL7/8kpycHPNomdHR0Xz++eflXubyVvepR1C7u+HgWwOAGv3uxcHPVKt66fNF5KZaz4VT0RrXC6JbmxZ8seQPElNTqV2rBiu37uZmXDyvjB9hXm/6Z99z+NRZ9vwyD4AAPx9zoHc73xrVrGrsAC5cuc75y9cYMbj3P2YenO37kjl1LoOpT9Shjp8DqWm5DOheDaVSwcLfLaf4+HCa6QFkxJRTADg6KHn/+RBcnFX8ujKG1hGWTaxuxOZw+rztm6w0qh/Cve1a8/WPS0lKScHfpxarN2/jZmw8L054wrzeO598xZGTp9n+52IA6vr7mh/AbudbozqdWt9j/vvW/8+XP8VCm+YReLjZbjTJ4NDGtGzfjd8WfU5aSiI1fGqzY9NK4mNv8PjEV8zrzZvzJmdOHOKHv/eZ0z6aPom46Ov0vX84Z08f5ezpo+Zl7h5eNI4w1SA3a9kRvzpB/L30O+Jjo80DqmxY9SsentXo1GOQzY4PoGFoPTq3b8s3C38iKTkFP59arN20lejYOJ6fWNA/8P2PP+PoiVNsXvYrAHX8/cyB3u18atSwqLHbvnsvXy/4EX9fH+r6+7N+8zaL9VtENMWriGbYdyssLIyOHTqwYMECUpKT8fH1ZeOGDcTExPDspIIH+lkffcTx48dZvWqVOe3Jp54iIjycoKAgXFxduXH9OmvXrUOv1/PYY4+Z12vdujV169blpyVLiI2NNQ+osnz5cry8vCxG1qwojUPq0r1VOJ/9soLE1DRq16zGiu37uRGfyGtPDDWv9/pXizl05gIHfvzYnNb/2bfo2boZwbV9sFfbceTsRdbtOUz9un480LVdYbuzKdN9phVf//grySmp+PnUZM3mHdyMjWfahIKB0N755GuOnDzDjj8XAcXfZ3xKcZ85d9FUs9SmebhN7zO32rYnkVN90nl+fBB1/W6SkpbLwJ41UCoVLPjVcvqKWa+agptHJpruLY4OSj54ORQXFzt+WRFNm2YeFuvfiMnh1LmC3/62zT0IqmuqzVapFATVceKR+0yf1+6DSURdKZ/5J83X4q8rSUxNN12LO/KuxTFDzOu9/vVPpmtxUcGAdf0nv03P1hF516KaI2ejWLfnSN61aNnaatuhk5y9YppWIVev59zVG3z713oAOjdvRL06ZashFOI/HdwBPP7449SsWZPvv/+eH3/8ETs7O+rUqUOXLl3MtXUTJkwgKSmJTz/9FIBevXrx6quvMj6vc3p5WbRoEYsWLbJK37p1K1qtlhkzZjB69GiaNzfNc+bt7c3bb7/NhAkT6N69O927mzqLq9VqZs+ezfTp0zl79iz+/v58+umnFtMl/FMFTX4cpwB/898+9/fC5/5eAFz/adk/IrgDeP3px6m19G/WbNtDWkYmIXX8+ejFiTRrWL61FWt37AWgZ4fKHyUzn8EIr866wBPDfBncszr2GgWRUZnMnHeZayU0yXRzsaNGNVNt3pih1g/Y67YncPr8FZuU+3avTBpPzZ9+Y+3WnaSnZxBctzYfvvIcEY0alJz5X2Dss2/yx+Kv2bllNZnpafgHhDD51dmENSp+nsQrF03NGlf9YX0vCmvc3Bzc2anVvPL+PP5e+h1HD+xk7/Z1ODg60bx1Z/43/Elcb5kTz1Zenvw08xf/zPot20hLzyA4oA7vvTaN8MYNy2X7F/KC8Ws3bvLex3Otln/87ps2C+4AnnvuORYuWsTGTZtIT08nMDCQ6W++WWLf7H59+7Jv/34OHDxIVlYWHh4eNG/enCEPPURgYEHrALVazcwZM1iyZAn79u9ny9atODo60rZtW0aNHGnVd7uiTB//CD6/rWbVjgOkZWYRUtuXOVOfoHlY8TWJfdq14Ni5i2zaf5QcXS4+1TwZ0e9eHh/UAwcbzklYnFcnjePbn35n7dadpKVnEly3NjNemUJEo3/+73FZGIzw0oeRjHukNvf1rolGoyQyKoMZX14ssUmmm6sdNauZavOeeNi6dcvarXEWwV3H1p706lzQzaReoDP1Ap0BiE/UlltwBzB93MP4/L6aVTvzr0Uf5kwZU4prsTnHzl1i0/5jltfiwO5W1+Km/cdYsWO/+e/Iy9eJzJvPsaaXuwR3oswURuPtU06Kf7O5c+cyf/58Dh8+XK7bXamu2vPjtTswr7KLYHNDZpV9IIJ/kx9fqpzhsitKlLJeySv9y9VRlH+LiH+SbDvnyi6CTVVPjKzsIthctnO1yi6CTQ19q7JLYFt/Tan6A8u5tqrYQZDKYm/bih07IF/r3XsrZb+VRYatEUIIIYQQQogq4D/fLFMIIYQQQghhWzKgSsWQmrsqZuLEieXeJFMIIYQQQgjxzyfBnRBCCCGEEEJUAdIsUwghhBBCCGFTCmmWWSGk5k4IIYQQQgghqgCpuRNCCCGEEELYlEIpdUoVQT5lIYQQQgghhKgCpOZOCCGEEEIIYVMKpfS5qwhScyeEEEIIIYQQVYAEd0IIIYQQQghRBUizTCGEEEIIIYRNKWUqhAohNXdCCCGEEEIIUQVIzZ0QQgghhBDCpmRAlYohNXdCCCGEEEIIUQVIcCeEEEIIIYQQVYA0yxRCCCGEEELYlEIpdUoVQT5lIYQQQgghhKgCpOZOCCGEEEIIYVMyoErFkJo7IYQQQgghhKgCJLgTQgghhBBCiCpAmmWKUml3YF5lF8Gmdt0ztrKLYHN9fz9T2UWwqTSHi5VdBJtyNWRWdhFsLsboW9lFsClPY2JlF8GmFif2rewi2Fwfz8jKLoJNPT0lpLKLYFNp7icruwg251rZBSiGUiXNMiuC1NwJIYQQQgghRBUgNXdCCCGEEEIIm5IBVSqG1NwJIYQQQgghRBUgNXdCCCGEEEIIm5JJzCuGfMpCCCGEEEIIUQVIcCeEEEIIIYQQVYA0yxRCCCGEEELYlAyoUjGk5k4IIYQQQgghqgCpuRNCCCGEEELYlNTcVQypuRNCCCGEEEKIKkCCOyGEEEIIIYSoAqRZphBCCCGEEMKmpFlmxZCaOyGEEEIIIYSoAqTmTgghhBBCCGFTCqXUKVUE+ZSFEEIIIYQQogqQmjshhBBCCCGETSlV0ueuIkjNnRBCCCGEEEJUARLcCSGEEEIIIUQVIM0yhRBCCCGEEDYlUyFUDKm5E0IIIYQQQogqQGruhE1odTrmLV3Gmu17SEvPJLiuH+OGDqZ104Zl2s7Etz9m//HTPNirC8+NfticvmLLLt75YkGR+d6cOJreHVvfafFtQuXsRNDU0Xi0CsejZRM0Xh4cHT2Nawv/rNRy6XO17Fv7KWcP/U1OZirePqG06j2J2vXbl5g3PSWGXcve5+rZnRiNBvyCW9N+4Eu4edc2r3Nm/x9s/uXlIrfRbdhM6jcfYJF2/sgqjm3/gYSbZ1Gq7PCsGUyr3s/iH9Lmzg/0NjqtlkWLFrFp0ybS09MJCAxkxIgRNG/evNh8u3buZNWqVVy6dInU1FTc3d0JCwvjkUcfJSAgwLzesWPHmPbii0VuZ8SIEQwdNqy8DseKTqdlyaLv2bp5HRnpadQNCGbYiNFENLun2Hx7dm1n3eplXL4URVpqKm7u7tQPa8iQh0dRNyCoyHzRN68z6clR6HQ6Zsz5ipB6YeV9SBZ0Oi2//PgtOzavIT09jToBIQwZ/gRNm7UqNt++XVvZsPovrl6+kHd8HoSENuJ/D4+m9m3Ht2vbBg7t28n5yFNE37xGg8bNeOODz2x5WBa0Oh0LFy1m4+bNpKenExgQwMgRj9KiWbNi8+3ctZuVq1dz8dJl0szXaCjDH36YgIC6FutmZWWxYNGP7Nixk5SUFGrVqsWggQMY0K+vLQ+tSLk6LbtXfcLp/X+TnZVKdd9Q2vV7lrphxd+PEmOiOLbzZ6IvHSP22kn0uVoef2Mj7t7+FVTywuWfww2bt5jP4agRj5R4Dnfs2s3K1WsKOYfDCCziHG7fsct8DgcP7F8h5zBXp2X973M5tHMZWRmp+NSuT88HJ1GvSbti88XdvMiejUu5euEYNy6fIlen5YXZ6/Gq7me1rk6bw441P3B45zKS4m/g6OxG3ZAIut8/gZr+9Wx1aIDp/H2/eCnrt2wjLT2doIC6jH5kKPc0Cy/Tdp577S0OHj3O4L69mDR+jDk9Ni6e1Rs2s+fAQa7diEapVBJYtzbDH3qAFhFNy/twKp1MhVAxKvVTnjt3LqGhoXTs2BGDwWC1fOjQoYSGhjJt2rRKKF3F+eOPPwgNDS303+uvv17Zxbsjb3++gCUr19OrQ2smPzYElVLJlPc/5ciZc6Xexua9hzhxNqrQZc0a1OONpx+3+hcaWAeVUknLJrZ9sLwTmmqe1H/taVzCgkg7FlnZxTHbtHQax7YtoF6zAXQY9DIKpZJV343j5sWDxebT5WSw7KsR3IjaT/Ou42jZcyLxN07z15fDyc5IMq/nG9SSbkNnWP2r5tcQhVJlFbDtXzeX9T9NxcXDh3YDXqRV70l4+4SSkRJTrsc9e/Zs/vzzT+69917GjRuHSqnkjddf5+SJE8Xmu3TpEi4uLgwaNIgJTz9Nv379uHDhApOffZaoqILrtXbt2jz3/PNW//KDx5KCyLs1d/YHLP/rFzp16c7jYyeiVCp5940XOX3yWLH5rlyKwtnFhX4DH2DsU8/Su+8gLl44z4tTnuRi1Pki882f9zkqlaq8D6NIX378Lqv++pn2XXoycuyzKJVKPnzzOc6cPFpsvquXL+Ds4krvgQ/x+FNT6dH3Pi5FneWVqWO4HGV5f1q/6i8O7N2Od/UaOLu42vJwCvXR7Dn88ddfdO3SmSfHPoFSqeS1N6Zz4uTJYvNdzLtGBw8cwNNPPUm/vn24cCGKZ6ZM4ULURfN6er2el197g5UrV9GpYwfGjX0Cf38/PvviS5Ys/cXWh1eodYuncWjzAsLuGUCX+19BoVDx11djuX7hQLH5bl46wpGti9DmZOBVM7iCSluyWbPn8Ptff+edwzGolEpefeMtTpw8VWy+S5cu4+Liwn0DB/D0U+Ppbz6HU63O4UuvvcGKlavp1LED48eOwd/fj7lffFUh5/DXeS+zfc0PNGvXnwGPvoRCqeL7j8ZzKbL434/L546wa92P5GRnUN236JdGAD9/+QLr//iMoAatGDD8ZVrd+xAXIw/yxfSHSYq/Xp6HY+XDOZ/z698r6N65A0+PeQyVUsm0t97n+KnTpd7Gtl17ORl5ttBlO/fuZ8nvf+HrU4vHHx3K8CEPkJmVxXOvv83qDZvL6zDEf0yl19yp1WqSkpLYv38/rVsX1LRcv36dI0eO4OTkVImlq1jffvstrq6WDxDe3t6VVJo7d/L8Rdbv2s/ERx/kkYE9AejTqS2PTH2Tz3/8nW/eKTlYz9Hq+HThrwwf1It5vyyzWu5Xszp+NatbpGVrtcz87idaNA7F28O9fA6mHOXcjGWDf3tyYuJxb9GYDnt+r+wiEXPlGOePrKJtv+eJ6DIagPotBrP0owHsXjmT+5/+uci8J3YtISX+Mg888ys1ajcBoE5YJ5Z+NIAj276nTZ8pALh517aoyQPI1WWz7c/p+AW3xsmt4DxGXz7CgQ1f0K7/i4R3GlXOR1sgMjKSrVu3Mnr0aB548EEAunXvzpPjxzN//nw+mj27yLwPP/KIVVqv3r0ZMXw4K1euZOLEiQB4enrStWtXq3V/WrwYXz8/6oeGltPRWDsXeZod2zYx4vHxDH5gKABduvXk2aceY+H8r3n/o8+LzPvQwyOt0rr36scTI//H2lV/M/7pqVbLDx/cx5FD+xn84FB++3lR+R1IEc5HnmLXtg088vgEBtxvqtHv1LU3z08YzuLvv+DtWV8XmfeBYY9bpd3bcwATRg1m/ao/GfP0C+b0CVNfw8u7OkqlkueeerT8D6QYZyLPsmXbNsY8/hj/e+B+ALp368rYp57m2/kLmPPRzCLzPvqwdY1wn149eWTkY6xYtYpJT08ATDV8p06fZsqkZ+jVswcAA/r15e333uenn5fSp1dPPDw8yv/gihB9+RiRh1bScdAL3NPNdD9q2GowC9/vz/a/ZzF0StH3o+DGXan34X40Di4c2PgdcddL//BtK6ZzuJ0nHn+M/z1wHwA9LM7hjCLzPvrwUKu0Pr168PDIx1mxajWTnn4KyD+HZ5gyaSK9bzmHb733AYt//oXevXriaaNzePXCMY7uWUXfoc/RqZ/pe9W8wyDmvDSQVT9/xFNv/FRk3obN76XJ13uxd3Rm28r53Lx8ptD1UhJjOHlgPZ36PkbfYc+b0wNDW/DN+49xYv8GOvaxvmeVh9Nnz7Fp+07GPzacIfcNBKBX18489vQUvl7wI5/NeLfEbWi1Wr6c/wPD7h/M9z8ttVoe0bQxS+d/ibubmzltYJ+ePDHpeb7/aSl9ut9bfgck/jMqvX5UrVbTqVMnVq5caZG+cuVK6tWrR506dSqpZLan1WotaiwbNWpERESExb/atWsXs4V/pk17DqJSKhncvaM5zV6jZkDXDhw/G0VMfGKJ2/hx2VqMRiMP5wWHpbHjwDEys7Lp1eGf1Rwzn0GrIycmvrKLYSHq2FoUShUN2wwxp9mp7WnQ6gFiLh8hPflm0XmPr6VG7SbmwA7As0YQ/iFtuHB0TbH7vXRqM7qcDOrd1hzz+PaFOLlWo2mHERiNRnQ5GXd4ZMXbsWMHSqWSPn36mNM0Gg09e/Xi9OnTxMXFlWl7Hh4e2Nvbk5GeXux6kZGR3Lhxg3vvte0P9u6dW1EqlfTsU/D5ajT2dOvZj8gzJ4mPiy3T9tw9PLG3dyAjw/r4cnNzmT9vLv0HPUCtWr53XfbS2LtzM0qlim69B5nTNBp77u3Rn3NnThAfV7ZaXncPTzSFHF+16jVRVlIzoh07d6JUKunbp7c5TaPR0LtnD06fOUPsnV6jGQXfqfwawM6dOlqs26VTJ7RaLbv27L2LIyi7s0fWoFCqaNLO8n7UuM2D3Lx0mLSkou9HDs4eaBxcKqKYpbbdfA57mdM0Gg29evbg1F2cw/RbzuHxvBrALp06WazbpVNHtFotu214Do/vW4dSqaJV14fMaWqNPfd0foAr54+QnFD0+XJy8cDe0bnEfeRkm47Vxc3yRberR3Xz/mxl6849KJVK+vfqbk7TaDT07dGNk2fOEhtX8u/5kj/+xmg0MuS+AYUuD6xT2yKwA9Co1bRu0Yy4+AQyM7Pu7iD+YRRKRaX8+6+p9OAOoH///qxduxadTmdOW7FiBf3797dY78KFC0yePJnOnTsTHh5O3759mT9/vkWAdO3aNUJDQ/n777956623aNmyJR06dODDDz8kNze3TNsCiI6OZty4cYSHh9O5c2cWLFjAu+++a/VGPjo6mueee47WrVvTtGlTHnnkEU7c1ryra9euvPXWW3zzzTfce++9NG3alOTk5FJ9RsePH6dRo0b8+OOP5jStVsvAgQMZNmyYudz5+/j222/p2LEj4eHhPPnkk8TGlu1h7m6cvXiV2j41cXZytEhvGBJgWn7parH5o+MTWPjXaiY8cj8OGk2p97t2x17sNWq6tLZtc7eqJP7GaTyqBVg9FNWo3dS8vDBGg4GEm5FU929staxG7aakJlxBm110oHPu0HLs1A4ENe5hkX7t/G5q+Dfh2M5FLHizLd++2oIf3urI8Z0/FrGlO3PhwgX8/PxwcrZ8uAitXx+AqAsXStxGeno6KcnJXLx4kU/mzCEzM5OIiIhi82zebGpmY+vgLurCOXz9auPkZHl89eqbmisX17wyX0Z6GikpyVy+FMUXn8wkMzODpuEtrNZb8fdvpKen8+DQ4eVT+FK4FHUWn0KOL7i+qU/v7c0rC5ORnkZqShJXLl3g608/ICszg8bhxfdHrEjnL0Th7+eH822tV8zX6C1N84qSnp5OckoKFy9d4uNP5pqu0fCCvkI6nQ6lUolarbbIZ29vemA+d77k66Q8xV07jWf1AOwdLe9Hteqa7kex1yq/Nq4sijqHYXnn8EIZz+HsvHPYLLygL1bBObRsiOVgPocl38vu1I3Lp6lWqy4Ot52v2sFN8pYXXhtXFt41auPuVYvtqxdw6tBmUhKjuXrhGH9+Px2v6v6Et7Fdv8LzURep7edTyPkLMS2/eKnY/DFxcSz57S/GjnzU/J0qrcTkZBzs7bG3L/0zkBD5Kr1ZJpgedF555RV27txJly5dOH/+PJGRkXz++eesWrXKvF5sbCyBgYEMGDAAZ2dnTp8+zdy5ppvd008/bbHNOXPm0K1bN+bMmcPhw4eZO3cuderUYVjeAAal2ZbRaOSpp54iPj6e6dOn4+rqynfffceNGzcs3uampKTw8MMP4+TkxGuvvYarqyuLFi1i5MiRrFu3zqJp5bp166hbty6vvPIKSqXSotmpwWCwCEABVCoVCoWCJk2aMG7cOGbOnEm7du0ICgrik08+4erVq/z9998W5Vm/fj1+fn68+eabpKamMmvWLCZOnMjSpdZNAmwhITmFap7WzSLz0+KTkovN/+nCX6kfWIce7YsfGOFWKekZ7Dlykk4tI3B2dChTef/LMlLjLJpF5stPy0gp/KVAdlYK+lwtTq7F5E2NLfRNenZmMlcitxPYuLvF8pzMFLIzkoi+dIjrF/ZwT/cJuHj6cmb/H+z46x2USjsatbVuqnQnkhIT8fLyskrPT0tILLl2ecrkyVy7dg0AR0dHhg4bRs9evYpcX6/Xs33bNuqHhuLra9sarqSkBDy9rJt056clJpb8xnna1Ke4fs30IsbB0ZEHhw6nW0/LB6mkxAR+XbKQkaOftAq0bCkpMQEPz6KPL6kUx/fac2O5ce0KYDq++4aM5N6e/UvIVXESkxLx8vK0Ss9PS0hMKHEbk6Y+x7Vrpj5Jjo6OPDx0iLnpHoC/vz8Gg4HTZ87QuFEjc3p+jV5CQsn7KE8ZqXE4u1vfU5xvuaf8myQmJZVwDku+zzwz9fnbzuFDt51Dv7xzGEnjRgUDlh3PO4fxNjyHaclx5hq0W+WnpSXf/flS2al59Jk5/PzF8yz8eII53S+wEU++vhhHZ7dict+dhKRkvDytz5+3pwcA8YlJVstu9eV3CwkJCqRrp5IHJ7vV9Rs32b57L53bt63QfswV4b9Yi1YZ/hHBnaOjI127dmXlypV06dKFFStW0KxZM6smiW3btqVt27aAKfBq0aIF2dnZ/Pjjj1bBXdOmTXn11VcBaN++PXv37mXt2rXm4K4029q2bRsnT55k8eLF3HOP6Y1umzZt6Ny5M263VKP/8MMPpKam8uuvv5oDubZt29KrVy++++47XnihoA+HTqfjm2++KbQvYfv21jeAGTNmMGiQqenRU089xZYtW3jhhRd44YUXmD9/Pm+++aZV09WMjAy++eYbc/+9WrVqMWrUKLZv307Hjh2t9lHecrRaq7eIYGpqYFqus1qW7+CJM2zee5jv3n2pTPvcvOcgutxcenUsfUAoQK/LRmVn/WbQzs70ljE3N6fIfECheVV5efW6wvNGHVuLQa+jXjPLZio6bSZgCv56PDKbkAhTIBHcpBdLZw/k4Mavyi24y8nJsaqtAFDn1RRrcwov+60mT5lCZmYm0Tdvsn79erQ5ORgMhiKb8R09coSkpCQeGjKk0OXlSZujLfz41KU/vqefnUZmZgYx0TfZtGF1oce3aME8atbyoXuvfuVX+FLQaks4f9qSj2/8pFfIyswgJuYGW9evNDeTr6xmmLcr6hxq8s5hTo62xG1MffZZMjMzuRkdzboNG8i57Rze27kzi5f8zOw5nzLhqfH4+fpy6NBhlq9cVep9lKdcbeH3I5Xa3rz836Skc1ia7+Fzz0665RxuRJtjeZ127dyZxUuW8tGcT3n6qXH4+fpy8NBhlq9cbS6Dreh0OdgV9vuRd750pfgeloajsxs+dRvQpFUvaoeEkxBzhS3Lv2Hx3MmMfvE7mzXN1Gq15ueWW2nMvxNFf7aHj51g2+69fDHrvTLtMzsnhzc/nI29RsPYEdb9u4UojX9EcAempplTp04lOzubVatWMXy4dROfnJwcvv76a5YvX87NmzctmnFmZGTgfEsTqw4dOljkDQ4OZs+ePWXa1vHjx3FzczMHdgDOzs60bduWk7eMVrZz505at26Nu7u7ueZNqVTSsmVLjh8/blGO1q1bFzlIzIIFC3Bxua15wy0Brp2dHTNnzuS+++5j9OjRdOzYkSGFPCi2bt3aYmCWtm3b4uHhwdGjRyskuLPXaNDpcq3StXmfsb3G+mYJkKvXM/v7n+nTsY25CWdprd2+FzcXZ9pFWDcTFEVTqR3Q51r/QOUHdflBXmH5gELz6vPy5j+Q3e7s4eXYO7lTJ8zyWszfplKlJqhpQQ2YQqkkJLwP+9fNJS3pBq6ed1/rZW9vb/Gdz6fTmo5HU4omNA0aNDD/f6fOnRk/bhwAY554otD1N2/ejFKppNNtfWNsQWOvKfz4dKU/vtAGBTU5HTp15ZnxIwAYNcY0kEPkmZNs3bSON9+dXeEBkUZTwvkrxcNe/QYF94p2nboxdbzpQWr46KeLylKhijqH2rxzWJrmWg0bFIwa3KVTJ54Y/yQAY8eYBivx8vJk+uuvMmPWbF5+1TQys5OTE0+NH8es2R/jWMGtIOw0hd+P8l8U2Wn+Xa0ySjqHpfke3n4Ox4w3ff/GjjENYGI6h68wY9bHvPTqG4DpHE4YP5aZs+fgYMNzqFbbk1vY70fe+SqPoCs7M42v3hlOp76P06nvY+Z0/8DGzHtvJAe3/Umb7uXz0u92Go3G/NxyK635d6Lw76Ber2fuN/Pp0aUTYfVCSr0/vV7P2zM/5vLVa3zwxstU87ZuXfJvJ1MhVIx/THDXoUMH1Go1n3zyCdeuXbMY6CDfzJkz+fXXX5kwYQKNGzfG1dWVjRs38uWXX5KTk2MR3N0+6qRarTZ/IUu7rdjY2GKbbuVLSkriyJEjNLqlWUu+22vVihv9MjQ0tND93So4OJiGDRty+PBhHilk1L6i9uHl5VXmQSLulLeHO3GJyVbp8UkpAFTLa9Jwu9Vbd3P5Rgwvjh3OjVjLZlWZWTnciI3Hy93V3JcgX3R8AkfOnGdwt47Y2f1jLul/BWe36oVOMZCZarpWnN1rFJrPwdEdlZ2GzDTra8qc1806b1rSDW5ePEjD1g+hUlkG+aZt2mPv6IZSadkUxdHFdE3nZKWWS3Dn6eVFQrx1073EvGZS3iV8D2/n6upK0/BwNm/eXGhwl5OTw65du2jWrBmehTTzKW+ent4kJlgfX1JeUz4vr2pl2p6LqytNwpuzbcsGc3C3aP7XNGjUlJq1ahEbYxo4ITU1JW8/icTFxlC9Rs27OYwieXoVf3yeZT0+Fzcahbdg55Z1/5jgzsvTq9BmkYl5TcG8C2l2WxxXVxfCw5uyectWc3AH0KRxYxZ89w2XLl0mOyeboMBAc3NBfz/rOcdsydmtOunJ1vejjGLuKf9kXp6eJCRYN70sOIdlvc+4EBHelE1btpqDO4CmjRvzw3fzijiHtmsC7upRndQk6/OVlhyXt/zuz9fx/etIT0mgYXPLfspBDVpi7+jCpXOHbBbceXt6EF9I09mEvK4l1QppcguwdtNWrl6/wZSnxhEdY9k0NTMrm+iYWDw83K2eZWZ99jW79x/ilSnP0Dy8CULcqX/Mk7BaraZnz54sWLCAtm3bUq2a9Y/zmjVrGDJkCGPHjjWnbd269Y72V5pt1ahRw/ywd6vb09zd3enYsSOTJk2yWldz24AgCsXdtTdesmQJx44dIzQ0lA8++IDWrVvj4GD5Zq7wB4JEqle3bhtvC/UDanPoZCQZmVkWg6qcPHfRvLww0fGJ5Or1jH3tQ6tlq7btZtW23Xz43JN0bmU5+eu6HfsxGo30+odNWv5v4O0bxvULe9Fmp1v0f4u5YporrJpvg0LzKZRKvGrVJ+6a9ZxwMVeO4uZVu9D+duePrASj0apJZv42q/mGEXvtBPpcrUXzrPy+No7O5RMYBQcFcezoUTIzMiwGVYmMNM0/GBRc9nmytDk5ZGZmFrpsz549ZGVl0cXGA6nkCwwK4cSxw2RmZlj0hTsbedq8vKxytDlkZhaM0hcXF0NcbAzjH7cedv/9t17GydmZH39ZabWsPNQNqsfJQo7v/NmT5uVlpcvJITOz+NFOK1JwUCBHjx0jIzPTYkCHM/nXaFBgmbep1WrJuOUc5lOpVAQHF8w1dvjwEQCaRZRtoua7Vd0vjKvn9pKTlW4xqEr0ZdP9qIZ/4fejf6rgoCCOHjte5DkMvoNzmFPKc3josOkza1bCIE93w7duGFGn95GdlW4xqMrVC8fMy+9Weorpeeb2we6MRiNGgx6DXn/X+yhKSFAAh4+ftDp/pyNNAzaFBAYUmi82Lp7cXD0TX3zVatm6zVtZt3krb7/8PB3aFHQj+er7hazZuJkJY0bRrXMHq3xClMU/qn70f//7H/feey8jRowodPnt/WT0er3VFAqlVZptNWnShNTUVPbv329Oy8jIYPfu3RbrtWvXjgsXLhAcHEyTJk0s/oWW41xWV65cYcaMGYwZM4avvvqK2NhYPvroI6v19u7dS1pamvnv3bt3k5ycTHh4xfxQ39umOXqDgb82bDenaXU6VmzZRaN6gdSsZnpbGR2fwKXrBUMl92jfkg+fe9LqH0C7Zo358LknaVTP+sdw3c591KrmRXhY2R9Y/+uCm/bCaNBzak/BYDv6XC2RB/6kRp1wXDx8AFONW1JslFXe2KvHib1a0PQ4KTaK6xf2Ehzem8KcO7wCFw9ffAKtR10ECI7oi9GgJ/LgX+a0XF0O5w4tx7NmCM7u5VMT1L5DBwwGA6tXrzan6bRa1q9fT2hoqPlFSGxsLFevWo7uWtgItzExMRw5coSQeoUHFVu3bMHe3p527dqVS/lL0rZ9ZwwGA+tWLzen6XRaNm9YTb3QBlSrbnqjHhcbw7Wrly3yJidbDxIQG3OT40cOERJScD97cuJzvPjq2xb/+g4wzcc2cvSTPPuc9YNNeWnd/l4MBj0b1/xtTtPptGxdv4qQ0IZUq266TuJjo7l+2/GlFHF8J44eICjk7h9Gy0vH9u0xGAysWl0wrYhWp2Pdhg2EhYZS45Zr9EoprtHomBiOHDlKvZDiA9/klBR++e13AgMDbBoYFKZeRG+MBj3HdxXcj3J1Wk7u/YNadcNx9TTdj1ITb5AYY7tRIMtLx/bt8s7hWnOaVqdj7YaNhIXWv+UcxnHl6jWLvEnFnsPif+vyz2FQYADNbRigN27ZE4NBz75NBZOl5+q0HNj2J7WDm+LhbTpfyfE3iL0RVdRmilXNJwCAo3tWWaSfOrQJbU4WvgG2C/g7tWuLwWBgxdoN5jStTseajZtpUL8eNaqbKiFi4uK4cq1gMvWundrz9svPW/0DaH1PM95++Xka1C/4Hv78x98s/XM5j/zvPh4cWLH9lyuaTIVQMf4xNXdgGgTliy++KHJ5u3bt+PXXXwkJCcHT05OffvrJoqllWZRmW506daJRo0ZMnTqVKVOm4Obmxrfffouzs7NFDdyoUaNYvnw5jz76KCNGjMDX15fExESOHj1KzZo1GTVqVKnKdPLkSavmpK6urgQHB2MwGHjxxRepU6cOTz/9NBqNhldeeYWXX36Zbt260aZNG3MeZ2dnnnjiCZ544gnS0tKYNWsWTZs2rZD+dgCN6wXRrU0LvljyB4mpqdSuVYOVW3dzMy6eV8YXBO7TP/uew6fOsueXeQAE+PkQ4OdT6DZ9a1SzqrEDuHDlOucvX2PE4N53XStaEeo+9QhqdzccfE0P1zX63YuDXy0ALn2+iNzUiq05qFknnOCmvdm7+mOy0hNxr1aHyAN/kZZ4nS7/e8e83qafX+RG1H6enFkwtHWjtsM4tfdXVs0fT3jnx1Gq7Di2bQFOLt6Ed3rMal8J0WdJuBlJs3ufKPJcNWozhNN7f2P7n2+THHcJVw8fzh5aRlryDfo89mW5HXdYWBgdOnZkwYIFJKek4Ovjw4aNG4mJiWHSs8+a1/to1iyOHz/OqluCwKeefJLwiAiCgoJwdXHh+o0brFu7Fr1ez2OPWR93WloaBw4coH379jg6Olott4X6YQ1p16ELi3/4htSUZGr5+LF541piY6J5alLBAE+fzn6Pk8eP8sfKLea0yRMep2l4cwKCQnBxceXmjWtsWLcKvT6XR0cVtHSIaN7Sar/58/w1ahJOSD3bBUr1QhvRpkNXfv7hK1KTk6jp68+2jauJi73JuEkFgzF9PvsdTp84zM8rdprTXnh6OI3C7yEgsB7OLq5E37jK5vUryNXnMmzUkxb7OX3iCKdPHAEgLTWZnJxs/vh5AQANGkfQoHGEzY4xLCyUjh3a8/0PC0nJu0bXb9xETEwsUyY9Y15v5uyPOXb8BGtXFgTy4yZMJCK8KcFBQbi4uHDjxg3WrFtPrl7P46MsJ3x+7sVpNAgLw9fXh6SkZFatWUNWVjZvvfl6hfel9AkIp15Eb3Yun01megIe1epyat+fpCZcp8ewggmj1/74ItfO72Pyp5HmtJysNI5sWwTAjahDABzdvhh7R1fsHd2I6FSxk9ADNAgLpVOH9sz/YSHJKcm3ncOJ5vVm5J3DdSuXmdPGTZhIs/BwgoMCccm7z6xZt4FcvZ7Rt53DqS++RMO8c5iYlMSqNWvJzsrm7Tdfs+k5rBMSTpNWvVjz6xzSUxPxrlmHQzv+Jin+Bg+MKfj9WPr1S1w8s58PFp0yp2VnprFz3WIALp8zna/d6xfj4OSGo7Mr7XqYup00aNaFmn4hbPrrS5Ljb1Anb0CVXet/wtWjOi07P2Cz42sYWo/O7dvyzcKfSEpOwc+nFms3bSU6No7nJxbcK97/+DOOnjjF5mW/mj4Xfz/q+BfepNmnRg2LGrvtu/fy9YIf8ff1oa6/P+s3b7NYv0VEU7yK6MoiRFH+UcFdSV577TXeeOMN3n77bRwdHbnvvvvo0aOHeVTM8t6WQqHgiy++4PXXX+f111/Hzc2NESNGcPHiRU6fLphvx9PTk6VLlzJnzhxmzZpFcnIy3t7ehIeH06NHj8J2X6gxY8ZYpbVt25YFCxbw7bffcvz4cX777TdzU8/777+fjRs38tJLL7F8+XLzYCw9evSgVq1avPHGG6SmptKuXTumT59e5s/obrz+9OPUWvo3a7btIS0jk5A6/nz04kSaNaxfrvtZu8M0QWvPDv+OUTKDJj+OU4C/+W+f+3vhc79p8JDrPy2r8OAOoOvQD9m39hPOHlpGTlYK3j6h9Hn8S3yDrB/eb6VxcGHQ+IXsXP4+hzZ+idFowDeoFe0HvoSji3VfknOHTA+f9ZoVPdy8ndqBgeMXsGfFTM7s/51cbRbevg3o+/hX1Akt35cTzz33HIsWLmTTxo2kp6cTGBjIm9On06RJ8X0d+vbrx/59+zh44ABZWVl4eHjQvHlzHhoyhMBA65rl7du3k5ubS5cuXcq1/CV5ZupLLFlUky2b1pGRnkbdwGBefuN9GjUu/k1+r74DObh/D4cP7iMrKxN3D08imt3DA0MepW5AULF5K9JTU17llx9rsn3zWjLS06gTEMwLr88sMeDq3uc+Dh/YxdGDe8jOysTN3ZOmzVox+KER1AmwbI574uhBfl8y3yLtlx+/AeCBYY/bNLgDeGHqFH5Y9CMbN20mLT2dwMAA3nrjdZo0Ln7gqP59+7Bv/34OHDyUd42606JZM4YO+R+BAQEW69YLCWH7jp3EJyTg5ORE82YRjHz0UXx8atnwyIrWe/gMdq2cw+n9y8jJTKGabyiDxn2Ff0jx96PszBR2rfzEIu3gJtO5c/Pyq5TgDuCFqZNZsGgxGzdtIS09naDAAN5+4zWaluocHuDAwUNkms9hBMOKOIfbbjuHox59pELO4UPjPmD9759yeOcysjJTqVU7lFFTviAorPg5IzMzUln/+6cWadtXLwDAo5qvObizs9Mw7rVFbPrrK84c2crRPauwd3CmUYtu9Prfszi72rYP88uTn2b+4p9Zv2UbaekZBAfU4b3XphHeuGHJmUvhwkVTy4JrN27y3sdzrZZ//O6bVSq4kwFVKobCaDQaK7sQ/yZarZZ+/fpxzz338P7771d2cax07dqVLl268Prrr5frdpOO3lnfxn+LXfeMLXmlf7lzv9/9hLL/ZAMalzwh8L9ZtqFiav0qk9ZY+Ei6VYWnouR5zf7N1lwo35d3/0R9giNLXulf7FBi1e7e0Nr9ZMkr/cv5hjYteaVKcu3p/1XKfv0/+7VS9ltZ/lU1d5Vh6dKlGAwGAgMDSU1NZcmSJVy/fp3Zs2dXdtGEEEIIIYQQwkyCuxLY29szb948rl83dZYNCwvj66+/LrHplhBCCCGEECLPv2BshKpAgrsSDB48mMGDB1d2MUpt06ZNlV0EIYQQQgghRCWQno1CCCGEEEIIm/q3ToVw4cIFHnvsMSIiImjfvj0zZswo1Wj9SUlJvP7663Tp0oWIiAj69+/PkiVL7ro8JZGaOyGEEEIIIYS4TUpKCiNHjiQgIIC5c+cSExPDBx98QHZ2domDF06aNImoqCimTJmCj48P27Zt480330SlUvHQQw/ZrMwS3AkhhBBCCCFs6t84FcLPP/9MRkYGn332GR4eHgDo9XqmT5/OuHHjqFmzZqH54uLi2Lt3L++//z73338/YJre7Pjx46xcudKmwd2/71MWQgghhBBCCBvbtm0bbdu2NQd2AH369MFgMLBz584i8+Xm5gLg6upqke7i4oKtZ6GTmjshhBBCCCFEldStW7dil2/cuLHIZVFRUTzwwAMWaW5ublSvXp2oqKgi8/n4+NChQwe++uorAgMDqVWrFtu2bWPnzp3MmjWrbAdQRhLcCSGEEEIIIWyqPAY3qWipqam4ublZpbu7u5OSklJs3rlz5zJ58mT69esHgEql4tVXX6VXr142KWs+Ce6EEEIIIYQQVVJxNXO2YjQaeemll7h06RIfffQR1atXZ9euXbz33nu4u7ubAz5bkOBOCCGEEEIIYVP/xgFV3NzcSEtLs0pPSUnB3d29yHxbtmxhzZo1LFu2jNDQUABat25NQkICH3zwgU2Du3/fpyyEEEIIIYQQNhYUFGTVty4tLY24uDiCgoKKzHf+/HlUKhX169e3SG/QoAGxsbFkZWXZpLwgwZ0QQgghhBBCWOnUqRO7du0iNTXVnLZmzRqUSiXt27cvMp+fnx96vZ7IyEiL9JMnT+Lt7Y2jo6PNyizBnRBCCCGEEMKmFEpFpfy7G0OHDsXZ2ZkJEyawY8cOfv/9d2bMmMHQoUMt5rgbOXIkPXr0MP/dqVMnfH19eeaZZ/j777/ZvXs3M2fO5M8//+TRRx+9qzKVRPrcCSGEEEIIIcRt3N3d+eGHH3j77beZMGECzs7OPPjgg0yePNliPYPBgF6vN//t4uLCggUL+Pjjj5k1axZpaWn4+/szbdo0Ce6EEEIIIYQQ/27/xqkQAIKDg1mwYEGx6yxatMgqrW7dusyZM8c2hSqGNMsUQgghhBBCiCpAau6EEEIIIYQQtvUvnArh30g+ZSGEEEIIIYSoAiS4E0IIIYQQQogqQJplCiGEEEIIIWxKofh3DqjybyPBnSiVIbPcKrsINtX39zOVXQSbq/dAWGUXwaa+nnuksotgU2lpOZVdBJtr28qjsotgU2fOu1Z2EWzq7LGoyi6CzZ0L9a/sItjU6J4xlV0Em3p1ca3KLoLNzX+jsksgKpsEd0IIIYQQQgibUsiAKhVCPmUhhBBCCCGEqAIkuBNCCCGEEEKIKkCaZQohhBBCCCFsSqGUAVUqgtTcCSGEEEIIIUQVIDV3QgghhBBCCNuSAVUqhHzKQgghhBBCCFEFSM2dEEIIIYQQwqakz13FkJo7IYQQQgghhKgCJLgTQgghhBBCiCpAmmUKIYQQQgghbEqhkDqliiCfshBCCCGEEEJUAVJzJ4QQQgghhLAtGVClQkjNnRBCCCGEEEJUARLcCSGEEEIIIUQVIM0yhRBCCCGEEDalUEqdUkWQT1kIIYQQQgghqgCpuRNCCCGEEELYlEIGVKkQUnMnhBBCCCGEEFWABHdCCCGEEEIIUQX855tlDh8+nPj4eP7++280Go3FsmeeeYajR4+yatUqnJ2dbVaG0NDQQtM1Gg3Hjx+/6+1v2LCBCRMmsHHjRvz9/e96e+XB2UnFE0N9adfCHQd7JWcuZDLvp+ucv5xVbD6FArp38KLDPR6E1HXE1UVFdJyWLXuS+HVVLDqdsdzLqs/Vsm/tp5w99Dc5mal4+4TSqvckatdvX2Le9JQYdi17n6tnd2I0GvALbk37gS/h5l3bvM6Z/X+w+ZeXi9xGt2Ezqd98gEXa+SOrOLb9BxJunkWpssOzZjCtej+Lf0ibOz/Qu6RydiJo6mg8WoXj0bIJGi8Pjo6exrWFf1ZamW7noIF+bdQ0ClShsYOrsQZW7NZxPb50100NDwUD2qkJ8FGi18PpK3pW7NKRkV2wTnUPBS3DVNT3V+HtpiBHB9fjDaw/oONanOV+qrsraNPIjto1FPhVU6K2U/D+4myS0u78Ona0V3BfZwci6qnR2Cm4FJ3L75uzuRqrL1X+Wl5KHuzqSLCfHXq9kRNRufy2OYv0LOsyVfNQMrC9A2F17bDXKEhON3DwjI5lO0wfiAJo3UhDs/pq/GuocHZQkJBi4MAZLev355BbuiIVKVenZduyTzi+52+yM1Op4RdK58HPEtSw+O9mQnQUh7b+zPWLx4i+chJ9rpYJ723Eo1rx98ek2Ct8/WY/9LlaHnv5N3wDmtxV+R000LulHY3qKlHbwbU4I6v25XIjoXTnv7q7gn5t7KhbU4HeAJFXDazam2txPYLpPHRooqJ1AxWujhCfamTrUT3HogwW6/lXU9C8vora1RXU8lKgUip4+bucQvdtr4Z7I1Q0rKvE3VlBejYcalSNX9ckEZ9U9hPr5Khk+EAvWjV1xl6t4PyVHH74K4GL17Ql5g2pY0+X1i7Uq+tAXV8NdioFD06KKnTd3z4JKjT9x+UJ/LUhpczlLoyDBvq31dAkyA513n1m2U4t1+MNJWcGangqGNReQ6CPCr0eTl3Ws2xnjsV5reGhoFUDO+rXVuHtpkSrM3It3sDafTquxVnvJyJExb3N1NT0VJKjg5OXclm5W2t1rZSVTqdlyaLv2bJ5PRnpadQNCOLhEaOJaHZPsfn27NrO2tXLuHzpImmpqbi7u1M/rCFDHh5F3YDAIvPdvHmdSU8+hk6nY+acrwipV/jz091ytFfwUA8XmofZo1EriLquY+m6dK5E55Yqv081FUN7uVCvjppcPRw7q2XpujTSMi2/2+4uSgZ3caZhkAZ3FyXJaQYOR+awYnsGGbfdc7u2dKRrS0eqe6pIzzSw72QOf25OR6srt8O2PYXUKVWE/3xwN336dAYNGsS3337LU089ZU7ftm0ba9eu5fPPP7dpYJdv+PDh9O/f3yJNWUVHFVIo4J2pQQTVceTXVbGkpOUyoFs1Zr5SjwmvRXIjpvCHCQB7jZLnx9bl1LkMVmyKJzk1lwYhzgy/34eIhq688P75ci/vpqXTiDq2jiYdR+BRrS5nDvzJqu/GMXD8D/gEtigyny4ng2VfjUCbnU7zruNQquw4tv0H/vpyOA9N/hMHZ08AfINa0m3oDKv8R7cvIOFmpFXAtn/dXA5s+ILgJr0Ivec+DIZcEqPPkZESU74HXkaaap7Uf+1pMi9fJ+1YJN5dWldqeW6nAB7vq8HHW8nWI7lkZBtp28iOcQPt+fT3HOJTin+gdneG8YPsydYaWbNXh0atoHO4HT5eSub+kYM+73mqVZiKlg3sOBGlZ/dJAw4aBa0bqphwnz3frdRy/nrBg1edWkraN1YRk2QkNtmIX7W764+gACY84IxfdRUb9meTnmWkU4Q9k4e68P7CNOKSi3+49HBRMGWYC1k5RpZtz8JeraB7S3t8q7vw4aI08zEC+NdQMXmIC8npBjYcyCEjy4inmxJP14Jj0KhhZF8nom7ksv1oDmmZRoJ8VfRv70BoXTvmLM24q+NdvmAaZw6upVX3EXjWCODYrj9Z+ulYHp36A7XrFf1weS3qCPs3LaKaTwjVfIKJuXq6VPtb/8t7KFV26HNLDjhKogBG9lRTy0vB9uN6MrONtG6gYkxfNZ//rSMhtfjr0c0JxvZTk62DdQf0aNTQsYmKmp5qvlymszhXPe5R0SXcjn1n9FyLN9CwjpKh96oBnUWAF1pbyT31lUQnGklMNVLdo/DrUQE83kdNDQ8Fe0/riU8x4u2moG2ECxFhTkx67yrZOaV/QaFQwMtja1HXT8OyTcmkpRvo1cGN6RN9eWHWNaLjin+gbt7QiW5t3LhyQ0tMvA6/mppi1z96JpMt+9Mt0i5eK/p3pywUwJh+DvhWU7LlsI6MbCPtGqt5arADH/+aVYr7jIIJgx3J1hpZtUeLvVpBlwg1Pt4OfPJbtvm8tm6oplWYHcejctl1IhcHjYK2jex45gEHvlmRzblrBee1bSM7Huxsz9mrepbt1OLuoqBjUzW1qyv55Pfsu3rJ8unsD9m9cyv9Bz2Ir68fmzas5Z03pvHW+x/TsFHRLz8uX4rCxcWV/gMfwM3NjaSkJDauX80LU57kg1mfERgUUmi+7+d9gUqlQqezXUSjAJ592J3atexYsyuT9Ewj997jyIujPJg+L4nYxOI/ME9XJdNGeZKZY+CPjRnYaxT0aueEf00P3v4myXwO7dUKXhntib1awaYDWSSm6Kldy45urRwJC1Dz1rwk8q+WB7s707e9M/tPZrNhbya+1U3r+VVXMXtx+byUEFXHfz64CwoKYty4cXz11VcMGDCA2rVrk5OTw9tvv023bt3o3r27zfadnZ2Ng4MDAD4+PkRERNhsX/8kHVt60Ki+C29/epHt+5MB2LY3mfkzGzDi/lp88OXlIvPm5hp59q2znDpX8FC4eksCMfFaRj7gQ7NGrhw+mVZuZY25cozzR1bRtt/zRHQZDUD9FoNZ+tEAdq+cyf1P/1xk3hO7lpASf5kHnvmVGrVNP3J1wjqx9KMBHNn2PW36TAHAzbu2RU0eQK4um21/TscvuDVObtXN6dGXj3Bgwxe06/8i4Z1Gldtxloecm7Fs8G9PTkw87i0a02HP75VdJAtNglUE1FKxaF0Ox/MeaI9d0PP8MAd63GPHko3FPyzc21yNxg4+/V1LcrrpJ/dqrIGxA+y5J1TF3tOmH/wj5/WsP5CL9pbn0f1ncnluqGk/568XBAanLul5I0pPjg46hdvhV+3uXug0C1UT7GfHvL8zOHzWdDwHz+iYPsaVAe0dmL8ys9j8vds4YK9W8P7CNHPt4aVoPZMecqFtYw07jpnKrgBG9XUiJlHPx0vT0RXx7J2rh5mL04i6UfAwtPMYJKQYGNDBkbC6dpy5XLo34be7fvEYp/avpNuDL9Cmp+m72bTtYOa92Z+Nv89i1LSiv5v1w7sS9sl+7B1c2LPuu1IFdxdObifq1A7a9BrDzpVf3lGZb9U4UEndmkp+2qjjxCXT9Xj8ooEpD2ro3lzF0i3Ffy5dIuxQq+Gzv7Wk5N0Or8UZGN1HQ/N6SvZHmrbp5gQdGqvYfUrP8t2mbR6INPBEPwW9W9px/KIWY94T5N7TerYe05OrhwFt7ajuUfi+a9dQULu6kmW7dOw5XRBEnDiZyISHa9A01JF9x4q/1m7VJtyZsCAHZs2PYc9R08HsOpzOp6/WZkgfLz5ZGFts/rU7U/lrYzJanZHRD3iXGNzdiNWx/UB6sevcqabBKgJ9VPywJptjUfn3hFymPexEr5YaFm8oPojs1sJ0n/n412zzfeZKrJ7xAx1pGWbHnlOmc3j4XC5r92kt7jP7Tut4YZhpP+eumarkVEro21rDhet6vl5eUE13KdrAmH4OtGlox47jd/YdPBt5mh3bNjHy8fEMfmAIAF269WLSU4+xcP7XfPDRZ0XmHfLwSKu0Hr36MmbkQ6xZtYwnn55itfzwwX0cPrSf+x4cyq8/L7qjMpfGPQ3tqVdHw+e/pHDwtOl87T+ZzXtPezO4izPz/kgtNn+/jk5oNAqmz0smMdX0/bh4XcdzIzzpEOHA1kOm8xARqqGah4o5PyVz7FzB70JGlpFBnZ2pXcuOK9G5uLso6dnGiV1Hs/j2r4Lnm+gEPY/2dSW8voajZ+/+hVNFkAFVKkbVrBoqo7Fjx+Lr68v06dMB+Oqrr4iPj+f1118nOjqa5557jtatW9O0aVMeeeQRTpw4YZH/r7/+YtiwYbRq1YqWLVsyfPhwjh07ZrHO3LlzadasGceOHWPIkCE0adKExYsXl7qM+fkjIyMZNmwY4eHh9O/fn+3bt1usp9PpePfdd2nVqhUtWrTg5ZdfJiPj7t6Ol7eOrTxITNax40CyOS0lLZdte5Np18IdtV3RX/5cvdEisMu3M29bdXzty7WsUcfWolCqaNhmiDnNTm1Pg1YPEHP5COnJN4vOe3wtNWo3MQd2AJ41gvAPacOFo2uK3e+lU5vR5WRQ77bmmMe3L8TJtRpNO4zAaDSiy/nnnFuDVkdOTHxlF6NITYKUpGUaOXFLTUVGtinAaxSgQlXC3bBJoIrTV/TmBy6A89cNxCUbaBqsMqddjzdaPHABZObAxZsGanha7iQrB3LK8QV08/pqUjIMHDlbsNH0LCMHI3U0DVFjpyomM9CsvprjF3QWzULPXM4lJlFPizC1Oa1BgB1+1VWs3JWNLhfUdqbal9vpDVgEdvmOnDOVr5bXnf8EnTm4BoVSRbOOlt/N8A4Pcj3qMKmJRX83HZ09sHdwKfW+9Lk61v/8Li27jsCzep07LvOtGgeYrseTlyyvx+MXDTSooyzxemwcoCTyisEc2AFcuGEkLtlAk8CCE92grhI7lcL88iHf3tN6PFwU1KlRcOLSsylVLY593qWQflsr+qQUU2attmzNittGOJOUmsveYwUHk5phYNfhDFo2dirxuk1J06MtY5N8jVpR7G/NnWoabEdqpoHjUQUfZEY2HL2QS6PAku8zTYPsOHXZ8j5z7pqB2CQD4cEF7+OvxRmKuM/oLe4ztbyUODkoOHLecuXTl/Vka41EhNz5O/7dO7eiVCrp2aeg1ZFGo6F7z75EnjlJfFzxQfnt3D08sbd3IDPDOvDOzc3lu3mf0X/Q/dSq5XvHZS6Nexrak5Ku59DpgkA8LdPI/lM5NAu1L/F6bNHAgWNnc8yBHcCpizqi43Np2cjBnOZob7r+UtMtW1SkpOV9j/Ku6WB/tek7fMLyxcC+E6YgsdUt2xQCJLgDTDejt956i+3bt/PFF1/w7bffMmnSJBwdHXn44Yc5c+YMr732GnPnzsXR0ZGRI0eSkJBgzn/t2jUGDx7MJ598wqxZs/Dx8eGRRx7h4sWLFvvR6XRMnTqVgQMH8s0339C+fUG/EIPBQG5ursU/g8Fglf+5557j/vvv57PPPsPLy4tnnnmGpKQk8zqzZ89myZIljB49mjlz5mAwGPjoo49s9MndmZC6jpy/nGl+W5wvMioDB3sVfrXKHqB5eZieNvJviuUl/sZpPKoFoLntQbBG7abm5YUxGgwk3Iykun9jq2U1ajclNeEK2uyi3xyfO7QcO7UDQY17WKRfO7+bGv5NOLZzEQvebMu3r7bgh7c6cnznj2U9tP8cv2pKrscbuP0R8GqsAY1aUWQTNAA3Z3B1Ulj1mQO4EmvAtxQ1bq5OkJld/n1Cb1W7poqrMXqrY7x0U4+9RmEVXN7K3UWBm7OSyzHW36FLN/X41yh4ogkLMD0Q5uph2nAXPp3swSfPujO6vxNODiU/MLs5m8pRWD++0oq5ehrvmgHYO1p+N30DTN/N6FI2tSyNfRt/IDszlQ79nip55VLy8VZwI6GQ6zHOdD1Wcy/menQCF0cF1wrpK3ot3oivd0FeX28lOTpTs1+L9fL6Zd26bmldjzeSozPSvYWKIB8Fbk4QWEvB8EFenLuczbGzxfedvl2gvz0Xr2mtfhPOX8nBwV6Jbw114RnvUJfWrvw4I4AlHwXy8Uv+dGhRfl0v/KopuR5nfV6vxBqwL/E+ozDdZ2Ktm09fiTXgV7009xmFRV+t/EBEV8hPoy7XVN47DXEvXjiPr19tnJwsP7969cNMy6NK7iaRkZ5OSkoyly9F8fknM8nMzKBJeHOr9Zb//Rvp6en8b+jwOyxt6dWpZcflm7lW5/DidR32GgU1vYuO7jxclbi7KLl4w7o2NOp6LnVqFQTTZy/rMBiMDOvtQpCfHZ6uSpqEaOjf0ZlDp3OITjCdNHVeFl2uZYnyg78A339RIzylsnL+/cf8i64I22rVqhX3338/n3zyCY0aNWL48OF8/vnnpKam8uuvv+Lt7Q1A27Zt6dWrF9999x0vvPACAE8//bR5OwaDgfbt23Ps2DH+/PNPpkwpaFqg0+mYPHkyffv2tdr/rFmzmDVrlkVa27ZtWbBggUX+5557js6dOwMQGBhIt27d2LZtG4MGDSI5OZmffvqJJ554gnHjxgHQsWNHHn30UWJiKrc/1q28PNQcj7SucUpINt0MvT3VXLpWtl7eD/WrQUamnv3Him8uUVYZqXEWzSLz5adlpBT+ZjI7KwV9rhYn12LypsZaBY0A2ZnJXIncTmDj7hbLczJTyM5IIvrSIa5f2MM93Sfg4unLmf1/sOOvd1Aq7WjUdugdHed/gauTgqgb1g9N+R3c3ZwURCcWHmy4OZkef9IyrJenZRpxdlCgUmLRz+lWAbWU1KmpZNPBO2v+VFpuzkrOXbXeR0rem2F3FyU3ihjUwT0v4EpJt16ekmHAxVGJncoU0NXwMD3cjBngxMlLuazdm4FfdRW9W9vj6aZk1k/FN3nr2cqerBwjJy/e+eeRnhKHi7v19ys/LT25bLUGxe1nx8ov6Pbgi1aB5N1wdVJwKbqw68n0XzcniEmyWmzOC5BWSHCclmnE6Zbr0dXRuobt1v3kb6ssMnPg58253NfejjF9C5pAHj6dyUfzYzAU37XTioebilMXrAuZlGq6Pjzd7bhys3yquM9EZbPrSDqxCbl4uavo1cGdZ0fUxMkhjnU7775Jv5uzgqib1uclNe/e4e6sJLqIPlv595nUzMLOqwFnB7ti7zOBPkrq1lKy4UDBZxWfYsBgNBJYS8n+MwXrVvdQmM+9o73pnJZVYlICnl5eVumeXqbnpcTEkltyvDj1Ka5fuwqAg6Mj/xs6nO49LZ+RkhIT+XXJIkaNHm8VSNqCu6uSs1esr7fkNNMH7+Gq4noRA1R5uBRzH03X4+JUcB+9Ea/nhxVpPNTDhVfHFHyOO45ksWBZwbV4M960r5Daas5cKihXvbqm756n638veBHFk+DuFmPHjuWPP/7gscceQ6VSsXPnTlq3bo27uzu5uaYfGaVSScuWLS1Gsbxw4QKzZ8/m8OHDFjV6ly5dstpHfmB2uxEjRjBw4ECLNBcXywcJpVJJ27ZtzX/7+/vj4OBgDtzOnj1LdnY2PXpY1vb07NmT/fv3l+ITqBgajRKdzvrGl59mrynbjWrogJo0b+zGpwuukpFZvjV3el02Kjvr/ht2dqbaxdzcwn8R9bq8/g6F5FXl5dXrCs8bdWwtBr2Oes0sm2TqtKansezMZHo8MpuQCNMPYHCTXiydPZCDG7+S4K4YahXkFvJQlN9fTF3M3dBOZXoIKix/7i359YV0e3B2gIe7q0lKNbLliG2DO41d4c3q8tM0xTRD09hZrnurgs9IQa7eiH3eZX05Ws+CvH58h8/q0OqM3Ne5+L50vVvb0yBAzZL1mWSVYdANqzJpi/huqvO+m7q7HAYwz6Y/ZuFRrTbNOvyvXLaXr6jrMVdv+kzs7BRgVXdQkBdAX8y5zr8e1XYK9Hrr7ZjXK6GJWVEysozcSDSw+7SR2CQjPt4KOjRyYMLD1floQdkCa41aYVUrAZhHP9aoy6/55Kuf3LD4e9OeND58zp+H+3uxZV96mZt33k6tKuo7aNpucfcZtZ3lurfSlXCfcXGER3vYk5hqZPPhggAgIxuOntdzT6gdMUkGjl/U4+6s4L6OGnL1RuxUec1T7+C7qM3RolZbfwfz07Q5JfcDe/rZF8nKzCAm+iYbN6xBm5ODwWCwGFBu4YKvqVnLh+69+pW5jHdCY1fE9ZiXpinuHOZdq7mF5s9bJ+8+CpCUauDidR3HzmtJSNZTv66Gbq0cSc808st600uyK9G5XLimo297J5LTDJy+qMW3uh3D+7mSqzea9ylEPgnubqFWqy3+m5SUxJEjR2jUqJHVunXqmPpdpKen8/jjj+Pl5cW0adPw9fXF3t6eV199lZwcy4d3R0fHIkferFWrFk2aFD+stoODg9V0DWq12ryfuLg4AHMtY75q1aoVu11bsVMpcHWxfHJISc1FqzWgVlsHcPlpOdrSv/bt3NqDUQ/6sHpLPCs2ln9/L5XaodCR8fKDuvwgr7B8QKF59Xl5VerC8549vBx7J3fqhHUsdJtKlZqgpr3M6QqlkpDwPuxfN5e0pBu4etq2P8I/nUppehN9q4xsU7Mku0LeGxQ0eSl6m+YH7kLy2xWTX20Hj/W1x16t4IuVOVZ9ZO6USgnOjpY/6GmZpr5+hfUHyU/TFvLAkS+/bIXlv71ZUP6x7j9jeX3vP63lvs6OBPmqCg3uWoSqGdDRgZ3Hcth25O4GAFBrivhu5r00sVPffT+U61FHOL7nbx6ZvADFHTbtUSoKHgZdHE3/Le56NL9IKOZc5TexUxVzrvPPkS7XiKqQjl7FNdcriacrjOmr5tdtueY+g6evwOlTiUx8tAbN9qZx+LR1TZydClycLAudmm7qL1dY/7f8h9a7DbiKk6uHNdtTGDekOkG1NZyJKl0VlkoJTvaWZU7PNprOa6HnxbRucfcZXa7lurcq7j6lsYPRfU2DIX2zIsvqPvPb1hzUdvYMbG/PwLzeIAcic0lI0dM02I6cO/x8NfYadDrr72B+msa++IFtAMIaFDxfdejUlYnjTQOtjBrzJACRZ06xddN6pr/7UbmPIG66j1puMy3TgDa3iOsxL624+3j+Cwm7QvPnrZP33Q6prWbSw+68+20Sl27mDZQTqSUrx8DAzs7sOJzFjbxau89/SeHJB914fJAbAHqDkXW7Mwmtq6FWtTt8Q1MJFIV1zhblToK7Yri7u9OxY0cmTZpktSw/yDpy5AjR0dF8/fXXhIWFmZenpaVRq1Ytizy2vqirVzc1R0pISKBmzZrm9Pj4yhnkomE9Z2a9Us8ibfjkkyQm6/DysL70vPPSEpJK1/ymeWNXnh9Xl31HU/nk+6t3X+BCOLtVL3SKgcxUUyDt7F6j0HwOju6o7DRkpsUVndfNOm9a0g1uXjxIw9YPoVJZ9jMxbdMee0c3lErLm7mjiymgz8lK/c8Hd3VrKRk/0DK6e39xNmmZRtycrb+DrsU0hcqXv8y1iPwZ2UarplIqJYzopcHHS8F3K7XEJJXfA2qQnx1ThlrW7L/ydSqpGQbcXawfgNyLaSqULyXDYLGuRX5nJelZBnONRHLedlJva6aa38S1sH53YXXtGNnXiRMXcvlpXdn6ZBXGxb06acnW3830FNP3y8Wj8O9mWWz8fSZ1Qu7Bo5o/yfHXAMhKTzLvJyXhBu7exX/fqrtBr4i8P9qZrssZS03TQrg6Wa+fn5ZazGCT+Z+zq2Ph12PmLddjWhYE+RS9n9vn3SqNFvVU2KngzBXL6+nACVOhQwMdCg3uQgMdmD7R8vN6cvoVklP1eLpZ/ybkpyWl2LbGOz6vS8DtgWdxAmopeWqwo0XaO4sySc0wmptX3ir/3pP/PStM6i1NxG/n6qQs8j4zqrc9Pt5K5q3ILrRpebYWvl+dg4eLFi9XBUlpRpLSjUy834G0TCPZd/iexcvTm4QE6+eLpERTCyYvr7K9WHZxdaVJeDO2bdlgDu4Wzv+aBo2aULOWD7Ex0QCkpqaY9xMXG0P1GjWL3GZxQmqreXGUp0Xa83PiSUkr/D7qkdf8MbmYvv3J6cXcR11M89Pl30e7tHAgNd1gDuzyHYnUMriLC8G11ebgLjnNwPvfJ1PDS4W7i5KYBD2pGQZmT3Ew980TIp8Ed8Vo164dy5YtIzg4GCenQn6FMU1nAAW1fQCHDh3i+vXr1KtXr9A8tlK/fn0cHBxYv349DRs2NKevW7euQsuRL+pKFi9+YNmhOjFFx4UrWTSu74JCgUUH+rBgZ7Jz9FyPLvnNaViwE29MCuTcxUzemXuxzH08SsvbN4zrF/aizU636P8Wc+UoANV8GxSaT6FU4lWrPnHXTlgti7lyFDev2oX2tzt/ZCUYjVZNMvO3Wc03jNhrJ9Dnai2apGWkmppBOTp7WuX7r7kZb2DecstrKC3TyI14I4E+psEDbn38qVPDNAFwXHIxwV2GafAP/+rWD111alj3Y1MAQ7qqCfFTsni9lqib5XuBXo/V88kvlv3aUjMMXI3VE+JvZ3WMAT4qcrRGYpOKCe7SjaRlGKhb0/oBN8BHxbVb+phcyRt0xeO2B5j8v9NvCxgCfFSMG+zMlRg93y7PwFAOcW7N2mFcitxLTla6RV+4GxdN381atQv/bpZFauJNUhKu8/nL3ayW/fr5k9g7uvLcJweK3UZSBqw3FYkrN0xP0elZcDPRSEBN6+uxdnXT9VjcfGipmXnXYyHzIvpXU3Dzlgf8mwkGWoaqqOGhsBhUpXbe4Bw3Szlh+q1cHBWgMNVK3vpYmV+TqCqk5gng0nUt0z+3HMU0OVXPpWs5hAU7WP0m1KtrT3aOgRuxtp2luaa36fc7Nb30D8k3Egx8tcwygDXdZwwE+hZ+n8kp8T5jJC3TiH8N68CgqPvMsG72hPibpngprE/xrZLTjeZROB004F9dybELdx4YBASFcPzYYTIzMyz6wp2NNA1mVNRcdcXRarVkZBb0yY+LiyEuNoZxjw+zWve9t17BydmZxb+suIPSw9WYXGYttOzYmpJu4Ep0LvXrqq3OYZCfmhytkZhigqnkNAOpGQYCCxnkJMjPzmISdDdnZaFjfeRXtBc2smpsot48z55vNRUerip2HCmfJugV4j84uEllkOCuGKNGjWL58uU8+uijjBgxAl9fXxITEzl69Cg1a9Zk1KhRRERE4OTkxPTp0xk7diwxMTHMnTvXouasNG7evMmRI0es0hs2bGjVFLMoHh4eDB06lG+++QYHBwcaNmzIypUruXLlSpnKUl7SM/WFzjm3fV8ynVp50uEeD/M8d24uKjq28mDP4VSLtu4+NUzHfjO24NVibV973p4aTEy8ltc+irJpk53gpr04unU+p/YsNc9zp8/VEnngT2rUCcfFw/RKPC3pBrm6bDxrBFnk3bPqI2KvHjdPh5AUG8X1C3uJ6Px4ofs7d3gFLh6+RU6OHhzRl5grR4k8+BcNWz8EmJqhnTu0HM+aITi739kbzKokS4vFROH5jkfpaRqsonGQ0jzPnZODaf67U5f1Fm/EvdxMD6eJt0wkfTxKT4v6Ktydc0nJq7EK8VNS3UPJ9mOWr74HdVATEWLH71u1nLhY/m8eMnOMhTZ7PBypo0Wohoj6avM8d86OClqEmqY4uLUvUDUP049s/C0Tmx8+p6NNIw2eeW/3AULr2FHTS8XGAwUB87HzOh7qaqRdEw17TmjND0Dtm5q+r6dvKVstLyUT7ncmMcXAF79nFNssrSzCmvdmz7r5HN6+1DzPXa5Oy9Fdf+AbGI6bl+m7mZJwA502i2o+wWXeR99H30KntXxwuhS5hwObFtHtwRfxrhVURM4C2ly4mWz6/ws3Cq6nExdNUxY0ClCa57lzsocmgUrOXDVYXo+upv8m3nI7PXnJQLN6StydMU+HEOyjoLqHkp0nC4KhU5cN9G1tmiA9f547gFYNVKRkGLkcW/b7Z3yKEaVCQZMgJYfOFRS0QwtTkF3UhOAZWQaOFzKS5u6jGbRt5kLrps7mee5cnZW0jXDm4MlMi+u2prfpsSUmoewXkpuzktTbas4c7BX06+xOSrqeqKulH1UkKweLicLzHYvKJTzEgSZBKvM8d84OEB5sx6lLlvcZ77z7TILFfSaXe0Lt8HBRmAOxen5Kangq2XbMsnz3ddTQrJ4dv27JsZh6oTT6tdGgVMC2Y3ceOLdr34m//1jKutUrzPPc6XRaNm1YQ/3QBlSrbqo9j4uNIScnB//aBdOIJCcn4eFh+TIyNiaaY0cOERISak57auJUqy4ux48eYuXyPxk1+kn8/C3niC2LzGwjpy5aH/+B0zm0bORA8wb25nnuXBwV3NPQniNncyyux+qepjcacUkFiQdPZ9Mu3BFPNyVJedMhNAhUU6uaHev2FAz6Fp2op3GIPaF11UReLihH6yamJuW3BoK3UwD/6+FCjtbIlgN33xJCVC0S3BXD09OTpUuXMmfOHGbNmkVycjLe3t6Eh4ebBy2pVq0an3zyCTNmzOCpp54iICCA6dOn8+2335ZpX4sWLWLRIutJObdu3WrVvLM4U6dORa/X8+2332IwGOjRowdTp041j+z5T7B9XzKnzmUw9Yk61PFzIDUtlwHdq6FUKlj4u+Vb3Q+nmd78jZhyCgBHByXvPx+Ci7OKX1fG0DrCzWL9G7E5nD5f+slzS1KzTjjBTXuzd/XHZKUn4l6tDpEH/iIt8Tpd/veOeb1NP7/Ijaj9PDmzYDiyRm2HcWrvr6yaP57wzo+jVNlxbNsCnFy8Ce/0mNW+EqLPknAzkmb3PlFkE95GbYZweu9vbP/zbZLjLuHq4cPZQ8tIS75Bn8fufmLlu1X3qUdQu7vh4Gv6Ua/R714c/EzX76XPF5GbapuJg0vjWJSeDtEGHuqioaZnLhnZRto2skOpgPX7LX9Exw4wBSkfLC54qNh0KJemQSrGDdSw43gu9moFncPtuJlgYP+Zgh/2Dk1UtGtsx6VoPdpcaFbPsibsxEW9OcBx0EC7xqbbcEAtU7DVrpGKLC1k5xjZdbJsD2yHzuqIupHLiD5O+Hhnk55lpHOEPQqFghU7LYOUZx8yPYi/Oq/gYWPNnmya11fz7BAXNh/MwV6joEdLe67F6dl9oiCATc0wsnpPNgM7OPL0/5w5ek6Hfw0V7Ztq2H9Ky+VoU7nt1TDxfy44OShYvz+HxsGWPzlxyQYuFjIPXmn4BYXToEVvNv8xm4zUBDxr1OX47j9Jib9O/xHvmtdb9v2LXDm7j1fmRZrTsjPTOLDZdL+9ev4QAAc2L8bByRV7Rzdadn0UgKBGHaz2m51l+rzq1G+Jb0Dx/aSLc+KSgSuxBh7oaEcNDz0ZOUbaNFChUMCGQ5afyeg+putx5i8F52DL0VwaB2oY01fDrpO5aOwUdGyq4maigYNnCyKI1EzYdVJPp6amkRavxRloWFdJYC0lSzfrLGrKPFygWYjpevXLqxW8N8L0d1K6kSPnTds9eE5PhyYqBre3w9dbT0ySEV9vJffU9+bKTS37jlmPhlycPUcyiLyYzYSHq+NfS01ahoFeHdxQKhUsXW1Zs/LGBFPQ/tRbBU3xq3na0bml6XoOrmNq+vpATw8A4hJz2ZY3YXnvju60bOLEwZOZxCfl4uGmomtrV6p52jH3x7hSzfFXkqMX9HSM1jOkqz01vXRkZBlp11iNUglr91u+BBo/0PQQ/+6PBQ/nGw/pCA+248lBDmw/pkOjVnBvhJobCQb2nS64T3Vsakf7Juq8+4yR5vVvu89E6c19w7o2U1PLW8mVGFNw2SRQRWgdO1bt1XK1kGkXSqt+WEPadejMjz98Q0pKEj4+fmzeuJbYmGgmTHrevN4ns9/n5PGj/Llysznt2QmjaRrejMCgEJxdXLl54xob1q1Gr89l+KgnzOtFNG9ptd+MdNP5bNQknJB6oVbL79aBUzmcv6pj9CBXfKurSM80cm9LR5RK+HuL5bX9/AgPAF74pGAwvRXbM7mnoQMvjPRgw94s7DUKerdz4mpMrkUt26Z9WXSIcGDSMHc27MsiIUVPaF0NbZo4cOKClqjrBed7WG8X1HYKrkTnYqc0BYCBfnZ891eaxXx6QoAEdxb8/f2JjIy0SKtevTrvvvtuETlMOnXqRKdOnSzSbh8Vc+LEiUycOLHQ/LfvszBF5T9wwLJJkEaj4dVXX+XVV1+1SB80aFCJ+6goBiO8OusCTwzzZXDP6thrFERGZTJz3mWuldAk083FjhrVTA86Y4b6WS1ftz2B0+fLt6ay69AP2bf2E84eWkZOVgrePqH0efxLfIOsf3RupXFwYdD4hexc/j6HNn6J0WjAN6gV7Qe+hKOL9fDR5w4tB6Bes/5Wy/LZqR0YOH4Be1bM5Mz+38nVZuHt24C+j39FndCORearKEGTH8cpwN/8t8/9vfC53zT4y/WfllVqcGc0wvxVOfRrq6Z9YzvUdqY5xX7ZrCWumCZw+VIyjHy1LIf+7dT0ba0m1wBnLutZsVtn8TY+f867gFoqAmpZN3F8f3G2uVbM0V5B71aWfSs7R5j+TkwzlDm4Mxrh898yuL+LA/c2t0dtp+BytJ4fVqcTU0yTzHxJaUZm/5zOg/c6MriTI3qDkeNRufy+OcvqwXf17hwys43c29ye/3V1JDXDyJrdOazcXfDw4uyoxMvN9Hnc19myfxLA7hNaLt6485cxAx+fwda/53B8zzKyM1Oo4R/KQxO/ok794r+b2ZkpbP37E4u0vevnA+Du7WcO7mzJaIQFa3X0aWVH20Yq1CrTHHW/bdMV2yQzX0oGfLNSR9/WdvS6xw69Ac5cNbB6b65Vv6y1+/Vk5UCrMBXN6ylJSDWydIuOo1GWK3q6KOjRwvKxIP/vqJsGc3CXlQNf/K2le3M7wmqraBUGmdmwaW8aP61ILHOQZDDCe19HM3yQF307uaNRK7hwJYfPF8eWqklmTW87hvWzvKfm/33yXJY5uDtzMZvQQHu6tXHFxVlFjtbA+cs5fLEkjhPnyqdpm9EI367MZkBbDR2bqLGzM82l+fOmnGKbZOZLTjfy+V9ZDGqvoW8bDXo9nL6iZ9nOHIvz6lfCfeadRZlo8+4zNxMNNA5S0ShAg0Jhaqr7w9rsu2qSmW/S1Jf5adF8tm5aT3p6GnUDg3nljfdo1Di82Hy9+w7k4P49HD64n6ysTNw9PIlodg8PDnmEugEl14jbktEIc35K5qEeLnRv7YTGTsHFGzrm/5Vaqv5tSakGPlyQxNCeLjzYzYVcvZFj57QsXZdm8d2ITtDz1rwk7rvXmbZNHXB3UZKcZmD1rgz+3mwZRF65mUuPNo60aWKP0QgXr+cya2GyxdQI/wYKpQyoUhEURuPt04YKYa3n8MOVXQSb6vu/iMougs3VeyCs5JX+xbbOPVLZRbCptLQ7mIjqX6ZtK4/KLoJNnTlftc/h2WPXK7sINlc3tGo3fR/dM6Wyi2BTsxZX/TqN+W/c/WBStpL+eeW0InOZMKNS9ltZqv5VLoQQQgghhKhcChlQpSLIpyyEEEIIIYQQVYDU3AkhhBBCCCFsS/rcVQipuRNCCCGEEEKIKkCCOyGEEEIIIYSoAqRZphBCCCGEEMKmFDKgSoWQT1kIIYQQQgghqgCpuRNCCCGEEELYlgyoUiGk5k4IIYQQQgghqgAJ7oQQQgghhBCiCpBmmUIIIYQQQgibUiilTqkiyKcshBBCCCGEEFWA1NwJIYQQQgghbEshA6pUBKm5E0IIIYQQQogqQGruhBBCCCGEELYlfe4qhHzKQgghhBBCCFEFSHAnhBBCCCGEEFWANMsUQgghhBBC2JYMqFIhpOZOCCGEEEIIIaoAqbkTQgghhBBC2JRMYl4x5FMWQgghhBBCiCpAau5Eqfz4kr6yi2BTaQ4XK7sINvf13COVXQSb6jwxorKLYFPdfhxd2UWwvWzvyi6BTeUkHqnsItjUlYmvVnYRbM7v5ymVXQSbeuyjqn18Xzq8WdlFqABLKrsAopJJcCeEEEIIIYSwLYU0GKwI8ikLIYQQQgghRBUgNXdCCCGEEEII21LKVAgVQWruhBBCCCGEEKIKkJo7IYQQQgghhE0ppM9dhZBPWQghhBBCCCGqAAnuhBBCCCGEEKIKkGaZQgghhBBCCNuSAVUqhNTcCSGEEEIIIUQVIDV3QgghhBBCCNuSAVUqhHzKQgghhBBCCFEFSHAnhBBCCCGEEFWANMsUQgghhBBC2JZCBlSpCFJzJ4QQQgghhBBVgNTcCSGEEEIIIWxLKXVKFUE+ZSGEEEIIIYSoAqTmTgghhBBCCGFbMhVChZBPWQghhBBCCCGqAAnuhBBCCCGEEKIKkGaZQgghhBBCCNtSylQIFUGCO2ETWp2O75b8xtotO0jLyCC4bh2eePh/tIxoUqbtTH7zfQ4cPcH9fXoweeyoItc7diqSCa+8BcDyH77Cw831bopfIp1Wy6JFi9i0aRPp6ekEBAYyYsQImjdvXmy+XTt3smrVKi5dukRqairu7u6EhYXxyKOPEhAQYF7v2LFjTHvxxSK3M2LECIYOG1Zeh2PmoIF+bdQ0ClShsYOrsQZW7NZxPd5Yqvw1PBQMaKcmwEeJXg+nr+hZsUtHRnbBOtU9FLQMU1HfX4W3m4IcHVyPN7D+gI5rcZb7qe6uoE0jO2rXUOBXTYnaTsH7i7NJSitdecqbytmJoKmj8WgVjkfLJmi8PDg6ehrXFv5ZKeUpjjZXz+ebDrLy6AVSs3KoV9OLp7u1oG2IX6nyrzkexeLdJzgbk4RapSSougcTurWgdZBvoesfuhzNY9+tBGDLi4/g6exQbsdSFK0ul89X7WDl/pOmY/StztP9OtI2LKDYfF+u2sFXa3ZZpWvsVOyfPdUiLS0rh2/X7WbTsbPEJKfj5eJE69C6jO/dHh8vt/I8HGsqOxza90XdqBUKe0f0cTfI2bGC3MuRxWZzHfsmSnfvQpfpk2JJ//btwnfnF4TLw5MBSP1sGsasjLsrfwl0Oi0/L/qObZvXkZGeRp2AYIaNGEN4s5bF5tu7axvrVv/NlUtRpKWm4ubuQf2whjz08GPUCQiyWPf7eXM5deIIcTHRaHVaqlevSbtOXRl4/1AcHZ1seXgmKjscOw/EvklrFA5O6GOvk7nlb3Ivni42m/vT76LyqFboMn1iDClfvG7+2+vVrwtdL3PTH2TvWnvnZS8jZ0clI++rTpsIF+w1Ss5dymb+77FEXc0pMW+9ug50betG/UBHAvzssVMpGPSk9XXetY0bk0b6FLmd2fNvsHV/2l0dR6mo7HDt8z+c7umI0tEZ3c0rpK36hZyzx0vMqqnfGNfug7HzqYNCpSQ39iYZO9aSdWCH7cst/hMkuCuFuXPnMn/+fA4fPlzZRQFg7969HD58mPHjx1uk/5PK+d6nX7Nl9z7+1783tX1rsXrTNp5/Zyb/Z+++o6Oo3gaOf7PJbnrvlCSEEloIvUsvAtJRQaQoKkqxAPZesfxEpQg2FBEVCwrSe+8lJLQQCJ30Xrdl3z82bFh2U4BsUN7ncw7nkDtzd2d2dmfmmfvce2e/8yrNGkdU6jW27TnA8bj4CtcrLi7m828X4ezkSGFRxReRqjBr1ix27tzJkCFDqFGjBhs3buTNN97gww8/pEnTpmXWO3/+PG5ubgwePBgPT08yMzJYv349zz37LJ/OmkV4uPHGpHbt2sx4/nmL+ps3beLw4cMVBpG3wg54tL+KYF8F26J15BcZ6NDEgYmDHJn9p5q07PIDKk9XeHKwI0UaA2v3aVEp7ega5UCwj4I5y9Toi43rtW1oT5tGDhxL0LPneDFOKjvaNbZn8lBHvlul4cyVYtNrhgQp6NTUnuRMAylZBmr63dmnfio/bxq8PoWCC1fIjYnDt1u7O7o95Xn9r+1sPH6O0R2aEuLrwYoj8Uz5aR3fPNKflqFB5dadv/kwX207Qu/GdRjUogG64mLOJGeSkmP9Zr+42MCHq/bgrHKgUKOzxe5Y9fqS1WyMPs3obq0I8fdmxb5jTFnwB99MHUnLurUqrP/qA71xcVSZ/ra/4alycbGBifOWkpCUzoP3tCDU35uLaVn8tuMIu0+e4+9XJ+Dq5Fjl+3WNc7+HUTZojubQFvSZqaiatsNl+FPkL52N/kpCmfUKNy/DTqUyK1N4+OB0z0B050+VUcsO554jMGjU2Klst0/XmztrJnt3bWXA4PsJrlGLLRvX8MGbL/DWzC9o1KRZmfUunk/A1c2d/oNG4OHhSVZmBps3rOalaRP54H/zCQuvZ1r3bPwpGjVpRvde/VGqVJw/G8/fv/9MbPQh3vloDgobD83uOmgcqoatKNq/ieKMFFTNOuA+ciq5P32K7tLZMusVrP8NO5X5AxKFpw8u3YegTbAMDLUJJ1DH7DUr0yddrJqdqAQ7O3h9ci3Cajry18YMcvP09OvixfvP1WbazAskpmrLrd+qqSu9O3lx4Yqa5DQtNQNVVtc7fqaQWd8nWpQP6ulNnZqOHI0rqJL9qYjXQ0/hHNWW/G1r0KUl4dKmKz5PvED6vPfQnCv74Ytjk1b4PDoN7YV4ctf9AQYDzs074D16MgpXd/K3ramW7b9jZECVaiHB3X/Q/v37WbhwoUVw929x4vRZNu3cw6RxDzFqyAAA+nbrzLhnXmL+j78w/8O3KnwNtUbDvB+W8NDQgXz3yx/lrrti/WZS0tK5r1d3fl+5tip2oVxxcXFs27aNCRMmMHzECAB69urFU08+ycKFC/l01qwy6z40erRFWd9772XsmDGsWrWKqVOnAuDt7U2PHj0s1v15yRJq1KxJg4jKBcg3I7KuPWFB9ixeryY2wRhgxZzV8/woJ3q3duCXTeVfnLu3VKJygNl/asjKMwaCl1KKeWKgI60j7Nl3Ug9A9Bk9Gw7quD4GOHBKx4yRxvc5c0VjKj9xXs+bCXrUWugS5UBNvzt7YVAnprCxVifUyWl4tmpK571/3tHtKUvs5VTWxiYwrU9bxnU2tpYPjKrH8HnL+Hz9AX58fGCZdWMupfDVtiNM79uOMR3LflBxvT8OnSI5J59hLSNYsvd4lexDRWIvJLL28CmmDe7GuJ5tARjYtinDZy7k8+Vb+XHawxW+Ru/mEXi7ld16E3P+KscvJvHyiF6M7FL6QCUswIc3f17D3rgL9IxqcPs7Y4V9UCiqRq0o3PoXmgObAdAe34/bI6/g1HUw+T9/VmZd3ZkYizLH9n2Nr3HioNU6qqiO2Ll7o4nZjWPr7lWwB+WLjzvBru2bGPPoUwwebsxC6NqzL9MmjWfxwvl88On8Muve/9B4i7Kefe9j4rjhrFv9NxOnzDCVv/fJPIt1A4Nr8ON3X3Lm9EkaNGxy+ztTBvsaYTg2aUvBxj8o2rsBAHXMHjwnvolzj+HkLvq4zLra00ctypw69wdAc2yfxTJ9erLV8urSsYU7jeo689HXV9h9JA+AnYdymf92HUYN9GPWQsuA7HprtmexbH0GGq2BJx4MKDO4S07Tkpxmfi1SKe14cmQAMXEFZOXoq2aHyqEMqYtLy45kL/+J/K3GbIWCAzsIeOFjPAY+RNrsN8us63pPH4pzskib9x7ojRfBgj2bCHjpU1zadL37gztRLSSEFlVu65592CsUDOpTeoPgqFIxoFdXjsXFk5yWXuFr/PzXSooNxYwaPKDc9XJy8/j259+ZMGoEbq7VkGID7Ny5E4VCQb9+/UxlKpWKPn37cvLkSVJTU2/q9by8vHB0dCQ/L6/c9eLi4rh69Srdu9vmxisyXEFugYFjCaUtZ/lFxgCvSZg99hWcLSLr2HPyot4U2AGcuVJMalYxzeram8qupBm4sXGnQA3nEosJ8DZ/k0I1qMuPKatVsUaLOjntTm9GhTYeP4e9wo7hrUsfAjgqHRjaMoKjl1JIyi77u/bTnmP4ubkwun0TDAYDBRUcgOwCNfM2HWJSj5a4O1m/IbOFjdFxxn3sGGUqc1Q6MLR9M46ev0pSZk6Fr2EwQF6hGoPBeqt0fkkmgK+7q1m5v4fxbyel7Z6PKiOaYyjWozl6XfqoXoc2dg8ONcOxc/e6uddr1IrirDT0V89ZLLNzcsGx832od63GoC68zS2vnL27tqFQ2NO73yBTmUrlSI8+Azh96jhpqck39XqeXt44OjqRn1/+eRQgINDYcl3ROfd2qRq2xFCsp+jwjtJCvQ519C6Uteui8PC+qddzbNIGfWYqustltNo6KMH+zjyz79jSjcxsHXuiSz/TnDw9Ow/l0q6ZGw4O5WddZOfq0WhvLd2+TaQbLs72bDtQ8W++KjhHtcOg11OwZ3NpoU5Lwb6tqOo0QOHlU2ZdhaMzxYX5psAOgOJiivNzMWg1ZdYT4mZIcFcFkpKSmDFjBu3ataNZs2aMHj2aY8eOma3To0cP3nnnHZYsWUL37t1p1aoVkyZNIiMjw2y9+Ph4Ro8eTWRkJH369GHFihVMmjSJMWPGAMbUy7lz51JQUEBERAQRERGmZdfExcUxatQooqKiuO+++9ixYwfVKf7cBWrVCMLVxTzYalS/LgBnzl0ot35yahpLlv3Dk2NG4ehY/s3itz//jo+XF4P69Ly9jb4JZ8+epWbNmri4mt/wRTQwPsFPOFt2qs01eXl5ZGdlce7cOb74/HMKCgpo3rx5uXW2bNkCYLPgrqafgitpxdx4eb2UUoxKaYe/V9kXZw9XcHexs+gzB3AxpZgalWhxc3eBgqI705fubnMqMZ1QX0/cbgi2mtb0L1meYa0aAPsTEmlS04+f9x6n20dL6PD+j/T8+Gd+2XfC6vrzNh/C182ZEa0bVt0OVMKpy8mE+vvg5myeQtg0NLhkeUqFrzHgna/o9OIXdHj+c17+cSXpN6SdNg4JwlmlZN7qHew7fYHkrFwOxl/ksxXbaBISRLuIsCrbnxspAmpRnJECmiKzcl2i8fxpH1Bx2un1r2XvF4zmpPVWO8fOAzDk56A5Wn19fs6djadGzVq4uJifR+s1aATA+YQzFb5Gfl4u2dlZXDh/lvlffERBQT6RUa0s1tPrdeRkZ5GRnkb04f388uO3ODu7UC+iUdXsTBkcgmpTnJ5seQyvngfAPrB2pV/LPrA29v410Bw/YHW5Y1QHvF+cjc/L8/Cc+CaqJuX3W6xq4bWdOHupiBufk8SfL8LJUUHNAKXN3rtrW3fUmmL2HqmGvnaAsmYYutREiwchmotnTMvLoj57AmVwbdz73Y+9XyD2vgG49R6KsnY4eZv/seVm/zvY2d2Zf7fp7NmzPPLIIzRv3pxOnTrx8ccfo9FULhhPTk7mxRdfpH379jRr1ox+/fqxYsWK296m8kha5m3Kzs7moYcewsXFhddffx13d3cWL17MuHHjWL9+Pb6+pZ3aN2/ezIULF3jjjTfIzMxk5syZvPvuu3z2mTG9pqioiEcffRQPDw8++eQTAObNm0dOTg4hISEA3H///SQlJbFy5UoWLVoEgJubm+k9tFotM2bMYOzYsUyaNIlvvvmGp59+ms2bN+PtfXNPCW9VekYWvlbey9fbC4C0jMxy68/9fgn1w0PpdU+Hctc7c/4iK9Zv5uPXn8e+omalKpSZkYGPj+WTuWtl6Rll3zhfM+2557h8+TIAzs7OjBw1ij59+5a5vl6vZ8f27TSIiKBGDesDWtwudxc7Eq4WW5TnFhiv1h4udiRlWA++PFyMJ8/cfMvluQUGXJ3ssFdg6nd3o7AgBSGBCjYfqr7+Wnez1LwC/NycLcr93I1lqbnW+6XkFKrJLCgi+mIy+xMSebJbC4K8XFl+OJ4PV+3BQaHg/jalQdzppAz+OHiKuQ/3wd7GfZdulJqTj5+nq0W5X0mrWmpO2a0yHi5OjOzSkqiwGqgc7Dl89jJLdxzh2IVEfpkx1hQweru58PEjg3jnl7U8MXepqX7HhnX4dMJgHGx43lG4emDIt2yJuFamcPOs9GupGrcGrKdkKvxroIrqRMGfC7C4M7ehzMx0vHwsB33xLinLyKi4hfzl6U9x9bKxX5mTszPDR46lZx/LbI+z8XG8Mv0p0981aoXw4hszcXe37YA4dm6eFOdZHsPivGwAFO43cQybGlOP1bGWqZfaS2fQnDhEcVYaCncvHFt3w23oY+Q7OqM+vP0Wt/7meHs4cDze8rySmW08p/t4OnDhatW3TLm5KGjZ2JV9R/MoVFfP91fh4UVxTpZF+bUy+3JaZPPW/4WDTwBuvYbg3meYsZ66iMwfPqPo2CFbbK64TdnZ2YwbN46wsDDmzJlDcnIyH374IUVFRbzxxhvl1k1JSeHBBx+kTp06vPvuu7i5uREfH1/pwPBWSXB3mxYtWkROTg6///67KZDr0KEDffv25bvvvuOFF14wrWswGJg/fz6qko7uV65c4auvvqK4uBiFQsGff/5Jeno6v/zyC7VqGZ/KNm3alD59+piCu6CgIIKCglAoFFZbeq4Fd127dgWgTp069OzZk+3btzN48GBbfhQmao0GlZV0JUelyrS8LIdjj7Nt7wG++ujtCt/ni29/pF3LKNo2L7vjvS2o1WqUSsunkMqS46pRVzyoy3PTplFQUEBSYiIbNmxAo1abvgfWHI2OJjMzkwcefPD2Nr4cSnvQWQm+tCXxVnkZaA72xuDOWn3ddfX1Vg69qxM81EtJZo6BrdES3FUFtVaPysHeotyxpEyttf45F2iMKZhZBWo+ur8790YaB/jp3bgOw+ct45tt0WbB3Uer99CpXi061qt8K1JVUWt0qBysnWccTMvLMrpba7O/ezWPoGloMC//uJKlO48woXd70zJvNxca1gpkZHhN6gb5EXclhe837eeNJWv436M2PKcqlRj0lvtg0JWkyTpUtiXEDmXDluiTL1GcYZnq6NxjBLqEE+UMtGIbmjLOoypl5c+jk599icKCApKTrrJl4+oyz6O1QsJ4471ZFBUVEnfyGLHRhygqsn36qZ1SRbHeSlqz6RhWNo3ZDscmbdAlXqQ4Pcliae6iT8z+VkfvwuOxV3HuPgR1zJ7S97MhlcoOrc4yuNKUlKlUtnkQ0rGlO0qlotpSMsF4XA1WPtNrZXbKso+rQadFl5pIUcx+CmP2Y2enwKVDT7xGTyZ9wQdoL1TcYv2fVs0PAavCr7/+Sn5+PnPnzsXLywswPnB/++23mThxIoGBgWXW/eSTTwgKCuLbb7/F3t54/e3QofyGi6rw3/uU/2V27dpFu3bt8PT0RKfTodPpUCgUtGnThthY8yFx27RpYwrsAOrWrYtWqyU93dgH7dixYzRo0MAU2AHUqlWLhg0rn+6kUCjMvji1atXCycmJ5OSb679wOxxVKjRWbh7VJfnkjirrJz6dXs8X3/5I366dTSmcZdm0cw/H4k4zebzlACW25ujoiFZreWLXlgStKseKR5pr1KgRrVq1YsB99/Hue++xZcsWfvj++zLX37JlCwqFgi5dutz6hpewV4Cbs/k/OzvQ6sHByhnhWlBXRjwAgE5vvIBbq+9QTn2lAzzS3xFHpR0/rNVY9MUTt8ZRaY9GZzmwgLqkzLGMSN2x5GA52Cvo3STMVK5Q2NG3aTjJOfkkZhlbxNbGJhB9KYXp996ZEUMdVQ5odNbOMzrT8pvRv3Vj/Dxc2RdXmjZ+OS2Lx+b8ypD2kTzWpwPdm9XnyX6dePX+3myIjmPnibJHrLxtWi12VvpP2V0L6ip5w25fux4Kd280VlrtlBEtsa9Zh6Kt1T+Vh6qM86hGW/nzaESjpjRv1Za+A4bw2jufsmPLBpb8YDktgIuLK81atKZth3sY8+hTDBz2IB+/+0qlUj9vh0Grwc7eShBuOoaVe3rvEFofhYd35QdMKdajPrgFhbMrDsEhldzaynGwBy8Pe7N/CjvQaAworfSrU5WUaTRlpG3cpq5tPMjJ03PomG2n7bieQasp/R1e51pZeX3nPIc/glOTlmT+OJuiI3soPLyL9PnvU5yThefQcTbbZnHrtm/fTocOHUyBHUC/fv0oLi5m165dZdbLy8tjzZo1PPTQQ6bArrpIy91tyszMJDo6miZNLEfcutbado2Hh3kKyLVAT13yhDIlJaXMdD91JZ5iAjg5OZkFkABKpbLS9auCr48XqemWqYnpmVkA+PlYT1lYt2UHF68mMuOpCSSmmA9KUlBYRGJKKt6eHjg5OvLlol/o3rEdSqWDad28fGNKSEpaOjqdrsz3uV3ePj6kp1mmDF3rP+lr5RiWx93dnWZRUWzZsoXHHn/cYrlarWb37t20aNGiSlJrQ4MUPDnI/MZp5pIicgsMeLhaXpzdS1IucwrKTnm5tsy9jPr5RQaLlEx7BYztqyLYx47vVmlIzpT+dlXF382FFCupl2m5xtYKf3frgw95Ojvi6GCPu5PKIs3Sx804LHtOkZpg3Phs/X76NKmD0l7BlUxjX5fcIuNNTVJOHlq9ngAPy7TJquLv4UpKlmXqZVpJvzl/DzeLZRUJ9HInu6C0RWf5vlg0Wh1dmpg/bOoWaRxqPzrhCp0bm8+rVlWK83Ospl7auRqvI9dS+yqiatwaQ3ExWiv97Zy6DUYbdwSDXo+dh/G8ZedoTN21c/cGhb3V1NCq4O3tS0a65eBTmRnGh50+PtbneCuLm7s7TaNasmPrBsY9Nrncddt17MKcT99n1/ZNZtMmVDVDXjYKKwPfXDuuxbmVPIZN22EoLkZdRn87a4qzjd0f7Jyq9jfYMNyZ96eZ39s8/upZMnN0eHta3lJeK8vIrvond37eDjSu58z6ndllpvzbQnFOFgpPy2uxwsMLAH1OGV1P7O1xadfN2Lfu+hToYj1Fp6Jx7dwX7O1Bb/sRP++YKuj/dit69ix/XIZNmzaVuSwhIYHhw4eblXl4eODv709CQtkP+I4fP45Wq8XBwYGHH36YI0eO4OXlxZAhQ3j22WetZi5UFQnubpOnpyf33HMPzzzzjMWyG4OsigQEBHDypOX8NRkZGbi62u4mqarVCwvlSOwJ8gsKzAZVOXHaONBIvTqhVuslp6Wj0+mZ9LJlSubarTtYu3UH77/0HF3atSYlLZ0N23ezYbvlRMQTpr9KvbAQvv9sZhXtkbm64eHEHD1KQX6+2aAqcXHGuW3C65bf6miNRq2moMB6P6i9e/dSWFhItyoaSCUxrZiv/zEP9nMLDFxNM1AnWIEdmA2qEhKgQKM1kJpVTnCXD3mFBmr5W564QwIUXE0zv/LaAQ/2UFKvpoIlGzQkJFbjlfn/gYhgXw6cTySvSGM2qEpsySAjDYOtP4BQKOyICPLh+NU0tDo9yutSO1NzjN9PbxdjkJeUnc/qmLOsjrEcQGjk/OVEBPnw26ShVbZPN4qoGcCB+IvkFarNBlWJvXAVgIa1Am7q9QwGA1czcszqpecWYMCA/oa+aNqSmy9dse2+t8Upl3EIqQ8qJ7MBORyCwwDQp1yu+EXsHVA2aI7+UrzVIE3h4YOqsQ+qxpaDb7iPexF9ymXyFn10y/tQnrDwehyLOUJBQb7ZoCrxcSdMy2+WRqOmoKDiFhytVktxcTEF+bZt7dElX8YpLMLyGNasA4A++VLFL2LvgKphC3QXTmOoZEAPoPA2BseGgqodEfTcFTVvfGG+3Zk5es5dUtO4njN2duZxS4MwJ4rUxVxJqfrU0C5tPFAo7Ko1JRNAe+U8rvUaY+fobDaoiiq0nmm5NQpXd2NrvJXURDuFA3YKhXHZ3Rzc/Qfl5ORYNM6A8f4/O7vs32RaSSPAa6+9xgMPPMCUKVOIiYlh9uzZKBQKpk+fbrNtluDuNnXs2JEVK1ZQt25dXFxubyj+pk2b8vfff3Pp0iVq1zaOonX58mVOnTpFq1alI4AplUqbd8a8Hd06tuXX5atYsX6LaZ47jVbLms3baNygLoF+xr6JyalpFKk1hNYyDhDSs3MHq4Hfqx9+RvtWzRnYuzuNS9I133/pOYv1Nu3cw+ade3n1mScJ8L251rOb0alzZ/7880/WrFljmudOq9GwYcMGIiIi8Pc3jkiYkpKCWq02HUuArKwss6Z9MI6kFB0dTb369a2+37atW3F0dKRjx45Vsv2FGswmCr8mNkFPs7r2NA1XmOa5c3Eyzn934oLe7Mmoj4cxiMvIMZjVb9XAHk9XHdklA6vUq6nA30vBjhjz7+vgzkqa13Pgz20ajp2TwK6q9WocxqJdsfx5MM40z51Gp2f5kXgia/kT5Gls1UrMyqNIq6OOv5epbt+m4cRcTmVFdDzDS0bAVGt1rI45S7i/l6k17rNRlk9C18YmsO7YOd4b1oVAG7bagbGf3KLNB/hz91HTPHcarY7l+2KJDA0myNt4MU7MyKFIq6VOYOngHRm5Bfjc0Hr5285oMvMK6NSojqksNMAbgwHWHznF4HaRpvK1h4wP4W42gLwZ2tPROLbthSqqo2meO+wdUEa2Q3f1HIbcLMDYwmanVFntT+cQ3hg7JxerKZkA+X99Y1GmbNgSVaNWFKz6keKS97CF9p26sWLZr2xYs8I0z51Wq2HLxtXUj2iMn7+xH0tqSjIadRE1a5deG7KzMvH0Mm85SUlOJDb6EHXrlU7/kZ+Xi6OTMw439M3ctG4lAOH1q36+0OtpTh7CuUMfnFreY5rnDnsHHKM6oLucQHFJC4/CwxuUKuPImjdQ1muKwtmVgjJSMu1c3CwDOJUjTm17UpyfaxpdtarkFxRz9JTlg8jdR3Lp1MqdDs3dTPPcubva06mVOwdi89Bd1x8vyM/YYpGUdnsBX5c27qSkazlxpnqm77im8Og+3HoMxKVDD9M8d9g74NK2K5rz8RRnGbN47L18sVM5oksxPnAqzs2muCAP58g25K753RTE2akccWrSEm3yFbCSqixuX3ktc7ZSXPLwr2PHjrz00ksAtG/fnvz8fBYuXMjkyZNxcnKyyXtLcFdJer2etWstJ8h+4IEH+Oeff3j44YcZO3YsNWrUICMjg6NHjxIYGMj48eMr/R7Dhw9nwYIFPPnkk6bJrOfOnYufnx921zVl161bF51Ox6JFi2jRogVubm6Eh9smNehWNGlQj+4d2/HVT0vJzM6mVnAQa7ZsJzEljRcnl6YdvvfFAqKPn2THX0sACK1VwxTo3ahGgD9d2pUOgnD9/6+5NsVC+5bN8fJwr8pdMtOwYUM633MPP/zwA1nZ2dQIDmbjpk0kJyfzzLPPmtb79H//IzY2ltVrSiclnfTUU0Q1b054eDjubm5cuXqV9evWodfreeSRRyzeKzc3l4MHD9KpUyecnS1HP6xKMQl6OicV80A3FYHeOvKLDHRo4oDCDjYcME+peWKgsTXowyWlLYCbD+toFm7PxEEqdsbqcFTa0TXKgcT0Yg6cKn0S2TnSno5NHTifpEejgxb1zXPRj53Tm/rnOamgY1PjaSosyPi0s2MTewo1UKQ2sPt49T/hDJ00GqWnB041jDf2AQO641TTOG/W+XmL0ZUzSmN1aVY7gD5N6jB74wEy8gup7evBP0fiuZqVy1tDOpvWe23ZNg6eT+LoOxNMZSPaNGTZ4Tg+WLWHC+k5BHm6svLoGRKz85j9UG/Tej0ahVm8b1zJFAud69fG29U2F61rmoXVoE/zCGb/s52MvAJq+3nxz/7jXE3P4a1RpXNQvvbTKg6eucTR2aWDW/V7awF9WjakfrA/jkoHjiRcZu3hk0TUDGBEp+am9Qa3i+THzQd499f1nLqcQt0gX05eTuavPTHUDfajZzPbTGAOoE+8gObUYZzuGYTCxR19Ziqqpu1QePiSv/Zn03ou/cfgEFKf7E+mWryGqlFrDDot2tPRVt/D2mTn9gE1jcvOncBQaLuWrQYNG9Ohc3d+XvQ1OdlZBAXXZOumtaQmJzHpmRdN682Z9T4nYqP5Y1XpqI/TJo8nMqoVYeH1cHVzJ+nqZTatX4Ver2P0+Imm9Y7HRrPwqy9o36kbwTVqodNpOXk8hn27t1O3fkO6dO9js/0D0F89j/rEQZy7D8XOxZ3izFRUzdqj8PQjd+Vi03qugx9BGRpBxnsTLV7DsWlb4zE8ddjqezi17oayQXO08TEU52Rg5+aJY1RHFJ4+5C//Hoqr5xy5+3AupxIKeXpsMLWDM8jJ09OvqxcKO/hlpXk3hneeNT7wfOK10pQ2fx8HurUzPpCpF2o8d9zfz/iQNjVdx9b95q1zITVU1KnlxB9rK543t6ppL56lMHovHveNxN7dE11aEi5tumDv40/Wr1+b1vMaPQnHeo25+pzx4QUGA3lbVuEx4EH8nn2XwgM7QKHApV037L19yVk8t9r3pdrZ/feG+vDw8CA313KajezsbDw9yx7x9lprX/v27c3KO3TowIIFC7hw4QIREbZ5wCTBXSWp1WqrqZcff/wxS5cu5fPPP+d///sfWVlZ+Pr6EhUVRe/eva28UtmcnJxYuHAhb775JjNmzCAwMJBJkybx999/4+5eGqx0796dhx56iK+//pr09HTatGnD4sWLy3nl6vfqM08S+PMfrNu2i7y8fOqG1uajV2fQvIlt5xWqLjNmzGDxjz+yedMm8vLyqFOnDm+9/TaRkZHl1us/YAAH9u/n0MGDFBYW4uXlRcuWLXmgZKjcG+3YsQOdTke3bt1stCelDAZYuFrNgA5KOjV1QOkAl1KL+W2LhtTsivvDZecbWLBCzX0dlfRvp0RXDKcu6Fm5R2vW6ndtzruwIHvCgiw7Gc9cUkRmrvH9nB3tuLeteV561+bGvzNyi+9IcBf+3KO4hJUOehQ8rC/Bw4zTWFz5ecW/IrgDeG9YF+ZtdmPl0TPkFGmoH+jN7NF9aBUWXG49J6UD34zvz+frD/D34dMUanVEBPkwZ3QfOtWv/lExy/PemAHMW7WDlQeOk1NQRP0a/syeOJxW9cqfP6x/68ZEn7vCpujTqHU6avh4ML5nOx7v0x5nVen3zcvVmZ9njOXL1TvZduwMv++MxsvViSHtI5l6XxeztFVbKFy9GEPnDJSN26ByckGfepWCZQvQX654Lk1UTjiEN0GXcNxinrV/i6nTX+HXxYFs27yO/Lw8QuuE8/KbH9G4afNy6/XpP5jDB/YSfWgfhYUFeHp5E9WiDcMefJjQsNK0+JCwcJo0a8GBvTvJzEwHg4HA4JqMGDWOwcNH2bTPyzX5y7+nuFsGjpHtsXN2QZ98mbylc9FdjK+4ssoJZb1ItPGxGNTWj6H20lkcatXFsXln7FxcMWjU6K+eJ3/lj+jOx1Xx3pSt2ADvzLvMI8P8ua+7FyqlgvgLRcxelMiV5IpbowJ9lTw8yN+s7NrfsacLLIK7rm2MN87bqzkl85rMJV/i0e9+nFt3RuHsivbqRTK++QRNQvmjzuZt/Bt9RgquXfrh3ncYOCjRXb1IxvefURSzv5q2XtyM8PBwi751ubm5pKamltuwUq9e+anlthwLw85gqMaJbcRNy8rKolevXowfP54pU6bcse1IKSOt526R62S7NM5/i6/Wl39T/1/XdWrzO70JNtXzpwkVr/Rf52U579ndRB0Tfac3waYuDn3tTm+CzdX8tfx5rf7rHrky7U5vgk3Nd3rrTm+CzdX47Jc7vQllKlr77R15X6d7H7vlul999RULFixg27Ztpta433//nTfffJMtW7aUOxXCwIEDqV27Nl9++aWpbNasWSxatIg9e/bcdneuskjL3b/M119/jZ+fHzVr1iQ1NZWFCxei1+stRuoRQgghhBBC2M7IkSNZvHgxkydPZuLEiSQnJ/Pxxx8zcuRIs8Bu3LhxXL16lQ0bNpjKnnvuOSZNmsT7779Pt27diI2NZeHChUyYMMFmgR1IcPevo1AomD9/PsnJydjb2xMVFcWiRYsIDr67W12EEEIIIYT4N/H09GTRokW8++67TJ48GVdXV0aMGMFzz5kP7FdcXIz+hpFOe/TowaxZs/jyyy/55ZdfCAgIYOrUqTzxxBM23WYJ7v5lHnvsMR577Nabj4UQQgghhPjXuUPz3N2uunXr8sMPP5S7TlljX/Tv35/+/fvbYKvK9t8btkYIIYQQQgghhAVpuRNCCCGEEELY1n9wKoT/IvmUhRBCCCGEEOIuIMGdEEIIIYQQQtwFJC1TCCGEEEIIYVv/0QFV/muk5U4IIYQQQggh7gLScieEEEIIIYSwLYW0KVUH+ZSFEEIIIYQQ4i4gLXdCCCGEEEIImzJIn7tqIS13QgghhBBCCHEXkOBOCCGEEEIIIe4CkpYphBBCCCGEsC07aVOqDvIpCyGEEEIIIcRdQFruhBBCCCGEELYlLXfVQj5lIYQQQgghhLgLSHAnhBBCCCGEEHcBScsUQgghhBBC2JTMc1c9pOVOCCGEEEIIIe4C0nInKiVBUf9Ob4JNuRcX3OlNsLncXPWd3gSb6vnThDu9CTa16eHv7vQm2FzoyW13ehNsKufVBXd6E2xKfa/Hnd4Em8v/58id3gSbevDTBnd6E2zK60zDO70J/7/JgCrVQj5lIYQQQgghhLgLSMudEEIIIYQQwrakz121kJY7IYQQQgghhLgLSHAnhBBCCCGEEHcBScsUQgghhBBC2JZC2pSqg3zKQgghhBBCCHEXkJY7IYQQQgghhE3JJObVQ1ruhBBCCCGEEOIuIMGdEEIIIYQQQtwFJC1TCCGEEEIIYVt20qZUHeRTFkIIIYQQQoi7gLTcCSGEEEIIIWzKIC131UI+ZSGEEEIIIYS4C0jLnRBCCCGEEMK2ZCqEaiEtd0IIIYQQQghxF5DgTgghhBBCCCHuApKWKYQQQgghhLApGVClesinLIQQQgghhBB3AWm5E0IIIYQQQtiWDKhSLaTlTgghhBBCCCHuAnek5S4iIqLCdWbOnMmwYcOqYWts6/Lly/z111888MADBAYGmsr37dvH2LFj+eOPP4iMjLyDW2gbWq2GZT9/xe4ta8jPz6V2aD2GP/wkTZu3K7fewT1b2LdjA+fOnCA7Mx0fv0Cat+nMoAcm4OrmbrauRqNm3Ypf2L1lDWkpV3Fx86B+w0iGjHqcWiF1bbl7aLUafln8Pdu2rCc/L5fQsLqMGjuB5i1al1tv7+4drF+zggvnE8jNycHD05MGDRvz4EPjCQ0LL7NeUuIVnnlqPFqtlo8/X0C9+g2repcAcHa0Y2hXJ5rXV6JysON8ko4/txRxKUVfqfpBPgpG9HCmbk0H9HoDxxJ0/LGlkLxCg8W6fl4KBnVyomGoA44qO7Lyijl0SsuKnUUA2AHtmqho0UBJrQB7XJ3sSM8u5uApDRsOqNFVbpPKpNHpmbf5EKuOniWnUE39QB+m9GxFh3o1K1V/bWwCS/Yc43RyJkp7BeH+Xkzu2Yp24TWsrn/4QhKPfLcKgK0vjsbb1en2dsAG7F1dCJ8+Aa+2UXi1iUTl48XRCS9x+ce/7vSmWdBqNfy6eKHFbzCqRZty6+3bvZ11a1Zw0fQb9DL9BkNu+A1+//Vcjh+LJjU5CY1Wg79/IJ269GDQsAdxdnax5e4BYKdUEvLkRPz798fe3Z2CM2e4OH8+2fv2V1jXt09vao4di0udOugLCsjYvp0Ls+egy84us457VBSR330LwP6evcpdtypotRr++fVL9m1fRUF+DjVD6jNo1GQaR3Uot96RvZs4uHsdF84cJzvLeJ2IbNWF/iMex8XVw2zdV57qR0ZqosVr3NN7BKMnvlal+2ONnVJJ7Scm4tevHw4lx/DSVwvI3l+JY9i7NzUeHoNzyTHM3LGDi3PNj6GdoyN1ZjyPW5MmqAIDsVMoKLpyhdR/VpD8xx8Y9Ld5oqyATqthy9+zidmznKKCHAJrRdB96DPUbdKp3HppSQkc3LqUKwlHSbxwAr1OwzMfbcTLr5bFup+/0IPs9KsW5a26Psh9Y9+usn2xRqPTM39HDCuPnSe3SEN9fy8md21G+zrBlaq/7sQFlhw4RXxqFg4KBeF+nkzu0oy2YUEArIhJ4M1Ve8us//7ADvRvWqdK9kX8/3FHgrulS5ea/f3ggw8yZswY7rvvPlNZSEhIdW+WTVy5coW5c+fSrVs3s+CuSZMmLF26lLp1bRuE3CnffPEOB3dvos/AUQTWqM3OTSuZ9c6zvPTefBo0bl5mve/nfYCXjz8du/bDxz+QyxfOsnHV7xw9tJt3Zv2IyrH0hvirWW9wZP92uvYZQmj4KLIy0ti0+g/efeEx3p/9M34BlTv53oo5sz5kz65t3Dd4BME1arFl41ref/NF3pn5GY2aNCuz3sXzCbi6uTFg0HA8PDzJysxg04Y1vDjtKWb+bx51wutZrbfw63nY29uj1WpttUvYAZOHu1LT356NB4rIKzTQpbkjz410Y+aPuaRmFZdb38vNjmmj3ChUG1ixoxBHpR292jhSw9+Njxbnor+ueq0Ae5570I2svGI2HlSTX2jA20OBt3tpyoZKCeP6u5BwVceOo2pyCwyE17Dnvk5ORIQ68PnS/Nva39f/2s7G4+cY3aEpIb4erDgSz5Sf1vHNI/1pGRpUbt35mw/z1bYj9G5ch0EtGqArLuZMciYpOda3qbjYwIer9uCscqBQo7ut7bYllZ83DV6fQsGFK+TGxOHbrfyHMXfSnFkz2btrGwMG309wjZpsLfkNvj3z83J/gxfOJ+Dm5s6AQSNwL/kNbt6wmhenPcnM/31J2HW/wTPxp2jUpBk9evVDqVJx7mw8f/3+MzHRh3j3o9koFLZNfqn31pv49uxJ4s+/UHTpEv733UejL77g+MQnyT16tMx6gcOHU/fll8jat5/zn32OKiCA4FEjcWvUiJjxj2DQaCwr2dlR54Xn0RcUYO9i+8AVYNHcNzi8dyM9BzxEQHAIe7asYO4HU5n21jfUa9SizHo/ffUuXt7+tO0yAB+/IK5cjGfrml85dngnr3z8i9l1AqB2WAS9Bo01KwsIrp57jLpvvIFPj54k/VpyDAfcR8Rnn3Ny0lPlH8Nhw6nz4otk79/PhS+MxzDowZG4NmrEsUdLj6HC0RHn8Dpk7d6NOvEqhmID7s2aEfrsc7g1acqZN1636f4tX/gSJw6tp12vsfgGhhK96y9+/mIi455fREj9VmXWu3wmmv0bF+Nfoy7+wXVJunSy3PcJqt2IDn0fMSvzDQyril0o1xsr97Ip7iIPtWlIiLc7K2ITmPrbVr5+qCctageUW3fBjhi+3nmMXg1DGNQsHJ2+mDNp2aTkFprWaVk7gPcGWj7MWHLgFKeTs0xB4F1DBlSpFnckuGvevLlFWXBwsNXya4qKinBy+vc96b5Vbm5u5e7vf9nZ08fZt2M9D45/mv5DHwagU/f+vDp1FEt/mMPrH39XZt0pL35Io0jzC0JY3YZ888Xb7N62lm59hgCQkZ7CwT1b6DfkYUY+8rRp3YjGzfnw9Ukc3LOFewc/VPU7B8THnWTn9s2MffRJhgwfCUC3nn14dtIj/LjwK2Z+Oq/Mug88NM6irFffATw+7n7WrV7Ok1OmWyw/cmg/0YcPMGTESP74dXHV7cgNWkQoqVvTga+X53PktDGIPHRKy9uPuTOwkxMLVxWUW//e9k44Ku2Y+WMumbnGlrrzSXqeecCNDk1V7Iwx3ozYAeP7u5CcoeezpXloy4h1dHr4ZEkuCVdLnzzvioH07GIGdnamYagDpy7cWqAUezmVtbEJTOvTlnGdjS3nA6PqMXzeMj5ff4AfHx9YZt2YSyl8te0I0/u2Y0zHppV6vz8OnSI5J59hLSNYsvf4LW1zdVAnprCxVifUyWl4tmpK571/3ulNsio+7iS7tm9m7KNPMdj0G+zLc5MeYfHCBXzw6Zdl1n3gofEWZb36DuCJcSNYt3o5E6/7Db7/yVyLdYOCa7Louy85c/okDRo2uf2dKYNbk8b49+3L+c+/4OpPPwGQsmoVzZf+SujTT3NswgSr9ewcHAidPInsQ4c5MXmyqTw3JoZGn39G4NAhJC39zaJe4LChOAYGkvz3cmo8NMo2O3Wdc/GxHNy1lmFjnqPPYON5sX3XgbwzbQTLFn/GCx/8WGbdJ6Z/QkRT8xba0PDG/DD3dfbvWE3nXuZZP14+AbTrMqDqd6ICro0b49enLxdmf0HikiUApK5eTdTPvxAyZSrHH3/Maj07BwdqP/UUOYcPc3LqFFN5bkwsDWfNImDwEJJ/Nx5DfU4Ox2/4LqT8tQx9Xh5BDzzAhc8/R5uRbpP9u5IQw7H9q+l9//N0vNe4DVEdh/DlGwPZ8PsnTHjl1zLrRjTvwYtz9uPo7Mbutd9VGNy5ewfQrMOgKt3+ihy7msa6kxd4rkcLxrZrBMB9kXW4/5tVfL4lmkVj+5RZN+ZKGl/vPMa0ni15uG3ZmTa1vN2o5e1mVlak1TFz3QHahAbi5+ZcNTsj/l/5V4bQc+bMoUWLFsTExPDggw8SGRnJkpIT4//+9z8GDhxIixYtuOeee5g2bRopKSlm9ceMGcPEiRNZu3Ytffv2pUWLFowdO5aLFy+arff111/Tu3dvIiMjad++PePHj+fSpUum5ZV5L4CtW7cycuRIoqKiaNOmDWPGjOHEiROm1EuAESNGEBERYUpJ3bdvHxEREcTGxppeR61WM3PmTDp37kxkZCSDBw9mw4YNZu/10ksvcd9997Fv3z6GDBlC8+bNGTFiBMeOHTNb748//mDAgAE0a9aMdu3aMWrUKGJiYm72UNySg7s3oVDY073vEFOZSuVIl96DOBMXS3pqcpl1bwzsAFq17wZA4uXzprKiQmOg4eHlY7aup4+f6f1sZc+ubSgUCvr0Kw0AVCpHevYZQNyp46SlWn5HyuPp5Y2joxP5+XkWy3Q6HQu/nsN9g4cTFGQ93a+qtGygJDu/mOjTpa2DeYUGDsVpaVZPiYN9+fVbNFASe1ZrCuwATl3QkZyhp1VDpamsUZgDNf3tWbW7CK0OlA7W+1jrizEL7K6JjjduX5DPrZ++Nh4/h73CjuGtS1PEHZUODG0ZwdFLKSRlWx6La37acww/NxdGt2+CwWCgQF1+a2p2gZp5mw4xqUdL3J1Ut7zN1aFYo0WdnHanN6NCe3ZtRaGwp7fFb7B/lf8Gb+QfaHySnp9X8bq3w7dnTww6Hcl/labEGjQaUpavwCOqGarrMkGu51K3Lg4eHqTfcO3I3LkTfX4+fn0sb0gdPDwIeeopLi34Cn1ebtXuSBkO792IQmHPPb2Hm8qUKkc69RhCwukYMtKSyqx7Y2AH0LxdDwCSrpyzWken1aIuKrS6zFZ8exiPYcrff5vKDBoNKf+swL1ZM1QB1lt+nK8dw43mxzBrV8kx7N27wvdWJxrTGO3d3SpY89adOLQOO4U9rbo+aCpzUDrSovNwLp+NJjvDMh32Gmc3Lxydb27b9DoNGnX5Dxmr0sZTl7C3s2NY89LWfEcHewZH1SXmShpJZWRqgLHlzdfNmYfaRBivE5rKZ91sP3OFfI2Ofk3Cbmfz/5UMdnZ35N//N//a0TK1Wi3Tp09n/PjxPPfcc3h5eQGQnp7OxIkTCQgIICMjg++//54xY8awatUqHBxKd+fkyZNkZGQwY8YM9Ho9H374Ic8//7wpJfTvv//miy++4Omnn6Z58+bk5uZy6NAh8vNLf6yVea/Vq1czbdo0evbsyaeffopSqeTw4cMkJyfTpk0b3njjDd555x1mzpxJeHjZfaoAZsyYwY4dO3j22WcJDw9n+fLlTJ06lXnz5tGzZ0/Teqmpqbz33ns88cQTuLu78+mnnzJlyhQ2bNiAUqnkwIEDvPrqqzz66KN07dqVoqIiYmJiyM2tnov2hYTTBNUIwdnF/MQdXr8xABfPncbX3/qNiTXZWcanjm4eXqaygKBa+PgGsHb5EoJrhhIa3oDMjDR+WzQH/8AatLun7CdqtyvhbDw1atbGxcXVrLx+A+PTuXMJZ/DzLz9dIz8vF51eT1ZmBiv//oOCgnyaRVkGtiuX/0FeXh4jRo5h767tVbcTVtQOtOdSsp4be8edT9RzT5QdAd4KrqZZT830dLPDw1XBhWTLYOx8op4m4aW/zYZhxv/r9PDSGDdCgxzQ6gwcjdfyy8ZCCoos++ddz8PVGNRZ68dXWacS0wn19cTthmCraU3/kuUZBHlav/HYn5BIVEgAP+89zjfbo8kqUOPn5sxjXZszql1ji/XnbT6Er5szI1o35Out0be8zaLUubPx1KhZy+I3WK+B8en6uYT4m/gNppt+g5FRLS3W0+t15OflodPpuHjhHL/8+C3Ozi7Ui2hUdTtkhWtEBIUXL6LPN7+BzDtubPl1bdAATbLlgzI7lfE7XaxWWywrVqtxjYgwPk0xlP5+aj/5JNr0dJKWLaP2Y9ZbBKvapXOnCKgRanGdCKtnbA2/fD4OH7/Kp6RlZxkfSri5e1ksO3XsAE+Pbk9xsR4f/2B63vcwPQeMvvWNrySXBg0ovGTtGJ4wLddYeWCsUJZ/DF2sHEM7BwfsXV1RODri2qgxwaMfRn31KkWXL1flLplJungS38AwiyCtZp1mpuWePlXTPeLcqX28/1QLDMV6PH1r0L73eNr3HltxxdtwKjmTEB933ByVZuVNa/gCEJecSZCHq7Wq7D+fTFQtP345EMe3u4+TVajGz9WJCR2bMLJ1+eNOrD5+HicHe3pG1K6aHRH/7/yrg7vnnnuO/v37m5XPnDnT9H+9Xk+LFi3o0qULe/fupXPnzqZlubm5/P333/j4GFt2CgoKePnll0lKSiIoKIiYmBgiIiKYOHGiqU6vXr1u6r0MBgMfffQRnTp1Yt680lS8rl27mv5fr57xiU/9+vXLHTjl1KlTrF+/nrfffpuRI41pRl26dOHKlSsWwV12djY//fQT9evXB8DZ2ZmxY8dy9OhRWrduTUxMDF5eXrz44oumOt26dSvzvataVmYaXj6+FuVe3sZWtayM1Jt6vVV//ohCYU+bjj1MZQ4ODkx56SMWfPo6n79fmkYVVrchr330rcXgK1UpMzMdbyv7d60sI6Pilo+Xpk/iymVjK7GTszMjRo6hZx/z73pmRjq///Ij4yY8ZXETawsergriL1mmOWbnGQM6T7dygruSgOvaumb184txc1bgYG8M6AK8jE2Ajw104fh5Hev25VPT35572zni7aHgfz+X3yLSp60jhWoDx8/det+11LwCq+kufu7GstRc60+HcwrVZBYUEX0xmf0JiTzZrQVBXq4sPxzPh6v24KBQcH+b0hSc00kZ/HHwFHMf7oO9jftn/X+SmZlR7m8wsxJpaC9Nn8TVy8ZsDuNvcCw9+1im7p2Nj+Pl6ZNMf9eoFcJLb3yAu7uHxbpVSeXnhybNcj80acbzi8rfz2q9oosXMRQX4x7VjJR//jGVO4WGoiy5Hjp4eJgG5XCpV4+gYUM58cyzUFx+v9qqlJOZhqeX5T543OJ1Yv3fP6BQ2NOig/l1vFZoA+o2bE5gjTDyc7PZs3UFv3//CdkZqQwb8+wtb39lqPz80Fo5htr0a8fQ32q9okslx7BZFKkrV5rKnUJCSo+huwe6nNKBVXy6d6f+e++b/s47cYKz770LNhxQJTcrFXdPy31w9/IvWX5zLehlCawVQUj9VvgG1aEwL4voXX+x7tcPyM1Koff9M6rkPaxJyyvE39p1oqQsNc96S3BOoYasQjVHL6dx4EIyEztHEuThwvKYBD7acAgHewUjWtS3Wje7UM3uhES6N6iF6w1B5V1B+txVi39tcAfmQdI127ZtY/78+cTHx5N3XVrM+fPnzYK7hg0bmgI7KA2yrgV3jRs35ueff2bmzJn07t2bqKgolErzH1JF75WQkEBSUpJZEHWrDh06BMC9995rVt6vXz9mzpxJQUEBLiWd3AMCAkyB3fX7llzyFLdx48ZkZWXx0ksvMXDgQFq2bImzc/XlbWs0ahyUlulnypJUSY3G8mlkWfZsW8v2jSvoP2wMQTXMO8C7urkTUqcBbTr1pF5EU5ITL7Pyjx+Y9/HLPP/2XJulZmrUGovvCoCyZJ81Vp623mjKsy9RUJBPclIimzeuQaNWU1xcbDZAw+IfviYwKJhefaunr4jKAasjUF4rUzmUndqgcjBf93rX+tQpHezQ6Q04lnw1LiTp+aGkH9+R01o0WgNDu5bfl+7edo40ClPyy4YCCtW33nKn1upRWckzdSwpU5fREfBaak1WgZqP7u/OvZHG1vjejeswfN4yvtkWbRbcfbR6D53q1aJjPcsR4MSt06jVONz2b/BFCgoKSE66ypYyfoMAtULCeOO9T1EXFRF38hgx0Ycoqob0PoWjIwat5cAnxaaBNKz3QddlZ5O+cSP+991H4bnzpG/disrfn/Dnn6dYq0WhVKJwLD031nl+Bpm795C9b59tdqQMxuuElWNYct7Waooq/Vr7d6xm16a/6DN4PIHBoWbLJr30hdnfHXsMZs77k9m48ie69x+Ft2/ls0hulsLRkWJrx7Dk+3n9cbieLjub9E0b8RswgMLz58jYuhVVQABh02eUHkMnR8gprZNz6BAnpkzGwd0dz9ZtcKlfH3sbX/d12iLsrVzrHZSOJcsrf60vz6in55v93bzzMJZ8/jh7N/xAu54P4+Fjm0FH1Do9SnvLYMTR/tp1wnrgXFAy8FlWoZoPB3eib2Pjd7JXwxDu/3Y13+46XmZwt/HUJbT64rsyJVNUn39tcOfs7Iyrq3lrRUxMDJMmTaJnz548/vjj+Pr6YmdnxwMPPID6hou5h4f5U9VrN+PX1hs2bBj5+fn89ttv/PDDD7i7uzNkyBBmzJiBk5NTpd4rKysLMAZbtys7OxulUmlKP73Gz88Pg8FAbm6uKbiraN86dOjAxx9/zI8//siECRNwdHSkb9++vPLKKxavbwsqlSM6Kxc0bUlQV9mgK+74Eb6b+z6RLdoz4uGnzJYV5OfxwctP0G/oGPoNKU2vqVOvETNffZIdm/6hZ78Rt7EXZVM5qqyOWqkt2WdVGRfs60U0Kh2IoXOXHjz9pDG9ZPxjxhaCuFPH2bZ5PW+9P6vKR+SzV4Crs3mglltgQKPDar+6a2UaXdnB1LUBIK3VV5acZbQl9a/FTQdOmX9HDpzUMLSrM+E17K0Gd60ilAy8x4ldMWq2R1sZ7e8mOCrt0ViJRNUlZY5K66dGx5J0bAd7Bb2vu/gqFHb0bRrO/C2HSczKI9jLjbWxCURfSuHPyf/9KV3+bVSOjuhu+zdYOhhO5y49eabkNzjusUlm67m4uBJVMsVJ2w6d2bF1Ax+9+yqffPGN2ciaVa1YrcbOyo2zwpR2WXbwc/b9D1A4OhL23LOEPfcsACmrV1N05TK+PXqgLzA+VPHt3Rv3Zs2IfnBk1e9ABYzXCSvHsOQ6oVRVbgC1+BOHWTz/bRo378jgh6ZUuL6dnR0973uYE9G7OX38oE0HWilWq00plte7FtRZS7u85tzMmSgcHQl95llCn3kWgNQ1Jcewe+kxvEabkYE2IwOAjM2bqTFuPI1mzyF6xAibDajioHRCb+Vafy2ouxbkVTU7Ozva9x7H2WM7OR+332YDrTg62KPVW7Zmq/XXrhPWO6Jfe0jooFDQq2FpaqXCzo4+jUJYsCOWxOx8gj0tM3JWHz+Pp5OKTmVMqSNEZfxrgzs7Kx0gN27ciJubG59//rnphvfKlSu39PoKhYJx48Yxbtw4kpOTWbVqFZ9++ine3t5Mnjy5Uu91LVCyNsjKzfL09ESr1ZKdnY2np6epPC0tDTs7O9zdby7NcPDgwQwePJiMjAw2bdrEzJkzcXBw4IMPPrjtba2Il7cfmemWKTVZmcZUFC8f66ko17t47jSfvz+DWiHhTHnxQ+ztzb+qB/dsJjsrgxZt7zErb9i0Jc4ursSfjLFZcOft7UtGumXq5bVUMB8f6+lSZXFzdycyqiXbt240BXeLF35FoybNCAwKIiXZ2Ck9pyQFJzMjg9SUZPwDbu2Jc3hNB6aNNO8j8epXOeTkF+PpZhlIXiuzlnJ5TXZ+sdm6ZvVdFeQVFpta9bJKXicn3zxYzC0w/u3iZPnbbxjqwLj+Lhw7q+Pn9bffauLv5kKKldTLtJIhqv3drQ8F7+nsiKODPe5OKos0Sx83481oTpGaYNz4bP1++jSpg9JewZVMY3/X3CLjjVBSTh5avZ6AMvpriPJ5e/uU+xu0lrJZHjd3d5pGtWD71g0Wwd2N2nXsAp9+wM7tm20a3GnS0qym7an8jOcXTWrZ6d/6/HxOTZ+BKjAQpxo1UCcmok5Koul336HNyEBfkokS9szTpG/chEGrxTHY2DfKviSl3TEoEDulEm2abQbY8fD2s5p6mXMT14nL5+OY/9Ez1Khdlyem/8/iOlGWa611+bm2ncdPk5aGKsByP5S+145h2amn+vx8Tj//PKrAQByDa6BOSkSTlESTb741O4Zlydi8mZBJk/Du2oWUv2wzT6W7lz85mZb9PnOzUkuW3/6D77Jc68tXmJ9ls/fwc3O2fp0oSce0lrIJ110nHJWW1wmXa9cJjUVwl5idz5FLKQxrUc9qi+HdwMD/v8FN7oR/bXBnTVFREUql0izw++e6PgW3KjAwkEcffZSVK1eSkJBQ6fcKDw8nKCiIZcuWWfQNvObGVrWytGplHExj7dq1PPhg6chTa9eupXHjxqZWu5vl4+PD/fffz/bt2037ZmshdRpwMvYQhQV5Zp3lE04fNy0vT3LiZf739jN4eHoz7Y3PcbIyWXB2lvEJZfENfUQMBgPFxcUU27CfQZ3wehyLOUJBQb5ZX7jTcSdNy2+WWqOmoKC0031qajKpKck8+ajlkOQz33kFF1dXfvpt1S1sPVxJ0fPFb+Y3Bjn5xVxK0VOvlgN2YDaoSliwPWqNgZTMcoK7PAO5+cWEBlo+yQwLtufydZOgXywZdMXrhkDw2t95BeZBX1iwPROHuHIxWc+3/+RTfOvZmCYRwb4cOJ9IXpHGbFCV2MvGBzUNg32s1lMo7IgI8uH41TS0Oj3K65oqU3OMNwHeJRfvpOx8VsecZXXMWYvXGTl/ORFBPvw2aejt78z/Q2Hh9TkWE23xG4yPMw5UUSfcespTeTQ3/AbLotVqKS4upqASI2vejvy403i2aoW9q6vZgBxuTY2t/vmnT1f4GprkZNOgK/Zubrg1akj65s2m5Y5BQfj3uxf/fvda1I1asoT8uNMcHW2bgUdqh0Vw+thBi+vEuXjjCNK1wsofdCI16RKz35uMu6cPU16Za/U6UZa0ZOODWndP71vY8soriC/jGDYxHsOCWziGrg0bkrFlS4X1FE7GVjN7V9uNlhlYuyHnTu1DXZhnNqjKlXPG+fuCQmw36FBmqrHPuou79XN1VYgI9ObghWTy1FqzQVWOXU03LbdGYWdHgwAvTiRmoNXrUdpfd50oCQy9XSxbNdeeuIAB6C8pmeI2/aeCu06dOrFo0SLeffddevfuzZEjR1i+fPktvdYbb7yBh4cHzZs3x8PDg8OHD3Pq1ClGjRpV6feys7PjxRdfZNq0aUydOpXBgwejUqmIjo4mMjKS7t27ExYWhr29PX/++ScODg7Y29tbHVilYcOG9OnThw8//JCioiLq1KnDihUrOHLkCF9+WfacTdbMnj2brKws2rZti6+vL6dPn2bHjh2MHz/+lj6rm9WmYw/W/P0TW9b9bZrnTqvVsGPTSuo2aGoaKTM9NQm1uogatcJMdbMy0/jkranY2SmY8dZsPMq4+F7rf7dvx3qGjnrCVH5k/3bURYWEhpcfQN6ODp26snzZUtav+cc0z51Wq2HLxjXUj2hkGqUvNSUZtbqIWrVL+4BkZWXi5WW+TynJicRGH6ZevdKbmaemzkB9Q9pV7NEjrP5nGeMmPEXNWrc+AW+B2mA17fFInJZWESqaN1Ca5rlzdbajVYRxioPrsxj9vIyBWNp1E5sfidfSvokKb3c703QIESEOBPrYs+lg6cONmDNaHuhhoGOkir3HNKZAslMzY5B18rptC/JRMHmYKxnZxXz5Z36Zc+LdrF6Nw1i0K5Y/D8aZ5rnT6PQsPxJPZC1/00iZiVl5FGl11PH3MtXt2zScmMuprIiOZ3hrY/86tVbH6pizhPt7mVrjPhvVkxutjU1g3bFzvDesC4HSanfLOnTqyoplv7JhzT+mee60Wg2bN66hfkTjcn+D2VmZeJbxG6x73W8wPy8XRydns1GYATatMz5UqVu//ODjdqVv2kTNsWMIHDrUNM+dnVJJwMCB5MbGmm74VYGB2Ds5UXjhQrmvFzplMnb29iT+/Iup7NR0y8Eo/Pr2wa9PH+LfeAN1ctUMiGFNy/a92bDiR3Zs+NM0z51Wq2H3luXUqR9pGikzIzURjaaIoJp1THWzM9P44t2nsFPYMfW1L3H3tH6Dn5+bjbOLG4rrbq71Oi3r/l6Ig4OSBk0sp1SoShmbN1Pj4TEEDBlimufOTqnEf+B95B6LNY2UqQoMROHkRFEFxzBkUskx/OVnU5mDp6dpcJzrBQwaDED+yfLnj7sdjVv3Zc+6hRzattQ0z51OqyF651/UDI8yta5lp19FqynCL7j8EcOtKczLwtHFHYXC/BjuXP0N9g5K6jRsVzU7Y0WviNr8uO8ky6LPmOa50+j0LI85S2QNX9NImYnZ+RTpdNTxLc266tsolNir6fwTe840lYJap2fN8fOE+3kSYCU7ZM2J8wR5uNCiVsWt1v9VBhlQpVr8p4K7rl27MmPGDH766SeWLVtGy5Yt+eqrr+jbt+9Nv1aLFi347bff+P333yksLKR27dq8/PLL3H///Tf1Xv3798fJyYkFCxYwbdo0HB0dady4Mb1L5qHx8fHhjTfe4Ntvv2XFihXodDri4uKsbtMnn3zCrFmz+Oabb8jKyiI8PJzZs2fTo0cPq+uXJTIykkWLFrFmzRry8vIICgpiwoQJPPXUUxVXrgJ1I5rSplNP/lg8j9zsDAKCa7Nz8yrSUq7y6NRXTet9/flbnDp2mEXL95vKPn37GVKTrtB/2BhOnzzK6ZNHTcs8vXxo2tx4Im/R5h5qhoSzfOl3pKUkmQZU2bj6d7y8/ejSe7DN9q9Bw8Z07NyNJYu+ISc7i6DgmmzZtI6U5CQmPfOCab3Zsz7geOxRlq3aaip7bvKjNItqSVh4Pdzc3Em8epmN61ej1+t4eHxpkNq8peVNx7V5tZpERlGvftmTot6qw6e1JFzVMbafC8G+ReQVGuja3BE7OztW7jIPNJ99wBj8vPZ1aY/+tXuLaNlAybMPurHlkBpHlR292zhyOVXPnmOl/TJy8g2s2VvEoM7OTLnflaPxWmoF2NOpmYoDJzRcSLrWnwGm3u+Gi5MdGw6oaVrX/HSVmlXMOSvz4FVGs9oB9GlSh9kbD5CRX0htXw/+ORLP1axc3hpSOjDTa8u2cfB8EkffKR0efkSbhiw7HMcHq/ZwIT2HIE9XVh49Q2J2HrMfKp1/qkejMIv3jUs0tjh3rl8bb9fK9SmqbqGTRqP09MCphjFAChjQHaeaxhvt8/MWo8uxbYtVZTRo2JgOnbuxZNHXZGdnEhRck62b1pGanMSkZ0oHuJoz6wOOx0bz56ptprLnJj9CZFRL6oTXw7XkN7jJ9BssHT35WGw0C7+aTftOXQmuUQudTsfJ4zHs272duvUj6NLddtOtgHHKg7QNGwiZMhmljzdFly7jf98AHGvU4Oy775nWq//O23i2asXu1qXnjJrjxuFSty65x49h0Onx6dYV7w4duPDll+SdOGFaL2PbNm7kGmF8MJa5a7fVoKGq1GkQScsOvfn75znk5mQQEFSbPVv/IT01kbGT3jKt9/2c14g/cYgFf0Sbyua8P4m05Mv0GTyes6eiOXuqdJm7pw+NozoAcPTgVtb8+S0t2/fCN6AmBXnZ7N+5hqsXzzDkoal4et9cCv3Nyjt+nPSNG6k9aTJKbx+KLl/Cv/8AHINrkHDdyJb13nwLj1at2NuuramsxtixOIfXNU59odfj3bUrXu3bc3H+fLOAza9fPwKHDiNj2zbUV69g7+KCZ/v2eLVrT8b27eQcOmiz/asVHkXj1veyadln5Odm4BMQwtHdf5OVfoVB40u/o3999yIX4g7w5nenTGVFBbns32R8aHHpzGEA9m9agpOLB04u7rTtaXwwHBe9me2rFtC4VV+8/GpSmJ/NsX0rSbkST49hz+FmZbTOqhJZ04/eDUOYszWajPwianu7809sAonZ+bzZv71pvddX7uHQxRSOvPyQqWx4i3r8dfQsM9cd5EJGLkEeLqw6do7E7Hw+v99ysMAzqVnEp2TxSIfGVrslCXEz/hXB3Y3BztSpU5k6darVdR9//HEef/zxcusvXrzYol6jRo3M1hs6dChDh5afElWZ9wLo0aNHuQHYyJEjTdMbXNOuXTuL13JycuKVV17hlVdeKfO1PvzwQ4syDw8Ps9fq3r073bt3L/M1qsMTz77FsiVfsWvrGgrycqkVVo/nXptFwyaW80hd7+K5eABWL7M8hg2btjQFdw5KJa/O/JrlS7/j6MFd7NuxHidnF1q268r9Y57C/bo58Wzh6ekv88viQLZuXk9+Xi6hderyypszadI0qtx6ffsP4tCBvRw5tJ/CwgI8vbxp3qI1wx98mNCwm3+qWZUMBpj3Rz7DujnRvaUjSgc7LiTpWbQmj+RyUjKvycw1MOvXPEZ0d2ZIF2f0xQZiE3T8uaXQYhTNNXvUFBQZ6N7Skft7OJOTb2DtHjWr9pQGka7OCnw8jE/5hna17Nuw55iGc1dvfULb94Z1Yd5mN1YePUNOkYb6gd7MHt2HVmHlz8vkpHTgm/H9+Xz9Af4+fJpCrY6IIB/mjO5Dp/r//VExw597FJew0v0IHtaX4GHGh1pXfl7xrwjuAJ6e/gq/LF7Its3ryc/LI7ROOC+/+WElfoODOXRgD9HX/QajTL/Buqb1QsPCadqsBQf27iIzMx0MBgKDa3L/qHEMHj7S6oi5VS3+zbcISUzCv39/HNzdyT9zhlPPPkfOkSPl1is4cwaf7t3w7nIPdvb2FMTHE/fiS6Rv2mTzbb4Zj0x9jxW/zmPftlUU5OdQM7Q+k1+eTf3GlnN+Xu/yeWM64/rlP1gsq9+4lSm4qxlSn+Ba4ezbvoq8nEzsHZTUDovg8Wkf06qjbYPza868/Ra1kybi168fDu7uFJw5Q9y0aeRGV3AMz57Fp2vJMVTYU3DmDKdffpmMzebHMDf6KO6RzfDr0weljw8GvZ7Cixc4/9lnJP3+my13DYChj33E5r++IGbPCgrzswmsHcGop+cTGlF+q2hRQTZb/jYfyXTP+u8B8PStYQruAmo1wD+4LjF7V1CQm4G9vZKgkEaMePJzmrSxTCeuau8O7MCX211Zdeyc8ToR4MUX93elVUj5/QmdlA58/VBPPt9yhOVHzxqvE4HezH6gKx2tDJay+vh5APo1DrPBXoj/b+wMBkMV9GARd7u9p2zb8fxOc3e49SDhv2LuX9U3Hcad8FnI13d6E2xq08Pf3elNsLnQk5YtSXeTnJED7/Qm2JT6++13ehNszvkxy1aXu0nCp9U7JUZ1G3LmnTu9CTbnMv7NO70JZcqK3npH3terebc78r53iiS/CiGEEEIIIcRd4F+RlimEEEIIIYS4exmkP2G1kJY7IYQQQgghhLgLSMudEEIIIYQQwqZkKoTqIZ+yEEIIIYQQQtwFJLgTQgghhBBCiLuApGUKIYQQQgghbEsGVKkW0nInhBBCCCGEEHcBabkTQgghhBBC2JQMqFI95FMWQgghhBBCiLuABHdCCCGEEEIIcReQtEwhhBBCCCGETRmQAVWqg7TcCSGEEEIIIcRdQFruhBBCCCGEEDYlA6pUD/mUhRBCCCGEEOIuIC13QgghhBBCCNuSScyrhbTcCSGEEEIIIcRdQII7IYQQQgghhLgLSFqmEEIIIYQQwqYM0qZULeRTFkIIIYQQQoi7gLTcCSGEEEIIIWzKIAOqVAsJ7kSlhNhduNObYFPJhhp3ehNsrkNbrzu9CbZV5Hunt8CmQk9uu9ObYHMXGnW905tgUz1/ffJOb4JN7Si++5OBmr8y9k5vgk3N+uvuvtYPaSbBhbj73f1nYiGEEEIIIYT4f0Ba7oQQQgghhBA2ZbCTNqXqIJ+yEEIIIYQQQtwFpOVOCCGEEEIIYVMGpM9jdZCWOyGEEEIIIYS4C0hwJ4QQQgghhBB3AUnLFEIIIYQQQtiUDKhSPeRTFkIIIYQQQoi7gLTcCSGEEEIIIWzKYCcDqlQHabkTQgghhBBCiLuAtNwJIYQQQgghbEqmQqge0nInhBBCCCGEEFacPXuWRx55hObNm9OpUyc+/vhjNBrNTb3GDz/8QEREBBMnTrTRVpaSljshhBBCCCGEuEF2djbjxo0jLCyMOXPmkJyczIcffkhRURFvvPFGpV4jNTWVefPm4evra+OtNZLgTgghhBBCCGFT/8WpEH799Vfy8/OZO3cuXl5eAOj1et5++20mTpxIYGBgha/xySef0KNHD65evWrjrTX6733KQgghhBBCCGFj27dvp0OHDqbADqBfv34UFxeza9euCusfPHiQjRs3Mn36dBtupTlpuRNCCCGEEELY1J0aUKVnz57lLt+0aVOZyxISEhg+fLhZmYeHB/7+/iQkJJT7unq9nnfffZcnn3ySgICAym/wbZKWOyGEEEIIIYS4QU5ODh4eHhblnp6eZGdnl1v3559/prCwkPHjx9to66yTljshhBBCCCHEXam8ljlbSU9PZ/bs2Xz00UeoVKpqfW8J7oQQQgghhBA29V8cUMXDw4Pc3FyL8uzsbDw9Pcus98UXXxAREUHr1q3JyckBQKfTodPpyMnJwcXFBQcH24RhEtwJIYQQQgghxA3Cw8Mt+tbl5uaSmppKeHh4mfXOnTvHgQMHaNOmjcWyNm3a8M0339ClS5cq316Q4M6qOXPmMHfuXKvLpk+fzhNPPFGp1zl58iQbN27ksccew9nZ2VS+bNkyXn75Zfbs2YOPjw85OTksWrSIfv36Ua9ePdN6ly9fpmfPnnzxxRfce++9t7dT1Uyj1fL9kqVs2Lqd3Lw8wsNCmTB6JK1bRN3U68x4/R0OHY1lSP++PPPkY6bylNQ01mzcwt6Dh7h8NQmFQkGd0NqMeWA4rZo3q+rdsaDVavjtp2/ZuWUteXm5hITV48Exj9OsRdty6+3fvY2Na/7m0oWz5Obk4OHpRb2IJtz/0ARqh5mfJHZv38jh/bs4E3eCpMTLNGragjc/tP69rGo6rYbtK74gdu9yigpyCKgZQdchzxLeuFO59dKTEji87VeunIsh6eJx9DoNkz/YhJdfrXLrZaZc5Ku3BqDXaXjklT+oERZZlbtjlUarY97qnaw6cJycQjX1a/gzZcA9dGgYVm69+at3smDtbotylYM9B2aZj4aVW6jm2/V72BxzmuSsPHzcXGgXEcqT93Yi2Mcyh78qabUafl28kG1b1pOfl0toWF1GjZ1AVAvLC8319u3ezro1K7h4PsH0HW3QsDEPPjSekBu+o99/PZfjx6JJTU5Co9Xg7x9Ipy49GDTsQZydXWy5e7fE3tWF8OkT8GobhVebSFQ+Xhyd8BKXf/zrTm+aVRqdnnkbD7DqyGnjdzTIlym929Chfu1K1V8bc4Ylu2I5nZSO0l5BeIA3k3u3pV3dmgAUaXXMXLGT2EvJJGfnozcUU9vHkyGtInigfROU9va23D20Wg2rls5j/46VFOblUCO0PveNnEqjZh3KrRe9byOHd6/jwtlj5GSl4+0bSNNWXbl3+BO4uJr/rv784WPiTx4kI+UqWq0GH/9gWnboS69B43F0sv13VKPTM2/9XlYdiiOnsIj6wX5M6dueDg1CKlV/bfRpluw8yunENOMxDPRhct/2tKtX+h34bU8s+89cJvZSEklZeQxq1ZB3H+xtq10qk4uTgofv86ZtpAsqpR1nLqlZvCKTc1cqnuy5bm0V3dq4UT/EkZAaKhzs7Xhg+nmL9ZQOdkwY5kO9EEf8vBxQKCApXceW/bms35WLvrhq90mj0zN/ewwrj50jt0hD/QAvJneNon2d4ErVX3fiPEsOxBGfkomDQkG4nyeTu0bRNiwIgBUxZ3lz5d4y678/qCP9m9apkn35N7hTA6rcji5durBgwQKzvndr165FoVDQqVPZ90SvvPKKqcXumg8++AAnJyemTZtGRESEzbZZgrsyODk5sWjRIovy4ODK/aDBGNzNnTuX0aNHmwV33bp1Y+nSpaYvSU5ODnPnzqV+/fpmwV1AQABLly4lLCzs1nfkDvno83ls272XEYP6UzM4mHWbt/LSOzP57P03iWzcqFKvsX33Po7Hnba6bNe+A/zy5990at+GPj26odfrWb9lGzPeeJcXnp5Ev17dq3J3LMz/7H327dpCv8EPEFSjNts2ruajt2bw+gdzaNik7AD20oWzuLq5c++gB3D38CQ7M4MtG1by6vTHePeTrwgNr29ad8Pqvzl39hR16zciN7f8TrtV7Z8fXuLUoXW07TUW74AwYnb/xdLZT/Dw9EXUrt+6zHqXE6I5sHkxfsH18AuuS/Klk5V6vw2/fYDC3gG9ruKbgKry+pLVbIw+zehurQjx92bFvmNMWfAH30wdScu65QejAK8+0BsXx9I8enuF+UWruNjAxHlLSUhK58F7WhDq783FtCx+23GE3SfP8ferE3B1cqzy/bpmzqyZ7N21jQGD7ye4Rk22blzL+2++yNszP6dRk7IfgFw4n4CbmzsDBo3A3cOTrMwMNm9YzYvTnmTm/74kLLz0HHUm/hSNmjSjR69+KFUqzp2N56/ffyYm+hDvfjQbheLflYKj8vOmwetTKLhwhdyYOHy7tbvTm1Su1//YwsZjCYzuFEmIrycrDscxZdEavnlsIC3Dyr8Wzd94gK+2HKJ3k3AGtYxAV1zMmeQMUnLyTeuotTrOpmRwT0QINbzdsbOz4+jFZD5ZvZvYSyl8OLKXTffvp3mvcWTfRrr3H41/cCj7ti5n/szJPPPmt9Rt2LLMer98/Q6e3v60uec+fPyCuHoxnu1rf+H4kR28+NFSVCon07oXzh6nXsOW+HUbglKp4vL5U2xYvpC42H08+/b3Nv+Ovr50AxtjzzK6cxQhfl6sOHSSKQv/4ZuJQ2lZp0a5deev38dXm/bTO7Ieg1o3QqfXcyYpg5TsfLP1vt96iHy1lqa1A0jLKbDl7pTJzg5eeiyAsBoqVmzNJje/mD4d3XlzUhAvfXaVpDRdufVbNnKhZzt3LiRqSEnXUSNAaXU9ldKOWkEqjpwqJDVDh8EADcIcGTfIh/ohjsxeklal+/XGyj1sOnWRh9o0JMTHnRUxCUxduoWvR/eiRe3yRz9csD2Gr3fG0qthCIMiw42/wdQsUnJLj1HL2gG8N6ijRd0l+09xOjnTFASKO2fkyJEsXryYyZMnM3HiRJKTk/n4448ZOXKk2Rx348aN4+rVq2zYsAGARo0s73U9PDxwcXGhXTvbXnskuCuDQqGgefPmNnltHx8ffHx8KlxPpVLZbBts6eTpeDbv2MWTj4zhwaGDAOjboyuPTJnGVz/8xNyP36/wNTQaDfMXLmLUsCF8//NSi+XNmzVl6cL5eF43gtGgfn14/Jnn+f7npTYN7s7EnWD39o2MfnQyA4c9BECXHvfy/OQxLPn+S97931dl1h0+6lGLsu59BjJ5/BA2rP6Lx6a8YCqfPP11fHz9USgUzJj0cNXvSBmunIvhxIFV9BzxAu37TACgWYchfP3WfWz683+Mf+nXMus2iOpBwy8O4Ojkxt7131UquDt7fAcJJ3bSvu9j7Fo1v8r2ozyxFxJZe/gU0wZ3Y1xPY2vrwLZNGT5zIZ8v38qP0yr+vHs3j8Dbrewn/zHnr3L8YhIvj+jFyC6lN6phAT68+fMa9sZdoGdUg9vfGSvi406ya/tmxj76FIOHjwSgW8++PDfpERYvXMAHn35ZZt0HHhpvUdar7wCeGDeCdauXM3FKaevk+59YtiQHBddk0Xdfcub0SRo0bHL7O1OF1IkpbKzVCXVyGp6tmtJ57593epPKFHspmbUxZ5jWrz3j7mkOwMAWDRj+xW98vnYvPz45tMy6MReT+WrLIab368CYzmU/bPJ0ceKnp4aZlT3Qrglujip+3XuMGQM64udum9at82diObR7LUMenkavQeMBaNdlIO9PH8bfP33G9PcWl1l3wrRPadDEvAW6dnhjFs97jYM7VtGxZ+mw5dPetXxI6xdYm78Wf8qFM7HUaXBz2SQ3I/ZiEmuPxjNtQCfGdTWeAwa2asjwWT/z+epd/Dj5/jLrxlxI4qtN+5k+oDNjurQo932+e3IYwV7G4Lz9awuqdB8qq30zFxrWceLTRSnsizEGL7uj8/nipZo80NerwqBr/e4c/t6cjVZn4NGhPmUGd/mFxbw2O9GsbMOeXAqKiunX2YNFKzLJztVXyT4du5rGuhMXeK5HC8a2bwzAfZHh3P/NSj7ffIRF4/qWWTfmShpf74xlWq+WPNy27AfatbzdqeXtblZWpNUxc+1+2oQF4ufmXEbN/6b/Yp87T09PFi1axLvvvsvkyZNxdXVlxIgRPPfcc2brFRcXo9dXzXfvdv33PuV/iYiICL755hvmzJlDx44dadeuHS+//DIFBcaT2rXUS4AOHToQERFBjx49TMsiIiLIyMgwpV4CPPPMM0RERBAREcHly5e5fPkyERERrF271uy9ly1bxsCBA4mMjOSee+7hs88+M/tC5eTk8Nprr3HPPfcQGRlJ165dLb6EtrRt114UCgX39S196qtSqejfuyfHT50mJbXiJ2u/LFuOwWDgwaEDrS6vE1LbLLADUCmVtGvVgtS0dAoKCm9vJ8qxb9cWFAp7et47uPS9VY50730f8aeOkZaafFOv5+nljcrRifz8PLNyP//AO9LycerQWuwU9rS450FTmYPSkajOI7iScIScjMQy6zq7euHo5Fbp99LrtGz49X3a9BiLt3/l0pSqwsboOOwVdgzvWHpj56h0YGj7Zhw9f5WkzJxyahsZDJBXqMZgMFhdnl+kBsDX3dWs3N/D+LeT0nbP1vbs2opCYU/vfqW/H5XKkZ59+hN36jhpqSk39XqeXt44WvmOWuMfaHzSnJ9X8brVrVijRZ1ctU/2bWXjsQTjd7RNY1OZo9KBoa0bcvRiMklZZX++P+2Kwc/NhdEdm2EwGChQa2/qvWuU3GzmFqpvbeMrIXrvBhQKezr1GmEqU6oc6dBjKOdOHyUzLanMujcGdgBRbY3X0aQr5yp8bx9/Y4tZYYHlIAlVaWPsWeMxbNfUVOaodGBom8YcvZBEUlbZ7//Tzmj83FwZ3bl5yTEsO6uhhrcHdnZ3Nt2tfTNXsnL07I8tbZXKzS9mz9ECWjdxwaGCDN/svGK0Ouvn0spIzTC2DLo6V901c+Opi9jb2TGsRWlGjaODPYOj6hJzJY2knPwy6y7ZfwpfN2ceatPQePw0lf8Nbo+/Qr5GR78md0865n9d3bp1+eGHHzh69Ci7d+/mxRdftBgBc/HixWzevLnc11m8eDFffVV2A0BVkZa7cuh0lmkE149ss2TJElq1asWHH37I+fPn+fjjj/H19WXGjBl069aNp556ivnz5/Ptt9/i7u5udSjUgIAA5s6dy5QpU5g2bZqpqTYgIICUFMsbsO+//55PPvmEcePG8dJLL3H27FlTcDdjxgwAZs6cyY4dO5g+fTo1a9YkNTWV7du3V9XHUqEzCeeoXTMYVxfzJ74NGxjTuc6cO0+Av1+Z9ZNTU/nlj7954elJODreXNpaRlYWTo6OODrabtjZ8wmnCa5ZGxcX85v2ug2MN2EXEuLx8w+0VtUkPy8XvV5HVmYGq5f/RmFBPk2jyk53rE7Jl07iGxiGo7N5kFYjzJjKl3TpJB4+lU9PLs/+TYsoKsih84BJnDqyvkpeszJOXU4m1N8HN2fz71fT0OCS5SkEeZffJ27AO19RoNbirFLSvVl9Zgzpjq9H6XeicUgQziol81bvwMPVibAAHy6lZvLZim00CQmiXURYle/XNefOxlOjZi2L72i9BsYnyOcS4vHzLz+lKD8vF51eT1ZmOiv//oOCgnwioyxT5fR6Hfl5eeh0Oi5eOMcvP36Ls7ML9SIql34trDuVmEaorxduTubnsqa1AkzLg7ysP0jZf/YKUaFB/Lwnlm+2HCaroAg/dxce69aSUR2aWqyv1enJU2tQa/Ucv5LKjzuPUsPLjdq+ZY8Ed7sunTtFQHAozi7m+xBWz7h9l8+fwtuv8ilpOVnGoN3V3ctimV6vozA/F51OS+KlM6xcOhcnZ1dC69m2b++pq6mE+lk5hrUDS5anEeTlbq0q+89cIio0mJ93HeWbTQdKj2GP1ozqZLvWxlsVVlNFwhU1Nz7rOnNRTe8O7gT7K7mUdHMPGcpjb2/s46dS2hFey5GB3TxIydCRlFZ173EqKZMQH3fcHM1bEZsGG+9f4pIzCfJwtVaV/eeTiKrlzy8H4vh21zGyCtX4uToxoVNTRrYuv6/V6uPncXKwp2dE5frWCnEjCe7KUFBQQJMmlilFS5YsoXVr4024v78/n376KWDscHnixAnWrVvHjBkz8PHxISTE2BLRpEmTMtMwVSqVKS83NDS03DTMvLw8Zs+ezWOPPca0adMA6NSpE0qlkg8//JAJEybg7e1NbGws9913H0OHlqbtDBgw4OY/hFuUnpmFj7e3RbmvtxcAaRmZ5daf/92P1AuvQ48u5Q/ecaMrVxPZsWcfXTt1wN6GAwFkZqTj5e1rUe7t41uyvOKWgddnPMHVyxcBcHJ2ZuiD4+je576q3dBblJedipunv0X5tbK8rJtr9SnvfXau+pKeI160CCRtLTUnHz9Py4uyX8mFOjWn7FYRDxcnRnZpSVRYDVQO9hw+e5mlO45w7EIiv8wYawoYvd1c+PiRQbzzy1qemFuaWtyxYR0+nTAYB3vbtcpmZmaYvo/XK/2Oplf4Gi9Nn2T2HR0xciw9+1ieR87Gx/Hy9Emmv2vUCuGlNz7A3d22A8bc7VJzCqymRF4rSy2jb1VOoZrMgiKiLySx/+wVnuzZiiBPN5YfjuPDf3bioFBwf7vGZnU2Hj/HS0s3mv5uUtOft4d3s+l3NCcrFQ9vy4d8Ht7G80x2ZupNvd6G5QtRKOxp0d5yIJGLZ4/z6WtjTH8H1gjjiRdm4+pmu+AVSs4zVm7+S88z1lt+cgqKyMwvIvp8IvvPXObJ3m0J8nJn+cETfLh8Ow729tzf3jJIv5O8Pew5mVBkUZ6VY8wq8vG0r9Lgrl2kK8+OKb1OnbmoZv7SNIqrcECVtLxC/K2kRV5LlUzNtZ4hlFOoJqtQzdHLqRy4kMTEzpEEebiyPOYsH60/iINCwYiW9a3WzS5UszvhKt0b1MLV0Xpq6n/Zf3FAlf8iCe7K4OTkxE8//WRRfv2wpx07mneCrVu3LqtWrbLZNh05coSCggLuvfdes1bFjh07UlRURHx8PG3btqVx48b89ddf+Pv7c88999CggW369ZRFo9GgUlqelK61XGrKSS85EnOM7Xv28eX/Prip9yxSq3nro1k4qlQ8MXb0zW3wTdJo1Cit7J/y2v5pKk5levKZVyksyCc5+SrbNqxCo9FQXFz8rxiAQqspwt7BsuXTQWkMWnRaywv4rdi87H94+dWmReey+53YilqjQ2VlfhnHklRJtabszv+ju5m3sPZqHkHT0GBe/nElS3ceYULv9qZl3m4uNKwVyMjwmtQN8iPuSgrfb9rPG0vW8L9HB9/40lVGo1bjYO07qlSZlldkyrMvUlBQQHLSVbZsXINGrbb6Ha0VEsYb732KuqiIuJPHiIk+RFGR7dKi/79Q6/SoHCzPB6bvqJXMEsCUgplVUMRHI3txbzNjxkTvpnUZPvs3vtl6yCK4axteg68evY/cQjX7zl7hdFI6heX8BqqCVqPGQWl5nlGWnGe0msqfZw7sXMWezX/Ra9AjBASHWiwPqlWXKa99jUZdSEJcNHGxe1EX2X7gEbVWh8rKg0bHkhxFtbaMY6i57hg+1Jd7mxuv4b0j6zH8s5/5ZtOBf11wp1LaWU2r1JSUqZRVe207fqaQdxck4eKsILK+E6E1VDipqvY91Do9Siv5pI4lv0u1znr/qoKS45pVqObDIZ3o2zgMgF6NQrj/m1V8u+tYmcHdxlMX0eqLJSVT3BYJ7sqgUCiIjCw/ZcPjhj5fSqUSjcZ2o/1lZhpbvK5vkbteYqKxL9Trr7+Op6cn33//PR9//DHBwcE88cQTPPTQQzbbtuupVCo0WssndNc+G1UZKZN6vZ453yykd7cuNKxfz+o6ZdV795PPuHDpMh+++Qp+vhUPVnM7VCpHtFb2T3tt/1QVp5I2aFR6Ye7YpSfTnzQGpGMmTKmirbx1SpWT1VErdVpjQOCgdLJYdrOuJEQTu3c5o5/7Abs7ENA6qhzQWLk5vnaz5ai6uVNj/9aN+fTvLeyLu2AK7i6nZfHYnF95/+H+9GpuTMPp3qw+NXw8eX3JanaeSKBz47LnyLkdKkdHdNa+o1qNaXlFIq77jnbu0pNnnhwLwLjHJpmt5+LiSlQLY8DbtkNndmzdwEfvvsonX3xjNrKmuDmODvZodJbNEKbvaBmT3zoqjTejDvYKejct/X4pFHb0jazL/E0HSczKJfi6dEBfdxd8S1oEe0fW5duth5m4cCX/TB9lswFVlCpHdFrL84y25DyjVFXuPHPm5CF+nv8WjaI6MnDUVKvrOLu40bCZ8XfZrE13DuxcxdcfP8OLHy2lVpjthiN3VDqgsTLAwrWgwLGMfrfXyh3sFfRuVvobUijs6NusPvM37CMxM5dgb+spnbZkbw9uLuYBT06eHo3WgNLBslVGVVKm0VbtHAXZecXExhsfAOyLKWBoT09emxjI0x9eqbIBVRwd7NFaCeDUJb9LxzI6El4rd1Ao6NWwtC+5ws6OPo1CWbAjhsTsfIKtZI+sPnYeT2cVneqWP5Lqf5XhDvcN/f/izjcTiErz9DSmkMydO5c//vjD4t+1yRDd3d159dVX2blzJytWrKBTp068/fbbHDx4sFq209fbi4xMy9TL9MwsAPx8LFM2AdZt3salK1cZeG9vkpJTTP8ACgqLSEpOochKi8P/5n7FngOHefGZybSMsv38aN4+vmRlWqa1XUt18/Ypuz+hNW5uHjSJasWurdXX56w8bp7+5GVbpkRdK3PzKr+vVmVs+vMTQuq1xsuvFllpl8lKu0xhXqbpfbLTr972e5TH38OVtGzLlKi0kjQpf4+bTxMN9HIn+7qBfJbvi0Wj1dGlSV2z9bpFGm/WohOu3PR7VJa3t4/V1MvS76hlymZ53NzdaRrVgu1bN1S4bruOxvPQzu3ldywX5fP3cCEt17J16VqZv4f1oMvT2QlHB3u8XJywv+HBiU9JOllOBQOl9GoaToFGy5YT529hyyvHw8ufnEzLFPacknRMT2/L1PAbXT4fx1cfP01wSD0emz4Le/vKPZRp3tY42Neh3WsrWPP2+Hu4ms4p1ys9z1jvr1W5Y1g1GRQ3KyLMiW/eqm32z8/LgcwcPV4elsHOtbKMbNuOIrj3aD7OTgraNKm60SX93JxJzbPMQkgrKfN3t/5ens6OxuPnrLI8fq7GB2s5RZYPNhKz8zlyKYVeDUNQ2jAlWtz9pOXOhq6l7lXUmndtPXUFqVItWrTA2dmZpKQkeveu3ASlERERvPzyy/zxxx+cPXvW1F/QluqFh3Ek9jj5BQVmg6qcjIs3Lq8TZrVeSmoaOp2eqS++ZrFs/ZZtrN+yjXdfeZ7O7UsnCl/w/Y+s3bSFyY+Np2fXzlW7I2UIDa/P8ZgjFBTkmw1Yceb0cdPym6VVqyko+HeMLhhYuyHn4/ahLswz6wt39dxRAIJq3/5AGTkZiWSnX2HeKz0tlv0+7ykcnd2Z8YXtHkZE1AzgQPxF8grVZoOqxF4wBpUNa91cAGswGLiakWNWLz23AAMG9DeMMKAteZKvq8rOITcIC6/PsZhoi+9ofNwJAOrcwndUo1FTUFD26HDXaLVaiouLKajEyJqibBHBfhxIiCGvSGM2IEfsZeMDr4bB1h8iKRR2RAT7cfxKCtob0squ9dPzdi3/Bvha62BeJdJ3b1WtsAjijx+gsCDPbFCV8/GxJcsblls/NekSX37wFO4ePjz18rybmpBcp9NgMBRTZOPRMiOC/Thw9rLlMbxkHAm0YY1yjmENf45fTrZyDI2/wYqOoa1cuKrh3QXmI5lm5eo5f1VDozpO2NlhNqhK/RBHitTFJKZWXX87a1RKY4uQSxWOlhkR6M3BC8nkqbVmg6ocu5pmWm6Nws6OBoHenLiajlavR3ldau61fnreLpbZE2tPnMcA9JeUTHGb5NFAGYqLi4mOjrb4d+nSpUq/Rt26xif2S5Ys4ejRo8TFxVldz9/fHw8PD1atWsWhQ4eIjY21GhB6eHjw9NNP88knn/DJJ5+wbds2du7cyS+//MJjjz1GYaHxpDFy5Ei+++47tm/fzq5du3j77bdRKpXVEtgBdOnYgeLiYlauK+2gr9FqWbtpC40a1DeNlJmcmsrFy6WtFz26dOLdV563+AfQrnUL3n3leRo1KL0p/XXZcpb+9Q+j7x/KiEHVN2BMu07dKS7Ws2ntclOZVqth24bV1ItobBopMy0liSuXLpjVzc6ybNFMSU7k2NGDhNcr/2amujRseS+GYj1HdpQOAqLTaji6exk16kSZRsrMTr9KWuLZW3qP/g+/w4in5pn9a93DOOBBzxEvMnjC/25/R8rRq3kE+mIDf+4+airTaHUs3xdLZGiwaaTMxIwcziWbt4BlWGlN+W1nNJl5BXRqVHpRDg3wxmCA9UdOma279pBx7r+bDSBvRodOXSku1rNhzT+mMq1Ww+aNa6gf0dg0UmZqSjKXK/kdjY0+TN16pSls+Xm5VkcU3rTO2O+4bn3bpbv9f9CrabjxO3rghKlMo9Oz/NApImsHmEbKTMzK5VyK+THr26wu+mIDK46UXnPUWh2rj8YTHuBNQEmLUWZ+odWpPJYdMH5nG9e03Xe0RfveFBfr2bXxD1OZVqth79blhNWPNI2UmZGWaDG9QU5WGvPen4idnYLJry7A3cN6Kn5Bfg56nWVQsXvTMgBCwm07D2OvZvWMx3DfMVOZRqdn+YGTRIYEmkbKTMzM5VxKhlndvlH1jcfwUOlcoWqtjtVH4ggP9CHAs3oHobomv9CYDnn9P63OwN6YfLw87GkbWRpku7sqaB/lwqEThVyf3Rjo60Cg7621Lbi7Wr9t7dHe+FmevVR1XWN6NQxBbzCw7Ei8qUyj07M8JoHIGr6mkTITs/M5l5ZtVrdvo1D0BgP/xJR+d9U6PWuOnyfcz5MAK+nOa46fJ8jDhRa1K261/q8yGOzuyL//b6TlrgxFRUU8+OCDFuUjRozg/fcrnoQboHHjxkydOpXff/+db7/9luDgYKtzYCgUCmbOnMmsWbMYP348Go2GTZs2WX3NRx99lMDAQL7//nt++uknHBwcCAkJoVu3bqYWwJYtW/L3339z+fJlFAoFDRo0YMGCBaZg09YaR9Sna6cOfPPjz2RmZVMzOIh1m7eRlJLK81OfMq0387O5HD12gi0rfgcgpFZNQmrVtPqawQEBZi12O/bs46sffqJWjWBCa9ViwxbzqR5aNW+GT8nonFWtfkQT2nfuwa+LFpCTlUlgjVps37SG1JREJj7zsmm9ebPe4+SxI/y6cpep7IUpY2gS1ZqwOvVxdXMn6eoltmxYiU6vY9T4p8ze5+SxaE4eiwYgNycLtbqIZb/+AECjps1p1LS5TfavZngUjVrdy5Zls8jPScc7IJTYPX+RnXaF+8aWfvdXfP8iF0/v59WvS28giwpyObjFOPnwpTOHATi4ZQlOLu44OnvQpodxcvDwJpatrEWFxrnlQhq0oUaYbdNrm4XVoE/zCGb/s52MvAJq+3nxz/7jXE3P4a1R/UzrvfbTKg6eucTR2aWTy/d7awF9WjakfrA/jkoHjiRcZu3hk0TUDGBEp+am9Qa3i+THzQd499f1nLqcQt0gX05eTuavPTHUDfajZzPbDXTUoGFjOnTuxpJFX5OdnUlQcE22blpHanISk5550bTenFkfcDw2mj9XbTOVPTf5ESKjWlInvB6ubu4kXr3MpvWr0et1PDx+omm9Y7HRLPxqNu07dSW4Ri10Oh0nj8ewb/d26taPoEv3Pjbbv9sROmk0Sk8PnGoYA5eAAd1xqmkMmBVOkwABAABJREFUJM7PW4yunJFSq1Oz2oH0aRrO7HX7ycgrpLavJ/8cjuNqZh5vDetmWu+13zdz8FwiRz940lQ2om1jlh04yQcrdnIhLZsgTzdWRp8mMSuX2WNKv9+rouP5fd8JujcOo5aPB/lqLbvjL7H3zGW6NgylXV3r5+OqEFa/GS3a92HFL7PJy8nALyiE/dtWkJ56ldFPvmVa78e5r3LmxEHm/hZjKpv3/lOkJV+m16BHOHvqCGdPHTEtc/fypVGzDgDEHz/IH99/SPP2vQkIDkGn03L25GGO7t9ESN0mtOli2xGKm4UE0adZPWav2VN6DA+d4mpmLm/dX5q18NrSDRxMuMLRj0v7DI5o35Rl+4/zwd/buJCaRZC3OysPnzIew/Hm2731xDlOJxpbk3R6PacT0/l60wEAujWuQ4MyWnmr0t6jBZy+p4hJD/pRKzCb3Pxi+nR0R6Gw47d15g8fXn/S+Hub8v5lU5mftz1dWhkD1vDaxlatYb2MXVFSM3XsOGRssbynpRu9O7pz4FgByelanB0VREU4ExXhzMHjBRw/U3XpqpE1/ejdMIQ5W6PJKCiitrc7/8QmkJidx5sDSo/f6//s5tDFFI68UjqY2/AW9fgr+gwz1x3gQkYOQR6urDp2jsTsfD5/oKvFe51JySI+JYtHOjS+43MWiv8+Ce6smDp1KlOnWu+YfY21Vrjx48czfvx4s7IpU6YwZYr5IBnDhg1j2LBhZmW9evWiV69e3Mja+wwYMKDcqQ1eeOEFXnjhhTKXV4dXnpvCwiW/smHrdnLz8qkbFsIHr79EVNPGFVeuhLPnjK0Nl68m8sFncyyWf/b+WzYL7gAmTXuN334KZMeWdeTn5RISVpcX3vikwoCrV7+hHDm4m6OH9lJUWICHpzfNWrRlyANjCQkzD76PHT3En78sNCv77advABg+6lGbBXcAgx79mG3LPyd27wqKCrIJqBXBA1MXENLAcvLg6xUVZLNt+RdmZfs2GPfB07emKbj7N3hvzADmrdrBygPHySkoon4Nf2ZPHE6reuXPLdS/dWOiz11hU/Rp1DodNXw8GN+zHY/3aY+zqjR1x8vVmZ9njOXL1TvZduwMv++MxsvViSHtI5l6Xxero7BVpaenv8IvixeybfN68vPyCK0TzstvfkiTpuXPkdW3/2AOHdhD9KH9FBYW4OnlTVSL1gx/8GFCr/uOhoaF07RZCw7s3UVmZjoYDAQG1+T+UeMYPHyk1RFl/w3Cn3sUl7Bapr+Dh/UleFhfAK78vOJfE9wBvHd/D+ZtPMDK6HhyCtXUD/Jh9th+tKpT/mALTkoHvnlsEJ+v3cPfB09RqNUREezLnLH96dSg9PvdIjSIoxeSWBtzhvS8QuwVdoT5eTGjfwdGdbB9/+WxU95n5dK57N++koL8HGqGNODJF+dQr3H5WSZXLhivixtXfG+xrF7j1qbgrkZIfeo3aUPswS1kZ6aBwYBfUC3uHT6RXoPG4+Bg++/oew/2Zp7XXlYePmU8hsG+zH7kPlqFlx84Oykd+GbiUD5ftYu/D56kUKMlooYfcx4ZSKcI8xFBN8WeYcWh0gyBU1dTOXXV2Hcx0NOtWoI7gwFmfpvCwwO96XePByoHO85e0vDlr0kkplY88mqAj5KR/czTHK/9ffxMkSm4O3WuiIgwRzo1d8XT3Z7iYgNXU7QsWp7Bmp05Vb5f7w7qyJfbjrIq9hw5RRrqB3jzxQPdaBVS/ly2TkoHvh7di883H2F5zFkKNToiAr2Z/WA3OoZb/n5XHze28PVrElbl+/BvYpCEwWphZ7CWkyHEDa7GxVS80n9YsuLuHJnqerFXbX+Bv5MeKPruTm+CTZ2pW32px3fKhUaWT7TvJj1/fbLilf7DdtSbVPFK/3H3nP/mTm+CTY3d/u+Yb9VWfmj2453eBJtzGffGnd6EMsWfvVDxSjZQv67lFCl3M2m5E0IIIYQQQtiUTGJePaR9VAghhBBCCCHuAhLcCSGEEEIIIcRdQNIyhRBCCCGEEDYlaZnVQ1ruhBBCCCGEEOIuIC13QgghhBBCCJuSlrvqIS13QgghhBBCCHEXkOBOCCGEEEIIIe4CkpYphBBCCCGEsClJy6we0nInhBBCCCGEEHcBabkTQgghhBBC2JTBIC131UFa7oQQQgghhBDiLiAtd0IIIYQQQgibkj531UNa7oQQQgghhBDiLiDBnRBCCCGEEELcBSQtUwghhBBCCGFTkpZZPaTlTgghhBBCCCHuAtJyJ4QQQgghhLApabmrHtJyJ4QQQgghhBB3AQnuhBBCCCGEEOIuIGmZQgghhBBCCJsyGCQtszpIcCcqpcjB9U5vgk15GzLu9CbY3Kkz7nd6E2xKnRF9pzfBpnJeXXCnN8Hmev765J3eBJvaNPLuPoa+sY/e6U2wua1j5t3pTbCpTksm3+lNsKncnfF3ehNszuVOb4C44yS4E0IIIYQQQthUsQyoUi2kz50QQgghhBBC3AWk5U4IIYQQQghhUzIVQvWQljshhBBCCCGEuAtIcCeEEEIIIYQQdwFJyxRCCCGEEELYlEyFUD2k5U4IIYQQQggh7gLScieEEEIIIYSwKRlQpXpIy50QQgghhBBC3AUkuBNCCCGEEEKIu4CkZQohhBBCCCFsSgZUqR7ScieEEEIIIYQQdwFpuRNCCCGEEELYlAyoUj2k5U4IIYQQQggh7gLScieEEEIIIYSwKelzVz2k5U4IIYQQQggh7gIS3AkhhBBCCCHEXUDSMoUQQgghhBA2VXynN+D/CWm5E0IIIYQQQoi7gLTcCSGEEEIIIWxKBlSpHhLcCZvQaLUsXryYzZs3k5eXR52wMMaOHUvLli3Lrbdr925Wr17N+fPnycnJwdPTk4YNG/Lw6NGEhYWZv4dGw19//cWmzZtJSUnBzc2NRo0a8fDo0YSGhtpw74z79+PiJWzassW0f+PGPkyrFi3Krbdr9x5WrVnDufMXyDXtXwRjHnqIsDDzbS4sLOSHxT+xc+cusrOzCQoKYvCggQwc0L9K9sFJBfe2caBJqAKlA1xONbB6v46r6YZK1ff3tGNAewdCA+3QF0PcpWJW79ORX2S+nh3QOdKedo3scXeGtBwD247qiUkwT9Co5WdHywb21Pa3I8jHDnuFHa98p7b63o5K6N7cnsahCjxd7cgrAueEhyjavQZDbmblPgB7B5w69UfZpC12js7oU6+i3rkS3YW4cqu5P/EWCk9fq8v0mSnkffuu9berGY7bQ88BkDP3JQyF+ZXbzltkp1QS8uRE/Pv3x97dnYIzZ7g4fz7Z+/ZXWNe3T29qjh2LS5066AsKyNi+nQuz56DLzi6zjntUFJHffQvA/p69yl23qmh0euZtPMCqI6fJKVRTP8iXKb3b0KF+7UrVXxtzhiW7YjmdlI7SXkF4gDeTe7elXd2aABRpdcxcsZPYS8kkZ+ejNxRT28eTIa0ieKB9E5T29rbcvVti7+pC+PQJeLWNwqtNJCofL45OeInLP/51pzfNglarYdnPX7F7yxry83OpHVqP4Q8/SdPm7cqtd3DPFvbt2MC5MyfIzkzHxy+Q5m06M+iBCbi6uZutq9GoWbfiF3ZvWUNaylVc3Dyo3zCSIaMep1ZIXVvuHgB2KiX1X32aGiMHofTyIPd4HPHvziZ9y+4K6wYN70+dZybg1rAu+rx8UlZvIe6N/6HNyDJbT+XvS4O3p+HftysObq7kxSWQMOtrkv9eV6X7otdp2L92NnGHl6MuyME3OIJ2/Z6hdoNOFdbNy05m1/KZXDq9C4OhmJr12tFp0Mt4+pb+Vk8dWMbmpa+U+Rq9HvqEBi0Hmv6+dHo3hzYtICPxNMXFerz8w4js/DARrQbf3o5ez94Btz7DcWrZCYWzK7rES+St/wNN/LFyq/m9OAt7H3+ry3RpSaR/8rzpb4WbB279HsSxYXPsHJ3QpVwlf8s/qGMrPlcLYc0dT8ucM2cOERERpn/t27dn7NixHDx48KZeo0UFN9XWbNy4kSVLltx0vesNGjSIiIiIm9re1q1bM2fOHNPfY8aMYeLEibe1Hdb88MMPbNu2rcpftzJmzZrFX3/9Rffu3Zk4cSIKe3veePNNjh0/Xm698+fP4+bmxuDBg5kyeTIDBgzg7NmzPPvccyQkJJit+/HHH7P4p59o1qwZT06cSL9+/Th27BjPTZtGcnKyLXePT2d9zrK//6ZHt6489cTjKBQKXn/z7Qr371zJ/g0ZNJApk55iQP9+nD2bwNPTpnE24ZxpPb1ezyuvv8mqVavpck9nJj7xOLVq1WTul/P5Zelvt739dsC4Pkqi6irYc1LP2gM6XJ3hsf5KfD0qfrLm4QJPDDCuu/6gnh2xeiJqK3jkXiX2N5xVere2p19bB85cKeafvTqy8wyM7K6kWbj5ihG1FbRuoMBggIycsgNMO+DRfkraNbLnxIVi/tmjI+asHmVEc9xGPwdKx0p9Bs79HkbVugfaEwco3PwnGIpxGf4U9jXDy61XuHkZBasWmf0r2vEPALrzp8rcaueeIzBorAertlDvrTcJHj2a1DVrOf/pLAz6Yhp98QXuUVHl1gscPpyIDz5Al53D+c8+J/mvv/Hr04cm87/ETqWyXsnOjjovPI++oMAGe1K21//Ywk87Y+jfvD4v3NcJe4UdUxat4fD5xArrzt94gJeWbiTI05UZ/TsyuXdb6gf5kpJTGnSrtTrOpmRwT0QIT/dty7R+HWgQ7Msnq3fz+u9bbLlrt0zl502D16fg1jCc3JjyH1Tcad988Q7rlv9Mh673MvqxaSgUCma98yynT0SXW+/7eR9w9fJ5Onbtx+jHpxPZsgMbV/3Ouy9OQKM2f7r01aw3+Ovnr2gY2ZLRj0+ne9+hxB2P5t0XHiMtpeLvye1qtmAmYVPGkfjbP5x88QMM+mJa/bEAr/blP+isPWEkzb//FG1mNqde+YhLP/xO0PB+tPnnexSOpb9De3dX2q1fQtCgPlz6/jfiXvsEfV4+LX78nOD7B1Tpvmz69SWObv+BBi0G0nnIK9gpFKz6diKJ5w6VW0+rzmf5/LFcTThAq54Tadt3KmlXTvL3l2Moyi99GBcc3oaeoz62+OdfszF2Cntq1WtvWvfc8c38880EivVa2vSZQrt+z+KgdGTTLy9ydPsPVbbPng88gcs991J0ZDe5K37CYCjG65HpKMMalFsv958lZP863+xf3trfAdCcLg0M7Ryd8H7qdRybtqFg32ZyV/2CQV2E18NTcWreocr2Q/z/8q9ouXNycmLRokUAJCUl8eWXXzJ+/HiWLVtGgwbl/4AA7r//frp27XrT77tx40aOHTvG6NGjb7ouQHx8PHFxxovnP//8Q+vWrW/pdd58800UiqqPs3/88Ue6det2S5/N7YiLi2Pbtm1MmDCBEcOHA9CrZ0+efOopFi5cyKxPPy2z7uiHHrIou7dvX8aMHcuqVauYOnUqAGlpaezavZvhw4fz2IQJpnWbNmnCSy+/zO7duxk6dGgV75nRqbjTbN2+nccefYT7hw8DoFfPHjwxaQrfLvyBzz/9pMy6Dz80yqKsX98+jB73CCtXr+aZKZMBYwvfiZMnmfbM0/T9P/buOzqqog3g8G9LNr0npBIgAUIn1NCrdBQFVFBQFD9BUVFs2EHFgp2ioqIUEVFE6b333nuHENJ73fr9sWTDspuEkiWI73NOjmbuzN0ZdnP3zp13Zrp2AeDeXj354KOP+e33OfTo1hUfH5+bbkO9akqqBCn5bbWOQ+fMI2gHzxoZ1V/DPY1VzFmnL7V8hxg1Tk4wab6WzCv3wnHJRob20NC4hpKdx83n9HKDNvVUbD1iYOFW8zl3HTfyv14KujdTc/CsFtOVftz2owbWHzCgN8C9LdUEltC8ypUUVA5UsmCLjm1Hi0f/msX/hVuPQairRqM/eaDU+quCq6Cp3YT8dX+j3bkGAN3hHXg88SYu7fuQ+9tXJZbVn7I9t3OLbuZzHLH/kEfTsBUKT1+0B7bg3LRjqXUrDx516xDYrRvnvv6G+F9/BSBp8WJi5vxOlRde4NBVfzNXU6jVVBnxLJm793BkxAhLevaBA9T++iuCHrifBDsPF4L6PoBzUBCJ/8wn1M5n3BEOXkxk2YFTjOrRgsfbxgBwb6Oa9PvmD75eto0Zw0v++z9wIZEpa3fzco+WDG5TcmfX282FX5/pa5X2UGxdPJw1/L7tEK/0akWAp1u5tKe8FF5OYlV4awoTU/BuUo822/6q6CrZdfrEYbZvXMHDQ16g5wODAGjdsSdvPT+QOdMm8s74qSWWfe71T6hdv4lVWtWoWvz4zVi2rF9Gh673A5CWmsSurWvpcf8gBjzxgiVvdJ0YPnnnWXZtXUv3PrbfOeXFu0l9Qvr34thb4zk38RcA4mfPp/X2BUR/8Arbu9h/bYWTEzXffZG0TTvZ1edJS3rGjn00+eM7woc8yIUp5gfTlZ94GPeoKuzoPYS0DdsBuPDTbFqs+Z3oca+T8M8KTDrdLbcl8cIBTu1bQsver9Kog/n6Ed3kfn7//F62LPqMfs//XmLZQ1tmk5lynn4v/ElQRH0AImq14/fP72Xf+l9o0XMUAN7+la1G8gD0ugI2zBtLWPVY3LyKR8IObv4Vd89A+gyfjkpt7uzWbfEwv43vybGdf9Ow3ZBbbrM6PBKXmJZkL55N3oYlAOTv2YT/Sx/j0XMA6d++X2LZwiO2HV73TuYRxYJ9xaO2rrGdUAcEk/bDx+hOHzG/xrbV+I14D49ej1BwcAcYDLfcljuFCQnLvB0qfOQOQKlUEhMTQ0xMDN27d+f7779Hr9fz++8lXyyuFhwcTIMGDRxcS1sLFy5EqVQSGxvLsmXL0N3kBbR69epERpY+WvBvsmnTJpRKJT169LCkaTQaunXtytGjR0lOTr6h8/n4+ODs7ExObvET9fz8fMuxq/n5+Vlez1E2bd6MUqmkZ4/uljSNRkP3rl04euwYSTfZvtyr2lc0Ati+XVurvB3atUOr1bJl2/ZbaAHUq6okO8/E4XPFnaPcAnMHr3aE0mb0zV754xeMlo4dwOl4E8kZRupXKw5Vq11FiVqlYPtR6y+n7UcN+HgoiKhUfKHPKQD9dXyHOTtdyZ9vnW7KyTL/z3X8HTpFx2AyGtDuvyo0yqBHd3Ar6rBIFJ4+ZVfk6vPVboIxIwVD/FmbYwoXN5zb9KZw8xJMhfl2Spc//86dMen1JP5dHIpn0mpJmr8Ar4YN0AQF2S3nFhWF2suL1JUrrdLTN23CkJtLQNeuNmXUXl5EPPMMF7+fgiEnu3wbUopVh86gUiro16yOJc3ZSc0DTWux/0IiCRk5JZb9dfMBAjzceLRVA0wmE3mFN3btDvU1h/5l59++kdjrZdTqKExMqehqlGnXltUolSo6drvfkqbRONOuy32cOn6Q1OSSoy+u7dgBNGnRAYDLcecsaQX55pFkLx8/q7zefgGW13OkoD7dMOr1XJxW/EDEWKjl0oy/8I1thEtYsN1ynnVq4OTrzeV5S63Sk5etQ5+dS0i/4tB8v1ZNKExOtXTsADCZSJi3DJfgQPzaNCuXtpw+sByFUkXdFg9b0tROztRu3o/E8/vIzih5FPT0geVUqlzf0rED8K0USXj1Fpzav6zU1z13eC26wlxqNrrXKl1XkIuzq7elYwegVKlxdfdF7eRyo82zy6V+c0wGA/nb1xQn6nXk71yPpkoNlN5+JRe2d76YluhTk9CdP2lJ01SLxpiTZenYAWAyUXBgByovHzSRtW+1GeI/6I7o3F0rNDQUPz8/4uLiMBqNfPvtt3Tq1Il69erRvXt3m07ftWGZ27dvJzo6ms2bN/Pyyy/TqFEjOnbsyI8//mjJM3r0aP7++29OnjxpCQkdPXo0YB6R+9///kdsbCwNGzakW7duVmUBTCYTixYtokWLFjzxxBNkZGSwceNGm7asWrWK7t27U79+ffr378+BA7ZP/a8Nyxw9ejS9e/e2ypOVlUV0dDTz5s2zpK1evZq+ffvSqFEjmjZtSt++fS1hmJ06deLSpUvMmjXL0r6ryzrS6dOnCQsLw93N+ol2zeho8/FrwivtycnJISMzk7Nnz/L1N9+Ql5dHTEyM5XhISAgBAQHMmzePbdu3k5ySwvHjx5k4aRLBwcEOHa08dfoM4XbaF31llPnMGdsb/GtZ2nfuHF99M9HcvqvC5XQ6HUqlEicnJ6tyzs7mm5GTp07dUhtC/BXEpxq5NvjxYrIRjZOCAO+Sn655uYGHq4K4FNvQybgUE6H+xWVD/ZUU6kwkZVjnjUs2Xjl+40/xLqWYKNSZuKeJisgQBV5uUC1YgUuHPugvny9zzhyAslI4xrQk0FqHcOkvnwdAVSn8uuujrBSOKiAE7VH7o3bObXphys1Cu3/TdZ/zVrlHR5N/4QKGXOt5fTlXHhq4lxARURR2aSy07bQYCwtxj44GhfV7Vnn4cHSpqSTcputLkWOXU6ji74OHi/WDnHrhlSzHS7Lj9CXqhlfit60H6TBuOi3HTqXzxzOYvdX+PBqd3kB6bj4JGTmsPnyWGZv2E+rjQWV/7/Jr0H/M+TMnCA6NwNXNwyo9soa5s37h7IkbOl9mRioAHl4+lrRKweH4+Vdi2fxZ7N2xkbSURE6fOMz07z4hMCiU2La2DyvKk1eD2uSdOoch2/rvMGP3QQA869eyW64o7NKYX2BzzFBQgFeD2pa/Q6WzBqOdhwyGK2W9YurYHLsZKZeO4hNQFY2L9fsVFGF+sJ566ajdciajkdTLxwkMr2dzrFJEA7JSL6AtKPlBzIm9C1E7uRBZv4tVemhUc9IST7J92TdkppwnM+UCu1Z+S1LcIWI62o9MuFHqsCoYUhIwXRPqq7942nw89Prn9qtDq6AOCqNg39ZrDqgx6bQ2+YtC+NVhVW+s0nc4k0lRIT//NXdEWOa1cnJyyMjIoFKlSowfP54ZM2bwzDPP0KhRI9atW8d7772HXq9n0KBBpZ7nvffeo0+fPkyePJlVq1bx+eefEx0dTbt27Xj22WdJS0vjzJkzfP7550DxqM/w4cMJCAhg3LhxeHh4cOHCBRISEqzOvWfPHi5dusSIESNo06YNPj4+LFq0iE6dOlnyHD16lBdeeIF27drxxhtvEBcXx4svvohWa/uHfKMuXLjAyJEj6dWrFy+//DJGo5Fjx46ReWURg0mTJvH000/TuHFjnnzSHNYRERFxy697PdLS0y3/llcrSktLTS3zHC+NGkVcXBwArq6uDBwwgG5XjRqo1WrefustPh0/nrFjx1rSa1Svzheff46Hh4fNOctLWnoafn6+NulFaalpZbdv5MuvEBd3CTC375EBD9O9a/GXV3h4OEajkaPHjlGvbl1LetGIXup1/BuWxtNNwbkE285Z9pUpU15ukFjCuiSebuYLZXa+vfIm3FwUqJRgMIKnq+0I29WvU3SuG5FXCL+v1fNAazVP9Sy+sdedzSRv/lQwlb2TjtLdC1Nulk16UZrS4/pv2jV1zOHY9kIylYGhaBq2Ju+v77HEn94GmoAAtCm2nxFtirnDowkMsFuu4MIFTEYjng0bkLRwoSXdpUoVnK78/aq9vCyLpbhVr05w3wc4MvJFMN7eHYySs/LshkQWpSVn2Z//l5VfSHpeAfvOJ7Dj9CWGd25CsLcH8/cc55OFm1ArlTwYa31DvOrwWUbPWWX5vW5YIGP7dUBd1hC3KFFGego+frYLE/n4mj+bGWk3FgGx+K8ZKJUqmrUq/g5Wq9U8N/pTvv/iHb4e97IlvWpULd7+9CebxVfKm3NwIIUJtu0oSnMJqWS3XO6pc5iMRnxaNObSrOLRd/fqVXEONP+bOfl6o0vLIPfkWfw7tMSlcigFF+Mtef1amUc3XULtj9LfqLysZKuwyCJunua03Kwku+UK8jMx6LW42ynrflXZazuNAAV5GVw4tpFq9e6xOd70nmfISotj9+rv2b3qOwDUTq50f2wC1ep1vrHGlUDl6YMhO8MmvShNddWDhLK4NGoFWIdkAhiSE9BUr4fSxx9jRvE1W1Mt+spr2N5rCFGWO6Zzp9eb5+MkJCTw6aefYjAYaNWqFa+99hpDhw61zLVq06YN6enpTJ48mYEDB6IqZbWyrl27Wsq1bNmSdevWsXz5ctq1a0dERAR+fn7Ex8dbjQilpaURFxfHW2+9ZemotWjRwubcixYtwtnZma5du+Lk5ES3bt1YsGABubm5uLu7A/DDDz8QEhLC5MmTLfV0dnbmrbfeuuV/ryNHjqDT6XjnnXcsHZm2bYtD+OrUqYNGoyEgIMCqfbdDYWGhzYgTgOZKWuF1dG5HvfQSeXl5XE5IYOXKlRRqtRiNRqu5iR4eHkRGRtK2TRtq1apF/OXL/PHHH3z08cd8NG6cw0IztYXaEtpnfr3CwrLb9/KLL1rat2LVKgoLC63a17F9e2bN/p0vv57AiGeHExYayp49e1m4eMl1v0ZpnFSgt3MvrjeYOyBqtQJsxvWKy4L9aQBFYZVOajBowUmtwGCwPY8l300uNpibbyI+zcjWoyaS0k2E+CvoXC8Ktx6DyFvwc9kncHLCZLCdV2jSXwnPU9u+v/YpcKrVGEPiRYxptmFkrp36oz9zpJSFVhxD6exs92mw8crfntLZftiSPjOT1FWrCOzdm/yz50hdtw5NYCCRr76KUadD6eSE0rk4lK3aq6+QvmUrmdtvLUz4ZhTqDWjUtp0rZyf1leP2540WhWBm5BXw6YB76N6gOgBd6kXRb8If/Lhut03nrnlkKFOe7E12fiHbT1/iREIq+drS56WK0mm1haidbK/RTldCJbU3sPjQ1vXL2LBqAT37DiY41PohpruHJxHVatKsdWeqR9cj8XIci+ZOY/L4N3h17CSHhmaqXJ0xam1DfotGxpWu9v8OdWkZJPy9jLBH+pB7/DSJi1bhEhJE7c/ewqjVotRoULqY631x+lwqP/kwMdO/5NjoTyhMTiXkge5U6n2P+TVcyidEUa8vsAqBtLTxygJWep3990uvM496lVbWUELZ0weWYzTorFbItJRVa/AJrEpU/W5E1u+CyWTkyLY5rJr9Kvc+/TPBVWKuq12lcnICe9eRK98TCjufX7sUClwatkB36RyGpHirQ/k71uEa2wmfR58ne9EsjNmZODeIxblukxt7DSGuckc8dszLy6Nu3brUrVuXzp07s337dt59913c3NzQ6XR0797dKn+PHj1IS0vj3LlzpZ63TZs2lv9XKBRERUXZjMBdy9fXl7CwMMtqj/by6/V6li1bRvv27fH0ND/5u/fee8nPz2flVXNV9u/fT8eOHa06oNe25WZFR0ejUql45ZVXWLNmDdnZt2+uS1mcnZ3tzj/UXklzvo5OV+3atWnSpAm9e/Xiww8+YO3atfwybZrleG5uLq++9hq1a9fmiSeeoGXLlvTr25e33nqLw4cPs+KaOUPlSeOsKaF95htnZ+ey21endi2aNmnMvb168tH777Nm7Tp+njbdctzPz5ex776NTqfjzbff5fEnn+LHn3/h2eHm8F3XEm4K7FGpVKhUKjxcwcPVHM2jM4Cd+2LUKvNIml5f8iiTzlB0Xnvlr+TRF/3XhEplOzpnyXcT88R9Pc2reu4+YWT9fgNHLxhZs9dA/qo/cIpuhLradYQh6XQoVLbPthRFnTr99c3BUlWujtLTF62dUTun6MaowqpRsO72L0FvLCy0e1OgtIRd2oZ7FTk97iMyNm+m6ksv0mT+P9T/6UdyT58i/UrYedGKmP5duuDZoAHnvv66/BtwHZzVKrR2nlAUXvnwOavtP7t0vvJEQa1S0qVe8VxnpVJBt/pRJGbmcjnD+nrq7+lGi+rhdKkfxdv3t6NdrSoM+3kRKdn2RwdF2TQaZ/R2HkDornTqrrfTdfzwXqZOGkf9Ri3oP+gZq2N5uTl89MbTVK9Vn4ceG0Hj2Pb0uP9Rnh/9KSeO7Gfj6oUlnLV8GPILUWpsHxQVPSCxF3ZZ5PDI90hesYFaH71O+wMriV3+K9lHTpK0dJ353Lnmz17O4RPsH/oqbtUiaLFqNu33ryBi+GCOjf7YKt+tUqtdMOht36+ijpm6hFWKi+a/lVZWVULZk3sW4uzmTUSttjbHNvz9AeeOrKXroC+p0agXNRvfy73DfsHNM5BN/3x0fY0qi04H9q4jV74n7D1As8epWi1U3n4U7LXd/kKfcJHM379F5V8Jv2ffJeD1L3Br3ZXsheYFc4zakj8j/0YmFBXy819zR4zcubi48Ouvv6JQKPD19SUkJASlUsn8+fMBCAiwDiEq+j0jI6PU8xZ1vIo4OTmV2QlSKBRMnTqVr776ivfff9/S8XzjjTdo1sw8MXnz5s2kpaXRsWNHsrLMYVw1a9YkMDCQRYsWcf/99wOQnJyMv7912ImHh4dl3tStqFatGt9//z1TpkzhueeeQ6lU0qZNG959911CQ0Nv+fy3ws/XlxQ7YYNpaWnm4/62oTil8fT0pGGDBqxdu5b/PfUUYF7UJD09nRax1vshNahfHzc3N44cOULvXuW7DHQRP18/u2GRaWnmOEZ/O6FGpfH09KBhwwasXbeep58qnitQv149pk39kXPnzlNQWEBktWqkXvk3DA8Lu65zu7i6EhxmXn3szWrmtPFzCsnOM2Fvkb+itBIi2gBz6CWAp6vtBdPTTUFegQnDlXvu7HyIDCn5dYrOdSOa1FChVsGxC9Y39rpT5nksqrBq6M8esVfUwpibZTf0UuHuZT6ec317tGnqNMVkNKKzM9/OpUMfdMf3YjIYUHiZQxoVzq7m/3r6glJlNzS0PGhTUtAE2oZBaa5cO7XJJc9HM+TmcuzlV9AEBeESGkrh5csUJiRQb+pUdGlpGHLM82OqjnyB1FWrMel0OIeY32TVlTA35+AgFE5O6FIct7BHoJcbSZm2H9SiDlegl/1VLL1dXXBWq/B0dUZ1zSrFfh7m9ycrv5AQn5JD9u6pF8nEFTtYe+SczSifuD4+vgGkp9qGLGakmz8zPiXsEXa1C2dP8PW4VwiPiOS51z9Bdc0Dm11b15CZkUaj5tadg1r1GuPq5s7Jowfo3KP/LbSidIUJybiE2oZeOgeb21Zw2X4oI4A+K4e9A5/DJTwE14gw8i/GU3AxntiVv1GYnIo+s/heJnH+CpKWrMWzfjQKlYqsfUfwa2u+X8k9da5c2uLmFUhupm10Ql62+T1097IfYupyZdGT3Czb9zq3lLLZ6fHEn91NndiHUKmsO8gGvZZjO/4ipuNQFFf9DatUTkTUasehzbMw6LV2RwtvhCE7w25YpOrKgluGrIzrOo9ro1aYjEbb+XZXFB7cSfKRPahDIlAolegunbMspGJILn1AQgh77ojOnVKppH79+jbpRSshpqamEnTV6m4pV24YbmUp+NJUq1aNCRMmoNPp2Lt3L19++SXDhw9nw4YNuLu7s/DKXJQ33niDN954w6pseno6qamp+Pv7ExgYaNMJyMnJodDOYgVX02hsR4Yy7WwI3K5dO9q1a0dOTg4bNmzg448/5o033rBsK1FRIqOi2H/gALl5eVaLjhRtGxF1EyuDFmq15F21h1ZGurkjZbxmno/JZMJoNGJw4NLBUZHV7Lbv2JX2RUZWu+FzarVacvNsN7VWqVRERRX/e+3duw+ARjGl71VmOW9hIQmXzHMXFx8wf4Hm5MPlNBNVg5RcG3xZOVCJVmciJbPkTldWHuTkmwgPsO3chQcouJxWXPZyqpFm0Soq+SisFlWpHKi8cvzGO3cergpQgFIBV7/LiqKhRGXZsZ7GpDjUETVA42K1qIo6pCoAhqS4siuiUuNUMwbDxZN2O2lKLz80dfzQ1LFdrc7z8dcxJMWRM/3Tsl/nJuQeP4F3kyao3N2tFlXxqGeev5l7ouzFKrSJiWiv7Bep8vDAo3YtUtcUrxrnHBxMYI/uBPawjUZoOGsWucdPsP8mt5m5HtEhAew8c4CcAq3VoioH48w3zLVC7M8rVCoVRIcEcPhSEjq9ASd18eelaJ6er7trqa9dNDqYU8a1XJQsolpNjh7cTX5ejtWiKmdOHLYcL03i5Tg+HzsSL29fRr37NS6utp35zAzzw7CSvieMDl5iPvvgUfzaNUfl6W61qIpP0wZXjpcdrl0Qd5mCOPNKlGpvT7xj6pKwYIVNPpNOR9ae4gWB/DuY53ilrrPfobhRAaG1uHR6O9qCHKv5b4kX9ptfL8z+qo4KpRK/4Jokx9kuVpR4YT9e/pXtzrc7uXcxmEx2QzIL8jIwGvWY7MzzNRr0mExGTNcx97os+vjzaCJro3B2sVpURR0RZTleJpUa53rN0J45itHO/D0LgwF9XPFibJrq5gVotKdK3zv338Z4+6ae/6fdEWGZJalfvz5OTk4sW2a9VO7SpUvx9/enatWqt3R+JyenUjtaTk5ONG/enKeffpqcnBySkpLIz89n9erV3HPPPcyYMcPq58svv0Sv17NkiXleVIMro01XdzSubYs9wcHBJCQkWC2Nv3nz5hLze3h40LNnT8uG39fbPkdp07o1RqORpUuLl3HW6nSsXLmS6OhoAq+MKCQlJXHx4kWrsvZGYxMTE9m3bx81qle3pIVdGbm6dpP2bdu2UVBQQFRUVHk1x0bbK+1bsrT4vdTqdKxYtYpa0dFUuqp9F66jfQmJiezbt58a1WuU+roZmZn8MfcvqlWrSqPrnEdpNBopyM+jID+P0/EmTseb0Bvg0Fkjnm4K6lYtvgS4OUP9akqOXTRaRt4A/DzNP1c7fM5IdIQSb/fitKgQBYE+Sg6eLf68HzlvRG8wEVvbusPVvLaKzFwT55Nu/EqfkmlCqVBQ/5pN0J1qmecoGBPL7pjpTuxDoVShadiqOFGlxql+LPr4s5iufAkrPH1R+tlfkEAdWQeFi5vdkEyA3L9/tPnRHjXvfZS3eAb5axy3umTq6tUo1GqCrtrrUeHkRKV77yX74EFLp00TFIRrlbJXfKvy3AgUKhWXf5ttSTv28is2PykrzDedJ999l7NfflnOrbJ2T71IDEYTf+0sHqXV6g3M332M+pUrEexjvmG8nJHN2STr1YG6NYjCYDSxYG/xyqqFOj1L9p8kspIvlbzMH+z03HxMdhbCmbfTfFNeJ8z+aIUoW7NWnTAaDaxd/o8lTafTsnH1IqJq1sM/0Px3l5qcQPxV2xuAeXTvszHPo1AoeWXMBLy87S86UTT/bvtG687Q3h0bKCzIp0pk2fvo3oqE+StQqtVUHvKQJU2hcSJsUF8ydu6n4JJ5VMYlPAT3GmU/FKz53igUahXnJpf+ANctqgoRTz5M0tK15JXTyF1Ug26YjAYOb5tjSTPotRzb+TdBEQ3x9DGP3menx5OedMambNLFgyRdPGhJS086w6VT24lqYH+qysm9i/DwCSWkmu22F64e/ji7enH20EqrcE9dYS7njqzFp1JkuWyHUHBwJwqVCtfY4kV6UKlxbdoO7YVTGDPNDw+UPv6oAu2EqADOtRqidHO3G5JZEpV/EK4tOlF4ZC+GFBm5Ezfujhi5K4mfnx+DBg1i6tSpaDQaYmJiWL9+PYsWLeKdd94pdTGV6xEVFcVff/3FokWLqFKlCr6+vuTk5PDpp5/Ss2dPKleuTE5ODlOmTCEsLIyIiAiWLl1KXl4egwcPJvaakECAn376iUWLFjF48GCefvpp+vfvz4gRIxg4cCBxcXFMnTq1zLDMrl27MmHCBN58800eeughTp48ydy5c63y/P777+zbt4+2bdsSGBhIXFwcCxYsoHXr1pY8kZGRbNu2jc2bN+Pl5UV4eDi+vo5fealWrVq0bdOGadOmkZmRQUhoKKtXrSIxMZEXR4605Pv8iy84ePAgS690hgGeefZZYho2JDIyEg9PT+IvXWL5ihUYDAaeeOIJS77Y2FiqVKnCb7Nnk5SUZFlQZeHChfj5+VmtrFn+7YumbZvW/DJ9BpmZmYSGhLBy9RoSE5MYNbJ4o9zPvvyKAwcPsXxx8byOYSOeJ6ZhA6IiI/Hw8CA+Pp5lK1aiNxh4csjjVq/zyuujqV2rFqGhIaSnZ7Bk2TLy8wt4f8y7t7zp/aFzRi4kGenXVk0lHwO5hSZa1FahUMCqPdZPs4f2MI+KfPZH8Zfouv166lXT8FRPDVsO69GoFbRtoOJympHdJ4p7hll5sOWwgXYN1KiU5i0Q6lRRUi1YyZy1OqsFJH08oFF189902JVRwY4x5t/Tc0zsO2U+7+6TBtrUV3F/azWh/gYS002E+itxiX4AQ3I8upP7y2y/4fJ5tMf24NL2PpRunhjSk9HUi0Xp5U/ust8s+dx6DkYdUYPMz563OYemdlNMeh26E/vsvoa9zc5VlcwPJfRnj2DKtx2pLS85hw+TsnIlEc+NwMnPl4KLcQT27oVzaCinP/jQkq/G+2PxbtKELU2LRxfDHn8ct6gosg8fwqQ34NehPb4tW3L+22/JOVLckUq75sEKgHu0+WY5ffMWy4qajtKgchBd60UyYfkO0nLyqezvzcI9x4lPz2FM3w6WfG//uYZdZy+z/6PhlrT+zeswb+dRPlqwifMpmQR7e7Bo3wkuZ2QzYXDx/pyL953kz+1H6FinKuF+XuQW6thy8iLbTsXRvlYVYqOuLzz6dqvy7KM4eXtZQgIr9epo2VPt3OSZ6LNKXnr+domKrkez1p2ZO3My2ZlpVAqpzKY1i0lJiufJ54sXHfvh6zEcO7SH6fN3WNK+GDuS5IRL9Ow7mBNH93PiaPHfvLePH/VizN/NjZq1JSwikvlzppKSlGBZUGXVkj/x8Q2gXZc+Dm1j5q4DXJ63lJpjXkIT6E/emfOEPXI/rhGhHBrxtiVfgymf4Ne2Ocu8ike/qr30FJ51apCx6wAmvYGg3p0J6NyGE+9/bTVCB9Bmx0IS/llO/sXLuFUNp/LQAejSMzn84phya0tQlYZENejO9iVfkZ+ThndABMd3/UN22iU6Plh8TVk9+3Xiz+zk2c+LRyXrtRrIke1/snjqcGLaP4lSpWb/hmm4efgT0/4Jm9dKvXyC1MvHadTpfygUthEiSqWKhu2fZMeyr/lr4gCim/TBZDRwdMdf5GYmcM8jn5VLm/UXT1NwYDse3R9E6e6FITURlyZtUPkGkDX3J0s+74eGoYmqTeLrg23O4dKoFSadlsJDO0t8Hf9Rn1BwcAeGjFRUvoG4teiEKS+HrL9/KZd23En+i/PfKsId3bkDeO211/D09GTu3Ll8//33hIWFMXbsWAYMGHDL5y7ad+6DDz4gIyODBx54gFdffZWAgACmTJlCYmIinp6eNG3alM8++wyVSsWiRYsIDQ2127EDuP/++/noo4+4cOECderU4ZtvvuHzzz/nueeeo0aNGnz11VcMHWq7B8vVF7Dq1avzySef8O233/Lss8/SpEkTPv/8c/r0Kf4iio6OZu3atXz88cdkZGQQGBhIr169GHlV52nUqFGMGTOG559/ntzcXD7++GP69u17y/9u1+OVV15hxsyZrF6zhpycHKpVq8bYMWPsht9erVfPnuzYuZNdu3eTn5+Pj48PjRs35uGHHqJateInm05OTnw2fjyzZ89mx86drFu/HldXV1q2bMmQxx/H29ux+0+99vIops/8ldVr1pKdk0O1alV5/713qV/Pdi+fq/Xu2eNK+/ZcaZ83TRo1YsDDD1LtmpHoGtWrs3HTZlJSU3Fzc6NxoxgeHzSIkBD7G9/eCJMJpi3X0aO5mpZ1VTipzHvUzd2gKzUks0hmLvy4WEfPWDXdmqoxGOHYRSNLt+utRv0Alu80kF8IzWupaFxDSWqWiTnrdOw/Y53R10NBlybWl6Si389cNlo6d/mF8O18Lfc0VlOrsormtSCvAHQHt1CwcSEYry/UKn/JTExt0nCq0wyNixuG5Hjy5n2PIe502YU1Lqgj66I/c9hmr7w7xcn3xhBxOYHAnj1Re3qSe+oUx158iay9e0stl3fqFH4dO+Dbri0KlYq8kyc5/vpoUlevvj0VvwEfPtiJyat2smjfSbLyC6kR7MeEx3rQpFrp845dnNT8+NR9fL1sK//sOka+Tk90iD8TH+tJ65qVLfkaVQlm//kElh04RWpOPiqlgqoBPrzSsyUDW5Z+LatIkS89iVvV4r0aQ/p2I6RvNwAu/bbgjujcATz94hjmzZrC5nVLycvJJrxqdV56+0tq1W1carkLZ82bQC+ZN9PmWK16jS2dO7WTE299/APz50xl/67NbN+4AhdXNxrHtufBwc/geQNL2d+sg8NGU3DxBUIH3IeTjxfZh4+z56FnSN9if8S/SM6RkwTdew+VenQClZKcwyfY+9iLJP6z3CZv9qHjhD36AM6VAtCmppMwbxmnPpqINiWtXNvSeeCn7Fj2DSd2L6AwPxP/kGh6Dv2O0KjSN0rXuHhw/zMz2LzgY3av/g6TyUhoZHPa9HkDVw/bbZNO7DU/EK3ZqLfNsSJN7xmOl18YBzbOZNfKyRj0WvxDoun22DdENeh2aw29SuacKXh07YdL49YoXd3QJ1wkY9qX6M6WvZ+qwtkF51oxFB7bj6nAzp5AV+gvX8C1aVuUHt4Yc7MpOLCDnJXzHDYnW9z9FCZ7MSfiturbty81atTg008dM/+mPJw5fR03vP9iSpNj517cCX5Yf/0brv4bvZ72SkVXwaEOz9lW0VVwuMZvPFLRVXCo1QO+r+gqOJT/wR1lZ/qXy2huuzXS3eT4rNIXo/q3G7DpsYqugsMFfWr70ONOsf5wxaww3L6u/QW27lZ3/Mjd3Sw5OZlt27Zx/Pjx2zaiJoQQQgghxO1mMklY5u0gnbsKtHjxYiZPnkzPnj3p399xyzELIYQQQggh7n7SuatAQ4YMYciQIRVdDSGEEEIIIRxKJoLdHnf0VghCCCGEEEIIIa6PdO6EEEIIIYQQ4i4gYZlCCCGEEEIIhzLKPne3hYzcCSGEEEIIIcRdQEbuhBBCCCGEEA4lWyHcHjJyJ4QQQgghhBB3ARm5E0IIIYQQQjiUbIVwe8jInRBCCCGEEELcBaRzJ4QQQgghhBB3AQnLFEIIIYQQQjiUSbZCuC1k5E4IIYQQQggh7gIycieEEEIIIYRwKKMsqHJbyMidEEIIIYQQQtwFpHMnhBBCCCGEEHcBCcsUQgghhBBCOJTJJAuq3A4ycieEEEIIIYQQdwEZuRNCCCGEEEI4lEkWVLktpHMnhBBCCCGEEHacPn2aDz/8kL179+Lu7k6fPn148cUX0Wg0JZZJSkpi2rRpbN68mQsXLuDp6UmzZs0YNWoUYWFhDq2vdO7EdQlMO17RVXCoWWk9K7oKDnfiwJmKroJDXXj+7YqugkMVdveq6Co43Ebj3T1TwP/gkxVdBYdKrd+8oqvgcI0O/VnRVXCoT9/ZUdFVcKgnXx1Y0VX4TzP+Czcxz8zM5PHHH6dq1apMnDiRxMREPvnkEwoKCnj33XdLLHf48GFWrlxJv379aNiwIenp6Xz33Xc8+OCDLFq0CD8/P4fVWTp3QgghhBBCCHGN33//ndzcXCZNmoSPjw8ABoOBsWPHMmzYMIKCguyWa9KkCUuXLkWtLu5qNW7cmA4dOvDPP//w5JOOe9h3dz8mFUIIIYQQQoibsGHDBlq2bGnp2AH06NEDo9HI5s2bSyzn5eVl1bEDCA4Oxs/Pj6SkJEdVF5CROyGEEEIIIYSDVdSCKp07dy71+OrVq0s8dubMGfr162eV5uXlRWBgIGfO3Nh0l7Nnz5KamkpUVNQNlbtRMnInhBBCCCGEENfIysrCy8t2zru3tzeZmZnXfR6TycSHH35IpUqV6NWrV3lW0YaM3AkhhBBCCCEcqqI2MS9tZO52mThxItu2beOnn37Czc3Noa8lnTshhBBCCCGEuIaXlxfZ2dk26ZmZmXh7e1/XOf744w8mT57MuHHjaNmyZXlX0YaEZQohhBBCCCHENSIjI23m1mVnZ5OcnExkZGSZ5VeuXMmYMWN44YUX6N+/v6OqaUU6d0IIIYQQQgiHMpoq5udWtGvXji1btpCVlWVJW7ZsGUqlktatW5dadvv27YwaNYoHH3yQESNG3FpFboB07oQQQgghhBDiGgMGDMDd3Z0RI0awadMm/vrrL8aPH8+AAQOs9rh7/PHH6dKli+X306dPM2LECKpWrUqfPn3Yt2+f5efChQsOrbPMuRNCCCGEEEI4VEVthXArvL29mT59Oh988AEjRozA3d2d/v3789JLL1nlMxqNGAwGy+/79+8nOzub7OxsBg4caJX3gQce4JNPPnFYnaVzJ4QQQgghhBB2REVFMW3atFLzzJw50+r3vn370rdvXwfWqmTSuRNCCCGEEEI4lImK2Qrhv0bm3AkhhBBCCCHEXUA6d0IIIYQQQghxF5CwTCGEEEIIIYRD3eq2BOL6yMidEEIIIYQQQtwFZOROCCGEEEII4VD/xq0Q/o1k5E4IIYQQQggh7gLSuRNCCCGEEEKIu4CEZQohhBBCCCEcSsIybw/p3InbRqvT8/1fS1myaRfZuflUjwjhmf49aVE/utRyU/5axo9/L7dJ1zip2fLLZ46q7g3T67RsXfINR3fOpyA/i8DQaFr1epEqtVqXWi4t8QwHNv9OwrkDJMUdxqDX8uR7q/H2D79NNS+dm6uSwff50byBO85OCk5dKGT6P6mcjdOWWbZ6hDMdYj2oUcWFKqEa1CoF/UeesZt37jeRdtN/XZjKP6syb6kN9uh0Wn6fOZUNa1eQm5NNRNUoBj72FA0bNSu13PYtG1ixdD4Xzp0hOysLL28fataqw0OPPEFEVes2/PLDRI4c2kdyYgJanZbAwCBatevEfX0H4OrqVu5tuppOp2Xh79+yfcNi8nKzCIuowX0DR1CnYctSy+3dtppdW5Zz/tRhMjNS8QsIon6TdvTs/z/c3L2s8r75TA/Ski/bnKNtl/48Ouztcm3PtXQ6LYvnTGbHxkXk52QRWqUGvQc8T+0Gpbdv3/ZV7NmynPOnD5GVkYqvfxD1mrSne7+nbdr317TxnDy6i7SkeHQ6LX6BITRu2Y177huCs4tj3z8wt3Heb1PYsnYpubnZVK5SnX6DhlMvJrbUcru2rmX7xpWcPXWEzHTzexjTrA33PTQUdw9Pq7xabSHLF8xmy9qlpCTF4+bhRY1a9bl/4P8Ij4hyZPNuisrdjciXh+LTvCE+zeqj8fNh/9DRxM34u6KrZpdWp+OXWXNYuW4D2Tk5RFatwtBHB9C0UcMbOs8r77zP7v0Hub9nN0YOf8qSnpScwtJVa9m2azdx8QkolUqqVanM4If60SSmQXk3p1TubiqGD4qgTXNfnDVKjp3K5buZ5zl5Nq/UcgoFdG0XQNtYP2pUdcPTQ01CUiFrtqQyZ+FldLriHkGgv4YeHQNp0diH8GAXjEYTZy/mM3PeJfYczCr3Nt2O+5a5qzaz88hJDp0+T2JqBr3bNmPMsEfKtR3iv+Vf3bmbOHEikyZNsnvs5Zdf5umnn77NNRKlGTPlN1bv3M8j3dpTOTiARRt3MvLzH5jy5ghiou3f2F9t9BP9cXN2tvyuVN5ZUcUrZo3m5L7lNOrwGD6BVTmy/W/++f5p+j8/nbCopiWWu3xuH/vWz8QvuDp+QVEkXzp6G2tdOoUC3nw6mCphGhasySA7x0i3Nl6MfT6U1z6PIyFZX2r5xnXc6NzCiwvxWhJTdIQFaUrNv/9YHut25lilnY0rvOV22DPpy4/Ztnkdvfo8SEhoOGtXLeWj915jzMffULtuyTdFF86dwd3Dk5739cfLy5uM9DTWrFzC6FHD+Ojz76gaWd2S9/TJY9Su24CO9/TESaPh3OmT/PPnbxzct5v3P53o0M/w9EnvsmfbKjr3eoRKIRFsXbuASR89z6gxP1K9dqMSy/065QN8fANp3q4XfgHBXLpwknVLf+fQnk28OX42GmcXq/yVq0Zzz32PWaVVColwSJus6jn5bfZuX0XHno8SGFKF7evm893HIxj53k9E1WpcYrnZP7yPt28gzdr2xi8gmPgLJ9mwbDaH927k9U/noNEUt+/86cNUr9WYgA734+SkIe7cMVbO/5njB7fz4thfHH4N+vGb99m1ZTVd7x1IUGhlNq1exJfvv8joD7+jZp2YEsv9MvkjfPwCadW+B36BQcSdP82qxX+yf/cW3v9yhtV7OOXLd9m7YwPtu95PlciBZKSlsHrJXD547SnGTfiNgEohDm3jjdIE+FLznefIO3+J7APH8e9Qeke3on369WTWb9lG//t6EhYSwvI16xj9/sd8Ne496tepfV3n2LBlO4ePn7B7bPP2ncz+6x9at2hG104dMBgMrFi7nlfe/YDXXniWHvd0LM/mlEihgE9GRxNV1Y3fF1wmK1tPn66V+Oq9OgwbfZBLCSVfx501SkaPiOLwiWwWrEwiI0tH3ZoeDHkonMb1vBn1fvF3YuumvgzsE8LmnemsWJ+CSgld2wfyxTu1+fTb0yxbl1Ku7bod9y3TF60mr6CQupERpGSUfwf1TmI0KSq6Cv8J/+rOHYCLiwvTp0+3SQ8JubO+kP7rDp0+z4ptexk58D4G9zJ/2fRq04yHR49nwu8L+fm9kWWe457mDfHx9HB0VW9KwvkDHN+zmLZ9XqNp56EA1Gl+PzM+7s3G+Z8zYNTvJZaNqteJGp/uROPiwa7VU++ozl2Lhu7UinTh858T2bY/F4Ate3OY8HZlHu7hxzczkkotv3xzFv+szkCrMzG0n3+Znbv4JB0bd+WUmqc8nDx+hM0bVjP4yWfo028gAO07d2PUs0OY+fN3fPTFdyWWffCRITZpnbv1Ztjj/Vi+5B+GPfeKJf3Dzybb5A0KCWXG1G85deIoNWvVvfXG2HH25EF2bV5G38Ev0bXP4wC0aH8v74/qz7yZX/HaRzNKLPv0y58RXc969LJKZB2mTXqHHRuX0OaevlbHfPwqEduuV/k3ohTnTh1k95Zl3D9oFPfcNwSA2Hb3Mu7lvvzz61e8/OHMEssOHfUFNetat69yZB1mTn6bXRsX06pzP0v6qA9sv1sCgirz98wvOH/qINVq3tjoy404feIw2zeu4OEhL9DzgUEAtO7Yk7eeH8icaRN5Z/zUEss+9/on1K7fxCqtalQtfvxmLFvWL6ND1/sBSEtNYtfWtfS4fxADnnjBkje6TgyfvPMsu7aupXufO2sEofByEqvCW1OYmIJ3k3q02fZXRVepREdPnGTNxs0Mf2IwDz9wHwDdOrXniedGMWXar0waP67Mc2i1Wr77eToD+97PL7/NsTke06Aec37+Dm+v4lHn+3p05X8jX+WX3+bcts5d+xZ+1KvlyXtfnGTD9jQA1m5JZeY3DXnioXA+nHC6xLJ6vYnn3j7M4RPF1/7Fq5NJSNLyxMPhNK7vZRmV23c4i4ef3UdWdvGDxQUrk/hxfH2eeCi8XDt3t+u+5Ye3nyPY3xeFQkHboa+XS93Ff9udNfRxE5RKJTExMTY/QUFBFV01wHxhNhqNDn+dgoICh7/GrVi9Yz8qpZIHOhaHTDlrnOjTIZYDJ8+RkJpe5jlMJsjJK8B0BwZtn9i3DIVSRf1WD1vS1E7O1GvRn8vn9pKdbhu6VsTF3QeNy53ZaW0Z4056lp7tB3ItaVm5RrbszaVZPTfUqtLLZ2Yb0Opu7P3SOClwUjv26d62zetRKlV06XFf8etqnOnUtRcnjh0mJTnxhs7n7eOLs7MLublld0wrBQUDkJvjuE7snm2rUCpVtO1S3FFx0jjTutP9nDlxgLSUhBLLXtuxA4iJ7QRAwqWzdsvodToKC/JvsdbXb9+2lSiVKlrf09+S5qRxpmWnBzh7Yj/ppbTv2o4dQMPmnYGS23c1v8BQAPLzsm+02jdk15bVKJUqOna735Km0TjTrst9nDp+kNRSPqPXduwAmrToAMDluHOWtIJ8c7icl4+fVV5vvwDL691pjFodhYnlOzrjKOs3b0OpVNK72z2WNI1GQ88unTl87ARJyWW3Y/a8+ZhMJh5+4F67x6tFVLbq2AFonJyIbdKI5JRU8vJuz99l+xZ+pGVo2bgjzZKWma1n3dZUWjX1LfWarjeYrDp2RYrOVSXM1ZJ2Li7fqmMHoNOb2L43g0oBzri6lN9t7e26bwkJ8EOh+G+MaJlMFfPzX/Ov79yVJTo6mh9//JGJEyfSqlUrYmNjeeONN8jLM3+pxcXFER0dzbJly2zK9u3bl1GjRll+T0hI4JVXXiE2NpYGDRrw6KOPcujQIasynTp14v333+fHH3+kY8eONGjQgIyMDEwmE5MmTaJ169Y0atSIF154gS1bthAdHc327dtLrcu4cePo1KmT5fd58+YRHR3N3r17eeKJJ4iJiWH8+PHXXceKcPz8JSKCA/Fwsw7pqhtpDt86cf5SmefoM+pDOjz9Bu2eGs073/5KaqZjb65uRHLcUXwDq+Lsat1JC65iDu9LirtzRuNuRLVwZ87GaW0ujqcuFOLirCS0klO5vl6HWE9+HV+V2V9U46s3wmnTxL1cz1/k7OmThIaF4+Zmff7qNc1hUufOnCrzHLk52WRmZnD+3Gm+++ZT8vJyqd/Q9qbaYNCTlZlBWmoK+/bsYPaMn3B1daN69PWFZN2Mi2ePUSm0Cq5u1p/HqtXrARB37vgNnS8zw3wT6uHpY3Ps2KGdvPBoC0YOasmbz/Rg9eJZN1fpG3Dx7DEqhZTWvmM3dL6sK+1zt9M+g0FPTlY6GWlJHN2/hUVzJuHi6k6V6vVvrvLX6fyZEwSHRti0MbJGHQAunLUfpleSzIxUADy8fCxplYLD8fOvxLL5s9i7YyNpKYmcPnGY6d99QmBQKLFtu95aI/7jTp05S+WwENzdrOdn1qppDt0+dfZcqeUTk5OZPfcfnn58EM7ON9bRTsvIwMXZGWfn0qMlykv1qu6cOJNn811x7FQuri4qwkNc7BcshZ+P+fslM7v08P+ivPkFBgoLy+9h+t1+3yLuXv/6sEwAvd72D1+tLm7arFmzaNKkCZ988gnnzp1j/Pjx+Pv788orrxAeHk5MTAxLliyhe/fuljLnzp3j8OHDPPfccwBkZmbyyCOP4ObmxjvvvIOnpyczZ87k8ccfZ8WKFfj7+1vKrlixgipVqvDWW2+hVCpxc3Nj5syZTJo0iaeeeooWLVqwbds23n771hYcePnll3n44YcZNmwYrq6uN1TH2y0lI4sAHy+b9ABfc1pyeslx5l7urjzUpQ0NalTFSa1m3/Ez/LFqE4fPXGDG+6NsLrwVITcrGXfvQJt0d6/AK8dLD1+8U/l4qThy2vbJb3qW+W/O11vNhcu6cnmtY2cK2LIvh6RUPX7eKrq18ebFx4Jwc0lmxeby/UJMT0/Fx8/278H3SlpaWtlP1N94+Rni4y4A4OLqSr8Bj9G5q2144umTx3nz5Wcsv4eGR/D6ux/j6Wn791BestJT8PYJsEn38jWnZaQl39D5VvwzDaVSRaOW91ilh1epSVStGIJCq5KbncnWdQv485fPyExLpu/gF2+6/mXJyki2tOVqXr7mv7fM9Btr38r5P5vb16KLzbELpw/zxduDLb8HhVbl6dcm4O7hfYO1vjEZ6Sl2P6M+N/keLv5rBkqlimatih8UqtVqnhv9Kd9/8Q5fj3vZkl41qhZvf/qTzeIr4sakpmfg5+trk+7v6wNASlrpIz/fTZ1B9chqdGpX+qJc17oUf5mNW7fTvnVLVKoywivKib+vEweO2n6Pp2aYF94K8NNw9uKNjSIO6BNKTp6e7XszSs0XGuRM21g/1m9NxViOozR3+32LuHv96zt3eXl51K1rO29l1qxZNG1qXsQiMDCQL774AoB27dpx5MgRli9fziuvmOfG9OrVi88//5ycnBw8PMxPSRctWoS3tzdt2rQBYPr06WRlZfHnn39aOkktW7akW7duTJ06lddee83y2jqdjh9//BG3K0/rDAYDP/zwA3379rW8Zps2bUhPT2fu3Lk33fYBAwZYLRozYcKE667j7Vao1eHkZPtx01xJK9SV3EEY2L291e+dmzekblQEb3/7K3NXbWLIffeUUPL20WsLUKltn5CqnJwtx/+NNE4KdHrbb8ui1cs0TuUXSvL2N/FWv6/Zls2nr4TzSG8/1u3IueHwztJoCwtxcrIdddQ4aSzHyzLixdHk5+WRmBDP2lVL0BYWYjQabSbMh0dU5d0Pv6SgIJ/jRw9xcN9uChwcwqjVFqK20z6nK2F2uhv4PO7YuITNq/+ma58hBIVUsTr27OhvrH5v1akPE8eNYNWiX+nYcyC+/o4Jj9dpC1E72f69OTndePt2blrM1jV/c899T1DpmvYBBIdH8dzbP6AtzOfM8X0cP7iNwoLSV/8rD9qS2njlPdRqr3+hoa3rl7Fh1QJ69h1McKj1YjfuHp5EVKtJs9adqR5dj8TLcSyaO43J49/g1bGT7sjQzH8LrVaLxt51RlN0nSl5xeG9Bw6xYet2vv38oxt6zYLCQsZ8+iXOGg1PP/bojVX4Fmg0SqtVLYtotSbL8Rvx6AOhNG3gzVc/niU3z1BiPmeNkjGjalCoNfLDbxdvrNJluNvvWyrCfzFEsiL868MyXVxcmDt3rs1P7drFIU+tWrWyKhMVFUVCQvGcjB49eqDT6Vi1apUlbcmSJXTt2tVyEd68eTOxsbF4e3uj1+vR6/UolUqaNWvGwYMHrc4fGxtr6diBOVQyOTnZKrQSoHPnzrfU9g4dOlj9fiN1vN2cNU7odLYjrNorac52vgBL071VE/y9Pdlx+MZCkxxFrXHBoLf9ojboCi3H72RqFfh4qqx+lArQ6kx250o4XenUlWeH61p6AyzbmImHm4rIyuUbWqRxdkZn54tZq9NajpclunY9Ypo0p1uv+3n7/S/YuHYls6ZNscnn5uZOg0ZNad6yLYOffIZ7+z7M+A/evK7Qz5ul0Tijt9M+3ZUOgdN1fh5PHtnDzO/GUiemFX0eea7M/AqFgs69B2E06DlxeNeNVfoGOGmc0ets/950uhtr36mju/ntuzHUbtiKewc+bzePq5sHtRq0oEGzjtw/6CU63fsYP4wfecOhrTdKU1Ibr7yH19vpOn54L1MnjaN+oxb0H/SM1bG83Bw+euNpqteqz0OPjaBxbHt63P8oz4/+lBNH9rNx9cJbb8h/mEajQWvvOqMtus7Yv64ZDAYm/vgzXTq0o1aN6nbzlFTug8++4vzFOMa8/jIB/n5lF7pBapUCX28nqx+lArRao+V74WoazZXvCu31h0t2bOnHkw+Hs3h1EgtWlhz1olTAOy9Wp0q4K2O+OElqevlEkRS52+9bxN3rXz9yp1QqqV+/9LkPXtdMNnZycrJcXME8shcbG8vixYu5//77OXbsGKdPn+bdd9+15ElPT2ffvn12RwkjIqyfhF4b/picbA6f8fPzKzXfjQoIsA5LupE63m4BPl4kp9nuVZZyJawh0PfGQ9SC/H3JzHH8E/Tr4e4VSE6G7QIHuVnJV45Xut1VuiHR1VwY+3yoVdozYy+QkWXA18v2MlGUlp5Z9lyIW5GSYT6/h1v5hhb5+vqTlmob1paeZp6X5OdnG/JXGg9PT+o1bMzGdSt5/KkRpeaNbdWOiV+MY/OG1VbbJpQnL98Au2F7WenmcFMfP9sQ4mvFnTvOd5+OJLRyFE+//Dkq1fV9XRSN1uVml//ehEW8fALJTLO96cu6Eo7p7Xt97Zsy/gVCIqrz1MtfXnf7YprfwwzeYveWZYRXLX2vq1vh4xtAup3PaMYNvIcXzp7g63GvEB4RyXOvf2LTxl1b15CZkUaj5m2t0mvVa4yrmzsnjx6gc4/+iJvj7+tDSlqaTXpqegYAAX62IZsAy9es5+KleEY9O4yEROvPeV5+AQmJSfj4eONyzUOozydNYevOPbw16gUaN3TMnNC60R58PaaOVdqAEXtJTdfh52PbWfW/kpaSVva+qABN6nsx+rkotu3N4MsfS1/g6JXh1WjZ2IdxE0+z93D5byFwt9+3VITyDJsVJfvXd+7KS69evRg7dizp6eksXryYwMBAmjdvbjnu7e1N27ZtGTnSdunbotG9IteuehQYaP4STrvmIp+ammr1e9GE6WtHFLKyru+idSN1vN2iI8LYfeQUOXkFVrHmh06fB6BmlbAbOp/JZOJyShrRN1jOUQLDanHx5HYK83OsFlVJOL8fgErhjls8ozycu6Rl7GTrFT0zsgyciyukVpQLCoV1OEWNKs4UFBqJTyrfJ6XXCvI3PxnNyik5LOdmVI2szqEDe8nLy7VaVOXk8SOW4zdKqy0kLy+3zHw6nQ6j0Uhebtl5b1blqtGcOLSL/LwcqwU5zp40j+CX1SlJTrjIhA9H4Ontx3NvTsLlBjZcT0k0LzLg6W3/xrU8hFeN5uThnTbtO2dpX61SyycnXOTbj57B08uPZ96YfEMbkuv1WkwmIwUOXi0zolpNjh7cbdPGMycOW46XJvFyHJ+PHYmXty+j3v3a7nuYmWH+Trp2RWeTyYTRaMRoKN+/u/+a6pFV2XvwMLl5eVaLqhw9ftJ8vFpVu+WSklPQ6w08/7rtvPwVa9ezYu16PnjzVdq0KL5H+f6XGSxbvZYRTw2hc/s25duQq5w+n8fLH1gvEJaWoePUuVwa1Pa0+a6oXcOD/AIDcZfLDpWuXd2dD16tyYnTuYz98iSlLTQ+bFBlenSsxKRfzrFmc2rJGW/B3X7fIu5e//qwzPLStat5VbDly5ezePFievbsaTV3plWrVpw+fZqoqCjq169v9RMdXfqNUnBwMIGBgaxevdoq/eowUDCP5Dk5OXH6dPF+MFqtlp07d15XG26ljo7WuXlDDEYjf6/daknT6vQs3LCDelFVCPY33wgmpKRzLt56BCw9y3aJ5LmrNpOelUPLBqXfxN0uNWK6YzIaOLileB8ivU7L4e3zCK7SEE9f876LWWnxpCWWvN9PRcnNN3LwRL7Vj05vYuv+XHy91MQ2KO4AeboraRnjzu7DeeivuvcL8lcT5H9zz4u83G0vRS7OCnq19yYzx8CZi+W7kXmL1h0wGg2sXLrAkqbTaVm7agk1ousQEGgefUpOSuTSxfNWZTMzbBdBSEq8zMF9u4mqXvx3lpuTbXexp9XLFwEQWcNxf5ONW3TBaDSwcWXxHmA6nZYta+dTrUZ9/ALM2zGkJV+2Wf4/Mz2Fbz54BoVSwfNvf4unt/3QrtzsTJubf4Nex/J/fkatdrK75UB5aXSlfZtXFc9Z1um0bFs3n6o16uNb1L4U2/ZlZaQwedwwFAolI976Hk8v++3Ly83CoLd9eLFl9TwAIiIds0dhkWatOmE0Gli7/B9Lmk6nZePqRUTVrIf/lc9oanIC8VdtbwDm0b3PxjyPQqHklTET8Cqho100/277xhVW6Xt3bKCwIJ8qkaV3IEXp2rVqidFoZNHy4u96rU7HstVrqV2zBpUCzRECicnJXIgrXnmxU7vWfPDmqzY/ALFNG/HBm69Su2YNS/7f581nzt8LefTBB+h/n2P3nMzJNbDnYJbVj05nYsO2NPx8NLRtXvz35OWppn0LP7buzrCaux0a5ExokPWoY0SYCx+PjiYhqZA3Pj1easj/w/eGMOC+UH6dd4m/lt7YtjU34m6/bxF3r3/9yJ3RaGTfvn026f7+/lSuXPm6z1M06jV58mSSkpLo3bu31fEhQ4awcOFCBg0axGOPPUZoaChpaWns37+foKAghgwZUuK5VSoVTz/9NB999BEBAQHExsayfft2tm41XzCKOpFKpZIuXbowa9YsqlSpgq+vL7/++ismk+m69kC5lTo6Wr3qVbineUMm/bGItKxsKgcFsGjjTuJT0njnfwMs+d79fhZ7jp1m169fWdJ6v/g+XWMbEVU5BGcnNftOnGXFtr3UrBJGv06t7L3cbRdStSE1YrqzeeGX5OWk4hNQhSM7/iYr9RJdBhZvVLv819eJO7WDlyYUz9cpzM9m3wbzpsvxZ/YAsH/jLJxdPXF29SKm3aDb25irbNuXy/GzBYx4JJDwYCeyc410a+OFUqlgzlLrTs57I8wd2GffL57UHuCrpn0z86hDVIT5y7xfVx8AktP0bLiyYXn3tt40q+/G7sN5pKTr8fFS0SnWkwBfNRN/TbbqRJaHmrXq0LJNR36b/gNZmRkEh4SxbvUykhMTeHZk8SayE78cx5GD+5i7eIMlbdSIIdRv2ISqkdVx9/AkIT6O1SsWYzDoeXTIMEu+wwf38fOUb2jRugMhoeHo9TqOHj7A9i0biKpRi3YdHbfMfLWa9Wncsgv//DaR7Kw0KgVXZuu6haQmX+axZ8dY8v0y8W1OHtnN93P3Fbd53LOkJMbRtc8QTh/bx+ljxcc8vf2o09C859P+XetY+tdPNG5xD/6VwsjLyWTHpqXEXzjF/Y88j7ed1SzLS9UaDWjUoisLZk8gJyuNgOAIdqxfQGpyPI8OL27fjElvcerILib9ccCSNnncM6QkxnHPfU9w+theTh/bW9w+H39qNzC37+ThXcz95RNiWnShUkgEer2O00f3sH/HaiKi6tKsnfV3RHmLiq5Hs9admTtzMtmZaVQKqcymNYtJSYrnyeffsuT74esxHDu0h+nzd1jSvhg7kuSES/TsO5gTR/dz4uh+yzFvHz/qxcQC0KhZW8IiIpk/ZyopSQmWBVVWLfkTH98A2nXp49A23qwqzz6Kk7cXLqHmcPdKvTriEmbu0J+bPBO9nRvrilAnugbtW7fkxxm/kZ6RSVhIMMvXrCchKZlXny+e//jxV5PYf+gIaxf8CUBEeBgR4fZHd0IqVbIasdu4dTtTpv1KeGgIVcLDWbl2g1X+JjEN8LuyOqcjrd+WxuET2bz+bCRVw13JzNbRp2sQSqWCaX/EWeX94h1zJMvA5/YB4OqiZPxbtfDwUPP7wsu0aGxd3/iEQo6cNL+nbZr5MnxwBBfj8zl/KZ972lpPb9l9ILPcpgvcrvuWDXsOceKCeUExvcHAyQvx/PSP+YFL+8b1qBFhPWXi38xk+m/s51fR/vWdu4KCAh5++GGb9P79+zNu3Dg7JUrWu3dv1qxZQ0REBA0aNLA65uvry5w5c/j666/5/PPPycjIwN/fn4YNG9Kli+3y2dcaPHgwWVlZ/Pbbb8ycOZOWLVvy6quv8tJLL+HpWbzc9DvvvMM777zDhx9+iLu7O0OHDqVatWo2o3723GodHW3s8EcJmbuUJZt2kZ2XT/XKoXz98v9oXCuq1HI9WjXhwMmzrNm5n0KdnpAAXx7r1ZEn+3TB5Tbt4XM9ug8ez5bFX3N05wIK8zIJCI2mz7DvCa9e+ghGQV4mWxZbrzq4e83PAHj5hVVo585ogo+mJDC4jx8923mjcVJw+kIhk2clXVdIZpC/moG9rEdGin4/fDLf0rk7draA6GrOdG7hiYe7ikKtkVPnC/l2djKHTjpmpdHnX36T32cGsX7NcnJzcqhSLZI33vuUOvViSi3XtWcf9uzcxr7d28nPz8Pbx5eGjZrR9+FBVKla/FmOqBpJ3QaN2LltE+npqWAyERQSRv+Bj9On30C7q3WWpyee/5AFv09m+/rF5OVmEValBiPemECNOrZ78V0t7px5sv+K+dNsjtWo08TSuQuLqEFIeCTbNywmJysdldqJylWj+d+o8TRp5fj90R57bhyL5kxix4ZF5vZF1GT46xOpXqdpqeUunTc/WFm14BebY9XrNLV07kIjalCjbjMO7lpLZnoKmEwEBIfTvd8w7rlvCGq1Y98/gKdfHMO8WVPYvG4peTnZhFetzktvf0mtuo1LLXfhrDnsb8m8mTbHatVrbOncqZ2ceOvjH5g/Zyr7d21m+8YVuLi60Ti2PQ8OfgbPq/bEu5NEvvQkblXDLb+H9O1GSN9uAFz6bcEd07kDePOl5/h51u+sXLeB7JxcoqpG8NE7o2lYr07Zha/D6bPmyIK4+Mt89NVEm+NfjRtzWzp3RhOM/vg4wwdF0LdHEBqNkuOnc/nk2zNcLCMk08tTTVCA+eHfsEdt1wdYti7Z0rmLqmoOb60c6spbz9uGz7845gjp5biX3O24b1mz8wCLNhZHaB0/f4njV/bQC/Lzuas6d+L2UJhMsjBpRfn666/55Zdf2L59Oy4ud/Zqitk7l1R0FRxqVlrPiq6Cw61acqaiq+BQ7z3vmA3P7xQp+Y7bF+9OoTfe3TMFPJ3/nVuiXK/U+s3LzvQv1+jQnxVdBYd69B3HbtNS0Ra86pj5eXcSz2Z37v3MjPUV87qPtS87z93kXz9y929x+vRpFixYQKNGjXBycmLHjh1MnTqVgQMH3vEdOyGEEEIIIcSdTzp3t4mLiwt79+5l9uzZ5ObmEhQUxNChQ3n+eft7KwkhhBBCCHG3kK0Qbg/p3N0mYWFhzJgxo6KrIYQQQgghhLhL3d0THIQQQgghhBDiP0JG7oQQQgghhBAOJUs43h4ycieEEEIIIYQQdwEZuRNCCCGEEEI4lIzc3R4ycieEEEIIIYQQdwHp3AkhhBBCCCHEXUDCMoUQQgghhBAOJfvc3R4ycieEEEIIIYQQdwEZuRNCCCGEEEI4lCyocnvIyJ0QQgghhBBC3AWkcyeEEEIIIYQQdwEJyxRCCCGEEEI4lNFY0TX4b5CROyGEEEIIIYS4C8jInRBCCCGEEMKhZEGV20NG7oQQQgghhBDiLiAjd0IIIYQQQgiHkpG720NG7oQQQgghhBDiLiCdOyGEEEIIIYS4C0hYprguBe4BFV0Fh+rhe7yiq+BwJ6PDK7oKDhX2+6iKroJD5S7cW9FVcLiYNx+r6Co41LrBkyu6Cg7V6NCfFV0Fh9tb78GKroJDdZ99tKKr4FAZv9zd7x+AZ7OeFV2FEhklLPO2kJE7IYQQQgghhLgLyMidEEIIIYQQwqFMFbaiiqKCXrdiyMidEEIIIYQQQtwFpHMnhBBCCCGEEHcBCcsUQgghhBBCOJTsc3d7yMidEEIIIYQQQtwFZOROCCGEEEII4VBGY0XX4L9BRu6EEEIIIYQQ4i4gI3dCCCGEEEIIh5I5d7eHjNwJIYQQQgghxF1AOndCCCGEEEIIcReQsEwhhBBCCCGEQxklLPO2kJE7IYQQQgghhLgLyMidEEIIIYQQwqFkQZXbQ0buhBBCCCGEEOIuIJ07IYQQQgghhLgLSFimEEIIIYQQwqFMFbaiiqKCXrdiyMidEEIIIYQQQtwFZOROCCGEEEII4VCyFcLtISN3QgghhBBCCHEXkJE74RBanY6fZv/F8nWbyc7NJapKZZ5+pD/NYurf0HleHPMJu/Yfpm+Pexj19OMl5tt/5Dgj3voQgEXTv8XHy/OW6l8WrU7HjJmzWLV2HTk5OVSrWpUhjz1Kk0aNSi23actWFi9dxtlz58nOysLb25tataIZ/MhAqlWtYpU3Pz+faTN/ZeOmLWRmZhIcHMz99/Xm3l49HdYuFw30bqmhfqQaJzVcTDKyYLOWSynG6ypfyVdBn9YaqoWoMBjgyHkDCzYXkltwVR4fBc1rq6lZWYW/lxKtzkRcipHlO3TEJdu+Tkx1FR0bORHkq6RQB4fP6Vm8VWt1zpuiUuPa/j6c68eicHHDkHSJvHXz0Z89Wmox7+fGofIJsHvMkJZI5rfvWn73e3uK3Xx5a+ZRsGX5zdf9OiicnKj89DACevRA7elJ3qlTXJzyPZk7dpRZ1r9LF0IHDca1WjUMeXmkb9zIhUkT0WdmFp/f2Zlqr7yKR926aIKCUCiVFFy6RPLCBSTOnYvJYHBk8wDQ6g1MXrGNxbuPk5VfQI2QAJ7r1oKWNSOuq/yyfSeYtWk/Jy6n4KRSEhnkx4huLYitXtmS54+tB9lxKo6DFxNIyMjhvia1+ODhLo5qkhWFxokab71A6ID7cPLxIvvwcU5+MIHUtVvKLBvcryfVRg7Fo1YUhpxckpas5fi7n6NLy7DKpwn0p+bYUQR2a4/aw52c42c48+UPJP7j2M8nmK+jv8yaw8p1G8jOySGyahWGPjqApo0a3tB5XnnnfXbvP8j9PbsxcvhTlvSk5BSWrlrLtl27iYtPQKlUUq1KZQY/1I8mMQ3KuznlQuXuRuTLQ/Fp3hCfZvXR+Pmwf+ho4mb8XdFVw6DXsmfVBE7tW4A2Pwvf4GiadHmBsOqtyyybm5nI9iWfEH9qMyaTkZBqsTTvNRovv8pW+X5+q7bd8k26jqJh+/9Zfs9MPsuxHb+THHeA1PgjGPRaHnxlFZ6+YbfWyGup1Xj3HoB78/Yo3NzRXTpP5sLZFB47UGZR5+gGePXoh1NoBAqlCl1SPDnrlpK3Y70lj8rXH/eWnXCp1wSnSiGYjEZ08RfIWvoXhcfLfo1/G9kK4fa44ZG7iRMnEh0dbflp0aIFjz32GLt27bqhczQq4ybYnlWrVjFr1qwbLldU50cffdTm2Lhx4+jUqdMNn/NGTZs2jejoaN588027xzt16sT7779f7q87ceJE9uzZU+7nLcu4CT8wZ8EyurZrxcihg1Aplbzy4RfsP3L8us+xfutODh8/VWY+o9HI1z/NxNXF+VaqfEM+//Jr/vpnPp06tOeZp59CpVTy9nvvc+jwkVLLnTt3Hg8PDx64716ee3Y4vXv24PTpM7ww6mVOnzlryWcwGHjjnfdYtHgp7dq2YfjTTxEeHsbEb79n9pw/HNImBfBULxca11Sz+aCOxVu1eLgqePZ+FwK8y56M7O2uYMT9rgR4K1myTcu6fTrqVFEx7D4XVFddaWLrOBFb24m4JCMLt2hZv19PJR8lL/RzoUa49SWpZV01g7u6kFcACzZr2XZER0x1NcPvc0GturX2ut/3OC6x91B4aAd5K/7AZDTiOeB51JWjSi2Xt+IPcv752eonb+0/AOjO2HYMdWeO2OTXnXD8l3bUu+8S/MgjpCxfxrmvvsRkNBL91dd4Niz9xjmobz9qfDgOfVYW57/5mqT5/+DfpQu1J3+LQqOx5FM6O+MaWY2MLVu4+O1kzk+YQN7Jk1R58SWi3hvj4NaZvTNnJb9u2EfPRjV57b52qJQKnvt5IXvOxpdZ9rsV2xk9eznBPh68cm9bRnRrQY3gAJIyc63y/bJuNztOxxEV5IdaeXuDXRp8/zFVn3ucy38s5OjrH2EyGGky93t8WjQutVzloQOI+eULdOmZHHvzUy5O+5Pgfj1otvAXlM7F76HK053YFbMIvq8rF3/5g+Nvf4YhJ5dGM74m5MFejm4en349mT/nL+Ke9m147qknUCmVjH7/Yw4eKf0By9U2bNnO4eMn7B7bvH0ns//6h9CQYJ4cNIDBD/cjLz+fV979gKWr1pZXM8qVJsCXmu88h0etSLIPXP/35e2w4a83OLR5OlEN7yW215solUpWTB9OwrndpZbTFeaydOrjJJzdSYP2T9Oo83OkXj7K0p8eoyAv3SZ/aPVWtHvwU6ufiFodrPIkXdzHka2/oivMxTuw9Gv2rfAb/Dyene8ld+dGMv78BUxGAke8hSaqVqnlXOo3JfD5d1Co1GQt/oPMBb9h0mnxH/ICHp16W/K5NmiOZ9cH0CcnkLlgNllL56J0caXSyPdwb9HRYe0Sd7ebGrlzcXFh+vTpACQkJPDtt98yZMgQ5s2bR82aNcss/+CDD9K+ffsbft1Vq1Zx6NAhu52067Fr1y62b99ObGzsTZW/FQsWLABg5cqVjBkzBs1VN0kAkyZNwsvLq9xfd9KkSbi5udG4cek3A+XpyInTrN60jWcfH8Aj95tvELp3aMNjI9/guxm/8/0n75V5jkKtlknTfuPRB3rz0+y/Ss27YMVaklJS6X1PB/5c5PinzceOn2Ddho3878kneLDfAwB06dyJp599jp9+nsbXX4wvseygRwbYpPXo1oVHHn+SRUuWMvK5ZwHYvGUrR44eY9TI5+ne1TxKcG+vnrz/0SfM+v0Punfriq+PT7m2q0GUimohKqYvK+DAGfOoy75TekY/4ka3ZhpmrSostXznJk5o1PDVnwVk5Jgfz11IMjD8Plea1VKz7YgegL0n9SzfoUWrLy6746iO1waaX+dknHlITqWEnrEaTl8yMGVh8TDduQQjT/VyoUUdNZsOXnWSG6AKrYpz3ebkrZpLwbaVABQe2Ir3sPdw7dSP7Oklv4e6E/tt0lzamEdTtYe22xwzpCbaTXck9zp1COjajfMTvuHylQdiyUuW0PC32UQ89zyH//eU3XIKtZrKzzxD1p49HH3+OUt69oGD1PrySyr1uZ/EP80PFwxZWRweOtSqfNLf8zDk5BD80EOc//prdGmpDmohHLyQwLL9JxnVqzWPtzdf3+5tUot+X/7G10s2M2PEgyWWPXA+gSmrd/ByrzYMblf6g8apw/sS4uOJQqGgxdvfl2sbSuPdpD4h/Xtx7K3xnJv4CwDxs+fTevsCoj94he1dHrFbTuHkRM13XyRt00529XnSkp6xYx9N/viO8CEPcmGK+TNR+YmHcY+qwo7eQ0jbYP6MXvhpNi3W/E70uNdJ+GcFJp3OIe07euIkazZuZvgTg3n4gfsA6NapPU88N4op035l0vhxZZ5Dq9Xy3c/TGdj3fn75bY7N8ZgG9Zjz83d4X/Xdel+Prvxv5Kv88tscetxz5908F15OYlV4awoTU/BuUo8220r//rtdki8e4OyBJTTr/ir125o/V9Ub9eHvCfexa/nn9B42u8SyR7fPJiv1PPc+8weB4ebonfCa7fh7wn0c2jSNpl1fssrv7V+V6jH3lVqfiFodGfTODpyc3Tm48WfSLl//A4HrpalSHfdmbciYN53sVeZ7uNzt6wh++yt8HhhM0udvlVjWs0MPDFnpJH3zHujN31M5m1YQ/O4E3Ft0JGfNIgAKThwi761hGHOzLWVzNi4n+M0v8Lp3ALnb7syHEOLOdlOPIZVKJTExMcTExNC9e3e+//579Ho9v//++3WVDw4OpkGD2xsS4ebmRoMGDfj2229v6+sCnD17lsOHD9OqVSuysrJYt26dTZ46deoQHh5+2+vmCOu27kClVNKna/GIqLNGQ+972nPo+CkSU8q+4fvt78UYTSYG9ik9BDErO4cff5vL0IH98HB3u+W6X4+NmzejVCrp2aObJU2j0dCtaxeOHDtGUnLyDZ3Px8cHZ2dncnKLRwwOXhkB7NCunVXeDu3aotVq2bqt/DsLDaLUZOUZOXimOJwutwD2n9ZTt5rKavTNbvlINUfOGywdO4CTcUaS0o00jCp+jhSXbLTq2AHkFcLZywYq+Ra/SLCfEjcXBftOWWc+et5AgdZETPWbjyrX1GqMyWigYM/G4kSDnsJ9m3GqHIXSy/eGzudctxmG9GT0cWfsZ1A7ger2RcH7d+qMSa8n6Z9/LGkmrZakhQvwbNAATaVKdsu5RkWh9vIiddVKq/SMzZsw5OYS0KXscMTCy+ZRM5Wnx8034DqsOngalVJBv9h6ljRnJzUPNKvD/vMJJGRkl1j21037CPBw59E2MZhMJvIKtSXmDfX1QqG4/ctoB/XphlGv5+K04pF6Y6GWSzP+wje2ES5hwXbLedapgZOvN5fnLbVKT162Dn12LiH9iq+pfq2aUJicaunYAWAykTBvGS7Bgfi1aVa+jbrK+s3bUCqV9O52jyVNo9HQs0tnDh87QVJySpnnmD1vPiaTiYcfuNfu8WoRla06dgAaJydimzQiOSWVvLz8W2uEAxi1OgoTy2777Xbu8HIUShXRzR6ypKmdnKnZtB9JF/aRk3G55LKHVhAQVt/SsQPwCYwkNLIFZw8us1tGrytAryv5gaKzmw9Ozu430ZLr59q4JSaDgZxNV10P9Tpyt67GObIWKl//EssqXNww5eVaOnYAGI0Yc7Mx6YqvN/rLF606duZEPQWH9qD2DUDh7FJezbkjGI2mCvn5rymXGJPQ0FD8/PyIi4vDaDTy7bff0qlTJ+rVq0f37t1tOn3XhmVu376d6OhoNm/ezMsvv0yjRo3o2LEjP/74oyXP6NGj+fvvvzl58qQlJHT06NEAnDx5kv/973/ExsbSsGFDunXrZlW2yLPPPsu2bdvKDFO8dOkSL7zwAk2aNCEmJoahQ4dy/Lh1eERRGOWsWbPo2LEjTZo04dlnnyUtLc3mfIsWLUKhUPD+++8TEBDAwoULbfJcG5Y5ePBghg0bZpXn6NGjREdHs3178Rfx3Llz6dWrFw0aNCA2NpaBAwdy4IA55Cs6OhqA8ePHW/7Nri7rKCfOnqdyaDDubq5W6bVrmEMnTp49X2r5hOQUfp23iGcGP4yzs6bUvD/+Nhc/H2+rjqSjnTp9hvCwMNzdrDuTta6MWl8dXlmSnJwcMjIzOXvuHF9+M5G8vDwaNSx+4KHT6VAqlTg5WXcIXJzNoacnT52+1WbYCAtQcinZyLWXwQtJRpydFAT6lHyD6+WuwNNNQVyS7Zy5C0lGwgLLvtR4uinIzS9+9aKwS52dqVs6vbm+N3vLrQ6ujDE1EbTWE/f08ecAUAVVtlPKPlVQZVSBoWgP77R73LlhS3xfn4DfG5PxHvYemrqOu2Eu4lazJvkXL2DItQ4xzLny0MCthAgLpZP5781YaHtTZSwsxC06Gq7p6CjUatTe3mgqVcK3fQdCHh1EYXw8BXFx5dGUEh2LT6ZKgA8eLtbXiHqVg64cL/kGecepi9StXInfNu+nw9ifaPnOFDp/MJXZm21HZSuKV4Pa5J06hyHb+j3M2H0QAM/69sPCisIujfm2k1INBQV4NahteQ+VzhqM+bbvteFKWa+YOjffgDKcOnOWymEhdq6j1c3Hz54rtXxicjKz5/7D048Pwtn5xkLy0zIycHF2LvP7RRRLjT+Kt39VNC7WD22KOmxpl4/ZLWcyGklPPE5AWF2bYwHh9clOu4Cu0PozfnLvP8wY25gZY2KY93VvTu9fVE6tuDGa8Grok+IxFVg/BNCeM08XcQqvVmLZwhOHcQqNwKv3ANSBwagCgvDq0R9NRBTZK/8p87WVXj4YCwswaUt+8CREScrlUXJOTg4ZGRlUqlSJ8ePHM2PGDJ555hkaNWrEunXreO+999Dr9QwaNKjU87z33nv06dOHyZMns2rVKj7//HOio6Np166dpeN05swZPv/8cwD8/PwAGD58OAEBAYwbNw4PDw8uXLhAQkKCzfk7duxInTp1mDx5MlOnTi2xLYMHD0apVDJ27FicnZ357rvvGDRoEAsWLCAkJMSSd82aNZw/f553332X9PR0Pv74Yz744AO++uorq3MuWrSIpk2bUrlyZXr06MGcOXPIzs7G0/PWFv3YuXMnb731Fk8++STt27enoKCAAwcOkJ1tfgo0Z84cHn74YQYPHkzv3uYY7+rVq9/Sa16P1LQM/H19bNKL0lKumdB/rUm//EbNyCrc07ZlqflOnbvAghVr+eydV1CVNaxUjtLS0/Hzsx3ZKUpLtdPBv9YLL79KXNwlAFxdXXlkwEOW8EuA8PAwjEYjR48dp17d4husg4cPA5CSWv7hbl7uCs5ctn3ClZVrTvN2V5KQZn+RDC83881iVp5t+ew8I+4ualRKMJSwLku1ECVVgpWs2lUcApaSacRoMlEtWMnOq+4bAn3MHUkAV2fzqN+NUnh4Y8zJskk35pgXDFF6el/3uTT1mgNQeND2wYnu4im0R3ZjzEhB6emDc9MOeDzwFLnOrhTu2XDjFb/eOgUEoLMzQq5LNXd4NIGBdssVXLxgnnvYoCHJi4pvqFwiInC6cr1Ve3qhzypeWMWvY0dqfFgcQpdz5AinP/wAHLygSnJWLgFetk/ui9KSs3JtjgFk5RWQnlvAvnOX2XEqjuFdmhPs48n8XUf4ZP4G1CoVD7aoZ7fs7eQcHEhhgm0UQFGaS4j90dfcU+cwGY34tGjMpVnFi3C4V6+Kc6B5pMHJ1xtdWga5J8/i36ElLpVDKbhYPE/Rr1UT82uEBpVbe66Vmp6Bn6/tdbT4e8J2LtbVvps6g+qR1ejUruzFPK52Kf4yG7dup33rlqhUtzhx9z8kLzsZV0/b60ZRWl52kt1yhfmZGPRa3OyULUrLy0rCO9DcUaoU0Yhq9bvj6RtOXlYSR7f/xvo/XkVbkE3t2IHl1ZzrovL2xZBp+zksSlN5lxzhkbX0T9QBlfDq3g/vnuYQcWNhASk/fkbBAfsPAouoA4NxjYklf+9WMF3fYmb/FrKgyu1x0507/ZWh5oSEBD799FMMBgOtWrXitddeY+jQoTz//PMAtGnThvT0dCZPnszAgQNLvZh27drVUq5ly5asW7eO5cuX065dOyIiIvDz8yM+Pp6YmBhLmbS0NOLi4njrrbcsC6O0aNGixNd45plneP755zlw4IDd0NB58+YRHx/P4sWLiYoyjzQ1a9aMjh07Mn36dMtoIYDJZOK7776zzJ+7dOkSU6ZMwWg0orwy8f7AgQOcO3eOJ554AoDevXszc+ZMli9fTv/+/Uv/Ry7DgQMH8PHx4fXXX7ekdejQwfL/Rf9OISEhVv9mjlao1dmMOIE5HAbM8yRKsufgEdZv28UPn44p83W+/mkmsY0b0PwGV+C8VdpCLU5X2nI1zZVRD62dUY9rvfLiSPLy8rickMCKVavRFmqtPjed2rdn1uw5fPH1BJ57dhhhoaHs3rOXhYuXWupQ3pxUoLdzP643mK/Gdt7S4rJq67xX0+mL8xjsVNvDFQZ1cSYty8TavcWdu9wC2H/KQNNoNYnpRg6eNeDtruCBthr0BhNqlQIntQIKb/zbQuGkwWiwM5dIfyVNfb1P9BU4122G/vIFjKm2D5Syp39m9Xvhvs14PfUWrh3vp/DA1uLXK2dKZ2eMOtt/7KIROWUJIx36zExSV68ioFcv8s+dJW3dOjSVKlH15Vcw6nQonZxQujjDVf3irN27OfLcCNSenng3bYZbjRqoXF3tnr88Fer0aOx8nzhfGfIt1Nmfj5mnNf+bZ+QV8Okj3egeYx7F7FK/Ov2++o0fV++8Izp3KldnjFrbz4flPXS1H66lS8sg4e9lhD3Sh9zjp0lctAqXkCBqf/YWRq0WpUZjfg+Bi9PnUvnJh4mZ/iXHRn9CYXIqIQ90p1Jvc6ik0sVxIWFardbynXC1ou/T0q5xew8cYsPW7Xz7+Uc39JoFhYWM+fRLnDUann7s5ubu/1cZ9IWo1Lbvl0pt/iwZdPaXL9ZfSVfauaYWldVfVbb3sN+s8tRo0pcF3/Zn94qvqdH4AdROty9MUeGkwaS3vY4UzUNVOJX8PWHS69AlxsPebeTt24ZCqcS9TRf8h4wkecJYtOdOlvia/k+9jEmnJeOfX8unIeI/56aGO/Ly8qhbty5169alc+fObN++nXfffRc3Nzd0Oh3du3e3yt+jRw/S0tI4d+5cqedt06aN5f8VCgVRUVF2R+Cu5uvrS1hYGF9++SV///13mfm7dOlCzZo1mTx5st3ju3btokaNGpaOHZjnRLVq1Yrdu61XhGrWrJnVwihRUVHodDpSrxpVWbRoEU5OTpZ/k5iYGCpXrmw3NPNG1alTh4yMDEaPHs3mzZvJz78z5g84a5zQ2bmx0l65IF67mEwRvcHA1z/NpFv71tSuEVnqa6zetI1Dx0/y3BD7iwo4ksZZg87OIgPaKzfTmusIEapTuxZNmzTm3l49+ej9saxeu46fp82wHPfz82Xsu2+h0+l44+33eOzJ//Hjz9MYMfxpAFxKuLG7HioleLoqrH4UCnP4o70VKNUq8yhZCffKVseK8l6tqONnr7xGDUN7uuDspOCXpQU2c/Hmri/k6AUD97V25q1Bbjz3gCuXU00cOWfuhRbqbu4xoEmnRaGyvVGh6OZFf32dZ3WVGii9fK9/wRSjgcJda1G6uqMOub7l+m+GsbDQEmJ5taJOnb2wyyJnP/6YjC2bqTLyRRr9/Q91p/xA3ulTpG8yz0805OVZ5delpZG1cydpa9ZwdvynpG/aRO0JE3HyK3k+SnlwdlKjtTM6WHjlCYVzCU8jitLVKiVdGhRHMiiVCro1qEFiZg6X00uer3e7GPILUWpsP6OW99BO2GWRwyPfI3nFBmp99DrtD6wkdvmvZB85SdLSdeZz55rfw5zDJ9g/9FXcqkXQYtVs2u9fQcTwwRwb/bFVPkfQaDSW74SrFT3805QQMmkwGJj448906dCOWjWuPxLFYDDwwWdfcf5iHGNef5kAf7+bq/h/lErtjMHOwyiD3nwtUZXQ6SrqjBntXFOLypbWYVOpNdRu8SjagixSLh2+4XrfCpNOi0Jtex1RXHkoYbLzAK2I78NP4Vq/Kak/f0n+7s3k7dxI8jdjMWSm4/Pgk/YLKZT4Dx2FU3BlUn/8HKOdUUMhrsdNr5b566+/olAo8PX1JSQkBKVSyfz58wEICLDeA6ro94yMjFLPe22YopOTkyXEsCQKhYKpU6fy1Vdf8f7771s6nm+88QbNmtnObVEoFAwfPpxRo0Zx+LDthSIrK8um/gD+/v6cPGn9pOXa1S2LOi2FV26cjEYjS5YsoXnz5iiVSrKyzI+7O3fuzIwZM0hMTCQo6ObDXlq2bGkJgx06dCjOzs5069aNN998E59yXknxRvj7+ZCSantRSk3PACDAz8duuWVrN3Eh/jKvPvMEl5Osw5Hy8gu4nJSMr7cXLs7OTJ7+Ox1bNcfJSW3Jm3PlRiQpJRW9Xk+AndDJ8uDn60tqqm3oZdqVMCJ/vxu7afD09CCmYQPWrFvP008VX/Qb1KvH9Kk/cO7ceQoKC4isVs0S8hkeFnrT9a8arOTZ+61HVj6cmUdWrskSXnk1L3dzWmZuyeEhReGY9sp7uinJLTDZhGSqlDCkuzMh/kp+WFRAQpptR61AC78sLcTHQ4ufp4L0bBPpOSae7+tCdp6JgpscwDTlZKL09LFJV3qYwzGN2Zk2x+zR1IvFZDRSWMJ8O3uKvrAVLo5bDECbkoKmkm0YlJO/+dqmLWXRH0NuLidefRVNUBDOIaEUJlxGm5BA3R9/QpeWhiEnp9TXTluzhohnn8W3fTuS/nbc3lyBXu4kZdrWJeVKOGagnZBNAG9XF5zVKjxdnVFds7WBn4f57yIrv4AQX8fulVmWwoRkXEJtQy+dg83va8Fl+2FwAPqsHPYOfA6X8BBcI8LIvxhPwcV4Ylf+RmFyKvrM4u/VxPkrSFqyFs/60ShUKrL2HcGvrfm7M/fUufJt1FX8fX1IsRPCXvw9Yf/6vXzNei5eimfUs8NISLT+N8jLLyAhMQkfH2/L/OQin0+awtade3hr1As0bnh7oz3uBm6egeRl2X7m8rOTrxy3Hybs7OqNSq0hL9v2mlOU5uZlv2wRd2/z4kHa/Ou7LpcXQ2Y6Kh/b7/OicEx7IZvmDGrcW3Ume+V86zhEo4GCI3vxaN/dvMCWwfpppu+jw3Gp14S0ad9QeOJQubXjTiJhmbfHTXXulEol9evbXhyLOhSpqalWnZaUlBSr4+WtWrVqTJgwAZ1Ox969e/nyyy8ZPnw4GzZswN3d9gu+R48eTJw4kW+//ZbQUOubZG9vb86etV0QIzU1FW/v65+HA7Bt2zaSk5NJTk6229FcsmSJJVzzWhqN7ehQZqbtha1Pnz706dOHtLQ0Vq9ezccff4xareajj24sXKU81ahahb0Hj5Kbl2+1qMqRE+ZFQGpUq2K3XGJKKnq9gWfe+MDm2LJ1m1i2bhMfjR5Ju9imJKWksnLDVlZu2GqT98mX36F61QimfVX2Uto3Iyoykv0HDpKbl2e1GMCxK4vuREWWPMm6JIVaLbl5tnOEVCoVUVHFo5h79poXfGh0C2G28alGvl9gPcqbnWciPsVItVDzIiVXX38jKikp1JlIzij5qpyVayI7z0R4JdtggIhKSuKv2QRdAQzs7Ez1cBUzVxRyJr70eQUZOSbLKpwuGggPVHLg9M3P6dInxuFSNRo0LlaLqqjDzO+dIfFi2SdRqdHUaoT+/AlMOdd/06H0NXewTHmld5JuRd7JE3g3aYLK3d1qURWPuuZFDfJO2N8X7GraxES0iYkAqDw8cK9Vi7S1ZS/LXRTyp3J37GqZ0SEB7DwdR06B1mpRlYMXzdEbtULtbzSvVCqIDg3kcFwiOr0Bp6uGq4vm6fm6Oz6stCzZB4/i1645Kk93q0VVfJo2uHLc/gIWVyuIu0xBnHkVQ7W3J94xdUlYsMImn0mnI2tP8c2kf4dWAKSus72+lpfqkVXZe/CwzXX06HHzQ9Tq1araLZeUnIJeb+D519+2ObZi7XpWrF3PB2++SpsWzS3p3/8yg2Wr1zLiqSF0bt/Gppwom19IbS6f3YG2IMdqUZXkiweuHLe/wI9CqcQ3qKbdUbfkuAN4+lUuc9XL7DTz4kwu7o55YFsSbdw5PGvWQ+HiarWoiqZqDQB0cfYXT1O6e6BQqUFh+32oUKlQKFUolEpMV32FeT/wGB6tOpP+58/k7dpUvg0R/znlugpF/fr1cXJyYtky66Vtly5dir+/P1WrVr2l8zs5OVlGxUo63rx5c55++mlycnJISrL/ZFOpVDJ8+HBWr15tswpmkyZNOHHiBGfOFC9pnpmZyZYtW2jSpMkN1XfhwoW4ubkxbdo0ZsyYYfVTq1atUkMzg4ODOXv2LKarHnNs3ry5xPx+fn48+OCDtG7d2qruZf2bOUKHVs0wGI3MX7HGkqbV6ViyZgN1akYRFGAO10pITuF8XPEk/nvatOCj0SNtfgBaNmnIR6NHUudKGI69fJ3bmPcvfHvkMF540nHzKdq2bmUelV1avKeeVqdj+arV1IquSaUri1UkJSVz4aL1ioHpdkavExIT2bdvPzXKWOwmIzOTP+b+RWS1qjSOKX0j6tLkF5q3KLj6R2+AA2f0eLkpqR9ZfLPr7gINo9QcOWewGnnz91Lg72U9SnfwjJ46VVT4eBSn1whTUslXyf7T1k8oH2iroVENNfM2aK22XrgevVpoUCpgw4Gbn6+mPbobhVKFS+O2xYkqNc4NW6KPO4Mxy/xEVunli9Lf/ui6U/V6KF3dKSwhJFPhZqdzo3HGpXlnjLnZ6C+XvmrsrUhbswaFWk2l++8vro+TE4H39ib70EG0V66NmqAgXKrYf9hytYhnR6BQqbg8u3g+jLqEh12V7usDQO7R8t936mr3NKiOwWjir+3FnRKt3sD8nUepHxFEsI955O1yejZnk6xHiLo1rIHBaGLB7uI6Fur0LNl7nMggPyp5O7Zjej0S5q9AqVZTeUjx0vMKjRNhg/qSsXM/BZfMnViX8BDca5T9QKnme6NQqFWcmzy91HxuUVWIePJhkpauJc+BI3ftWrXEaDSyaPkqS5pWp2PZ6rXUrlmDSoHmznlicjIXriw+BdCpXWs+ePNVmx+A2KaN+ODNV6lds4Yl/+/z5jPn74U8+uAD9L/P8Ruz362q1uuKyWjg+M7irTkMei0n98wjsHIDPHzMi83lZMSTkXzGpmzKpYOkxBX/rWYmn+Xyme1UrVe8pVB+ru1Irq4wl8NbZuDi5ot/qO2Km46Uv3crCpUKjzZXbQGjVuPeshOFZ09gSDdPwVH5BqAOCrNkMWZnYczLwTWmudUWOApnF1zqN0WXEGcV0ul5Tx+8uvQha9lf5Kxd7PiGVSCjyVQhP/815brxkp+fH4MGDWLq1KloNBpiYmJYv349ixYt4p133rnllamioqL466+/WLRoEVWqVMHX15ecnBw+/fRTevbsSeXKlcnJyWHKlCmEhYUREVHynJZ7772XyZMns337dsLCiv8o+/bty7Rp0xg2bBgvvviiZbVMtVrN448/ft11LSwsZOXKlXTt2pWWLW1XfezXrx/jxo3jzJkzREbazi/r1q0bc+fO5YMPPuCee+5hz549LF9uvUH3hAkTyMjIoHnz5vj7+3PixAk2btzIkCFDLHkiIyNZvXo1TZs2xdXVlWrVquHh4dgbl7o1q9OxVXOm/PonGZlZhIUEsWztJi4npTB6RPHmyR9+M4V9h4+x6e+ZAFQJD6VKuP1ww5BKgbSLbWr5/er/L3Ly7AUAWjRuiI+X40KqateKpl2b1vw8fQYZmRmEhoSwcvUaEhOTGDXyeUu+8V9+xYGDh1ixeIElbdiI52nUsCFRkeb34VJ8PMtWrEJvMDB0iPXn6+XX36BOrVqEhoaQlp7OkmXLKcgv4IMx71gWXilP+08baJtg4OFOzgT56cjNN9GqnhNKJSzfaR3/OPw+8xyJcb8WP81cvUdHwyg1z/RxYeMBHRonBR1jnIhPNbLjaHHnrm0DNa3rO3EuwYBWb6JxTevrwqEzBsvcu06NnAj2V3Ih0dy5rF9NRXSEmiXbtVy0s+3C9TLEn6PwyC5cOz6Aws0TY3oymgYtUHoHkL1opiWfe58ncKoSTdqHw2zO4VyvuXnS/DH7W6u4NO2AU80YdCcPYMxKQ+HhjXPDVii9/cid/wsYHbeaZM7hw6SuWkXlZ0fg5OtHQdxFAnv2wjkklDNXrWxZ/b0xeDVpwrbY4lGO0McewzUyipzDh8FgwLd9e3xatODCd99ZddgCevQg6IG+pK1fT2H8JVRubni3aIFPbAvSNmwga/cuh7UPoEFEMF0bVGfC0q2k5eRT2d+bhbuPEZ+ezZgHO1vyvT1nJbvOXGL/+OK/zf4t6jFvx2E++mc955MzCPb1ZNGeY1zOyGbCkN5Wr7PuyFlOXDZHn+gNBk5cTuWH1eYw3A51qlEzxP4I4a3K3HWAy/OWUnPMS2gC/ck7c56wR+7HNSKUQyOKR60aTPkEv7bNWeZV25JW7aWn8KxTg4xdBzDpDQT17kxA5zaceP9rqxE6gDY7FpLwz3LyL17GrWo4lYcOQJeeyeEXxzikXUXqRNegfeuW/DjjN9IzMgkLCWb5mvUkJCXz6vPPWPJ9/NUk9h86wtoFfwIQER5GRHiY3XOGVKpkNWK3cet2pkz7lfDQEKqEh7NyrfUKtU1iGuBnZ2Xnilbl2Udx8vayhOVW6tXRsq/huckz0Wc5btS/JJUqN6Rqve7sWvEVBbmpePpV4dTef8hOj6fNAx9a8m2YO5qEszt5clzxtaJ27CMc3zmXFTOGU7/tEyiVag5tno6ruz/12hRHLx3d9hsXjqymcq0OePiEkJedzMnd88jJvEz7/p+iumpRFm1BNke2mhccSTy/90r5WWhcPNG4eFGn5a0/4NWeO0ne7i1493kUpac3+qQE3Ft0QO0fSPKvxXsm+z3+PC4163Hx2X7mBJORrFUL8LnvEYJe/Zjc7evMC6q06ozaN4DUX762lHVt2Byfvo+hS4xHlxCHW3PrvW0Lju6/7mkCQhQp9111X3vtNTw9PZk7dy7ff/89YWFhjB07lgEDBtzyufv378+BAwf44IMPyMjI4IEHHuDVV18lICCAKVOmkJiYiKenJ02bNuWzzz4rtTOpUql4+umneftt69AODw8PZs6cySeffMI777yD0WikcePG/Prrr1bbIJRl3bp1ZGdnc/9VT86v1rt3b8aPH8/ChQsZOdI8OnX1Rrnt2rXj1Vdf5ddff+Xvv/+mXbt2jB071qrjVr9+faZPn87SpUvJyckhODiYoUOH8swzxV+M7777Lh999BH/+9//KCgoYMaMGcTGxl53O27W2yOH8dNvf7F8/Wayc/KIqlKZ8W+NIqau/dCNf5vXXn6JaTNnsXrNOrJzcoisVpUP3nuHBvVKX2Wvd88e7Ni5i12795CXn4+PjzdNGsUw8OEHqXbNyHaN6tXZsGkzKampuLm50bhRDEMGPUpIiP3Ni2+VyQQ/LS7g3pYa2tZ3Qq2Gi0lGfl9TWGpIZpGMHBOT/8mnT2sNPVtoMBjg6AUDCzYXWo36hQWYO6ZVg1VUDbb9G/1wZh7abPPrXU4zUi9SRd2qGhQKuJxqZPryglsKySySO/8XjB3ScK7fAoWrG4bEOHLmTEJ/wf4qZlY0LjhVr4/u5EFMhfYXttBdPI06PArnmDYo3NwxaQsxxJ8jd9EM9OeO2y1Tnk6NHUPlhGEE9OiB2tOTvFOnOD5qFNn79pZaLu/0afzad8C3XVsUShV5p05x4o03SFuz2ipf9r79eNZvQEDXrjj5+WEyGMi/cJ5zX31Fwp9/lHD28vXhw12Y7LONRXuOkZVfSI0QfyY80ZsmkfZv/ou4OKn5cdgDfL14M//sOkq+Vkd0aAATn7iX1tHWI5mrD55iwe7iEMhj8ckcizfPFQry9nBY5w7g4LDRFFx8gdAB9+Hk40X24ePseegZ0reU3nHOOXKSoHvvoVKPTqBSknP4BHsfe5HEf5bb5M0+dJywRx/AuVIA2tR0EuYt49RHE9GmlL2ly61686Xn+HnW76xct4HsnFyiqkbw0TujaVivfPbXO31lT9W4+Mt89NVEm+NfjRtzR3buIl96Ereq4ZbfQ/p2I6SveYTr0m8LKqRzB9Cu/yfsWTWBU3sXoC3Iwjcomi6PfUdwtdL37nRydqfnU9PZvuQT9q39HpPJSEi15sT2Go2re/GctqAqjUi6sJcTu+ZSmJ+J2smVwPD6tOk7jtAo61XQC/Oz2LNqglXaoU2/AODhE1ounTuA1OkT8E4biHvz9ijd3NFeOk/Ktx9TeOpIqeWyl/2FISURj4698O71EKid0F06T8oPn5G/b5sln1N4VfN/g0LxHzLS5jxJX71L4V3UubvLdna4YylMpv/geOUdKDY2lkcffZQXXnihoqtiV/KRHRVdBYfK09zYfMp/owkrwsvO9C/2Vtqoiq6CQ51YWHqn7G4Q8+ZjFV0Fh1o32P4qzXeLBjvnVHQVHG5vvQcrugoOdWi2Y8OpK9oja+7u9w+g8rd/VXQVSvT+rFKW3Xagdx8t97GsO9p/q7V3oLi4ONasWUNGRobdRWqEEEIIIYQQ4npI566CzZgxgwULFvD4449bbUAuhBBCCCHE3UKCBW8P6dxVsDfffJM333yzoqshhBBCCCGE+JeTzp0QQgghhBDCoYyyoMptUf7rqQshhBBCCCGEuO2kcyeEEEIIIYQQdwEJyxRCCCGEEEI4lCyocnvIyJ0QQgghhBBC2HH69GmeeOIJYmJiaN26NePHj0er1ZZZzmQy8cMPP9ChQwcaNGjAww8/zL59+xxeX+ncCSGEEEIIIRzKaKqYn1uRmZnJ448/jk6nY+LEibz00kv88ccffPLJJ2WW/fHHH5kwYQJDhgxhypQpBAYG8uSTT3Lx4sVbq1QZJCxTCCGEEEIIIa7x+++/k5uby6RJk/Dx8QHAYDAwduxYhg0bRlBQkN1yhYWFTJkyhSeffJIhQ4YA0KRJE7p3787UqVMZM2aMw+osI3dCCCGEEEIIhzIZTRXycys2bNhAy5YtLR07gB49emA0Gtm8eXOJ5fbs2UNOTg49evSwpGk0Grp06cKGDRtuqU5lkZE7IYQQQgghxF2pc+fOpR5fvXp1icfOnDlDv379rNK8vLwIDAzkzJkzpZYDiIyMtEqPiopi+vTpFBQU4OLiUlbVb4qM3AkhhBBCCCHENbKysvDy8rJJ9/b2JjMzs9RyGo0GZ2dnq3QvLy9MJlOpZW+VjNwJIYQQQgghHKqidkIobWTubiQjd0IIIYQQQghxDS8vL7Kzs23SMzMz8fb2LrWcVqulsLDQKj0rKwuFQlFq2VslI3dCCCGEEEIIhzLe6r4EFSAyMtJmbl12djbJyck28+muLQdw9uxZatWqZUk/c+YMoaGhDptvBzJyJ4QQQgghhBA22rVrx5YtW8jKyrKkLVu2DKVSSevWrUss17hxYzw8PFi6dKklTafTsWLFCtq1a+fQOsvInRBCCCGEEEJcY8CAAcycOZMRI0YwbNgwEhMTGT9+PAMGDLDa4+7xxx8nPj6elStXAuDs7MywYcOYOHEifn5+1KxZk9mzZ5ORkcHQoUMdWmfp3AkhhBBCCCEcylRRK6rcAm9vb6ZPn84HH3zAiBEjcHd3p3///rz00ktW+YxGIwaDwSrtf//7HyaTiZ9//pm0tDRq167N1KlTqVy5skPrLJ07IYQQQgghhLAjKiqKadOmlZpn5syZNmkKhYJhw4YxbNgwB9XMPuncCSGEEEIIIRzKZKzoGvw3SOdOXJcB71d0DRzruVHVK7oKDje0a2JFV8GhnvhiVEVXwaEe/qJmRVfB4b78+3xFV8GhWs8aUdFVcKhP39lR0VVwuO6zj1Z0FRyq3sDaFV0FhxrY/YeKroLDbaroCogKJ507IYQQQgghhEMZ/4Vz7v6NZCsEIYQQQgghhLgLSOdOCCGEEEIIIe4CEpYphBBCCCGEcKh/41YI/0YycieEEEIIIYQQdwEZuRNCCCGEEEI4lNEoI3e3g4zcCSGEEEIIIcRdQDp3QgghhBBCCHEXkLBMIYQQQgghhEPJeiq3h4zcCSGEEEIIIcRdQEbuhBBCCCGEEA5lkgVVbgsZuRNCCCGEEEKIu4B07oQQQgghhBDiLiBhmUIIIYQQQgiHMsqKKreFjNwJIYQQQgghxF1ARu6EEEIIIYQQDiULqtweMnInhBBCCCGEEHcBGbkTQgghhBBCOJSM3N0eMnInhBBCCCGEEHcB6dwJIYQQQgghxF1AwjKFQ7m7qXj60cq0aeaLs0bJ8dO5fD/zAifP5ZVaTqGAru0CaNPMl+rV3PB0V5OQXMjaLWn8segyOp310P69XSrRqK4Xtaq7ExTgzPL1yYz/7qzD2qXXaVn510T2bF5Afm4WIZVr0rX/SGrUb1VqueTLZ9m2eg4XTx8g/vwR9Dotr325Er/AMJu8Om0hm5ZNZ+/mBaSnxOPq7kWV6jHc03cEQeE1HNU082vrtMye+Qvr1q4kNyebKlUjeeSxocQ0alpquW1bNrJ86QLOnztLdlYW3t7e1KxVh4cfGUKVqtVKLHf58iVGPvMEOp2Oz77+nuo1osu7SSVyd1Xy+AOBtIjxwFmj5OS5An7+K4kzFwvLLFujigudWnpRs5orVcOcUasU9HnmuE2+Ti28GPl4SInn+fLneNbvzL6ldlxLr9Oy9p8JHNg6n4K8LILCo+n4wEii6rYutVxKwhl2rZvDpTP7uXz+CAa9lpGfrsInINwm79evdSIzNd4mvUn7h+n92Nhya0tZ3FyUDOrtS/P6bmicFJy6WMjMBemcvaQts2xUZQ0dmnlQI8KZiFANapWCh14+Z5PPSa1gaF8/qkc4E+CjRqmEhFQ9a3dks2JzNgbjrbXBoNeyY9kEju+ZT2FeFv4h0cT2GEnlmqW/XwA5mYlsnv8xF09sxmQyElY9ltb3vYG3f2VLnmM757FmzpslnuOeRz6jZuN7Lb9fPLGF3au/J+3yCYxGAz6BVanfZhDRTfrcWkNL4O6mYvigCNo0N39XHDuVy3czz3Py7PV9V7SN9aNGVTc8PdQkJBWyZksqcxZaf1cE+mvo0TGQFo19CA92wWg0cfZiPjPnXWLPwaxbqr9Br2XPqgmc2rcAbX4WvsHRNOnyAmHVy37/cjMT2b7kE+JPmd+/kGqxNO81Gi+/ylb5fn6rtt3yTbqOomH7/1l+z0w+y7Edv5Mcd4DUePPf8IOvrMLT1/Z7piKo3N2IfHkoPs0b4tOsPho/H/YPHU3cjL8rumql8nBX8eyQSNq2DMDFWcXRE9lM+vk0J07nlFpOoYDunYJo3zKAGpEeeHk6cTmxgNUbkpj990W0upJDFRvU8eLbTxsB0OvRzWRm6cu1TbebRGXeHndV527ixIn8/PPP7N27t6KrIjBf0D56vSZRVdyYs/AyWdl67utSiS/erc0zbx7iUkLJN8/OGiWvPRPJkRM5LFyZREaWnjo1PHj8wTAa1/Pi5Q+OWeUfcF8Ibi4qjp3Owd/HydFN488f3uTgzhW06TYY/6Aq7N74D7988X/27jouivyNA/hng+5GREBQAZEwEQsD9ey+s/PsOM/21LPu7Dq7O05/ttioZwcqCnYAinQ3278/VhbXXVBkl3HX5/168Tr5zszuMzfLzjzfHIFh03fAxb12sce9e/0Ity7shW1FN9g4uCL+3Yti9/13wxQ8D7uCek27w8GlOrLSk3An5ADWz+2N8QuPw8JafTfq1SsW4/bNq2jfqTscHCricsh5/DV7GuYtXInqXt7FHvcuOhLGxiZo37EbTE1NkZ6ejksXz2LKhJFYtGwtKrtWUXrcjs3rweFwIBAI1HVKSrFYwKzRjnCpqIdjIWnIzhGhTRNz/P17JUxY+A7xySXHU7uGEVo2NMe7WB4SUwSoaKerdL+nb/KxYke8QnnHFhaoXFEPj1+W/AD7LU5sn4ZnDy7AP6g/rOyc8ejmMez/ZzgGTN4Fp6rFf0Y/vHmEeyF7YOPgBpsKbkiIeV7i+9hX8kRA60FyZVZ2Lqo4ha/CYgHTfrWFi4MuTv6XiexcMVo1MMHsUfaYtjIOCSklPwzV8jREC38TvIvnIylVCAdb5d8fujosONrrIuxFPpLThJBIgGouehjQ0RJVnfSwel9Kmc7j0r/TEBl+AT6N+8PMxhkvQo/h9Nbh6DRyFypULv56CXi5OLGhP/gFOajdYjjYHC4eX9uF4+v74ZcJx6BvZAEAqOBaFy16LVE4PvzaTqTEv4Rjlfqysqinl3F252jYO/uhbqsxAIuFt4/P4tKBqSjITYdvk4FlOtfPsVjAomnucHMxxL8npfeKTq1ssXJ2dQyfFvHFe8W00W54+iobJy8mISNLAK9qxhj4syNq1TDDhHlFn9+GdSzQq1MF3AxNx4WrKeCwgVaBNlg+yxOL17/Fuf++/RpeOzId0U8uwKtBf5haOeNN2DFc2DUCbYbshL1Lydfv7LYB4BfkwCdwGNgcLp7e3I2zW/uj05ij0De0kNvfoUoDVKkpn2BbVZBP+pJiHuHZ7b0wt3WDmY0b0uJL/hsub7rWFqg2awzy3sUiO/wlrJr6Mx3SF7FYwJI/vVGlsjEOHI1BZpYAXdo5YM0CXwwZ/xAf4vOLPVZfj40Z4z3w5EUWTpyLR3oGHzU8TDG4twtq+1pg3IzHxb7n+GFVkJcvgqEBR12nRrSQViV35PvSxN8SNdxNMHfla1y7mw4A+O92Gnat9MGAHo5YsOZtsccKhRKM/fMZnr0qqhE7czkZicm8jzdtUzx8UlTT+vvc50hKkdbSB+8s/kaqCjFvw/H4zhm07TkJTdoNBgDUatQJq6Z3xJl/l2PU7P3FHlu9VjN4b7oLPQMjXDu9vdjkLjMtEU/vX0STtoPQttdkWXll99rYsnAQnoSGoHGbAao9sY9evXyOG9cuY8DgEejc7RcAQNMWrfHbqEHYvX0TFi1fW+yxv/RWjKll67b4dcDPOHfmJEaOmaCwPezBPYQ9DEWX7j3xv3/3qO5EvkKDmibwdDPA4s2xuBUm/azdeJCNDXMro1cHa6zYrpiQferstQwcvZAGvkCCYb/YFpvcJaYIkJginyjq6rAwoqctwl/mISNLpJoT+ig2MhxP7p1Byx6T0eCnIQAA3wadsf7PDrj4v6UY8se/xR7r7tccU9fcg56BMW6d2/bF5M7EwhY+AR1VGn9p1PcxhEdlfSzflYS74dIk+dajXPwzrSJ+bm3+xaTrwq0sHL+cCYFQgsFdLItN7nLzxZi5Wv7zcPF2NvIKxGjTyBS7TqYjM/vbrmPi+3C8eXQGAe0no2ZT6fVyr90Z/y7rgFvBS9FtbPHX68mtA8hMeYdu4/4HOydpxYuTRxP8u6wDHl3dgfptpX9zZlaV5FryAEAoKMC1o3NRsYo/DE1tZOURN/fCyMQGnUbsAocr/Ux71f8F+5e0xYvQYypP7gLrW6KGhwlmL3+Na3fTAABXbqVizz++GPSzI/5aXfK9YszMp3j6yb3i9KVkJCTxMegXR9TyNpW1yj16moVfRj1CVnZRwn/yYhK2LPHGoJ8dvzm5S44JR1T4GdT9aTK8G0vvCVVqdsKx1R1x//wytB9+oNhjn989gKzUd+gw8hBsHKXXz7FaExxb3RFPbuxEnVa/y+1vZuWCKn4l/705eTRD31n3oKNnhIjr27+75I4Xn4QQx4bgJabArHYNNLpzhOmQvqhZQxv4VDfDzIVP8d8t6efk8o1kHNhUF0P6OGPusuIragVCCUZMDsOTF0XPLKcuJCA+iYdf+7igjq857j/OUDiuY+sKsLXRR/CFePzcSbHnhCaiCVXKB425I2rTxN8CaRl8XL+XLivLzBbi6p00NKhtDh0uq9hjhSKJXGJX6Eao9LWcKhrIlRcmduUh4t4FsNkc1Gv+s6xMR1cPdQK74f2bR8hILT4hMDQ2h56B0Rffg1eQCwAwNrWSKzcxt5G9n7rcvnkVbDYbrdq0l5Xp6uoiqFVbvHzxFCnJSaV6PTNzC+jp6SMvV/F6CoVCbNu8Fu07dYW9vUOZYy+tBrWMkZ4pxO1HRbFl5Yhw40E2/H2MwS3hMwoAmdmiErvUlKSutzEMDTi4Glq27mDKPHtwHiw2B7UDf5GVcXX0ULNRN3x4+wiZacV/Rg2MzaFnYFyq9xMJ+eDzVN/6+DXq+xghI0uEexFF75+dK8btx3mo42UI7hcqvDNzxBAIv/2BIzlNmigYGXz77fRtuPR6edWXv16e9boh8d0jZGcUf73ehp+HbSVvWWIHABa2rnCsUh9vHp8r8X2jn16BgJeLajU7yJULCnKhZ2AmS+wAgM3hwsDIAlwd/dKe3hcF1rf8eK9Ik5VlZgvx3+1UNKhj8cV7xVMl94rC13L+5F4R/SFfLrEDpA/ed8MyYGutBwP9b7uG0U+l18+9btE9gaujh2p1uiHp/SPklHD9op9cgHVFb1liBwDmNq5wcK2PqAjl108oKIBQUEJrpqE5dPS+fJ9hipgvAC+xbC3d5a1pQ2ukpvNx9XZR3BlZAly+kYxG/tYlf0aFErnErtC1j6/lXMlQYZuJMRdD+1XGtn3RyMnV7K6YpPz9UMndsmXL0KFDB9SsWRONGzfGhAkTkJQk/6Dar18/DB8+HOfOnUPr1q1Rs2ZN9O/fH+/fv5fbLyEhAcOHD4evry8CAwOxc+dO/P3332jevLlsnzVr1qBmzZoKcdSpUwdr1qyR/f7ff/9h0KBBCAgIQK1atdCjRw9cu3ZN4bj79++jc+fO8Pb2RocOHXDz5k106tQJ06ZNk9svLCwM/fv3h5+fH2rXro2JEyciNTX1m/6flUUVFyO8jsqD5LPnphdvc2Cgz4FjhdI/JFh+7HKZmV2+3fc+FffuOaztnaH/2QNwJTfvj9uLr8H7Wla2lWBmaY/rZ3fi2cMryExLQMzbcBzbMReWNo7wrd+2zO9RnKi3b+BQsRIMDeUfDqpW85Buj3zzxdfIzclBZmYG3kVHYt0/S5GXlwtv31oK+506cRg5OTno0bOfaoIvJddK+ngbU6DwGX0dXQB9PTYqFtOKowqB9UzA44txJ0y1Y+0AIOH9c1jZuSgkaRUr+8i2q0rUi7v4e2RNLBxVC6umNMedi7tV9tpfw6WiLiJjeQrX8M17HvT12Khgo9pryOEAJkZsWJlzULeGITo0NUVSmhAJKd/+nZQS+xzm1i7Q1Ze/XnZO0uuVGqv8eknEYqTGv4SNYw2FbbZOPshKfQ9+QfHjgV6FnQJXRx+u3i3lyh3c6iEt8TXunvsHmSnvkJnyHvcvrkfShyfwazaktKf3RVVcjPAqUsm94k2uCu4VX34wtjTXQX6BCDzetw2cTI17DjMrxetXmLClxSu/J0jEYqQnvoR1RS+FbdaO3shOew8BL1eu/HXYceyeWwu75/jh6Kr2ePs4+JtiJqVT1dUYr95mK3xGn73KhoE+B5UqKiZoX2JpIa08ycxS/O4Y2tcFael8nDinOKaZkC/5obplpqamYvjw4bC1tUVaWhp27NiBfv364fTp0+Byi/5XPH/+HGlpaZg0aRJEIhEWLVqEyZMn4+DBgwAAiUSCUaNGISUlBXPnzoWJiQm2bduGuLg4sNmlz5c/fPiAZs2aYfDgwWCz2bh27RqGDRuGXbt2wd9f2hc9KSkJQ4cORfXq1bFq1SpkZ2djzpw5yM7OhqdnUX/7sLAw9OvXD4GBgVi5ciXy8/OxatUqjBo1ShZ/ebGy0EHEC8UH19R0wcftuoiKKb6fujK/dKiAnDwh7j3KVEmM3yI7I1nWgvapwrLsjNK1bCnD4eqg77hV+Hf9ZOxeOVpWXrGyF0b+uQ8GRqZlfo/ipKWnwsLSUqHcwlLaipiW9uUa16kTRyH2QwwAQN/AAD169kNQK/mEND0tDf87sAcDh4xQSCTLi4UpF09fK7Y4pWdKHwgtzbh4F6f6VmFjQzZqVTfC3cc5yOepvptKdkYyTMzU+xkFADtHdzhVrQ0r+8rIz8nAo5vHcP7fBcjOSELLHpNU8h5fYmHKwfPIAoXywq6ulmYcxCSorjLI39sI4/sV/b99856HDQdTIC7DhCp5Wcly3SILGZpIy3KzlF+vgvxMiIR8GCk51uiTYz9POgCgIC8D719cR+UaQQrb6wSNRFbaBzy4tBEPQjYAALg6Bvip/2pUrtGidCf3FawsdBD+XLFlIzVD+rdnbVn6e0XPTg7IyRPiblhGifs52Omhsb8lrt5O/ebJHvKyk2FgongNCsvyspVfP97H62eo5NjCsrysJJjZSCejsnWqicreP8HEwhF5WUl4fnc/rh6aDH5BNjz9e31b8OSrWFno4fETxeeO1LSiz2jku1yF7SXp07UScnKFuPMgTa7czcUIHX9ywOS5EWX6XvkeST7Pjola/FDJ3cKFC2X/FolEqFmzJpo0aYI7d+6gUaNGsm3Z2dk4fvw4LD8+4Obl5WH69OlISEiAvb09rl27hqdPn2Lfvn2oU0c6e2D9+vURGBgIU9PSP3T37dtX9m+xWAx/f3+8efMGhw4dkiV3O3fuBIfDwaZNm2BsLL0ROzo6ok+fPnKvtXz5ctSoUQNr164FiyXtJlCtWjW0b98eV69eRWBgYKnj+1a6umzwBYrfTIVlerold3n7XO/OFVDbxwyrtkUjN0+1Y5RKQyDggctVHFvF1ZF2lRTwvzzL4tcwMDJFBWdPeNdrjUpVfJGa+B7/ndqCfWt+x5Cp29TWNZPP40NHR/H8Csv4vC8nO2PGT0V+Xi4SE+JxKeQc+DwexGKxXOXH7p2bYGdfAUGt26ku+FLS1WUp7ZLH/1imq6uezg0NaplAR4etli6ZgLTbFkfJNSz8jJbUpas0eo3bIPe7X6Ou2LdqKO5c3An/Fn1hammvkvcpia7OF66hjmqv4dM3+Zi/MQGGBmx4V9WHs4Mu9Mv4OREKC+S6QBbifOF6CQXSpLakY0XFHPs2/DzEIoHcDJmyY7m6MLdxgZt3a7h6t4REIsazOwcRcmAyOgzbDntnv686r6+lq8tWmAEZAPj8b/s77NPFAXV8zLByS1SJ9wo9XTbmTKgKHl+MzftjShf0J0RCHjhcxRZiDrfwGihWPgBF14+t7Ppx9eT2AYD2w+XHc1et3RUn13fHgwurULVWF7V0mSVSerpsCIQlPM/ole4z2q+HE+rWtMCy9a+Qkyv/GR0/rAruPkhDaFh6MUcTUrIfKrm7evUqNmzYgNevXyMnp6irSnR0tFxy5+HhIUvsAKBKFekMf4XJXUREBExNTWWJHQAYGRkhICAAT58+LXVcCQkJWLlyJW7duoXk5GRZzYaXV1FXjYiICPj7+8sSO0DavdPc3Fz2e35+Ph4+fIgpU6ZAJCr6snBxcUGFChUQERGhluSOy2HBxFj+o5SZJQCfL1b6YFVYxuN/fQ1O0wBLDPrZEWcuJ+HURdW0OnwrHR09CIWKCU7hA5gqkq6CvGxs/KsfmrQdjCZti2YidKxcA5sXDMCDa8dQP6hnmd9HGV09XQgEiudXWKarp3zSkE95eBZ9dhs1aY6xI6QTrQz8dSQA4OWLZ7h6+SLm/r38m1q7S4vLkU5j/amsbBH4fInSsRK6H8v4fPVUmwbWNUVWjggPnpSupvdrcXX0IVJyDQs/o4VJnqqxWCzUbzkAb5/cQPTLeyqdaIXDAYwNP7uGOdIxjyVeQyUVTGWRmSNGxGvpA/fd8Dx0aWGGmcPtMG5R7DdPqMLl6kOk5DtF9IXrVfgwX9KxnGKOff3wFPQMzeDk0Vhh27Vj85H4/jF+Hn8UrI9/n26+P+Hfpe1x4/gCdP/t0FeclZJ4S7hX6OgouYa6pf87bBZgicG/OOL0pSScLOFewWYBs8ZXgbOjAaYteCnrUfItOFw9iISKx4uEhddAedJVeP3Eyq6fkCe3j/L31YVn/T64dWIOUmKfljgrJ/k6XC4Lpp99RjOyBODxxdDhlvA8U4ouvc0b2WBoXxecuhCP42fjFbbV8DBF/zH3vyH675+YJlQpFz9MchceHo5Ro0ahRYsWGDp0KKysrMBisfDzzz+Dx5Ov2fy89U1HR1ojV7hfUlKSXPJXSFnZl4jFYowcORLZ2dkYN24cnJ2dYWBggNWrVyM+vuiPPjk5GS4uLiW+Z1ZWFkQiERYuXCjXSlno09dTJS93Y6z4U34q5t5jHyE1XSAb9/ApKwtpWWr613V3q+1tiqmjXHE3LAMrt0aXOd6yMjG3QVZ6okJ5dkbyx+22ZX6PiNALyMlMRfVazeTKXT3rQs/AGNGvH6otubO0sEJqqmLXy/Q06bhNS0vrUr2esYkJvH1r4tp/IbLkbvf2TfD08oadfQUkJSYAALKyMmXvk5yUCBtbu7KchhwPVwP8PcFJrmzojLdIzxLCwkzxa7CwLC1T9QPZrS24qF7FABduZJZ5bbTilMdntDhmltL1/PJzM1T6uu4u+pgzSr4lcPRfH5CeJYK5qeKsKYVlaZnqbeW/8zgXvdpaoK6XAULulLzeVXEMTW2Qm6l4vfKypdfLyFT59dL/OOlJblaywrbcEo7NTo9DXNQDVPf/GRyO/He0SMjHi3tH4NdsiCyxAwAORwdOHk3w5OY+iIR8pa2FX+LlboxVc6rLlfUcHfbxXqH4elYfy1LSvv5eMW2MG+6EZWDFlpLXOZ00ojICapnj7zVvEfa0bC3ohiY2yFPSdTb/4zUwNFF+/QonrSm8zp8qLDMs5toXMjKT/k3w85kbqqBNvD1MsWahn1xZ9yF3kJrOg5Wlks+oZek+o3X8LDBzggdu30/DsnWvFLaPHuyKKzeTIRCKYW8rrZgxNpLej2yt9cHl8mVdQQkpzg+T3IWEhMDY2BirVq2StRTExsZ+02sVjtn73Odlenp6Cut2CQQC5OUVjfF59+4dnj17hnXr1iEoKEhWXlAg343Dxsbmi+9pYmICFouF4cOHy71WIQsLC4UyVXj7Lg+T/5IfMJ6WIcDbd3nw9jAGiwW5QcgeVYyRXyDCh3jlXVU+5VHFCHMnVsWryFzMW/Xmu+h/7uDsgcjn91CQnyM3qUrM23DZ9rLKyZQmUuLPTlgikUAiFkEsUt8Dq4trFUSEhyEvL1duLNyrl9JJHYpbq64kfD4fuXlFrVTJyYlITkrE8MGK40QWzJsBQyMj7DukuokComJ5+PMf+W5X6VkiRMXwUL2KgcJntJqLPgp4YsQmqX7iniZ1TcFms9TWJRMA7Cp5IOrFXfDyc+QmVYmNkq6nZO+kfDFkVUhPlv5/NjQpfWVXSd7F8TF/Y4JcWUa2CNFxfHhW1le4hlWd9FDAE39xrcKy0v3Y4mRYhtkyrR08EPv2LvgFOXLj3xLfS6+XVUXl14vFZsPSvhqSPzxR2Jb4/jFMrSopHW/3Ouw0IJEo7ZJZkJcBsVgIiZIvW7FICIlEDInk276I377Lw8T58pPDpGUI8CY6Fz6eJgrX0LPq198rPKsYYf7kanj1NhdzV7wu8V4xvG8ltGlmi7U7onH5ZtknG7Os4In4qHsK1y85JvzjduX3BBabDQu7akiJVezxk/whHCaWlb4462V22gcAkK1nSMrmTVQuxs+UX3cuLZ2PN5G58PEyU/iMelUzQX6BCDGxX54tuHo1Eyz4wwsvXmdj1uJnSiv37Gz00aqpPlo1Vazc3PFPbbyOzMGg3x6U+ry+FzTmrnz8MLNlFhQUQEdHRzYODQBOnTr1Ta/l7e2NrKwshIaGyspyc3Nx+/Ztuf3s7OwgEAjkZtq8c+eOXJfJwtbAwtZBQJp0fr4Qu7e3N+7cuSPXnfT+/fvIyMiQ/W5oaAg/Pz9ERkbC29tb4cfRUT3rpOTkivDwSZbcj0AgwbW7abA010XjekU3HVMTLgL9LXHnYYbcOJkKdnqoYCfffcjJQR8LplRDQjIPM5a8+uYp51WtRt1WEItFuHe5qGuSUMDH/WvHUMnNB+ZW0paLjJQ4JMVFftN7WFdwAQA8vnNGrvzZw8vg8/Lh4KK+h/MGDZtALBbjwtmi5Eog4ONyyDlUc/eEtY20Jjk5KREfYuRnkc3IUBwjkJSYgPBHD1GlirusbNTYiZg2c77cT7sOXQAAA4eMxO+TZqj0nHLzxHj8Ik/uRyCU4FZYNizMuAjwK3ogMzHioGFtE4RG5ED4yWfU3loH9tZln3mxSV0TJKUK8OxN6SaIKI3qdVpDIhbhwdWiSZSEAj4e3TiGiq6+sta1zNQ4pMR/22c0PycDYrF8JYNIKMCNM1vA4eqgsodqFybOzZd2h/z0RyCU4E54LsxNOajnXTRbnYkRG/V9DfHgWT6En4RoZ8WFndW31WmaGCm/XTavbwIAeBvz7bXpbj7S6/X0TtH1Egn5eBF6DHZOvjAxl16v7PQ4pCdFKhybFBOBpJgIWVl6UiRi39yFm89PSt/vdVgwjM0dlC6ObmBsBT0DU0Q9uSjX3VPAy0X0syswt3X95rFdObkiPIzIkvsRCCS4dqfwXlFUIWBqwkVgfUvcfiB/r3Cw04PD5/eKivpYOM0dCUk8TF/8ssR7xS8dKqBnRwfsPRqLI2cVW0u/hUuNVpCIRXgZWnRPEAn5eP3wKGwq+cD44/XLyYhDRnKkwrEpsRFI+SRBz0yOQnzkXbjUaC0ry89VrNwV8HLx9NZu6BtawMpBccZNUnrZuULcf5wh98MXSHDlZjKsLHQRGFDUc8XMlItmjWxw816q/GfUXh8O9vJ/I86Ohlgy2xsJSQWYOu9JsV2Np//9ROEn5Jq0VXj+iudYvbX4NR8JKaR1LXcikQjnzimuDVO9enXs2rUL8+fPR8uWLREWFoYTJ05803s0adIEXl5emDhxIiZMmABTU1Ns3boVRkZGcsljkyZNYGhoiJkzZ2Lo0KFISEjA7t27oadXdGNydXWFvb09li9fDrFYjLy8PKxevRq2tvJdMQYOHIgDBw5g+PDhGDJkCLKysrBu3TpYWFjIveeUKVMwYMAAjB8/Hu3atYOpqSkSEhJw69YtdO3aVTZBS3m4dicNz9rkYPIIVzhXjEdmthAdW9mCzWZh5//kW02XzZTWbPYZK60xM9BnY9Ef7jA25uJQcALq1zSX2z8ukYdnr4sS3YBa5nB1lj7ccTgsuDoZok8X6bpptx+kI/K96h6knar4wrtea5z73yrkZKXBys4JD2+cQHpKHLr9+pdsv4ObpiPqRSgW7XkmKyvIy8bNC/sAAO9eP5TGd3Ef9A1NYWBkggYtpRPkeNZsCruKVXD5+AZkpMTB6eOEKrcu7oeJuQ3qBnZT2fl8rppHdTRoFIi9u7YgMzMdFSpUxJVL55GUmIDRvxUtqP7PioV4GvEYx05fkZWNHz0EPr41Udm1CoyMTRAf9wEhF85CJBKi38Chsv38atVVeN/cjxUXXt6+qFLVXWG7Otx6mI0XkfkY178CKlVIQ1aOCG0CzcFmAQeC5bumzhsvXQB62MyihzMbSy6a+ku7cVdxlt7Me7SRPqAmpwrx3z351jknB11UdtTH4XPqXZrE0dUX1ev8hEtHVyI3Ow2Wtk54fOs4MlJj0XFg0Wf02LapePcyFLO3FbW8F+Rl496lvQCAmDfSz+i9S9LPqL6hCeq1kE4A9fLRZVw7vRHVa7eGuXVF5Odm4sndYCTFvkbzrr/DWMlsnepw53EeXjUuwKhfrOFol4nsXDFaNTABm83CofPylQ2zRki7sI35+4OszNqCgya1pcm9ayXpd3PXIDMAQHK6ENcfSFucG9cyRssGJgh9kofEVAEM9NjwdTeAr7sB7j/Nw9M3X25dKo6dsy/cfH7C3TMrkZ+TBjNrJ7y8fxzZabFo1qPoel06MBVxkaEY9cmCyTUa9MKzu//D6W0j4Bc4GGwOF4+v7YShsRX8AgcpvFdq/Cukxr9EzeZD5e4dhdhsDnwDB+PeuVU4sqYn3Gt3gkQswvN7R5CbmYCg3ku/+TyLc/VOGp6+ysbUUa5wcTRAZrYAnVrZSe8Vhz7I7bt8lrRiq9eYRwCk94olMzxgbMzFv6fiUb+Wudz+cQlF94pGdS0wop8TYuLy8S42H0GN5dcRfRCeKZsptzRsK/nCpcZPuH9hJQpyU2Fi6Yw3YceRnR6HRl2Krt+1w9OQEBWKwX8XtV56+vfGy9DDuLB7BLwbDwKbzcWTm7tgYGSFGo2Krt/zO/vx/tklVPJoCmPzCsjLTsbrB0eRkxmPwO6L5brJ8guy8ey29G848V3Yx+P3QVffBLr6pqgeID8RGxOcR/WBjpkp9B2kzzq27ZpBv6L07zN63R4Is76ti7O6/HcrGU9eZOGP39zh4mSEzCwBurR1AJvNwrb90XL7/vOXLwCgx693AQAGBhysmOcNEyMuDhyNQUBd+V4NsfEFePpSeq+4fkfx3lC1svT76c6DNGRm0Zp35Mu0Lrnj8Xj47bffFMqXLFmCSZMmYe/evTh69Chq1aqFTZs2oXXr1kpepWQsFgvr16/Hn3/+iT///BOmpqbo378/oqKi8Px50Ze2hYUFVq9ejcWLF2P06NHw9PTEkiVL0K9f0Zpeurq6WLNmDebNm4fffvsNFSpUwMiRI3Hnzh08eVJUk2dra4stW7bgr7/+wrhx4+Dk5IQZM2Zg3rx5MDExke1Xq1Yt7N+/H2vWrMH06dMhEAhgb2+P+vXrw9nZudTnWhZiCTB98UsM71MJXX6yg64uGy8jc7FkQ9QXu9mYmnBhZy190Brau5LC9vNXk+WSu8b+FmgdWPQwWbWyEapWlnZnSUnjqzS5A4Cfhy/CxSOrEXbzJPLzsmBfyR0DJ6yHq0edEo/Ly83CxSOr5cqun90JADC3dpAld1yuLobP2oPLxzfixaOreHznDPT0jeBVuwVa9xgPIxP1dsH5beIf2L9nO65evoicnGw4V3bDjNkL4FXDt8TjfmrbEQ9C7yDsQSjy8/NgZm4Bv5p10P2XPnB2cVVrzN9CLAHmrfuAQV1t0L6ZOXR12Hj9rgCrd8UjNvHL3fnsrHTQt6N8ElP4e8SrPIXkLrCuNBG8psYumYW6/LoYl4/9g/DbJ5Gfmwm7Su7oNW4DnN0VE+tPFeRl4srxf+TKbl/YAQAws3KQJXe2jtVgU8EN4XdOIi87DRyODuydPNF9xCp41VXeYqQOEgmwcGsS+nawQJvGptDlsvA2ho/1/yYgPvnLD0K2ljro2Ub+76nw96dvCmTJ3YuoAri76KGhnxHMTDgQiyWISxJg14k0nL1R9uvZotdi3Dv3D149OAlefiasKrij7ZANcHAr+Xrp6huj88jduHlyIR5c2gCJRAwH13po1Gk6DIwVu8a+CpP2WKlWs32xr1knaARMLSsi/Poe3L+4DiIhH1YV3NG6/z9w8yn9PfNLxBJg2sKXGNHXCV3bfLxXvM3FovWRiCnFvWJ4HyeF7ef+K7pXuLlIKwArORhgxljF7uXj5zxDeua3rTvZpPsiPAxZjTdhJ8EvyIKFnTta9t8A+8olXz8dPSO0/XUX7p5ZhEdXNkIiEaNC5XrwbzcNBkZF18/OuSaS3ofh1f3D4OVngqtjABtHbzTq+jcc3OrLvSYvPwsPQ+TvM09uSP+Gjc0dvovkzvX3wTB0KepNVKFra1ToKv1sxe4/+d0ld2IxMHlOBEYNdkX3DhWhp8vGi9fZ+HvVC8TElvx8YWbChZ2NtPJv5EDF++CZSwmy5E7bSWhClXLBklAHWJXg8/lo164d6tSpo3QyE3WIjo5GmzZtsGDBAnTp0kWt79Wi5z21vj7TxkzQ/lnG3C1V0wXpezV9ueoXA/+e/NKnGtMhqN3xY++YDkGtGjYt3wq28nZ8j3bfJwDgp59LTtY0XY1e6uvy/z1Y+NNmpkNQuxunym/Jq9IaMl9x8qDysG1W+fQk+V5oXctdeTl48CDEYjEqV66MrKwsHDhwALGxsVixYoXa3nP58uVwd3eHra0tYmJisGnTJtjY2KBVq1Zqe09CCCGEEELKilruygcld99IT08Pmzdvls246eHhgU2bNsHb21tt7ykQCLBs2TKkpKRAX18f9erVw5QpU2BkVPJsWoQQQgghhBDtR8ndN+rcuTM6d+5cru85bdo0TJs2rVzfkxBCCCGEEKIZKLkjhBBCCCGEqJWYpvkoFz/MOneEEEIIIYQQos2o5Y4QQgghhBCiVjShSvmgljtCCCGEEEII0QLUckcIIYQQQghRK1pau3xQyx0hhBBCCCGEaAFK7gghhBBCCCFEC1C3TEIIIYQQQohaiWlClXJBLXeEEEIIIYQQogWo5Y4QQgghhBCiVrQUQvmgljtCCCGEEEII0QKU3BFCCCGEEEKIFqBumYQQQgghhBC1onXuyge13BFCCCGEEEKIFqCWO0IIIYQQQohaScRipkP4IVDLHSGEEEIIIYRoAWq5I4QQQgghhKgVLWJePqjljhBCCCGEEEK0ALXcka9yfEIy0yGoVbbZU6ZDULuZ++yZDkGtNujPYToEtTJ/48F0CGrX2YfFdAhqlX3jNdMhqNXgyb2YDkHtMnb0YDoEter102amQ1Cr6eeGMR1COXjJdACEYZTcEUIIIYQQQtSKlkIoH9QtkxBCCCGEEEK0ALXcEUIIIYQQQtRKQhOqlAtquSOEEEIIIYQQLUDJHSGEEEIIIYRoAeqWSQghhBBCCFEr6pZZPqjljhBCCCGEEEK0ALXcEUIIIYQQQtRKLBEzHcIPgVruCCGEEEIIIUQLUMsdIYQQQgghRK1ozF35oJY7QgghhBBCCNEClNwRQgghhBBCiBagbpmEEEIIIYQQtaJumeWDWu4IIYQQQgghRAtQyx0hhBBCCCFErSQSarkrD9RyRwghhBBCCCFagJI7QgghhBBCCNEC1C2TEEIIIYQQolZisZjpEH4I1HJHCCGEEEIIIVqAWu4IIYQQQgghakVLIZQPSu5UbM2aNVi7dq3SbRMnTsSwYcOQkZGBGTNm4N69e8jKysK6desQFBSEnTt3YufOnUhMTESzZs2wfv36MsVy9+5dhIWFYcSIEWV6nW/BFwix8chZnLn5ANm5eahSyQEju7dBfW/3Eo/bdPQcthy7oFCuq8PFre1L5MoOh9xE6LM3eBL5DompGWjfqC7mDO+l0vMoDl8gwI59B3Hxv2vIzsmBq4szhvTpiTo1fUv1OpNmzcODxxHo3LY1fhvxq6w8KTkFZ0Ou4M79B/gQlwA2m43KzpXQ7+duqO3no+rTkTHQY+Hnlsao5aEHXR0WImMFOHghB+8ThF91fAVrDnq2NkZVJx0IRUD4Kz4OXshGdp78F7qZMRudmxqhuqsuzIzZyMgWI+wlD8HXc5GbL79v87oGaF7XADYWHOTkiXHvKQ/HruSAL1DZaRfhcGHSpgcM6zQG28AIgvj3yD5zCLxXEV88VLdaDZgEdQa3ghNYHDaESfHIvXEe+fdvqCHQL+MLRdhwPRzBT6KRXcBHVRtzjA70Qf3KFb7q+PPP3mFf6Au8Ts4Al82Gq7UZRjfxQT0XewDAyfBIzD59p9jj/+4QgLY1KqvkXIrDF4qw4Vo4gp9ESc/R1hyjA31LcY7R2Bf6Eq+T0ovOMdD3k3N8i9nBJZxjxwbqPUcOF8atukG/VkOwDYwgjI9BzoXD4L9+UuJh1lNXgGNpo3SbMCUBqUsny35nG5vCuM0v0PPwA0tPH8KkOOReOQVexD2VnooysvvEjfvIzs1HFacKGNm97ZfvE0fOYcux8wrlujpc3NqxVK5Mep94jSdvP94nGtfFnOG9VXoeJeJyYda+J4zqBYJlaARB7DtknjoA3ovwLx6q5+4D0zbdoOPgBBabA0FSHHL+O4u8e1dl+3AsrGAU0Bz6NWpDx7YCJGIxBHHvkXX2CHgvv/weqmRsxMGoga5oHGANfT0Onr/Kxtrtb/HqbU6Jx7FYwE/N7RAYYI2qrsYwNdFBfGIBLl1LwoFjMeALik8IfKqbYv3imgCAdn1uIjPr6+5V6sQxMoTrxCEwr+cL87re0LU0x+Mh0/Bh9zGmQyM/CEru1EBfXx+7du1SKK9QQfrAsWPHDty9exeLFy+GlZUVKleujOjoaCxatAhDhw5Fs2bNYGFhUeY47t27h+3btzOS3M3ZfACXQh+jd+smqGRng+Drofht+RZsmj4Kfu6uXzx+2sDuMNTXlf3OZiv2IN51+jLyCnjwcnVCSkaWSuP/ksWr1uHqrTvo3rEtKlaogPOX/8O0eQux8u/Z8K7u+VWvce3WXTx9+Urptpt3Q3HgyHE0rF8XrZo3hUgkwoUrVzHpz/mYMm4U2gQ1U+XpAABYAMb3NkMley7O3cpDTp4EzeoYYOpAc8zdnI6kNFGJx1uYsDFtoAXyeGIcvZQLPV0WWjcwhKOdOeZvSYfoY1d7PR0WZgyxgJ4OC5fv5yMtU4RK9ly0qGcADxcdzNucjsJbefcgI7RtaITQpwUIuZsHBxvpfhVtOFixL1Pl/w/Me4+EgW895F49C2FKAgzrBsJy2BSkrvsL/KiXxR6n51UbloMnQPDuNbLPHwYkEhj4BcCiz2iwjUyQe/WsymP9kj+D7+DSy/foXdcDThYmOBkRibGH/sPm3i1Qs5JticduvB6OzTeeIMjDCR19XCEUifEmJRNJ2fmyfWpVssVfHQIUjt0X+gKvEjNkCZI6/Rl8G5defDxHSxOcDI/E2INXsLlP0JfP8Vo4Nt+IkJ6jtyuEYjHeJGcgKTtPtk+tSrb4q2MDhWP33XuBV4npaj9Hs5+HQc+7LvJunIcoJRH6dRrDfNBEpG9eCEG08u8OAMg+tQ8sPT25Mo65NYx/6gH+q6LEkKWnD4uRs8A2NkPezfMQZ2dC38cf5n3HIvPAehQ8uq22cwOAOZv2f7xPBKKSvbX0PrFsMzb9Mfrr7hODusPwk/NUep8IvsTYfQIALPuNhWGt+si+fBrCpHgYBTSFzegZSFo1G/y3L4o9Tt+7DqyHTwU/6hWyTh+SfqfUbgCrgePANjZBzuVgAICBTz2YtOqC/Mf3kHfnP4DDgZF/IGx/m4203WuRe+dKuZwniwUs+dMbVSob48DRGGRmCdClnQPWLPDFkPEP8SE+v9hj9fXYmDHeA09eZOHEuXikZ/BRw8MUg3u7oLavBcbNeFzse44fVgV5+SIYGnDUdWqlpmttgWqzxiDvXSyyw1/Cqqk/0yF9NyQSGnNXHii5UwM2mw0/P79it0dFRcHd3R0tWrSQlT18+BASiQQ///wzKlWqVKb35/P54HKZu7RP3r7DhTth+K1nB/RrJ01C2jWqg1+mL8Hqf4Oxffa4L75GUD0fmJsYl7jP5hmjYW9lARaLhca/TlNJ7F/j+avXuHz9JkYM6odfunQEALRuHohBYyZg0869WLvk7y++Bp/Px4btu9Cra2fs2H9QYbufTw0c3L4BZqamsrKObVph6G+TsWP/QbUkd3Wq66Gqky7WHcrEg+c8AEDo0wIsGGOFzk2NsPloyQ9G7RobQleXhbmbM5CWJf0Cj4oVYFJ/CzTy08fVhwXSc3PXhbU5B6v2ZyD8NV92fG6+BJ0CjVDJnov3CUKYGbPRqr4hbj3Ox9bj2bL9ElJF6NvWBL7VdPH4FR+qouPkBsNaDZB5Yi9y/zsNAMgLvQ7bKUtg2qE3UlbPLvZYo8atIM7KQMq6vwCRtOY47/Yl2E5bDsO6geWe3D2JS8H55+/we/Oa6O8vrWxo710ZPbacxqorj7Crf6tijw2PTcHmG08woUUt9K3nUex+jhbGcLSQ/xstEAix8Hwo6jrbwdrYQDUnU4wncSk4/+zjOdavDgBo7+2KHluCsepyGHYNaF3ssdJzjMCEoFroW6/4yhhHCxM4WpjIlRUIhFh47h7quqj3HLmOrtD3C0D26QPIu3YGAJD/8Aasfl8I47Y9kb5+XrHH8p49UCgzat4JAFDw6JaszMC/ObjW9kjbvBCCt8+k73HnEixHz4Zxu94oiLgHiEqu1PlWsvtEr46f3Cfq4pdpS7D631PYPvu3L75GUD3fL98nZo4puk8MmaqS2L+WrnMVGNVthIyju5AdchIAkHv3P9jPXAnzLv2QtGxGsceaNG0DUVY6kv6ZDQil3yk5Ny7A/s/VMKrfTJbcFbx6grwZwyHOLfqOzLl+HvZ/LIdph57lltw1a2gDn+pmmLnwKf67lQIAuHwjGQc21cWQPs6Yu6z4RFYglGDE5DA8eVF0jzl1IQHxSTz82scFdXzNcf9xhsJxHVtXgK2NPoIvxOPnTo4qP6dvxYtPQohjQ/ASU2BWuwYa3TnCdEjkB0MTqpQzd3d3nD9/Hvfv34e7uzvc3d0xbdo0WetaUFAQ3N3dcfToUQBAbGwsxo0bh9q1a8PPzw9DhgzBy5fyLQjNmzfHvHnzsGXLFjRr1gw+Pj7466+/sHbtWuTl5cnep1+/fuVyjpfuhYPDZqNL86JafT1dHXQK9Ef4m2gkpKZ/8TUkEiAnv6DEBS8rWFuCxWKpJObSuHrzDthsNtq3DpKV6erqom3LFnj64hWSklO++BoHjp6ARCLBL106KN1e2amSXGIHALo6OvCvXRPJKanIyyu+FvRb1amuh8wcER5+TOwAIDtPgtBnPNR01wP3CxWjtT31Ef6KJ0vsAOBZlAAJKULU9dKXlRnoSa9ZVo58DV5mtvQhsrALjpujDrgcFu4+4cntd++JNEms98lrqoKBrz8kIhHybl8uKhQKkHf3P+hWrga2uWWxx7L1DCDOz5UldgAAsRji3GxIBKpLQL9WyIsYcFgsdPWrIivT43LQydcN4bEpSMjKLfbYfaEvYGVsgN513SGRSJBXiv6v197EIpcvRBsvl7KE/1VCXryXnmPNqrKyrz7He4Xn6FH6c3xdeI7q7XKq710PEpEI+XflP4/5oVeh61wVbLPiP49KX88vAMLUJAjevZaV6VZ2hzgnS5bYAQAkEhSE3wPH1By6rl/XC+FbXLr3WHqfaPbZfaKpP8Jfl+I+kfd93icAwKBWACQiEXJuXCwqFAqQe/sS9Fw9wLGwKvZYlr4hJHm5ssQOgNLvFGF8jFxiJy0UouDJQ3AtrMHSU+33ZHGaNrRGajofV28X3f8ysgS4fCMZjfytocMt/hoIhRK5xK7QtY+v5VzJUGGbiTEXQ/tVxrZ90cjJZb4r5qfEfAF4iV9+DiBEXajlTk2EQsUvGy6Xi4MHD2LZsmXIzc3F7NnSlgBLS0u4ublh2bJlWLt2LWxsbODk5IScnBz069cPbDYbc+fOhZ6eHjZs2IC+ffvi5MmTsm6eAHDhwgU4OztjxowZYLPZ8PT0BI/HQ3BwsKyLqLFxyTWcqvLyXSyc7G1gbCB/U/FycwIAvHoXB3urkruddpr4N/IKeDDQ00XT2jUwvncnWJmZlHhMeXkTGYVKFSvAyFD+huNRTfog/SYqGrY21sUen5icjAOHj2PKuFHQ+6zr1JekZWRAX08Penq6X965lJzsuXgXL8Tnj0lRsQI0rW0AOysOYpOU1+Kbm7BhZsxGVJzi5z4yVgifqkXxvnongFgsQa+fjHHwQg7Ss8RwtOOifWMjPHzOQ0Kq9D10Pn47CYTyERUmfy4Oqv360qnoAmFyPCQ8+cSZ//6NbDsvI03psby3z2DSohNM2vRAXug1aReqWg2hU8kV6bv+UWmcX+NFYjqcLE1grKcjV17DQfow+TIxHfamRkqPvRedCF9HaxwIfYmtt54iI58HayN9DGnghZ51Sh4LdeZpNPS5HLRwL1vvg6/xIqGYc6wg/dsr+RwT4OtoIz3Hm0+KzrFhje/mHLkVnSFKSYCEVyBXLox5K93u4Ax+pvLPo8JrOTiDa1cROZdOfLaBq7TyQcLnfYzB5Yvj+76V7D5h+Nl9wrXwPhH75fvEhL8+uU94Y3yf7+c+AQC6jpUhTIqDpOCz75Toj98pjpUhSk9Veizv1VOYtu4C0/Y9kXf3P0gkEhjVbQxdJzekblv+xfdmm5pDzCuAhF8+lUtVXY3x6m02Ps+zn73KRqefHFCpoiEi3xVf4aKMpYX0vpGZpVj5MrSvC9LS+ThxLg4Df3H+5rhJ+aIJVcoHJXdqkJeXBy8vL4Xyffv2oU6dOjA1NQWLxZLrulm5srQW2NPTE46O0u4Fu3fvRlxcHE6fPg03NzcAQN26ddGsWTPs2rUL06YVdUUUCATYsmULDD9JOOzt7b/YRVQdUjKyYG1uqlBeWJacUfxYKVMjQ/zcshF8qjhDR4eLRy8jcSjkJp5GxmD3vN8VEkYmpKZnwFLJmEgrC3MAQEpayTXOG7btRhXXymjepGGp3jc2Lh7Xb99FYMMAcDiqH19gZsLGq/eKN9GMbGkLm7lJCcmdsbQTQGaOYn/6zBwRjA3Z4HIAoQiISxFhV3A2fm5pjJm/FrU+3HiUj50ni2qg41Ok71Wlkg5eRBfFVdVZesO3MFFtxwO2qTnEWRkK5YVlHNPiHzRzLhwD19IWxkGdYdKqq/Q4XgHSd65EwRPFLnLqlpKTDxslXQYLuxEm5yhv+c3K5yMjn4fHH1IQ+i4Rwxt5w97UECfCI7H44gNwOWx0/6Sl7FOZ+TzcioxHs2qOMPos4VKHL55jdnHnyPt4jskIfZfw8RyNcCL8LRZfuA8um43utUo6x7hyOUeOiTlE2RkK5YVlHFPzr34t/ZrScYOfdskEAFFyAnSr1ADb3ArijKIkQ7ey+8f3KPvY7+IUe5+w+HifSC++G7ipkYH0PlHVBTrcwvvEDTyNfI/d8yYoJIxM4ZhZQJSpeD8oLOOYFf//N+vs/8C1toXpT91g1rYHAOl3SsqWpSgIDy3xfbk29jDw80d+2G2gnMY4WVno4fETxXt7apo0ubS21C11ctenayXk5Apx54F8JYabixE6/uSAyXMjQMumEaKIkjs10NfXx969exXKXV2/PED8U/fv30fVqlVliR0AmJubo0GDBnjwQP6B0d/fXy6xYxJPIICOkj58ujrShyFeCV2gerVuIvd7i7q+8HJ1wswN+3A45CYGdmhRzJHlh8/ny87lU7q60qSDzyu+pjQs/Amu3b6L9csWlOo9C3g8zFm8Anq6uhjWv0/pAv5KulyWQisZUNRyplvCt4WOjrTLjVDp8R/34bIgFEm3p2eJERUrQPgbPlIzRKjmrIsW9QyQkyfBoYvSmdXeJwjx9oMAbRsaIiNbjOdRfDjYcNGvnQmEIonsPVWFpaMLiVDxs1lYxtIpvrVUIhRAmByPgvB7yA+/BxaLDcOAFjDvMxqpGxdA8O6NSmP9Ep5QBB2OYvKr97FSgCdQnqTnCaTnmpHPw6JODdG6urRGPMjDCT22nsHWm0+LTe5CXsRAIBKXS5dM4OM5Kvme0eOyZduVyfv4gczI52FR54ZoXd0FABDk6YQeW05j680nxSZ3IS/efzxH9XbJBADo6Mh3ySv0FZ9HOSwW9H3rQxAbDVFSnNym/Hv/wcC/Ocz7jEV28D6IszOh5+MPPa/apXuPb8DjC6Cjo/ilovuxjCco4T7xU6Dc7y3q+cLLzQkz1+/F4ZAbGNgxqJgjy5f0O0XxGkoEX/edIkiMA8LuIO/RHbDYbBg1agmrgb8hefVc8KNfKz2OpaMLq18nQiLgI+O44nOIuujpsiEQKmZafIG0TE+vdJVx/Xo4oW5NCyxb/wo5ufJ/y+OHVcHdB2kIDfty113yfaGWu/JBY+7UgM1mw9vbW+HHyEh5F6HiZGVlwdpasXuflZUVMjMzFcq+F3o6OhAoebDif7yh6emWrsb7pwa1YWVmgntPi58drjzp6urKzuVT/I/dX3SL6TIpEomwZst2tGzaBB5Vqyjdp7jj5i9diXcxHzBn6kRYW5VurM3nOGzA1Igt98NiAXyhROm4iMIyfgnDGgQfu0pylR7/cZ+PiV+VSjr4rbcZjl7ORcjdfIS95OPghRwEX89FqwADOFgXPbCvO5SJmEQhBncyxdLx1hjXywyhTwvwPl4IHl+1NwmJgA8WV/GzWVhW0tg5s26DoO9VC+m7V6Mg7DbyH95E6oa/Ic7KgFmXASqN82vocTkQiBQftHgfJ8fQ01He8qv3MVnistkI8ijqdshmsdDK0wmJ2XmIz1Re+37maTTM9HXR0NWhrOF/FT0uR+n3DO/jA6ZeMYNE5c/RSVYuPUfnks/xSTTMDHTR0K0czlEgAJRNjPUVn8dP6VT2AMfMEgVhtxS2CRNikPnvenCsbGE56k9YT10Ow4atkH1qHwBAzC9QOEZV9HR1IBAofqnwP5bpKalAK8n3dp8ACr9TFK8hS+fL19Dil19h4F0HqdtXIP/BTeSFXkfyP3MhykyHeY/Byg9isWE1ZAJ07CshdcsyiJW0GpYVl8uCpbmO3A+bDfD4YuhwFR8pdXU+Vrbwvr6JrXkjGwzt64JTF+Jx/Gy8wrYaHqZYu+1t2U6EEC1GLXffMTMzM0RFRSmUp6amwszMTK6MqQHjylibmyI5XbF7RuE01DbmZgrbvsTOyhyZOXlf3rEcWFmYIyVNcaxLanoGAMDaUnlXm/OXryImNg4TRg1HQmKS3La8/AIkJCbB3NwM+p+Nw1u2dhNuhz7EjAnjUMvXu8zxV6mkg6kD5WOcvCoFmdlimBkr3pzNP3Z/zMgufta8jI/dMZUdb2YsXZ+u8Dm8aW19ZOWIER0v/2D36CUfnZsaw62SDuI+dsnMyBZj4Y4M2FpyYGbMRmKqCFm5YqyYoC8bm6cq4qwMsJV0k2J/7P4myirmQYnDgaF/U+RcPgW5ASdiEQpePIJRo9YAh6O2WQeVsTY2kJvSv1DKx+6YyrozAoCZgR70uByY6OmA89m08pYfu7plFfBRwUy+oio+MxdhMUnoWrOK0hZDdfjiOZp8wzkaSf/2vodzFGVnKO0WyTExl25X0oVYGYOaDSARi4td1oAXEYrkZw+l6zOy2RDERssmUhElJ3xT7F/D2twUyWlK7hMfu2PaWCh22fwSOyuL7+Y+AUi7X3KUTMRU2B1TWZdN6Q5cGDVogeyLJxS/U56FwTjwJ4DDlZ/ACYBFnxHQr1EbaTv/Ae+VesZKenuYYs1CP7my7kPuIDWdBytLxYrNwrKUtK+rjKjjZ4GZEzxw+34alq1TTNRHD3bFlZvJEAjFsLeV/r0aG0kfZW2t9cHl8mVdQQlhyuXLl7Fq1SpERUXBwcEBw4YNQ7du3Uo8Jjw8HAcOHMD9+/eRlJQEOzs7tG7dGiNHjix1zzxK7r5jtWvXxvnz5xEZGSnr0pmZmYlbt27hl19++eLxOjo6stak8uTu7IAHz98gJ79Abozck7fvAQDVnEtX6y2RSBCfnA53l4oqjfNbVXF1QVjEU+Tm5clNqvL8pbSbTJXKLkqPS0pOgVAowtipMxW2XbhyFReuXMX8PyajUf16svKNO3bj3KUrGP3rQLQIbKSS+GMShVi2W/6hIjNHjPcJQlRz1gELkJtUxbWiDnh8CRJLSKYyssXIyhWjspJJTlwrcuUWQTc1YkPJclQofF5W9tyclCaSrbPnYM2BuQkHNx6ptlVBEBsNoyrVwdIzkJtURde5imy7MmwjE7A4XCg7KRabCxabLd1Wjsmdu50F7r9LRA5PIDfhyJO4VNl2ZdgsFqrZmuNZfBoEIhF0PhnbWThOz8JQcRKgc8/eQQKgbTl1yQRKOscU2XZl2CwWqtlZ4FlcquI5Zpd0jtEfz7EcumQCEMa9g66rJ1h6+nKTqnCd3GTbv4jDhV6NuuBHPodYyfg9GZEIwg9FFYm6VWoAAPhvnn5T7F/D3akiHjx7g5y8Arkxck/eSs+rmnPpvu8lEgniU9LgXsrj1In/IRom1WqApW8gN6mKrou026/gg2LlLQCwjYyl3yksJd8pHA5YbA5YbDYkn3ylmHXpD+MGLZD+v+3Iu39DtSfyiTdRuRg/U37dubR0Pt5E5sLHywwslnw+6lXNBPkFIsTEfjnprl7NBAv+8MKL19mYtfgZlHQ+gJ2NPlo11UerpnYK23b8UxuvI3Mw6LfyH+dMvo74B1jn7v79+xgzZgy6d++OP/74A3fu3MGMGTNgZGSEn376qdjjzp49i3fv3uHXX3+Fi4sL3rx5g9WrV+Px48fYvXt3qWKgbplqIBaL8ejRI4WfmJiYUr1O165d4eDggOHDh+P06dMICQnB4MGDweVyMWDAl7t6ubm5QSgUYteuXQgPD0dkZOS3nlKptKjrC5FYjGOXi2qK+QIhTl27hxpuTrIZ0BJS0hEdlyh3bHpWjsLrHb50C+nZOQjwLn7NrfLUpEEAxGIxgs+HyMr4AgHOXboCz2pVZTNlJiYn4/2HWNk+zZs0xPw/Jiv8AIB/nZqY/8dkeFYrGuvz79ETOHjsFPr06ILuHdupLP68AgmeRQnkfoQi4P5zHsyMOajlWfRga2zAQp3qenj0iodPe8DZWHBgYyHf7e3B8wL4VNODhWnR14pnZR3YW3Nx/1nRw2lCmghmxhy4O8t3u/L3lj7gfZoIfo4FoEdLY/D4Evx3X7XLQeQ/vgsWhwPDgOZFhRwuDOsFgh/9GuKPM2VyzK3AtS2qoBBnZ0KclwMD77rSFrrCWHX1oO9VC4LEWGkXu3IU5F4JIokERx8VjfXjC0U4Ef4W3g5Wslkk4zNzEZUq33rS2tMZIokEpyKKHjx5QhHOPo2Gq7UZbE0UaxDPPouGvakhajraqOmMFAV5OEnPMaxo7JH0HCMVzzGlmHMML8U5Pv14jpXK5xwLIkLB4nBg4C//eTSo0wT8928g/jhTJtvcChybCkpfQ8/DF2xDI6VdMovDsbKDQf3m4D0LgyhFfS13Lep9vE9cUXafcC79fSLkJtKzchDg833cJwAgP+w2WBwOjBu1LCrkcmEU0By8qFeymTI5Ftbg2hUlpeLsLOl3il89aQvdRyw9feh714Eg4YNcl06ToE4wbdkJWeeOIOfKabWeU3auEPcfZ8j98AUSXLmZDCsLXQQGFA0lMTPlolkjG9y8lyo3ntvBXh8O9vKT3jg7GmLJbG8kJBVg6rwn4POVJwHT/36i8BNyTdoTZv6K51i9lbprEmZt2LABPj4+mDdvHurXr4/x48ejXbt2WL16dYnHDR06FPv378cvv/wCf39/9OnTBzNnzsTdu3fx5EnpWuKp5U4NCgoKlLasde/eHX///eUFrgsZGxtjz549WLRoEWbNmgWxWIxatWph7969cssgFKdZs2bo3bs3Nm/ejNTUVNStWxd79uwp1bl8ixpVnBFUzxdr/3caaVk5qGRnjeAboYhLScOsX4v+v/y5aT8evniL+3tWyMra/z4frfz94FapAvR0dPDoVSQu3HmEas4V0e2TdfMA4NrDp3j1XjpBgFAkwuuYOGw9Ll1PKLCWF6o6qWdcTHX3qghsGIAtu/cjPSMTFSvY4/zlq0hISsbksSNl+y1cuRaPnzzDlZP/AwA4OVaEk6PyWuUKtrZyLXbXb9/Fpp174ehQAc6Ojrh45Zrc/rX9fGD5cXZOVbn/jIc3MQIM6WQCBxsOcvIkaFbXAGw2cOI/+TFIk/tL33vKP0Uz7AVfz0Od6vqYMsAcIXfzoafLwk8NDBGTKJRrZbt8Lx+N/PTxWy8zhNzLR2qmCO7OuqjvrY8nb/mIjC1K7nr9ZAwdLgvvE4TgsqUJYOWKXGw7ni23np4qCN6/Rf6jOzBt3xMcEzMIUxJgWLcJOJY2yPh3s2w/8z6joFelOuJ+7yUtkEiQc+U0TNv9Auvx85Efeh1gs2Ho3xQcCytk7Vmr0ji/hndFa7T0cMKa/x4hLbcAlSxMcCoiEvGZuZjdtr5sv1nBt/HgfRLCpveWlXWrWQXHHr/FwvP38S4tG/amhjj9JArxmblY1SNQ4b3eJGfgdVIGBgVUL9fu4XLnmPfpOeZgdruiiZdmnbolPcc/iiYi6lazCo49eoOF50PxLi0L9qZGRef4s5JzTCr/cxTGvEVB+F0Y/9QDbCNTiFIToV+7ETgW1sg6vFW2n9nPw6Hr5onEqYrrmOrXbACJgA/ek+JnV7SasAgFEfcgykgFx8IGhvWbQ5KXg6xjO9RyXoVk94lDwUjLypbeJ65/vE8M7Snb78+N+6T3ib0rZWXtx89DK/+aH+8TXDx6FYULd8I+3icayL3PtYdP5O8T7+Ow9fgFAEBgrRpqu08AAD/6NfIe3IJZpz5gm5hBmJQAo/pNwbWyQfLe9bL9LAeMhX61GogZ9bHblkSMrJCTMO/YG3aTFyL37n/SCVUatADXwhqpO1bJjjXwrQfzrv0hSIyDIOEDDOvJT0pW8PwxxNnFz1CtKv/dSsaTF1n44zd3uDgZITNLgC5tHcBms7Btf7Tcvv/85QsA6PHrXek5GHCwYp43TIy4OHA0BgF15buyxsYX4OlLaXfd63cUl46oWlm6zNOdB2nIzPo+1rxzHtUHOmam0HewBQDYtmsG/Yr2AIDodXsgVFJB8SPQ9glV+Hw+7t69i0mTJsmVt23bFsHBwfjw4YNsRvzPWVoqduGuXr06ACApKUlhW0kouVOxsWPHYuzYsSXus379eoWyoKAghcXJAaBixYpYs2ZNia93+fJlpeVcLhezZ8+WradXnuYO740KR87izM37yM7LR5VKFbBqwq+o5eFW4nFtGtRC+OtoXA4NB08gRAVrC/Rv1wyDOwZB/7OJSi6HhiP4RtFDy8t3sXj5TtpSZmdpptab9h+/j8H2ff/i4n/XkJ2TCzcXJyyYNQ2+Naqr5PXfRkm7Jn2Ii8eClYrXf+Xfc1Se3EkkwKr9Gfi5pTGC/A2hy2UhKk6A7cezvmp8W3qWGIt3pqNnK2N0b2EMoUiC8Nd8HLyQLdfql5AqwrzN6ejSzAgBPvowM2YjI1uMs7dyceKKfBL5Pl6IlvUNUN9bDxIJEBUrxLLdGXJLI6hS+r71MG3TAwZ1GoFtYARB3HukbVkKfuSLEo/LCTkOUVoSjJq0gUnrrgBXB8K490jbsRIF4ffUEuuXzO8QgPXXpElLVgEfVW3N8U+PQNR2si3xOH0dLjb3boFVV8Jw4vFb5AuEcLezwOqfA9FAyWQpZ55GAwDafJx1sjzN79gA668+xumIwnO0wD8/N0VtJ8UuW5/S1+Fic58grLochhPhb5HP/3iOvzQt5hylLXzlNRNoocyDm2Dcqhv0azUE28AQwoQYZOxcAUGU4r3icyw9feh5+IH34rHCOmufEsa/h0GdxmAbm0Gcm42C8HvIuXgUktzilyJQlbkj+qDC4bM4c6PwPuGAVROHfsV9ojbCX0fhcuhj+ftEp5bK7xPXi7tPmKv1PgEAqbtWwyytF4zqBYJtaAR+7DukrF8I3ptnJR6Xfe4IRCmJMG7WDmbtfga4OhDEvkPK5qXIf3RHtp+Oo4v0v3YOsBr4m8LrJK38E7xySO7EYmDynAiMGuyK7h0qQk+XjRevs/H3qheIiS25l4WZCRd2NtKWvJEDFWcVP3MpQZbcaQrX3wfD0KXoIb5C19ao0LU1ACB2/8kfNrljSosWJc+0funSJZW8z/v37yEQCBRmxy+c9T4yMrLY5E6ZwpnxSzvbPksi+XzJSUIUZd9Tb1cPpmWbqX/RZabN/Nee6RDU6q8MxQcbbWLu+/10N1Ob72hiKHXIfqZ8+nptYdi9F9MhqF3Gjm1Mh6BWvWLGMR2CWk0/N4zpENSuneDLlT9MadUvjJH3FcVNKnG7qpK7Bw8eoHfv3jh48KDcGtNpaWkICAjAsmXL0KFDh696rbS0NHTq1Ane3t5KG4VKQi13hBBCCCGEELWSMLTqfFmSt+zs7K/qFlmpkuoaCQQCASZMmAAAmDNnTqmPp+SOEEIIIYQQQj5z7tw5zJypOMv5586cOSNbpiw7O1tuW1aWtFvx58uYKSORSPDHH38gPDwc+/fvh61tyUMplKHkjhBCCCGEEKJWmjihSo8ePdCjR4+v2pfP50NHRweRkZFo3LixrLxwtvqvGTu3ePFinD17Flu2bIGHx7cNx6ClEAghhBBCCCGkDHR1deHv74/z58/LlZ85cwZubm5fnExl8+bN2LlzJxYtWoSAgIAS9y0JtdwRQgghhBBC1EryAyxiPnLkSPTv3x9z5sxBmzZtcPfuXQQHB2PlypVy+1WvXh2dO3fGggULAACnTp3C8uXL0bFjRzg6OuLRo0eyfZ2cnJQulVAcSu4IIYQQQgghpIzq1KmDNWvWYNWqVTh8+DAcHBzw119/oU2bNnL7iUQiiD+ZYObmzZsAgJMnT+LkyZNy+y5cuBBdu3b96hgouSOEEEIIIYQQFWjRosUX19b7fG3rRYsWYdGiRSp5f0ruCCGEEEIIIWol1sAJVTQRTahCCCGEEEIIIVqAWu4IIYQQQgghasXUIuY/Gmq5I4QQQgghhBAtQMkdIYQQQgghhGgB6pZJCCGEEEIIUSsJTahSLqjljhBCCCGEEEK0ALXcEUIIIYQQQtRKIqEJVcoDtdwRQgghhBBCiBagljtCCCGEEEKIWtGYu/JBLXeEEEIIIYQQogUouSOEEEIIIYQQLUDdMgkhhBBCCCFqJRHThCrlgVruCCGEEEIIIUQLsCQSCY1uJIQQQgghhBANRy13hBBCCCGEEKIFKLkjhBBCCCGEEC1AyR0hhBBCCCGEaAFK7gghhBBCCCFEC1ByRwghhBBCCCFagJI7QgghhBBCCNEClNwRQgghhBBCiBag5I4QQgghhBBCtAAld4QQQgghhBCiBSi5I4QQQgghhBAtQMkdIYQQQgghhGgBSu4IIYQQQgghRAtQckcIIYQQQgghWoCSO0IIIYQQQgjRApTcEUIIIYQQQogW4DIdACEA8Pr1a2zcuBHh4eFITk6GjY0NfH19MXz4cFStWpXp8Mhn4uLiSrW/g4ODmiIhqvDkyRNkZ2cjICAAAJCZmYmlS5fi7du3aNCgAUaPHg02m+oCCSGEkO8dSyKRSJgOgvzY/vvvP4wZMwb29vYICgqClZUVUlNTERISgoSEBKxduxZNmzZlOkzyCQ8PD7BYrK/e//nz52qMhpRVnz59EBAQgDFjxgAApk6dipCQEDRs2BDXr1/Hr7/+itGjRzMcpXo8ePAAkZGRqF27NlxdXZkOp0yOHz+OwMBAWFhYKGzLyMjAf//9h86dO5d/YOSrhYaGonr16jAyMlLYlpubi2fPnqFu3boMREa+Vv/+/TF79my4ubkpbIuKisLs2bOxe/duBiIjPwpK7gjj2rZtC2dnZ6xbt06udUAsFmPUqFF4//49zpw5w2CEqnPz5k08fvxY1jrp5+eHBg0aMB1WqYWEhMj+nZeXh+XLl8PJyQmtWrWClZUVUlJScOHCBcTExGDSpEno0KEDg9GqTmZmJq5du4aEhATweDy5bSwWS2MTIH9/fyxZsgSBgYEoKChA/fr1MWvWLHTr1g379u3D7t27cf78eabDLLOJEydCV1cXCxcuBAAcOHAAc+fOBQDo6upi06ZNstZLTeTp6YmDBw/Cx8dHYduTJ0/Qo0cPrahoSUtLw/bt2xERESGrAKxatSp27doFX19f+Pn5MR3iN/tRruG1a9dk12/kyJFwcHBAaGgonJycYGdnx3R4ZeLh4YFDhw4pvYYRERH45Zdf8OzZMwYiIz8K6pZJGPfhwwdMmzZNodsXm81G7969Za0Jmiw5ORljx47Fo0ePYGZmJmudXL16Nfz8/LBmzRrY2NgwHeZXCwoKkv175syZaNCggeyBuVD//v0xffp03Lp1SyuSuxs3bmDcuHHIy8uDvr4+dHR05LZrcnJXUFAAAwMDAMDDhw/B5/PRokULAIC7uzsSEhKYDE9lHjx4gClTpsh+37x5M3r06IFp06Zhzpw5WLt2rUYndyXV1WZlZSltDdI0T58+xcCBA2FiYoK6devi3r174PP5AIDExETs3LkTq1atYjbIMijpGubn50NfX78co1G9tLQ0jBo1Co8fP0aFChUQHx+Pnj17wsHBAUeOHIGBgQFmz57NdJhqExYWBktLS6bDIFqOkjvCOHd3d3z48EHptg8fPmjFmLvZs2fjw4cP2LlzJ+rXry8rv337NiZPnow5c+Zg3bp1DEb47c6dO4d//vlH6bZ27drh999/V0j8NNHixYvh7e2NBQsWoGLFikyHo1KVKlXCtWvXUK9ePZw6dQpeXl4wNzcHAKSmpsLY2JjZAFUkLS0Ntra2AKTjfOPj49G/f38YGRmhS5cu+O233xiOsPSuXr2K69evy37fvn07rK2t5fbh8Xi4c+cOPD09yzs8lVu4cCH8/Pywfv16sFgsnDhxQrbN19cXZ8+eZTC6b/Po0SOEhYXJfj916hQePHggtw+Px8OlS5c0vuvw33//jfT0dAQHB8PZ2Rk1atSQbQsICMCGDRsYjO7bbdq0CZs2bQIgregbMGCAwtAFPp8PkUiE3r17MxEi+YFQckcY9+eff2LChAkwMDBAUFAQTExMkJ2djYsXL2LHjh1Yvnw50yGW2a1btzBnzhy5xA6Q3swmTZqEOXPmMBOYCnA4HDx79gwNGzZU2Pbs2TOtmYgjJiYG06ZN07rEDgAGDhyImTNn4vDhw8jMzMSSJUtk2+7duwd3d3cGo1Mdc3NzxMbGok6dOrh+/TpsbGxklUcikQhisZjhCEsvOjoaly9fBiB9qLx//z50dXXl9tHR0UHVqlUxYcIEJkJUqYiICKxZswY6OjoQiURy2ywtLZGamspQZN/uxo0bWLt2LQDpNdyzZ4/CPlwuF25ubhrfqnX16lXMnz8fbm5uCtevQoUKSExMZCiysqlZsyYGDx4MiUSCdevWoV27drC3t5fbR0dHB25ubmjWrBlDUZIfBSV3hHH9+/eHUCjEH3/8gT/++ANcLhdCoRCA9IY2cOBA2b4sFkuhRlMTmJqawszMrNhtJiYm5RyR6nTs2BGrV68Gj8dDUFAQLC0tkZaWhosXL2Lz5s3o2bMn0yGqRPXq1REfH890GGrRvXt3ODs7IyIiAtWrV5erhDA3N0f//v0ZjE51mjRpgmXLluHFixc4duwYOnXqJNv2+vVrODo6MhjdtxkwYAAGDBgAAGjevDnWr18PDw8PhqNSHwMDA+Tk5CjdFhcXJ2tx1iRjxoyRDT8oabyWNhCJRDA0NFS6LSsrS6G7u6aoV68e6tWrB4lEgoyMDAwbNkzjxw4SzUXJHWHc4MGDSzXzoiYaMGAANm/ejHr16smNe8nJycGWLVs0+uF56tSp4HK52Lp1q1zXUj09PfTp0wcTJ05kMDrVmTNnDiZPngw7OzsEBASAy9Wur8+6desqnYVv7NixDESjHlOnToVIJMKNGzcQGBgod24XL15E48aNGYyu7Apb8LRZo0aNsGHDBgQEBMDU1BSAtNKvoKAAu3fvRmBgIMMRls2LFy+YDkGtfHx8cOTIEaXX6fTp06hVqxYDUamOQCDAgQMH0LhxY0ruCGNotkxCysH8+fNx8eJF5OXlwd/fXzahyt27d2FkZISWLVvK7T9z5kyGIv12mZmZePXqlWwm0GrVqhXbWqkpatasKVfxIBAIIBQKwWazoaenJ7evprYqFxKJRHj8+DESEhJkE1R8iqbQ//5du3YNWVlZaN++PQAgPj4ef/zxh2y9wj///LPYVhNNkZiYiF69eiEnJwf+/v4ICQlB48aN8ebNG7BYLBw6dAhWVlZMh/nNtH3NybCwMPTv3x8+Pj5o3bo1Fi5ciBEjRuDt27e4evUq9u/fDy8vL6bDLJPmzZtjxowZskmpCClvlNwRxr169QrVqlUrdvulS5c0/kuyefPmX70vi8XCpUuX1BgN+Vpr1qwpVauyps7s+vTpU4wdOxbx8fFKZ+tjsVhaMf16oczMTNmEKk2aNIGZmRl4PB50dHQ0+sG5W7duaNu2LYYMGQIAGDlyJJ4+fYp27drh5MmT6NChA6ZNm8ZwlGWXlZWFnTt34tatW0hPT4eZmRkCAgIwaNAgjeyW+anevXujQYMGWr3mZFhYGJYvX46wsDCIRCKwWCz4+flhypQpqFmzJtPhldnWrVtx9epVbN26VaESkJDyQMkdYZy3tzfGjx8veyAplJubi7/++gvHjx/XqgdLbaSt67/9KHr06AEej4eZM2eiSpUqSse9aPK40EISiQQrV67Enj17kJ+fDxaLhcOHD8PLywtDhw6Fr6+vxibogLRr7apVq9CwYUPk5OSgfv36WLZsGX766SccPXoUa9eu1eiumzweD0uXLkXHjh21dkzaj7LmJCBdgiUzMxOmpqaypVi0wfz583H+/HmIRCLUq1cP1tbWCpWEmtg7h2gO7Ro0QjTS2LFjsWrVKvz3339YtGgRKlasiLt372L69OkoKCjAmjVrmA5R7XJzczV2DSptXv/tU/3798fs2bPh5uamsC0qKgqzZ8/G7t27GYis7N68eYNVq1ahXr16TIeiVqtWrcLevXsxdepUBAQEoHXr1rJtzZs3x//+9z+NTu4KuwwDQGhoKADIxhFWqlQJKSkpjMWmCnp6ejhy5AhatWrFdChq86OsOQkA+vr6Gr9unzJXrlyRzVgbERGhsJ3FYlFyR9SKkjvCuGHDhqFJkyaYPHkyOnbsiCZNmuD8+fNo3rw55s2bpxULfvbp0weLFy9WOhtfYSKrqTXq2rz+26fu3buH3NxcpdtycnJw//79co5IdVxcXIo9N21y7NgxTJgwAT179lSYht3JyQkxMTEMRaYarq6uOHnyJHx9fXHw4EHUrFlTVmmUnJys8V0WAek42EePHmltRYS2rzk5ffr0Yrex2WyYmJjA09MTrVq10tjWPE29lxPtQckd+S54eHhg3rx5GDBgAM6ePYvq1atj2bJlWlOrl52djY4dO2L69Ono0aMHAOmCpsuXL8fu3bs1ekyhNq//9rXCwsI0uhJi+vTp+Pvvv+Hu7q60ZVJbZGRkFHt+IpFItgSLpho1ahR+++03HD9+HBwOBxs3bpRtu379OqpXr85gdKoxbtw4TJo0CRwOB4GBgbCyslLo8qbJSay2rzn5/PlzJCUlIS0tDWZmZrLJxTIzM2FpaQkDAwPs3r0bq1atwq5du+Dk5MR0yIRoHEruCOMkEgk2btyI9evXo2bNmmjXrh1WrFiBzp07Y/HixfD19WU6xDI7cuQIVq1ahdmzZ+PSpUvo3bs3Fi1ahKSkJCxYsABdunRhOsRvps3rv23atAmbNm0CIO1KM2DAAIUHST6fD5FIhN69ezMRokrMnz8fycnJ6NChA2xtbRXG17FYLJw8eZKh6FTHxcUFN2/elM1E+Kl79+7JFjTXVC1atMDZs2fx7NkzuLu7w8XFRbbNz89P4xMDALJ1M5cuXYply5Yp3UeTx2hr+5qTU6ZMwZw5c7BmzRrUrl1bVn7//n388ccfmDFjBpydnTF8+HAsXbpUY4dlJCYmYufOnXj48CEyMjJgbm6O2rVrY8CAAbREAlE7mlCFMO6XX37Bixcv8Pvvv8sWLE9MTMSMGTNw584dDBkyBL///juzQapIaGgohgwZAoFAAHd3d2zcuBH29vZMh1Umr169wuTJkzFp0iStW//t3r17uHfvHiQSCdatW4fu3bsrXC8dHR24ubmhWbNm4HA4DEVaNtOmTfvirKALFy4sp2jU5+jRo5g1axaGDh2Kn376CZ07d8a6deuQkJCAJUuWYOHChWjbti3TYZISHD169IufVU2uLNN2nTp1wpAhQ9CxY0eFbcePH8fWrVsRHByMI0eOYPHixbh37x4DUZbNq1ev0LdvXwgEAjRs2FDWOnnr1i3o6Ohg7969Gl+RRL5vlNwRxnXr1g1LlixR2l3qwIEDWLp0KR4+fMhAZKoVHR2NKVOm4OXLl/D09ERERASGDh2KMWPGaHRCVLNmTQiFQq1d/63Q2rVr0aNHD6p11XA7duzAmjVrkJ+fL1v2wcDAAOPGjcOgQYMYjq5sjh8//sV9aL3C71vhRDglqVu3bjlEoh4+Pj5YvXo1mjZtqrDtypUr+O233xAeHi6rCA0PDy//IMtoyJAhyMjIwPbt2+XWes3MzMTgwYNhYWGBrVu3Mhgh0XaU3BHGiUSiEls8YmJiUKlSpXKMSPX27duHpUuXws3NTZbIHjhwAEuWLEHlypWxePFija3J+5q14DR5BsIfTUFBAbKysmBqaqo1Y14/l5ubi7CwMNkaaTVr1tSKpR48PDyUln/696nJXRZ/BB4eHmCxWHLrTX7+/arJ17Bz584wMTHB5s2b5SZMycvLw7Bhw5CXl4ejR4/i9OnTWL58uUZOTlKzZk0sXboUQUFBCttCQkIwefJkhIWFMRAZ+VFobnMB0RolJXZCoVA2pbAmW7hwIYYPH45Ro0bJzrdXr15o2LAhpk6dim7dumlkDSUgXcriR1DSWJdPZ3nr1q2bRrbuXblyBWvXrsXz588hkUjAYrHg6emJcePGITAwkOnwVMrIyAiNGjViOgyVU9bqk5mZiRs3bmDfvn3FjlHTJM2bN/9iZdKlS5fKKRrVU9b6WngNL1y4gLlz55Z/UCo0c+ZMDB06FIGBgfD394eFhQXS09Nx584dCIVCWYvWy5cv5ZYq0SQcDgd8Pl/pNj6fr7Hd94nmoJY7wghfX1/s3bsX3t7eAKSTqgwZMgSzZ8+Gs7OzbL/Hjx+jZ8+eGl1TCQBPnjxBjRo1lG6TSCTYsmULhg0bVs5RqZ9QKERqaqpGJjufGz16NJ4+fYrk5GS4u7vLxlG8fPkSNjY2cHJywvPnzyEWi7F79254eXkxHfJXCwkJwdixY+Hr64u2bdvC2toaycnJOHfuHB4/fozVq1crrYXWBBcuXED9+vVhamqKCxcufHF/bV1DbdeuXbh+/brGdwf7+++/FZK7rKws2disli1bljjdviZbt24d3rx5g5UrVzIdSpkkJydjx44dePLkCZKTk2FjYwNvb28MHDgQNjY2TIdXZuPGjcOLFy+wadMmVK5cWVYeHR2N4cOHw93dHatXr2YwQqLtKLkjjPDw8MChQ4fg4+MDQNo108vLC0eOHJF7KNaW5E7b/GjJOQCcOnUKmzdvxsaNG+WWffjw4QNGjhyJwYMHo3nz5hg0aBAsLCywbds2BqMtnc6dO6NKlSpKW3YmTZqEN2/efNV4ru/Rp981xXVbLMRisbTis6rMrVu3MHr0aK3tDsbn8zF69Gg0adIE/fr1Yzoctbh9+zZGjx6tFWPQtVlcXBz69u2LhIQEVK1aFdbW1khNTcWrV69QoUIF7N27FxUqVGA6TKLF2EwHQIi2mjNnDmJjY+XKTp06haysLLmyt2/fYvDgweUZWpnxeDy5MSFisRi3bt1CTk4Og1Gp19q1azF27FiF9fwcHR0xevRorF+/HmZmZhg8eDAePXrETJDfKDIystiJNjp16oTIyMjyDUiFLl26JEvqLl26VOJPSEgIw9GqR35+Pg4dOgRbW1umQ1EbXV1d9O3bV6MqVUorJCREo9fw+1E4ODjg1KlTmDZtGlxcXCAWi+Hi4oLp06fj5MmTlNgRtaMxd4SoycGDB9G1a1dZMiASiTBlyhQcPnxYrnUyJycHt2/fZipM8pXi4+OLHevDYrGQmJgIALC1tYVIJCrP0MrMzMwMUVFRSsehRUVFyc34pmk+TcZZLBZsbGygo6OjsJ9QKERSUlJ5hqZyHTp0UCgTCARITExEQUEBFi9ezEBU5Sc9PR25ublMh1EmI0aMUCgTCASIiopCfHw8Jk+ezEBUqhUaGoqDBw8iOjoaPB5PYfupU6cYiKpsxowZg8mTJ8PZ2RnHjx9HYGAg+vfvr/HrEhLNRMkdIWqirMcz9YLWXN7e3li9ejVq1KghV/MaGxuLNWvWyLoYx8bGatwYw7Zt22LFihXQ19dH69atYWpqiuzsbJw7dw6rVq3Czz//zHSIKtGiRQscPHhQdq0+9eLFC/To0UOju2V6eXkpVEDo6urC3t4erVq1UrrcjKZRNm5SIBDg7du32Ldvn9yi35pIWXKqp6eHBg0aoHXr1mjcuDEDUanO9evXMXz4cAQEBODJkydo0qQJCgoK8PDhQ9jb22vsMg+XL1/G0KFD4ezsjOnTp+PgwYOwsLBgOizyg6LkjjAmODhYtv6ZWCwGi8XCqVOn5BYtjYuLYyo8QuTMnTsXgwYNQsuWLVGtWjXZLG8vX76ElZUV/vnnHwBASkqKxiVDEydORFxcHGbNmoU///wTXC4XQqEQEokErVq1woQJE5gOUSVKqlzh8/kaPzPvokWLmA5B7caNG6e0nMvlolWrVpg5c2Y5R6Rae/bsYToEtVqzZg0GDBiASZMmwcvLC7/99hu8vLwQGxuLIUOGaGxybmdnh8uXL8PKygoSiQTJycklPr84ODiUY3TkR0PJHWHM7t27Fcp27typUPalaa8JM3605LxKlSoICQnB4cOHZbO8ubu7o3v37ujWrZts8fahQ4cyHGnp6erqYs2aNXj58iXu37+PrKwsmJmZoXbt2nB3d2c6vDJ5+/Yt3r59K/v97t27SEhIkNuHx+Ph9OnTGr+e5o9A2TIHenp6sLKyonuFBnj79i1+//13sNlssFgs5OfnA5B2nx47dizWrFmDTp06MRxl6Q0YMACLFy/G5s2bwWKxil3btXCZGU3uIUC+f5TcEUa8ePGC6RDKRU5ODjIyMgBANg7r0zIAyM7OZiCysvsRk3M9PT306dOH6TDUxt3dXeOTuc+dPXsWa9euBSD9LC5fvlzpfqampli4cGF5hqYSI0aMkE3coGy81qdYLBbMzc3h7e2N7t27a2RL5ecTGmmDv/76C4MHD4aDgwP++uuvL+5feA01cf1JPT09WWWgjY0N3r9/jzp16gCQrj/5ecWLphg4cCCaNWuGyMhIjBw5EpMmTYKLiwvTYZEfFCV3hKjRkCFDFMoGDhwo93thTZ4m+VGS8+KkpqYqnQhAk7raPH36FG5ubtDX18fTp0+/uL8mrdv3qQEDBqBLly6QSCQICgrC2rVr4enpKbePjo4ObGxsNO7vEJCO0SqsOPqayUQSExNx6tQphIeHa2Q3TmULtRdisVgwMTFB5cqVNSpxvXz5Mrp37w4HBwdcvnz5i/vn5uYiKysLAwcOxNSpU8shQtXx8PBAVFQUGjZsiICAAGzcuBEWFhbgcrlYtWoVqlWrxnSI3+TSpUuoV68enJ2d0aVLF7Ru3Zp6AhDG0Dp35LuRk5ODhIQEpQ/NmvhgeezYsVLt36VLFzVFoj48HlU065sAACmASURBVA/79+9Hw4YNNfam/LXS09Px119/4cKFCxAKhXLbNLGrzefrvxWX2GjiuRUnNjYWNjY2GvXgrw6nTp3CX3/9hbt37zIdSql9/llVVjmmr6+PX375BVOmTAGbrZ0rPu3evRsbN27ErVu3mA6lVK5evYoPHz6gT58+SExMxIgRI2TfLfb29li7di1q1KjBcJSl5+npKZus6dN/E8IEarkjjEtMTMQff/yh9CalyQ+WhcmaRCJBZmYmDA0Nte6hUk9PDytXrtTI5Lu0Zs6cidDQUAwfPhxubm5Kp9PXJLt375bNnrhr1y6NbLX6GhkZGTA1NQWbzYaRkRHy8vKQl5dX7P4/wjpiAQEBGDVqFNNhfJMdO3ZgxowZaNCgAVq0aAErKyukpqbi4sWLuHPnDiZPnoyXL19i27ZtMDQ0LHYCFk0UHR2N4OBgjBkzBi1atFBYR1UTfNqV1M7ODkePHsW7d+9QUFAAV1dXjb1HmpiYIC0tDQDNik2YRy13hHEDBw5EdHQ0hg4dChcXF6UPzfXq1WMgMtXg8/nw8/PD+vXr0bRpU6bDUbmePXuiY8eO6N27N9OhqFWdOnUwc+bMYhf7Jt+nT2vRS2qhLKRpFUmF4wm/VnETPWiK8ePHw8nJSekMritWrEBkZCTWrl2LlStXIjg4WOkELJokOTkZp0+fxqlTp/D06VPo6OggIiKC6bDIZ0aPHo3Q0FC4u7sjNDQU1atXh7GxsdJ9WSwWdu3aVc4Rkh8JtdwRxj1+/BhLly5FUFAQ06GoReE6U5q2sPXX+uOPPzB58mRYWloiMDAQBgYGTIekFqamplq7blFJ3YiePHmi0eu/LViwQDb2ZcGCBVrXQvn5Q6JAIEBBQQEAact6YTd3fX196Orqanxyd/XqVaxbt07pNn9/f9lSAv7+/ti2bVt5hqYyOTk5uHDhgmz2YbFYDHd3d8yYMQPt27dnOrwy+ZrKCE38jC5YsADbt29HVFQUWCwWjIyMYGJiwnRY5AdFyR1hnLOzs8IYJm3Tu3dv7Ny5E40aNZJNma8tBgwYAIFAgN9//x2A9CHy0wdoFoslWzJBkw0ZMgR79uxBw4YNweVq11dnSR04RCIROBxOOUajWp+OZe3atSuDkajHpxOMREREYPz48Rg1ahRat24NY2Nj5OTk4Ny5c9iwYQNWrlzJYKSqYWRkhLt376JBgwYK2+7evQsjIyMA0iS38N+aQCAQ4OrVqzh58iSuXr0KHo+HSpUqoV+/fti1axdmzJihsQt8f0pZi1VeXh5EIpFGV0CYmZnJ7oEeHh6YPHkyjbkjjNGuJxSikaZOnYpFixbB3d0dlStXZjoctYiPj0dUVBSaNm2KevXqwdraWqEFQVMX3x08eLDWtYYoExkZibdv36Jly5aoW7cuTE1NFfbRpGuYnJyMpKQk2e+RkZEKSRyPx8ORI0c0ahbQkrRo0QLr1q2Dh4eHwrZXr15h5MiRGt2Nb/78+RgyZAi6desmKzM2Nkb37t3B4/Ewb948HD58mMEIy65nz55Yt24d0tLS0KxZM1haWiItLQ2XLl3C0aNHZYnBw4cPlV7n79HMmTNx8eJFZGVlwcrKCj169ECHDh3g6+uL7OxspUvMaCpls50KhULcvn0bS5cuxZIlSxiIquy2bNmCzp07w8bGRjab9MOHD+Hp6SnXmyUmJgabN2/G/PnzmQqV/AAouSOMCwgIQIMGDdCuXTvY2toqdGVgsVg4efIkQ9GpxpUrV2QDxZWNl2CxWBqVGHxq7NixTIdQLq5cuSJLYu/fv6+wXdOu4cGDB7F27VqwWCywWCxMnz5dYR+JRAIOh4PZs2czEKHqxcbGgs/nK91WUFCgsWtsFXrx4gUcHR2VbqtUqRJev35dzhGp3pgxY2BqaootW7bgf//7H1gsFiQSCaytrfHHH3+gX79+AICOHTvil19+YTjar3P48GGwWCw0aNAA8+bN08q1/ErC5XLRuHFjJCYmYs6cOfj333+ZDqnUVqxYAX9/f9jY2ACQ9njo06cPDh8+LDfhWFpaGg4fPkzJHVErSu4I45YuXYodO3bAy8sLLi4uGjtbVkm+Zu0i8n3TtmvYpUsX1KtXDxKJBAMGDMCff/6JKlWqyO2jo6MDFxcXjR5ryOPxkJ+fL+t6mpOTg4yMDIV9QkJCYGtry0CEqlOxYkX8+++/aNy4scJyAfv379f4FtjCmYd79uyJvn37IiEhAcnJybCxsYG9vb3csgeFM8FqgmnTpuHUqVO4efMmWrZsiTp16qBDhw5o3br1D9EropC9vb3GrqGqrGs7zVdImELJHWHcoUOHMG7cOI2dmpsA7969w9GjRxEdHa10ncKNGzcyEBUpScWKFWUtBLt374aXl5dGjVH6Wlu2bJFNwMFisTBkyJBi99XEsT6fmjhxIn777Te0atUKzZo1ky0TcOXKFcTFxeGff/5hOsQyEQgEaNCggWzmYQcHB41PWAHpjNGFs0afOnUKwcHBmDVrFubNm4d69eqBxWJBLBYzHaZaxcTEYMuWLbTwNyEqQMkdYZyOjg58fX2ZDkPt0tLSsH37dkRERCAhIQFr165F1apVsWvXLvj6+sLPz4/pEL9JeHg4+vXrBwcHB0RHR8Pd3R3Z2dmIjY2Fvb09nJycmA5RZbT1GpqamuL+/ftya1AVunr1Kuzs7DRm/NLngoKCULFiRUgkEvzxxx8YOXKkwmdSR0cHbm5u8PT0ZChK1QgKCsLhw4exefNmXLp0Sdaq5ePjg9WrV2v8+Wn7zMMuLi4YO3Ysxo4di/DwcAQHB+PMmTOQSCQYOXIkWrdujc6dO8Pf35/pUL9ZzZo1FVojhUIhBAIB9PX1S720ByFEESV3hHE9evTAyZMn0bBhQ6ZDUZunT59i4MCBMDExQd26dXHv3j3Z2J/ExETs3LkTq1atYjbIb7R06VK0adMGf//9N7y8vGT/ffjwISZOnIihQ4cyHaJKaPM1XLBgAWrVqqU0uQsPD8fDhw+xY8cOBiIrOw8PD1liymKxEBgYCEtLS4ajUh9PT89iZ8WMiYnR+JYRbZ55+FM+Pj7w8fHB9OnTcefOHZw8eRIhISE4fvy4xi5LAiifgKswaW/SpAnMzc2ZCUxNfqRuteT7QckdYZyxsTHu3buHnj17IiAgQGEWQhaLhYEDBzITnIosXLhQtpA5i8XCiRMnZNt8fX1x9uxZBqMrm5cvX2LYsGGy8S6F3TJr1aqFMWPGYPny5WjcuDGTIaqENl/DFy9e4Ndff1W6zc/PD3v37i3niNTj02URfhRpaWk4e/YsTp06hcePH2t0YgBo98zDyrBYLAQEBCAgIABz587Ff//9x3RIZaLNE3ANGDBA4bPYp08fhfGvhKgbJXeEccuXLwcgvWk/evRIYbs2JHcRERFYs2YNdHR0FLoUWVpaIjU1laHIyo7FYkFHRwcsFgtWVlaIi4tDrVq1AEgHyEdHRzMboIpo8zXk8/kQCATFblM2jlITFRQUYP369Th//jwSEhKUzpyp6ckPAOTn5+PixYsIDg7GrVu3IBQKUb16daUzomoabZ55+HOpqakKf3s1atRgKBpSEk0fr0u0CyV3hHGaOjtWaRgYGCAnJ0fptri4OI3uiuLm5oaYmBjUr18ffn5+2L59O6pVqwYul4vNmzdrfDewQtp8DT09PXHixAm0aNFCYduJEyc0drzd5+bOnYvg4GC0b98ebm5u0NHRYToklRGJRLh+/TpOnTqFy5cvo6CgANbW1hCJRFixYgXatm3LdIgqoW2z1n4uPT0df/31Fy5cuAChUCi3TSKRgMViaXQFRPPmzYvtqshms2FiYgIPDw/06dNHbgmB7x0ld+R7QskdIeWgUaNG2LBhg1y3UxaLhYKCAuzevVvpWCdN8fPPPyMuLg4AMGHCBAwePBidOnUCIE2IVq9ezWR4KqPN13D48OEYOXIkhg0bhq5du8LW1hZJSUk4evQobty4gfXr1zMdokpcuXIFU6dORd++fZkORWUePHiA4OBgnDt3Dunp6TA3N0fHjh3RoUMHVK1aVW7tLfL9mzlzJkJDQzF8+HCtq4AAgBYtWiAkJAQ5OTkICAiQLUJ/+/ZtGBsbw93dHffv38fJkyexefNmNGjQgOmQCdE4LAl1ACbfCR6Ph5iYGKVdwDSpBk+ZxMRE9OrVCzk5OfD390dISAgaN26MN2/egMVi4dChQ7CysmI6TJXIzc3Fo0ePUFBQAD8/P605L22/hmfOnMGSJUuQkJAgWxja3t4eU6ZM0ZpWn4YNG2Lx4sVo1KgR06GojIeHB1gsFvz9/TFo0CA0bNgQXK603jY7Oxt169bFnj17ULduXYYjVR1tnbUWAOrUqYOZM2eic+fOTIeiFjt37sTFixexZcsWGBoayspzc3MxbNgwNG3aFAMHDsSwYcOQn5+vkQuaE8I0arkjjOPz+ZgzZw5OnjxZ7BTXmtwNBQDs7Oxw/Phx7Ny5E7du3YKTkxMyMjLQoUMHDBo0SKO79H3OyMhIK2c+Leka/vLLL7h16xY6dOjAdJjfrG3btmjbti0iIyORkZEBc3NzuLq6Mh2WSvXq1QsnTpzQquSuWrVqePXqFUJDQ8HhcJCeno6goCAYGxszHZpaaPOstYB0WRILCwumw1CbXbt24c8//5RL7ADpfWPIkCGYM2cOhg4dil69emHq1KkMRUmIZqPkjjBu3bp1uHnzJhYtWoRJkybJvvhPnjyJ9+/fY9asWUyHqBKmpqYYN24cxo0bx3QoKqfNNemfKu4anj9/HlOmTNHo5K6QtiV0n9LX18eDBw+0ambekydP4s2bNzh58iROnz6NadOmQV9fH4GBgWjWrJnWTcWuzbPWAsCQIUOwZ88euRZYbZKenl7s2OXs7GxkZWUBAMzMzMozLEK0ivZ9cxCNc+7cOYwZMwZt2rTBpEmT4OPjgxo1aqBz586YOnUqLl++rNHjmbSdttek/yjEYjHu3LmDqKgohVkkNTHpUWbZsmUApBPgaNPMvFWqVMGECRMwYcIE2Ri88+fP4/z582CxWNi9ezcAaEXXTG2etRYAIiMj8fbtW7Rs2RJ169ZVqIAANHupB39/fyxfvhwVK1aUzaoMAPfv38eKFStQv359AEBUVBQqVqzIVJiEaDRK7gjjEhISULlyZXA4HOjp6clq7gCgY8eOmDBhAubOnctghGWnrTOEAdpfk/4jSE5ORr9+/RAdHS0bbwfIL8CriUnP536EmXlr166N2rVrY+bMmbhx4waCg4Nx6dIlhISEwMHBAZcuXWI6xDLR5llrAemkP4V/d/fv31fYrulLPcybNw8jR45Enz59ZF1Q09PTkZWVBU9PT9m9ns1mF7v2JiGkZJTcEcbZ2NjIEjpHR0fcvXtXNkOWtqyRps0zhGl7TfqPYNGiRTA3N8fVq1cRGBiIQ4cOwdraGidPnsTx48exefNmpkP8Zlu2bEHnzp3lZox8+PAhPD09YWBgICuLiYnB5s2bMX/+fCbCVDkOh4PAwEAEBgaioKAAISEhCA4OZjqsMtPmWWsB7V/qwc7ODkePHsXVq1cRERGB5ORk2NjYwNvbW+7a/fzzzwxGSYhmo+SOMK5evXq4f/8+mjdvjh49emDJkiWIjIyEjo4OQkJC0L59e6ZDLLOKFSvCwcGh2BnCXF1dMW/ePAwbNgyrV6/WqORO22vSfwShoaGYOXOmXALk4OCAESNGQCKRYN68edi6dSuDEX67FStWyC0HIBKJ0KdPHxw+fFiulTwtLQ2HDx/WmuSuUH5+PpKSktCuXTut+C6dPHkyevXqhdatW8Pf3x8sFgurVq2SzVo7fvx4pkMkX6Gw4oEQonqU3BHG/f7770hPTwdQ1PXr3Llz4PF46NevH0aPHs1gdKqhbTOE5efny1o9tLkmvWbNml81IUVxs7xqiuzsbFhaWoLNZsPY2FiutdXPz0+jW+6UrfajrSsAbdu2Dfn5+bIFle/fv4+RI0ciJycHjo6O2L59OypVqsRwlGXzI8w8XDhW+eHDh7KZa2vXro0BAwbAzs6O6fBUIjExEYmJiUqXPtKGsaGEMImSO8I4GxsbuRaDgQMHasX4nk9p2wxhbdu2xaxZs9C8eXOtrkkfPHiw1s02qIyjoyOSkpIASCfnOHHiBJo1awYACAkJ0YoH5h/B//73PwwZMkT2+8KFC1GlShUMGzYMGzZswLJly/DPP/8wGKFqaPPMw69evULfvn0hEAjQsGFDeHh4IDU1Ff/++y+OHDmCvXv3omrVqkyH+c1iYmIwefJkPH78GIBiRQuLxdL4pY8IYRold+S7kZmZidevXyM+Ph5NmjSBmZkZeDwedHR0wGazmQ6vTLRthjBvb2+MGjUKLVu2xKxZs7S2Jn3s2LFMh1AumjZtips3b6Jt27YYOXIkRo8ejYCAAHC5XKSkpGDSpElMh0i+QkJCApydnQFIW0aePn2KvXv3ok6dOhCJRJgzZw6zAarAxIkT0bFjR61dKmDx4sWoVKkStm/fLlfZl5mZicGDB2Px4sUa20UakM70mZiYiAULFsDNzQ26urpMh0SI1tG+b0aiccRiMVatWoU9e/YgPz8fLBYLhw8fhpmZGcaMGQNfX19ZNyNNpW0zhK1evRrXrl3DX3/9hTZt2mD8+PEYO3asVtak/wgmTpwo+3dgYCAOHDiAixcvgsfjoUGDBhrdtbY42tgiq6enJ+shcPv2bRgaGqJmzZoAABMTE2RnZzMZnkpERUVh+PDhMDMzQ+vWrdGhQwet6sb38OFDLF26VKEXh5mZGUaOHInJkyczFJlqhIeHY/HixWjVqhXToRCitSi5I4z7559/sHfvXkydOhUBAQFo3bq1bFvz5s3xv//9T+OTO22cIaxJkyYIDg7Ghg0bsHTpUpw4cQKDBw9WWptON3LN4u3tDW9vb6bDUJkBAwYoJHN9+vSRK9OGcXg+Pj7YvHkz2Gw2tm3bhiZNmoDD4QAA3r9/rxXjtY4ePYro6GgEBwfj7NmzOHToEGxtbdG2bVu0b98eNWrUYDrEMuFwOArrTBbi8/my66mp7OzsNL4nDiHfO5ZEG+5oRKM1adIEw4YNQ9++fSESieDl5YUjR47Ay8sLN2/exPjx4xEaGsp0mKQEGzZsKHYsD42h+P7FxsYiJycH7u7uAKQPkdu2bcPbt2/RoEEDdO3aleEIv93atWtLtb8mVyS9fv0aI0aMQGxsLBwcHLBjxw5ZN83BgwfDxsYGixcvZjhK1Xrx4gVOnz6NM2fOIC4uDk5OTjh//jzTYX2zcePG4cWLF9i0aRMqV64sK4+Ojsbw4cPh7u6O1atXMxhh2Zw/fx7bt2/Hpk2bNLrLPiHfM2q5I4zLyMiAm5ub0m0ikQhCobCcI1Kv/Px8pTOEaeKN7sOHD5g3bx6uX7+Orl27YtiwYdDR0WE6LFJKs2bNgoeHB6ZMmQIAWLp0KQ4cOIBq1arh3LlzyM/PR58+fRiO8ttocrJWWlWrVsWlS5eQnp4OCwsLuW1Tp06Vm7hKW3h4eKBChQpwdHTEunXr8P79e6ZDKpNp06ahb9++aNeuHapWrQpra2ukpqbi1atXqFChAqZPn850iGVy7NgxJCQkoHnz5vD09ISJiYncdhaLhQ0bNjAUHSHagZI7wjgXFxfcvHkTAQEBCtvu3bun0TODFZJIJFi/fj0OHjyI5ORkpftoUuuWUCjE1q1bsXHjRlSoUAG7d+/WqnEvP5rnz5+jb9++AKTX9vjx45g0aRIGDhyIjRs34t9//9XY5O5HMn36dIwaNUrpcgfGxsZYunQpFi5cyEBkqpeXl4eQkBCcPn0at27dAovFQqNGjTR+LT8HBwecOnUKR44cwYMHD5CVlQUXFxd069YNXbt2hZGREdMhlklubi6cnJzkfieEqBYld4QRx48fR2BgICwsLDBw4EDMmjULXC4XP/30EwDprG+PHj3Cnj17tOJhZOfOndi5cyd+/fVXrFy5EiNHjgSHw8Hp06chEAgwYsQIpkMslY4dO+LDhw8YNmwYhg8fTq11Gi43N1dWg/748WPk5OSgbdu2AIDatWtj48aNTIZHvtKxY8fQq1cvpcldeno6jh8/rvHfpxcuXMDp06dx9epV8Pl8+Pv7Y/bs2WjVqpVsnU1NZ2RkhP79+6N///5Mh6Jye/bsYToEQrQeJXeEEdOnT8fBgwdhYWGBrl27IjMzE2vWrMGmTZsAAKNHj4aBgQHGjx8ve8jUZIcPH8bYsWPRp08frFy5EkFBQfDy8sKoUaMwcuRIjetKZG1tjXXr1smNCSGay97eHo8ePULdunVx8eJFVKlSBba2tgCkU7Dr6+szHCEpq3fv3mlk1+/PjRs3Dn5+fpg4cSLatGkDa2trpkMihJDvCiV3hBGfz+MzaNAg/Pzzz3j48CEyMjJgZmaGmjVrKvTH11SxsbHw9PQEh8MBl8uVLVrOZrPRu3dvzJgxAxMmTGA4yq+3e/dupkMgKtS9e3f8888/OHfuHJ4/fy43rufx48fFjoklzNu/fz8OHDgAQDpeadKkSdDT05Pbh8/nIzY2Vm4mYk116dIljVgLtDSaN2/+1UtzsFgshISEqDki9RKLxbhz5w6ioqKUzgw6aNAgBqIiRHtQcke+G0ZGRmjcuDHTYaiFubk58vLyAEjHVDx79kw2xjA9PR0FBQVMhkd+cMOGDYOtrS0iIiLQu3dvudkxMzMz0aNHDwajIyWxtbWVTf//+vVrVK5cGZaWlnL76OjowNXVFd27d2ciRJXStsQOAFq0aPHF5O7ly5e4e/euxq/PmJycjH79+iE6OhosFktW0fvpeVFyR0jZUHJHGBMcHIwHDx58cT8Wi4WBAweqPyA1qlWrFiIiIhAYGIj27dtj7dq1SElJAZfLxaFDh5ROJkNIeercuTM6d+6sUD5v3rzyD4Z8taCgIAQFBcl+L25CFW1RUFCA9evX4/z580hISFDa8qNJk1MBwIwZM4rd9vz5c6xbtw737t2Dk5MThg0bVo6Rqd6iRYtgbm6Oq1evIjAwEIcOHYK1tTVOnjyJ48ePY/PmzUyHSIjGo3XuCCM8PDy+el9tWCctMjISiYmJCAgIAJ/Px5IlS3D+/HnweDw0aNAAs2bNgpWVFdNhkh9cYmIiEhMTlS7VQbOhku/B9OnTERwcjPbt28PNzU3pZE4DBgxgIDLVioiIwLp163D16lW4uLhgxIgR6NChg8YvAN6kSRPMnDkTQUFBqF69Og4dOgQfHx8A0vVSHzx4gK1btzIcJSGajVruCGM+/VLXdq6urnB1dQUA6OrqYubMmZg5cybDUREiFRMTg8mTJ+Px48cAFMfEakMFy4/ixo0bslatz5N0FouFXbt2MRSZaly5cgVTp06VLd2hbR49eoS1a9fi5s2bqFKlCpYvX442bdpofHfMQtnZ2bC0tASbzYaxsTFSU1Nl2/z8/KjljhAVoOSOEEJ+cDNnzkRiYiIWLFgANzc36OrqMh0S+QZbt27FsmXLULFiRbi5uWnNhFSf4nA4cHFxYToMlQsNDcX69etx+/ZtVK9eHatXr0bLli2ZDkvlHB0dkZSUBACoUqUKTpw4gWbNmgEAQkJCtGJGV0KYRskdIeVALBbjf//7X7E16oB0FjhCmBAeHo7FixejVatWTIdCymD//v3o27evVvcK6NWrF06cOIFGjRoxHYrK9OvXD/fv34ePjw82bdqEwMBApkNSm6ZNm+LmzZto27YtRo4cidGjRyMgIABcLhcpKSmYNGkS0yESovEouSOkHCxduhQ7duxA3bp14e/vT4t+k++KnZ2dxo/lIUBGRgZatGjBdBhqpa+vjwcPHqBnz54ICAhQWLhcEyfgCg0NBQC8evUKv//+e4n7slisr5qI7Hs1ceJE2b8DAwNx4MABhISEoKCgQLZcECGkbGhCFULKQaNGjdCrVy+MHj2a6VAIUXD+/Hls374dmzZtom5RGmzixImoXLkyxowZw3QoavOlybg0cXzo2rVrS7W/tl7f8+fPY/z48Rp3/Qj53lDLHSHlgM/no1atWkyHQYhSx44dQ0JCApo3bw5PT0+FsVosFgsbNmxgKDrytbp164Y5c+bIZuH9vFULALy8vBiITHVevHjBdAgqp63JGiGEGZTcEVIOOnTogMuXL9N6duS7lJubCycnJ7nfieYZPHgwAGDLli3YsmWL3AyLEolEI1u1AOn5dO7cGTY2NrKyhw8fwtPTEwYGBrKymJgYbN68GfPnz2ciTLXJz89HUlISnJyctGbWTEKI+lByR0g58PX1xapVq5CamlpsjTpNZkGYsmfPHqZDICqwe/dupkNQixUrVsDf31+W3IlEIvTp0weHDx+Wa4lMS0vD4cOHNTq527ZtG/Lz82Wteffv38fIkSORk5MDR0dHbNu2Ta4ihhBCPkfJHSHlYMqUKQCAuLg4nDlzRmG7ptaoE0K+H/Xq1WM6BLVQNjWAtk4X8L///Q9DhgyR/b5w4UJUqVIFw4YNw4YNG7BixQqsWrWKuQAJId89Su4IKQe0zAH53onFYty5cwdRUVHg8/kK2wcNGsRAVIT8WBISEuDs7AwASExMxNOnT7F3717UqVMHIpEIc+bMYTbAb1CzZs2v6k4qEonKIRpCtB8ld4SUg4oVKzIdAiHFSk5ORr9+/RAdHQ0WiyVrFfn0gYySu+9TrVq1sHv3btSoUeOrHqIfPnxYTpGRb6Gnp4ecnBwAwO3bt2FoaIiaNWsCAExMTJCdnc1keN9k8ODBNFaQkHJEyR0h5Sw/P1/pIuY0BT1hyqJFi2Bubo6rV68iMDAQhw4dgrW1NU6ePInjx49j8+bNTIdIijF48GDZWLQf7SFaG8/Vx8cHmzdvBpvNxrZt29CkSRPZ2m/v37+HnZ0dwxGW3tixY5kOgZAfCq1zR0g5kEgkWL9+PQ4ePIjk5GSl+9CYO8KUJk2aYObMmQgKCkL16tVx6NAh+Pj4AAA2bNiABw8eYOvWrQxHSX5UHh4eMDAwkEvm8vLyFMokEgkKCgo0+rv09evXGDFiBGJjY+Hg4IAdO3bIumkWJvKLFy9mOEpCyPeMWu4IKQc7d+7Ezp078euvv2LlypUYOXIkOBwOTp8+DYFAgBEjRjAdIvmBZWdnw9LSEmw2G8bGxkhNTZVt8/Pzo5Y7DSORSBAVFYXMzEyYmZmhcuXKGt3K9SOtA1e1alVcunQJ6enpsLCwkNs2depUueUgCCFEGUruCCkHhw8fxtixY9GnTx+sXLkSQUFB8PLywqhRozBy5Ei8f/+e6RDJD8zR0RFJSUkAgCpVquDEiRNo1qwZACAkJIS6DGuQffv2Yf369UhLS5OtbWdlZYVRo0ahd+/eTIf3TX6k5G769OkYNWoUKlWqpLDN2NgYS5cuxcKFCxmIjBCiKdhMB0DIjyA2Nhaenp7gcDjgcrnIysoCALDZbPTu3RtHjx5lOELyIwsMDMTNmzcBACNHjkRISAgCAgLQuHFj7N+/H3379mU4QvI1Dh48iPnz56N+/fpYu3YtDh48iLVr18Lf3x/z58/H//73P6ZDJF9w7NgxpKenK92Wnp6O48ePl29AhBCNQy13hJQDc3Nz5OXlAQAcHBzw7NkzBAQEAJDesAsKCpgMj/zgJk2aJPt3YGAgDhw4gJCQEBQUFKBBgwYIDAxkMDrytXbu3Il+/fphxowZcuUtWrSApaUltm3bhh49ejAUHSmrd+/eUSs6IeSLKLkjpBzUqlULERERCAwMRPv27bF27VqkpKSAy+Xi0KFDskSPkPLG4/Gwf/9+NGzYENWqVQMAeHt7w9vbm+HISGl9+PBB1p32c02bNsW///5bzhGRr7F//34cOHAAgHQG0EmTJkFPT09uHz6fj9jYWLRu3ZqJEAkhGoSSO0LKwZgxY5CYmAgAGDFiBLKyshAcHAwej4cGDRpg1qxZDEdIflR6enpYtWoVvLy8mA6FlJGNjQ3CwsLQoEEDhW2PHj2iyTi+U7a2tqhRowYA6WyZlStXhqWlpdw+Ojo6cHV1Rffu3ZkIkRCiQSi5I6QcuLq6wtXVFQCgq6uLmTNnYubMmQxHRYiUp6cn3rx5g3r16jEdCimD7t27Y926deDz+fjpp59gZWWFtLQ0nD17Ftu2bcPo0aOZDpEoERQUhKCgINnvxU2oQgghX4PWuSNETaZPn/7V+7JYLCxYsECN0RBSvPDwcEyePBm///47AgMDYWBgwHRI5BtIJBIsWbIEe/bsgUgkkpVzOBz069cPU6dOZTA6Qggh5YGSO0LUxMPDA0b/b+9+QqLawzCOP+eqpF4rRlOchCBqcRYxaJsQRHPcZM4uWxiEKbWocdFukEAEaRNtWhQuCmoi0FpUNJktWkRuNKc/q2AQ2kzZIjxnQITMae7i0nBlKrV7Z35z5n4/q/F3ZvGACL7nPe95//xTe/bs0UZ/ZpZl6f79+wVKBkgPHjxQR0eHfD6fWlpa9PXr12xBUFlZuW4vmmVZisfjpqJiAwsLC5qYmFAymVRDQ4NaW1tVXV2d3XMXCARydqaheM3MzOjp06f69OmTvnz5su6aZVm6deuWoWQAvIDHMoE8aW5u1tu3b5VOpxUKhdTT06OmpibTsQBJf3eWJycn5fP5NDg46Okl1/9n8/PzGhgY0Nrammpra+W6ru7du6eRkRH19fWZjoctun79ui5fvqympibt27dP27dvNx0JgMfQuQPy6OPHj3r8+LFisZgSiYSam5sVCoXU3d2dMzAPFJJt27p7964CgYDpKPgX+vv75bquxsfH5ff7tby8rOHhYc3NzWl2dtZ0PGxRMBhUMBhkJhvAb2OJOZBHu3fv1pkzZ/Tw4UM9evRIhw4dUjQaVXt7u06fPq3nz5+bjgjAwxKJhMLhsPx+vySppqZGkUhEqVRKi4uLhtNhq1zXVVdXl+kYADyMxzKBAtm/f7/Onz+vs2fP6sqVK7p586YqKytZEA1jYrHYpmbpLMvSqVOn8h8IW+Y4jhobG9edfS/0HMfJfoY3dHZ2Kh6Ps/sUwG+juAMKIJ1Oa2ZmRlNTU3r27JnKysrU29vLziIYFY1GN/U9ijugMI4dO6bR0dHsDtQdO3bkfIedlAB+hZk7II9evnypWCym6elpra6uqqurS6FQSG1tbSov594KzGHmrjTYtq2qqqqcF+KsrKzknPPW0+Jn2/a6n//5+8tkMrIsS+/evSt0LAAewn+XQJ50dHTIcRy1t7drdHRUwWBQ27ZtMx0LQAkZGhoyHQH/oc120wHgZ+jcAXli27bKy8tVUVGx4WvmuaOOQqNzBwBA6aFzB+QJd9QBAABQSHTuAAAADDl48KCi0agOHDiglpaWDZ/0ePXqVYGSAfAiOncAAACGDA4Oqr6+Pvt5o+IOAH6Fzh0AAAAAlAA6dwAAAEUkk8no/fv3SqVS2rlzp/bu3UtHD8CmUNwBAAAUiTt37ujatWtaWlrK7rarq6vTuXPndOLECdPxABQ5ijsAAIAiMDk5qbGxMfX09Ojo0aPatWuXPn/+rKmpKY2NjamiokLHjx83HRNAEWPmDgAAoAh0d3erra1NFy5cyLl28eJFvXjxQtPT0waSAfCKP0wHAAAAgJRMJtXZ2fnDa4cPH9aHDx8KnAiA11DcAQAAFIH6+nq9fv36h9fevHmTXZkAAD/DzB0AAEAR6O3t1dWrV7W6uqojR46orq5OS0tLevLkiW7cuKFwOGw6IoAix8wdAABAEchkMrp06ZJu376tdDqdPS8rK9PJkycViUQMpgPgBRR3AAAABi0sLGhiYkLJZFINDQ1qbW1VdXV1ds9dIBCQz+czHROAB1DcAQAAGDI/P6+BgQGtra2ptrZWruvq27dvGhkZUV9fn+l4ADyG4g4AAMCQ/v5+ua6r8fFx+f1+LS8va3h4WHNzc5qdnTUdD4DH8LZMAAAAQxKJhMLhsPx+vySppqZGkUhEqVRKi4uLhtMB8BqKOwAAAEMcx1FjY+O6s++FnuM4JiIB8DCKOwAAAAAoAczcAQAAGGLbtqqqqmRZ1rrzlZWVnHPLshSPxwsdEYCHsMQcAADAkKGhIdMRAJQQOncAAAAAUAKYuQMAAACAEkBxBwAAAAAlgOIOAAAAAEoAxR0AAAAAlACKOwAAAAAoARR3AAAAAFACKO4AAAAAoAT8BWtQk5OlPr37AAAAAElFTkSuQmCC\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "code", - "source": [ - "\"\"\"\n", - "Mutual information is a measure of the mutual dependence between two variables. In the context of a dataset, mutual information can be used to measure the dependence between each feature and the target variable.\n", - "\n", - "More specifically, mutual information is a measure of how much information about the target variable can be gained by knowing the value of a feature. It is based on the concept of entropy from information theory, which measures the uncertainty or randomness of a variable. In the case of mutual information, it measures how much the uncertainty of the target variable is reduced by knowing the value of a feature.\n", - "\n", - "A high mutual information value between a feature and the target variable indicates that the feature contains a lot of information about the target variable, and it is likely to be a good predictor. On the other hand, a low mutual information value indicates that the feature is not very informative about the target variable.\n", - "\"\"\"\n", - "\n", - "def mutual_info(df: pd.DataFrame):\n", - " # Compute the mutual information matrix\n", - " mi = data.apply(lambda x: pd.Series(pd.Series(data.columns).apply(lambda y: mutual_info_score(x, data[y]))))\n", - "\n", - " # Set the plot size\n", - " plt.figure(figsize=(10,8))\n", - "\n", - " # Plot the mutual information bar plot\n", - " sns.barplot(data=mi, orient='h')\n", - "\n", - " # Show the plot\n", - " plt.show()\n", - "\n", - "# \n", - "mutual_info(data)\n", - "# " - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "id": "7YHj7y2Pva34", - "outputId": "c71c88ec-a96c-453f-849f-74ccf91e0bea" - }, - "id": "7YHj7y2Pva34", - "execution_count": 395, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n" - ] - }, - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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Tk6Odu3apfbt28vHx0eSdP/99yszM1MfffSRo9+3336rjh07OoXhK5/LzbLZbCpXrpwmT56sjz/+WGlpaYaMCwAAAAC3qkRc0fT09NSmTZtksVjk7++vGjVqyGq16r333pMkVa5c2al//uOUlJTrjpsfAvO5u7vfMJBZLBatWbNGL774oubMmeMIwdOmTVPz5s0lSfv371dSUpI6duyo1NRUSdLdd9+tKlWqaMeOHerbt68k6dy5cwoMDHQav2LFiipfvvx1a3BFvXr1tHz5cq1YsULjxo2T1WpVmzZtNHPmTNWsWfOWxwcAAEDJ49G6vbI+26e85LK1ddbNalWAp6fZZRSrunXrKjo62uwyblqJCJpWq1WhoaEF2itVqiRJOn/+vKpVq+Zo/+2335yOG61evXpaunSpsrOzdfDgQS1ZskSPP/649u3bpwoVKjg+ymTatGmaNm2a07nJyck6f/68AgMDVaVKFZ0/f97peHp6ui5fvnzd+T08PArcwfbCVbYKtGvXTu3atVN6err27dunefPmadq0aTf1US8AAAAo+az+/vLs1cfsMopd/Up+eqlLB7PLQCGUiK2z1xIaGip3d3ft2rXLqf2f//ynAgMDdccdd9zS+O7u7tcNfe7u7mrRooVGjRql9PR0nT17VpmZmdqzZ4+6dOmiDRs2OH0tWbJEOTk5ev/99yVJjRs31r/+9S/l5uY6xrzyuVxN9erVlZCQoIsXLzra9u/ff83+FStW1H333adevXrp+PHjLj8/AAAAACgKJeKK5rUEBARo8ODBWrNmjTw8PBQWFqa9e/dqx44dmjFjxnVvBOSK4OBgvf3229qxY4fq1q0rf39/paena8GCBbrvvvtUp04dpaena8WKFapVq5aCgoL0z3/+UxkZGYqKilJERESBMVevXq0dO3YoKipKo0aNUv/+/TV27FgNHDhQ8fHxWrNmzQ23znbr1k1Lly7VM888o4ceekjHjh3TW2+95dTn73//uw4dOqS2bduqSpUqio+P17Zt29S6dWtHn/r16+uLL77Q/v375evrq9q1a8vf3/+WXjMAAAAAuJESfUVTkqZMmaLo6Gi9/fbbju2rs2fPvuFHm7iif//+6tGjh+bOnav+/fsrNjZWVapUUeXKlbVixQqNHDlSM2fOVI0aNbR27VqVK1dOO3bsUM2aNa8aMiWpb9++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aZKkLVu26OGHH1ZUVJR69+4tSbrzzjtvaU4AAAAUv5TkX/TZ/vVKTj5jdimmsFqldWvKxn1Mg4KCNHbsWNWpU8fsUm7JTQfNnJwcSVJCQoIWLFig3NxctWrVSlOmTNGIESM0fvx4SVKbNm2UnJysZcuWaeDAgSpXrtw1x+zWrZvjvMjISH3yySf64IMP1K5dOwUFBSkgIEC//PKLwsLCHOckJSUpPj5e06dPd9zUp2XLltecY8yYMRo/frwOHz581e27W7du1S+//KKdO3cqODhYktS8eXN17NhR69evd1xFlSS73a5XX31VHh4ekn6/ErpixQrl5eXJav39f4TDhw/r5MmTevTRRyVJvXv31saNG/XBBx+of//+13+Rb+Dw4cOqVKmSnn76aUdbhw4dHN/nv041atRwes0AAABQuuz/v9cUf/qw2WWYKvWC2RUUj8TERMXGxmrBggVml3JLbuqfBTIyMtSoUSM1atRInTt31oEDBzRz5kx5e3srOztbPXr0cOrfs2dPJSUl6eTJk9cdt02bNo7vLRaLgoODr3pl8o/8/f1Vq1YtLVmyRO+8884N+3ft2lV33323li1bdtXjX331le666y5HyJSkSpUqqVWrVvr666+d+jZv3twRMiUpODhY2dnZOn/+vKNtx44dcnd3d7wmYWFhqlOnzlW3zxZWSEiIUlJSNHXqVO3fv1+ZmZm3PCYAAAAA3KqbuqLp6empTZs2yWKxyN/fXzVq1JDVatV7770nSapcubJT//zHKSkp1x33yq2k7u7ujm2g12KxWLRmzRq9+OKLmjNnjiMET5s2Tc2bN79q/8cff1wTJ07U999/X+B4ampqgfolKTAwUMeOHXNq8/X1dXqcHzovX74sScrLy9P777+vFi1ayGq1KjU1VZLUuXNnbdiwQYmJiapWrdp1n9/1REZGOrYqjxgxQuXLl1f37t31zDPPqFKlSjc9LgAAAEqW1m0eLfNbZ708y8bW2bp16yo6OtrsMm7ZTQVNq9Wq0NDQAu354eb8+fNOAeq3335zOm60evXqaenSpcrOztbBgwe1ZMkSPf7449q3b58qVKhQoH/Pnj0VExOjV155RTVr1nQ65ufnp59//rnAOefPn5efn1+h6vriiy907tw5nTt37qqh9/3333dsqb2Sh4eHsrOzndouXCi4X6BPnz7q06ePkpKS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3759+v7777V582Y1a9ZMktSyZUu1b99evr6+ha5r8ODBju/z8vIUERGh//znP/rHP/7hCJrr1q1TuXLltGLFClWsWFGSVLt2bQ0aNMhprBdeeEH33HOPYmNjHX8Z3X333erdu7f27t2r9u3bF7o+AABQ0JuH1uvo2ThjB003ZpjExETFxsZqwYIFxgwIAIVUprbO7t27VwMGDFDTpk0VEhKidu3aSZJOnjzp1K9BgwaOkClJd955p6Tft8tKUlxcnHx9fR0hU5IqVKigyMjIm6orISFBTz/9tNq2bauQkBA1atRI//d//6eff/7Z0ScuLk4RERGOkCn9vgW3UqVKjseZmZn65ptv1KNHD+Xm5ionJ0c5OTm64447VKNGDcXFGfyXIQAAAABcRZm5onn48GFFR0erc+fOGjlypAIDA2WxWPTQQw/p8uXLTn2vvCrp7u4uSY5+Z8+edQqi+a7WdiN5eXkaM2aM0tLSNGHCBNWtW1deXl5aunSpfv31V0e/c+fO6Y477rjunKmpqcrNzdW8efOcrt7m++N4AADg1jwYNtT4rbMVjNk6W7duXUVHRxtSFwDcjDITNHfv3q2KFSvqpZdecryP8syZm/uLIf89nle6sq18+fLKzs52asvOzlZGRobj8X//+18dOXJEy5YtU5cuXRztly5dcjqvSpUqN5zTx8dHFotFo0ePdhorn7+//w2eGQAAcFU1n5oa2+Zpw8YrX9lN9R4KLNCekZGho0ePqmHDhvL29jZsPgAoSmUmaF66dKnAvwRu3779psYKDQ1VamqqvvzySzVv3lySdPHiRX3++edOV0OrVaum7OxsnTp1SkFBQZKkL774Qrm5uY4++VdJ86+aSr8H4IMHDzpdwQwNDdWWLVuUnp7u2D771VdfKSUlxdHH29tbYWFhOnHihEJDQ2/quQEAAADArbrtgmZubq527dpVoD0kJETr16/X3Llz1bVrVx08eFDvvffeTc3Rrl07NWrUSJMmTdLEiRPl6+ur1atXq0KFCk5Btl27dvL29tazzz6rkSNHKiEhQRs2bFD58uUdferXr6/q1avrhRdeUF5enjIyMrR06VJVrVrVac5hw4bpjTfe0OjRozVixAilpqZq2bJl8vf3d5pzypQpGjp0qJ588kn16tVLvr6+SkhI0GeffaZ+/fo5bi4EAAAAAEXltrsZ0OXLl/XEE08U+LJYLJo8ebL27NmjMWPG6KuvvtKKFStuag6LxaJXXnlFDRo00MyZMzVz5kx16NBBrVq1ko+Pj6Ofv7+/li5dqqSkJI0dO1ZvvfWWFi5cKA8PD0cfDw8PxcTEyMPDQ0888YSWLl2qMWPGqEWLFk5zVq1aVatWrdLFixc1YcIErVy5UtOnT5e3t7fTnPfee69ef/11x51yR40apVdeeUWenp6qW7fuTT1fAAAAACgMi91ut5tdxO0gKytLvXr1UrNmza56I56icPLkSfXs2VN/+9vf9MADDxTZPPl3q614tKYu/5ZTZPMAAFCW8R5NlESsP1wpPxvc6K16t93W2eKyZcsW5eXlqV69ekpNTdUbb7yhM2fOaMmSJUU25wsvvCCbzaaqVavq9OnTWrFihapUqaJu3boV2ZwAAAAAUFgEzZtUvnx5rVy50nHn2gYNGmjFihVFehOe7OxsLV68WL/99ps8PT3VokULTZkyRRUqVCiyOQEAAACgsAiaN6lv377q27dvsc45depUTZ06tVjnBAAAAIDCuu1uBgQAAAAAMBdBEwAAAABgKIImAAAAAMBQBE0AAAAAgKEImgAAAAAAQxE0AQAAAACGImgCAAAAAAxF0AQAAAAAGIqgCQAAAAAwFEETAAAAAGAogiYAAAAAwFBuZheA0qO8P8sFAICiwt+zAG4n/IkGl9Xs6md2CQAA3NbseXZZrBazywCAW8bWWbgkKytLmZmZZpeBMigzM1NHjhxh/cE0rEEUJ0ImgNsFQRMus9vtZpeAMshutyszM5P1B9OwBgEAKDyCJgAAAADAUARNAAAAAIChCJoAAAAAAEMRNAEAAAAAhiJoAgAAAAAMRdAEAAAAABiKoAkAAAAAMBRBEy6zWPgQaRQ/i8UiLy8v1h9MwxqE2ViDMBPrDzfLYucTqHEDcXFxkqTQ0FCTKwEAAAB+Z8+zy2IlABc3V7OBW3EUg9vDhX8eV05SptllAAAAoIxzC/CSX89gs8vAdRA04bKcpEzlnMswuwwAAAAAJRzv0QQAAAAAGIqgCQAAAAAwFEETAAAAAGAogiYAAAAAwFAETQAAAACAoQiaAAAAAABDETQBAAAAAIYiaAIAAAAADEXQBAAAAAAYiqAJAAAAADAUQRMAAAAAYCiCJgAAAADAUARNAAAAAIChCJoAAAAAAEMRNA0WExMjm8121a+VK1dKklJSUjR27Fg1b95cNptNu3fvliStW7dOHTp0UMOGDRUdHX3LtRw4cEDLly+/5XEAAAAAoDDczC7gduTp6an169cXaK9Ro4Yk6bXXXtOBAwe0YMECBQYGql69ejp58qTmz5+vkSNHqmPHjvL397/lOv79739r7dq1evzxx295LAAAAABwFUGzCFitVoWFhV3z+M8//yybzabOnTs72r755hvZ7XY99NBDqlOnzi3Nn5WVJTc3frQAAAAAzEEaKWY2m63A9w888IDeeecdSVKXLl0kSfPmzVO/fv105swZLViwQPv371dubq6aNm2qKVOmOI3TqVMndejQQTVq1NDrr7+uX3/9VY888og2b97sNE+LFi20cePGYnmeAAAAAMougmYRycnJKdDm5uamLVu2aPHixbp48aJmzZolSQoICFBwcLAWL16s2NhYValSRUFBQUpPT1dUVJSsVqtmz56t8uXL69VXX9XgwYO1bds2x1ZcSfrwww9Vt25dTZ8+XVarVQ0bNtTly5e1Y8cOxzbeihUrFs+TBwAAgGF+ST+njd/t0Jn0s2aXUmJYylll3eludhnFIigoSGPHjr3lXY/FjaBZBDIyMtSoUaMC7Zs3b1azZs3k6+sri8XitL22Xr16kqSGDRuqdu3akqQNGzbol19+0c6dOxUcHCxJat68uTp27Kj169dr6tSpjvOzs7O1atUqeXt7O9qqV69+w228AAAAKNnWf7ddceeOmV1GyZNudgHFIzExUbGxsVqwYIHZpRQKQbMIeHp6atOmTQXa69evX6hxvvrqK911112OkClJlSpVUqtWrfT111879Y2IiHAKmQAAAABgFoJmEbBarQoNDb3lcVJTU1W5cuUC7YGBgTp27FiBNgAAANx+ht5zvzZ+v0Nn0tg6m89SziprhbKxdbZu3bqGfPRhcSNolmB+fn76+eefC7SfP39efn5+Tm0Wi6W4ygIAAEAxqlmxip6OeNTsMkoUtyreChx0j9ll4DqsZheAa2vatKl++uknnThxwtF24cIFffbZZ2ratOkNz3d3d1dWVlZRlggAAAAABXBFswjk5eXp0KFDBdoDAwMLdbeofv36ad26dRo9erSefPJJx11n3dzcNHTo0BueHxwcrJycHK1fv17h4eGqWLFiod8nCgAAAACFRdAsApcuXdLDDz9coL1/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\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "code", - "source": [ - "\"\"\"\n", - "The mutual information gain ratio is a measure of the information gain of a feature with respect to the target variable, normalized by the intrinsic information of the feature. In other words, it measures the degree to which the information provided by a feature is useful for predicting the target variable, taking into account the inherent randomness of the feature itself.\n", - "\n", - "The mutual information gain ratio is calculated as the ratio of the mutual information between the feature and the target variable and the entropy of the feature, normalized by the information entropy of the target variable. It is commonly used in feature selection and ranking tasks, where the goal is to identify the most informative features for predicting the target variable.\n", - "\n", - "A high mutual information gain ratio value for a feature indicates that the feature provides a lot of information gain with respect to the target variable, while taking into account its own intrinsic randomness. This means that the feature is likely to be a good predictor of the target variable and should be considered for inclusion in a prediction model.\n", - "\n", - "On the other hand, a low mutual information gain ratio value indicates that the feature provides little information gain with respect to the target variable, or that its information gain is not significantly greater than its intrinsic randomness. This means that the feature is unlikely to be a good predictor of the target variable and can be safely ignored or removed from the dataset.\n", - "\n", - "Overall, the mutual information gain ratio is a useful measure for identifying informative features in a dataset and can help improve the accuracy and efficiency of machine learning models.\n", - "\"\"\"\n", - "# \n", - "def mi_gain_ratio(df: pd.DataFrame):\n", - " \"\"\"\n", - " Information gain ratio is the ratio between information gain and\n", - " the entropy of the feature's\n", - " value distribution. The score was introduced in [Quinlan1986]_\n", - " to alleviate overestimation for multi-valued features. See `Wikipedia entry on gain ratio\n", - " `_.\n", - " .. [Quinlan1986] J R Quinlan: Induction of Decision Trees, Machine Learning, 1986.\n", - " \\n\\n\n", - " Gain Ratio(y,x) = information gain(y,x)/intrinsic value(x)\n", - " \"\"\"\n", - " # Separate the features and the target variable\n", - " df = df.copy()\n", - " X = df.iloc[:, :-1]\n", - " y = df.iloc[:, -1]\n", - "\n", - " # Compute the mutual information gain ratio for classification\n", - " mi = mutual_info_regression(X, y, discrete_features='auto', random_state=42)\n", - " mi_gain_ratio = mi / X.apply(lambda x: mutual_info_score(x, y))\n", - "\n", - " # Create a dataframe of feature names and their corresponding mutual information gain ratios\n", - " mi_df = pd.DataFrame({'Feature': X.columns, 'Gain Ratio': mi_gain_ratio})\n", - "\n", - " # Set the plot size\n", - " plt.figure(figsize=(10,8))\n", - "\n", - " # Plot the mutual information gain ratio bar plot\n", - " sns.barplot(data=mi_df, x='Gain Ratio', y='Feature', orient='h')\n", - "\n", - " # Show the plot\n", - " plt.show()\n", - "# \n", - "# \n", - "mi_gain_ratio(data)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "id": "1CXiqv3_yoU6", - "outputId": "b47ab061-8185-43c0-b7f3-48e16281fbef" - }, - "id": "1CXiqv3_yoU6", - "execution_count": 396, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n" - ] - }, - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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AAAAYCgEWQAAAACAoRBkAQAAAACGQpAFAAAAABgKQRYAAAAAYCgEWScQFhamwMBAR5dhc+jQIS1evDjDuLPVCQAAAKBgIsgig//9739asmSJo8sAAAAAgEwRZAEAAAAAhkKQNYDIyEiFhoYqKChIdevWVe/evfXTTz/ZzWnVqpWmTZumtWvXqmXLlqpfv75GjBihqKgou3knT55U79695e/vr3bt2mnz5s0aMWKE+vbtK+mfy4cXLlyohIQEWSwWWSwW27Z0v/76q3r16qV69eqpS5cu2r9/f/6+AAAAAADwLy6OLgBZu3r1qp566il5enrqlVdekbe3tz744AP1799fX375pUqUKGGbu2fPHp09e1aTJ09WdHS0ZsyYoenTp+utt96SJCUlJWngwIHy8fHR7NmzJUmLFi1SbGysKleuLEl6/PHHFRkZqa1bt2rVqlWSJC8vL9sxUlJSFBoaqn79+mnEiBFatmyZxowZoz179qh48eJ362UBAAAAUIARZJ3cqlWrFBsbq48//tgWWoODg9W+fXutWLFC48ePt821Wq1699135ebmJkk6d+6clixZorS0NJnNZm3cuFFXrlzRunXrVLFiRUnSAw88oHbt2tmCbNmyZVW2bFmZzWYFBARkqCc9yIaEhEiSqlWrptatW2vfvn3q2rVrfr4UAAAAACCJS4ud3oEDBxQUFKSiRYsqNTVVqampMpvNatiwoY4fP243t2HDhrYQK0k1atRQSkqKrly5Ikn66aefVLNmTVuIlaSKFSuqVq1a2a7HbDYrODjYbn93d3dduHDhTp8iAAAAAOQIZ2SdXHR0tI4ePao6depk2JZ+FjWdj4+P3eP0UHv9+nVJ0sWLF+Xr65thHV9fX9uc23F3d7cLy5Lk6uqa7f0BAAAAILcIsk6uaNGiatasmZ599tkM224OlLdTunRphYeHZxiPiopSkSJF7rhGAAAAALibCLJOrnHjxtq8ebNq1KghT0/PXK31wAMP6NNPP9Vff/2lSpUqSZIiIiL0yy+/qH79+rZ5rq6uSk5OztWxAAAAACC/EGSdxI0bN7R9+/YM40888YS2bNmiPn36qF+/fipfvryioqL0448/qkyZMhowYEC2j/HYY49p8eLFeuaZZzR69GhJ0sKFC1WyZEmZTCbbvBo1aig1NVWrVq1SYGCgvLy8VL169Vw/RwAAAADICwRZJ3H9+vVMLx+eNWuW1q9fr/nz52vOnDmKiYlRiRIlVK9ePbVt2zZHx3B3d9d7772nKVOmKDQ0VGXKlNGIESP06aefytvb2zavZcuWeuqpp7R06VJduXJFDRs21AcffJDr5wgAAAAAecFktVqtji4CjhMTE6M2bdpowIABGjVq1F0/fvqdl69+tFGxZ8/e9eMDAAAAzsCnShU1nf6qQ46dkJCg8PBw1a5dO9cfZ8yN9Gzg7+9/27mckS1gli5dqpIlS6pChQq6dOmS3nvvPd24cUOPPfaYo0sDAAAAgGwhyBYwZrNZ7777ri5cuKBChQqpXr16WrVqlcqVK+fo0gAAAAAgWwiyBczgwYM1ePBgR5cBAAAAAHfM7OgCAAAAAADICYIsAAAAAMBQCLIAAAAAAEMhyAIAAAAADIUgCwAAAAAwFIIsAAAAAMBQCLIAAAAAAEMhyAIAAAAADIUgCwAAAAAwFIIsAAAAAMBQCLIAAAAAAEMhyAIAAAAADMXF0QUAkuRVvpyjSwAAAAAchr8P5wxBFk4hYPgwR5cAAAAAOJQ1LU0mMxfNZgevEhwuOTlZiYmJji4DWUhMTNSJEyfok5OjT8ZAn4yBPjk/emQM9ClnCLHZxysFp2C1Wh1dArJgtVqVmJhIn5wcfTIG+mQM9Mn50SNjoE/ILwRZAAAAAIChEGQBAAAAAIZCkAUAAAAAGApBFgAAAABgKARZAAAAAIChEGQBAAAAAIZCkAUAAAAAGApBFgAAAABgKARZAAAAAIChEGThFEwmk6NLQBZMJpM8PDzok5OjT8ZAn4yBPjk/egQUbC6OLgBwc3OTh4eHo8tAFjw8POTn5+foMnAb9MkY6JMx0CfnR48cIy3NKrOZfzyA4xFk4RQ+++iQLl+Kc3QZAAAAuIWSpbzV9YkgR5cBSCLIwklcvhSnC+djHF0GAAAAAAPgM7IAAAAAAEMhyAIAAAAADIUgCwAAAAAwFIIsAAAAAMBQCLIAAAAAAEMhyAIAAAAADIUgCwAAAAAwFIIsAAAAAMBQCLIAAAAAAEMhyAIAAAAADIUgCwAAAAAwFIIsAAAAAMBQCLIAAAAAAEMhyAIAAAAADIUgCwAAAAAwFIIsAAAAAMBQ7skga7FYbvuzadMmR5eZJyIiIhQWFqYLFy7YjR86dEgWi0XHjx93UGUAAAAAkD9cHF1Afli/fr3d4549e6pv377q0qWLbaxy5cp3u6x8ce7cOS1cuFAtWrRQmTJlbON16tTR+vXrVaNGDQdWBwAAAAB5754MsgEBARnGypUrl+l4uqSkJLm7u+dfUXeZl5dXls8XAAAAAIzqnry0+HbCwsIUGBioY8eOqWfPnvL399fatWslSXPmzNHDDz+swMBANWvWTGPHjtXFixft9u/bt6+GDRum7du3q3379goMDFS/fv30559/2s1bunSp2rZtK39/fz300EMaMGCA/vrrL9v27BxLkvbu3asnn3xS9erVU8OGDdW3b1+dOHFChw4dUr9+/SRJPXr0sF02LWV+afH169c1Y8YMNW3aVP7+/uratat27txpd6wJEyaoS5cuOnTokLp166aAgAD16NFDP/30k928DRs2qHPnzqpbt66CgoLUq1cvHTt2LKetAAAAAIAcuyfPyGZHSkqKxo0bpwEDBuj5559XsWLFJElXrlzRsGHDVLp0aUVFRen9999X3759tW3bNrm4/N/LFR4erqioKIWGhurGjRuaOXOmXnjhBdtlzZ9++qnefvttjRkzRgEBAYqLi9P333+va9eu2dbIzrE+//xzjR07Vq1bt9bcuXPl6uqqH374QRcuXFDDhg01efJkTZs2TTNmzFD16tWzfM6hoaHav3+/nnvuOVWvXl2fffaZRo8erUWLFql169a2eZcuXdJrr72moUOHytvbW3PnztWoUaO0c+dOubq66vDhw5o0aZIGDhyokJAQJSUl6dixY4qLi8ur9gAAAADALRXoIPv888+rU6dOduMzZsyw/frGjRsKDAxU8+bNdfDgQTVt2tS2LS4uTp9++ql8fX0lSQkJCZo4caIiIyNVtmxZHTt2TBaLRcOGDbPt06ZNmxwdy2q16s0331STJk20aNEi29yQkBDbr++77z5J0v333y9/f/9bPt9ffvlFX375paZOnaonn3xSktS8eXOdO3cuQ5C9evWq1qxZo/vvv1+S5OHhoX79+unHH39UgwYNdOzYMRUrVkwvvviibZ8WLVrc8tgAAAAAkJcK5KXF6f4dCNN99dVXevLJJ1W/fn35+fmpefPmkqQzZ87YzatVq5YtxEr/FygjIyMlSX5+fjpx4oRmzJih7777TikpKTk+1unTpxUZGanHHnss18/1+++/lyR16NDBbrxjx446ceKEEhIS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zsfHx+5xeqi9fv26JCktLU2ff/65GjVqJLPZrNjYWMXGxqp169b63//+pwsXLmT53G4nODhYs2bN0smTJzVo0CA99NBDGj9+/G1fZwAAAADIb053abHZbJa/v3+G8WLFikmSrly5ojJlytjGL1++bLc9r1WrVk0LFixQSkqKjhw5onnz5umZZ57Rvn37VKRIkQzzO3bsqLCwML3zzjsqX7683baiRYvqjz/+yLDPlStXVLRo0RzVdfDgQV26dEmXLl1Sw4YNM2z//PPPbZcc38zNzU0pKSl2YzcHaUnq2rWrunbtqqioKO3evVszZsyQi4uL3njjjRzVCgAAAAB5yenOyN6Kv7+/XF1dtX37drvxL774QiVKlFDVqlVztb6rq6vtbOettjdq1EhDhw5VfHy8Ll68mOk8s9msZ555Rrt3785wN+L69evrt99+0+nTp21jV69e1TfffKP69evnqN4tW7bI09NTK1eu1OrVq+1+atWqleXlxWXLltUff/whq9VqGztw4MAt5/v6+urxxx9XkyZN7Gq/3WsGAAAAAPnB6c7I3oqvr6/69OmjFStWyM3NTQEBAfrqq6+0detWvfLKK1ne6Ck7atSooY0bN2rr1q2qUqWKihcvrvj4eL355pvq1KmTKlWqpPj4eC1ZskQVKlRQ5cqVb7nWww8/rEWLFunQoUOqUKGCbbx79+5auXKlhg0bpueee85212IXFxf1798/27Vev35dO3fuVLt27RQcHJxh+2OPPabXX39dp0+fVvXq1TNsb9++vTZs2KDp06erTZs2+uGHH7Rjxw67OQsWLFBMTIwaNWqkEiVK6LffftP+/fs1YMAA25zq1atr9+7datCggTw8PFStWjV5eXll+3kAAAAAwJ0wzBlZSRo/frxGjBihjRs32i7vnTp16m2/eic7evTooQ4dOmj69Onq0aOHFi5cqFKlSqlkyZJasmSJhgwZosmTJ6tcuXJ67733sgzOhQoV0tChQzOMe3l56YMPPlCtWrX0yiuvKDQ0VEWLFtWaNWvsvnrndvbu3au4uDh169Yt0+1dunSRq6ur3VlZk8lk+3Xz5s31wgsvaM+ePRo5cqROnjypqVOn2q3h7++v06dPa+rUqRo4cKBWrlypQYMGadSoUbY5kydPltVq1ZAhQ9SjR49MPxcMAAAAAHnNZP339aW4JwUFBal3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fvbp448/1rp163T27FklJSWpTJkyatOmjcaMGeOQ3/MIsgAAAAAAQ+EzsgAAAAAAQyHIAgAAAAAMhSALAAAAADAUgiwAAAAAwFAIsgAAAAAAQyHIAgAAAAAMhSALAAAAADAUgiwAAAAAwFAIsgAA4I5t2rRJFotFERERji7ljkRERMhisWjTpk2OLgUAkAMuji4AAADcHX/99Zfef/99HThwQJGRkZKkChUqKCgoSD179lStWrUcXOE/LBaL3eMiRYrIz89PgwcPVosWLe5ozS1btujKlSsaMGBA7gsEADicyWq1Wh1dBAAAyF///e9/9fzzz6tQoUJ6+OGHVatWLZnNZp0+fVpffvmlzp8/r927d6tChQo5WvfGjRtKTU2Vm5ubTCZTntRqsVjUpEkTde3aVVarVefPn9e6det06dIlLVu2TM2aNcvxmsOGDdPJkye1Z88eu3Gr1ark5GS5uLioUKFCeVI/ACD/cUYWAIB73J9//qmxY8eqfPnyWrlypUqXLm23PTQ0VB9++KHM5px/4qhQoUL5EgCrVq2qrl272h63b99enTp10urVq+8oyN6KyWRS4cKF82w9AMDdwWdkAQC4xy1fvlwJCQmaMWNGhhArSS4uLurXr5/KlStnG/vll180YcIEtW7dWv7+/mrSpIkmTpyo6Ohou30z+4xsq1atNGzYMH333Xfq0aOH/P391bp1a3366ad3/Bxq1Kih4sWL688//7Qb37Vrl4YOHaqmTZvqgQceUJs2bbRo0SLduHHDNqdv377au3evzp07J4vFIovFolatWkm69Wdkv/32Wz311FMKCAhQgwYNNHz4cJ06deqO6wcA5C3OyAIAcI/773//qypVqqhevXrZ3uebb77RX3/9pe7du6tUqVI6efKkPvroI/3+++/66KOPbnsZ8dmzZ/Xss8+qR48eevTRR7Vx40ZNmDBBderU0f3335/j5xAXF6fY2FhVrlzZbvyTTz6Rp6ennn76aXl6eurgwYNasGCB4uPj9eKLL0qSnnnmGcXFxSkyMlITJ06U9M/nbrN67kOGDFHFihU1atQoJSUlac2aNerVq5c2bdqkihUr5rh+AEDeIsgCAHAPi4+P18WLF9WmTZsM22JjY5Wammp77OnpKXd3d0nSU089pYEDB9rNDwgI0NixY/X999+rQYMGWR73jz/+0Nq1a23zOnbsqJCQEG3atMkWMLNy/fp1RUVFSZLOnz+v+fPn68aNG2rfvr3dvLlz59pqlqRevXpp8uTJWrdunZ5//nm5ubmpSZMmWr16tWJjY+0uV76VWbNmqWjRolq/fr2KFSsmSWrTpo0effRRhYWF6c0337ztGgCA/MWlxQAA3MPi4+Ml/RNSb9a3b18FBwfbftauXWvb9u9wmB4q08/o/vzzz7c97n333WcXdn19fVWtWjX99ddf2ap7w4YNtroee+wxHTx4UIMHD9bTTz9tN+/fdcbHxysqKkoNGjRQYmKiTp8+na1j/dvFixcVHh6uRx991BZiJalWrVpq3LixvvrqqxyvCQDIe5yRBQDgHpZ+CW1CQkKGbdOmTdO1a9d0+fJlvfDCC3bbYmJitHDhQn3++ee6cuWK3ba4uLjbHvffn7dNV7RoUV29ejVbdbdu3Vp9+vRRSkqKjh8/rsWLFyspKSnDDalOnjyp+fPn6+DBg7bQnpM6b3b+/HlJUrVq1TJsq1Gjhr7++mslJCRk+g8DAIC7hyALAMA9zNvb2/YZ15uln2H9942a0j333HM6cuSIBg0apNq1a8vT01NpaWkaPHiwsvPNfbm9k3HZsmXVuHFjSVJISIiKFy+uadOmKSgoSO3atZP0z6XRffr0kZeXl8aMGaPKlSurcOHC+vnnnzVnzhylpaXlqgYAgPMiyAIAcI9r0aKFPv74Yx07dkx169a97fyrV6/q22+/1ejRozVq1Cjb+JkzZ/Kxyqz17NlTK1eu1Pz589W2bVuZTCb973//s505btiwoW1uZsE8u99xW758eUn/fMb3ZqdPn1bx4sU5GwsAToDPyAIAcI8bPHiwPDw89NJLL+ny5csZtt98hvVWZ1NXrVqVL/Vlh4uLi55++mmdOnVKu3fvliTbZcb/rj85OVkffvhhhv09PDyydalx6dKlVbt2bX366aeKjY21jf/22286cOCAQkJCcvtUAAB5gDOyAADc46pWrao5c+Zo3Lhx6tChgx5++GHVqlVLVqtVERER2rp1q8xms8qWLStJ8vLyUsOGDbV8+XKlpKSoTJkyOnDgQKZnOu+m7t27a8GCBVq2bJnatGmjwMBAFS1aVBMmTFDfvn1lMpn02WefZXrpc506dfT5559rxowZ8vf3l6enp+27ZG82fvx4DRkyRD179lSPHj1sX7/j7e1td4YaAOA4BFkAAAqANm3aaMuWLXrvvfd04MABbdy4USaTSeXLl1dISIh69eqlWrVq2ebPnTtX06dP14cffiir1aomTZpo2bJlatasmcOeg7u7u/r06aOwsDAdOnRIQUFBWrx4sd58803Nnz9fPj4+euSRRxQcHKxBgwbZ7fvUU08pPDxcmzZt0sqVK1WhQoVbBtnGjRtr+fLlWrBggRYsWCAXFxc1bNhQL7zwgipVqnQ3nioA4DZM1uzcsQEAAAAAACfBZ2QBAAAAAIZCkAUAAAAAGApBFgAAAABgKARZAAAAAIChEGQBAAAAAIZCkAUAAAAAGApBFgAAAABgKARZAAAAAIChEGQBAAAAAIZCkAUAAAAAGApBFgAAAABgKARZAAAAAICh/D/b67uw/H0AjAAAAABJRU5ErkJggg==\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "def interact(data: pd.DataFrame):\n", - " # Create a sample DataFrame with four variables\n", - " # df = pd.DataFrame({'X': [1, 2, 3, 4, 5], 'Y': [1, 2, 2, 4, 5], 'Z': [2, 4, 6, 8, 10], 'W': [5, 4, 3, 2, 1]})\n", - " df = data.copy()\n", - " # Compute the Symmetrical Uncertainty between all pairs of columns\n", - " n_cols = len(df.columns)\n", - " su_matrix = np.zeros((n_cols, n_cols))\n", - " for i in range(n_cols):\n", - " for j in range(i+1, n_cols):\n", - " su = 2 * mutual_info_score(df.iloc[:, i], df.iloc[:, j]) / (mutual_info_score(df.iloc[:, i], df.iloc[:, i]) + mutual_info_score(df.iloc[:, j], df.iloc[:, j]))\n", - " su_matrix[i, j] = su\n", - " su_matrix[j, i] = su\n", - "\n", - " # Set the plot size\n", - " plt.figure(figsize=(10,8))\n", - "\n", - " # Create a heatmap of the Symmetrical Uncertainty matrix\n", - " sns.heatmap(su_matrix, annot=True, cmap='coolwarm', xticklabels=df.columns, yticklabels=df.columns)\n", - " \n", - " # Show the plot\n", - " plt.show()\n", - "# \n", - "# \n", - "interact(data)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "id": "DlOALLAH2B_l", - "outputId": "53c62861-633f-4ba6-bd9b-294c0f3d7765" - }, - "id": "DlOALLAH2B_l", - "execution_count": 397, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n" - ] - }, - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "code", - "source": [ - "\"\"\"\n", - "Symmetrical Uncertainty is a measure of the amount of mutual information shared by two random variables. It is often used in information theory and machine learning to quantify the relationship between two variables.\n", - "\n", - "Symmetrical Uncertainty (SU) is a normalized version of the mutual information (MI) between two variables. Mutual information measures the amount of information that two variables share. It is defined as the difference between the entropy of the joint distribution and the sum of the entropies of the individual distributions:\n", - "\n", - "MI(X,Y) = H(X) + H(Y) - H(X,Y)\n", - "\n", - "where H(X) is the entropy of variable X, H(Y) is the entropy of variable Y, and H(X,Y) is the joint entropy of X and Y.\n", - "\n", - "Symmetrical Uncertainty is defined as the ratio of the mutual information to the average of the entropies of the two variables:\n", - "\n", - "SU(X,Y) = 2 * MI(X,Y) / (H(X) + H(Y))\n", - "\n", - "The SU value ranges from 0 to 1, where 0 indicates no relationship between the variables, and 1 indicates a perfect relationship. SU is symmetric, which means that SU(X,Y) is the same as SU(Y,X).\n", - "\n", - "Symmetrical Uncertainty is useful in feature selection and feature ranking, as it can help identify variables that are highly correlated with the target variable. It is also used in clustering and classification algorithms to identify variables that are informative for the given task.\n", - "\"\"\"\n", - "# \n", - "def symmetrical_uncertainty(data: pd.DataFrame):\n", - " # Create a sample DataFrame with two variables X and Y\n", - " # df = pd.DataFrame({'X': [1, 2, 3, 4, 5], 'Y': [1, 2, 2, 4, 5]})\n", - " df = data.copy()\n", - "\n", - " # Compute the Symmetrical Uncertainty between all pairs of columns\n", - " for col1 in df.columns:\n", - " for col2 in df.columns:\n", - " if col1 == col2:\n", - " continue\n", - " su = 2 * mutual_info_score(df[col1], df[col2]) / (mutual_info_score(df[col1], df[col1]) + mutual_info_score(df[col2], df[col2]))\n", - " print(f'Symmetrical Uncertainty between {col1} and {col2}: {su}')\n", - "\n", - " # Set the plot size\n", - " plt.figure(figsize=(10,8))\n", - "\n", - " # Plot scatterplots of all pairs of columns\n", - " sns.pairplot(df)\n", - " \n", - " # Show the plot\n", - " plt.show()\n", - "\n", - "# \n", - "symmetrical_uncertainty(data)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "id": "-G5drMeh3LDR", - "outputId": "410284ec-d979-4c1f-d188-07ad19f46fbd" - }, - "id": "-G5drMeh3LDR", - "execution_count": 398, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n" - ] - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Symmetrical Uncertainty between TeamExp and ManagerExp: 0.793361631346111\n", - "Symmetrical Uncertainty between TeamExp and YearEnd: 0.797392959181038\n", - "Symmetrical Uncertainty between TeamExp and Length: 0.7865303454940535\n", - "Symmetrical Uncertainty between TeamExp and Transactions: 0.8274991961240277\n", - "Symmetrical Uncertainty between TeamExp and Entities: 0.8174765855972983\n", - "Symmetrical Uncertainty between TeamExp and PointsAdjust: 0.8321164570874809\n", - "Symmetrical Uncertainty between TeamExp and Envergure: 0.8044822531014049\n", - "Symmetrical Uncertainty between TeamExp and PointsNonAjust: 0.829725644837041\n", - "Symmetrical Uncertainty between TeamExp and Language: 0.8024203330848533\n", - "Symmetrical Uncertainty between TeamExp and Effort: 0.8315252382486885\n", - "Symmetrical Uncertainty between ManagerExp and TeamExp: 0.7933616313461112\n", - "Symmetrical Uncertainty between ManagerExp and YearEnd: 0.7861681422247623\n", - "Symmetrical Uncertainty between ManagerExp and Length: 0.7905780647316378\n", - "Symmetrical Uncertainty between ManagerExp and Transactions: 0.8236104263800661\n", - "Symmetrical Uncertainty between ManagerExp and Entities: 0.8199336639041059\n", - "Symmetrical Uncertainty between ManagerExp and PointsAdjust: 0.8306220327920687\n", - "Symmetrical Uncertainty between ManagerExp and Envergure: 0.7864649077969285\n", - "Symmetrical Uncertainty between ManagerExp and PointsNonAjust: 0.8306220327920688\n", - "Symmetrical Uncertainty between ManagerExp and Language: 0.8048737389398496\n", - "Symmetrical Uncertainty between ManagerExp and Effort: 0.8347890201375615\n", - "Symmetrical Uncertainty between YearEnd and TeamExp: 0.797392959181038\n", - "Symmetrical Uncertainty between YearEnd and ManagerExp: 0.7861681422247624\n", - "Symmetrical Uncertainty between YearEnd and Length: 0.7814697210193289\n", - "Symmetrical Uncertainty between YearEnd and Transactions: 0.8192632350741996\n", - "Symmetrical Uncertainty between YearEnd and Entities: 0.8081270005908286\n", - "Symmetrical Uncertainty between YearEnd and PointsAdjust: 0.8191470573583614\n", - "Symmetrical Uncertainty between YearEnd and Envergure: 0.7807656861749416\n", - "Symmetrical Uncertainty between YearEnd and PointsNonAjust: 0.8191470573583614\n", - "Symmetrical Uncertainty between YearEnd and Language: 0.8214451860334957\n", - "Symmetrical Uncertainty between YearEnd and Effort: 0.821001001408061\n", - "Symmetrical Uncertainty between Length and TeamExp: 0.7865303454940538\n", - "Symmetrical Uncertainty between Length and ManagerExp: 0.7905780647316377\n", - "Symmetrical Uncertainty between Length and YearEnd: 0.7814697210193289\n", - "Symmetrical Uncertainty between Length and Transactions: 0.9117802034529118\n", - "Symmetrical Uncertainty between Length and Entities: 0.9003408724952457\n", - "Symmetrical Uncertainty between Length and PointsAdjust: 0.9177828461310318\n", - "Symmetrical Uncertainty between Length and Envergure: 0.869096861146938\n", - "Symmetrical Uncertainty between Length and PointsNonAjust: 0.9177828461310318\n", - "Symmetrical Uncertainty between Length and Language: 0.7683288147593095\n", - "Symmetrical Uncertainty between Length and Effort: 0.9213527503192017\n", - "Symmetrical Uncertainty between Transactions and TeamExp: 0.8274991961240277\n", - "Symmetrical Uncertainty between Transactions and ManagerExp: 0.823610426380066\n" - ] - }, - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n" - ] - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Symmetrical Uncertainty between Transactions and YearEnd: 0.8192632350741995\n", - "Symmetrical Uncertainty between Transactions and Length: 0.9117802034529118\n", - "Symmetrical Uncertainty between Transactions and Entities: 0.9734434155164082\n", - "Symmetrical Uncertainty between Transactions and PointsAdjust: 0.9886595176097988\n", - "Symmetrical Uncertainty between Transactions and Envergure: 0.935518852749974\n", - "Symmetrical Uncertainty between Transactions and PointsNonAjust: 0.9907214234989262\n", - "Symmetrical Uncertainty between Transactions and Language: 0.7814983346780299\n", - "Symmetrical Uncertainty between Transactions and Effort: 0.9917778065272045\n", - "Symmetrical Uncertainty between Entities and TeamExp: 0.8174765855972981\n", - "Symmetrical Uncertainty between Entities and ManagerExp: 0.8199336639041062\n", - "Symmetrical Uncertainty between Entities and YearEnd: 0.8081270005908284\n", - "Symmetrical Uncertainty between Entities and Length: 0.9003408724952457\n", - "Symmetrical Uncertainty between Entities and Transactions: 0.9734434155164082\n", - "Symmetrical Uncertainty between Entities and PointsAdjust: 0.978786730770315\n", - "Symmetrical Uncertainty between Entities and Envergure: 0.9223559962671012\n", - "Symmetrical Uncertainty between Entities and PointsNonAjust: 0.978786730770315\n", - "Symmetrical Uncertainty between Entities and Language: 0.7669882770456833\n", - "Symmetrical Uncertainty between Entities and Effort: 0.981966103129732\n", - "Symmetrical Uncertainty between PointsAdjust and TeamExp: 0.8321164570874809\n", - "Symmetrical Uncertainty between PointsAdjust and ManagerExp: 0.8306220327920687\n", - "Symmetrical Uncertainty between PointsAdjust and YearEnd: 0.8191470573583614\n", - "Symmetrical Uncertainty between PointsAdjust and Length: 0.9177828461310318\n", - "Symmetrical Uncertainty between PointsAdjust and Transactions: 0.9886595176097986\n", - "Symmetrical Uncertainty between PointsAdjust and Entities: 0.978786730770315\n", - "Symmetrical Uncertainty between PointsAdjust and Envergure: 0.9391119063418734\n", - "Symmetrical Uncertainty between PointsAdjust and PointsNonAjust: 0.9938460047303379\n", - "Symmetrical Uncertainty between PointsAdjust and Language: 0.7816137017232294\n", - "Symmetrical Uncertainty between PointsAdjust and Effort: 0.9969324412362298\n", - "Symmetrical Uncertainty between Envergure and TeamExp: 0.8044822531014049\n", - "Symmetrical Uncertainty between Envergure and ManagerExp: 0.7864649077969283\n", - "Symmetrical Uncertainty between Envergure and YearEnd: 0.7807656861749416\n", - "Symmetrical Uncertainty between Envergure and Length: 0.869096861146938\n", - "Symmetrical Uncertainty between Envergure and Transactions: 0.9355188527499743\n", - "Symmetrical Uncertainty between Envergure and Entities: 0.922355996267101\n", - "Symmetrical Uncertainty between Envergure and PointsAdjust: 0.9391119063418731\n", - "Symmetrical Uncertainty between Envergure and PointsNonAjust: 0.9391119063418731\n", - "Symmetrical Uncertainty between Envergure and Language: 0.7742790311708294\n", - "Symmetrical Uncertainty between Envergure and Effort: 0.9425427041163286\n", - "Symmetrical Uncertainty between PointsNonAjust and TeamExp: 0.8297256448370409\n", - "Symmetrical Uncertainty between PointsNonAjust and ManagerExp: 0.8306220327920687\n", - "Symmetrical Uncertainty between PointsNonAjust and YearEnd: 0.8191470573583615\n", - "Symmetrical Uncertainty between PointsNonAjust and Length: 0.9177828461310318\n", - "Symmetrical Uncertainty between PointsNonAjust and Transactions: 0.9907214234989262\n", - "Symmetrical Uncertainty between PointsNonAjust and Entities: 0.978786730770315\n", - "Symmetrical Uncertainty between PointsNonAjust and PointsAdjust: 0.9938460047303379\n" - ] - }, - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/metrics/cluster/_supervised.py:64: UserWarning: Clustering metrics expects discrete values but received continuous values for label, and continuous values for target\n", - " warnings.warn(msg, UserWarning)\n" - ] - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Symmetrical Uncertainty between PointsNonAjust and Envergure: 0.9391119063418731\n", - "Symmetrical Uncertainty between PointsNonAjust and Language: 0.7841078998009109\n", - "Symmetrical Uncertainty between PointsNonAjust and Effort: 0.9969324412362298\n", - "Symmetrical Uncertainty between Language and TeamExp: 0.8024203330848534\n", - "Symmetrical Uncertainty between Language and ManagerExp: 0.8048737389398496\n", - "Symmetrical Uncertainty between Language and YearEnd: 0.8214451860334957\n", - "Symmetrical Uncertainty between Language and Length: 0.7683288147593095\n", - "Symmetrical Uncertainty between Language and Transactions: 0.78149833467803\n", - "Symmetrical Uncertainty between Language and Entities: 0.7669882770456835\n", - "Symmetrical Uncertainty between Language and PointsAdjust: 0.7816137017232294\n", - "Symmetrical Uncertainty between Language and Envergure: 0.7742790311708295\n", - "Symmetrical Uncertainty between Language and PointsNonAjust: 0.7841078998009111\n", - "Symmetrical Uncertainty between Language and Effort: 0.7811852536639087\n", - "Symmetrical Uncertainty between Effort and TeamExp: 0.8315252382486883\n", - "Symmetrical Uncertainty between Effort and ManagerExp: 0.8347890201375615\n", - "Symmetrical Uncertainty between Effort and YearEnd: 0.8210010014080609\n", - "Symmetrical Uncertainty between Effort and Length: 0.9213527503192017\n", - "Symmetrical Uncertainty between Effort and Transactions: 0.9917778065272045\n", - "Symmetrical Uncertainty between Effort and Entities: 0.981966103129732\n", - "Symmetrical Uncertainty between Effort and PointsAdjust: 0.9969324412362298\n", - "Symmetrical Uncertainty between Effort and Envergure: 0.9425427041163286\n", - "Symmetrical Uncertainty between Effort and PointsNonAjust: 0.9969324412362298\n", - "Symmetrical Uncertainty between Effort and Language: 0.7811852536639086\n" - ] - }, - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {} - }, - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "iVBORw0KGgoAAAANSUhEUgAACooAAAqKCAYAAAAzWNWuAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9e5wb1X0//r90v+595QsGX9ldG2yvN5gQQkwuJQm0wRgwNm3JrRBouCRNGpK06SePT9p+fm1D+0hTHAghJCHhmwZzd2hCUqcNuLnQENZrA/auwdiAwbb2qsuMNBpJvz9kyVppNDPSjjQj7ev5eORBvJJmzpw57/M+c+ZoZMtms1kQEREREREREREREREREREREREREVHLsZtdACIiIiIiIiIiIiIiIiIiIiIiIiIiqg8uFCUiIiIiIiIiIiIiIiIiIiIiIiIialFcKEpERERERERERERERERERERERERE1KK4UJSIiIiIiIiIiIiIiIiIiIiIiIiIqEVxoSgRERERERERERERERERERERERERUYviQlEiIiIiIiIiIiIiIiIiIiIiIiIiohbFhaJERERERERERERERERERERERERERC2KC0WJiIiIiIiIiIiIiIiIiIiIiIiIiFoUF4qaZHR0FKOjo2YXg4h0YswSNR/GLVFzYcwSNR/GLVFzYcwSNR/GLVFzYcwSNR/GLVFzYcwSNR/GLZG1cKGoSSRJgiRJut6bTCbx+9//Hslkss6lIiPwfLWmamLWKGxLp7EuTmNd6GdG3BqF57l6rLPqWa3Omjlmm5XV2gAps/J5YtzmWPkctRrW9dxIksQ6bDDWd2O1Yn0z11anFduA1bHOZzMzZnkuzMF6b37MtdVjuzcP6/50zM6nuuCxtqb5dKxKuXY+HX+jsE6N1cr1yYWiTSCdTs/6L1kbzxcZhW3pNNbFaayL+YHnuXqss+qxzohtoDnwPFkfz1HjsK6NwzpsDLbZxmJ9E9tA47HOrYPnwhysd5qP2O7Nw7o/bT7VBY+1Nc2nY1Uy34+/Hlinxmrl+uRCUSIiIiIiIiIiIiIiIiIiIiIiIiKiFsWFokRERERERERERERERERERERERERELYoLRYmIiIiIiIiIiIiIiIiIiIiIiIiIWhQXihIRERERERERERERERERERERERERtSin2QUgIiKykvC0gJiQQlxM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x2Qkgd4OH5+0QtQEMpkMAl4bkABu3LIOEzMJxIQU3C47Dh6dwk9/8yr+/KpBTgARUUtY1BvAp68dQjSewskpATYAB49O4as/eA6rl3XjlmsGOX5poEwmg6DXBhucuH7zuZiJS7Ny0A9+8hJzEBE1VKjbj3Qmg00bzsAVF8++xnU77cwRRKe0+d1ISGnEBAkXrT8Dl79rdrws6gkwfxMR1Sg/HnnX4BnYXDLn7vc4EeLCPtIpf/9GqS25HXYsYFuiEot7g7h56yBOTAqz5mfuf/Il3LBlHdsMERHNsqg3iPC0gE9eNYiTU7Nzx3/86lXceOW6lplL40JRIiKiUxb2BLDRZUc0LiEuygj4nFh5ZkfLJH2i+SLUHUBUkApPJUhIMt49tARd717FG3xE1FJ62nNfZmkLuBCNS/B7Xdi04Qy0Bdwcv5gk1B2AV5DgcTuYg4jIdIt6g3C5HbzGJdIQ6vTB63bA63ZATKaRkGQEfS6sXt7N/E1ENEccj5BReP+GqrWoJwBXUZvZtOEM/OFFy9lmiIhIUagz9yUCt9uOaExCTExh02Dr5Q4uFCUiIiqSX3BBRM2tze/mDT0imjc4frEW5iAishLmCCJ9mL+JiOqH4xEyCtsSVYtthoiIqtXT7oPPmcXEWy9j5eI18PtbK4/YzS4AERERERERERERERERERERERERERHVBxeKEhERERERERERERERERERERERERG1KC4UJSIiIiIiIiIiIiIiIiIiIiIiIiJqUVwoSkRERERERERERERERERERERERETUorhQlIiIiIiIiIiIiIiIiIiIiIiIiIioRXGhKBERERERERERERERERERERERERFRi+JCUSIiIiIiIiIiIiIiIiIiIiIiIiKiFsWFokRERERERERERERERERERERERERELYoLRYmIiIiIiIiIiIiIiIiIiIiIiIiIWhQXihIRERERERERERERERERERERERERtSguFCUiIiIiIiIiIiIiIiIiIiIiIiIialFcKEpERERERERERERERERERERERERE1KK4UJSIiIiIiIiIiIiIiIiIiIiIiIiIqEVxoSgRERERERERERERERERERERERERUYviQlEiIiIiIiIiIiIiIiIiIiIiIiIiohbFhaJERERERERERERERERERERERERERC2KC0WJiIiIiIiIiIiIiIiI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iIiIiIiIiIiIiIiIiIiIiFoUF4oSEREREREREREREREREREREREREbUoLhQlIiIiIiIiIiIiIiIiIiIiIiIiImpRXChKRERERERERERERERERERERERERNSiuFCUiIiIiIiIiIiIiIiIiIiIiIiIiKhFcaEoEREREREREREREREREREREREREVGL4kJRIiIiIiIiIiIiIiIiIiIiIiIiIqIWxYWiREREREREREREREREREREREREREQtigtFiYiIiIiIiIiIiIiIiIiIiIiIiIhaFBeKEhERERERERERERERERERERERERG1KC4UJSIiIiIiIiIiIiIiIiIiIiIiIiJqUVwoSkRERERERERERERERERERERERETUorhQlIiIiIiIiIiIiIiIiIiIiIiIiIioRXGhKBERERERERERERERERERERERERFRi+JCUSIiIiIiIiIiIiIiIiIiIiIiIiKiFsWFokRERERERERERERERERERERERERELYoLRalpZDLZptouERERERERERERERERERERERERkdmcZhdAiyRJ2LlzJ55++mkcO3YMALBkyRK8+93vxjXXXAOPx2NyCalR7HYbHvzPMYSnBMO2GeryY/v7+w3bHhEREREREREREREREREREREREZGVWHqh6PHjx/Hxj38cr776KkKhEJYtWwYAOHjwIPbs2YMHHngA3/ve97Bo0SKTS0qNEp4S8OZ43OxiEBERERERERERERERERERERERETUFSy8U/cpXvoI333wT//qv/4pLL7101ms//elP8cUvfhFf+cpXcPfdd5tUQiIiIiIiIiIiIiIiIiIiIiIiIiIi67L0QtHf/va3+NjHPla2SBQALrvsMrz00kt44IEHTCgZEREREREREREREREREREREREREZH1WXqhaCAQQHd3d8XXe3t7EQgEGlgiIiJqFlFBwkwsibiYQsDnQkfQgza/2+xiEVETYn9CxDggKlYaDwGvA3a73exiERE1BY4pqBmx3RI1L8YvkbUwJolq09m9AOMRGWJ4krFDRE2L4wBrsPRC0auuugqPPfYYtm3bBp/PN+u1eDyORx99FFdffbVJpSMiIqsKT4u4c+cwhkfDhb8NDYRw27YhhDp9Kp8kIpqN/QkR44CoWKV4uOFDAyaWioioOXBMQc2I7ZaoeTF+iayFMUlUm1gii+/9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+eST2Lx5s9nFJCIiIiIiIiIiIiIiIiIiIiIiIiKyJEsvFL355puxc+dO9PX1zfq7zWbD9ddfj0cffRQ9PT0mlY6IiIiIiIiIiIiIiIiIiIiIiIiIyNosvVD0tttug9PprPj6qlWr8OCDDzakLK+88go+/vGPY8OGDbjooovw1a9+FZIkNWTfRERERERERERERERERERERERERES1sNxC0X379mF6elrXe19//XXs2rWrvgUCMDMzg49+9KNIpVK488478ZnPfAY7d+7EP/7jP9Z930REREREREREREREREREREREREREtbLcQtHt27djz549hX9PT09jcHAQ//u//1v23uHhYfzVX/1V3cv0ox/9CPF4HDt27MCmTZuwdetW3H777fjRj36EEydO1H3/RERERERERERERERERERERERERES1sNxC0Ww2W/bvZDKJdDptUomAZ555BhdeeCE6OzsLf7vsssuQyWTwq1/9yrRyERERERERERERERERERERERERERGpcZpdgGZw+PBhXH311bP+1t7ejlAohMOHD5tUKiIiAoCoIGEmlkRcTCHgc6Ej6EGb3212sYhonmFfRKQPY4WaBdsqEZE52P+SFbAdElkP45KoeTBeab5i2yciUsd+0hq4UFSHSCSC9vb2sr93dHRgZmam5u1ms1kIgqD5PlEUZ/13PrLZbPD5fEhnM0hnjHu6bDqbAZCr29Kn2daK58t6/H6/IdvRG7NGYVs6rVJdxBJZ7Hh4BMOj4cLfhgZCuHXrIIJeW0PL2CjzoV0YFbNA4+PWKPPhPBvNzDpr1r7IqDpjzDavRsdNs8aK2epxnhi36qptq8zbjTNf69romAXmXx2aZb622VrNdaxgpfpmrjWHEW2AY9bqWCnu5qIVYrZVzoUSK8dlK9e71bVC3DYrtXZv5XhtBc3c5xgds1ari3q2fasdaz3xWK2lnrm2GY6/2Vi9TpttjGD1+lSiN2ZtWaNWxxlk9erVuOOOO3D55ZcDAKampnDhhRfiu9/9Li688MJZ7921axe+8IUv4MCBA3Ut07nnnotPf/rTuPHGG2f9/UMf+hCGhobwd3/3d1Vvc//+/ZAkyagitjyfz4dzzjkH//S9X+ONExHDtnvmwnZ84WPvxEsvvdRUAV4PLpcLTmd91o7LsoxUKlWXbetx3nnnzXkbjFnr6exegO/9/HXsHQuXvTbUH8JHP3AWpidPmlAymisjYhZg3FJjsC9izJI+jBVrYdxWxrZKVsSYpfmg1fpfxm1zarV2SPoxZq2LcUmVMG6th/FKalo5Ztn2qVW1ctxSY7GfbAy9MWvJJ4oeO3YML774IgAgGo0CAI4ePVr2VM833nijIeVpb28vlKPYzMwMOjo6at6uy+XC2Wefrfk+URRx5MgRLF++HD6fr+b9NTObLbeC3Ovzwh+QDduu1+cFAKxYscLQJ4o22/my2WzweLyw2+uzUj+TySKZTBhWx2bRG7NGaca2VC9KdTEekbF37HnF9w+PhXHDFWuxZk1PI4vZEGwX1Wl03BqF57l6ZtVZM/dFVmxnzRqzzaqRbaCZY8VsVozVYq0Wt7W0Vaufo1bCup47p9MJWZZZhw3CNqufEWOFVq3vVsu19TTXNsAxa/VaNe7mwqyYbdVzYfW4bNV6n2+Ya6tTqd1bPV5bAfucHJfLhSVLllimLurd9ufTeeextq7SXDvfjr8RrFynzThGsHJ9zpUlF4p+/etfx9e//vVZf/vKV75S9r5sNltYQFhPK1euxOHDh2f9LRqNIhwOY+XKlTVv12azVfW4Zp/PZ+jjnZuRw2aHw+4wdHsA6hLYzXi+HvzPMYSnjP15jVCXH9vf398SnWe1MWuUZmxL9VJcF2J4UvW9YlKG39+u+p5mxnahj1lxaxSe5+o1us5aoS+yUjtr9phtVo1oA60QK2azUqwWa7W4nUtbteo5akWs69rl59FYh43F+tZm5Fih1eq71XJtI9TaBjhmrV2rxd1cmB2zrXYumiUuW63e5xuz47ZZlbb7ZonXVjDf+xybzVa472yFumhU27fCsTYKj7X1VMq18+X4G8mKddrMYwQr1udcWW6h6D/8wz+YXYQyF198Mb75zW8iEokUnmr61FNPwW6346KLLjK5dETGCU8JeHM8bnYxiHQJ+Fxzep2IyAjsi4j0YaxQs2BbJSIyB/tfsgK2QyLrYVwSNQ/GK81XbPtEROrYT1qL5RaKXnnllWYXocy1116LH/zgB7jllltw00034cSJE/jqV7+Ka6+9FgsXLjS7eERE81JH0IOhgRCGR8Nlrw0NhNAR9JhQKiKab9gXEenDWKFmwbZKRGQO9r9kBWyHRNbDuCRqHoxXmq/Y9omI1LGftBa72QVoBh0dHbj//vvhcDhwyy234F/+5V+wdetWfPGLXzS7aERE81ab343btg1haCA06+9DAyF8atsQ2vxuk0pGRPMJ+yIifRgr1CzYVomIzMH+l6yA7ZDIehiXRM2D8UrzFds+EZE69pPWYrknipYSBAE///nP8frrr2NmZkbxPX/zN39T93KsWrUK3/ve9+q+HyIi0i/U6cPt123ETCyJuJhCwOdCR9DDwQQRNRT7IiJ9GCvULNhWiYjMwf6XrIDtkMh6GJdEzYPxSvMV2z4RkTr2k9Zh6YWiv/nNb/DpT38akUik4ntsNltDFooSEZE1tfndHEAQkenYFxHpw1ihZsG2SkRkDva/ZAVsh0TWw7gkah6MV5qv2PaJiNSxn7QGSy8U/cpXvgKfz4evfe1rGBwcRDAYNLtIRERERERERERERERERERERERERERNw252AdS89dZbuOGGG3DRRRdxkSgRERERERERERERERERERERERERUZUsvVB0YGAA0WjU7GIQERERERERERERERERERERERERETUlSy8U/dznPocf/vCH2L9/v9lFISIiIiIiIiIiIiIiIiIiIiIiIiJqOk6zC6Dm7W9/O/76r/8a1157LVauXInFixfDbp+9ttVms+Huu+82qYRERERERERERERERERERERERERERNZl6YWiP/vZz/D5z38e6XQaJ06cQDweL3uPzWYzoWRERERERERERERERERERERERERERNZn6YWi//Iv/4IVK1bg3/7t37BixQqzi0NERERERERERERERERERERERERE1FTs2m8xz8mTJ3HttddykSgRERERERERERERERERERERERERUQ0svVB03bp1eOutt8wuBhERERERERERERERERERERERERFRU7L0QtG/+Zu/wU9+8hP85Cc/MbsoRERERERERERERERERERERERERERNx2l2AdR87nOfgyzL+Mu//Ev8n//zf7Bo0SLY7bPXttpsNuzatcukEhIRERERERERERERERERERERERERWZelF4p2dnais7MTy5YtM7soRERERERERERERERERERERERERERNx9ILRX/wgx+YXQQiIiIiIiIiIiIiIiIiIiIiIiIioqZl6YWiREQ0v4WnBcTFFOKijK5FZ2MqnkEaEtr87rrtcyIiIpGQkUylISbTCPpd6G731nWfRM0oHyuJVBqJZBpBnwvB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UcUTYdU+4av4m538iUkia+GCrNrNpV8ka2nWc1kcv7Pza/N/g5uTjqSXWlvRm+OatQ8gotOqGdMy5q2ptD8XBAGZTMbEEtFcGJGDb906iGNHx7B4YU9V++Y4ksh49XpiaTPmY86jkdXkn/y1blUvvvnYvqriqc3vhgMywsfeQO8Za+BnOyYLatZ8QUTNgX2MNo5/rc3SC0V/8Ytf4MMf/jAuuugiTE1Nlb2+fPlyPPbYYyaUjIiI9JrLQCA/ocifmCSyHt5Iqx0vkFpHs55L5lcidXpznBFPUyEic1Uzpm3WvE/UTKrNwaXx6IDMxcJELa5Z8zHn0chq8m2yGeOJSI9mzRdE1BzYx2jj+Ne6LL1QNBqN4swzz6z4uizLSKfTDSwRERHVggMBIqLZ2C+2Dp5LovmNT1Mhml+Y94msQykeBUE2qTRE1EjMx0TGYTxRK2P7JqJ6Yh9DzcpudgHULF26FC+++GLF13/1q19h1apVDSwREREREREREREREREREREREREREVHzsNxC0d/97neYnJwEAGzduhWPPPIIfvKTnyCbzQIAbDYbJEnC1772NezZswfbt283s7hERERERERERERERERERERERERERJZluZ+e/8hHPoKvfvWruPzyy/HRj34UL7/8Mj772c+ivb0dAPC5z30O09PTkGUZ27dvxzXXXGNyiYmIiIiIiIiIiIiIiIiIiIiIiIiIrMlyC0XzTw4Fck8P/fu//3ts2bIFP/vZz3D06FFkMhksXboUl112Gc4//3wTS0pEREREREREREREREREREREREREZG2WWyiqZOPGjdi4caPZxSAiIiIiIiIiIiIiIiIiIiIiIiIiaip2swugxGazmV0EIiIiIiIiIiIiIiIiIiIiIiIiIqKmZ8knit5+++24/fbbdb3XZrPhpZdeqnOJiIiIiIiIiIiIiIiIiIiIiIiIiIiajyUXir7zne/E8uXLzS4GEREREREREREREREREREREREREVFTs+RC0S1btuDyyy83uxhERERERERERERERERERERERERERE3NbnYBiIiIiIiIiIiIiIiIiIiIiIiIiIioPrhQlIiIiIiIiIiIiIiIiIiIiIiIiIioRXGhKBERERERERERERERERERERERERFRi3KaXYBSBw8eNLsIZX71q1/h0UcfxcjICF5//XX86Z/+Kb78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nh/4ve6a96tLc1izfciOa+XSPaiDM8lFtbebMaDzSn3LzGcEzfRZtCYcrL8GIuSAdRpLhRPvUTbSbt0r/b+Z+tvsPKhRbIb3oQzmm63MK41e0wmRsK/hZy+SGq4hMvv5F/fBusvxC0Wf97zn6Uc/+tH8vy+++GJ9/vOf17vf/W79/d//vb74xS/qJS95SUdjOOecc/Tzn/9cMzMz849973vfk9vt1gte8IKO7tupVi0L6/otmww/NLt+yyatWmbfiuoVQyFtvWxMp26I6lPfeKBunO5CwdZYJSk6Ur8toyP2xTcY9uuGy8e195lpHTyUqBnndZdu0oDfY2usANBPAl7p6gtGTV1IdNNg2C+Px123bnkKBa1ebk89OLBvrzyFQv34VJwr2GHVsrDCfo+uu9SZcyhpofY7re91Qr1jLb9pXuuxu+991NQczux+7vrJo7ri3I2m4zFzPpo5xlLcXperazkyGPZr9YqITj52ha44d2NVW46PRnXhOcfqj09NG86LS++/9uJTDM/DtRefolXDIdvzCtXK++ZdP3lUm89eb3j+Tzt+tWEfLi0euWXbdm0+e71O3VB/O2+5ZJMGQj7DnK2VY9dt2aSv/c/DGl23TDdddabe+foz9K9vfr6u2nySIkGvqTxx4pi6Yiik1SPhunkTHQopEvb31ZiPzqjVx//41LSuuehkjTXITaM8MDs+bL1sTHufmZakhvtYtSysG688Xbf+3Uv1f956tm79u5fq+i1jcruk0XXLTcfYbk7Xen/5grgrzt2oseNWKuD3koMGBsN++f3euven/N6cAktjnahhn6o1p9z7zLS2XjZWs//tfWZab718XCuGQqa3ObYhqmsuOll/fGq65jYb1fK7fvJosVZfukmnblipd77+DN101ZkaXbdM3/vF4/qLs47R408VYzc7R52ZOqCtW6qPtTxXS2334/uemB+vKuOz8vpsxVBI111au/1L812/x23b9So6r1EdKM1HOz1XbFTPjMaBRnFVbrNWbR3bUJx7H70qotOOX93xWlfvWK/bsklnnrRat/7dS3Xjladr5Yi53DMzH6h8zS3bttcca667dFPTc+/BsF8DYX/N+0vXXnyKogbXwqXPzoze08w4245Vy8IaqLg31ux8sdvqnfPSHx+Vx16rbpbPkSu3Uz63LX+8mblovdx98yWn6KWnH6Ub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OnZyZTtslRubrTFZbRepbEWf+OJ/6pFDD7d83WpHj6eUL1Uajq1uvPqCFWvIteulv/emi5uuV55ctV75wmxaH7h7X8PxwP97/AWdNjkiv9+vDaf+6JxYGExWxsBO3Odm675XXrrFdg5vxW67Xv16K/PrVrm2ei2r+xsr72lVzmAwqHmj3HAt22w+U1uO2vuw3D4eb9g+ouGAsrmiPvOlww37rWwur6RRP7/od9+SNPLK5or6py8daljOo8fT2rje/fMOs3xbzYEfve9xfe+Jo83je/uk9vys+ZpRte28Z9V4rdH9q64RfeRz+/Waly/ncLN59se/+7hufP3unoxvu9WmkkZe+w4d08a1CX3nsec1PhJp2GdaXYd7++t361P/+rhe84ozdf+3n9GOM9bo7//tiRXHu3DbpG65bjebCAdAq88Yv/f4j3XROS/WJg/0P15THStPH5zRz7z0xbr2Z3c03VvwjUf+Uz/zE5v5Y+U+cfPenuofBZQrqpur1o3Jtk/qusu3K5sv6d6vPaWDRxZz89//24Gl/66bF696T6P1jFyhpI//i3luXPxDncU5dbP1Z0ldzY2txup/8MFvLY0VEg58DHDshKGZuay+sa9+nejF60fk80nxWEgfumff0lrDnQ8cWvG633zteapU0trgcO6dmcuoUCw13Fv29mt26e+/8LhueN0u137eYoff6QKY2b59u26//XY9/PDD+sY3vqFvfOMbevjhh7V3796B3SR69IRR10lL0r7DM7r97kd19IThUMmWeaGM86mcrvrps+sCWVouZzpTcKh0y2oHTLWmD87otjunFzewOWQ+ldP0wRldedlWhQPhlve8pMUPHbvt5EJWm188rvsefHpFsq2e+44HDuk/j6X08IGjjtWVE/Fw7GTrcx472d1zzi5k6gYg1fPtvWtf1++9WZ1e8VNblUx3L35TRl4lv7/lOQuFctfOJ7k79rtlGK4RgDfMzDXOK9MHF8cSV162demxfYdn9IF7HtXv/dpPrHjs9rsf1czccn5tlhtXH/PKy7bqjgdWLk5XX1fbF6YzhZZ56L+/ebk8mzeNa+9d+9rqX1v1zavrotf9ddLI6+gJQ6/+iTPqNqxJy/di/ZqYXjie1uxC/YcP/Sin28wuZHR0zqjbyCAt1tnf3fuYbrluStMHZ3RyIetQKVtb3Q6vvGxr3Yc9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IiIiIiIiIiIiIiJqUbxQlIiIiIiIiIiIiIiIiIiIiIiIiIioRfFCUSIiIiIiIiIiIiIiIiIiIiIiIiKiFsULRYmIiIiIiIiIiIiIiIiIiIiIiIiIWhQvFCUiIiIiIiIiIiIiIiIiIiIiIiKi/5+9P4+Tqrrzx/9X7VvvTdFsAjZ0Nwh005EMRoUkBs0iiyCiyddtAooL0TgzTjLzm4+TOJmZJH4ymYy4Rk1i/CSKuJFMogmZSTCLThybBhG6EQQFBYrearn31q3t90dRRVdX1b1V3VV1b1W9no9HHoau6q5T9573OeeelSoUJ4oSEREREREREREREREREREREREREVUos9YJKAe//OUvsWPHDuzbtw9erxezZs3CddddhyuvvBIGg0Hr5BERERERERERERERERERERERERERZcSJojn44Q9/iOnTp+OrX/0qGhsb8cc//hH/5//8H5w4cQJbtmzROnlERERERERERERERERERERERERERBlxomgOHnroITQ1NSX//bGPfQzDw8P4wQ9+gNtuuw1Go1HD1BERERERERERERERERERERERERERZcaJojkYPUk0Yf78+di2bRsEQUBNTY0GqaJ8+AQZI/4gAmIILocF9TU21DqtWieLiHSI5QURlQLLGqLKxhgnIipvLMeJqBKwLKNKwHxMRMXEMoaIqkmllnmV+r2IikXXE0X379+PQ4cOYeXKlcmfvfrqq3j44YchyzJWrlyJG264QZO0/e///i9aWlomNEk0FotBEATV94mimPJfyo9fimHr9l709HmSP+vucGPL+i7U2A0F/zzeL/1xOp0F+Tu5xmyhMC+dVaprUeryYjyqIV8UKmaB0sdtoVTDfS60crpmeilrCnXNGLPlq5zippwUOsaLcZ8Yt4XFWCqdar3WhY5ZoPquYT4KWY5Xa57Vip6uN+tabegpD2itVM+dlXLNKyFmK+VejKaX/hMllXjdy0UlxG25qpR8Xw5lzFjlfO0LHbPlfC3yxe9amUr9XcdT5hWzri3U9y/HsrxYqil+SqEcr2euMWuIJXqIdeiLX/wi7HY7HnzwQQDA+++/j5UrV6KhoQGTJ0/GW2+9ha997Wu4+uqrS5quN954A9dddx2+8pWv4MYbbxzX39i7dy9kWS5swihNQ9Nk/PBX72N3vyftte52N2647BwMD57SIGVUSueff/6E/wZjtvKxvNCPQsQswLglfarEsoYxS3RWucQ445aovDBmS6dcynHSP8YtaYllWf4Ys/rDfExqGLc0ESxjSo8xS6Sd8ZZ5eo9bluVEqXKNWV3vKHrgwAFs3Lgx+e+XXnoJRqMRL7zwApqamvDlL38ZTz/9dEknip44cQJ33XUXli5diuuvv35Cf8tisWDu3Lmq7xNFEUeOHMHs2bPhcDgm9JnV5rQ3jN39b2Z8raffg01rFmL+/OaCfibvV+XKNWYLhXnprFJcCy3Ki/FgvshPqeO2UHif81cu10xPZY0er1m5xmy50mMeKHfFiHG93yfGrf7vUSXhtZ44s9mMcDjMa5hFoctx5tnSqtTrzbo2d5WaB/JVyudOXvN0WsVspd0LPfWfKKm0616tWNfmpxLyfbmUMWNVwrUvBIvFgunTp1fNtaim+87vWhx6KPPG1rWF+P56+F56Uk3xUwqVfD11PVHU5/OhoaEh+e/f/e53uOiii9DU1AQAuOiii7Br166Spcfr9eKmm25CQ0MD7r//fhiNxgn9PYPBkNd2zQ6Ho6DbO1cD0TOo/HowDKezriifzftVefKN2UJhXjqrmNdCy/JiPJgvcqNV3BYK73P+9H7N9FjW6OmalXvMlis95YFyV8wY1+t9Ytyepdd7VIl4rcfPYIgfu8VrmFmxynFe79KqtOvNujZ/lZYH8qXFc2e1X/PRtI7ZSrkXeuw/UVIp171aaR235aqc8325lTFjlfO1LwSDwZCctFNN14LftTKV4rvqoczLVtdO5Pvr4XvpUTXFTylU4vWc2EzHInO73Th06BAA4NSpU9i3bx8uuuii5OuBQGDCkzVzJUkSNm/eDJ/Ph8ceewy1tbUl+VyaGJfDMqHXiah6sLwgolJgWUNU2RjjRETljeU4EVUClmVUCZiPiaiYWMYQUTWp1DKvUr8XUbHpeqLopz71KTz11FP4xje+gdtvvx1WqxWXXnpp8vW+vj6cc845RU9HOBzGl7/8ZRw+fBiPPfYYWlpaiv6ZVBj1NTZ0d7gzvtbd4UZ9ja3EKSIivWJ5QUSlwLKGqLIxxomIyhvLcSKqBCzLqBIwHxNRMbGMIaJqUqllXqV+L6Ji0/VE0S9/+cu49NJL8dJLL2FgYAD/+q//ikmTJgEA/H4/Xn755ZQdRovl61//Ov77v/8bt9xyC/x+P3bv3p38nyzLRf98Gr9apxVf2tCdVkF0d7hxx4Zu1DqtGqWMiPSG5QURlQLLGqLKxhgnIipvLMeJqBKwLKNKwHxMRMXEMoaIqkmllnmV+r2Iis2sdQKUuFwufOc738n4mtPpxK5du2C324uejj/84Q8AgG9+85tpr/3mN7/BjBkzip4GGj93gwN3X7sEI/4gAmIILocF9TU2VgxElIblBRGVAssaosrGGCciKm8sx4moErAso0rAfExExcQyhoiqSaWWeZX6vYiKSdcTRZUYjUbU1taW5LP+67/+qySfQ8VT67SyMiCinLC8IKJSYFlDVNkY40RE5Y3lOBFVApZlVAmYj4momFjGEFE1qdQyr1K/F1Gx6H6i6MjICH7+85/j2LFjGBkZQSwWS3ndYDDgX/7lXzRKHRERERERERERERERERERERERERGRful6ouirr76KO+64A6IooqamBnV1dWnvMRgMGqSMiIiIiIiIiIiIiIiIiIiIiIiIiEj/dD1R9Fvf+hbcbjfuv/9+dHR0aJ0cIiIiIiIiIiIiIiIiIiIiIiIiIqKyYtQ6AUqOHj2K6667jpNEiYiIiIiIiIiIiIiIiIiIiIiIiIjGQdcTRWfPno1AIKB1MoiIiIiIiIiIiIiIiIiIiIiIiIiIypKuJ4reeeed+MlPfoJjx45pnRQiIiIiIiIiIiIiIiIiIiIiIiIiorJj1joBSl577TU0NTXhc5/7HC688EJMnToVJpMp7X3/8A//oEHqiIiIiIiIiIiIiIiIiIiIiIiIiIj0TdcTRZ966qnk///tb3+b8T0Gg4ETRYmIiIiIiIiIiIiIiIiIiIiIiIiIMtD1RNEDBw5onQQiIiIiIiIiIiIiIiIiIiIiIiIiorJl1DoBRERERERERERERERERERERERERERUHLreUTTh/fffx65du/DBBx8AAKZNm4bly5fjnHPO0ThlRERERERERERERERERERERERERET6pfuJot/85jfx5JNPIhqNpvzcaDTihhtuwFe+8hWNUkZEREREREREREREREREREREREREpG+6nij6xBNP4Ic//CE+/elP44tf/CLmzJkDADh06BB++MMf4oc//CFaWlpw4403aptQIiIiIiIiIiIiIiIiIiIiIiIiIiId0vVE0W3btuGSSy7B9773vZSfd3V14bvf/S6CwSCefvppThQlIiIiIiIiIiIiIiIiIiIiIiIiIsrAqHUClBw/fhwXX3xx1tcvvvhiHD9+vIQpIiIiIiIiIiIiIiIiIiIiIiIiIiIqH7qeKNrc3IwDBw5kff3AgQNoamoqYYqIiIiIiIiIiIiIiIiIiIiIiIiIiMqHrieKfuYzn8H27dvx6KOPQhCE5M8FQcCjjz6K7du343Of+5yGKSQiIiIiIiIiIiIiIiIiIiIiIiIi0i+z1glQcuedd2L//v34t3/7N/zHf/wHJk+eDAA4deoUwuEwli5dijvuuEPjVBIRERERERERERERERERERERERER6ZOuJ4o6HA786Ec/ws6dO7Fr1y588MEHAICLL74YH//4x3HJJZfAYDBonEoiIiIiIiIiIiIiIiIiIiIiIiIiIn3S9UTRhBUrVmDFihVaJ4OIiIiIiIiIiIiIiIiIiIiIiIiIqKwYtU4AEREREREREREREREREREREREREREVh652FL3kkktgNBrxy1/+EhaLJaej5Q0GA3bu3FmiFBIRERERERERERERERERERERERERlQ9dTRT9i7/4CxgMBhiNxpR/ExERERERERERERERERERERERERFR/nQ1UfSb3/ym4r+JiIiIiIiIiIiIiIiIiIiIiIiIiCh3Rq0ToOTFF1/EsWPHsr5+/PhxvPjii6VLEBERERERERERERERERERERERERFRGdH1RNG/+7u/Q09PT9bXe3t78Xd/93clTBERERERERERERERERGLrwh4AAEAAElEQVQRERERERERUfnQ9UTRWCym+LogCDCZTCVKDRERERERERERERERERERERERERFReTFrnYCxDhw4gAMHDiT//cYbbyASiaS9z+v14umnn8a5555byuQREREREREREREREREREREREREREZUN3U0U3blzJ7Zu3QoAMBgMeOaZZ/DMM89kfG9dXR2+9a1vlTJ5RERERERERERERERERERERERERERlQ3cTRTds2IBPfOITiMViuOqqq3DHHXdg+fLlKe8xGAxwOByYOXMmzGbdfQUiIiIiIiIiIiIiIiIiIiIiIiIiIl3Q3SzLyZMnY/LkyQCAJ598EnPnzkVTU5PGqaJy5xNkjPiDCIghuBwW1NfYUOu0ap2sssRrSaXmE2QMecOw1s/AgDeMCOSKynOMKaLiGPCK8AVkBMQwXA4zal1WNNc5tE4W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Dj6fD/X19fD5fIhEImhsbCzZzF1RFPG73/0umS6/34+XX34ZAPAXf/EXaGpqKkk69MLlsEzo9VJqrnOwk62Aap1WFug6UE4xOBGJ+BUEAfv378f8+fMrbsUGERWenuuqaim/q1Uh7q+e828xuRuccDek/mwKXJqkhYiICodtn3TVWtcT6Y0W5RPjn0hbldguGc/4F8siKoZyii/GQOUrp/xYDRhz+sF7kd14yg1ezzheh/Jj1DoBSr797W/D7/dj27ZtePnllxGLxfDd734XPT09+Ju/+RvY7XY8/vjjJUnLwMAA7rzzTtx55534n//5H3z44YfJfx88eLAkadCT+hobujvcGV/r7nCjvsZW4hQRVRfGIBFReWL5Xdl4f4mIiFKxbiQivWL5RFR9GPdExcP4Ij1hfiSifLHcoGqi64mir732Gj7/+c+js7MTRuPZpFqtVmzatAkXXHBByY6dnzFjBvr6+jL+b+nSpSVJg57UOq340obutMKyu8ONOzZ0c8Y4UZExBomIyhPL78rG+0tERJSKdSMR6RXLJ6Lqw7gnKh7GF+kJ8yMR5YvlBlUTXR89L0kSpk+fDgCoqamBwWCAz+dLvt7d3Y1vfetbWiWv6rkbHLj72iUY8QcREENwOSyor7GxkCQqEcYgEVF5Yvld2Xh/iYiIUrFuJCK9YvlEVH0Y90TFw/giPWF+JKJ8sdygaqHriaJTp07FyZMnAQBmsxktLS3YvXs3LrvsMgDAO++8A5uNW/xqqdZpZcFIpCHGIBFReWL5Xdl4f4mIiFKxbiQivWL5RFR9GPdExcP4Ij1hfiSifLHcoGqg64miF1xwAX7zm99gy5YtAIC1a9fi0UcfhdfrRTQaxY4dO7BmzRqNU0lEREREREREREREREREREREREREpE+6nih68803Y+/evZBlGVarFbfccgtOnTqFV155BUajEStXrsTf/d3faZ1MIiIiIiIiIiIiIiIiIiIiIiIiIiJd0vVE0WnTpmHatGnJf9tsNvzzP/8z/vmf/1nDVBERERERERERERERERERERERERERlQddTxTNRpZlhMNhOJ1OrZNCVHV8gowRfxABMQSXw4L6GhtqnVatk0VUMMzjRJWBsUxUfhi3REREcawTicoLY5aItMLyh4hxQNkxbxBRJWLZRhOl64mi//mf/4ne3l78/d//ffJnW7du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Bmz32iBK2v1ubb9vR5evDfmnR41yy3IcolTbxEVZ9tb9uQDQ5sl+9ltvvYV4PF7z79fL5XLh7LPPRjweq+o7x2Oxwn/Poty1fnY+tY73kSNHEJvxnfKpHbMA236t8Hhry0jHm31kfRipDrSKZjnmzRCzzXIuzIbHXT/NELdmxXqvHzMfe7Vj9vXXXwdgzmNRKzOf91rxuxpLI3OtGb6/2fCYqsuMx7PamLVkct+ONDUyMoJMJgOHw6F3UYianhqdGMYskXbUuvBg3BJpgzFLZD6MWyJzYcwSmQ/jlshcGLNE5sO4JTIXxiyR+TBuicyFE0WJiIiIiIiIiIiIiIiIiIiIiIiIiFqcVe8CEBERERERERERERERERERERERERFRY3CiKBERERERERERERERERERERERERFRk+JEUSIiIiIiIiIiIiIiIiIiIiIiIiKiJsWJokRERERERERERERERERERERERERETYoTRYmIiIiIiIiIiIiIiIiIiIiIiIiImhQnihIRERERERERERERERERERERERERNSlOFCUiIiIiIiIiIiIiIiIiIiIiIiIialKcKEpERERERERERERERERERERERERE1KQ4UZSIiIiIiIiIiIiIiIiIiIiIiIiIqElxoigRERERERERERERERERERERERERUZPiRFEiIiIiIiIiIiIiIiIiIiIiIiIioibFiaJERERERERERERERERERERERERERE2KE0WJiIiIiIiIiIiIiIiIiIiIiIiIiJoUJ4oSERERERERERERERERERERERERETUpThQlIiIiIiIiIiIiIiIiIiIiIiIiImpSnChKRERERERERERERERERERERERERNSkOFGUiIiIiIiIiIiIiIiIiIiIiIiIiKhJcaKoTsbGxjA2NqZ3MYioSoxZIvNh3BKZC2OWyHwYt0TmwpglMh/GLZG5MGaJzIdxS2QujFki82HcEhkLJ4rqRJZlyLJc1Xvj8Tj+4z/+A/F4vMGlIjXwfDWnWmJWLaxLZ/BYnMFjUT094lYtPM+14zGrndGOmZlj1qyMVgeoNCOfJ8ZtlpHPUbPhsZ4dWZZ5DDXG462tZjzezLW1acY6YHQ85oX0jFmeC33wuJsfc23tWO/1w2N/JmZb6VjwuzanVvqupXJtK31/rfCYqquZjycnippAKpUq+C8ZG88XqYV16QweizN4LFoDz3PteMxqx2NGrAPmwPNkfDxH2uGxVg+PoTZYZ7XF402sA9rjMTcOngt98LhTK2K91w+P/RmtdCz4XZtTK33XUlr9+zcCj6m6mvl4cqIoEREREREREREREREREREREREREVGT4kRRIiIiIiIiIiIiIiIiIiIiIiIiIqImxYmiRERERERERERERERERERERERERERNihNFiYiIiIiIiIiIiIiIiIiIiIiIiIialF3vAhBRVliUEYrEEZUS8AoOtPtc8HuceheLqOUwFolIC2xrSA2sR2QGrKdERESkJvYtiJoLY5pIe4w7ItIS2xwyC9ZVahWcKEpkAMFJCbt2j2BkLDj9s+GBAG7fMoxAh6BjyYhaC2ORiLTAtobUwHpEZsB6SkRERGpi34KouTCmibTHuCMiLbHNIbNgXaVWwq3niXQWFuWipAMAI2NB7No9grAo61QyotbCWCQiLbCtITWwHpEZsJ4SERGRmti3IGoujGki7THuiEhLbHPILFhXqdVwoiiRzkKReFHSyRkZCyIUiWtcIqLWxFgkIi2wrSE1sB6RGbCeEhERkZrYtyBqLoxpIu0x7ohIS2xzyCxYV6nVcKIokc6iUmJWrxOROhiLRKQFtjWkBtYjMgPWUyIiIlIT+xZEzYUxTaQ9xh0RaYltDpkF6yq1Gk4UJdKZV3DM6nUiUgdjkYi0wLaG1MB6RGbAekpERERqYt+CqLkwpom0x7gjIi2xzSGzYF2lVsOJokQ6a/e5MDwQKPna8EAA7T6XxiUiak2MRSLSAtsaUgPrEZkB6ykRERGpiX0LoubCmCbSHuOOiLTENofMgnWVWg0nihLpzO9x4vYtw0XJZ3gggDu2DMPvcepUMqLWwlgkIi2wrSE1sB6RGbCeEhERkZrYtyBqLoxpIu0x7ohIS2xzyCxYV6nV2PUuABEBgQ4BO7euQSgSR1RKwCs40O5zMekQaYyxSERaYFtDamA9IjNgPSUiIiI1sW9B1FwY00TaY9wRkZbY5pBZsK5SK+FEUSKD8HucTDREBsBYJCItsK0hNbAekRmwnhIREZGa2Lcgai6MaSLtMe6ISEtsc8gsWFepVXDreSIiIiIiIiIiIiIiIiIiIiIiIiKiJsWJokRERERERERERERERERERERERERETYoTRYmIiIiIiIiIiIiIiIiIiIiIiIiImhQnihIRERERERERERERERERERERERERNSlOFCUiIiIiIiIiIiIiIiIiIiIiIiIialKcKEpERERERERERERERERERERERERE1KQ4UZSIiIiIiIiIiIiIiIiIiIiIiIiIqElxoigRERERERERERERERERERERERERUZPiRFEiIiIiIiIiIiIiIiIiIiIiIiIioibFiaJERERERERERERERERERERERERERE2KE0WJiIiIiIiIiIiIiIiIiIiIiIiIiJoUJ4oSERERERERERERERERERERERERETUpu94FMIN/+Id/wJ49e/Daa69hamoKixYtwuc+9zlcc801sFgsehePiIiIiIiIiIiIiIiIiIiIiIiIiKgkThStwo9//GMsWLAAX//619HZ2Yl/+7d/w5//+Z/jvffew2233aZ38YiIiIiIiIiIiIiIiIiIiIiIiIiISuJE0Srcf//96Orqmv73Bz7wAUxOTuJHP/oRtm/fDqvVqmPpiIiIiIiIiIiIiIiIiIiIiIiIiIhK4wzHKuRPEs1Zvnw5IpEIRFHUoURERERERERERERERERERERERERERJVxomid/uM//gO9vb3w+Xx6F4WIiIiIiIiIiIiIiIiIiIiIiIiIqCRuPV+HV199Fc8++yz+9E//dFZ/J5PJVLUiqSRJBf+l6sSTQFhMQowl4HU74PPY4dKgxvN8GY/H41Hl71Qbs2phXcqKJ4GpqAxn+0IEQwm0JUVNYtmoWqFeqBWzgPZxq5ZWOM9qM9Mx06uPMpNax4wxa15miptqGCW21NaI89Tqcat2XWm2WDKyVj3Wascs0HrHUC+tWmf1YqTj3eq5Vi/11oFm7UdqwUhxNxvNELNGOxetEldGO+6tpBni1ox4v0ZfZm5z1I7Zao9FM+QjM5/3WvG7Gksjc60Zvr/ZmOGYmqlNNsPxnKnamLVkciPEVJX33nsP1157LZYuXYof/vCHsFrrW5R1//79kGVZ5dIRAFitVnT3no0HfzaGvYeD6O0S8LXPXwiHzYqolIBPcMDtsmPi5Fu88GsRF1xwwaz/BmNWe263G91zF0GKpyDGkhBcdtisFrz5ziTOXejDqXePIZ1O611MagA1YhZg3JLxWK1WzJl7Nl5/J4pzz+pAMplBNJaAV3BAMHHfhDFLerLb7eiZtxAWmxti7P0BBsEBu82C19+exLkLvDj1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HYXStyNdDQ4OolAowOPxGF0UItvTohPDmCXSj1YDD8YtkT4Ys0TWw7glshbGLJH1MG6JrIUxS2Q9jFsia2HMElkP45bIWrhRlIiIiIiIiIiIiIiIiIiIiIiIiIioxTmNLgARERERERERERERERERERERERERETUHN4oSEREREREREREREREREREREREREdkUN4oSEREREREREREREREREREREREREdkUN4oSEREREREREREREREREREREREREdkUN4oSEREREREREREREREREREREREREdkUN4oSEREREREREREREREREREREREREdkUN4oSEREREREREREREREREREREREREdkUN4oSEREREREREREREREREREREREREdkUN4oSEREREREREREREREREREREREREdkUN4oSEREREREREREREREREREREREREdkUN4oSEREREREREREREREREREREREREdkUN4oSEREREREREREREREREREREREREdkUN4oSEREREREREREREREREREREREREdkUN4oSEREREREREREREREREREREREREdkUN4oSEREREREREREREREREREREREREdkUN4oSEREREREREREREREREREREREREdkUN4oSEREREREREREREREREREREREREdkUN4oa5MSJEzhx4oTRxSCiGjFmiayHcUtkLYxZIuth3BJZC2OWyHoYt0TWwpglsh7GLZG1MGaJrIdxS2Qu3ChqEFmWIctyTb+bTqfxv//3/0Y6nW5yqUgLPF/2VE/MaoV16SIei4t4LGpnRNxqhee5fjxm9TPbMbNyzFqV2eoAVWbm88S4LTLzObIbHuvGyLLMY6gzHm992fF4M9fWx451wOx4zGczMmZ5LozB4259zLX1Y703Do/9xZhtpWPB72pPrfRdK+XaVvr+euEx1Zadjyc3ilpALpeb9b9kbjxfpBXWpYt4LC7isWgNPM/14zGrH48ZsQ5YA8+T+fEc6YfHWjs8hvpgndUXjzexDuiPx9w8eC6MweNOrYj13jg89he10rHgd7WnVvqulbT6928GHlNt2fl4cqMoEREREREREREREREREREREREREZFNcaMoEREREREREREREREREREREREREZFNcaMoEREREREREREREREREREREREREZFNcaMoERERERERERERERER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I3Yq2W+xeK5WHs/qcgFIxkjqYuJ8qtnWNnN91qiYp8ZqxvwsNWan5ULRK6+8EldeeWVd05AqSKUUKJPJVNU7m5KxeLxaUzkxa+R3siwlMS+OYl6Urh5xaxQe5/Ixz8rXaHnWzDHbrBqtDFBujXycGLdJjXyMWg3zempSscqT4LXDMltbrZjfbGvL04ploNExzzPVM2Z5LOqD+d782NaWj+W+fpj3R2PVbDYXzItIJIKtW7diaL4JmO82MAXJ/Q4eCwwe2wz7BbZu3Wro/oBq5m9SNdLcqGKx3I+Vr2Yep/K3Vm1frraW9ZnxmKfGauX8NCWMvNRhGvjYxz6Gs846C1/72tfqnRQiIiIiIiIiIiIiIiIiIiIiIiIiooKm5R1Fy/XBBx+kV9UrioJ3330Xv/71rwEAn/jEJ+qZNCIiIiIiIiIiIiIiIiIiIiIiIiKivHhH0RI8/fTT+MpXvpLzve3bt9c4NUREREREREREREREREREREREREREpeFCUSIiIiIiIiIiIiIiIiIiIiIiIiKiFmWudwKIiIiIiIiIiIiIiIiIiIiIiIiIiKg6uFCUiIiIiIiIiIiIiIiIiIiIiIiIiKhFcaEoEREREREREREREREREREREREREVGL4kJRIiIiIiIiIiIiIiIiIiIiIiIiIqIWxYWiREREREREREREREREREREREREREQtigtFiYiIiIiIiIiIiIiIiIiIiIiIiIhaFBeKEhERERERERERERERERERERERERG1KC4UJSIiIiIiIiIiIiIiIiIiIiIiIiJqUVwoSkRERERERERERERERERERERERETUorhQlIiIiIiIiIiIiIiIiIiIiIiIiIioRXGhKBERERERERERERERERERERERERFRi2qohaK/+tWvcOONN2LFihUYHBzEJZdcgieffBKJRCK9zTXXXIO+vr6s/955552MfQWDQdx111045ZRTMDQ0hFtvvRWHDh3K+s5XX30Vq1atQn9/Pz760Y/i4Ycfzvg+AEgkEnj44Ydx1llnob+/H6tWrcJrr71WlTwgIiIiIiIiIiIiIiIiIiIiIiIiIjKKKTF5VWQdrVq1CnPnzsU555yDjo4O/PGPf8Sjjz6Km2++GbfccguA5EJRXddx5513Znx26dKlsNls6b9Xr16Nt99+G3feeSdsNhu+973vwWw246mnnoLVagUA7N27F5deeilOP/10/N3f/R22b9+Ob3/727j99tuxevXq9L4efvhh3HPPPfjSl76Evr4+/PjHP8Yf//hH/PznP8e8efNqkDNEREREREREREREREREREREREREROWz1jsBEz344IPo7OxM/33aaadhfHwcjz/+OG666SaYzckboHo8HgwODubdz/DwMP7whz9g/fr1OOOMMwAACxcuxAUXXIDnn38eF1xwAQBg/fr16OjowHe+8x2IoojTTjsNo6OjeOihh3DNNddAFEVEo1GsW7cO1113Ha699loAwEknnYRPfOITWL9+Pb7+9a9XJS+IiIiIiIiIiIiIiIiIiIiIiIiIiKaqoR49P3GRaMrSpUsRCoUgy3LJ+9m0aRM8Hg9OP/309Gs9PT1YunQpNm3alLHd2WefDVEU069dcMEFCAQCGB4eBpB8NH0oFML555+f3kYURZx77rkZ+yrX9u3bsX379oo/T0S1xZglaj6MW6Lmwpglaj6MW6Lmwpglaj6MW6Lmwpglaj6MW6Lmwpglaj6MW6LG0lALRXP561//ipkzZ8LlcqVf+9Of/oTBwUEsX74cn/70p/HnP/854zO7du3CwoULYTKZMl7v6enBrl27AACyLGP//v3o6enJ2sZkMqW3S/07ebtFixZh3759iEQiFf0uVVWhqmpJ20ajUfz1r39FNBqt6Luotni8WlM5MWsUlqWjmBdHMS9KV4+4NQqPc/mYZ+VrtDxr5phtVo1WBii3Rj5OjNukRj5GrYZ5PTWqqjIPa4z5XVutmN9sa8vTimWg0THPM9UzZnks6oP53vzY1paP5b5+mPdHY3Y65QV/a2uaTr81V1s7nX5/rTBPjdXK+dlQj56f7C9/+Quee+453HnnnenXPvShD+GSSy7BggULcOjQIaxfvx6f+9zn8MMf/hBDQ0MAgEAgALfbnbW/trY2vP766wCAYDAIIPkY+4lEUYQkSfD7/el9iaIIm82WsZ3H40EikYDf74fdbq/o9yUSiZLulKooCgAgFAohFotV9F1UOzxejcfhcBiyn1Jj1igsS0cxL46aDnlhVMwCtY9bo0yH42w05ln5jMozxmzzYtw0h2ocJ8atsRhLtTNd89romAWmXx7Wy3Qts/XSSPnNtrY+GqkMTBetkuetELOtciyaDfO9flohbpsVy339NHPeGx2zoVAIQHPm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RERERETUorhQlIiIiIiIiIiIiIiIiIiIiIiIiIioRXGhKBERERERERERERERERERERERERFRi+JCUSIiIiIiIiIiIiIiIiIiIiIiIiKiFsWFokRERERERERERERERERERERERERELYoLRYmIiIiIiIiIiIiIiIiIiIiIiIiIWpS13gkgouYWlFX4Q1GEFQ1OSUCbywa3Q6x3sogqxjJNVDnGDxFR5ViHEjU2xii1EpZnImoGrKuo1bGME1EjYF1UfcxjIiJqJFwoSkQV840ruHfDMIa3+9KvDfV58YWrhuBtl+qYMqLKsEwTVY7xQ0RUuUJ1qJPzxkR1x34OtRKWZyJqBqyrqNWxjBNRI2BdVH3MYyIiajR89DwRVSQoq1kdWwAY3u7DvRuGEZTVOqWMqDIs00SVY/wQEVWuWB0a1euUMCICwH4OtRaWZyJqBqyrqNWxjBNRI2BdVH3MYyIiakRcKEpEFfGHolkd25Th7T74Q9Eap4hoalimiSrH+CEiqlyxOjQoc6UoUT2xn0OthOWZiJoB6ypqdSzjRNQIWBdVH/OYiIgaEReKElFFwoo2pfeJGg3LNFHlGD9ERJUrVkfKES4UJaon9nOolbA8E1EzYF1FrY5lnIgaAeui6mMeExFRI+JCUSKqiFMSpvQ+UaNhmSaqHOOHiKhyxepIh91ao5QQUS7s51ArYXkmombAuopaHcs4ETUC1kXVxzwmIqJGxIWiRFSRNpcNQ33enO8N9XnR5rLVOEVEU8MyTVQ5xg8RUeWK1aFuBxeKEtUT+znUSlieiagZsK6iVscyTkSNgHVR9TGPiYioEXGhKBFVxO0Q8YWrhrI6uEN9Xtx61RDcDrFOKSOqDMs0UeUYP0RElStWh9q4TpSortjPoVbC8kxEzYB1FbU6lnEiagSsi6qPeUxERI2Ip5yIqGLedgl3fPpk+ENRhBUNTklAm8vGji01LZZposoxfoiIKleoDpVlud7JI5r22M+hVsLyTETNgHUVtTqWcSJqBKyLqo95TEREjYYLRYloStwOkZ1Zaiks00SVY/wQEVWOdShRY2OMUitheSaiZsC6ilodyzgRNQLWRdXHPCYiokbCR88TEREREREREREREREREREREREREbUoLhQlIiIiIiIiIiIiIiIiIiIiIiIiImpRXChKRERERERERERERERERERERERERNSiuFCUiIiIiIiIiIiIiIiIiIiIiIiIiKhFNdRC0V/96le48cYbsWLFCgwODuKSSy7Bk08+iUQikbHdz372M3z84x/H8uXLcfHFF+O//uu/svYVDAZx11134ZRTTsHQ0BBuvfVWHDp0KGu7V199FatWrUJ/fz8++tGP4uGHH876vkQigYcffhhnnXUW+vv7sWrVKrz22muG/nYiIiIiIiIiIiIiIiIiIiIiIiIiIqNZ652Aif7t3/4Nc+fOxZe//GV0dHTgj3/8I/7xH/8RBw4cwC233AIA+OUvf4l//Md/xA033IAPf/jDeO6553DLLbfgxz/+MQYHB9P7uu222/D222/j61//Omw2G773ve9hzZo1eOqpp2C1Jn/23r17sXr1apx++um47bbbsH37dnz729+GxWLB6tWr0/t65JFHcM899+BLX/oS+vr68OMf/xjXXXcdfv7zn2PevHk1zSOi6WokoCAYVhFWdDglK9xOEV0eqd7JohbEskbUGoKyipCsQonGEFF1uCQRHR4b3A6x3kkjIjIc+y+NhW0QETUSthFEpWH7TURUPeyPkFFYlqhcLDNERESZGmqh6IMPPojOzs7036eddhrGx8fx+OOP46abboLZbMY999yDT37yk7jtttsAAB/+8IexY8cO3H///XjkkUcAAMPDw/jDH/6A9evX44wzzgAALFy4EBdccAGef/55XHDBBQCA9evXo6OjA9/5zncgiiJOO+00jI6O4qGHHsI111wDURQRjUaxbt06XHfddbj22msBACeddBI+8YlPYP369fj6179es/whmq4OjITx8DNbcdyx7Rjq9SIka4jHASWiw2IyweUUOWlLhvCNhBGK6gCSd5NOJIBASEVci8Pb5axz6oioVL5xBboeQ0SNQY5ocEoCIpqOR57djmsuOB7edk4EEVHzGwkoUNVkXRdWNDjsAuSIhm/9+58wf3YbbrlyALPYf6k537gCWVGhxxOIRGOQbFaYTcB7B/zwdrrYBhFRTR0cCeP1XSOYP8sDAOm5lINaGDPZRhCl+cYVyBEVFrMZJgDxeAJ6LI53DwQwo9PJ9puIaAoOjYRxaFyBw25Nz7lHIjoOaWHMYH+EynBoJIyD4zIkm4D4kbIkKxpkRUO7287zhJTlwEgY4YiGSDQGh92KWCyBA74wNC3OOTMiIpq2Gmqh6MRFoilLly7Fhg0bIMsyxsbGsGfPHtxxxx0Z21xwwQX4l3/5F6iqClEUsWnTJng8Hpx++unpbXp6erB06VJs2rQpvVB006ZNOPfccyGKYsa+1q1bh+HhYZx66ql49dVXEQqFcP7556e3EUUR5557Ln77298anQVENMlIQMHDz2zF+X+zABt/vws/+c329HsDi71YdU4vRgMRzOjipC1NzUhAgRZPYP3GN7B5py/9+sBiL266oh8jAYVXGRI1gagOaHoMDzy5JSuWb7yiHz987g2subSfE4dE1NQOjYQR1eNY98zWrLru/9x4Ov7Xgy/jvp9txu1/O8T+Sw1FdSAkq3j8F29geEfmcVl1Ti+iqo6grLINIqKaGAkoOOxX8NKr7+eskxKJBGZ1u+qYQqLGEJRVyIoKs9mMh57O7lutvWw5228iogqNBBRE9Th++tsdOevXg4fDmNnNxVpUXKosPfHbnVllac2lJ+CBJ1/DdRcv53lCStt/OIT7c5wjuPjMHjz9zFZ8/tLlmM36h4iIpqGGWiiay1//+lfMnDkTLpcLf/3rXwEk7w460aJFi6BpGt577z0sWrQIu3btwsKFC2EymTK26+npwa5duwAAsixj//796OnpydrGZDJh165dOPXUU9PbT95u0aJF+Pd//3dEIhHY7faKflsikYAsy0W3UxQl419qbDxexgqGNCyc24aNv9+F1yac2ACQ7tyfMTAH7/tCOGXZDNhy1GoOh8OQtJQas0ZhWTqqFnmhaQk88FTmoBFIlrMHntqCW64cqOnxz2c6lAujYhaofdwaZTocZ6MpigKz2YyolshaJAokY/nBp7bgM59cirFABBbodUpp4zCqnDFmmxfrmuYw+TjJKnBwXM46OQIk67qHn30dt1w1hP/fY/+DYEiFZE1k7ZNxa6xUGyRH4lmLRIHMccvgYi/boCmYrqjJStYAAQAASURBVPWW0TELTL88rJd6ltlIJIaf/nZHwbmUk61mtNLat0aqI9jW1kclZSAYjiMoq/hpnr7Vume24uaVA2y/82ikuJuKVojZVjkWzYb5XpiqZl/gCBytXz917mJYrKaK+iOtELfNqh7lvlBZeuTZ13HRmT24d8Mwbv/UYM7zhK2imesco2O2UF7IKrIWiQJHx0J98zvw4NObcetVg00xHmrm414u/tbGUs22thl+f7NhnhqrGfOz1Jht6K7S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2rVrsXbt2pLSR0TG87ZLOPWE2fCHoggrGiSbBW0uGzvxZKjUwNEfiiIWi8MuJk+gsZwRNRdvhwN2mwp/KIp4PA6nJODUmbMZy0TUUrztEv7+Uyem+8cdTpH94wYwo8MByWZNHxdvh8TjQkR14W2XcNPKwaPthMfG+ogoD847EhFVB8etZLSZnQ447EfH3HO9Tty0cpBlinJyO5IXUgdlNV1mzhyciwvP6GGZISKiaauhFooSERWS6tATVRPLGVFrYCwT0XTAuq4x8bgQUaNgfURUOsYLEVF1sH4lo7FMUblYZoiIiI4y1zsBRERERERERERERERERERERERERERUHVwoSkRERERERERERERERERERERERETUorhQlIiIiIiIiIiIiIiIiIiIiIiIiIioRXGhKBERERERERERERERERERERERERFRi+JCUSIiIiIiIiIiIiIiIiIiIiIiIiKiFsWFokRERERERERERERERERERERERERELYoLRYmIiIiIiIiIiIiIiIiIiIiIiIiIWhQXihIRERERERERERERERERERERERERtSguFCUiIiIiIiIiIiIiIiIiIiIiIiIialFcKEpERERERERERERERERERERERERE1KK4UJSIiIiIiIiIiIiIiIiIiIiIiIiIqEVxoSgRERERERERERERERERERERERERUYviQlEiIiIiIiIiIiIiIiIiIiIiIiIiohbFhaJERERERERERERERERERERERERERC2KC0WJiIiIiIiIiIiIiIiIiIiIiIiIiFoUF4oSEREREREREREREREREREREREREbUoLhQlIiIiIiIiIiIiIiIiIiIiIiIiImpRXChKRERERERERERERERERERERERERNSiuFCUiIiIiIiIiIiIiIiIiIiIiIiIiKhFcaEoEREREREREREREREREREREREREVGL4kJRIiIiIiIiIiIiIiIiIiIiIiIiIqIWxYWiREREREREREREREREREREREREREQtigtFiYiIiIiIiIiIiIiIiIiIiIiIiIhaFBeKEhERERERERERERERERERERERERG1KC4UJSIiIiIiIiIiIiIiIiIiIiIiIiJqUVwoSkRERERERERERERERERERERERETUorhQlIiIiIiIiIiIiIiIiIiIiIiIiIioRXGhKBERERERERERERERERERERERERFRi2qohaJ79+7F1772NVxyySVYtmwZLrzwwqxtrrnmGvT19WX9984772RsFwwGcdddd+GUU07B0NAQbr31Vhw6dChrf6+++ipWrVqF/v5+fPSjH8XDDz+MRCKRsU0ikcDDDz+Ms846C/39/Vi1ahVee+01Q387EREREREREREREREREREREREREZHRrPVOwEQ7d+7ESy+9hIGBAcTj8awFmyknnngi7rzzzozXjjnmmIy/b7vtNrz99tv4+te/DpvNhu9973tYs2YNnnrqKVityZ+9d+9erF69Gqeffjpuu+02bN++Hd/+9rdhsViwevXq9L4eeeQR3HPPPfjSl76Evr4+/PjHP8Z1112Hn//855g3b57BuUDVEJRV+ENRhBUNTklAm8sGt0Osd7KaTiofQ7IGu80Cs8kEi8UEj5P5SdUTlFWMBXSIbcdgJKAjBrWq5W0koCAYVhFWdDglK9xOEV0eqWrfR0TV0cixzH4JFcL+VuUYW1SqepaVoKwiJKtQojFEVB0uSUSHh2WViJpHo9RjuepyS01TQK1kKn2DRh57EtULx2ZJrB+oVUV1oN07H+8eUuByxKoe40FZRSAcRSyWQDyRQCQag8sxfesWKh3bo8bQKGNIIiJKaqiFoh/72MdwzjnnAAC+/OUv4/XXX8+5ncfjweDgYN79DA8P4w9/+APWr1+PM844AwCwcOFCXHDBBXj++edxwQUXAADWr1+Pjo4OfOc734EoijjttNMwOjqKhx56CNdccw1EUUQ0GsW6detw3XXX4dprrwUAnHTSSfjEJz6B9evX4+tf/7phv5+MdbTzp8LjtEHT4+n/3jsYgLfDCW+7MYPyiR1Nh82K9s4ZhuyrUTqtQVlFMKzisY2vY/6cNiyZ34ERfxxup4B2lw2PPLsF11xwvGH5SZRyaFSGHNWPxIMdZrMJowEFETWWLm/5YqaSWDpwOIzNb/vQ6bFD1eKQIxq27x3D4GIvZnY5a/GTicgA+WJ54DgvZnWXH8ul1Cel1jm+cQUj42G0uewQBQvGg1HoehxyRMfMTkfFv5lag29cwatvHUyXXVEwYzQQwfE9XTg8Lte1nBjVR61GXzcoqwjLGhRVT+/XYjLh/YN+dHe42EclAEcmpcNRmEzmjLJiggnDbx3E0p7ujLJSqKxOfs9pt8BsLv7AFt+4gqiq441dI+k4Dysatu0ZwYlLZrKsElHD840r8I2G8e6hELom1WNDvV7M6Cze1y7WFyilr+AbkzPm+TQ9jmBYhWAxpW8QQFQq35iMWCyRLku6HkcgFIUSVjGuqHBKAuw2K5SInlUuD46E8drOXGPPbjgdYt3ndInqwTeuYN3Tm9E7vwMfXjYbmh7HuweCkGxW2AQzLGZTRfFR6ViyHudbUudTtr5zmPPM1FJS8y8RTUdEN0GyWYEE8OpbB7Fswpi6nPF0sZj0jSvYtuswFs/rwOFgBCFZgyiY8edtB7F3vx9rLx/gWJpy8o0rODwuQ7IJ0GMJqNqRPl5Ex4wqza9Ws81p75yBwwEdim+0YdYPFDJ5ncahMSUdv3996xDjl4iojhpq5qyUEyul2LRpEzweD04//fT0az09PVi6dCk2bdqUXii6adMmnHvuuRDFo43oBRdcgHXr1mF4eBinnnoqXn31VYRCIZx//vnpbURRxLnnnovf/va3hqSXjOcbV3DvhmHs/sCP/3Pj6bj/yS3YvNOXfn9gsRc3XLYcQXnqdyZMfdfw9qP7H+r14pYrO+Eos5+Zc199XnzhqqG6dZRSCxb+5/UDOP9vFmDj73dhwws7MtJ3w2X9+OFzb2DNpf0N3Sml5nLgcAgPPLUFwzsyY3fVOb0QLRYEZRURNZYVM6cePxOfv2Q5Hnhqc1mx5BsNQ4nqeHnzvozvHOz1Yq7XBatg5hXfRA3ObDYjqCRw2K/gD5v34bUdmW3zsoVdODQaLukEdkopbXOp7XdQVqFpOtxOe86+yc0r+zG721XRb6fmF5RVHBoN5yy7x8xwYcvbh/HGrtG6lBOj+qjV6Ov6xhWoWgwPPpUdUzde0Q9N0w3p81Nz840r+OFzb+BT5y7B/U9uziorN13RDyWiIihb4HaIBcsqgJzvff7CvoJpCMoqYloMmhbP29+0ixaWVSJqWEFZxbZ3DmPeLA/+mKceM5lM8Hbknwwr1hcoqe89GkZUi+OhZ7Zm1edrL1uOGXMWGPirqdX5RsPQ4gk8kGd8tuO9Ucxod2Hj73dlvD/U58XNVwxA1eN5x55jky50JpoOgrKKdU9vxif/pgeiaMajG1/PObc74o9gRlfpN/KodCxZj/MtvnEFr7/tw4LZbZxnppbiG1cQjep4+NmtOeP68FgYdtGS85xNsfF0vpgMyip8o2HMm+nBA09vyWxv+7y45hNL8djGrbhp5SDH0pQhKKuIqjp+8pvtOctrPB7HLIPnV6vZ5oQiCfzb8+/htR2vGr7vakjlxbbdoznXaQz1ebH64hO4toCIqE6MWZlZY3/6058wODiI5cuX49Of/jT+/Oc/Z7y/a9cuLFy4ECaTKeP1np4e7Nq1CwAgyzL279+Pnp6erG1MJlN6u9S/k7dbtGgR9u3bh0gkYuhvo6kLymq6I3brqiE8/OzrGZ0PANi804eHntmKsKIZ9l0TDe/w4b4nNyMoq1Pf13Yf7t0wXNa+jJJKU6fHjuOObcfG3+/KGIil0vfQM1tw5dm9CISjNU8jtaaRgJK1SBRIxu4TL+zA5rcPI6xoOWNm/uw23PezzWXFUlBWocUTePw/3sj6ztd2+LDhhR2IRGMG/ToiqhZPezfkqI4nXtiR3V7t8GHdM8mJzIOj4ZL2V0rbXE77LSsaEglkLWgDkvXb/U9ugW9cLucnUwsJyyqe+G3usvvECztw6rJZ6XIyElBqli6j+qjV6OsGZRWqqueNqQef2oJEIhl7NH2lyt7FZy7CA3nKygNPbYE/nHwMVqGy+upbB/O+9+gvtiOq50+HrGiIm1CwvxkM137MR0RUqvFgBIvndxSsx0KKlrdNL9YXGAlkn1id+H6q7+3zK1mLRIFkfb7uma0YDWoF62OilIOjYRwck7MWiQJHx2cnL5mdtUgUSJbL4R0+PPzs1rxjz217xnDgcLguc7pE9eIPRdFzTDtG/Aqe+O2OvHO77x0K4dW3DpYUH5WOJetxviW1ULZvfifnmamlBGUVvrFw1iJR4Ghcv3swhGC4svF03vM2YRX7fGE8/h9v5Dw3+cNfb8MVH+O5ScoWVjQ8/Ez+8vrazsM4MFLaOYJSVLPNCcoq7ntyc84YqNf6gUIm5sXFKxbhR7/alrMv/cizr2PVuUsQZPwSEdVcQ91RtBQf+tCHcMkll2DBggU4dOgQ1q9fj8997nP44Q9/iKGh5NVIgUAAbrc767NtbW3px9kHg0EAycfYTySKIiRJgt/vT+9LFEXYbLaM7TweDxKJBPx+P+x2e0W/JZFIQJaLLwZQFCXjXypsLKCnO2JdbfaszkfK5p0+KFG9pGNQyndNNrzdh7FABBaUNjtt5L6MkkrTx09dgKHFXvzkN9vzpk+JxmAXLFPKz2pxlHtr1zxKjVmjTOfYD4b1rAFcyuadPlyyogdKNHfMLJnfkXHX24nyxVIwHEdI0fJ+5/AOH1Qt1hDlezqUC6NiFqh93BplOhxnoymKAlgkJBLImjRJSdUf9z+5Gbd/ahC2Ij3hUtrm1P8X2iZV5+ixOCJqrGDfJCRrcIq1KbNGlTPGrDEiWjx/O7Tdh+suTF4Et3mnD8GQCsmamPJ3llIGjOqjVqOvGwwXj6mIGoNdRFOXq2q0CdMpblNl73MXHl+wrFx74TI8+PQW3HBZf96y2umx5y/HO3wIhNW8bYseiyMcyd/HHd7hQ7RB+puNbLr2kYyOWWD65WG9tFKZjceBYLTwuPnaBPK26cX6AsGQWlLfWxKFgvX5dRctK1gf18p0amsbSakxF9WB+3+2GZ/55LKic8f53u9qsxcdez7xwg7cdEV/zed0a6lV6rlWiNlGOBYhWcXQYi8AFJ3bBfK3GRNVOpas1fmWifke1gTMn93WNPPMza4V4rZZjAV0SDahaFxH1PxxV3A8nScmI6qOuTNcBefLPv2JBGL69Dl+jVDXV8romC2UFxG1+DnGg6MybILJkHFDNducRlw/UMjE9BY6X7t5pw+HxxV426SM+G3mMl6uZvit1Wxrm+H3NxvmqbGaMT9LjdmmWyh66623Zvx91lln4cILL8QDDzyARx55pE6pqoymadi2bVvJ2+/Zs6d6iWkhYtsx6f+XI4U7RrKiY9v+tw35rlz8IQW+D96v+b6MkkqTKJihxwovRoiqMQgWU1llulZOOukkQ/ZTbswaZTrGvr1jQcH3VS2OsJI7vlUtXvCzuWKpfdYiRNXCV3IrER3btlVeXxitlcuFUTEL1C9ujdKox1kURXTPmo+onkBY0SHZrLAJZqiRIMZHDiIeLxyHVUtX2zEwm00Ft1G1OIa3+zA6LmPct7fo/grxh4oPDibWOe2zFiFcpG8SnmLfpBJTLWeMWWMUa/sm9mtDioaRCsuJ2WxGe+cM2B0eRDQrbO3zEYhaocbjiMh+jI8eyohho/qo1ejrlhJTckQHTMC2bbknJZuJkW3CdIrbVNkr9jQJJZKcyFbU/GWqWD8zEI7i8L53cr7XjP3NRtaofaRqMTJmdT1ZxqdbHuYiiiK8s+YjljAhosUQicbgkqyIa2HD+7StkN+ds48rXo9FdcTjes42vVhfIFSknk71vU0mS8Ht5IiORCKWtz6ulenU1hrBarWia8Yx0GEFEkACyfLkEM2Ia2H4x3xlxWSxmGv3zsfwDh9Wnl1sfJa/XBbrF6haPLnYVNWx/936lsdaaPZ6rpVitp7Hot07H6Xc2CwVP6WMAysdS9b6fMuePXsgth2DJfM7Sur3HxoHbFYTDh/cC1VtrLvBNYtWittaEkUR3TPnI6InEFY0uCQh+ch4OYCxPH3g5Jxr4SUFqhaHUuBuuZWct7F3LEA83rznJqupGdtdo2M2lQeT88JsNkNsO7bg51UtDlWLl3SOoBTVbHMacf1AIRPTWyzuQ7IGj1PEtm3ZN6pqxjJeqUb+rbVoaxv59zcr5qmxmik/S43ZplsoOpnD4cBHPvIR/OY3v0m/5vF4cODAgaxt/X4/2traACB9x9HUnUVTVFWFoijp7TweD1RVRTQazbiraCAQgMlkSm9XCUEQcNxxxxXdTlEU7NmzBwsWLIAkSRV/33RxOHB0gs9pFwpu65CsWDh7qSHflUubS0L3nNL2b+S+jJJK01t7x3DaCbMLbmu3WRHR4li6tLZprKVSY9Yo0zn2948VnhwTBTOcUu4mTBTMBT+bK5b2HFBgL3LZoN1mwYIGKN/TuVxUotZxa5RGP84BOY7Nbx9Gp8cOVYtDjmgYDUTQe2wHjpnfC6e98GLNalAUBePhBGAufOI4VUdocXPRNquUtrmYiXXO7gMKHPbCdY1TsqJnCn2TcjRiOWvWmDVCsbbPZjtatl2SUHE5CUcS0GMJbH7nMLqOxLAS1TEaiOD4ni4cM789I4aN6qNWo6+7p4SYkuxWRKOxpu6jNmKsTtTocZsqe06p8NhQOlKWokdObNlFCy5esQhL5ndA1eIQBTPa3bbkCbQ8J349Thu8ecrx7ibqbzayRo+HZmC1WqHrOvMQQEiOQ40nMOKPICRrEAUzXt1+CHv3+3H9pcvhMqBP20plds/BEuox0QLBKuRs04v1BVxF6ulU3ztWZLGA0y7AbLbmrY+bUaO3tUYIKgnI0WQZ8Y0rMCE5H7lx0ztYurATt6wcKCkmS425dw8lFx4XH5/lL5fF5p9S70fV5u6LFtNK9ZxR6hWzjXAsojqQCKhIFHkARio+ShkHVjqWrNX5lon5HtYEBA6G0O4uXLfYbBb4xhWMBiIYOG4hPI7C9QlV33Roa1MCchyvvZ09JzRwXDeOcbXlnNc9HNChxwov+Eqes6m83cwVk4f8OjS98PdOh3OTEzVCXd8IBEHA3Llzc+ZFKJIoehFaOecISlHNNqcR1w8UMjG9pfSX5YiecQymUxmfTr8VyG5rp9vvrwXmqbFaOT+bfqFoLj09PXjllVeQSCRgMh3t0O7evRu9vb0AkgtMZ8+ejV27dmV8dvfu3UgkEujp6UnvK/X6kiVL0tvt2rULc+bMqfix8wBgMpnKul2zJEmG3t65VTl1BQOLvdi80wer1YShPm/OW7IP9XkhiRbEYIXbIVb0XR1QC+6/w2OHo8R9G7kvo6TStHHTOzjrxGPS+TrZwGIvgATcDqGly2i5MWuU6Rj79lAsfzz0euEPRXHsLE/Obd7aO5a3rOaLJZdDR1SLFSzjNtHaUMdhOpaLStQrbo3SiMfZNy7DNx7B71/blxEvA4u9mNPtgskE2O1SxW3rVIwHRmC2egrG8lt7xwAArhLarFLa5tT/l9J+uxw6DozIBdMn1aGuaaRy1uwxOxX2UOF2SLRa0v/vdolwOMofmB4cDWNkXEEsDvwhTwxbLYDd7knHsFF91Gr0dV0OHfuLxNSIP4JZXY6WKFeNFKsTNXrcpsqeaLUULSsAYLWacerxM3HeqQuw8fe7Mh6RNdTrxddWfxj/tP6/sxaLDvV64XGKefPC5dChFulv2husv9nIGjUemkFqnmy656FvNAwtATz09Nas9vDiM3vw8LNb8fefOtGwPm0r5LdLKj5uNptNedv0Yn0Bt0ssqe8dCqsF0yAIZjjtlqbP74kava2dqoMjYRwaU7DhxR0Zj3IfWOzFHZ8+Gf/6o7/gvic3445Pn1xyTBaLOZcj2Y6P+COF54KE/P2HEX8Eg73enI+fzxh7Sq09X5rSCvWcUeods/U8Fg4AciSOqBYrGB+jgWTfe8mCzqLjwErHkrU+3yJJEkTJirFgFECiYN3yxy37seGFHRPm0iTM7HIalhYqX73jtlZS87r55oRmtNsRg5DV3nZARSAULRrXPce05Y270UCk7Jh06wr8wcJ9v+lwbjKX6d7umkym9KKdiXkRlFXc9+RfcP2lywueYxwPRnFgVMZHTzrGkHysZpvTiOsHCpmY3rf2juVNe6q/fObgnJzHYDqV8enyW/O1tdPl99cS89RYrZifU7pM7c9//jNGR0fzvj86Ooo///nPU/mKomRZxu9+9zssX748/dqKFSvg9/vxyiuvpF/bvXs33nzzTaxYsSJjuxdffBGadvSqkueeew4ejwdDQ0MAgBNPPBEulwu/+tWv0ttomobnn38+Y1/UOCJRHRef2YOhPi98owqu/FjvkcHCUQOLvbjyY72I6jEEwpU/1sPtEPGFq4Yw1Je5/6FeL25ZOVDWCYW8++rz4tarhuqy4CaVpqULO/HK6/uw6pzcebnqnF7s3R9Am8uWZ09E5bFazPlj9+xeLF/UjUQsljNm9u7345YrB8qKpQ6PHXv3BwqWcY+zcQZaRPWkqjE88cKOrMm5zTt9eOKFHYjHgeAU2tapCIwfhtNuxapzejHYmx3LF5/Zg42b3sFQn7ekNquUtrmc9rvTY8fv/vou1lx6Qs665sYr+uF0FL6TErUu+5Gym68dOjCaXBB5y5UD6PKUv0g0KKu4/2eb0eayFYxhj9OGsSMn7QDj+qjV6Ot2HImpGy5fnjPf1lx6An7313fR6an84j5qfqmy9877Y1h7Wf6yct+GYQz1eREIRfH5i5dj4+93ZcXJ8A4ffvbiDqy++ISM14f6vPj8RX0odKO9zhL6m272N4lqIiir0OMJrHt6S872cOPvd2H+7Db4Q9E6pbAxlTJudknZCwtSivUFujxSSX1vq8Wctz5fe9lyCGYUrI+psQRlFa8d6YdOXniSiseLVyzC8HZfRh91qtpcNgz1eXHfhuG847ObV/bj2z/6Cy4+syfn+93tUs73Bnszx54d7IvSNONxiTCbgVXn9GIox9zMqnN60XtsB05aMrOkcWClY8l6nG9xO0TM7nZiz7787WWqfgCOjsPDER1BmY+fp+orNq+rxxMI5SiLbocI0WopGNeDi70F+3MnLZlZdkx2eaT0XC/PTVIp/KEohrf7YDGZCp5jXDjXg737/YaVnWq2OW6HiFtWDmTFXj3XDxQyMS82bnoHqy/O3de++Mwe7P7Az7kwIqI6mNK02Wc+8xn8y7/8Cy666KKc7//3f/83vvjFL2Lbtm0l7U9RFLz00ksAgA8++AChUAi//vWvAQCnnHIKdu3ahUcffRTnnnsu5s6di0OHDuHxxx+Hz+fD97///fR+hoaGcMYZZ+Cuu+7CnXfeCZvNhu9+97vo6+vDeeedl95u9erV+MUvfoEvfvGLuPrqq7Fjxw6sX78et99+O0Qx2SjZbDasXbsW9957Lzo7O9Hb24uf/OQnGB8fx+rVqyvKN6qukKzhX3/0F/zLF85EPJ7Al+//Ay5esQiXrOhJPzLwrb1j+Kf1/40vf+ZD6PBMrRPobZdwx6dPhj8URVjRINms0BR/RY8om7wvpySgzWWraycvlaZAOHmC5MzBORl5OeKPwGwCBntnNFxnlJpXOKLhn9b/d97Y/ZdbzkBUi2PJAnfemCknltwOEQO9M3BoJIwzBjLL+GgggtndTpZvoiMiWiznFdxAclIxFk8gohZ+HEq1xOPxZPvbKeEjQ3Px2QuWYTQQgcmUvNvwv/7oL1i6sLOsCZRS2uZS22+3Q8R1Fy/HYxu34qIze3DthcugRHQ47FbYRQtsgoV1zTTW5ZGga/GsdmjEH0F3mx1aPIbb/3aookWiwJGJ0h0+RIvEcFSLZd0p0ag+qtF93VRM/fC5N7D2shOganHIER2S3YoRfwQ/ff4trL54OeOK4G2XYF8yE2FZxd9+vBerLz4eIVlLl5WvPvgyFs5tw/WXLsfBERmKqueNk+EdPlx9Xh++/w8fgabH4ZQEOO0W7HlnO7rb+/Kmgf1NosbhD0Wh6XEM57gbEpBsDy9Z0YNwkccVTjfF6rGZnQ54OwrfYaFYX6CkvnenAwcPh7Dq3MXp/rRktyIS1SBaTDi0fzfcixZVNS/IOGOBCDo99oL900tWJJ/4VewRouVIncC+d8Mwvvrgy7jlqqF0eXI5BDhsViAex9rL++FyCLj9b4egRPR0uRQFCx5+Zgs27zycnrtKJJIXhvxp24GKxp5ErcLtEBFRY0gkgBWDc3H1eX3QYwnYbVZYzCY47VY4ClxYkEulY8l6nG+Z0eHAwOJu+MaUdHtpF62IqHp6bmrimDs1l+YPRVlfUNWVMicE5D636e10IBaP543r1F1xi8VduTGZ2i/PTVIpUmM4RdULnmP8x9Wn4obLy7vhUzHVbHNcdhM+e948fP6SE6BE9YZYP1DIxLxQohpuuXIAB0dlhGQtfRx+/coeXH/Z8ornuomIqHJTWiiaSCQKvq+qKiwWS8n7GxkZwd///d9nvJb6+wc/+AFmzZoFTdPw3e9+F+Pj45AkCUNDQ/jGN76B/v7+jM9973vfw913342vfe1r0HUdZ5xxBr761a/Caj36k+fPn4/169fjW9/6Fq6//np0dnbi1ltvxXXXXZexrzVr1iCRSOCxxx7D6Ogoli5divXr12PevHkl/zaqHackIKLGEIsncHBERkSNZTwucKKIGoMSjeV8rxypuxoAybvcbvvgEGbP7JryvhrFxDSl7jIVUjTYRSuOmeGCqwHTTM1NicYKxq4cjcEpJevzfDFTbix52yXYRQs62+xHvl+HSxKwZEEnyzfRBJEi7WYkqsNsLv9iCSNJdgEnLOpGRNUxo0NCAsDJkoiPnnRMRRMopdQnpdY53nYJN60cTLelTkmAZLOwLSUAycnvDx1vRjCsIqzocEpW9BzTZsiEWXqitEgMK9EYpBy34TKqj5prP0FZzZhEtYkWyBENITmZB26nmDcPvO0S1lzaj0A4CsFqhtspIBKNYa7XiZtWDjKuKC1V9pwOEYFwFG0uEfFEAm1OEXfffAbaXDYEwlFE1FjRxWGjgShmdzvRN78TQHIMGI/Hi6ah0fqbQVlFSFYRVWMIR3RINivbJJoWwooGTS8cs6qWXAheTUFZRTCsIqLqUKIxuCQBLqfQ0CfKjKjHivUpSulzzOx2wSpaEAyrMJtNsFpMmO11QbIm8L7KO7I1k5CiQdWKxyMA2EVjbxWbOoGdGpuZTSZ0t9sz2sGZEz/gyfz833/qxIw+bHLBso6T+mZgxeDcnGPPVNurRGOIHDnJbzIBFosJHmfjnuwnKleqvbCLFijRGBKqDptgRofHPqULBSv5bD3Ot8zodEKyC+hss0OO6lAiOv5p/f/k3T4S1UsaT+QSlFWMBiLJC+FsVtgEM+x2a0P3J6h+SpkTKjSrO6vbBUG0IBhSEVI0CBYT3K7sOZtCcVdJTM7scuJvJMGQc5Nsi1tbagxX7Byj1WJGd7vx9WQ125zx0UNYurQLDoen+MYNYGJeBGUVMzoc8Dh1hBUdZwzMwcc/PB8zilxoSERE1VH27Mq+ffvwwQcfpP/etWtXzsfLBwIB/PSnP8WcOXNK3vcxxxyD7du3F9xm/fr1Je3L7Xbjm9/8Jr75zW8W3O7EE0/Ehg0bCm5jMpmwdu1arF27tqTvpvpKPTpoxB+ByyHALlpw8YpFWDK/I+OKoY2b3oEomNOLzag0jbiQlVqPU7IWjF2n3QqzyfiFaCzfRMUVO2FutZgg2evTtprNZoQjCcTiGhRVRyIBKFE9eXLCZoFgMTdEjLOuoUK6PFJVTuikYtdRJD6dditsYukX+02Vb1zBYxu34mMfmo9ZnQ5EtRj8IRUuSYAoWjAyHsFbe8Yw1OtN30ViMsYUlaNYeXE5InDaC7d1LkdykX81vr9WfKMyVD154iSixuCwWRFPJPD6rhHM7XbC2+mEtwonTYgagVMSii4UdTmEqj7C0jeuQImoAExIXYYfTyRw4HAYMTWOGd2527xG0Cj1WK4+kyzLdUoNVcouWiEKhS/QEAUzBhZ7K257C5lKeS73s75xBQdHwvjNf+/BRSsWQbJbEZTV5B1KrRb8+Ndv4oqP9bH9pZbRKO1FvaR+/559fjiKjC+sFlNFF6j4RsM4NKZAsluRSCSQmi4PySpiWhwz8oyhafoqVs6ckhUofI8odHkkSNYERva/jZ7ZS+Fw1KbdMqJO8Y0rODQSxsFRGYuOaYfNZkleyG+3QhQs2LzjEPoWdLEtbmKpNQKOHBfBT1RsfpSM4xtXcGg0DIdNgBxNPl3NYjYhEtVwaCTMtoqIqA7KbgWffvpp3HfffTCZTDCZTHjooYfw0EMPZW2XSCRgsVjwjW98w5CEEpUq9eigxzZuxTXnL8PXVn8YT7ywI+OqoYHFXnxt9YdxcDSMBXOa48obounEaRcKxq4kWhHVp343YCIqn9spYKjPi+Ht2Y8pGur14gNfCCcs6q5DyoD2zhnQYwmMBCJ44oUdeG3C40QHFnux6pxeJBLArAY+8U5ULamJ0tGAkj+G+7wQrGa4anQyLyireGzjVlz98SXwB1Wse2ZrxiPQhvq8uOTMRfjTGwcw1+uCVTDzrihUVW6HiNndTvjGZAwu9uK1HI/kG1jsRXebvWZxUg0HDofgG0+2lRkx1+vFVUfaytff9uHkZbOm9cl9al1tLhtG/UrBOJ/Z6aha+Q/KKsKKimBYy47DPi/WXLIcvtEwvJ3ss1Lrk2wWjAQiGFjszfko3IHFyZsBrDqnt6nb3qCsYvOOQ9i804dPnbcEDz61JeP3Diz24uaV/fjp89tw7YUnsP0laiE20YLt744VnUs7debssvbrG5MR0eL4yW93ZNUnay9bDlnVMRJQOIamDE7JWnBOyARArOHFw7WUaovndDvh7XDgkZ+/ntUPv/HyfoyMhWEXLWyLm1RqjcCh0XDBsi4ZfKd6yi0oq4hEdTzx2x0YznGuJu4E2yoiojoouxU8//zzsXjxYiQSCdx222245pprcPLJJ2dsYzKZIEkSli5diu7u+iwUoOnN2y7hs588Hnoshp+9uCNronHzTh/MZuCmKwbgbedtzYkajd1mLRi7551yLI6b11Gn1BFNb10eCTdd3o8Hnt6SMdEyeGRxSYfbVvXHdOZjd3iw5Z3D+MPmfRmLRAGk65MzB+dAELnYjKafiRdTff7iE/Doz1/PmKAb6vVi7WX9EGt4511/KIqzTjoWb+4axR8278tq94e3+4AEsPjYDjzxwg7cePnyrEd+EhltRocDiCew9rLlWPfM1oxFZEN9tY8To40EFLy283DumNvhQwLA6f1zsHRBJ/yhaNP+TqJC3A4RkYiGG6/ox4NPbcmK8xsv769qfzYkq9i+dwy/fy132/fIs1txw+X9CMoqY5Banssh4tgZLqw6pxcAshZsfP7iE7Dj3THM7nY2dTz4Q1HM9bpw7GxP1iJRIPm7739yC66/7AS2v0QtxuUQMbNDwtXn9gFAzrm0WV3l1XFBWUVUi2VdbAkk65N1z2zFp85dDMFi4RiaMnjbHbjx8mQfePKc0I2X98MfiqCzrTXnTP2hKObP9uCdD/z4Q55++INPbcHnLjoeIfbDm5q3XYLZjIJl3VGn8xfTTUjW8PCzWwueqzmhp4ttFRFRjZW9UHTRokVYtGgREokEvvKVr+CMM87AokWLqpE2oilRojoOjysZHcCJhrf7IEcKP9qIiOpjLBApGLufOX8ZIqpe41QRUcqsbhduWTkIOaIhHNEh2SywCRYEwlHYRGvdJtIiWhydHnvWxEPK5p0+XLKiB8GwyoWiNC152yXctHIQ48EI1lx6AvRYAmFFh9NuhSCYIVrN8HbU7iKqsKKhq80Oswk57yAFJBeuXXRmDza8sANRjXcTp9qY0ZW8q+gNly+HqseTcSJZIVprHydGC4ZVdLXZ88bcazt8uPjMHujxOCJq4UdzEzUzb2cyzm9a2Y+IGkNY0eCUBJhMgGCt7h2ElGgMnZ78cTi8w4eoFkOci8VoGnA7RHg7nXj9bR/WXHJCsv2JxuC0W2E2mWCxmHDqCbObPhbCigY9loDdZs4b+5t3+hCLJSBzvouopbgdIro7kvXc5y86AbELE1AiOuw2C2yCFR5X+Y/T9oei0LR4wfrk2guXIaqxPqFss7tduPnKI/O6R/rANsGCne+OYVlPd9O3ufmEFQ1msxldRfrhn0Oyv07NrcsjwTeuYO1lqXmdZFkXreaqj/foqIiqFz1Xw/leIqLaq/i+2pqm4Z//+Z+hqioXilJDCisaVK3wiS129okaU0gpvIj70JgMj9NWo9QQUS4zOh0IyiqsoSjCigZRsOCYmZ66TrKU0varWnLBD9F05XYkT0IFZRVjgQgSCR0Wi4A2l63m8euUBIwGoiXFLQBE2HenGvJ2JNs5fygKwWqCYDXDU4c4MVpY0UuKuUg0hjZXc/9WomJScR6LRyFYzRCs5pq0hxG1eByGFR2C1VTVdBA1Cm+7hJOXzYI/FEVEjaPNJdalb1pNTkmA2ZxclF5IWNHgcvAOV0StZmI9pyg6PFOs58KKBk0vcu4rosNsZl+Ccpt5ZF5XsJoRVjQIVjOGlsxsqbZ3MqckYKyEOajkglLGTivwtksT5nXMLTOv00yK9X1T809ERFRbFS8UFUUR3d3dEEU2ptSYXJIAJVp4IYhTqjgEiKiK7GLh2BSsZsYvUQNILThrFM4S2n5RYP1BBCTj1wIdvg/eR/ecpXDUIZbbXDZE1RiiRe6aJApmAICTJ82pxhqtnTOCU7IWfbKGKJjhsFvR5uKFWdT66hHnLkkoesLMKVkhWM01ShFR/bVimztRm8sGVVPgLPKYU6ckwGzi4hSiVmRkPeeUBKhF7sAm2a2wWtiXoPxave2drM1lgxzRIaqF48IpCbBwoWjLmG7lvNEU6/uKghmOItsQEZHxpjRKuOyyy/Dzn/8cqqoalR4iw7hdIkb8EQws9uZ8f6jPC6nIYjQiqg/JZsFQX+7YHVjsxYg/UnSAQUTTj2DSMeKPYLC3cP3hdnJyiKgRuB0inJJQuM/e68Vbe8cw1OdFp8de4xQStR63s/A4ebDXi9FABE67wJMpRFXS4bFjNFC47TOZwMXaRC0kuUhBgF205I39gcXJuWqLhYtTiKiwNpcNSlQvWJ9EohrcTs6fE6W4HSLa3bbi/XAk++tENHVOScBQgXM1o4EI7AIvaiAiqrUprZLr6+vDiy++iAsvvBCXXXYZ5s6dC7s9u/N03nnnTeVriCrS5ZEwuLgbc70uAMDmnb70e0N9Xtx4eT+vUiFqUC6HiKvP7QMADG8/GrsDi71YdU4vvO12zOhw1Ct5RNSgRg69j8HFi3DMDBdMAIZ35Ko/JHR5pPolkogyOCUBAwX67JecuQi/emU3br1qiIvWiAxQcJzc68VV5/Siu82OGZ3saxNVi9shYqjXizndudu+Gy7vh2A2s90jajHeDgd8o2HctLIfDzy5JSP2BxZ7cfPKfjy7aSf+7hPL6phKImoGboeIGe0S1l62HOue2ZpVn6y9bDlsFjPnv4gmmdHhwOBi9sOJamVGhwM3XtGPB5/ekvNcryiY4WS8ERHV3JQWiv7DP/xD+v+///3v59zGZDJh27ZtU/kaoorN6nbBbDbjxsuXI6LFEI3G4JAEmJCAYLWws18B37iMkKwhrGhwSQKcDgHedp5EJGO5HSK6Oxy4+rw+fO7C4xFWNDil5J0XrGYzvDxxTVR3IwEFwXCyPZBsVthFC9zO+j7KRdd1eBxmmM0OXH/Zcmh6HEpEh91mgShYIFotXPhCDYX9qmSbH1Fj8DiFrD672QRYLCb8/adOZL+dStKIbVMjSo2Tb7h8OVQthkg0BsmefMw120qi2pjR6UQiAXz+kuMRVnRINitsghkWswkWixleXhhJLWw6t9feTieCsopbrhyAEtURVnQ4JSusFhOe/M8duPq8pdMiH4ho6rydTvjGZNx4+XKoehyyosMhWZtm/jwoqwgr2pG6UIPLIcDtFLm4tU6CsoqxQAShI22z2WSC2WxCu9vWcu3SzC4nzGZTejysRGNwSlbYBAus7Ie3nHTZljXYJ4y5nHwkfc3M7nbh5pWDUKLakbFv8lzN7n1+LF3QxeNARFQHU1oo+oMf/MCodBBVzYxOB4KyikQoCl2Pw2oxoc1lZ8ejDEFZRTgcRcJkwv2TrnhP3Z119pEr8IiMEovF8ZPfbM+4I+BQnxef++TxwLgCbzsnjYjqZf/hEB58aktmfPZ6ce2FxyOixuoen6m23x+KQrWYIAoWtLlab2KTmtv+wyE88NQWvDYpjm68Yvr1q7ztEoKiBf4j/XWPS2TMUtlytU2pOxTM6nbWvW1qNBPbSk2PQ7CaGXdENbT/cCjv/ApPTlMra/SxZC24jyxMCMoqBGsUYUWDYBVw7YUnsB0morJ4O4726a1WEwSrGa4mWPzkG1cQiep4+NmtWXMiN60cwKwuZx1TN/0cGAnjgSc3Z42lLz6zB//+yzew9vKBlmufJ8aOpsdhtTRH7FB5cpXtwd7kPNGIP4IZXZwrqpWZR+agrJZk31cULBjsncGYIyKqkyktFD3llFOMSgdRVbnZwa+Yb1zBuqc347qLTsh6LBKQfCz4/U9uwS1XcgBPxhkJKLj/yc0ZE0VAsrzF429g9cXHJ+84wbgmqrmDo3LW4jYg+Zj3+C8aJz7Z9lMj843LeDBPHD349BbcvHIAMzunV7+KMUtTcWAknLXgCjj6GLkzB+fgb/rnsIxNwrgjqo+Do3LOOovzK9TqDo6Em2IsWStsh4nICM1WlwRlFYdGw3jitztytgcPPLUZf/+pId5ZtEYOjIRx38825x1L983vwL0bhnHHp09uqnJWimaLHSrPwRyLRAHgtR0+mACcOTgX7/tCnCuqIcYcEVHjMBu1o7fffhsvvfQSXnrpJbz99ttG7ZaI6igoq7h3wzDmz25DVItlDRZTNu/04eCojJGAUuMUUqsKhNSsiaKUzTt9CIRVBMJqjVNFREFZRUguIT5DjE+iQsKKljVRmTK83QclquPQmFzjVBE1p5GAgoOjcsGxSqfHjtFApMYpIyLKFpRVyBGt6PxKUGZ/mlrLSEBBOKIXHUuGWPaJiFraaCACh00oOCcSDGs1TtX0VMpYesn8Dgxv98EfitY4dUSVGwko8IfV/PXMDh+OmeFCp8fOsk1ERNPSlO4oCgAvvPACvvWtb+GDDz7IeP2YY47Bl7/8ZZx99tlT/QoiqhN/KIrh7T5cdEYPwkrhwXlI1hAMqbzSkwxRSnlzO4QapYaIUvyhKMIRveA2jE+i4sJK4TgKKzr8IRWSzcorrYmKCIZVhOTCfUdViyNcZBsiolrwh6IljXfHAhH2AailBMPJRdKFJMeSLPdERK2s2NgNKH5ugIwRDJU2lgZ4TKi5BMMqomqs4DZ6LJGcK2LZJiKiaWhKC0Vfeukl3HrrrZgzZw5uv/12LFq0CADwzjvvYMOGDfjCF76Ahx56CCtWrDAksURUW6kOsqrF0d1eeNGPKJiLLnogKpVTKl7elGjhgR4RGS+saHDYC3cfGZ9ExUk2S9H39x+Owh+K8mQ5URFhRYcoFH5YiiiYYS8Sd0REtRBWtJLGuyGesKQWE1Z0OO3Fy34kyrlFIqJWJtksSJSwDVVfSNFKGksDxc/XEDWSsKLDbit8DsNusyKi6izbREQ0LU3p0fMPPPAA+vr6sHHjRlx//fU4++yzcfbZZ+P666/Hxo0b0dvbi/vvv9+otBJRjaU6yKJghhaLY6jPm3O7gcVevLV3DA5pyjcpJgIA2EVL0fLmZHkjqjmnJGDEH2F8Ek2RTbBiYHH+OLIJ1iMX4XCRCFExTsmKt/aO5Y2poV4vRgIR2ASebCSi+nNKAiTRWrQ/bRfZn6bW4pSssFpNxecWi1yYSEREzU0ULBAs5iJzIhy71YJTEoqOpd/aO4ahPi/aXLYap46ocslzE4mC9YzFbMJoIMKyTURE09KUFopu374dl156KRwOR9Z7DocDl112GbZv3z6VryCiOmpz2TDUlxwM/mLTO7jh8v6sjvXAYi8uPrMHe/f5IRW5QouoVKYEcGOh8rbfzyv9iOqgzWXD7/76LtZeWjg+HUXuFEM03YmCGavO6c0ZR6vO6UUsHjuy6JqxRFSM2yli7z4/Lj6zJ2dMXXvh8Th2hgtWy5SmP4iIDNHmsmE8JBce7+7z805a1HLcThFvvzeOtZcVHkvaRJZ9IqJWZjGZkEgkCs6JiGwLakKyWbH7g/xj6U+fvxR79/tx88pBPu2GmorbKWLPvkDBesZsBk5aMpNlm4iIpqUpreqy2Wzw+/153/f7/bDZeCUGUbNyO0R84aohrHt6Mz7+4QV46j934MYr+nF4XEFITj6W4q29Y3j+f/bgsxcez8UMZBinU8R+XwC3XDmAg6NyZnn77z1YfckJ8LZnX6RARNXldoi49sLj8aPntmHtpSdgNBjNGZ8zOhifRIV4OxyIxeI4c3AOLlnRA1WLQxTMGA1E4G2348CIgr37/WhzLap3UokaXpdHwucvXY5Hf74VffM70jHlcgiY0SFhx94xLJrXDgfHKkTUANwOEV3tLuiajpuu6Icvx/zKZR89Di6esKQW0+WRsGxhF8YCCm68fDkO+yNZZf/yjy5m2ScianEup4gPDgXgdgh550Q4718bTknA5y46Ho//4o2ssbS3XYIej+P6y/o5z0tNp8sjYfmiLoz4IzhjILue6W63QxQt6PJI9U4qERFRXUxpoeipp56KH/zgBzjzzDMxNDSU8d7mzZvxwx/+EKeffvqUEkhE9eVtl/D3nzoRgXAUl37kOOixONpcNnicIpSojjMG5uDEPi8km5VXXpFh3A4RkTYntu06jOPmdcDjFBFWNJwxMAfnnTofMzs5OUFULzM7nbjmk8vgGw3D4xST7UFEZ3wSlWlWtwtmS/Lx8mFFg1MSMNfrwh9f34c3d43ihssH2LciKtGsLiduXDmAUFhDOKKhu90KE4CIqqO7Q4Jd5FiFiBqHt11CUFYRljV0t9nhcgiIRGM4bflszPU6MbPTyTqLWtLMLiesghnRaAxdbXa4J5X9GR0Oln0iohaXvGjGiTd3HcayhV3Q9BiUaAxOuxXHzvJwXrGG3A4RETWGlWcfB0kUEI7o6G63wi5YYDGb4Hba2S5T05rV7YLZbEab24aoFkM0GoPDboVTskKwcpEoERFNb1NaKHrHHXfgU5/6FP72b/8W/f39WLhwIQBg9+7d2LJlC7q6uvClL33JkIQSUf24HWLGgDAoq/CHolA1EwSrGcfO8nDASIbztkuwL5kJfyiKqBqDJADtLgEdHk4WEdXbjA4HJJsV/lAUYUWDxyWizWVjW0BUphkdDqDjaN8qKKs4ZdlsnHvKAsYTUZm6PBK6PFI6nlILsI+dxUUnRNR4UvMsQVlFIhSFrsdhFy340LJZrLOopaVOyqfaa41ln4ho2vG2SzjxyLy/psfRxnnFuvG2S7CLFvhDUQh68nyfyynyWFBLmNHpSPc5dT0Oq9WMee08n01ERDSlhaLz5s3Dxo0bsW7dOmzatAnPPfccAGDOnDn4zGc+g+uvvx5dXV2GJJSIGsfkhaNE1ZIqa7IsY9u2bZjdvbTeSSKiI9gWEBmH8URkHMYTETUT1lk0XbHsExFNb2wHGgePBbUylm8iIqJsZS0UTT1mPnXnUADo6urCXXfdhbvuusvwxBEZafKdZXiFIhHlwrqCiKqN9QxVC8sWUfNgvBJRCusDovpjHBJRrbC+oemM5Z9oemHMExE1JnM5G9999914/fXX038vXboUv/jFLwxPFJFRgrKKgyNhfHAoiMPjCvwhFYLVgng8gb+8eQCHRsP1TiIRNRDfmIzAkcdQ6LEEVC2OQCgK36hc76QRUYs4NBrG5h2HYDWbIQoWjAejGBlXcJB9Epoi37iCf/uP15FIIF22Do8r2H84jJGAUu/kEdEEvtEwQrIKTY9D0+PQ9ThCsgof2wKiacc3ruSuD0ZYHxDVSnouKJY5F3SIcUhEBvKNydh/OITD4wrGg1HYBAt8YzIeePI1+MY5ZqfWl5q3iicSGXOi+w+Hsd8XRFBW651EIjKQb1zBv/7oL/jOj/8Kt0OEpsexd38Ae/b5cWAkzJgnIqqjsu4o6vF4MDIykv47kUgYniAio/jGFURVHePBKJ54YQde2+FLvzew2ItV5/Ti8LgCk8kEb4ejjiklokbgGw0josXxyLNbMZyjvojF45jV7apjComo2fnGZIwFFCw6ph33PbkZm3dm1jU3r+zHbNYzVIGgrOKnv9mGlWf34v4nt2SVrbWXLUdMC2NGl7OOqSQiADh0OAw9kcADT2XH6k1X9OPQ4TBmdDNWiaaDoKxC12M52+6bV/bDNxKGl203UVX5RsOIanE8nGcuKJ5IcC6IiKbs4OEQ1FgC657ZmtXmX3/pCXhs41bctHKQd1mjlpWat7ri7F48kKPve+MV/Xjk2S245oLj4W2X6phSIjJCUFZx74ZhhMIq7rjm5Lxj3ogaY8wTtYh4PAGz2dQ0+53uylooeuqpp+Lee+/Ftm3b4Ha7AQDPPvssNm/eXPBzX/3qVytPIVEFkncSDeH9Q2G8vGVfxiJRAOnOyBmDc2C3CbDbVA7CiaaxoKzi4JiMJ17Ymbe+OHNwDgTRgi4PBy1EVL6grEKJ6nA5bFkTI0Cyrrn/yS34wlWDmNnJC1ioPGOBCC4567i8ZWvdM1vxqXMXwyKY2Y4R1dFIQIGs6nh04xs5Y/WBp7bg8xcfj5GAwlglmgbCilawX3jLlQOsD4iqqNS5IJPZzDEaEVXs0JiMQ34FT/x2Z842/+FnX8dFZ/ZgLBDhOSpqWal5q8mLRIFkHDz41BZ85pNLce+GYdzx6ZMZC0RNzh+KYni7D+u+fHbBMe/NK/sRlLlGg6gVmM0mPPHbHfCNGfeUVm+HA6vO7TVsf3RUWQtF//f//t/45je/iZdffhkjIyMwmUx4+eWX8fLLL+f9jMlk4kJRqjl/KAq7TUBXmz1roi9l804fLlnRg1g8AX8oyk4I0TSWqjOK1RfBsMqTdERUEX8oCi0WRyxuypoYSdm80wc5otU4ZdQKQooGyWYtWLauvXAZ2zGiOguGVSSAgrGaOLIdY5Wo9SlRvWB9oER1RFSwPiCqklLngjhGI6KpCCsaJJtQdLweUljXUOsqZd5KsByP4e0+nq8lagHhI21aVIsVjPuIGkMszpgnahW+MRn7DofrnQwqQVkLRbu6uvB//+//Tf+9ZMkS/Ou//isuuugiwxNGNBVhRUNUi0PV4gW3U7U4IlEd8Xjh7YiotaXqjEJULY6wotcoRUTUasKKBj2WQCKRKLId6xkqn120pifg8lEiOh/RQVRnYUUvoR3QYDIxVommg2JtN+sDouriXBAR1UJY0RAvPASAEtHhlITaJIioDkqZt0q9X2w7Imp8qTatlLgXrOZaJImIiCYoq+a9++678eabb2b8vWzZMsMTRTRVTkmAw26FKBQu4qJghtVi4iCcaJpL1RmFiIIZTqms6yuIiNKckgCHzVq0z8F6hioh2SxFy5Zkt7J8EdWZUyqlHRAYq0TTBOsDovriXBAR1UIpdY3DboVks9QoRUS1V8q8Vep9nq8lan5tLhuG+rwljnkZ80REtVbWQtF///d/xzvvvJP++6677spYOErUKNpcNkSiGkb8EQz2enNuM7DYi9FABB/4Qmhz2WqcQiJqJKk6Y6hIfeF28vEHRFSZNpcNclSDaDVjYHH+usZh58QIlc/lECHZrAXLViSqsR0jqjO3U4QJKBirpiPbEVHrc9iFgvWBXbSwPiCqolLngjhGI6KpcEoClKhWZC7IChcfu0strJR5Ky0Wx1Cfl+driVqA2yHi5pUDsIuWomNexjwRUe2VdTlsd3c33nvvvfTfxR6ZRlQvboeImV0utLvtOGaGCyYAwzt86fcHFnux6pxeWC2At8MJNwfhJQvKKvyhKMKKBqckoM1lY/7VEY+HMVJ1xppLl+ORn2/F8Pbs+mJGh4Quj1THVBJRM3M7RMzodCKm6bhlZT9e23kYXW12qFocomBOXtyyuBszOx31Tio1IbdDRESN4eaV/bj/yS3YvDOzHVt72XLYrGZD2zH2QYjKE5RVKBEdSlTHmktOwLY9o1i/8XVE1BiAZKzedEU/BLOJfU6iSVq1zZnZ6cjbdt+8sh9WE+sDoomMrgtSc0HXX7ocD+eZC/K22zlGI6IpmdHhQCIWx9rLlmPdM1tztvmC1VJyfdaq/SJqTEaVt2LzVjdd0Y+f/vYt3HrVEMszGYp1Zv3M7HTCNyYXHPOW0/4REZFxyloo+pGPfAQPPPAAXn75ZbjdbgDA448/jl/+8pd5P2MymfDggw9OLZVEFfC2SwjKKgSLGWsvWw5Vj0OJ6LDbLLAJFljMJjgdIjsgZfCNK7h3w3DGxOlQnxdfuGoI3naevKg1Hg9jpeqMmy4fQETTEVZ0SDYLbIIVdruFJ+iIaMpS9UxYVvHHLfsyLmIZ6vPipKUz65g6anap8vWFKwcgR5PtmFOywi5aIYrGLhJlH4SoPPli5nv/cBb8wSgkuxWSzQpBMDZWiVpBq7c5s7td+MJVg5AjWrrtZn1AlK1adUF6LuiKAUTUiXNBFohWC7xcJEpEBpjZ7UovlomoMciKDodkhcNmhUMSSj5H1er9ImoshcpbJTe9T7W5t1w5AGXSvBUScay5tJ/na8lQrDPrz9vhyBn3ks0KZxntHxERGaushaL/63/9L3R1deF//ud/8Pbbb8NkMmH//v0YHx+vUvKIpsbNhaCGCcpqVocaAIa3+3DvhmHc8emTmdc1xONRHawziKgWHnh6S8YiUYD1NxmjFu0Y+yBE5SkUM+ue2cKYISpgurQ5vFshUWHVrgs4F0REteDtmFp7P136RdQYipW32z81WNF+2eZSrbDObByMeyKixlPWQlGHw4F/+Id/SP+9ZMkS3HXXXbjooosMSczevXuxfv16bN68GTt37kRPTw/+4z/+I2u7n/3sZ3j00Uexb98+LFy4ELfffjs++tGPZmwTDAZx991344UXXoCmaTjzzDPx1a9+FTNmzMjY7tVXX8U///M/Y9u2bejq6sLVV1+NNWvWwGQypbdJJBJ45JFH8P/+3//D6Ogoli5diq985SsYHBw05HcTNQN/KJrVoU4Z3u6DPxRlR6+GeDyIiJoT629qdizDROVhzBBVjvFDRADrAiIigHUh1Vax8haU9RqniKg8rDOJiIjyM5f7gS1btqTvIPqDH/wAp59+et5t33//fTz77LMl73vnzp146aWXMH/+fCxatCjnNr/85S/xj//4jzj//PPxyCOPYHBwELfccgtee+21jO1uu+02vPzyy/j617+Ob3/729i9ezfWrFkDXT/aed27dy9Wr14Nr9eLdevW4bOf/SzuuecePPbYYxn7euSRR3DPPffg2muvxbp16+D1enHdddfhvffeK/m3ETW7sKJN6X0yFo8HEVFzYv1NzY5lmKg8jBmiyjF+iAhgXUBEBLAupNoqVp7kCBeKUmNjnUlERJRf2QtFV61ahd///vcAgFNOOQVmsxkDAwP405/+lLXtq6++iq985Ssl7/tjH/sYXnrpJdxzzz04/vjjc25zzz334JOf/CRuu+02fPjDH8Y//dM/Yfny5bj//vvT2wwPD+MPf/gD/s//+T+44IILcPbZZ+P73/8+tm/fjueffz693fr169HR0YHvfOc7OO2003Dttdfiuuuuw0MPPQRVVQEA0WgU69atw3XXXYdrr70Wp512Gr7zne+gvb0d69evL/m3ETU7pyRM6X0yFo8HEVFzYv1NzY5lmKg8jBmiyjF+iAhgXUBEBLAupNoqVp4c9rIeWEpUc6wziYiI8it7oWgikcj6OxqNIhaLTT0x5sLJee+997Bnzx6cf/75Ga9fcMEFeOWVV9KLOzdt2gSPx5Nxt9Oenh4sXboUmzZtSr+2adMmnH322RBFMWNfgUAAw8PDAJKLXUOhUMZ3iqKIc889N2NfRK2uzWXDUJ8353tDfV60uWw1TtH0xuNBRNScWH9Ts2MZJioPY4aocowfIgJYFxARAawLqbaKlTe3gwtFqbGxziQiIsqv7IWi9bRr1y4AwMKFCzNeX7RoETRNSz8KfteuXVi4cCFMJlPGdj09Pel9yLKM/fv3o6enJ2sbk8mU3i717+TtFi1ahH379iESiRj064gam9sh4gtXDWV1rIf6vLj1qiG4HWKeT1I18HgQETUn1t/U7FiGicrDmCGqHOOHiADWBUREAOtCqq1i5c3GdaLU4FhnEhER5ddUXTm/3w8A8Hg8Ga+n/k69HwgE4Ha7sz7f1taG119/HQAQDAZz7ksURUiSlLEvURRhs2VeWeLxeJBIJOD3+2G32yv6PYlEArIsF91OUZSMf6mxtfLxcorA7Z8aRFDWIUd0OOxWuB1W2KylleV6cTgchuyn1Jg1SrGy1KzHoxKtHFflmg55YVTMArWPW6NMh+NstGbKs0apv43KM8Zs86q0DDRKGZ4uqlG/MW6NxX577TRTe28ko2MWaJ48bPb4ma5ltl4aKb/Z1hqr1LqgkcrAdNEqed4KMdsqx6LZ1DLfm71fZLRWiNtGVqi8sb6pn2bOe6NjdjrNxTTzcS8Xf2tjqWZb2wy/v9nUK09NJhMkSUIsEUcsPvUnkafEEnEAyd8z+cnntdCMZbTUmG2qhaKtRtM0bNu2reTt9+zZU73EkOFa8XiZzWZ42rsBiwRNj0HT4hgd8SMwfhjxeLzeycvrpJNOMmQ/5casUUotS2EAvqqmpP6qHVcTy7isxuCwWQBdacgy3op1TIpRMQvUL26N0srHuVr27NnTVLEM1L/+nmo5Y8w2v6mWASPKcLPFbT0Y2SYwbqujVv12xsv06yMZGbO6rgNo3jysd7+pUuXkN2N86hqhfLOtra5idUEtywBjNqkR4m4qWilmm/1YNKt65LtiNkObxvVPK8VtM8jV9jZCfTNd2+FGyPtyGR2zqTzIlxfNek67kGY87pXib20MtWhrG/n3N6ta56kkSVi2bBkiSgRy2LiF+BFXcjnj7t2767pYs5nKaKkxW9FC0Q8++ABvvPEGgKN35ty7d2/W3Tnff//9SnafV1tbW/o7vd6jtwoPBAIZ73s8Hhw4cCDr836/P71N6o6jqfSnqKoKRVEy9qWqKqLRaMZdRQOBAEwmU3q7SgiCgOOOO67odoqiYM+ePViwYAEkSar4+6g2Wvl4hSIJ3PfkZgxvPzocHOrz4paVA3DZTXVMWW2UGrNGaeWyVK5a5UUzlHGWi/LUOm6NwuNcvol5FjPZGz6WG0EjlrNmjdlm1UhloBna4HpppOOUC+O29sdoOsdLo8dDM7BardB1nXlYI5WU2ekc41PVqnUE29rS1aMMTPeYbdW4m4p6xSyPRX3UM9+ne/1jJLa15Wmk+ma6xUEj5X09CYKAuXPnFsyLViob0+m487e2rslt7XT7/bVQrzw1mZJ1ql2yw+HUDduvXUo+2XvhwoV1u6Noq5bRihaKfv/738f3v//9jNe+8Y1vZG2XSCTShcIIPT09AIBdu3al/z/1tyAImDdvXnq7V155Jev7d+/ejd7eXgDJW67Onj0bu3btyviO3bt3I5FIpPef+nf37t1YsmRJxnfOmTOn4sfOA8mAKed2zZIkGXp7Z6quVjteQVnFfU/+JaNDDQDD232478nNuOPTJ8PtEOuUutooN2aN0mplaSqqmRfNVsZZLkpTr7g1Co9z+cyChO//9LWmieVG0EjlrNljtlnVuww0WxtcL/U+Tvkwbo+qxTFivCQ1ajw0g9Q8GfOwtkrNb8a4MVqtfLOtLV+tygBj9qhWi7upqHfM8ljUR63znfWPseodt82q3vXNdI6Deud9vaUecwzkzotWLRvT6bjzt7aefG3tdPn9tVSvPLWYzLCYLYbuD0DdF2m2Yhkte6Ho3XffXY10lGTevHlYsGABfv3rX+Occ85Jv/7cc8/htNNOgygmG/QVK1bggQcewCuvvIK/+Zu/AZBc6Pnmm2/i85//fPpzK1aswIsvvog77rgDgiCk9+XxeDA0NAQAOPHEE+FyufCrX/0qvVBU0zQ8//zzWLFiRU1+dyMLyir8oej/n707D4+quv8H/p59yUYCA7JoIJgEEAhRFBWIFXFnUWSrBbUCigoorVRslfq1trVqayvgAtJFsSq44lqrrWKp+pMaAir7EkUUAgnJJLMvvz/iDLPcuXdmMjP3zsz79Tx9KjOTO3fuPZ/zOffcc89Bh92NApMOJYWGrGxYkbTWdie272/G9PFVGFReCpfbB71OjR2NLdiwcS9a250895RygTqm3eZCt57lcHqAdKXh1nZn1EVjQP3OprSVcdajRKlltXmYr4jiYLW50NLmgb6kH461eeCFS7bYSDQHM3eSmFwvH+los+b6MSOKRYllP9UxrsTfSLkrH8tbuvuS8vGYEqWCUmInnfshV182yU8p5VsJYsWBUa9B5cmlONZqx6Gm9rw/TvmIdaSyHGuzw9rhQofdgwKTFkUFenQvzq3Z+Sh1fD4/1OrUz/qbru0SZaOEB4peeeWV6dgPAJ1Tt37wwQcAOpe3b29vx9tvvw0AOOuss1BWVoaFCxfi9ttvxymnnIJRo0bhzTffxNatW7F27drgdmprazFmzBj8/Oc/xx133AGDwYCHH34Y1dXVuOiii4KfmzNnDl577TX89Kc/xQ9/+EPs2rULa9asweLFi4ODTg0GA2688UYsX74cZWVlqKqqwrPPPovjx49jzpw5aTsW2aDpuB3L19VHTdm+cHotLN2Uldx54dR1NocbS2aNxIYP92Hdu7uCr9dUWrBk1kjYHG4Z9y5/5XLZznQd02EXL8NS7ycjm+pRyjy1Wg2nB2g+Ys3JGE8Xu5P5ikhK03E7PttxGGXFRrjcPjhcNnx5oBmnD+olS/5JJAczd5KYQPnYvr8Zk+oGYlB5KQ4d7UCvMjPKio05kUNT3WZlTFE+Cb1+Nhq02HGgGU+++jkcLi8AZZT9VMY445syKbJ92dbhwhf7jsnWvsyUdPYlMYaJkqOU2En3fsjRl03yiyxXRr0GcycPxaDyMjhcnrzrPxYq50a9RrBvmDk0v7COVI7vjnVgxfoGNOw+kQ9rKi1YMK0GJ3UvkHHPSKnUahWe/+cuNLXYUrZNS6kZMy6sStn2iLJdUkvPp8uxY8dw6623hr0W+PdTTz2FUaNGYcKECbDb7Vi9ejVWrVqFAQMGYMWKFcEZQAP++Mc/4re//S2WLVsGj8eDMWPG4K677oJWe+Inl5eXY82aNbj//vtxww03oKysDIsWLcL1118ftq158+bB7/fjz3/+M5qbmzF48GCsWbMmuNR9PrLaXFEXuUDnUzjL19Urasp2pXQMZLsisx5PvbkjrCEHIPjvW6YOl2O38loul2056pgCk65L7ycqm+pRkkf3Xqfg4Ygl1HMlxtOp0GzA02/tjJmvbr6K+Yrym9XmwndHO/DhlkNRHXR9ehTCqNdkPP/Em4OZO0lMoHxs39+c0zeFUtlmZUxRPhG6fg48SPTg2s1wuLyKKPupinHGN2WSEtuXmZKuviTGMFFylBI7mdiPTPdlk/wiy1XogMgV6xuCn8uVa994CJXzSXUDseHDfVF9w8yh+YV1pDIca7NHDRIFOu/VrFjfgMVX13JmURLU1GLDoaMdcu8GUc5Sy70Dofr164edO3cK/m/UqFHBz02bNg3vvPMOPv/8c7z22ms4//zzo7ZVVFSE3/zmN/j0009RX1+P5cuXo1evXlGfO/3007Fu3Tps27YNH3zwAW644QaoVOFTDqtUKtx444344IMPsG3bNqxbty5qYGq+iWfKdiWQuiC32lwy7Vn2cXt8UQ25gIbdTXB7fBneo/yW62VbjjqmpNCA2mqL4Hu11RaUFBpS+n3ZUo+SPJweYPVrO3M2xtNJKl+5mK8oz7XbXHj+3V2CHXTPv7sL7TLUL/HmYOZOEhMoH1I3hbI9h6ayzcqYonwR6/q5YXcTNny4D5PqBgZfk7vspyrGGd+USUpsX2ZKuvqSGMNEyVFK7GRiP0xGLWoqheufmkoLTEZFzRNEKRBZrnL92jceQnl4UHlpzL5h5tD8wTpSGawdLtF7NdaO3K+niIiUSFEDRSl7ZMuU7UrpGMgFdqenS+9TauV62Zajjiky67Fwem1Ux0JttQWLptem/CnTbKlHSR5WmwdbduVujKdTh128c4GxRfnO7vSKdtDZnd4M71H8OZi5k8QEzn+u3xRKZZuVMUX5Quz6uWF3EwaVl4a9JmfZT1WMM74pk5TYvsyUdPUlMYaJkqOU2MnEfjicHkwaWxE1EKqm0oJJYyvg4P2anBNZbnL92jceQnnY5RafJIA5ND+wjlSGDrv4cZZ6n4iI0oOPS1BSsmXKdqV0DOSCbDnn+SLXy7Zc5c3SzYQls0aitd2JDrsbBSYdSgoNaVmKhDFFYmyO3I7xdCowSsUWm7+U3xwu8Q44qffTJZ4czNxJYgLnPx9uCqWqzcqYonwhFfeR9YbcZT8VMc74pkxSavsyU9LRl8QYJkqOUmInE/vRbnPjwbWbMaluICbXVcDl9kGvU2NHYwseXLsZ980/t8vfQcoSWW7y4do3HpF52KDXiH6eOTQ/sI5UBql7MbxXQ0QkD9a+lJTAdP5CMzKkY4nmZCmlYyAXZMs5zxe5XrblLG9FZn1aBoZGYkyRGLPkYMfsjvF0KjTrUFNpEXyivqbSgqKC9Mc3kZIVStQfUu+nk1QOZu4kMYHyodeJL5ySKzk0FW1WxhTlC6m4D603lFL2uxrjjG/KJCW3LzMl1X1JjGGi5CgldjKxHwUmHRwuL9a9uyvm+5RbIstVvlz7xiM0D1ttLkXUAyQv1pHKUFSg570aIiIF4tLzlJRML9GcrMCFkxBeECQmW855vsj1sp0P5S0ffiMlr8isRW1V7sZ4Opn1wIJpNYLLyiyYVoPuxSaZ9oxIGUqLjaJtiNJiY4b3KH7MnSQmUD6a2xxROSCAOTQcY4ryhdj1c02lBTsaWwDkVtlnfFMmZXP7UqkYw0TJUUrsZGI/cv3+AEWLLFc7Glt47StAKfUAyYt1pDJ0LzbxXg0RkQJxRlFKWiaXaE5W4IJg+br6sKfHeEGQnGw45/kiH8p2aHlrt7mhU/tQ1s2M0hy6cGBMUSwGLTB3YjWefB05G+PpdFL3Aiy+uhbWDhc67B4UmLQoKtCz44EI2d+GYO4kMZZuJpw7vA+GDeyBx1/empVlPNMYU5QPxHLf/CnD0W5z4fwz+uVc2Wd8U6Zke/tSqRjDRMlRSuykez9Y9+an0HJlc7hxwciTee0rQCn1AMmHdaRy8F4NEZHycKAodUmmlmjuimy5ILDaXIrfRyA7znm+yJaynRp+QCX3PqQHY4piOXb4KyyeOQIdDm8exHjqdS82sbOhC7KlXULxETqfS2aNREubA63tdpQUmlBabMyac8zcSWIC5UNJ7WSl16mMKcoHqbx+VnpMh2J8U6YosY8qm2I1FsYwUXKUEjvp3g8l1r1dkQv1diZElqtsLgPpPOdKqQdIPrlWR2YzvVYDrUYNrUYFrUYNvVYj9y4REeU1DhSlvKD0C4Km43bBp5oWTq+FpRsHuVBsSi/bXcG4oHzn8/lg0AKlPYvk3hXKM6x/c4vY+exRrEXTNwfRo89gmHO0PUH5SyntZNapRMqRinqBMU0Um1Jyr1qtRrvDjxUvbGasElHOU0rd21VsYyUvW8sAzzllQrbGRy5hrBMRKY9a7h0gyndWmyuqgQR0LjW8fF09rDaXTHtG2cBqc+HgESt2Njbj4BFrzpQXxgWR8uVq/ZPvWP/KL5WxJXU+nZ6u7i1R9slk/mKdSpRemW6PMqaJpCnhOrG4Ww+seKGBsUpEXaKE+ixfsI0Vv1wplzznlCm5EjPZirFORKRMnFGUSGat7c6oBlJA/c4mtLY7+bQTCcrlp7AYF0TKlsv1T75j/SuvVMeW1Pm02jhSlPJLpvMX61Si9JGjPcqYJhKnmOtEjYmxSkRdopj6LE+wjRWfXCqXPOeUCbkUM9mKsU5EpEycUZRIZu02d5fep/yU609hddjFy73U+0SUPrle/+Q71r/ySUdsSZ0vm4MDRSl/yJG/WKcSpYdc7VHGNFFsSrpOtLm8ou8zVolIjJLqs3zBNpa0XCuXPOeUbrkWM9mKsU5EpEwcKEokM6NB06X3KT/F8xRWNisw6br0PhGlT67XP/mO9a980hFbUufLbOQCE5Q/5MhfrFOJ0kOu9ihjmig2JV0nmvXifamMVSISo6T6LF+wjSUt18olzzmlW67FTLZirBMRKRMHihLJTK1SoabSIvheTaUFapUqw3tE2SDXn8IqKTSgtlo4LmqrLSgpNGR4j4goINfrn3zH+lc+6YgtqfNZZOZAUcofcuQv1qlE6SFXe5QxTRSboq4TvXbGKhElTVH1WZ5gG0tarpVLnnNKt1yLmWzFWCciUiYOFCWSmUajwqSxFVGDRWsqLZg0tgIajbIGilptLhw8YsXOxmYcPGLl9PwyyfWnsIrMeiycXht1AVFbbcGi6bUoMuvT9t0s40Ticr3+yXdy1r/5Lh2xJXU+DRwnSjkg3rabHPmLdSpResjVHk02ptVqNZwe8DqTcppU3Bn0moyV/7bjR7Fgag3zLxEFJdLfy36vzON1k7R48mw2tS95zindWJcrA2OdiEiZeGuQSGbFBQb85ZMvUF1eisl1FXC5fdDr1NjR2IJ3PjmAW2eeLvcuBjUdt2P5uvqw6fprqy1YOL0Wlm4mGfcs/wSewhJaOiFXnsKydDNhyayRaG13ot3mhk7tQ1k3M0qL01fWWMaJpOVD/ZPvQuvfDrsbBSYdSgoN7LhJs3TG1ujhfTBxzIl2ZnObA/6u7CyRQiTSdpMrf7FOJUo9OdujycR0916n4OHntvA6k3KaWFzWVFrw4ZZDWPfuLgDpL/8+nw+FRhXzLxEBSLy/l/1e8uB1k7h48uzur1uyqn3Jc07pxLpcORjrRETKwxlFiWRWZNbjxik12P11C+5d8wnuf+pT3LvmE+z+ugXzp9QopqFktbmiOlQAoH5nE5avq8+qpxVzQb48hVVk1qNfzyKc0tOI402NaZ35jGWcKH7TxlUJzoQ9bVyVTHtEqRaof6vLy9CvZ1HO5BUlS0duD+S2FesbwtqZK9Y3YPm6ejg9qdp7osxLtO0mZ/uZdSpRasl9PZxITDs9wOrXdvI6k3JerLgMrJi0YePe4GuZKv/Mv0SUTH+v3O2MfMZ6O7Z48mw2ti95zimdeA9DORjrRETKwhlFiRQgG56maW13Cj55BXR2rLS2OxW1v/kgG8pNNmEZJ4pPa7sT9675GJPqBkbNhH3vmo/x8OLzGCtESUp1bpfKbVYbR4pS9kqm7cb2M1HuyJZ4tto82LKL15mUHyLj0qDX4MMth/Dg2s1wuLxhn2X5J6JMSLa/N1vaGZRfAuXyWKsd3xzpCPbHhuZZ5leiTryHQUREFBsHilJesNpcir+oLzLrFbdPoTrs7i69T+mh9HKTKk4P0M1Sjq+O2FFo9qYlhlnGieLTYXfD4fIGlw0Uep+kZUPbhFIr3nOeytwuFY82BweKUvZKtu2WaIyxviZSrkTiWa5Ytjl4nUn5JTQudzY2x7xuBMLLP/MtEaWDUJ416jWYVDcQg8pL0druAmAVrHPypd+dskuRWY9DTe24/6lPY36G+ZWI9zCUhnUREZGycKAo5bym4/ao5UVqqy1YOL0Wlm4mGfcsuxSYdF16n9IjHxrXnTG8Je0xzDJOFJ9siRUl149sm+Qfuc65VDyajVp0hPxbyXFDFKmr+Sie8s76mig3xBvL6ciDZmN2tJ2J0kGqfOu0GnzTZIVWo8bKFxqYb4ko5SLrIaNegyWzRmLDh/vCBg9lqs7hNTelQrzXwryepXyWLfcw8gHrIiIi5eFAUcppVpsLy5+vR33EMl/1O5uwfF09lswayQvxOJUUGlBbbRFcqqW22oKSQoMMe5Xf8qFxbbW5on4jkJ4YZhknik82xIqS68dM1mukDHKec6l4LTJrEXhHyXFDJKQr+Sie8s76mig3xBvL6cqDRWYtaqssUf1Sge0roe1MlC5iubqm0oJNWw8BAHY2tqBhN/MtEaVeZD00qW4gNny4T5Y6h9fclCrxXAvz3ijlu2y4h5EP2LdGRKRMHChKXaL0JyBb2hyCnfFAZyOkpc2hqP1VsiKzHgun1wp2ZiyaXsvjmGFWmwtPvNSAypNLMXFMBVxuH/Q6NXY0tuCJlxpw68zTc+KctLY7BS/kgM4Ybm13pux3sowTxScQK5/tOIyyYmOw/mluc+CMQb1kjxWnB4rufMhkvUbxSXd7Vs5zLpXbDFo/AOXHDZGQZNtukZ3UoUtP7j/UCrvDg9JiA+troiwhlcfjiWUgfXnQoAXmTqzGk6+D15mUd2JdOx5rdaBHNxN+99Sn+NnskTGXBGW+JaKuirxmGFReKkudky99+ZQZQtfCRr0GcycPxaDyMhxqaodBp+G9Ucp7My6owrnD+qB7SXg79OSehXLvWt5g3xopRaFZB5/PD7ValfJtp2u7ROnEgaKUtGx4ArLd7u7S+xTO0s2EJbNGKnpwcL5o63DiolH9o5bJqam0YNLYCrR15EbjukMiRqXeTxTLOFH8Nm09FNUGOH1QLxn3qJPV5lF050Om6zUSl4n2rNznXCy32Ww2AMqPG6JYkmm7hXZSiy09+cMLB4l+N+trIvnFk8fjzcPpzIPHDn+FxTNHoMPh5XUm5aXIa8cRVZ19VwDgcvtE/5b5loi6KvSaobXdJfrZdNU5+dKXT5kTWq5tDjcKTXo8/vJWrFjfAABYes2Zon/Pe6OU69o6nLA5Pdi09RC27Ipuh7LezQy5+8WJAkx6LdRqFZ7/5y40tdhStl1LqRkzLqxK2faIMoUDRSkp2TJVuFEvXsSl3qdoRWa9Is5tvvN6/YLL5AT+fcMVQ+XYrZQrMOm69H4yWMaJxCm9DWBzKLvzQY56jYRlqiwr4ZxL5Talxw2RmETbbqHlWWzpyavOrxTdDutrInnFm8fjycPpvnnl8/lg0AKlPYu6tB2ibBMrTrfsaoLf35mH9Tq16DaYb4koFU5cM1hFP5euOidf+vIpswLl2mpz4cG1m8PyrVR+5b1RynVerx+vboyudwPtUNa7maGEfnGiUE0tNhw62iH3bhDJTrylSBRDvEt3yc1k0KCm0iL4Xk2lBSaDJsN7RJQaPr8/6gInoGF3E3x+f4b3KD1KCg2orRaO4dpqC0oKDRneIyJSehvAbFR25wPrNeXIVFnOhnOu9LghSqXQ8jyovDRmm3rrnqOKj12ifBZvHo8nD/PmFVF6iMVpw+7OJaB3NLbE7LtlviWiVJPr+jxf+vJJHkL5Viy/8t4o5QPWu8qQDf3iRET5iI8MUVKUPFW41eYKLj1oMugwZ9JpePrN7fh0++HgZ2oqLZgxvgqFnDWQspTD6e3S+5kWGpeJLLNXZNZj4fRaweUEF02v5cyfRDJQchsAAIrMWtRWWwRvSCqh8yFQr3224zDKio1wuX3Q69RobnPgjEG9WK9lUKrKslSOy4ZcpvS4IUqlQCd1/c4m0eVuN2zci4cXn4dVr2wTjV2rzYWWNg/0Jf1wrM0DL1yKiGuiXBdvHo83D8ebB5O9tiXKR1Jx6nL7sGHjXiyZNRIAwm7mx9NWFopHDnshyg/Z1tecbX35lF2E8m2s/Cp0b5TtW8pFDqcXRr0Gk+oGYlB5abAPfkdjCzZs3Mt6N0OyoV+ciCgfcaAoJUWpsy00HbcLNjauu/w0XD56ABwub3AwRu8eBWyAJIEXjcpQaBaPMan3MylWXC6cXgtLN5Po31ptLjhdHvzwomr8eMJp0KhU0GhVKC5guSOSi1LbAAEGLbJiIOamrYei6sXTB/WScY/yTyrKcrw5ztLNhCWzRsbVhpKjrRWIG3baUT4I7aQWW47P4fJCpYJo7HalnasEvLajbJZIHpfKw/HevEpVzDP2KF9Ixalep4bD5cU7nxzAohkj4HJ7446LWPG4YGoN1GrlLqLG+Cfquq7m40Suz1NFaX35rItyi1C+dbi8eHDtZkyqG4jrJgzB4WM2wXuj2X5NmwqMh9xUVKDDklkjseHDfVj37q7g6zWVFiyZNRJFBcq5h5rr5Mi7FBvrPCICOFCUkhQ6C0skuWYdstpcURc0AL7/9xe48YphON7uQoFJi4p+JehenB8XOanEi0blUGIMChGLy+Xr6jsvyGI0QMXKWzobrWwkE4nLlvpHiBIWlOlKvUipVVJowKjTeqG8d0nUk+WN37ZKluVEz2WRWS95buVsa7HTjvJJoLy321yiOS3wcFKsQd2J1AFKa2Py2o6yXaJtUqk8HJoHbQ43isx6uD0+HGu1w+HywGTUpqQNx9ijfCIVp73KzHjsjnEJ50SxHLzihQbcMLEaR9s8sDc1KyLnBjD+ibouVX0q8Vyfp1Ii7ZZ0XzewLso9scqXw+XF7q9bMP7Mk9GjmxEFJh0G9S8LWx0jVX2USrvejRfjIXcZDVps+HBf1PLzDbuboAJw29W18uxYnsp03iVhrPOIKIADRRUs0LBut7nQrWc5nB7ALPdOfU+JU4W3tjsFL7SBzgubQ0c7cO+aTwAw6SWDA1ukZfJiWIkxKEQqLlvbnSm58Z4qbCQTSVN6/eP0AN8d7cCHWw5FLa3Up0chjHqNrPuYbL1IqRGaqwvNOsyZNAwrX2iIerJ8wbQayfOQ6nOphLYWO+0onwTK+8LptXjipYawQeNFBTqc1F18BYpE6gCltTGVUN8QdVWq26SBNoLN4UahSY/HXtoatt375p/b5bzP2KN8IxWnBr0Gre1OHGpqT6gfTSoHHzu/Enc9/u+w75O7X4fxT5QaSu9TiXV/INOzl4vtH+ui3BNPvvX6/GFL1BeZ9SmLJ6Vd78aL8ZDb7A5P1CDRgC27m2B3eIDiDO8UkYxY5xFRKA4UVahsaFgrbdah0IscIS63L/jfTHqJU3onjNzkiFmlxaAQqbiM9b4c5Y2NZKL4Kbn+sTt9eP7dXYJPCwPALVOHy7qfydaL1HWRuXr6+CrsbGwRLCuPvtggWe+n+lyyrUUkD0s3E+ZdMQwr14cPGpdqy8dbByixjcn6hnJFqtqkoW2EWO2DdlvX8z5jj/JRrDgNLImbTD+aVLxFxqsS+nUY/0SpodQ+FbVajXaHHyteiF2vSbVbMnHdwLoodyWTb1MRT04PFHe9Gy/GQ26Tun6Tep8o17DOI6JQarl3gKJJXRBabS6Z9ixakVmPfj2LUF1ehn49i2RNIAUmnej7el14cQ8kPYqPUjthlEDOmFVSDAqRistY78tR3uJpJBPRCUqtfxyu2E8LN+xugt3pzfAehUu2XqSuEcrVg8pLY5aVeOr9VJ9LtrWI5GG1ubDyhQbU70qsLR9vHaDENibrG8olXW2TRrYRYrUPIvuUIsWT9xl7lK8i4xQQH1Qi1Y+WaB9wYNty9usw/olSQ6l9KsXdemDFCw2S9ZpYuyUT1w2si3JbovnWZBCfSyqeeLLaPIq73o0X4yG3GfWaLr1PlGtY5xFRKA4UVSAl3kjKBiWFBtRWWwTfq6m0YEdjS9TrTHrxU2onjBIwZmMTi8vaagtKCg2C78lR3thIJsoNUgNBHU5PhvZEWLL1InWNUK4OnW1eiFS9n+pzybYWkTySbcvHWwcosY3J+obohMg6IFb7YEdjC2oqu5b3GXtEnbraj5ZMHzAgb78O458oNRTbp6Ixdfn+QCauG1gX5RepfKvTqrscTzaH8q5348V4yG0qlSrm9VtNpQUqlSrDe0QkL9Z5RBQq6waKvvTSS6iuro7630MPPRT2ufXr1+Piiy/GsGHDMGnSJPz73/+O2pbVasXPf/5znHXWWaitrcWiRYtw5MiRqM999tlnmDFjBoYPH47zzz8fq1atgt/vT9tvVOKNpFisNhcOHrFiZ2MzDh6xyjrbaZFZj4XTa6MubGoqLZg0tgIbNu6N+hsmvfgpthNGAbIpZjMtVlzWVluwaHptzNle5ChvbCQTJeZYmx0Hvm3FF/uO4cC3rTjWZpd7lwAABUbxp+HNEu+nW7L1InWNUC7u6sxgqT6XSmhrKaltTxQqnWWzK235+VcOl6wDlNjGVEJ9Q/lLabkmMsZjtQ82bNyLSWMrksr7arUaTg+gUasYe5TT4olvq82Ftg7xuJfKzWLt8Fh9wIC8/TrMvUSpodQ+FZtL/KHl41aXZN9ZJq4bWBfljnhyrtTS2labq8vxZDYq73o3XoyH3Obz+zFpbEXUYNHAmAFfGsd5ECkR6zwiCiXvnfIuePLJJ1FUVBT8d69evYL//cYbb+Duu+/G/PnzcfbZZ+PNN9/EggUL8Mwzz2DEiBHBz912223Ys2cP7rnnHhgMBvzxj3/EvHnz8OKLL0Kr7Tw0jY2NmDNnDkaPHo3bbrsNO3fuxEMPPQSNRoM5c+ak5bcp8UaSkKbj9qhlC2qrLVg4vRaWbiZZ9snSzYQls0aitd2JDrsbJoMW2w8048G1m+GIuFhn0ktMoBNG6Jzn+8CWbIlZuUTGZYFJh5JCg2iZkaO8BRrJQk/Zsr4gCvfdsQ6sfKEBW0KW6a2tsuDmqTU4qXuBjHsG6HUa1FZZopYQBjr30aCAZWWSqRepa4RycWBmMKHlZeOt92OdSwA4eMSa0PktMutx81U1WLG+IWyfaiotuPmqmrSXDyW27YmA9JdNqba6yaCNimeHy4vl6+qxfX8zJtUNxMQxFfAD6FVqRlmJMSxeldjG5LUdyUWJuSZyyc1Y7QOHy4t3PjmAW2fWwu7wJJTju/c6BQ8/twXb9zdjyayR8PkQtn3GHuWCeOI78JmJYypEt2XQa7CzsVk0xoTa4SajFo+90BDVBxzYFzn7dZh7iVInFX0qVpsrpX0yZom+JrvTjTsf/Q9qKi1YME247ywT1w2si3JDvDnX6RYfwGw26rocT0VmreKud+PFeMhtRr0Gb390ANXlpZhcVwGX2we9To0djS14+6MDmHfFULl3kSijWOdRgM/nh1rNWZXzXdYOFD3ttNNQVlYm+N4jjzyCyy+/HLfddhsA4Oyzz8auXbuwcuVKrF69GgBQX1+P//znP1izZg3GjBkDABgwYAAuu+wyvPPOO7jssssAAGvWrEFpaSn+8Ic/QK/X45xzzkFzczMef/xxzJ49G3p9fg5WstpcUYkE6FyuYPm6eiyZNVK2hFJk1ge/22pzoU+PQlSXl0XdcJ82rkqW/ct2o4f3wcQxJxrVzW0O5PtzV9kQs3ILjct4hXZStNvc0Kl9KOtmRmlxem4gujxeTBtXFXXTLlBfuDziHStE+eJYmx2PRgwSBYD6XU149MUG3DqzFt3TFKfxMBnUmD6+Cn4gbB9HVFkwfXwVChVywZtMvUjJE8rVGzbuxZJZIwF0bbBG5LlMdhCM1ebCk69uE+zAfPLVbbh15ulpKzNODxTbtqf8lonrTqm2/PYDzVixviH42oJpNdjUcCj4QMK6d3eFfT5QrwQotSOWDy1QpimxH6npuB3bDzSHDQwVax/Mn1LT2c4tjv87nB5g9Ws7g+3SB9duxqS6gZhc1znA/KQyM0qLjYw9ymrxxDdwor1ZeXJpzAe2aiot+HDLoWB+FWtHC11T3XDFMLjcvrAHB+XOuQHMvUSp05U+lbQ8uOK1x7ymqKm0YEdjC4DOtsWK9Q1YfHV031mmrhtYF2W3RHKuVL7V6zoHOHclngxaKPJ6N16Mh9yl1apx5Q9OxfPv7grrt6mptGDG+CpotVm36C5Rl7HOIwBQq1V4/p+70NRiS9k2q04pxUVnl6dse5R+WTtQNJavv/4aBw4cwJIlS8Jev+yyy/DAAw/A5XJBr9dj48aNKC4uxujRo4OfqaiowODBg7Fx48bgQNGNGzfiwgsvDBsQetlll+GJJ55AfX09Ro0alfLfoNQbSaFa252CF71A5wVJa7tTMft575qPg53woTfc713zMR5efJ4i9jMbxLoABU7cEM3XY5kNMZutAp0UNpsN27dvR+8eg9P2XdYOt2h98eCiOlkHvxEphbXDLThbJ9DZBrB2uGWNFYMW6NW9AGNq+mDS2PAHG07qXsA6OU8J5erAzGCLZoyAy+1NSedIVwbBtLY78ckXh/HJF4djvp+u8mu1ebKibU/5JxPXnWJt+WnjqnDvmo/DPl9WbBTNg0L7pNSOWD60QJmktH6kQM4OzPIJdA7ecLi8eHDtZsydPBTzJg+Fw+XpUsxabZ6wh5ccLm/YjcrH7hjHOKSsF098B/4biD0gO7AU6INrN4f9fSKDyQuNKlx70cmYO3ko7M6uxW86MPcSyStdD660HT+KBVNrsOKFhrBtC9VrDbubYO1wCfadZeq6gXVR9kok50a2cwNqqyyYMKYCq17empKHkpV6vRsvxkNusjk8cLq9GFPTJ+x+37FWB5xuL2wOj9y7SCQL1nkEAE0tNhw62pGy7XFFuuyTtQNFJ0yYgJaWFvTp0wfTp0/H3LlzodFosG/fPgCds4OGGjhwINxuN77++msMHDgQ+/btw4ABA6BShU+rW1FREdyGzWbDt99+i4qKiqjPqFQq7Nu3r0sDRf1+P2w24ZHaBXpg8cwRsNo6l7PSa/woLtDDrI/9N5nUbnNJvO9WzH5GdsKHv5/6/bTb7WH/nyta2sQHELS0OaCBMhvWZrM5JduJN2ZtDg/MRi2KzFoYtMnHbDxlyenB99/pRoFRh0KzFoasrdljy0RcddjdovVFh10Z9Vqu1jGhUhWzgHjcKpmSz3OH3S35vhzHPPSYFZhMOGtIz7A6+dR+xV2qk1NNCfV3qspZtsRs7FwNwKBBWWFgqTgPbLbk2jRdaS/J0b4OnPsOe3a07fNVOnJCtsRtpuJCqH7QatS49Q/vRy1f63L7ktonDYCywtTUNclSQu7pKiW3kdIp1TELZP4YWhXWjxSas0Nn+QzcQOxrKUS3AjVOdJ0mF7PMsZmlpDoiW3JtKsSTrxGyHlFgQHZo3PXuYcamrd/iwbWbo3JvIv2Odrsdx5uPoH9/M3oEB2GJx28u5Ec5KSnuuiIXYjZXzkU6peMeh91uh8/ng8bvCF5TtHW4YHd6sKOxRbBe67B7YpYRJVw3ZItciNtEJZJzhfKtXqdGcYEBdz2+CQ6XN+n7epH1TWi5dXqAljYHvjliZV5Ng2yu61Mds2LHot3mxu+e+hST6gaie4kx+HrTcTvWbPgc98w7JytiPiCbz3ui+FuVJZ25Vuj3q1QqmEwmeP0+eH2pW+nTi87+XF+qt+vv3K7dbg/2t8lJqkzx+CYmG2I0Urwxm3VNM4vFgoULF6KmpgYqlQr/+te/8Mc//hGHDx/GsmXL0NraCgAoLg5fByrw78D7bW1tKCoqitp+SUkJPv/8cwCA1WoV3JZer4fJZApuK1lutxvbt2+P67M2AMeFr19l0a2n+NTBOo0v7t+WTt0sEvupTt9+HjhwIC3blYu+pJ/o+63tdjR9czBDe5OYM844IyXbSSRmOwCkKmSFypJarUb3XqeELWEHdD4NOndiNY4d/go+n/hN7GyUzrgqPWmg6Psmg0YR9VpArtUxoVIVs0BicatESjzPSo8VoWOWyjq5q5RYf3e1nGVrzKajXBgk2kttIu0lOduteo34++n8bopfKnNCtsStXHHRgc7rn8gbugCg14kvT6bEeFFi7ukqJbaR0imVMevxdN4IztQxDJQ/qUHWmY6d0D4OoQcGf3PT2fj2q673cciZ3/OZEuqIbMm1qRBPOY8UGXd//Ml5MR/cBRLvd4ynDORifpSTEuKuK3IpZrP9XKRTV67ZpYQe97KTBuLORzfF/KxZYf3M2SqX4jZeieZcoXbusjmjgte6Xb2vF1rumVczKxvr+lTHbOAYCB2L0pMGik4MI/c9jGRl43lPFn+rMmQi14b+fpPJhCFDhsBhd8DWkbrB3C5H54MWTqczpdt1FHYOt9u/f7+iBhPGKlM8vslRcoxGijdms26g6NixYzF27Njgv8eMGQODwYC//e1vmD9/vox7ljidTodTTz1V8nN2ux0HDhxA//79YTIpY9pem6tz2YzQ5QoCaiotKCkyo3f39C0RHS+np3PJwFjLpZd1M6d8Ketkz5fSn14/2ib+VGFJoQk9+sh/ztMp3phNFbGy5PQADz+3JeyCGwDqdzXhydc7Z0RSUvnpqkzUgy0dPpw5uBcG9C3BoPLSsKXn93/TCoNei8GD5S/jSswJSpbpuE0VJZ/nlg6faBtArlhR8jEL5fQAK1/YiqpTSjFpbEVYXfPU27txy9ThGau/lXjMsjVmA5ok2ktFhSZUxGgvJdNu7Wr7MVAGigv0GW8zU/yUGKuhpOK2K+VUjuu5gFjXPzsaW2LmQaXGSy5dOyg9HrKBVquFx+PJ2DEMlL/Kk0sVFTuZ6uPosHtQW2VB/S5l/O5cl846Qs5+O6W3kePJ14H/jvUZk178YIbGpNi5SKQM5FJ+lBNzczS5YjZbz0Um69euXLPHInTcpe6fFRXo0UsB/cx0gtJzbUBXc25NpQV7Dh7H9PFVGFReCo1ai559K5PuTwot98yrmZGtdX2q6XQ69O3bN+axaGmXuIehU8b9vnhl+3lPJNdn+29NRD79ViA61wr9/sBq0EaTEeaC1M2orjfqAQAGgwHmgtTNkmo0dc5YPGDAAMXMKCpWpnh8E5PLMZoTTbJLL70Uf/7zn7F9+3aUlJQA6JwN1GKxBD/T1tYGAMH3i4uL8d1330Vtq7W1NfiZwIyjgZlFA1wuF+x2e/BzyVKpVAlN12wymVI6vXNXtHRYMWlsBQCENbJqKi2YNLYCTrcXPbpFz9iaaWYAC6fXYvm6+rCLotpqCxZNr0VpcfoCOpHz1XTcLriPC6fXwtJNGZVOKVyiF6ClxUaYzXoZ9ixzEo3ZVBEqS81HrKLL5HQ4vCjtKX8Mplo660EvXPjxxNPwxMvbwp4yrKm04MYrh6G4QK+oMq6knKBkcsVtqijxPHvhwozxVQCi2wAzxlfJHitKPGahWpqsuGhUf2z4cF9UXTNpbAVsTi9KizNbfyvpmGV7zOpt7aKdkHqtOubvS7Tdmsr2Y4FJK1ubmeKnpFgNJRa3XS2nXb2es9pcaG13osPuRoFJh5JCA4rizFGxrn82bNyLZXPOhlqN8H2qsmDB1BqUFivvHOXitYNS4yEbBDqFM3UMA+Vv+/5mLJk1EkB4G1KuXJO5Pg4b5k6sxpOvgzm2CxKtz1NdvuXut1N6GznefC32GYNeE1dMxnsuYpWB0LJk0GtyLj/Kibn5BLljNpvORabr165cs0sJPe5mM7BgWg1WrG+I6jtbMK0GPbolf366co1Dsckdt/HqSs6tqbTgivMGwu/349WN4f2SycZdaLmXuu5s7XDD6fKy3KZINtX16RBYPhkQPhZttnbRexgadWqX1M6UbDzvyeb6bPytycqX3xor1wr9fo1KDY1aYhm0BGjQuUKUOtXbVXVuV2mDCKXKFI9vYnIxRnNioGioiorOwYv79u0L/nfg3zqdDieffHLwcx999BH8fn+wkxzonLa2qqqz4WA2m9G7d2/s27cv7Dv2798Pv98ftv18025z48G1mzGpbiAm14XPhvXg2s24b/65cu9ikKWbCUtmjVTsxbPV5sLy5+ujZpeo39mE5evqsWTWSEXsa5FZL3oBqoR9zCcddneX3idhq1/ZFtVR2LC7Catf3Ra8qUmU74rMevQsNWHsiD5hbYDmNgd6lpqYDyR4vX5s+HCfYF0DADdcMVSO3aIuCL1J4/P7RR+mstpc6C2yrXjbreloPyq9zUzZx2pzRV07AImX02TLZmhHtFGvwaS6gRh+ag/otRoUFUhvI9b1z+ABZejdoyBsn0wGLdz2VhQaVTG3JydeO5CcAuXL4fIK9iP1KjPDoNfg4BFrRvNPJvs4jh3+CotnjkCHw8scmwS5B2mmKp/lEqFBSvHka6nPSMVkPOdC7JZUZFlaes2Zor+T+ZEoveSoX602V5eu2SO31druRLvNhW49y+H0dA7iCzipewEWX10La4cLHXYPCkxaFBXo0b0LD4nInRMpc8QGBCeac60dbrg8XmzdcxS7vm7Bl/uao/olUxF3UnnzmyMduP+pTwGw3FL6tdlccLm9GBNxD+NYmwMutxdtNhdOknsn8wCvpYiIlCknBoq++eab0Gg0GDJkCCwWC/r374+3334b48ePD/vMOeecA72+M9nU1dXh0UcfxUcffYRzz+0c1Lh//358+eWXmDt3bvDv6urq8N5772HJkiXQ6XTBbRUXF6O2tjaDv1JZCkw6OFzesCfOIt9XkiKzXrENjZY2h+ASZEBnQ6mlzaGYfbd0M+HWmant3KDkmAza4A3vyGXSN2zcCxPX8EhYa7tTNBZb252KiUXKD2q1Gk5P59PYSrqhbLW5cPS4HZGz/Pv9wNHjdphNOtn3Ucl8fr/gzBVA500KnwKWp6D4Rd6kWTZnlOjDVA8vPk9ym/G0W9PVfuxqm5kzm1Co1nan+GwiCbStEi2boR3RRr0GS2aNxNsfHQAADCovRXObA0UFDpzUvQA9S2M/DSx1Ay7w/zabDdu/OYLevbrHvY+ZJHV9rrTrd8otoeVLqB9pxe3n48G1m1M24CGRXJSphyR8Ph8MWnBmwiQo4cZiKvNZLpAapBQY0Nna7sShpnbB3JlsTMZzLsoKhYeKCpUlvU4t+luZH4nSqyv1a7LXnmajDr947L9dumYH4h+w2b3YlLJ7J0rIiZQZkeXLqNdg7uShGFReBofLEyzz/STalqE512pzoXuJES63D8/+Y6fg57varpHKm6F5l+WW0s2o1+JXaz7Bgum1KC02wubwoMCohc8P/PG5z/Drm0bLvYt5gddSRETKlHUjiebMmYNRo0ahuroaAPDee+9h3bp1uOaaa4JLzS9cuBC33347TjnlFIwaNQpvvvkmtm7dirVr1wa3U1tbizFjxuDnP/857rjjDhgMBjz88MOorq7GRRddFPZ9r732Gn7605/ihz/8IXbt2oU1a9Zg8eLFwUGn6SL1RKKcSgoNGFPTGz844xR0LznRwDra6sD7//sKJYUGuXcxjJJvWrdn0ewufGJVOfRaNX4592w8/+6usBttI6os+OXcs6HXind2xyIVK8fa7Dk7ULjdJh5rUu9TdlJyfuje6xQ8/OyWsMFgSqhz220uvPjvPRjQtwTdS4zB15uO2/H/vvgO864YqohjqNRz63B6u/R+pij1+CmJ1ebCEy81oPLkUkwc03mDqdCsxw1XDMPRVnvU52sqeyTdRo48H1LtR6n30yFWO/GWqTXweH1ot7Es5ZtUz2KZSL3UbnNh4pgKXDyqP8pKjDh42IpLz+0vuLzejVcOR7vNFXObsQa0hO6P2aBFt7KeCf2eTCopNIgu56u063eSV6rbAKHlL/Jhx6ICHaw2J7bvbw77m2RvHCfTZ5HMQPRMt5GyoV2Wrn1Uwo1Fzsp8QuQgpdCY3n+oFQ6nBzqtGo++0BB1HXvD5GHweH0w6DUoFIk7sZiM51xEDhQNlM22js62QeXJpdiwcS8cLi92NLbEXIKa+ZEo/aRiurXdBcAalVNi5fv5Vw5Hu90FszF2HiopNKCmsofg98V7zR5rwOb2/c34bMdhDO5fBrvTk3Q+jJVTlZATKf0i+5o8Xj/6Wgqw+tXPsWJ9Q/BzgTJfVBA+GFTsIccisx47G5sFvzegK+2akkIDFkyrQVmxMWpik+ryMuxobAn7PMstpZNBp8Gd152F597ZGdUuvfO6s2DQpW5pZIqN11JERMqUdQNFBwwYgBdffBHfffcdfD4f+vfvj5///OeYPXt28DMTJkyA3W7H6tWrsWrVKgwYMAArVqyImgH0j3/8I377299i2bJl8Hg8GDNmDO666y5otScOS3l5OdasWYP7778fN9xwA8rKyrBo0SJcf/31af2dSh+QV2TW45rLhmDlC1ujlui4ZepwRTXslX4spWZ+NCpkZsh0LHGaazJ588bt9WHdu7uwJeJ8bNnVBJUKmDc58aWLpWLlu2MdWLG+ISrmF0yrwUndC5L/MQphNIhfGEq9T9lHyfnB6QGefG2nIutch8uLS87pjw0fhg+2CSzT5XDJP9Cx6bgdn+04HOyYbOtw4Yt9x3D6oF6yn9tCs/jT9VLvZ4KSYyMdks3fbR1OXDQqOhZqqy2YNq4K9675OBgPgXyZTNwKnY/75p8r+jdGfWbbj+IzmzSgurw0eIxyuSxRuFTOYplIvdR03I7HXtwalkNvmVqDDR/uE1xe77EXtwbLaG21BTdcMQwqFVBcELsuENyfKgsWTCuDWSlPd4bI5BLblN3S0QYIlL8nXmoQzJs1lRYsmTUSD67dHNaOTPTGcTKzbCXaBpCjjZQN7bJ07qMSbixyVuYTQgcpBWbsDo3p6eOrsLOxRTDfPv7yNlSXl2JnYwtmjK/CST0KYNRrEorBRM+FUNkMrXM2bNyLJbNGAghfgpr5kSgzpGLa5nBj6cr/hOUUsXz/aES7XigPFZn1mDt5GFasb4hqj0ResycyYDO0TowczJdIPhTLqTaH/DmR0i+yr2n6+Cq8sWm/YG599MWtGDuiD04f1AsA4pqFNJ3tGofLi00Nh8KuxWsqLVg252w43V787vtl50Ox3FK6eP2+qEGiAIIxMn/KMDl2K+/wWoqISJmUMQItAXfddVdcn5s2bRqmTZsm+pmioiL85je/wW9+8xvRz51++ulYt25d3PvYVdkwIO9Ymz1qkCjQ2am28oWtWHx1rSJmGcyG5TjUKlXMp9drKi1Qq1Qy7FW0dC1xmisyffPG64Po+fD6EtueVKwsnD4iapAo0BnzK9Y3KCbmu0Kv1YjGol7LgaK5ROn5oc3mUWydq1apBAfbBP6dzED1VHJ6gO+OduDDLYeiBrb36VEIo14j67lV+qxuSo+NVOtK/vZ6/TEHnvl8wKS6gcEbTw27m/Doiw0JH79Y52PrnqOiOctszOxlntjMJg27mzC5riL471wtSxQtVfVdIvVS8LMRObR7iTHqAauA0DJav7MJj7/UOZBl99ctgnVBzP3Z1YQVLyQe55mSqSW2KXulsw1g6WbCTVNr8Kdn62O2IUPzZkAiN44TnWUr0TaAHG2kbGiXpXsflXBjUent90wKjclJdQOj2sKDQh4OihTIt4H350w6DcvXfZFQOzy+c+EB0HldKFQ2I+ucB9duxqS6gZg7+TQ4XV7mR6IMEovpmkpLcPbB0JwS77VnrDxktbnw6IvCfdyh1+yJDtgUqhPF9kOIVE69acpw0b/nYJvcENnXFE9uXb6uHqOH9xF8mCNy4PKCaSPS0q6JdS3esLtzYpPBA8oEJxdguaV0cbn9ovdXXG5/hvcoP5mMWtE+bFOG+7CJiKhTcmsTU1rFMyBPbtYOF3Y2NmP6+CosmzMKS685E8vmjPr+yfFmWDtccu8igPhuFMhNrQYmja1ATaUl7PXAzGxqhUSpEpc4VQqpThyrLfXxYJM43lJPGEeSipV2m1uwIQ90XuynK+aPtdlx4NtW7P/WhrLepyINhzLI7fWKxqLbK/8siZQ6Ss8PHTbl1rl+v1+0PvD75e1ksTt9ePn9PaguLw1ro1SXl+Ll9/egPZ0VSRwCs2rVVofXNUqZtUbpsZFKXc3fPr9ftD08qLw0arvxHD+rzYWDR6zY2diMY612wfOxYeNeTBpbgdqqGDnLk9mcJTWQx+UOf4Il18oSCUtVfZdIvdTS5hD8bGQZjKTVqINxPLmuAmcPPQnb9zcL1gXZXE8WmfXo17MI1eVl6NezSPacQ8qS7rJtd8R+EKphd1NU3gSkbxyH5sw2iWvS0FyVTBtAjtjPhvom3fsYGEQkJFODNJXefs+kApMORr0G08dX4ZxhvaOuC6XyrVGvDeZav79zmeZQUu3wRM6F1eYRHUwWqHMcLi92f92C7iUm5kfKmND8dfCINS19x9kgVkwHrms3bNwbfC2QUxK59hTKQ/HkLal2glAdMai8NGZfWeh+iJ17qX1ze3yy50Tqmnhi3xfR7yqVW11uH+p3NqGs2Aigc5Do7bNGwqDX4NJz+gf7qYx6Dep3NmHVy1txy9SalLdrxMrvll1NqOzXLep1lltKJ6l8IXWPlVLD4fRgcl0FRkT0YY+osmByXQUcTo9Me0ZElN84TF+BsmFAnt3hiVpeCDixfI/doYzE3mF3w6jXYFLdQAwqL4XL7YNep8aOxhZs2LhXEcsadCsy4u//2IGJYytw3YQhsDs8MBm1ONbqwL//9xVunjpC7l0EIL2EaaaXOFWSRGcuSQWjIbXnQ3o5N/GYlno/GYePdaB+VxO6l3QuHW1zerCzsQW1VRb0SsNS93aHNziTxOS6irD64sG1m/GrG8WX+aXsooQlDMUYDeIz2MpZ50otLS/30vNOtweXnCO8rOmksRWy7x/QOavWrTNrYe1wocPuQYFJi6ICvSJmZlZ6bKRSa7sT2/d3DvQUaicea7XjUFN7zFmFnC6vaHvY440eNC11/CJnLVl6zZmCn3O4OnPWffNHY+LY6JwltTR9qkkN5NHrop98yqWyRLF1ZRbLwFKPre0uLJszKhibkfW4zeGG1eZCc6sDbR3CnxUqg6HUahXuXfVJ8N+1VSeWpY1sy+dTPUn5Jd1lO9GHCqRuHIfmTKNeg9/ePEZ0+6G5KtaSsYG+o68PW1FcoA+rr+SI/XR8Z6xldJOV7uMSGEQkNKtbJgdpclbmTiWFBiybczaef3cXKvqUAAiPnW5FRtG/d7g8uP/7ZWdDc21obpfqR4v3XEg9QB2oc/JxwC/JK9OrUnVFqnOGkNCYbm13weZwB69rI9v9gf0QE9nuj8xD8eateAZshn5GajCfzeGWPPdS97LsTo8iciIlJ57Yt9pc8Pk6+4IC517qWjbwvsvtC84k+tp/9oWtqBHop3pw7WZ88sVh/HjiaSlv10jFVmQPGcstpZtJ6v6KxPuUGh12NzRqNaaPr8S1l58YA2F3uuF2+9mHRkQkk/wd2aVg2TAgr7hAj2f+sTPmkmE3TRkmx25FKTTrRG/gF5rlX9agyKzHtZefFrWsd02lBQum1SjmQslkEF+WW6rRncvkuGGU6vMhvZybeL0j9X6ijrXZcaTFjv80RC8d3ddSCK1OnfIBVVL1gRLqC0odJSxhKMaol1iSQ8Y6V+mxolapBZf7Cvx73uShcuxWGCXfGFJ6bKSSzeEWbSd+e9SG3/z1/wEQPj/FBXo8/daOmGXt2ssHR32n2PETmrVE7IaAw+WFzyd8MyrT5yneJQND5VJZInFFZn3C1zRHWmz49mgH2m3u4A2y/d+0Rg0oMeo1KDTp8eDazWHlL/RGmMPlxY7GFtG8unXP0bDX6nc1wefvXEIysi2fT/Uk5Zd0l+1EBnZI3TiOzJmT6gZiz8HjMeM8ctBpZFyHLs8Z2iYIzf9yxH6qvzMdbdB0HZfIwUm3zqyFw+lBu02+QZrJ5LNctP69XcGlbiNjZ/r4KtF8G9omDM21kUvqxupHiywXfSyFMc+J2She9nr3KMBjd4zLywG/JB+pmSrjWZ48U9LZbyE0ALVfzyIAVixd+Z+Yfxf4bCLXnpF5KJ68JdWXLzRgU2owX5FZL3nu47mXxQcXslM8se9weaM+U1NpwdlDT4ort+p1akyqGyjaJ3r7rJFQq4CWNhf8foTEXtdJxdZJZWY8dsc4llvKGL1O/B6qXpe/97Qzqcikh9Plw/P/3BV1r3fG+CoUmVgPEBHJQf4RhxQlGwbkub3iy866BWZQkoPRoBW9MFp8da0cuxXGanPh0RcbBPfx0RcbFNNBVGjW48Yrh+GJl7dFNeZuvHIYChWwj3IxSczuKfV+MgrNeswYXwUAgo3rRM+HWCdbbbUFhWadaL1UVJDa8+9wePD8u7vEB6MXp/Qrw2bGiOyMWzbnbC6DkmOkyrzc59tkUKc0xlNJ6ccucommUA27m+Dzy9tGUfqNIaWf31QqMuvx1JvxDfQUOj9uj0+0rHk81WGvSR0/odnNxAa31VZb0PidFStfaAi+JlfOijXbV2Am3wfXbg77fK6VJUqtw80dWL4u+iG6SWMr8PZHB8IGlMydPBSPv7w1KnYCfxv47IaNe7FsztlQq8NnB6qtsmDCmOgyGtjG5LqKqBte+VRPUn5Jd9mW2n6/noV4aNHYuG4cR+bMQeWleODpzVgyaySA6Pbz/CnDw7YXGdexbqqH5n85Yj+V35muNmg6jovY4KTq8tQMZqDktLY7Uf/9DGU7GlswZ9LQsNjZsHFvzDgUahMGcm0kocEmiQ5aKzJrRcumpdSkiP5Wyi9yrEqVjHT2W4jFcjw5JZFrT6E8lIq8VWAKH7DZbnOj0KgR3a7b45M89yZjfPey+OBC9pGK/XabC4+9JHxd++w/1LjmssF4+i1EzRIaKPO11RY0tzkwqLw06uGL0G1Nu6ASdz3+3+BrqXxoXSq2SouNLLeUUWqVSvT+ilqlkmvX8orPD4l7vcPl2C0iorzHgaIKlOoBYOmQLcvt2R0e0Rv4docn5YPNEpUtHUQA8Pe3t2Pi2ApcN+HE9PDHWh34+z+24+apI+TePdnotGrRQZQ6rfgTxckoMutxUo8CzLywMux8OJxunNS9IOEyI7WcW49uJiyYVhNz5ttUz+7pdHtFY9fpTs/S0YGZMSK/T61G8GYH5QalLGEYi0ELdCtQYeyIPphcd2JZ6eY2B3r3SDzGUylw7DpsLvhxYukvFTrbMHIfO7vTI/q+Q+L9dFN63ld6bKSS1EBPjXpI2HJfGzbuDTs/UmWtxeoM/nc8x0+o/RzrZntttQXTxlXh3jUfR+23XDlLaGYTvU6DVS9vDVsyMBfLEqWG1eZCS5sD3zXbMLmuAtXlpdiwcS8AoLq8FAa9BhPGVqDk+weUGr9txaDyMqxY3yC4vdDBJ4MHlKF3jwIsmTUSza0OHGmxobTICD/8+Pmjm6KWtQzwA1E3i2PWk1UWLJiqnBUhiBKVjjZAYMYwm8ONIrMecyYOxZExNgAI5tbBA8qC15y9e8S33cic6XL74HB58eDazZhUNzCs/byjsQXtNlfY5yNvZIvdVA+0z/r1LMp4GylV58Rqc+FYqz0tbdBUlxulP1SVTWItGd2VpaRDY2/Dxr347c1jwh5aioxDs1EHg16Dj7Z9K7iMNBC9XLPQQK1kyoVBi7y5rqHskS33VNLVbxFPLMcTt5HXnka9Fjsam8PqmVixHm/eSmwwqR9Otwe3TK3B6le24ZMvDkdt91irXfTYBM59pu5ldSUXkDChYwp0xlNruwvL5owKtn8j86Hd6Y0Zc59uP4zLRw/AebV9MWfiaTjSYodK1dmWfnDt5mBb2g9g/6FW0X1st4XXMalsX+VTfyJlB7UK0GmAOZNOA3DiHgYAOJ1uqDlONCOcbvFxGk63vPdqiIjyFQeKKlBgAJgSB4cEZHoZ6mRlQ+dLNuwjALR1OHH+yFOinmoNPLnY1qGcAa2ZZrW5MGls501ooWNjtbnQO03fve693YJPYCdDaumak7oXYPHVtbB2uNBh96DApEVRgT7lg0QBwOEUHwga62Z+V4TOjBFJCYO3KPWUvlzT0e++wllDqtHh8Ab3b1D/MkXsn8fjxZMbvoiq826ZKv8ToFKzOBvTMMtzIrIh7ys9NlJFaqDnt0dtuP+pTwGcWOrNanNhZ2MzCkw6ybLWx1IQ98xogPDMSaE32+dOPg1OlxcFJh00ahUW/f59wXwoZ84Smtnk1pmn53xZoq4TmlmoptKCO645E36/H69ujF4O+qYpNWjrcAptLsio12LZnFHo17MQPb6fJaXIrEdZiRFtHU64vx9cFkuvUrNgeY2sJ00GLdz2VhQaeaeBslsq2wCBuN6+vxlLZo2MmsW7ttqCP/3kBygqEH7QSGwAQ2TODCz36nB5BQd8nn9Gv7B/R97IjhyoFinQPpOjjdTV7wych4tH9Rf9XFfaoKk8Lkp/qCpbCOXVUaf1wtzJw/Doiw1xzcopFIOhsedweXGkxRb13aFx+LsFY6DTqmMOxAbCl2uONZgk2XKRL9c1lD3iWfZcCbrSbyGWv+OJ5X49i+KK28hrz7ISI06r6B5XrEvVDfEMeIs1M+p1l5+GS88ZAIfLG7yn50dqlrxPVX9RojM0k7TIY2rUa7BsztlY/96usPsNgb6lyIcnHC7x/imTUYuq8s47TAa9BnanF2cM0uG82r5hM3XaHeJlJDTnBqSyfcW8S0rS7nChuNCIR1/cGnUP4+arhqPd4RL5a0oVu9S9Xon3iYgoPZQxmo+iWLqZcO7wPsGlK3RqH07t1xOlaRiQlYyiAj1GVFqwReApkBFpWIY6WdnQ+SLHsuXJ8Hr8okuf3DB5qBy7pQhmow6/eOy/gjOXPLh2Mx5efF7Kv9Nqc+GJlxpQeXIpJo4J/84nXmrArTNPT3o2ELG/615sSsvA0EiSsWtMfexmw+AtSj0lL9fk8/lg0AKlPZW1vGLTcRtWvrBVMB+sfGErbp05ApZuZpn2rnNZGbFZnuVeViYb2iaAsmMjVaSOdWgHeuhy9D/540YAwG9vPle0rBUV6NG/d/w5s6TQgFGn9UJ57xIMKi8Ny+2N37biivMGBs/JjgPNooPbImeJkFM+lCXqmlgzCzXsbsKYmj7YtPWQ4HLQK19owFyJaxCHy4PX/rMvapbdQLm02lyiswWVlRhjbju0bNtsNmz/5gh69+ouuj9E2SAV9XZoXE8fXxVzWffHX94qOAu21ACGyBlBdzS2xMzJtdUWmIxaHDxiDbthHXojW2qgaGibQY68lux3hp6HiWOil/cO1dU2aKqOC6/Luy5WXi3vXRK1SgwgPJtYrBhcMG1EMPaMeg1Ki8SXaC4u0IsuRTuiyoJuRYbgLP7dS0ww6DVRn+tKuWBblJQkFcueZ0Ky/RZS+TveWI6MW6vNFZXHpQaOSpH6vNiAN7GZUX2+L1AdMVN5bbUFt86sTcmS913FmbtTT+iYTqobKLrU8qS6gcEyUlttQaHEuS0OebBK7PyUFhtjlrOaSgt2NLYI/l0q21fMu6QUhUYDVrwQ3fZt2N2ER1/cigVTa2Tas/xSYBQf42CWeJ+IiNKDtW9W8AMKm5ike7EJN08dHjVQpKbSgpunDs/IQLJ4mIxa0Rv4JgU0QORYtjwZXr9fdHp4r9+f4T1SjpJCA2oqhdfIq6nskZZOvrYOJy4a1R8bPgyfXSlXZnjVasQHemk1qa8Us2XwFpHc2m1u0XzQbnPD0i2z+xRKpQauOG8gxtT0QfcSY3Cw3bFWB3p0M0Etc1rNlhtDuSp0dhOTQYcF02rw5KufRw26FOpAb9jdBI+nOvhvp8snOqO4Q2LG0khFZj3mTh6GFesbonL7gmnhy1kbDdE30ENJvU+kJGIzC3UvMWLLrhOzskyqGxg2kNqgVePMwb3w6fbDUX9bU2lBj24m0WXuuDweUXqExnU8y7pHDgaJZwDDwum1+GzHYZQVG+H2+HDOsN7Y8/VxrNnwediyszdfVYPHXmiIWgY2MGglnkHj2do+Cz0PUoNplfIbeV3edbHyaryxKPZg8l9e+zy4tPJFo/qj8TurZLmKlWtrKi2YOKYCP390ExwuL2oqLaguL8X5Z/SLyr8sF5QrsqXtmUy/RTz5O5lYlnP2y1gD3sSuXxp2N2FyXfjDGfU7m+BwepJa8j5wDTT81B5ot7lx8Ii1SzM0cubu1BM6pmI5N7SM1FRaMG1cFQrMnf1TZcXGsLy7YeNeVJeXQa+Lr48nZh1TZcGEMRV4cO1mwb9jHqVcZHd5sLOxGdPHV0U9kL9h417YJWbypdQw6DWorbIIruZYW2URfEiMiIjST/5RciRI6cs/WG0uPPXml5g4tgLXTRgCu8MDk1GLY60OPPXml7h56ghFXFA6nJ6U3sBPBzmXLU+E3SF+rKSWb81liQzsSBWvV2KG1yuye4bX1nanaFy0tbvQt2dqv5ODt4jiIz0DhLz5wGzQwqjXYNPWQ8HBRUDnbDUzxlfBLHPnZ7bcGMpFsdrXy+acjXvXfBwcVBLINUId6C3WE8tcO1xe/PG5z2LOKH7f/HMT2j+rzYVHX4z1pHtD2MweSp85lygRYnklMMufUa/Bklkjox6Sqq224MYrhkGtAj758sQgsBFVnXH8zNvbcevM00W/n8vjEaVeaFxLzdYZOQt2IgMYNm09FJXX//STH6Dd7oLZqIPJqI0aJBrYTuig01xtn4Wehw0b9wZnbw1tPyjtN/K6vOti5VWpWAz8XYfNhWsuG4LVr34u+GCy1+vDTVNr8Kdn67H9QHNc5So017Z1uOD2+LB1z9Hg0ruh7e+zhvSK2jeWC8olSm57Bh6stDncmH/lcDz+8ta482I8+TvRWFbq7JdS/WJC9W27zY3q8qKElrwXuwZK9j4hZ+5OPaFjJpVzjXotls0ZhR2NLXjg6U/xu4VjsanhUNQy9cvmnA2n24tVL2+NewW5QB3T1GJHh90Nn98Ph8uLtz86ILgyDfMo5Sq7wy1Yh9ZUWrBk1kjJe96UGnq9BtPHV8EPRN2rmT6+CnoOFCUikgUHiiqQUi+AQ7V1OHHBmeU4etwOtarzwsfh8qClzYELzixXzGyG7TY3lq+rx4LptVEDWpevq8dd14+SexdlWbY8GWYTp4ePJZGBHani8/tFn4bzpWmG19CZ2NLZkWky6vDL1R/HjIsHFo5N+XcWmfW4+aqaqKXYaio7Z6FRQp1GpATSM0DImw9cbh+ef3dXWMcD0NkRoQJw01XD5dmxCKOH9wmboae5zYH8nZs7/cTa1wDwx8XnocXqRKFJh8MtnQNKhTrQQ2d61+vUcLi8MWeJMOg12NnYHHe+TGRgjEajEn2gQpOGmbeJ0iVWXjHqNehZZsKyOaNQXGDA2re3Cy6X+8Qr2zDtgkpcfE7/sFmkVSoVGnYfjWtWHC6PR5RaoXGt14lP5+50e9F03B4c7BDPAAaxvP74y1txwxXD0NbhgsfrQ3nvEjTsPhqV1yNzq5IH7iQr9Dw4XF48uHZz2DV2354F6F5iUtRvzNVBu5kUK69KxaJOq8ahpnY0t9nx/Lu7o66nQh9M9jk8wcEskeVKr1OjX89C9IgYwBTItd80WfGvzQcxqLwUFTNPD+vrcbi8gvvPckG5Roltz6bj9uBM3S63D20dbky/oBJzJw2F3emRzIsddrfgCgCBvuoOuxv9ehYlFMuJXCMfa7PD2uFCh92DApMWRQX6tK16J9UvJlTfBv4mkSXvfT4/nnz1c8FroGTvE3KG5tQTOmaBMhArJgrNOjzw9Kc43u7C9PFVePzFrVGz7TXsboJKBQweUIZPvjic0GyvRWY9WtuduGNF5/2VIf3LcM3lQ+Dx+sK+h3mUcllJoQF/f2dXzMl2bpoyTI7dyjtOpwfFhXqMHt4Hk8ZWhPXbFRfq4czjSaiIiOSUvyO7FCwbln/w+fww6DT4T8OhqJvTM8ZXwedTxlCHQrMOC6fXRs28WFPZ+dRloVn+C185li1PRlGBHiMqLdgiMHPViEoLigry92JSjph1uryiT8M5BQa3dFUmZzo2GbSoLi8THHxTU2mByZD69GW1ufD3f2zHNZcPhk5zWvDmoNvrw9//sR3zrhgue91LqZepwc+5xGTQis5kmI74TITD5Ym6qRlQv6sJdmfq68dEWG0uPPFiA8r7lKCs2Bh8/UiLHU+81BD3DAGUGKlcfehoB+5d8wmAE+3EwM3qgMjl6H1+xF5qs8oCFVQ4etyBtg4Xvth3DKcP6iWaLxOZ2aO4wIC/fPIFqstLox6oeOeTA5IzKBIpidDMQka9Bndccyb2ftOK7sVGqNWq2HX7ziZMHFMRjOGAmkoLJtUNFIwt5n+i9LHaXPD5/Lh7ziio0JkvzxzcC59uPxz12ZpKC7buOYoX/707ONgh8mZ75A12g16DljaHaF7/NiKvL5k1MiqvA9G5V4kDd7oisn4NfcClttqiiAfRheTioN1MijzvgRgqNOlw9/WjoFIhOHArdEb9Y21OGHUe+PyImXMbdjfB5/fDHrKKhMPlxYaNe4GQOHU4vbDaXILnrLjAgN1ftwj294jNasZyQZQ+VpsL3x3twIdbhO/19O9TLBlrhWadaF914D5MIrEc6xo5UK+53D7sbGyGUa/F9gPNWLPh87B6bcG0GpzUvSDh4yFFbGbUyH4DIPEZGwPtkYNHrIJL9QLi9xzErnU4Q3PqlRQaopaN9/mBc4f1xgVnniIYE6OH98Ev552NO1duEl2mfsuupuBDwrHiIdb5Lik0YPCAE/dXAnEzcWwF/ABOKjOjtNjIPEo5y+31C/bZAp1tWrdXGeMYcp3H68dfX/8SA/qWoHvJiXshTcft+OtrX+K6CUNk3Lv8xD5RIgI4UFSRsmH5B7VKheffVf6TOEaDFu99+hUmjq3AdROGwObwoMCoxdFWB/716VeYp4D9lGPZ8mR0Lzbh5qnDsfKFrdGzLU4dnrYndLOBHDFbaNbj6bd2xI7BFM+Yl+mZjgtMOsyfMgyf7z2G7iXGsKfMhg7snpanm60dTky9oApf7msOfqfd6cGxVgemXlAFq0JmSqbUyeTg52So1Wo4PUDzEauiLtp0OjVuvmo4Hn1RIB9cNRw6iZlq0k1oFshQTpe8T6m2WB245NwBOHrcHva6pZsJg/uXocXqkP0c5yKpXOz2nFgWLFCuJ9UNDLbNhJaj16qFZ/WsrbJg2gVVuP2RjWE3qfr0KIRRr4l5fmMNsg505ht04TOU3jilBsvX1UctQcfZIJSBnW7xKzLrccvUGixfd2JW9ynnn9r5YOL3N6uXXnOm6DZCl6gPHVB2Undz1MoHSs//JCwQU+02F7r1LIfTA5jl3imKIhRfNZUWzLtiKACEDRYNza0Olzc42CF0AENg0Hhou6mpxQ69Tnx5utDlPoXyeoDYdWUu1OPZPAtjrg3azaTQ8759f7PowK0H125GdXkZJo2tQFmRAX95/Utcek5/0e3bvl+mM7Bk7jsfHwg+pB/P0shdKZcsF4nLhbosH8h1ngLf29bhgt/vR3V5KXY2NgevYwM59Jap0g/PGw3aqMk6Qrex+Ora4GvxxnKBSSf4wEhJoR7P/mNnzHrN4fKiYXcTVqxvwOKra1N+30KsHps2rgr3rvk47LVkc24y9xykrnWyuW2gVDaHW3DZ+JuuGo41AjPC7mxsxq6vWlBdXoo7rzsLeq14P2qgXSvUbpU636HnOvDAUOBcR878nc+YK3OT3SFeh3Lp+czw+vzYtvcoBvQtiXpv296j8Cpk4rF8ET2DfHwTXBBR7uFAUQXKhuUfnG6v6JM4Tre8s3UFOJ0eXH3JIKx+5fOowSzzrhiqiCnN5Vi2PBlWmwtrNnwuOHPVmg2f5/UMaHLErNsjHoNuT2pjMNOzphaZ9Wi3ufDfrYeilkOpqeyRlrKmggqtVqfgTMl9LYXoEfK0G2W/TA9+Tkb3Xqfg4ee2KG4gi93hwT2rP8LPrjkzavbdZav+i3vmnQMUy7Z7kjOayj3jqd8P0VnZlbL+fK51kkqd99Ki8FkzGnY3Yc6k03DWkF4oMOmg12mw6uWtYQORfX5/1FKbZcUGNH5nxb1rPg77bGDJsPlXDsOhpnbBY6rTqqNmKDXqNYI39wN1AWdVUiYOREycx+sLXmcY9Vp0KzLgiZe3BeNBarlcvU4tGS+WbqasyP8UjTGVHWLFV8PuJqx59XPMnzIc0y6oRIvVCZ02fKlp4MRgh9ABDIP7lwm2m+6bf67ovkTWGQ27mzC5riLsNbFZs3KpzHEWxvwUOO9t7U48HpJPAxp2N0GtAv5w23l4/7ODeHDtZvzm5jGCsRKpw+4Om7H37jln47l3dia0NDLLZWbkUl2Wy+Q6T7Ee7oichbthd3wrs9gdHtG+arvDk3BfUUmhAcvmnI3n390VNSh00tgKbNt7NGpQa+iDIQ27m2DtcKVlgovQeqzd5oZO7UNZNzO0Wi0eXnxeSuq2RO85xHutwzo4daw2F1aubxBcNv6Jl7ei8uTSsAelQq9ZV77QAKDzwQsxep1asN0az/nmuZbGXJm7TEaJewRG8YcPKTUcLo/og2sOmSf1yCdiM8hLTXBBRLmHA0UVKBuWf5DqHJB7WdcgvwqrXxHuEF39yue4eUpqZ11MhhzLliejtd2JT744jE++iF4uLvC+EvZTDnLEbLtN4oliW2ob15meNfVYmz1q9lqgMyZWvrA1LU+D+/z+rJgpmVJD6XWv0wOsfm1n1JJ/ShjI0m5z43CzHT/948aY78tJo1LFXA68ptICtVolw16doFUrf1b2XOwkFRqEGVBTaYFWYAYHm8OD0yq6B/9968zTwzrXvT5/2BKuQGcHf6CzP9KWXeFL3EceU6vNFTVD6aS6gYKzsoTWBf16FiVyKCjNOBAxOe02dzCWll5zJowGbVi539HYIhrDOxpb4ooXped/isaYyh6i8bWrCTanBz9b8Z+Yf2/Un+iiDB3k9thL0X06W/cclawTIoXOMio2a1YuljnOwpifisx6NLXYYy4jX7+rKawt6/j+Yfp4cm5Aw+4mrH0bUQNhgt8hkltZLtMrF+uyXCTXeRJ7uAOInoU7nkEc6eo7Xv9e7P6TyP0UGuzeYU/fAJRAPWaz2bB9+3b07jEY5hTWbYnec0jkWod1cGq0tDmiBokG1O9swsQx4eVR6JpVLO/WVlnQo5sJC6aNiDpf8Z5vnuvYmCtzm1Yj0ReskXdVtHxRZNbjmbejHyoL/Hu+Au6F5It2m0v0vlQ8M8gT5RuVSgWTyQSVSt77yunALKhARWY9br6qBjWVlrDXO5d0VcZS5AUm8THGUu9nilNi1kVnimddTIYcy5YnI1v2Uw5yxKzUE8XmFMdgpmdNtXa4RGPX2uFK6fcB2TNTMqWG0us0q80T+4be9519cjEaxJ+2lXo/3VRqYNLYCsE6edLYCmg08jbolV7XSHWSWm2pr38zITAIM1a5OHrcEfU3ke3ZIrMe/XoWobq8DP16FkH//eDTUKGDUISEvh95TM1G3ffLf5Zi2ZxRWHrNmThnWO+Y5UXuuoCExXOzhqKFtiX1OnVwsErAho17BWN4RFXnbMwbNu7FoPJS0XhpbnUoPv9TNMZU9pCKH2uHKyqGAzoHnzWHtTOKzHo43T7BuA7UCbXVwnl9w8a9UX/Tt2cBHlo0Fo/dMQ5LZo2Mudwmyxzlksh8Kva+9vvrpFg5N1Z81e9swqDy0pjfwdwqD9Zl2UGu8yT2vQ27o2O6MI5+33T0Hbe2O2MOwhPaTwBwe8KvyZWwOl+yArOsR7Z3Yj3wwmudzGuXOKaRfURC16xieXfCmAr8bPmHWLF+C5qO28Pe5/nuOubK3GbtEO8LTsc9Rorm8Qpf0wOdudzjFe9Lp9SxO8XvSylmErgsU2jWwedLzzKB6doudYrn+JpMJgwZMgQmU/wT6GRLeVDGaD4KY7W58OSr2wSX+H7y1W2KWOLbpNeKPs1o0iujaEldDNnS+ERpvORYtjwZ2bKfcpAjZk16rejTcKmOwZJCA0ad1gvlvUswqLw07Dc2ftua8llTpZ72TsfT4FKNYAcbyTlF6XWazaHczj611IydMj9ZZTJo8fZHBwTr5Lc/OoBbptfIun9SdUnocuVyyNXZ9ox6LR5c+9+wZeID5eLBtZvxs9kjwz5fW2WBXqvBzsbmmEtzCc0AGs/y2KFCj2lJoQGDB5SFzYiy9JozRbfHjn/l4c2a5ITOlrOjsQWjTjsp7H2Hy4sH124OxnCBUQeDXgO1WgWvz4dhA3tIDtQ+3GLDSWVm0c/Inf8pGmMqe0jFT5FZj+smDMGer49jzYbPg22ewI26B9duxmkV3cPybawZzAJ1wkOL6qCaBHzXbEORSYfG76xhy+UG1FZb0L3EFFcbhmWOcok5juvepdecCb1OjXa7G7VVFtTvagrLuS63D726m/HRtm8F4wsQf1iKuVUerMuyg1znSWq7kbNwA8DBI1bRJavTseJWIvsZUFp04ntqKi3QC6wekk0SWTpc6X2ducgocQ+m0Bx+zIXKbOi17vUTT8PRVjtUQLC/yuHyCs5wyfPddcyVuc1k1GHZqo9i9gU/uKhO7l3MC1mzQm0ekJohPp4Z5CmaSa+FWq3C8//chaYWW8q2ayk1Y8aFVSnbHkWL57x5/T447A4YTUZoVNLXFVWnlOKis8uzojwoYzQfhcmGJb6tdifmXzkcj7+0NeypztoqC+ZfORxWuxO9UCDjHnbK9KyLyZBj2fJkZMt+ykGOmLXanZh3xVCsfuXzsMFaNZUWzLtiKKx2J05KYQwWmfWYO3kYVqxvCBvAUlNpwYJpqZ81VY5ZiyM7bqK+U+J9yi5Kr9PMRuV29mk0qqjBcYByZuy0Oz245Jz+2PDhvqj6atLYCslZddJNqq6JZ6aOdMrVTlKdVo3q8vBBmAGRS2jWVlswbVwVbv3D+8Eb4ZHLxAOdcfqLx8IHn3Yril23xFoKN3BMA7OFhM7oKjXwlB3/ysObNckpMutxwxXD8PhL27Bh416cM6x3VCwFlsetrbZgUP8yPPuPnQCAEZUWzL5sMDRq8fyjQmddoOT8T9EYU9lDrH1dU2nBR59/G4zh399ah2+aOqDVqMJugke2M8TaRQ6XFypVZ8fur9Z8AqNegyWzRqK6vCysjSq2zLwQljnKJWoVgoM/I9VUWrBp66Fg+/jMwb0wd/JQPPnq56jf1RR8vbbagjkThwq2owNiXeMwt8qHdVl2kOs8SW03cB1aU2nBhNEV+OmfNsLh8gpeFwcIXc8CiefhZPYzoKbSAq32xL5PGluBdnv2zxgX79LhSu/rzEUmg0Y0z5qN4ZN9xOrjCVzrjh3RB79a84ngZyIf3ub57jrmytym06gwuL9wX3BtlQU6me9h5IsiiXshUu9T6kjdd5L7vlS2a2qx4dDRDrl3gxIkdd68Pi9sHTaYCzzQqKVX0wxcJ2VDeZB/lBxFyYYb9Ea9Dr/+yye449oz4fX60WF3o9Ckg1qjwq//8gnuvO4suXcRQGdHpdisZ1KDNTJl2rgq+HzRA26mjVPOkwLp6OzJFXLErMmgw50r/4MF02tx3YQhsDs8MBm1ONbqwF2PbcJvbxmT0u/L9KypRQV60dgtKkh9eSsrNop2rpQVG1P+nfnCanPF9eR7Jim9Tisya2N2NMrd2VdcYMBfPvlCsD5455MDuHXm6bLtG9C57FPkDDihTwv/6sZzAeFVTzOiVKKuKZW5rsnVTlKh2T+BzpxyzWWDodOqcHp1TxSYdNjzdQu27TuKn80eGVZ+nnipISzfCc0AatRrOmcn9SMsfkNnS4sUekwjZwspLtCz4z/L8GZN4gLthLYOF350ySBoNSq0WJ248YpheOKVbeF5usqCiWMq8MDTJ2Jpy+4mqN4C5l0xVHKgdkmhsvM/RWNMZYdAHP/wwmpMPb8SDXuOYsPGvXC4vFE5sH5nE1a98jmqy0ujbtpFtjMKzDrJdtOhpnYA0TMPB3J4rzJzzGXmhbDMUbYSuu7WalSYOLYCfgBbJNqmn24/DLUauHlqDRwuLxxODwrNumCZF8uxkQNhAp9nbpUP67LsINd5Evpeo16DSXUDMfzUHtBp1PjTT85D03EHlq+rDz5AKTSrYahEZr9Mdj8DIh/EDNRrLpcXy+aMCvYB/W7BWMnZUHOF0vs6s51Qni006zH3imFY9fI2wYfp733yY1x0dn9Mu6ASeq0aRRJ9PFKrNIXeZ+L57jrmytzW1uESbAePqLJg4tgKtNlc6Cvf7uUNk1GLMwf3woC+0atV7v+mFSYjhyplitLvSxFRZrH2VaBsuEFfUmjA/Ck1WPVy9GyG86fUKKYBbelmxi1Th2PlC1uj9vOWqcNh6Sa+9GAmtLY7ce+ajwUHtNy75mM8vPg8RV3UjR7eBxPHnNjP5jYH/HLvlMzkiNmSQgMG9C3BfX+OfsI0HRexbR1OXDQq9gx9bR2pnTW1e7EJC6bVYMX6hqjYXTCtBt2L47/RFy92rqRH03G74DGNNQNBJqW6AzuVDFpg7sRqPPk6FFceMz3DcKJMem3wSXwhRoP0U1/pVGTW4+arhOu3m6+S//jlaiep0OyfgfbWLx7bhIcXn4fTKrrhmyYrigsMeP+zb4KzFQLC+U7oXDpcXrz13wO4eWoNPF4fOuxumAxabD/QHHMp3MhjGjlbiJLLC0VjeyIxQu2EQLwtXfkfXHR2f0wcUwG/H7CUmvCfhkN44OnoWKrf1QSX24e5k4ZilcCM+4HBMOef0U/R+Z+iMaaUL1Z7/w+3nYcjzTZ8KZADG3Y3YXJdRdh2InNi03E7nnipIVgHhN7cCz3/odfbQm3Ax+4Yl9DvYZmjbBQrDm+ZWoN/bf4KVaeUdg6gklhG/pMvDuPScwbgnic/Dl63B8q8UFxEDoQJtLP79ixA9xIT40VGrMuyg1znKfJ7A7NyC/X7LpxeG1ZfRM5qKLTtVO13rOMTeODT2uHC0mvODHs4+GezR+Le72dkDJ05WSl9kenGa530EOvfNuk1GFPTB9dNGILDx2xh5THQNl337i7cN/9cLH74AyyZNTJq0phAzDvd4qsgRd5n4vnuGubK3FZgOrH0fKAdHIjPB57ejN/fyqXnM8Hp9ODaCUOw+pXPo9oY864YCqfMq7/lE9Z5RBSKA0UVKFtu0K9/b1fUbH8Nu5ugVgNLZo2Uaa+i9e5RiEUzRqDD7kaH3YMCkxYFJh16lso/SBQA2m1u0QEt7Tb5Z5AFOp+YjGw8BNRWW2I+SZwP5IjZTDfovB4/Nny4TzDmAeCGyUNT+n0AcFL3Aiy+uhbWDhc67B6YDRoUFejRI40DvC3dTLh15onvLDBpUVSgT8vA1HwQq96QmoEgk1LZgZ1qxw5/hcUzR6DD4VVUZ1+mZxhOlEqlEp2RWA15l5VR+vHL1Q4Dodk/A0Jztdcrke+uOJHv4jmX/XoWAQBMRh0Gbz0kcPN+BNo6nDjU1C4Y40ovLySMN2viE6udEIi3i87uj3Xv7goOQjl63C667O3hZhsav2vDmJo+gjNKDx5QFoz1TOR/Jc6onq1CY6rd5oZO7UNZNzNK2UaXnVh7f/Wr21B5cvSsoQEuty/435HtjNDtNuw+GnZzr9CsQ79ehehebILV5oJGrUr59TjrccomYnG48oUGLJg2AivWbwnG4tJrzhTNp2q1Kvj3odftkXWx0+3F1j1HwwbCAOnrI2ReTRzrsuwg13kK/V6f148nN3we8zp4Ut3AsHojkyveRR6fwIOYv3hsU9Rg99BZRoVmNA+t03K5TlFyX2c2iqd/e0SVBV8dtuL+pz6NuZ3AfcDQGfD9AE4qM6O02Bgsl4m2a7t6vnM5FuLBXJm7Csw60b7gAoWsOJrrPB4/Vr8q3MZY/crnabm3TLHxHjgRBXCgqAJlww361nan4HK4gPRTpZnWdNyOFeu3KHI2O0B6ZjO5Zz4LaG13Cl6gAso755kmV8xm8iLW6/cLDroCOhv0Xn965pXVazXQatTQqAGfzwONOr1lTMmzX2Yj1htd4/P5YNACpd8PNFOK1nYnPvniMD754nDM9+U9r35ccd5AjKnpg+4lxuBAoWOtDvToZoJfJe882Mo/frnZSRpvrvZJ5DtfSL5L5FwKdcKYDDr89fXP8Z+Gb8P2JzTnZEN5IWG8OSdNrJ3QsLsJ114+BIPKS8NmBxKj06rx0r/3YMmskXh14z5Zl79lmzL1AjFls9mwfft29O4xWO5dIki39yeOqRB8DwB6dTdj6TVnCs48GLrdWLOENvk642z7/mbRmZmSjXvW45QtpOLQ5faGte31OvF+xqKCE+U+8ro9NC6ajtvx4r93hw3USle+ZV5NHuuy7CDXeQp874FvW2Pe6xGaBTzTK95FHp9YD2LOnzIcre3OsGsIh8sLo16DSXUDMai8FF8ftqLApMOOA8148tXPg3UY6xSKJZ7+bZUKKJKIC71ODSC6bfvYHePC8mwm7zMxv3ZirsxNDqdHcHWKEVUWTBxTAQdnsswIue4tkzDW+0QUwIGiCqX0GTOknhrN5FOlYrJhNju11MxnKnlnPgvIlnMuF7kG1WTqItbuEL9osqfhoirTDVarzYUnXmpA5cmlmDgmfBaqJ15q4KxtSWC9kZuUfl7VKhWMeg02bT0U1Qk0Y3yV7HlVaqZwpcwknoudpPHkaofTK7KF8PcTiQXBnFZlwcSxFdi8/UjYMn6hbVSlxxtRV1g7xMvvkWZb2IwsOxpbYs6uEpg9KHSGlusnnga3x5vxwe7ZcA1KlCrJ5qGaSguOtTqg16nRYfdAq3ECQDA2pLbbbnNj1SvbgnEmNjMTUa6Tyqcddjf69SwKxsNX37XF7IesrbLAoNNg+vgqbNi4Fw6XN2Y8ZqofjHmVSJjQLIDJTjfRYRfv142cBVzuFe/E6h9rhyu49DwAGPUaLJk1Ehs+3Be15O2SWSODg0lZp1AsUu1Sa4cbGg2weccR0fwamO1WavvMr0Sp0W5z44GnN8dcev6++efKvYt5QY57yySM9T4RheJAUQVT8owZJoN40ZF6P1OyYTY7rUaFeVcMxepXwqder6m0YN4VQ6HVKGOgqNSTwpl+kliJcnFQTYDZJB7TZmNqY16OBmtbhxMXjeov2HE4aWwF2jrkry+yDeuN3KT086rRqPH8u7vCBokCnU8OqwDcdNVweXbse9kyk3iuksrVhRLLDoW+H28sWG0uLH++PmqGlsC/rzz/VDz7j50nXg9poyo93oiSZbW54PKID8wOzLgS8M7HB/DAwrFY+cJWweumux7bBODEDC3nn9EPFX1LUr/zErLhGpQoVaT6fnqWmqMGeAdi9m+vf4lPt5+YMTv0oUCp/GY0aMK2KTYzE1EuiyefRsaTRqPCpLGdswNG5tMJYyrwkz9+gOrysuAAKrF4zEQ/GPMqUbRYD9cvmFoDtVot8pfCCiT6fQPtciWteBer/omssybVDcSGD/cJLnkbeD/QhmCdQkKk2qUujxc9i0x45+MDuO+m0YL3+eZPGY47VnwY9/aZX4m6rsCkE1ydIvR9Sj+zxHE2G3keMoX1PhGFUsZoPso6Oq1adBZMnTbxDol0yIZZmAwGLZ5c14Dq8lJMrgt/qulvr3+JW6bXyL2LAICSQkPMGXyU8CQxpVdRgR4jKi3YIhDzIyotYUuTpYIcDVav1y/acXjDFUNT+n35gPVGblL6eXV7fVGDRAPqdzXB7fEJvpcpeq1GtA2l13KgqJwSKd/xfralzRFzGb/6XU344UXVYQNFgRNtVKXHG1GyWtud2LrnaEIzrsy6dDDWbPg85nXTRWf3D94AkDM+suEalChVpPqG9Do1bp1Zi4OH29Fuc0OvU8PnR9QgUSD8oUCp/Cc1QzzjjPKFZD4VyIfFBQb85ZMvUF1eih9dXA2rzQ2VCmHLNAe2NXfyUNnbm8yrROHEHq5f8UIDrr3w5IS3WVSgF61HepWa8dgd4zI6S3+yItsQg8pLYw4SatjdhMl1FWGvsU6hSGLt0ppKC7buOYrzavti1qWD8bfXvxS8Xv3zhs/DrlcDeN1KlD7sU1WGbBlPkg9Y7xNRKA4UpaRYbS5ccd5AjKnpg+4lxuBFz7FWB3p0M8Fqc6G33DsJ5c96BnROu/7p9sNRN0lC30dxhndKQJFZj4XTa3H4WDuMBh1sDg8KjFrYnW6c1L1Q8Z1E1DXdi01YMK0G9buaomK+tsqC7sWpXQpejgarz+9H47etuOv6UeheYgyW8aOtDqxYVw+f35/y78x1gXpDaJYDpcxAQIkLnNfPdhxGWfGJ+qC5zYEzBvWS/bzaHW4Y9RpMqhuIQeWlYR2zGzbulX05E7fXG3MGn0ljK+D2is8IlClCy9jJfW5TsV9Cfw8g7LUF00Zg1ctb8ckX4bOcRdZb8dZx7RI5y+ONzi+BNirrUcpVHXY33vn4AO6eczbWvtU5aDpQdw8/tQd0GjVsTk9w6dvBA8owqLwMK9Y3hMVmqEvP7Q9AOD4yWadlwzUoUapYbS5MGlsBvVaNAX1Lgm2vIrMOJqMW7XYXKnuUwedDMJctmzMKn24/DKNegyvPPxW1lRZ4vH6YDFr44UeHzYWTehSK5j+nW7w9xzijfNFhd2PDxr1YMmskAGBnY3PwOsiPzll9W9ocaOtworjAEJyh7MYpNVi+rh6Dykvxqz9/Irjtht1NmDd5aFS+zPR1AvMqUTiph+uvvaQq4W0G+n1XrG+I6qe4+aoanNS9IO5tHWuzw9rhQofdgwKTFkUF+pT3G4uJvIZ2ucUfFg68H7gWMeg12NnYrKh+EJJXkVmPG64Yhsdf2haMD6NegzmTh2LQKaWw2tzw+fwYfqoFa9/aHvM+38SQ2WuBE+1aADh4xJrx/jfmV8p1vKetDG0dTtF7IW0dTvS1FMq1e3mlwKQTvW/Gep8ov3CgKCWlwKRDa7sLm7YeCpu1a0RVZ2JXSjIpKTRg1Gm9UN67JCrpNX7bqognhrLpCQ6v14fn/rk7qjG3YJoyZj3NR5nsoFdr1Pjv1kNhs6LVVltwxuBeKf8uOToqXG5vzOVh7rtpNJwueQeXZStLNxOWzBqpyAFn1DWbth6KunF/+qDU1weJKjDpsGTWSGz4cF9YB2xNpQVLZo2UXFo83ewOLx5cuxmT6gZGzTDw4NrN+NWN58q6f0DsZewCy8Fmy36F5shCsw5ajRorX2iI+vtp46pw75qP4XB5g6/dMrUGP554Gtpt4vVWrDoOONHRL7UsrzHi/cin2lmPUi4qNOuwcHotnntnJypPKcXkuoHo3s2EP2/4POrm2Z9+8gMUFehxqKk95vaMeg0spWYsv/0HcDi9cLg8ONZmh9Ppgc8PrHp5W1QbNl11GmetoHxiNurwqzWf4O45Z+Ppt7ZHtb1uumo4rDYXLN1MuHVmLawdLrTb3Lhn7tkoLtDjqbe2h82qXVNpwYzxVdBoNaL5z2pzMc6IcGJJzQfXbsaU80/FDVcMxepXP4+KxUljK/CXT77AjVNqYOlmCsbX14etYduLHMDt9fnx7dF2FH4/wFSO6wTmVaJwUvcKbK7kHj49qXsBFl9d26VBnt8d6xAcbLpgWmKDTbsqtA0hNVBUr1PDqNcI9iMpoR8EUO6DvPlEpUJwplCvz4+Texbh8Ze3YuX6huBnAvcQ7npsE463u6K2YdBp8Ngd42BzuFFk1sPj9cHh8uCR5+szdq0aivmV8gHvacvPoNNi2dqPYt4L+d2CsXLvYt4oKTTgnnln47l/7gpv71RZcM+8s1nv5wiVSgWTyQSVxEo8RBwoqmDBpy9tbpT1PhU2F2A2y71XnYwGLV7dGL1E85ZdTfD7gcVX18q0Z+GKzHrMnTwMK9Y3RHWSLphWo4gL6mx5cu9Ymz2qowfofAJoxfoGLL66NqNPB1NmB/JYbS4sj+i0AMKXB0xlPMnRUVFcYIhZxle/8jkvHrsgMGsJJUatVsPpAZpleKpcjNgyZ+moDxJlMmix4cPoNkrg33K3UQrNnTdzYy19JvdA1kzX9wntVwLlLjJHTh9fhZ2NLVHlon5nE3w+YFLIzA71O5uw8oUG3HjFMHi8fni8Prg8sW+2RdZxQt8ttsQOcGJG0VgzhbIepVxjDKmrP91+WDRGH395a3Cg//TxVVEPAL7z8QEsnF6LP2/4PKzuqqm04NrLB+Nvb2wX3K5YndaVm7GcCZjySUmhAbMuHYyn3oyOs4bdTXj8pa04r7Yvhgzojsdf2hqM0enjq7Drq5awB48DfwMAY0f0wbnD+8T8XsYZUafQvhOP149VEQ++Aifiqrq8NJj7gM5ZCQFg2ZxRwXy6aEYtNny4T3AAd6/uZqxYvyWp60DmVSJxiczCKXWvwKzXJL0f3YtNSffvK+3eQeAaWvThkioLdh88jkl1AwX7keTuBwGU+yBvvikuMGD31y1Y9+4u3HX9KDz20taY9xB+c/NovP/ZN9iwcW/wgWSgs7+vX8+i4Dkd1L8M2/c3R7WHA+Vu7qShUKtVaesLZn6lXKe0vJSvTAYNqsvLBO+F1FRaYDIk326hxD3/z13ReWdXE6BC8DqRlKHQrIPP54dandiAT5PJhCFDhqRpryiXcKCoQinl6ctYOmxuwZvdQGcjq8PmVkQDy2pz4dEXhRuCj77YIPtgFiB7ntyzdrhEz7m1w6WIc54vMj1Qq6XNETVoKPQ7W9ocKf0+OToqHE6PaBl3yLxcNeWf7r1OwcPPbVFcZ7DUMmet7U5Zc2uHQzyW5W6jKD3vZ7q+j1ci5U4oRw4qL405OLdhdxMm11VEbfPQ0Q7cu6ZzKc542+FC3x26HGhk237G+CoUmXR4aNFYxQwGJ8oEe0RdLRajgRjXadXY2dgS9QDgsrlnCw4GbdjdBJujMmZOiJWzUnEzljMBU74oMusxqLwMK0JmUwq1ZVcTrr6oGo++uDXumA/k5eZWB9a89nnMWGScEYX3ncQTV+ve3SUYW4F8+tSb22MO4L7mssFJXQcyrxKJS/Q+kFSfArx2AJmfbUTJ9w6mjauCzxd9PT7tgip0K9LD6/NLXotkwwOzlD6h+bZ7iVG0rDvdPuxsbMGSWSPx4NrNcLi8wf6+0HP6wwurwx7MCFW/swkddjd+tuI/ae0LZn6lXKbkvJRPCs16zBhfBUC4X7yQ9U3GNEvc92mW6b4PCTPptVCrVXj+n7vQ1GKL+++8fh8cdgeMJiM0KnXU+1WnlOKis8tTuauUpThQVIGy4SmXdoklTqTezxSlD2YBsufJvQ67+CA5qfcptTJdttttmY/50I6KdpsbOrUPZd3MKE1T/SdZxh0s45Q5Tg+w+rWdMZ8ql7MzWGqZM6n3061DhvoqEUrP+0pt4yVS7oRypNRyc0Lvh74Wbztc6LsDy4FOqhuI6yYMweFjNuh1ajS3OdC7RwF6dDPhpB6iu0eUcyJjWipG221u/P2dHQkPBpVqw0buRypvxnImYMoXDpf4dZLH64+K0Xjy8uEWm2QsMs6IEHMZ+UiBuBOKrUA+jbz+DH3f6aoS3b5Qe515lUhcMveBxPoUFkytwTeNu9C7V/eM7H8opd47aG134t41HwsueXvvmo/x8OLz4JRoy8jVz5UN97bySSDfNn7bJvq50IciJ9UNxO6vW4L9fQePWIPn1OP1i20m+H66+4KZXylXKTUv5Zsisx4n9SjA2BF9wvJwoF+c9U/mSPaRSrxP8mhqseHQ0Y64P+/1eWHrsMFc4IFGHT1jL2ekpwAOFI3T3r17cd9996G+vh4FBQWYPHkybrvtNuj1qU9g2fCUi1EvXnSk3s8UpQ9mCciGJ/cKTOLnVOp9Sq1Ml22jxPT/xi4sayQm0FFhs9mwfft29O4xOC3fAwBmiTJsNrKMU+ZYbZ6YN+nk7gyWWuZM6v10k6u+SoSS875S23iJlDuhHKjXRT89KfV+5GvxtMNj5V+Hy4t17+7CGYN6okc3IwpMOgzqX6aIc04kh8iYlopRo0ET8yapWEen1HYj94M3Y4kSJ5WjjYbotkMyeTmAsUgUrcisR3GBeEwE4irWwnVSNw6FYjmUUF3AvEokLtn7QLH6FDTwwOcTfxgjXZR676DD7g5ej8d6X6n9XNlybyufFJn1KDSLlwfT9/cQGnY3Ye7k03DFeQODuS70nEnl1dD3mTOJEqfUvJSPLN1MOHd4n7B2C/vFM88kdd9M4n0iyi3iPbMEAGhtbcW1114Lt9uN5cuXY/HixVi3bh3uv//+tHxfNjzlYjJoUFNpEXyvptIimWwyRakX+UKKzHr061mE6vIy9OtZpLgGUlGBXvScF0l0SFNqZbps63XiMa/XKSPmu8Ig8RsNOfAbKXvYHMrtDA4scyZECUunZ0t9pdS8r9Q2XiLlTigH7mhsEf1dOxpbJF8DpNvhUvm3uECvuHNOJIfImBaL0dpqC9SqWMNaxAeU7WhsQW1V/DmLN2OJEieWozvjOnq2pB2NLRgRIzZrKi1obnMI5uEAxiJRNKlY3NHYgtpq4TYuID2AG/AnfB3IvEokriv3gZTWp6DUewfx9KErtZ8rm+5t5ROpsn6s1RH8t9PlDYvN8HPmF91OZBuaOZMoMUrNS/lKae2WfJQt982IKDM4UDQOzz33HDo6OrBixQqMHTsWU6dOxZIlS/Dcc8/h8OHDKf++bHjKpdCsx4zxVVEJpabSghnjq1CokASv1Iv8bNS92IQF02oEz/mCaTWyz3KbbzJdtrVqlWjMa9Wxb95nDz/mXTFU8DfOu2IohG5wEqWL2ajczuDAMmeRdZBSlk7XqPKhvkofpbbxEil3Qjlyw8a9mDS2Iup31VZ3/q4NG/cGX6uptGDS2Iqw1wKk2uFsexLFJzKmxWJ00fRaaDSx6+7AwBch+79pxaxLB8fcbmTO4s1YosTFytGBfLp5++GoGAzEvNDfzBhfheGn9hDMwwGMRaJoUrHY+G0r5k8ZHjO2xPJpTaUFjd+24ZapNQldBzKvEonLhvtA8VLqvYN4rtGV2s/F/gVlEivr864YihXr6oOvRea50HO6efth0f63zdvD7z0zZxIlRql5iUguaon7ZmIP6RNR7smeK00Zbdy4Eeeccw66desWfO3SSy/FL3/5S2zatAlTpkxJ6fcFnnIRWnZEKU+5FJn1OKlHAcaO6IPJdRVwuX3Q69RobnOgd48C2QeJBAQu8pevqw9b6kjui/xsdVL3Aiy+uhbWDhc67B4UmLQoKtCzQS2DTJftArMex1odGFMTHvPHWh1Qqzrfz3ZFBQY8+sIWTBxbgesmDIHd4YHJqMWxVgeee2cHbp46Qu5dpDxSZNaitsqCeoHl55XQGazopdMNaqhVyOn6Kp2U3MaLt9wJ5UiHy4t3PjmARTNGwOX2hv09ADy8+Dx02N0wGrTYvr8ZD67dDIfLG7bdeNrhbHsSxS8ypgvNOiy+uhZ2hycqxq02F2qrLYLL1zZ+24pbptZg5QsNYe/XVFpwyTn98as1H+Ois/tj2gWV0Gs1KCqInbMCN+6EvkcJ+ZdIqQLx3NzqwOEWG1ToHHT24NrNGDawB+ZdMRSrX/k82M/lcHnxj48PYMG0EXA4PWi3u2HUa2EyaIIPpQweUMZYJEpQaG5tt7lhNGigVqmg0ahw68zTAcSOLbF8OmN8FXr3KECPBK8DmVeJxGXDfaBEKPHeQbzX6Ers52L/gnIFy3q7C1abO3gP4a7HNuF4uwuAcJ4LPacv/XsPKk8uFey/dLq9eOnfe4J/x5xJlBwl5iUiuRgMGtH7ZgaFrBZMRJnBgaJx2LdvH6666qqw14qLi2GxWLBv376Uf1/gKZcV6xvCOgmU9pSLpZsJ5w7vE3bxPKh/meIuUJV4kZ/NuhebFFMG810my3aRWY+e3QtwsKk97HWVCujVXTmDw7uiyKzH9ZOGsfONFMGgBeZOrMaTr0Ox5bHIrFfEfkQyaJHz9VW6KbmNF2+5SzRHhr5u0GlQXV6WdDucbU+i+AnGdLHw52LdJJ0/pUZw4IrJqIXD6cFd14+KOw55M5YoeYF4LisxorXdiUKTHsNP7YGte47irsc2xT1gO4CxSJQcqfZyPPm0pc0RNYA7sM1ErgOZV4nEZct9oEQo8d5BIg+dKq1eYv+CcgXKetNxe0J5LvSc2hxu9LUUwO3xwe70wKjXornNgd899Wnw4WXmTKKuUWJeIpJD92ITPG6f4H2zHt0YJ0T5hgNF49DW1obi4ui7VSUlJWhtbU16u36/HzabTfC9YpMKt80cgXabGx12D8xGDQqMWhSaVDH/Rg4aAGWFGpQVBp4y8MBm88i5S4IyuZ92uz3s/0l+ZrM5JdsRi9l0iKcsZbJsF+iBs4b0hNXmgc3hgdmoxan9imHQpv+4ZCquCvTA4pkjwn5jkVmbkd8Yr3yoY1IVs0Dm4zZV7HY7jh3+CguvGgq7G4otj0oSGhsFJpNs9VU2EatPEskvSo3ZZHNkWDvc4elsg5t1MOsR975lSxs5H3JKLkjHeVJq3IqRaqdFx50fJq0GpQWJxWEy7UHGUubk67FOdcwC6TuGobHo9AClRQacObhXSCwFPikek9lwbRaPfC2zclHS8VZqro0nn/Yo1qJHcehtg+TbspmOZSWVgXyRK8dcrphNxfVnQK6ci3RI5zV6uo97tvQvyEEJuTaZPBd9TtUI3K4vHtITg/vXKb79y/pGPtl87FMds9l8LBLF35qbMv1bi0wqnDGoZ1i7c0CfYtF2ZzpzrdDvV6lUMJlM8Pp98Pq8UdtIlhc+AIAvx7fr8/rC/j9V25WStu36O7drt9uD/ZmpEG85kzqekZRwHOKNWQ4UlZHb7cb27dvj+qwDQHN6d4dS7MCBA3LvAn3vjDPOSMl2EonZVFJqWeoAEL0wUnpl+ljI8RvjpdRykQqpillAvrhNla8O7A7+t5LLo5IIxQaPnbiu1ie5HrMOAMfk3ok0y+WckktSeZ5yIW4zVbcn8j2MpczJt2Odypj1eDoHFmTbtVW2t+fyrczKTQnHO1tybaZjK1Pfp4QykG+y/ZgrJWZTcf2Z7eciW/G4Z55S4jZUKvNcNrR/We7lk43HPtUxGzgG2XgsksXfmpvk+q3xtDszkWtDf7/JZMKQIUPgsDtg60jdQxIuhwsA4HQ682K7DocjLduNJV3bdRR2Dmfcv39/SgdUJ1rOYh3PSEo4DvHGLAeKxqG4uBhWqzXq9dbWVpSUlCS9XZ1Oh1NPPVXyc3a7HQcOHED//v1hMnHaZ6Xj+cpd8cZsqrAsncBjcQKPRWIyHbepwvOcOB6zxCnxmGVrzGYrJZYBiqb088S4Vf45yiU81l2n1Wrh8Xh4DDOEZTazcvV4M9fGL1fLgJLxmEeTK2Z5LuTB454bmGsTw3IvHx77TjqdDn379s2bY5FP552/NXdF5lqh369SqQAARpMR5oLUzaCuN+oBAAaDAeaC1M2SqrTt+rw+OBwOGI1GqDXqlG1XSrq2azQZAQADBgxI+Yyige2LlTOp4xkpm44DB4rGoaKiAvv27Qt7zWq1oqmpCRUVFUlvV6VSJTRds8lkSun0zpRePF+5J9GYTRWWpRN4LE7gsYiPXHGbKjzPieMxS5ySjlm2x2y2UlIZoNiUep4Ytyco9RzlIh7r5AU6Q3kMM4vHO7Ny7Xgz1yYu18pANuAxP0HumOW5kAePe3aTO26zFcu9fPL92AeWDQby61jwt+amfPmtsXKt0O/XqNTQqDUp+24NOgf5qfNku2qN8N8pdX9jblfVud10DaSOt5zFOp5R28ui4yA97JVQV1eH//73v2hrawu+9vbbb0OtVmP06NEy7hkRERERERERERERERERERERERERUWycUTQOM2fOxNNPP41bbrkFN954Iw4fPowHHngAM2fORK9evZLaptvtht/vx7Zt2yQ/G5g+ds+ePcGZH0i5eL6UR6/Xo7q6ukvbSCRmU4Vl6QQeixPy4VikImYBeeI2VfLhPKcaj1niUnXMGLPZi3GTHdJxnhi3qcVYypx8Pdapjlkg/46hXHi8M0tJx5u5Vh5KKgP5IleOeS7EbK6ci2zD4y6fXIjbbMVyL59sPvapjtk9e/YAyM5jkahsPu+J4m9VlnTmWqHfbzQaUVlZiWKzGraC1B2TAmPn/IklBRrY7Lm8XS3KCosRqzgpb3/FFZs7t/vVV1/B6XSmbLsGgwGnnHJKHOVM/HhGSvdx2L17NxwOh+hn441ZlT9Vi9jnuL179+JXv/oV6uvrUVBQgMmTJ2Px4sXQ6/VJba++vh5+vx86nS7Fe0pEkVLRiGHMEmVOqi48GLdEmcGYJco+jFui7MKYJco+jFui7MKYJco+jFui7MKYJco+jFui7MKBokREREREREREREREREREREREREREeU4t9w4QEREREREREREREREREREREREREVF6cKAoEREREREREREREREREREREREREVGO4kBRIiIiIiIiIiIiIiIiIiIiIiIiIqIcxYGiREREREREREREREREREREREREREQ5igNFiYiIiIiIiIiIiIiIiIiIiIiIiIhyFAeKEhERERERERERERERERERERERERHlKA4UJSIiIiIiIiIiIiIiIiIiIiIiIiLKURwoSkRERERERERERERERERERERERESUozhQlIiIiIiIiIiIiIiIiIiIiIiIiIgoR3GgKBERERERERERERERERERERERERFRjuJAUSIiIiIiIiIiIiIiIiIiIiIiIiKiHMWBokREREREREREREREREREREREREREOYoDRbOI1+vF6tWr8aMf/QijRo3CWWedhdmzZ2Pz5s1y7xoB2Lt3L3784x9jxIgRGD16NB544AG4XC65d4tyQD7HPuPqhLfeegs33XQT6urqMGLECEyePBkvvPAC/H6/3LtGaZTP8R8v1hOJY31CjJvswFhVPsZSZjAW0oPtzPRi/ZBZrCeIMZdZjDllY47PDNY7lI9Y7uXBvCtt06ZN+OlPf4rx48ejuroa9957r9y7lBL5FHONjY1YtmwZJk+ejCFDhmDChAly71JaMJ7zq1zHEm95X79+PS6++GIMGzYMkyZNwr///e+oz1itVvz85z/HWWedhdraWixatAhHjhyJ+txnn32GGTNmYPjw4Tj//POxatWqqHLn9/uxatUq/OAHP8Dw4cMxY8YMbNmyJSW/OZ3ijSsezxM4UDSLOBwOrFq1Cqeddhp+97vf4aGHHkJJSQmuueYafPTRR3LvXl5rbW3FtddeC7fbjeXLl2Px4sVYt24d7r//frl3jXJAvsY+4yrcX//6V5hMJixduhSPPfYY6urqcPfdd2PlypVy7xqlUb7Gf7xYTySH9Ul+Y9xkD8aqsjGWMoex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IiIiIiIiIiIiIiIiylEcKEpERERERERERERERERERERERERElKM4UJSIiIiIiIiIiIiIiIiIiIiIiIiIKEdxoCgRERERERERERERERERERERERERUY7iQFEiIiIiIiIiIiIiIiIiIiIiIiIiohzFgaJERERERERERERERERERERERERERDmKA0WJiIiIKO8tX74c1dXVcu8GUd6bPXs2JkyYIPduEFGcli5dinHjxsm9G0Q5qbq6GsuXL4/rs+PGjcPSpUvTvEdE2Wf27NmYPXu23LuRlJdeegnV1dU4ePBg8LVs/j1ERJQdmGvixzY4ERFlm46ODvziF7/A6NGjUV1djV//+tcAgKNHj2LRokUYNWoUqqur8de//lXeHaW04kBRUqzq6uq4/vfJJ5/IvatBgQ68WP/bsmWL3LtIFLfQ8rx58+ao9/1+P8477zxUV1fjxhtvlGEP5bV06dKYsT5s2DC5d48oaXPnzsWZZ56Jo0ePRr1ntVoxZswYTJs2DT6fL+378sknn4jm1TfeeCPt+0CUrQJ5fNu2bXLvSpTDhw9j+fLl2L59u9y7QhSXbLw2TSXGLNEJqe73+eCDD+IeDPrZZ59h+fLlaGtrS2LPibJHZJwNGzYMF198Me69917B69R0ee2111Jyc+yZZ55BdXU1pk2b1vWdSrPHH38c7777rty7QTmI902I0isXcmfgNwwbNgyHDx+Oej/TDxZ/8MEHqK6uxpgxYzLSDx7Jbrdj+fLlOdvPQOmh5P5gIkqveNvbTzzxBF5++WX88Ic/xAMPPIDJkycDAH7729/iww8/xA033IAHHngAY8eOTcl+7dmzB8uXLw97AJLkp5V7B4hieeCBB8L+/eqrr2LTpk1Rrw8cODCTuxWXRYsWoV+/flGvn3LKKTLsDVHXGAwGvP766xg5cmTY6//v//0/fPfdd9Dr9TLtmfz0ej3uu+++qNc1Go0Me0OUGr/85S8xceJE/Pa3v8Xvf//7sPf+8Ic/oKWlBU8++STU6sw9bzR79mzBAdgjRozI2D4QUeocOXIEK1asQN++fTF48GC5d4dIUjZfm6aCWMz+6le/gt/vl2nPiOSTqn6fDz74AM888wwWLlwY9d7WrVvDri3r6+uxYsUKXHnllSguLg777Ntvvw2VSpXQdxMpXSDOXC4X/ve//+HZZ5/FBx98gNdffx0mkymubaxZsybp73/99dexe/duXHfddUlvA+gcNNO3b19s3boVjY2NKC8vT3pbXfk98XjiiSdw8cUXY/z48Wn9HspfvG9ClF65kDtdLhdWrVqFu+++O+ltpMKGDRvQt29ffPPNN/j4449x7rnnRn0mnW1wu92OFStWYMGCBRg1alRavoOIiHKPVHv7448/Rk1NDRYsWBD2/scff4wLLrgAc+bMSen+7NmzBytWrMBZZ50luF8kDw4UJcUKjF4PaGhowKZNm6JeV6K6ujrOKEg547zzzsPbb7+Nu+66C1rtibTx+uuv47TTTsPx48fl2zkZ2Gw2mM1mAIBWq82KOokoESeffDJuueUWPPTQQ7jyyisxZswYAJ03qp977jlcf/31GDRoUFr3wel0QqfTBf89cuRIXHLJJWn9TiIioliSvTa12+1x34zLVqH5miifZKLfx2AwxP3ZfH6Ak3JXaJxNmzYN3bp1w1/+8he89957cc8oJndsfP3118FB3suWLcNrr70WdUMuEXL/HqKuyqb7JqF9wOnm9/vhdDphNBoz8n2Uu3Ihdw4ePBjr1q3DDTfcgF69esmyDzabDf/617/wk5/8BC+99BJee+01wYGich8rIiKiSFLt7WPHjuHUU08VfD3yoeSuiLzPS8rCpecpq/l8Pvz1r3/F5ZdfjmHDhuHcc8/FsmXL0NraGva5d999FzfccAPGjBmDoUOHYvz48Vi5ciW8Xm/Y5wJLF+zYsQOzZs1CTU0NLrzwQrz99tsAOmdQnDZtGoYPH46LL74Y//3vf5Pa70ceeQSDBg3CRx99FPb63XffjaFDh2LHjh0ATiy5++abb+IPf/gDRo8ejREjRmD+/Pn49ttvk/puokRdfvnlOH78ODZt2hR8zeVy4R//+AcmTpwY9fk1a9Zg5syZGDVqFIYPH44pU6YEYyhUdXU17r33Xrz77ruYMGEChg4dissvvxwbN24M+9w333yDe+65BxdffDGGDx+OUaNGYdGiRYJTlAdid/jw4airq8Ojjz6KF198EdXV1VGf/+CDD3D11VdjxIgRqK2txQ033IDdu3eHfWbp0qWora3FV199hXnz5qG2tha333573MfO7/dj9uzZOPvss3Hs2LGw4zdx4kSMHz8eNpsNALB8+XJUV1dj7969uPXWW3H66adj1KhRuO++++B0OuP+TqJU+PGP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ciSuu+46fPPNN7jllltQXFyMk046CUDn0tyLFi3CI488ghkzZuCMM84AAJx++unB7bS2tmLu3Lm48MILcemll+If//gHHnroIVRVVQXbIkRKdPz4ccybNw+XX345Jk2aFMwtiV6PSpX/devW4b777sPFF1+Ma665Bk6nEzt37kRDQ0PwQa5429AdHR340Y9+hL179+Kqq67CkCFD0NLSgn/96184fPhwXDEbyu/346abbgoOMB08eDA+/PBDPPDAAzh8+DB+/vOfh30+ntz9y1/+Ev/4xz8wa9YsDBw4EMePH8f//vc/7N27F6eddlqKzh5RYqT6fYDOVTg6OjowY8YMqFQqPPnkk1i4cCHeffdd6HQ6zJgxA0eOHMGmTZskr/cuvPBCHDhwAK+//jruvPPO4PeUlZUJft5ut2PWrFk4fPgwZs6cid69e6O+vh5/+MMf0NTUhF/84hcAgE2bNuEnP/kJzjnnnOBDkfv27cNnn30WvL4mUoqvvvoKANCtWzfcddddePnll3HxxRfjxz/+MbZu3YonnngCe/fuxcqVKyW3JdW2nT9/PqxWK7777rvgoI2CggIA8eXhgNdeew0XXngh9Ho9JkyYgGeffRZbt27F8OHDg59pamrCNddcA6/XixtuuAEmkwnr1q1LaFZhKS6XK3itPWvWLPTo0QOHDx/G+++/j7a2NhQVFeGBBx7AXXfdheHDh2P69OkAuBw4pV4q8uell16KBx98EG+99Rbmzp0btq233noLo0ePRklJCQDgo48+wrx58zB06FAsWLAAKpUKL730Eq699lr8/e9/D4tFALj11ltRXl6OxYsXBx9y+v3vf48nn3wS559/PsaOHYsdO3Zgzpw5XX6wf//+/fjpT3+KGTNmYPr06RgwYEDc+ZsoXtmYO/v164fJkydj3bp1mDdvnuisoon8psbGRtx6662YOnUqrrzySrz44otYunQpTjvtNFRWVoZ99rXXXsOoUaNgsVhw+eWX4/e//z3+9a9/4dJLL5U8TvE4duwY5syZg9LSUtxwww0oLi7GwYMH8c9//hNAZxv/nnvuwT333IMLL7ww2N8uNPCNKBHt7e1Yv349JkyYgGnTpqGjowMvvPAC5s6di/Xr12Pw4MFhn5fKyQDw/vvvY/HixaiqqsJPf/pTtLa24he/+EWXZgT+73//i6+//hpTpkyBxWLB7t27sW7dOuzZswfr1q0L3hP68ssvMXfuXFgsFixcuBA+nw8rV64UvE5+7LHH8Kc//QmXXnoppk6diubmZqxduxY/+tGP8Morr6R0JkUiOcVqbw8cOBAPPPAAfvvb3+Kkk07Cj3/8YwDAkCFD8MADD+BnP/sZRo8eHbaC1tGjRzFz5kzY7XbMnj0bpaWlePnll3HTTTfhkUceCeangMj7vGPGjMHs2bPx9NNPY/78+aj4/+3df1xN2f4/8FcdhUqln0jJld0vEpFJKZqGShqaOxqES5hEyMPHj8kYP8qPGYbIEEOMhspNdJSUn4UY945wh8nMUFR3/OinilRnff/wPfu2O6c6RZJ5Px8Pj4ez9jp7r93jrP1ee+211/rb3wC8ekZE2hgjpJ1YvXo14ziO/3zt2jXGcRxLTEwU5EtPT5dJf/78ucz+vvzySzZgwABWVVXFp/n5+TGO45hYLObT/vjjD8ZxHLOwsGBZWVl8ekZGBuM4jsXHx/Np8fHxjOM4uf/69esnOH52djaztrZmISEhrLS0lA0fPpz5+Piw6upqPs+VK1cYx3Fs+PDh7NmzZ3x6cnIy4ziOHThwQKG/HSEtIf0937x5k0VHR7OBAwfydWn+/PlsypQpjDHGRo4cyWbPns1/r359e/nyJfPy8mJTp04VpHMcx6ytrVlubi6fdufOHcZxHDt48GCD+2OMsevXrzOO41hCQgKftnbtWmZubs7nlxgLAAAjlElEQVRu377NpxUXFzN7e3vGcRx7+PAhY4yx8vJyNnjwYLZixQrBPp88ecLs7OwE6UuXLmUcx7FNmzbJlEG6Td6/GTNmCPLGxMQwjuPY8ePHWVZWFrO0tGRhYWGCPNu2bWMcx7GAgABB+qpVqxjHcezOnTsyZSCkta1Zs4ZZW1szW1tbtmjRIsYYY9OmTWNeXl6C+CmRSJivry8bNWoUn1ZVVcVqa2sF+3v48CHr168fi4iI4NOkse7DDz+Uqe/SbQ39e/z4MZ9X0WtKYGAg69+/P8vPz+fTfv/9d2ZpaSloZxDS3tWN4/J88cUXzNHRkRUVFQnSg4ODmZ2dHV8fpfXQw8NDUO8PHDjAOI5j2dnZjLFXdd7e3p598skngvbs0aNHGcdxzM/Pj0+7efOmTDtaStoerxvjq6qqmKOjIwsKCmr+H4KQVlD/3pSx//12Dx8+LJO/ufejTf3+58yZw8aMGdNoGRVtQ4eHhzOO41hqaqpMfolEwhhrvM4uXbqUjRw5kv+clpbGOI5j3333nSBfUFAQMzc3F8RpRWO3nZ0dW716daPnS8jboki/z8OHDxnHccze3p6VlJTw3z19+jTjOI6dPXuWT5N3PZHiOI5t27aN//z9998L7m3rGjlyJFu6dCn/eceOHczW1pbdv39fkG/Tpk3M0tKSFRQUMMYYCw0NZYMGDWI1NTXN/2MQ0kqk9ezy5cussLCQ/fe//2VJSUnM3t6e2djYsKtXrzKO41hISIjgexs2bGAcx7HMzEw+zc/PT9AOVbRtyxhjs2fPFsQ4KUXiMGOM3bp1i3Ecxy5dusQYexVXnZ2dWWhoqCBfWFgY4ziO3bhxg08rLCxkdnZ2MnW+/vlI/1b1rwvS87xy5QpjjLHbt28zjuPYyZMnGy2zra2t4FpCyJvypuOnr68vGz9+vOAYN27cELR1JRIJGzVqFJsxYwbfrmXsVTvZ1dWVTZ8+nU+T9stK+76knjx5wqysrFhgYKAgffv27YzjOEF9ke6joXOvW09HjhzJOI5j6enpgryKxm9C6nsfYmfdfqwHDx4wKysrtnbtWkG56u5Deu+oyDlJ69y1a9f4tMLCQtavXz+2YcMGwfefPn3KrKysWFxcHJ/m6+vL5syZI1Pm+m1wRa8D0vvmhvrspOWrfz9ASFOa6g+uqakR1GPGGCstLWXDhg1jy5cv59OaE5O9vLyYs7MzKy8v59Ok15y614P67dP6x6rb5ySvT+vEiRMy9fjzzz9nAwYMYH/++SeflpOTw6ysrAR1MS8vj1laWrKdO3cK9pmdnc2srKxk0glpjxQdp1R/XIcUx3Ey/a/Se9W69a68vJy5urqykSNH8s+AG3vOe/LkSbl1n7QtWnqetFspKSno0qULHB0dUVRUxP+ztraGmpqaYMriujMASkfRDx48GM+fP8e9e/cE+1VTU8OYMWP4z3/729+gqamJPn36YMCAAXy69P8PHz6UKdvKlSsRFRUl+Fd/mQSO4zB//nwcOXIE/v7+KC4uxsaNG9Ghg+xEv+PGjRPMWuru7g59fX1cuHBB0T8XIa/Fw8MDVVVVOHfuHMrLy3H+/Hm5y84DwvpWWlqKZ8+ewc7ODrdv35bJO2zYMMHsBBYWFtDQ0BDUq7r7q66uRnFxMUxMTKCpqSnYZ0ZGBmxtbQVvvGlra8uU8/LlyygrK8OYMWME1w5lZWUMGDBA7nTnEydOlHuuHTt2lKnrUVFRMsvT+/r6wsnJCaGhoViyZAmMjY2xaNEiufucPHmy4LOfnx8AyF0+m5DWFhwcDG1tbSgrK2P58uUoKSnBlStX4OHhwcfToqIiFBcXw8nJCTk5OXj06BGAVzPrKiu/amrW1taiuLgYampq6N27t9zrwbhx4xqcJXvu3Lly65p0hgippq4ptbW1uHjxItzc3NCjRw8+X58+feDk5PR6fyxC2hHGGFJTU+Hq6grGmCAeOjk54dmzZzJLOvv4+Ahm6R48eDCA/7WF//Of/6CkpAQTJkwQtGfHjh0rU1eboqamJnhzVVVVFf3795fb7ibkXaKqqgofHx+Z9Obejzb1+9fU1MSff/4pd7kvecdsrA2dmpoKCwsLmTfAAQhm7VZUeno6RCKRYKlCAJgxYwYYYzJtWkXuBzQ1NXHjxg2+jUHIu0CRfh9PT09BDKwfO1tTSkoK7OzsoKmpKYjzw4YNQ21tLa5duwbgVf16/vw5Ll261OplIqS5/vGPf8DBwQEuLi4IDg6Guro6IiIicP36dQDgZ0CRmjFjBgAo1F/aVNu2MYrEYeDVbGR6enoYOnQogFdx1dPTE8nJyaitreXzXbhwAba2toKZDXV0dBrsd2sJab/yxYsX8fz58ze2X0Ka603FTw8PD/zyyy/8bInAq9lEVVVV4ebmBgC4c+cOcnJyMHbsWBQXF/OxsLKyEg4ODrh27ZrMcu6fffaZ4HNmZiZqamr4ZeilpP21r6Nnz54YPny4IE3R+E1IQ9p77JQyNjaGt7c34uLi8PjxY7l5pGVW9JzMzMz4MgOvYm3v3r1lyp+UlAQlJSWMGjWKT/Py8kJ6ejpKS0sVKn9TunTpAuDVTIzV1dVvZJ+EKEIkEvH1WCKRoKSkBDU1NejXr5/cZzZNxeRHjx7h7t27GDduHD+DMADY29uD47gWl7Nun1ZVVRWKior4cRnSPuva2lpkZmbiww8/FMxe2qtXL5n4mpaWBolEAg8PD0F81dPTQ69evWgZbPJeUaS9ragLFy7AxsZGED/V1dXh6+uL/Px8/P7774L8jT3nJe8WWnqetFu5ubl49uwZHBwc5G4vLCzk///bb79h69atuHLlCsrLywX5nj17JvjcrVs3mQdiXbp04ZfLrJsGAGVlZTLHtrGxQf/+/Zs8B39/fyQlJeHmzZtYtGgRzMzM5Obr1auX4LOSkhJ69eqF/Pz8Jo9ByJugo6MDBwcHnDhxAi9evEBtbS1Gjx4tN++5c+ewc+dO3LlzBy9fvuTT5T1o7t69u0yalpaWoF69ePECkZGROHr0KB49esQv+wMI629+fj5sbW1l9ld/maycnBwAaHAZvbqDsoFXS3DXr/9SIpEIw4YNk7utvnXr1sHNzQ2lpaWIiYlpsKFUv76bmJhAWVkZeXl5Ch2HkDdJQ0MDvXv3RnFxMfT09HDz5k0wxhAeHo7w8HC53yksLIShoSEkEgl++OEHHDp0CHl5eYIHYdra2jLf69mzZ4Pl4DhOobrW1DWlqKgIL168kKlnANC7d296AYP8ZRQVFaGsrAyxsbGIjY1tME9ddQdXA+CX45HWr4KCAgCycbdDhw4wMjJqVvnktce1tLSQnZ3drP0Q8rYZGhoKHpxJve79aP3f/6xZs3D58mV8+umn6NWrFxwdHeHl5cUvCw8o3oZ+8OCB4AHY68rPz4eBgYFMm1q6pFD9e1hF7gcWL16MZcuWYcSIEbC2toaLiwvGjRsHY2PjN1ZuQppLkX6f+r9v6QM2ef1Ib1pubi6ys7Mb7DOTxvlJkybh5MmT/LKejo6O8PDwgLOzc6uXkZCmrFy5Er1794ZIJIKenh569+4NZWVlpKWlQVlZWabdqa+vD01NTYX6S5tq2zZGkThcW1uLpKQkDB06VNCfY2Njg3379iEzM5N/WbGgoEAwOYFU7969myyLooyNjTF9+nRERUVBLBZj8ODBcHV1hbe3N9/HTcjb8Kbip7u7OzZs2IDk5GQEBASAMYaUlBQ4Ozvz7VBpH/DSpUsbPNazZ88EA2Dq9001dJ+rra3d7Bci65PXD6Zo/CakIe05dtYXGBiIxMRE7N69GytWrJDZnp+f36xzaujes/7gz8TERNjY2KCkpAQlJSUAAEtLS1RXVyMlJQW+vr5Nnm9T7O3tMXr0aERERGD//v2wt7eHm5sbxo4dK7dPgZA3KSEhAfv27cP9+/cFA5XlxaWmYnJDcRJ49axT3uBTRZSUlCAiIgLJycmC8R7A//q0CgsLG3zWUz8tJycHjLEG+7/kTeJFSHul6DglRTR0rypdQr6goEAwKLyx57zk3UJXPdJuSSQS6OrqYtOmTXK36+joAHjVWPHz84OGhgbmz58PExMTdOzYEb/88gs2bdok89aoSCSSu7+G0us+cGuuhw8fIjc3FwBw9+7dFu+HkLfBy8sLX375JZ4+fQpnZ2e+I6Cuf/3rX5gzZw6GDBmCr776Cvr6+lBRUUF8fDxOnDghk1+RerV27VocPXoU06ZNg62tLbp06QIlJSUEBwe3qP5Jv/P1119DX1+/yTLVnRXxdVy9epUfOHv37l0MHDhQoe+1ZCYnQlqLNGbOmDFD5q1MKWmnwK5duxAeHo5PPvkECxYsgJaWFpSVlbFu3Tq5dfdNvGXWGrGakPeRtC57e3tj/PjxcvOYm5sLPjcUC1ujfjVUlwl518mLZW/qfrSuPn36ICUlBefPn0dGRgZSU1Nx6NAhzJ07F/Pnzwfw5tvQrUWR2O3p6YnBgwcjLS0Nly5dwt69e7Fnzx5s374dLi4ub6uohDRbW7ZNJRIJHB0dMXPmTLnbTU1NAQC6uro4duwYLl68iPT0dKSnp+Po0aMYN24cNm7c2OrlJKQxTT3gep3+ktdp2yoSh69cuYInT54gKSkJSUlJMvsQi8VvZFWLhv4G9dsXALBs2TKMHz8eZ86cwaVLlxAaGorIyEjExcU1+II0IW1BkfhpaGiIwYMH4+TJkwgICEBWVhYKCgoEqzxJ8y9ZskSwAlVdampqgs8dO3Zscbkbqo91X5yuS969g6Lxm5CGtOfYWV/dWUVnz57d4L4VPSdF7rVzcnJw69YtAJA7oEwsFjc6UFTR64CSkhK2bduGrKwsnDt3DhkZGfjiiy8QFRWF2NhYwcyMhLxJx48fx7Jly+Dm5gZ/f3/o6upCJBIhMjJS7uzAb/Ketjnt1oULF+L69evw9/eHpaUl1NTUIJFIMHPmzBYdWyKRQElJCXv27JF7TvXbA4SQlqHZRNsPGihK2i0TExNkZmZi0KBBjV50fvrpJ/7NkyFDhvDpbT07n0QiwbJly6ChoYFp06Zh165dGD16tNybD+lgUinGGHJzc2Ue4BPSmj766CN89dVXyMrKwpYtW+TmOXXqFDp27Ii9e/cK3nyMj49v8XFPnTqFcePGYdmyZXxaVVWVzOxLRkZGMnUFgGAJIgD8zEO6uroKzwb6uh4/fozQ0FA4OTlBRUUFGzduhJOTk9wZ1nJzcwWzI+Xm5kIikdBbOOSdIP1tqqioNFl/Tp06haFDh2LdunWC9LKyMnTt2rXVytgYHR0ddOrUSe614v79+21QIkLaho6ODtTV1SGRSN5YLJTOLPHgwQN88MEHfHpNTQ3y8/MF7VZ6CYL8lbTW/aiamho8PT3h6emJly9fIigoCLt27cLnn3+Ojh07KtyGNjExwW+//dbosZpTZ42MjJCZmYny8nLBrKL37t3jt7eEgYEBJk+ejMmTJ6OwsBDjx4/Hrl27aKAoafeaU7+ak9fExASVlZUKxXlVVVW4urrC1dUVEokEq1atQmxsLAIDA+XOzkJIWzMyMoJEIkFubi4/YzUAPH36FGVlZS2ONfU1VueaisNisRi6urpYuXKlzHfT0tKQlpaG1atXo1OnTujRo0eL71GlL3HXj+8NzQxnbm4Oc3NzBAYG4ueff8bEiRNx+PBhBAcHN3ksQt41Hh4eWL16Ne7du4fk5GR07twZI0eO5LdL+7A0NDRafN9b9z63bn9tcXGxzCyEdWdXrDvBgnS2NUU0J34T0hztIXbKM2fOHCQmJspdMrc1zkksFkNFRQVff/21zMDYf//73zh48CAKCgpkZleVau51wNbWFra2tggODoZYLMbixYuRnJyMTz/9lPrOSKs4deoUjI2NERERIfiNbdu2rUX7qxsn66vfvlW03VpaWorMzEwEBQVh3rx5fLp0pnApXV1ddOzYUW47un6aiYkJGGPo2bPnG521n5D3XY8ePeTel0r7eRuKh3VRPHs3vf4UaYS0EQ8PD9TW1uK7776T2VZTU8NPey5tzNd9w+Tly5c4dOjQ2yloA6KionD9+nWsWbMGCxYswMCBA7Fq1Sq5y4ccO3ZMsERhSkoKnjx5QkuBkbdKXV0dq1atQlBQEFxdXeXmEYlEUFJSErwhmZeXhzNnzrT4uPLe7jp48KDMW5hOTk7IysrCnTt3+LSSkhKIxWJBvuHDh0NDQwORkZGCZRWkWmMJny+//BISiQRhYWFYs2YNOnTogJCQELlvvv3444+Cz9HR0QBA9Z28E3R1dWFvb4/Y2Fg8fvxYZnvd+iMSiWR+4ydPnsSjR49avZwNEYlEcHJywunTpwUddH/88QcuXrzYZuUi5G0TiUQYPXo0Tp06JXdW+5bEwn79+kFbWxtxcXGoqanh08ViscwDtM6dOwN4O0vvEtLWWuN+tLi4WPBZVVUVffr0AWOMb98q2oYeNWoUfv31V6Slpcnkl5a5OXXW2dkZtbW1Mm3a/fv3Q0lJqdlt2traWpmHCLq6ujAwMOBn6yekPWtO/ZLmrV8n5PHw8MD169eRkZEhs62srIyP1fWvJ8rKyvzLHVTHyLtK+pLAgQMHBOlRUVGC7a+rc+fOcutbU3H4xYsXSE1NxYgRI+Du7i7zb/LkyaioqMDZs2f58mZlZeHmzZv8PouKimT6s+SRruhx7do1Pq22thZxcXGCfOXl5YI2OgBwHAdlZWVBXVdTU6M2Omk3Ro8eDZFIhKSkJKSkpGDEiBGCGcH69esHExMT7Nu3DxUVFTLfV+S+18HBAR06dMDhw4cF6fXbuoD8+lhZWYljx44pekoKx29Cmutdj50NMTExgbe3N2JjY/HkyRPBttY4J7FYDDs7O3h6esrEb+lMv/JWzqtbXqDp60BpaalMv7l05mNpXKa+M9IapH1FdX9/N27cQFZWVov2Z2hoCI7jcOzYMUGs/emnn2T6nI2MjCASiQT1A4BMjG1oFtP6dV0kEmHYsGE4c+aM4JlTbm6uTBwdNWoURCIRIiIiZOoeY0zmGkUIecXFxQU3b97E9evX+bTKykrExcXByMgIZmZmTe6jOX1Z5O2hGUVJu2Vvbw9fX19ERkbizp07cHR0hIqKCnJycpCSkoKQkBC4u7tj4MCB0NLSwrJlyzBlyhQoKSnh+PHjrbrUV3p6Oj+Svq5BgwbB2NgYf/zxB8LDw+Hj48MPuNuwYQPGjRuH1atXIzw8XPA9LS0tTJo0CT4+PigsLMSBAwfQq1cvTJgwodXOgRB5GlqeVsrFxQVRUVGYOXMmvLy8UFhYiEOHDsHExATZ2dktOuaIESNw/PhxaGhowMzMDFlZWbh8+TK0tbUF+WbOnInExERMnz4dfn5+UFNTw5EjR9C9e3eUlJTwb6xoaGhg1apVWLJkCXx8fODp6QkdHR0UFBTgwoULGDRokNwZH+SpqanB8ePH5W776KOPoKamhvj4eJw/fx4bNmzgl/JasWIF/u///g+HDh3C5MmTBd/Ly8tDQEAAhg8fjqysLCQmJsLLywsWFhbN/MsR0jq++uorTJo0CWPHjsWECRNgbGyMp0+fIisrC3/++ScSExMBvKq7O3bswPLlyzFw4EDcvXsXYrFYMAODov71r3+hqqpKJt3c3LzZdSMoKAgZGRmYPHkyJk6ciNraWkRHR8PMzKzF1ylC3mXx8fFyHzLNmzcPV69exYQJE/Dpp5/CzMwMpaWl+OWXX5CZmYmffvqpWcdRVVVFUFAQ1q5di2nTpsHDwwP5+fk4evQo31EuZWJiAk1NTcTExEBdXR1qamqwsbFp0fWBkHdda9yP+vv7Q09PD4MGDYKuri7u3buH6OhouLi48LN4KtqG9vf3x6lTp7BgwQJ88sknsLa2RmlpKc6ePYvVq1fDwsKiWXXW1dUVQ4cOxZYtW/jZhC9duoQzZ85g2rRpMteDplRUVMDFxQWjR4+GhYUF1NTUcPnyZdy6dUswWyohb1tj/T7NmS3B2toaAPgVKEQiEcaMGdNo3i1btsDT0xMqKioYOXKk3GXy/P39cfbsWQQEBGD8+PGwtrbG8+fPcffuXZw6dQpnzpyBjo4OVqxYgdLSUnzwwQcwNDREQUEBoqOjYWlpKZiZiZB3iYWFBcaPH4/Y2FiUlZVhyJAhuHXrFhISEuDm5iaY3f51WFtbIzk5GevXr0f//v2hpqYGV1fXJuNwcnIyKioqGnzJ2tbWFjo6OkhMTISnpydmzpyJ48ePY+bMmZg6dSo6d+6MuLg49OjRo8l71L59+8LW1hbffvstSktLoaWlheTkZJnBZFeuXMGaNWvg7u4OU1NT1NbW4vjx4/wLZHXPOTMzE1FRUTAwMEDPnj0xYMCA1/9jEvL/van4Cbx6eWjo0KGIiopCRUUFPD09BduVlZURGhqKWbNmwcvLCz4+PjA0NMSjR49w9epVaGhoYNeuXY0eQ09PD1OnTsW+ffv4/trs7Gykp6eja9eugjI7OjqiR48eCAkJwb179yASiRAfH4+uXbsqPKuoovGbkOZ612NnYwICAnD8+HHcv38fffv2bbVzunHjBnJzc2We10gZGhrCysoKYrEYs2fPlptH0etAQkICDh8+DDc3N5iYmKCiogJxcXHQ0NDgX67s1KkTzMzMcPLkSZiamkJbWxt9+/YFx3HNOi/y19RQf7C9vT1SU1Mxd+5cjBgxAnl5eYiJiYGZmRkqKytbdKzg4GAEBgZi4sSJ8PHxQVlZGX788UdwHCcYPNqlSxe4u7sjOjoaSkpKMDY2xvnz51FYWCjYn4aGBoYMGYLvv/8e1dXVMDQ0xKVLl+SuzDNv3jxcvHgREydOxMSJEyGRSBAdHY2+ffsKJhUyMTHBwoULsXnzZuTn58PNzQ3q6urIy8vD6dOnMWHCBPj7+7fo/Al51zQ1Tqk5Zs+ejaSkJMyaNQtTpkyBlpYWjh07hry8PGzfvl1m9m15LC0tIRKJsGfPHjx79gyqqqr44IMPoKur26yykDeLBoqSdm3NmjXo168fYmJisGXLFohEIhgZGcHb2xuDBg0CAHTt2hW7du3Cxo0bsXXrVmhqasLb2xsODg6tFvQbmqJ9/fr16NGjB5YuXYquXbviiy++4LeZmppi0aJFCAsLQ3JysqBjIyAgANnZ2di9ezcqKirg4OCAr776ih+BT8i7wsHBAWFhYdizZw/WrVuHnj17YvHixcjPz2/xAKyQkBAoKytDLBajqqoKgwYN4gej1tW9e3f88MMPCA0NRWRkJHR0dDB58mR07twZoaGhguVLxo4dCwMDA+zevRt79+7Fy5cvYWhoiMGDB8PHx0fhsr18+RJLliyRu+3MmTMoKyvD+vXrMXLkSMEgW29vb6SmpmLTpk1wdnYWNMy2bt2K8PBwbN68GR06dICfn1+DxyCkLZiZmSE+Ph4RERFISEhASUkJdHR0YGVlhblz5/L5AgIC8Pz5c4jFYiQnJ8PKygqRkZHYvHlzs4958OBBuenz5s1r9kBRCwsL7N27F+vXr8e2bdvQrVs3BAUF4cmTJzRQlLyX6r+VLeXj44MjR45gx44dSEtLw+HDh6GtrQ0zMzMsXry4Rcfy8/MDYwxRUVHYuHEjLCwssHPnTpk4rKKigg0bNuDbb7/FqlWrUFNTg/Xr19NAUfJeao37UV9fX4jFYkRFRaGyshLdunXDlClTEBgYyOdRtA2trq6OH3/8Edu3b0daWhoSEhKgq6sLBwcHGBoaAmhenVVWVsbOnTuxbds2JCcn4+jRozAyMsKSJUswY8aMZp9rp06dMHHiRFy6dAmpqalgjMHExIR/cYWQttJYv4+9vb3C+xk1ahSmTJmCpKQkJCYmgjHW4EBRGxsbLFiwADExMcjIyIBEIsGZM2fkDhTt3LkzDh48iMjISKSkpODYsWPQ0NCAqakpgoKC0KVLFwCv7k3j4uJw6NAhlJWVQV9fHx4eHggKClKow5+QthIaGoqePXsiISEBp0+fhp6eHj7//HPB8pSva9KkSbhz5w6OHj2K/fv3w8jICK6urk3G4cTERHTs2BGOjo5y96usrIwRI0ZALBajuLgYBgYGfH/W7t27oa2tjc8++wwGBgYICQlpspybNm3CypUrsXv3bmhqauLvf/87hg4diunTp/N5zM3N4eTkhHPnzuHRo0fo3LkzzM3NsWfPHtja2vL5li1bhpUrV2Lr1q148eIFxo8fTwNFyRv1puKnlKenJy5fvgx1dXW5swcOHToUsbGx+O677xAdHY3Kykro6+vDxsYGvr6+Ch1j8eLF6NSpE44cOYLMzEzY2tpi7969mDRpElRVVfl8KioqiIiI4CcC0dfXx7Rp06CpqYnly5crdCxF4zchLfEux87G9OrVC97e3khISGjVc5LO5N3Qix7Sbdu3b8evv/4qt09a0euAvb09bt26heTkZDx9+hRdunSBjY0NNm3aJLjPDg0Nxdq1a7F+/XpUV1dj3rx5NFCUKKSh/uDz58+jsrISsbGxuHjxIszMzPDNN98gJSWl2ZMGSLm6uuLbb7/F9u3bsXnzZpiammL9+vU4duwYfvvtN0HeFStWoKamBjExMVBVVYW7uzuWLFkCLy8vQb7Nmzdj7dq1OHToEBhjcHR0xJ49ezB8+HBBvn79+mHPnj34+uuvER4eju7du2P+/Pm4d++ezEC52bNnw9TUFPv378eOHTsAAN26dYOjo2Oj9Z6Q9qax9nZzn7/o6ekhJiYG33zzDaKjo1FVVQVzc3Ps2rULI0aMUGgf+vr6WL16NSIjIxESEoLa2lr88MMPNFC0jSmx1pxWkRDyWq5evYqpU6ciPDwc7u7ubV0cQtqlsLAwxMbG4vr16w0uWfAu2L59OyIiIpCZmUlvhhNCCHlvSCQSODg44KOPPkJoaGhbF4cQQgghhJB2Szowbf/+/W1dFEL+0qSzFy5cuBBz5sxp6+IQQtqIi4sLnJycEBYW1tZFIeSd8/HHH0NHRwdRUVFv/diBgYH4/fffkZqa+taPTQgh7QG9Gk4IIeS98eLFC8Hn4uJiJCYmws7O7p0eJEoIIYS8D6qqqmSW0z527BhKSkpaNDsMIYQQQggh5H+ePHmCrl27tnUxCPlLqd/fDAAHDhwAALrPJeQvrLq6GiUlJRSXyV9edXU1ampqBGlXr17Fr7/++lbiZP04nZOTg/T0dIrRhBDSCFp6nhBCyHvD19cX9vb26NOnD54+fYr4+HiUl5crtIQJIYQQQl5PVlYW1q9fD3d3d2hra+P27dv45z//CY7jaHZ8QgghhBBCWujnn39GWloaHjx4gFmzZrV1cQj5S0lOTkZCQgKcnZ2hpqaGn3/+GSdOnICTkxPs7OzauniEkDaQkZGB5ORkvHjxAg4ODm1dHELa1KNHjzB9+nR4e3vDwMAA9+7dQ0xMDPT19fHZZ5+1+vHd3Nwwfvx4GBsbIz8/HzExMVBRUcHMmTNb/diEENJe0UBRQggh7w0XFxecOnUKcXFxUFJSgpWVFcLCwjBkyJC2LhohhBDy3jMyMkK3bt1w8OBBlJaWQktLCx9//DEWL14MVVXVti4eIYQQQggh7dKRI0eQnp6OadOmwcfHp62LQ8hfirm5OUQiEb7//ntUVFRAV1cXU6dOxcKFC9u6aISQNrJ79248ePAAwcHBcHR0bOviENKmtLS0YG1tjSNHjqCoqAhqampwcXHB4sWL38qMu8OHD0dSUhKePHkCVVVV2NraYtGiRTA1NW31YxNCSHulxOqvDUgIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC3gvKbV0AQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEENI6aKAoIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCyHuKBooSQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEvKdooCghhBBCCCGEEEIIIYQQQgghhBBCCCGEEELIe4oGihJCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYS8p2igKCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQsh7igaKEkIIIYQQQgghhBBCCCGEEEIIIYQQQgghhLynaKAoIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCyHuKBooSQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEvKf+H53IL58n70cIAAAAAElFTkSuQmCC\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Utils functions" - ], - "metadata": { - "id": "fgjaAnSXnpGw" - }, - "id": "fgjaAnSXnpGw" - }, - { - "cell_type": "code", - "source": [ - "\"\"\"\n", - "Question:\n", - "what plotting graph between actual and predicted values what type of graphs are recommend especially if the points are scattered?\n", - "\n", - "Answer:\n", - "When you want to plot the relationship between actual and predicted values, and the points are scattered, the most common type of plot used is a scatter plot. Scatter plots are useful for visualizing the relationship between two continuous variables, and they allow you to see the individual data points as well as any trends or patterns in the data.\n", - "\n", - "In addition to scatter plots, you can also use other types of plots to visualize the relationship between actual and predicted values, depending on the specific context of your data. Here are some other types of plots you might consider:\n", - "\n", - "Line plot: A line plot can be used to show the trend or pattern in the data, if there is one. The actual and predicted values can be plotted on the same plot, with different line styles or colors to distinguish between them.\n", - "\n", - "Histogram: A histogram can be used to show the distribution of the actual and predicted values separately. This can be useful if you want to compare the distribution of the two variables or identify any outliers.\n", - "\n", - "Density plot: A density plot is similar to a histogram, but it shows the density of the data rather than the count. \n", - "This can be useful if you want to compare the shape of the distribution of the actual and predicted values.\n", - "\n", - "Violin plot: A violin plot is a type of plot that shows the distribution of the data as a kernel density estimate and a box plot. This can be useful if you want to compare the distribution of the actual and predicted values and see how they differ in terms of skewness or kurtosis.\n", - "\n", - "Overall, the choice of plot depends on the nature of your data and the specific question you are trying to answer with the plot. A scatter plot is a good starting point, but you may want to consider other types of plots to get a more complete picture of the relationship between actual and predicted values.\n", - "\"\"\"\n", - "\n", - "def dict_to_list_of_tuples(dict):\n", - " \"\"\"\n", - " Converts a dictionary to a list of tuples.\n", - "\n", - " Args:\n", - " dict: The dictionary to convert.\n", - "\n", - " Returns:\n", - " A list of tuples.\n", - " \"\"\"\n", - "\n", - " list_of_tuples = []\n", - " for key, value in dict.items():\n", - " list_of_tuples.append((key, value))\n", - "\n", - " return list_of_tuples\n", - "\n", - "def tabulate(features: dict, headers: list) -> str:\n", - " \"\"\"\n", - " Tabulate Features\n", - " \"\"\"\n", - " _table = []\n", - " for key in features:\n", - " _table.append((key, features[key]))\n", - " # \n", - " return tabulate(_table, headers=headers)\n", - "\n", - "\n", - "def plot_graph(df: pd.DataFrame, model_name='', graph_type='scatter_line', label1='Actual Values', label2='Predicted Values',\n", - " title='Actual vs. Predicted Scores'):\n", - " \"\"\"\n", - " Plot Graphs\n", - " \"\"\"\n", - " # if model_name == 'lasso':\n", - " # pass\n", - " # else:\n", - " df = df.copy()\n", - " label1_values = df[label1]\n", - " label2_values = df[label2]\n", - "\n", - " sns.set_style('whitegrid')\n", - " if graph_type == 'line':\n", - " plt.plot(df[label1], label=label1)\n", - " plt.plot(df[label2], label=label2)\n", - " plt.xlabel('Data Points')\n", - " plt.ylabel('Scores')\n", - "\n", - " if graph_type == 'bar':\n", - " # create a bar chart of the data using Seaborn\n", - " sns.barplot(x=label1, y=label2, data=df)\n", - " # rotate the x-axis labels by 90 degrees\n", - " plt.xticks(rotation=60)\n", - " # \n", - " plt.xlabel(label1)\n", - " plt.ylabel(label2)\n", - "\n", - " if graph_type == 'scatter_line':\n", - " r_squared = r2_score(label1_values, label2_values)\n", - " sns.scatterplot(x=label2_values, y=label1_values, label='Actual')\n", - " sns.lineplot(x=label2_values, y=label2_values, color='gray', linestyle='--', label='Predicted')\n", - " \n", - " plt.text(0.95, 0.05, f'R-squared: {r_squared:.4f}', fontsize=10,\n", - " horizontalalignment='right', verticalalignment='bottom', transform=plt.gca().transAxes)\n", - " plt.xlabel('Predicted Values')\n", - " plt.ylabel('Actual Values')\n", - "\n", - " plt.title(title)\n", - " plt.legend()\n", - " plt.show()\n", - "\n", - "# " - ], - "metadata": { - "id": "3LU6tQUWnoTv" - }, - "id": "3LU6tQUWnoTv", - "execution_count": 399, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## Define Learning Algorithms" - ], - "metadata": { - "id": "R93rB2tDpDoJ" - }, - "id": "R93rB2tDpDoJ" - }, - { - "cell_type": "markdown", - "source": [ - "### Base Learners" - ], - "metadata": { - "id": "rEIUzqP6vKvz" - }, - "id": "rEIUzqP6vKvz" - }, - { - "cell_type": "code", - "source": [ - "# \n", - "# the_model.fit(desh_X_train, desh_Y_train)#fit the model\n", - "# pred=the_model.predict(desh_X_test)#make prediction on test set\n", - "# error = sqrt(mean_squared_error(desh_Y_test,pred))#calculate rmse\n", - "# desh_rmse_val.append(error)#store rmse values\n", - "# print('RMSE value for k= ',K, ' is: ',error)\n", - "# \n", - "class BaseLearners:\n", - " \"\"\"\n", - " Base Learners: K-NN and Lasso\n", - " \"\"\"\n", - " def __init__(self, dataframe: pd.DataFrame, selected_features: list, target_variable: str = TARGET, test_size: float = 0.25, n_cv: int = 10) -> None:\n", - " # Dataframe\n", - " self.dataframe = dataframe\n", - "\n", - " # features \n", - " self.selected_features = selected_features\n", - "\n", - " # target column \n", - " self.target_variable = target_variable\n", - "\n", - " # Get the feature vector\n", - " self.X = self.dataframe[self.selected_features].values\n", - " \n", - " # Get the target vector\n", - " self.y = self.dataframe[self.target_variable].values\n", - " \n", - " # splitting the dataset into training and test set\n", - " self.X_train, self.X_test, self.y_train, self.y_test = train_test_split(self.X, self.y, test_size=test_size, random_state=42, shuffle=True)\n", - " # print(self.y_test)\n", - " # self.dataframe = pd.DataFrame()\n", - " # self.eval_methods = ['MSE', 'RMSE', 'MAE', 'R^2', 'explained_variance']\n", - " self.n_cv = n_cv\n", - "\n", - " self.gridsearch_results = None\n", - "\n", - " def show_data_split(self):\n", - " \"\"\"\n", - " Shows the splitted data (e.g. Train/Test) \n", - " \"\"\"\n", - " # Put X_train and y_train into a pandas DataFrame\n", - " df_train = pd.DataFrame(self.X_train, columns=self.selected_features)\n", - " df_train[self.target_variable] = self.y_train\n", - " # reset the index\n", - " # df_train = df_train.reset_index()\n", - " # Randomize the arrangement of the rows\n", - " df_train = df_train.sample(frac=1, random_state=42)\n", - "\n", - " # Put X_test and y_test into a pandas DataFrame\n", - " df_test = pd.DataFrame(self.X_test, columns=self.selected_features)\n", - " df_test[self.target_variable] = self.y_test\n", - " # Randomize the arrangement of the rows\n", - " df_test = df_test.sample(frac=1, random_state=42)\n", - " # reset the index\n", - " # df_test = df_test.reset_index()\n", - " \n", - " return {'train': df_train,\n", - " 'test': df_test}\n", - " \n", - " def show_gridsearch_results(self):\n", - " \"\"\"\n", - " GridSearchcv results in tabular form\n", - " \"\"\"\n", - " # get the results as a pandas DataFrame\n", - " results = pd.DataFrame(self.gridsearch_results)\n", - " # print the results\n", - " # print(results[['param_alpha', 'mean_test_score', 'rank_test_score']])\n", - " return results\n", - "\n", - " def evaluate_model(self, model, with_table = False, return_train_score = False) -> Dict:\n", - " \"\"\"\n", - " Computes evaluation metrics for a regression model based on actual and predicted values.\n", - " \n", - " Parameters:\n", - " model: (Any): sklearn model\n", - " with_table: (bool): True or False\n", - " return_train_score: (bool): True or False\n", - "\n", - " Returns:\n", - " dict: A dictionary containing evaluation metrics including MSE, RMSE, MAE, R^2, and explained variance.\n", - " \"\"\"\n", - " # ['MSE', 'RMSE', 'MAE', 'R^2', 'explained_variance']\n", - " # explained_variance_score(self.y_test, test_predicted)\n", - " if hasattr(model, 'coef_'): \n", - " coefs = pd.DataFrame(list(zip(self.selected_features, model.coef_)), columns=['Features', 'Coefficient Estimate'])\n", - " # swap columns Features and Coefficient Estimate\n", - " # coefs['Features'], coefs['Coefficient Estimate'] = coefs['col2'], coefs['col1']\n", - " else:\n", - " coefs = pd.DataFrame()\n", - "\n", - " # Compute the train scores\n", - " train_scores = {}\n", - " if return_train_score:\n", - " train_predicted = model.predict(self.X_train)\n", - " train_mse = mean_squared_error(self.y_train, train_predicted)\n", - " train_r2 = r2_score(self.y_train, train_predicted)\n", - " train_scores = {'MSE': train_mse, \n", - " 'RMSE': np.sqrt(train_mse), \n", - " 'MAE': mean_absolute_error(self.y_train, train_predicted), \n", - " 'R^2': train_r2, \n", - " 'unexplained_variance': 1 - train_r2,\n", - " 'lasso_coefs': coefs}\n", - "\n", - " # Compute the test scores\n", - " test_predicted = model.predict(self.X_test)\n", - " test_mse = mean_squared_error(self.y_test, test_predicted)\n", - " test_r2 = r2_score(self.y_test, test_predicted)\n", - " test_scores = {'MSE': test_mse, \n", - " 'RMSE': np.sqrt(test_mse), \n", - " 'MAE': mean_absolute_error(self.y_test, test_predicted), \n", - " 'R^2': test_r2, \n", - " 'unexplained_variance': 1 - test_r2}\n", - " \n", - " # if !coefs.empty: \n", - " # test_scores[''] = coefs \n", - " # Create a DataFrame to store the actual scores and predicted scores\n", - " values_table = pd.DataFrame()\n", - " if with_table:\n", - " values_table = pd.DataFrame({'Actual Values': self.y_test, \n", - " 'Predicted Values': test_predicted.tolist()})\n", - "\n", - " return {'train_scores': train_scores,\n", - " 'test_scores': test_scores,\n", - " 'values_table': values_table}\n", - "\n", - " def lasso(self, param_grid: dict = {'alpha': [0.1, 1, 10, 100]}, scoring: str = 'r2', **kwargs):\n", - " \"\"\"\n", - " Lasso:\n", - " \\n\n", - " - Define a hyperparameter grid: param_grid = {'alpha': [0.1, 1, 10, 100]}\n", - " \\n\n", - " - Define a scoring metric: scoring = 'neg_mean_squared_error' OR 'neg_mean_absolute_error' OR 'explained_variance' OR 'r2'\n", - " \"\"\"\n", - "\n", - " # Create a Lasso regression model\n", - " lasso = Lasso()\n", - "\n", - " # Create a GridSearchCV object\n", - " grid_search = GridSearchCV(lasso, param_grid=param_grid, scoring=scoring, cv=self.n_cv, **kwargs)\n", - "\n", - " # Fit the GridSearchCV object to the training data\n", - " grid_search.fit(self.X_train, self.y_train)\n", - "\n", - " # Print the best hyperparameters and cross-validated score\n", - " print(\"Best hyperparameters:\", grid_search.best_params_)\n", - " print(\"Best cross-validated score:\", grid_search.best_score_)\n", - "\n", - " # \n", - " # print(list(zip(reg.coef_,all_desh_feature)))\n", - " # print('Lasso Deshanais R Squared for training set ', round(reg.score(desh_X_train,desh_Y_train)*100,2))\n", - " # print('Lasso Deshanais R Squared for testing set ', round(reg.score(desh_X_test,desh_Y_test)*100,2))\n", - " \n", - " self.gridsearch_results = grid_search.cv_results_\n", - " return grid_search.best_estimator_\n", - "\n", - " def knn(self, K: int = 5, param_grid: dict = {'n_neighbors': [3, 5, 7, 9, 11]}, scoring: str = 'r2', **kwargs):\n", - " \"\"\"\n", - " K-NN:\n", - " \\n\n", - " - Define the parameter grid to search over: param_grid = {'n_neighbors': [3, 5, 7, 9, 11]}\n", - " \\n\n", - " - Define a scoring metric: scoring = 'neg_mean_squared_error' OR 'neg_mean_absolute_error' OR 'explained_variance' OR 'r2'\n", - " \"\"\"\n", - " # Create a KNN regressor object\n", - " knn = KNeighborsRegressor()\n", - "\n", - " # Create a GridSearchCV object and fit it to the data\n", - " grid_search = GridSearchCV(knn, param_grid, scoring='r2', cv=self.n_cv, **kwargs)\n", - " grid_search.fit(self.X_train, self.y_train)\n", - "\n", - " # Print the best parameters and score\n", - " print(\"Best parameters:\", grid_search.best_params_)\n", - " print(\"Best score:\", grid_search.best_score_)\n", - "\n", - " self.gridsearch_results = grid_search.cv_results_\n", - " return grid_search.best_estimator_\n", - "\n", - "# \n", - "# R-squared score (default): This measures the proportion of the variance in the target variable that is explained by the model. It takes values between 0 and 1, where 1 indicates a perfect fit and 0 indicates no relationship between the model and the target variable. The r2_score function from the sklearn.metrics module can be used as the scoring function for GridSearchCV.\n", - "\n", - "# Mean squared error (MSE): This measures the average squared difference between the predicted and actual values of the target variable. A smaller MSE indicates a better fit. The mean_squared_error function from the sklearn.metrics module can be used as the scoring function for GridSearchCV.\n", - "\n", - "# Mean absolute error (MAE): This measures the average absolute difference between the predicted and actual values of the target variable. A smaller MAE indicates a better fit. The mean_absolute_error function from the sklearn.metrics module can be used as the scoring function for GridSearchCV.\n", - "\n", - "# Explained variance score: This measures the proportion of the variance in the target variable that is explained by the model. It takes values between 0 and 1, where 1 indicates a perfect fit and 0 indicates no relationship between the model and the target variable. The explained_variance_score function from the sklearn.metrics module can be used as the scoring function for GridSearchCV.\n", - "# " - ], - "metadata": { - "id": "_Y4vRt48o_9W" - }, - "id": "_Y4vRt48o_9W", - "execution_count": 400, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "### Stacked Learner" - ], - "metadata": { - "id": "nKe7aI9wvRGw" - }, - "id": "nKe7aI9wvRGw" - }, - { - "cell_type": "code", - "source": [ - "class StackedLearner(BaseLearners):\n", - " \"\"\"\n", - " Stacking the Base Learning Algorithms K-NN and Lass with Lasso as the Meta algorithm\n", - " \"\"\"\n", - " def __init__(self, dataframe: pd.DataFrame, selected_features: list, \n", - " target_variable: str = TARGET, test_size: float = 0.25, \n", - " learners: list = None, n_cv: int = 5):\n", - " super().__init__(dataframe, selected_features, target_variable, test_size, n_cv)\n", - " \n", - " self.learners = learners if learners is not None else []\n", - "\n", - " def learn(self, param_grid: dict = {'final_estimator__fit_intercept': [True, False]}, scoring: str = 'r2'):\n", - " # Define the base estimators to use in the stacking regressor\n", - " if not self.learners:\n", - " knn_model = self.knn(param_grid = {'n_neighbors': [1, 2, 3, 4, 5, 7, 9, 11]})\n", - " lasso_model = self.lasso(param_grid = {'alpha': [i for i in range(1, 100)]})\n", - "\n", - " self.learners = [('knn', knn_model), ('lasso', lasso_model)]\n", - "\n", - " # Create a stacking regressor object with a linear regression meta-estimator\n", - " meta_estimator = self.lasso(param_grid = {'alpha': [i for i in range(1, 100)]})\n", - " stacking_regressor = StackingRegressor(estimators=self.learners, final_estimator=meta_estimator)\n", - "\n", - " # param_grid = {'final_estimator__fit_intercept': [True, False],\n", - " # 'knn__n_neighbors': [3, 5, 7, 9, 11],\n", - " # 'lasso__alpha': [0.1, 1, 10]}\n", - "\n", - " # Create a GridSearchCV object and fit it to the data\n", - " grid_search = GridSearchCV(stacking_regressor, param_grid, scoring=scoring, cv=self.n_cv)\n", - " grid_search.fit(self.X_train, self.y_train)\n", - "\n", - " # Print the best parameters and score\n", - " print(\"Best parameters:\", grid_search.best_params_)\n", - " print(\"Best score:\", grid_search.best_score_)\n", - "\n", - " self.gridsearch_results = grid_search.cv_results_\n", - " return grid_search.best_estimator_\n", - "# " - ], - "metadata": { - "id": "qupJsAOupCA8" - }, - "id": "qupJsAOupCA8", - "execution_count": 401, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## Learning Algorithms (Without clustering)" - ], - "metadata": { - "id": "BIkze_snIUPV" - }, - "id": "BIkze_snIUPV" - }, - { - "cell_type": "code", - "source": [ - "base_learners = BaseLearners(data, selected_features = data.columns[:-1].to_list())\n", - "# \n", - "data_split = base_learners.show_data_split()" - ], - "metadata": { - "id": "G3j7xZnuN11Q" - }, - "id": "G3j7xZnuN11Q", - "execution_count": 402, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "data_split['train']\n", - "# " - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 488 - }, - "id": "Fz1IDA8EN3zP", - "outputId": "924f544d-0477-4c13-fdc3-b1fbcd63d43f" - }, - "id": "Fz1IDA8EN3zP", - "execution_count": 403, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " TeamExp ManagerExp YearEnd Length Transactions Entities \\\n", - "30 -1.248950 -0.018888 0.131773 0.007412 -0.619216 -0.525408 \n", - "67 -0.498803 -0.001902 1.152470 0.953984 -0.490354 1.904772 \n", - "62 1.050009 0.819632 -0.897301 1.832558 3.069220 0.867987 \n", - "47 -1.248950 -1.705033 0.131773 -0.770875 -0.579577 -1.447553 \n", - "42 1.044258 0.824184 0.131773 0.688413 0.659131 0.317047 \n", - ".. ... ... ... ... ... ... \n", - "71 -1.248950 -1.705033 1.158783 -0.479017 -0.995783 -0.787251 \n", - "14 -0.495158 -0.017136 0.109866 0.684620 1.053886 0.200062 \n", - "92 0.279855 -0.018888 -0.895237 -1.062733 -0.871912 -1.322324 \n", - "51 -0.484548 -1.705033 -1.922247 0.007412 -0.574622 -0.605099 \n", - "102 -0.484548 0.017310 1.158783 -0.673589 -0.188145 -0.627868 \n", - "\n", - " PointsAdjust Envergure PointsNonAjust Language Effort \n", - "30 -0.696982 0.162186 -0.675359 0.840533 9135.000000 \n", - "67 0.325048 -1.197900 -0.008901 -0.816984 14969.962096 \n", - "62 2.863781 0.170628 2.742024 -0.150081 23898.320763 \n", - "47 -0.994572 -0.466877 -1.012184 2.506467 710.000000 \n", - "42 0.656443 0.701383 0.767045 -0.825402 9520.000000 \n", - ".. ... ... ... ... ... \n", - "71 -1.100563 -1.275671 -1.162765 -0.825402 2583.000000 \n", - "14 0.921849 0.725381 1.049938 0.839811 13866.040390 \n", - "92 -1.190248 -0.017546 -1.158802 -0.825402 3136.000000 \n", - "51 -0.688829 0.701383 -0.604031 -0.825402 9051.000000 \n", - "102 -0.379009 -0.377010 -0.445526 0.840533 6783.000000 \n", - "\n", - "[103 rows x 11 columns]" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TeamExpManagerExpYearEndLengthTransactionsEntitiesPointsAdjustEnvergurePointsNonAjustLanguageEffort
30-1.248950-0.0188880.1317730.007412-0.619216-0.525408-0.6969820.162186-0.6753590.8405339135.000000
67-0.498803-0.0019021.1524700.953984-0.4903541.9047720.325048-1.197900-0.008901-0.81698414969.962096
621.0500090.819632-0.8973011.8325583.0692200.8679872.8637810.1706282.742024-0.15008123898.320763
47-1.248950-1.7050330.131773-0.770875-0.579577-1.447553-0.994572-0.466877-1.0121842.506467710.000000
421.0442580.8241840.1317730.6884130.6591310.3170470.6564430.7013830.767045-0.8254029520.000000
....................................
71-1.248950-1.7050331.158783-0.479017-0.995783-0.787251-1.100563-1.275671-1.162765-0.8254022583.000000
14-0.495158-0.0171360.1098660.6846201.0538860.2000620.9218490.7253811.0499380.83981113866.040390
920.279855-0.018888-0.895237-1.062733-0.871912-1.322324-1.190248-0.017546-1.158802-0.8254023136.000000
51-0.484548-1.705033-1.9222470.007412-0.574622-0.605099-0.6888290.701383-0.604031-0.8254029051.000000
102-0.4845480.0173101.158783-0.673589-0.188145-0.627868-0.379009-0.377010-0.4455260.8405336783.000000
\n", - "

103 rows × 11 columns

\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 403 - } - ] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "data_split['test']\n", - "# " - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "id": "sTF3uj6kN5gb", - "outputId": "4db467de-c89c-47d5-f2af-6096bf47c063" - }, - "id": "sTF3uj6kN5gb", - "execution_count": 404, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " TeamExp ManagerExp YearEnd Length Transactions Entities \\\n", - "26 -0.472431 -0.022722 0.143340 0.679351 1.025065 0.195942 \n", - "13 -1.248950 -1.705033 1.158783 -0.770875 0.936601 -1.333708 \n", - "24 1.044258 -1.705033 1.158783 0.299269 0.208241 -0.992173 \n", - "21 -0.475002 0.843365 1.150256 -0.181917 0.321613 0.212459 \n", - "15 -0.496335 -0.033229 1.133001 0.996950 -0.449018 1.883568 \n", - "29 -0.484548 -0.018888 -1.922247 -0.381732 -0.634080 -1.003557 \n", - "19 1.048734 0.828269 -0.861547 1.859603 3.151492 0.851736 \n", - "12 1.044258 -1.705033 -0.895237 -0.284446 -0.430932 1.273346 \n", - "8 -1.248950 -0.018888 0.131773 -0.673589 -1.089925 -1.527245 \n", - "16 -0.460527 -0.032977 -0.899507 -0.029503 -0.192936 -0.511525 \n", - "9 -0.484548 -0.018888 -0.895237 -0.965447 -0.723267 -1.060480 \n", - "33 1.044258 3.353402 0.131773 -0.381732 -0.956144 -1.037711 \n", - "0 1.044258 0.824184 -0.895237 -0.089874 -0.723267 0.055203 \n", - "4 0.279855 -1.705033 -0.895237 -0.284446 -0.564713 1.808418 \n", - "17 -0.480910 -0.007811 0.131453 0.730399 1.080777 0.177256 \n", - "27 -0.480497 -0.012580 0.160158 0.685122 1.023529 0.206476 \n", - "5 -0.484548 -1.705033 0.131773 0.104698 -0.396248 -0.445716 \n", - "11 -0.527974 -0.016741 1.143025 1.004564 -0.431188 1.920675 \n", - "1 -2.013353 -2.548105 0.131773 -1.257304 -0.604351 -0.810020 \n", - "2 1.034028 -0.015622 -0.917742 -0.581509 -0.634344 0.163236 \n", - "32 0.279855 0.824184 1.158783 -0.284446 -1.253434 2.514258 \n", - "3 -0.454658 -0.027977 -0.880717 0.017430 -0.237801 -0.524837 \n", - "30 1.602790 0.823549 0.126909 2.172413 0.107915 0.724340 \n", - "23 1.037029 0.823374 0.143329 -0.492687 0.287556 1.192951 \n", - "31 1.051303 -0.009232 -0.887994 -0.571275 -0.635836 0.175732 \n", - "10 1.044258 -1.705033 -0.895237 -0.284446 -0.871912 0.738274 \n", - "22 -2.013353 -0.861961 -1.922247 -1.062733 -0.242649 -1.049095 \n", - "18 -1.248950 0.824184 0.131773 -0.868161 -0.857048 0.396738 \n", - "25 0.279855 -0.018888 2.185793 -0.089874 0.198331 -0.229410 \n", - "6 1.044258 0.824184 -0.895237 1.855843 3.091952 0.863503 \n", - "20 1.044258 0.824184 1.158783 -0.770875 -0.435887 -0.992173 \n", - "34 -0.484548 -1.705033 -0.895237 -0.770875 -0.708403 -1.402015 \n", - "7 -2.013353 -2.548105 0.131773 -1.257304 -0.321926 -0.468485 \n", - "14 -0.498774 -0.023706 -0.908924 -0.006037 -0.179280 -0.477384 \n", - "28 1.063195 -0.025195 -0.880943 -0.567687 -0.648400 0.150583 \n", - "\n", - " PointsAdjust Envergure PointsNonAjust Language Effort \n", - "26 0.956430 0.689813 1.048224 0.850665 13746.008270 \n", - "13 0.293627 -0.377010 0.160760 -0.825402 4620.000000 \n", - "24 -0.183333 0.611517 -0.104738 -0.825402 10577.000000 \n", - "21 0.304483 0.234532 0.335723 0.829760 11393.193024 \n", - "15 0.296364 -1.159078 -0.019603 -0.820223 14969.503918 \n", - "29 -0.880428 -1.725002 -1.024072 0.840533 2275.000000 \n", - "19 2.815097 0.173133 2.745228 -0.158133 24059.461063 \n", - "12 0.102028 0.431784 0.148872 -0.825402 3948.000000 \n", - "8 -1.442996 -0.466877 -1.412412 0.840533 1267.000000 \n", - "16 -0.316550 0.226506 -0.331508 -0.825270 14366.050859 \n", - "9 -0.974189 -1.275671 -1.059736 -0.825402 2989.000000 \n", - "33 -1.157635 -1.635136 -1.230130 -0.825402 1603.000000 \n", - "0 -0.574684 -0.466877 -0.635733 -0.825402 7252.000000 \n", - "4 0.183559 0.611517 0.267751 -0.825402 4277.000000 \n", - "17 0.883042 0.717566 1.008301 0.841939 13967.497235 \n", - "27 0.929863 0.711749 1.068558 0.832289 13856.608009 \n", - "5 -0.485000 0.252052 -0.457414 -0.825402 6699.000000 \n", - "11 0.315516 -1.205231 -0.006517 -0.816774 14991.009450 \n", - "1 -0.786666 -0.736475 -0.853678 -0.825402 2149.000000 \n", - "2 -0.480001 1.666754 -0.261609 -0.847846 12710.730114 \n", - "32 -0.130337 -1.006073 -0.330609 0.840533 4494.000000 \n", - "3 -0.347176 0.253569 -0.311438 -0.831022 14446.029890 \n", - "30 0.336379 1.590695 0.664470 -0.803209 20010.328053 \n", - "23 0.654761 0.164813 0.645797 0.856870 15089.456669 \n", - "31 -0.505234 1.686868 -0.229040 -0.841204 12781.375116 \n", - "10 -0.452387 0.072320 -0.449488 -0.825402 3164.000000 \n", - "22 -0.574684 -2.354065 -0.873492 2.506467 595.000000 \n", - "18 -0.562455 0.072320 -0.556480 -0.825402 3983.000000 \n", - "25 0.081645 1.779776 0.394556 0.840533 8050.000000 \n", - "6 2.853719 0.162186 2.744406 -0.159669 23940.000000 \n", - "20 -0.713288 0.791249 -0.619882 2.506467 2429.000000 \n", - "34 -1.084257 -0.646609 -1.103325 0.840533 2569.000000 \n", - "7 -0.432004 0.072320 -0.429675 -0.825402 5635.000000 \n", - "14 -0.319927 0.241080 -0.326440 -0.828606 14544.038884 \n", - "28 -0.474082 1.702341 -0.248170 -0.821717 12788.787051 " - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TeamExpManagerExpYearEndLengthTransactionsEntitiesPointsAdjustEnvergurePointsNonAjustLanguageEffort
26-0.472431-0.0227220.1433400.6793511.0250650.1959420.9564300.6898131.0482240.85066513746.008270
13-1.248950-1.7050331.158783-0.7708750.936601-1.3337080.293627-0.3770100.160760-0.8254024620.000000
241.044258-1.7050331.1587830.2992690.208241-0.992173-0.1833330.611517-0.104738-0.82540210577.000000
21-0.4750020.8433651.150256-0.1819170.3216130.2124590.3044830.2345320.3357230.82976011393.193024
15-0.496335-0.0332291.1330010.996950-0.4490181.8835680.296364-1.159078-0.019603-0.82022314969.503918
29-0.484548-0.018888-1.922247-0.381732-0.634080-1.003557-0.880428-1.725002-1.0240720.8405332275.000000
191.0487340.828269-0.8615471.8596033.1514920.8517362.8150970.1731332.745228-0.15813324059.461063
121.044258-1.705033-0.895237-0.284446-0.4309321.2733460.1020280.4317840.148872-0.8254023948.000000
8-1.248950-0.0188880.131773-0.673589-1.089925-1.527245-1.442996-0.466877-1.4124120.8405331267.000000
16-0.460527-0.032977-0.899507-0.029503-0.192936-0.511525-0.3165500.226506-0.331508-0.82527014366.050859
9-0.484548-0.018888-0.895237-0.965447-0.723267-1.060480-0.974189-1.275671-1.059736-0.8254022989.000000
331.0442583.3534020.131773-0.381732-0.956144-1.037711-1.157635-1.635136-1.230130-0.8254021603.000000
01.0442580.824184-0.895237-0.089874-0.7232670.055203-0.574684-0.466877-0.635733-0.8254027252.000000
40.279855-1.705033-0.895237-0.284446-0.5647131.8084180.1835590.6115170.267751-0.8254024277.000000
17-0.480910-0.0078110.1314530.7303991.0807770.1772560.8830420.7175661.0083010.84193913967.497235
27-0.480497-0.0125800.1601580.6851221.0235290.2064760.9298630.7117491.0685580.83228913856.608009
5-0.484548-1.7050330.1317730.104698-0.396248-0.445716-0.4850000.252052-0.457414-0.8254026699.000000
11-0.527974-0.0167411.1430251.004564-0.4311881.9206750.315516-1.205231-0.006517-0.81677414991.009450
1-2.013353-2.5481050.131773-1.257304-0.604351-0.810020-0.786666-0.736475-0.853678-0.8254022149.000000
21.034028-0.015622-0.917742-0.581509-0.6343440.163236-0.4800011.666754-0.261609-0.84784612710.730114
320.2798550.8241841.158783-0.284446-1.2534342.514258-0.130337-1.006073-0.3306090.8405334494.000000
3-0.454658-0.027977-0.8807170.017430-0.237801-0.524837-0.3471760.253569-0.311438-0.83102214446.029890
301.6027900.8235490.1269092.1724130.1079150.7243400.3363791.5906950.664470-0.80320920010.328053
231.0370290.8233740.143329-0.4926870.2875561.1929510.6547610.1648130.6457970.85687015089.456669
311.051303-0.009232-0.887994-0.571275-0.6358360.175732-0.5052341.686868-0.229040-0.84120412781.375116
101.044258-1.705033-0.895237-0.284446-0.8719120.738274-0.4523870.072320-0.449488-0.8254023164.000000
22-2.013353-0.861961-1.922247-1.062733-0.242649-1.049095-0.574684-2.354065-0.8734922.506467595.000000
18-1.2489500.8241840.131773-0.868161-0.8570480.396738-0.5624550.072320-0.556480-0.8254023983.000000
250.279855-0.0188882.185793-0.0898740.198331-0.2294100.0816451.7797760.3945560.8405338050.000000
61.0442580.824184-0.8952371.8558433.0919520.8635032.8537190.1621862.744406-0.15966923940.000000
201.0442580.8241841.158783-0.770875-0.435887-0.992173-0.7132880.791249-0.6198822.5064672429.000000
34-0.484548-1.705033-0.895237-0.770875-0.708403-1.402015-1.084257-0.646609-1.1033250.8405332569.000000
7-2.013353-2.5481050.131773-1.257304-0.321926-0.468485-0.4320040.072320-0.429675-0.8254025635.000000
14-0.498774-0.023706-0.908924-0.006037-0.179280-0.477384-0.3199270.241080-0.326440-0.82860614544.038884
281.063195-0.025195-0.880943-0.567687-0.6484000.150583-0.4740821.702341-0.248170-0.82171712788.787051
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 404 - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Lasso" - ], - "metadata": { - "id": "jruCcmIohFjX" - }, - "id": "jruCcmIohFjX" - }, - { - "cell_type": "code", - "source": [ - "# \n", - "param_grid = {'alpha': [i for i in range(1, 100)]}\n", - "lasso_model = base_learners.lasso(param_grid=param_grid, scoring='r2')\n", - "# \n", - "evaluations = base_learners.evaluate_model(lasso_model, with_table = True, return_train_score = True)\n", - "# " - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "yRFdnqIUMXe8", - "outputId": "d82c548c-4716-441c-81e2-f627a343f563" - }, - "id": "yRFdnqIUMXe8", - "execution_count": 405, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.474e+07, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.442e+07, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.235e+07, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.551e+07, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.199e+07, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.929e+07, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.394e+07, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.762e+07, tolerance: 3.927e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.453e+07, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.799e+07, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.208e+06, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.481e+07, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.150e+07, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.318e+07, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.060e+06, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.025e+07, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.484e+07, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.518e+06, tolerance: 3.927e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.035e+07, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.671e+07, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.842e+06, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.210e+06, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.600e+07, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.541e+06, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.308e+06, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.132e+06, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.852e+06, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.683e+06, tolerance: 3.927e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.575e+06, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.597e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.559e+05, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.471e+06, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.672e+06, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.193e+06, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.715e+06, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.611e+06, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.494e+06, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.604e+06, tolerance: 3.927e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.591e+06, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.687e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.495e+06, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.361e+06, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.695e+06, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.616e+06, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.440e+06, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.919e+06, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.025e+06, tolerance: 3.927e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.266e+06, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.061e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.495e+06, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.408e+05, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.253e+06, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.489e+06, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.633e+06, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.099e+06, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.618e+05, tolerance: 3.927e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.182e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.806e+06, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.491e+05, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.565e+06, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.640e+06, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.893e+06, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.421e+05, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.289e+06, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.313e+06, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.572e+05, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.864e+06, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.128e+06, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.320e+06, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.845e+05, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.816e+06, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.019e+06, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.301e+06, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.553e+05, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.852e+05, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.363e+06, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.603e+05, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.522e+05, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.652e+05, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.702e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.405e+05, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.267e+05, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.430e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.606e+05, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.170e+05, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.218e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.267e+05, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.048e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.522e+05, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.082e+05, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.359e+05, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.885e+05, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.908e+05, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.664e+05, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.812e+05, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.322e+05, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.904e+05, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.046e+05, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.332e+05, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.372e+05, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.832e+05, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.028e+05, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.497e+05, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.811e+05, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.113e+05, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.255e+05, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.374e+05, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.567e+05, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.562e+05, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.852e+05, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.058e+05, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.366e+05, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.924e+05, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.503e+05, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n" - ] - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Best hyperparameters: {'alpha': 99}\n", - "Best cross-validated score: 0.8204992062042409\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "evaluations['train_scores']" - ], - "metadata": { - "id": "iglxDii-7rXm", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "082aa232-64ae-4458-87f1-e466194613ce" - }, - "id": "iglxDii-7rXm", - "execution_count": 406, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'MSE': 5698035.859781624,\n", - " 'RMSE': 2387.05589791727,\n", - " 'MAE': 1668.1549578891481,\n", - " 'R^2': 0.8780277962522609,\n", - " 'unexplained_variance': 0.1219722037477391,\n", - " 'lasso_coefs': Features Coefficient Estimate\n", - " 0 TeamExp -0.000000\n", - " 1 ManagerExp 527.892745\n", - " 2 YearEnd -15.270429\n", - " 3 Length 1382.875020\n", - " 4 Transactions 0.000000\n", - " 5 Entities 1741.282715\n", - " 6 PointsAdjust 0.000000\n", - " 7 Envergure 1038.763820\n", - " 8 PointsNonAjust 2702.831660\n", - " 9 Language -1237.435563}" - ] - }, - "metadata": {}, - "execution_count": 406 - } - ] - }, - { - "cell_type": "code", - "source": [ - "evaluations['train_scores']['lasso_coefs']\n", - "# " - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 363 - }, - "id": "d3WAVRu86ki3", - "outputId": "2e2e401b-5e43-4276-a1f2-119a37a9797f" - }, - "id": "d3WAVRu86ki3", - "execution_count": 407, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " Features Coefficient Estimate\n", - "0 TeamExp -0.000000\n", - "1 ManagerExp 527.892745\n", - "2 YearEnd -15.270429\n", - "3 Length 1382.875020\n", - "4 Transactions 0.000000\n", - "5 Entities 1741.282715\n", - "6 PointsAdjust 0.000000\n", - "7 Envergure 1038.763820\n", - "8 PointsNonAjust 2702.831660\n", - "9 Language -1237.435563" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
FeaturesCoefficient Estimate
0TeamExp-0.000000
1ManagerExp527.892745
2YearEnd-15.270429
3Length1382.875020
4Transactions0.000000
5Entities1741.282715
6PointsAdjust0.000000
7Envergure1038.763820
8PointsNonAjust2702.831660
9Language-1237.435563
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 407 - } - ] - }, - { - "cell_type": "code", - "source": [ - "plot_graph(df = evaluations['train_scores']['lasso_coefs'], \n", - " graph_type='bar', \n", - " label1='Features',\n", - " label2='Coefficient Estimate', \n", - " title='Lasso Features vs. Coefficient Estimate Scores')\n", - "# " - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 609 - }, - "id": "Y1bolcwhDGAa", - "outputId": "5f5c9b3f-bcab-43ca-ed22-b872e7319704" - }, - "id": "Y1bolcwhDGAa", - "execution_count": 408, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "WARNING:matplotlib.legend:No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n" - ] - }, - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "code", - "source": [ - "evaluations['test_scores']" - ], - "metadata": { - "id": "FOqa4drA7ucL", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "eca79a96-1ecd-4324-e35c-52338b84e924" - }, - "id": "FOqa4drA7ucL", - "execution_count": 409, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'MSE': 13125806.107664604,\n", - " 'RMSE': 3622.955438266472,\n", - " 'MAE': 2489.146840292057,\n", - " 'R^2': 0.6835950346431889,\n", - " 'unexplained_variance': 0.31640496535681106}" - ] - }, - "metadata": {}, - "execution_count": 409 - } - ] - }, - { - "cell_type": "code", - "source": [ - "evaluations['values_table']" - ], - "metadata": { - "id": "GDGv8kvA2Db8", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "outputId": "73606dfc-f2e9-452e-b3bc-03b3905ba139" - }, - "id": "GDGv8kvA2Db8", - "execution_count": 410, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " Actual Values Predicted Values\n", - "0 7252.000000 9536.105938\n", - "1 2149.000000 3750.088214\n", - "2 12710.730114 11856.674455\n", - "3 14446.029890 9856.250919\n", - "4 4277.000000 14546.885434\n", - "5 6699.000000 8810.858807\n", - "6 23940.000000 22599.860513\n", - "7 5635.000000 6330.954362\n", - "8 1267.000000 1351.958605\n", - "9 2989.000000 3951.371565\n", - "10 3164.000000 10184.786808\n", - "11 14991.009450 14745.859518\n", - "12 3948.000000 13107.163124\n", - "13 4620.000000 7055.493009\n", - "14 14544.038884 9852.603615\n", - "15 14969.503918 14679.006146\n", - "16 14366.050859 9722.699368\n", - "17 13967.497235 14038.764714\n", - "18 3983.000000 9813.164634\n", - "19 24059.461063 22597.905868\n", - "20 2429.000000 3965.987672\n", - "21 11393.193024 10967.662134\n", - "22 595.000000 -1332.489720\n", - "23 15089.456669 12982.150180\n", - "24 10577.000000 9439.330204\n", - "25 8050.000000 11605.364730\n", - "26 13746.008270 14060.934571\n", - "27 13856.608009 14192.836471\n", - "28 12788.787051 11889.094669\n", - "29 2275.000000 2441.536235\n", - "30 20010.328053 19437.877193\n", - "31 12781.375116 11996.207352\n", - "32 4494.000000 11720.695765\n", - "33 1603.000000 5728.803958\n", - "34 2569.000000 1209.773368" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Actual ValuesPredicted Values
07252.0000009536.105938
12149.0000003750.088214
212710.73011411856.674455
314446.0298909856.250919
44277.00000014546.885434
56699.0000008810.858807
623940.00000022599.860513
75635.0000006330.954362
81267.0000001351.958605
92989.0000003951.371565
103164.00000010184.786808
1114991.00945014745.859518
123948.00000013107.163124
134620.0000007055.493009
1414544.0388849852.603615
1514969.50391814679.006146
1614366.0508599722.699368
1713967.49723514038.764714
183983.0000009813.164634
1924059.46106322597.905868
202429.0000003965.987672
2111393.19302410967.662134
22595.000000-1332.489720
2315089.45666912982.150180
2410577.0000009439.330204
258050.00000011605.364730
2613746.00827014060.934571
2713856.60800914192.836471
2812788.78705111889.094669
292275.0000002441.536235
3020010.32805319437.877193
3112781.37511611996.207352
324494.00000011720.695765
331603.0000005728.803958
342569.0000001209.773368
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 410 - } - ] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "plot_graph(df = evaluations['values_table'], \n", - " graph_type='scatter_line', \n", - " label1='Actual Values',\n", - " label2='Predicted Values', \n", - " title='Actual Values vs. Predicted Values')\n", - "# \n", - "# " - ], - "metadata": { - "id": "lSbAaFev87rT", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 480 - }, - "outputId": "1ace5025-56bf-4a81-a46f-1fadc8317055" - }, - "id": "lSbAaFev87rT", - "execution_count": 411, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "base_learners.show_gridsearch_results()\n", - "# " - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 661 - }, - "id": "zKNRGpZvRdCL", - "outputId": "7b3aa9dd-4035-40a7-d85b-b9de262fadcd" - }, - "id": "zKNRGpZvRdCL", - "execution_count": 412, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " mean_fit_time std_fit_time mean_score_time std_score_time param_alpha \\\n", - "0 0.002895 0.000635 0.000515 0.000110 1 \n", - "1 0.002798 0.001026 0.000496 0.000128 2 \n", - "2 0.002119 0.000248 0.000422 0.000059 3 \n", - "3 0.002105 0.000530 0.000509 0.000237 4 \n", - "4 0.001989 0.000225 0.000403 0.000045 5 \n", - ".. ... ... ... ... ... \n", - "94 0.000533 0.000031 0.000255 0.000004 95 \n", - "95 0.000512 0.000035 0.000280 0.000015 96 \n", - "96 0.000493 0.000017 0.000279 0.000007 97 \n", - "97 0.000502 0.000026 0.000284 0.000028 98 \n", - "98 0.000522 0.000031 0.000267 0.000010 99 \n", - "\n", - " params split0_test_score split1_test_score split2_test_score \\\n", - "0 {'alpha': 1} 0.858686 0.776648 0.818701 \n", - "1 {'alpha': 2} 0.859030 0.779041 0.819061 \n", - "2 {'alpha': 3} 0.859319 0.780758 0.819297 \n", - "3 {'alpha': 4} 0.859560 0.782363 0.819405 \n", - "4 {'alpha': 5} 0.860087 0.783893 0.819399 \n", - ".. ... ... ... ... \n", - "94 {'alpha': 95} 0.870460 0.806244 0.796849 \n", - "95 {'alpha': 96} 0.870600 0.806245 0.796821 \n", - "96 {'alpha': 97} 0.870748 0.806246 0.796793 \n", - "97 {'alpha': 98} 0.870896 0.806246 0.796765 \n", - "98 {'alpha': 99} 0.871041 0.806245 0.796736 \n", - "\n", - " split3_test_score split4_test_score split5_test_score \\\n", - "0 0.851295 0.778365 0.967825 \n", - "1 0.851820 0.782635 0.968305 \n", - "2 0.852226 0.785728 0.968707 \n", - "3 0.852577 0.788534 0.969059 \n", - "4 0.852921 0.791199 0.969401 \n", - ".. ... ... ... \n", - "94 0.852715 0.875406 0.976535 \n", - "95 0.852733 0.876073 0.976539 \n", - "96 0.852750 0.876736 0.976542 \n", - "97 0.852768 0.877396 0.976546 \n", - "98 0.852785 0.878054 0.976549 \n", - "\n", - " split6_test_score split7_test_score split8_test_score \\\n", - "0 0.849611 0.944427 0.779176 \n", - "1 0.845242 0.944194 0.778923 \n", - "2 0.841020 0.943927 0.778686 \n", - "3 0.836731 0.943633 0.778431 \n", - "4 0.832330 0.943316 0.778173 \n", - ".. ... ... ... \n", - "94 0.797295 0.929033 0.784419 \n", - "95 0.797219 0.928949 0.784430 \n", - "96 0.797142 0.928865 0.784448 \n", - "97 0.797066 0.928781 0.784466 \n", - "98 0.796989 0.928697 0.784484 \n", - "\n", - " split9_test_score mean_test_score std_test_score rank_test_score \n", - "0 0.565042 0.818978 0.105338 27 \n", - "1 0.563556 0.819181 0.105409 20 \n", - "2 0.562018 0.819169 0.105578 22 \n", - "3 0.561237 0.819153 0.105592 23 \n", - "4 0.559678 0.819040 0.105836 25 \n", - ".. ... ... ... ... \n", - "94 0.513499 0.820246 0.118121 5 \n", - "95 0.513483 0.820309 0.118158 4 \n", - "96 0.513427 0.820370 0.118205 3 \n", - "97 0.513418 0.820435 0.118240 2 \n", - "98 0.513413 0.820499 0.118274 1 \n", - "\n", - "[99 rows x 19 columns]" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
mean_fit_timestd_fit_timemean_score_timestd_score_timeparam_alphaparamssplit0_test_scoresplit1_test_scoresplit2_test_scoresplit3_test_scoresplit4_test_scoresplit5_test_scoresplit6_test_scoresplit7_test_scoresplit8_test_scoresplit9_test_scoremean_test_scorestd_test_scorerank_test_score
00.0028950.0006350.0005150.0001101{'alpha': 1}0.8586860.7766480.8187010.8512950.7783650.9678250.8496110.9444270.7791760.5650420.8189780.10533827
10.0027980.0010260.0004960.0001282{'alpha': 2}0.8590300.7790410.8190610.8518200.7826350.9683050.8452420.9441940.7789230.5635560.8191810.10540920
20.0021190.0002480.0004220.0000593{'alpha': 3}0.8593190.7807580.8192970.8522260.7857280.9687070.8410200.9439270.7786860.5620180.8191690.10557822
30.0021050.0005300.0005090.0002374{'alpha': 4}0.8595600.7823630.8194050.8525770.7885340.9690590.8367310.9436330.7784310.5612370.8191530.10559223
40.0019890.0002250.0004030.0000455{'alpha': 5}0.8600870.7838930.8193990.8529210.7911990.9694010.8323300.9433160.7781730.5596780.8190400.10583625
............................................................
940.0005330.0000310.0002550.00000495{'alpha': 95}0.8704600.8062440.7968490.8527150.8754060.9765350.7972950.9290330.7844190.5134990.8202460.1181215
950.0005120.0000350.0002800.00001596{'alpha': 96}0.8706000.8062450.7968210.8527330.8760730.9765390.7972190.9289490.7844300.5134830.8203090.1181584
960.0004930.0000170.0002790.00000797{'alpha': 97}0.8707480.8062460.7967930.8527500.8767360.9765420.7971420.9288650.7844480.5134270.8203700.1182053
970.0005020.0000260.0002840.00002898{'alpha': 98}0.8708960.8062460.7967650.8527680.8773960.9765460.7970660.9287810.7844660.5134180.8204350.1182402
980.0005220.0000310.0002670.00001099{'alpha': 99}0.8710410.8062450.7967360.8527850.8780540.9765490.7969890.9286970.7844840.5134130.8204990.1182741
\n", - "

99 rows × 19 columns

\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 412 - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "### K-NN" - ], - "metadata": { - "id": "ijrFIFyhhJ7a" - }, - "id": "ijrFIFyhhJ7a" - }, - { - "cell_type": "code", - "source": [ - "# \n", - "param_grid = {'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 9]}\n", - "knn_model = base_learners.knn(param_grid=param_grid, scoring='r2')\n", - "# \n", - "evaluations = base_learners.evaluate_model(knn_model, with_table = True, return_train_score = True)" - ], - "metadata": { - "id": "R1NtNMuRhMM4", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "f4d8a640-85e8-4dd7-92af-c774051960ff" - }, - "id": "R1NtNMuRhMM4", - "execution_count": 413, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Best parameters: {'n_neighbors': 2}\n", - "Best score: 0.7713157911905207\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "evaluations['train_scores']" - ], - "metadata": { - "id": "_F4j3P5w8bFx", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "3fea6c33-123a-4383-ba72-9c320837c76c" - }, - "id": "_F4j3P5w8bFx", - "execution_count": 414, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'MSE': 2328708.043023421,\n", - " 'RMSE': 1526.0104989885951,\n", - " 'MAE': 744.2934590117176,\n", - " 'R^2': 0.950151655959649,\n", - " 'unexplained_variance': 0.04984834404035099,\n", - " 'lasso_coefs': Empty DataFrame\n", - " Columns: []\n", - " Index: []}" - ] - }, - "metadata": {}, - "execution_count": 414 - } - ] - }, - { - "cell_type": "code", - "source": [ - "evaluations['test_scores']" - ], - "metadata": { - "id": "lT_xPyjl8ajK", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "fdb569fe-8cbf-41c1-cd7d-7795264e1231" - }, - "id": "lT_xPyjl8ajK", - "execution_count": 415, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'MSE': 3867518.823696966,\n", - " 'RMSE': 1966.600829781419,\n", - " 'MAE': 1187.8768622000132,\n", - " 'R^2': 0.9067712756541412,\n", - " 'unexplained_variance': 0.09322872434585883}" - ] - }, - "metadata": {}, - "execution_count": 415 - } - ] - }, - { - "cell_type": "code", - "source": [ - "evaluations['values_table']" - ], - "metadata": { - "id": "bQREzb6T8g-q", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "outputId": "e8ab46a8-fbfc-470e-bbda-55b03490589e" - }, - "id": "bQREzb6T8g-q", - "execution_count": 416, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " Actual Values Predicted Values\n", - "0 7252.000000 5078.500000\n", - "1 2149.000000 3325.000000\n", - "2 12710.730114 12770.371869\n", - "3 14446.029890 14461.338037\n", - "4 4277.000000 8127.117446\n", - "5 6699.000000 7129.500000\n", - "6 23940.000000 23920.777237\n", - "7 5635.000000 3325.000000\n", - "8 1267.000000 5841.500000\n", - "9 2989.000000 2733.500000\n", - "10 3164.000000 5960.500000\n", - "11 14991.009450 15044.177225\n", - "12 3948.000000 8115.643645\n", - "13 4620.000000 4963.000000\n", - "14 14544.038884 14458.480364\n", - "15 14969.503918 14925.090051\n", - "16 14366.050859 14360.941703\n", - "17 13967.497235 13839.231628\n", - "18 3983.000000 5477.500000\n", - "19 24059.461063 23904.058172\n", - "20 2429.000000 1043.000000\n", - "21 11393.193024 11371.962587\n", - "22 595.000000 2243.500000\n", - "23 15089.456669 14947.647491\n", - "24 10577.000000 5929.000000\n", - "25 8050.000000 11403.051662\n", - "26 13746.008270 13845.209397\n", - "27 13856.608009 13895.474176\n", - "28 12788.787051 12770.371869\n", - "29 2275.000000 1974.000000\n", - "30 20010.328053 19937.826868\n", - "31 12781.375116 12855.640433\n", - "32 4494.000000 9208.498351\n", - "33 1603.000000 980.000000\n", - "34 2569.000000 2271.500000" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Actual ValuesPredicted Values
07252.0000005078.500000
12149.0000003325.000000
212710.73011412770.371869
314446.02989014461.338037
44277.0000008127.117446
56699.0000007129.500000
623940.00000023920.777237
75635.0000003325.000000
81267.0000005841.500000
92989.0000002733.500000
103164.0000005960.500000
1114991.00945015044.177225
123948.0000008115.643645
134620.0000004963.000000
1414544.03888414458.480364
1514969.50391814925.090051
1614366.05085914360.941703
1713967.49723513839.231628
183983.0000005477.500000
1924059.46106323904.058172
202429.0000001043.000000
2111393.19302411371.962587
22595.0000002243.500000
2315089.45666914947.647491
2410577.0000005929.000000
258050.00000011403.051662
2613746.00827013845.209397
2713856.60800913895.474176
2812788.78705112770.371869
292275.0000001974.000000
3020010.32805319937.826868
3112781.37511612855.640433
324494.0000009208.498351
331603.000000980.000000
342569.0000002271.500000
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 416 - } - ] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "plot_graph(df = evaluations['values_table'], \n", - " graph_type='scatter_line', \n", - " label1='Actual Values',\n", - " label2='Predicted Values', \n", - " title='Actual Values vs. Predicted Values')\n", - "# " - ], - "metadata": { - "id": "ajjedT5zVraX", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 480 - }, - "outputId": "8ed8cbd0-7246-42d9-e511-b4b9ad238d29" - }, - "id": "ajjedT5zVraX", - "execution_count": 417, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAm8AAAHPCAYAAAAFwj37AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACRfElEQVR4nOzdeVxU1f/48deADIvsijsqqCDmAi4hirhvhLtpllq5pC2aln7UFtPPr49Ln1b1UymiWZlmbokibqWYomniUpIam5gbimwywAD39wdfbo64IAIzwPv5ePjQuffMmfedMyNvzjn3HI2iKApCCCGEEKJCMDN2AEIIIYQQovgkeRNCCCGEqEAkeRNCCCGEqEAkeRNCCCGEqEAkeRNCCCGEqEAkeRNCCCGEqEAkeRNCCCGEqEAkeRNCCCGEqEAkeRNCCCGEqEAkeROiCvD09GTp0qXl/ro9evRg9uzZ5f664v7ubpOjR4/i6enJ0aNHjRiVIWN9bsaMGcOYMWPK/XWFeFSSvAnxiNauXYunpydPP/10ieu4du0aS5cuJTo6uhQjK7nVq1fj6enJ4cOH71tmw4YNeHp6sm/fvnKMrHLZvHkznp6e6p9WrVrRt29f/v3vf3Pjxg1jh/dIDhw4YJRfCAB2796Np6cnP/zww33LHDp0CE9PT77++utyjEyI8iHJmxCPKDQ0lPr163P69GkSEhJKVMf169dZtmyZySRvgYGBmJmZERoaet8yoaGhODo6EhAQUI6RVU5Tp07lgw8+YO7cufj4+LBu3TpGjhyJTqcr91g6dOjA6dOn6dChwyM978CBAyxbtqyMonqwbt26YWdn98DP6/bt2zE3N+epp54qx8iEKB+SvAnxCBITE4mKimLOnDk4Ozs/8IdHRVK7dm18fX3Zs2cPOTk5Rc5fu3aN48eP069fPywsLIwQYeUSEBDAoEGDePrpp1m0aBHPP/88ly5demCvZmZmZpnEYmZmhqWlJWZmFefHgVarpW/fvhw7doxr164VOZ+dnc2ePXvo1KkTNWrUMEKEQpStivNtFcIEhIaG4uDgQNeuXenbt+99k7e0tDQWLFhAjx49aNmyJQEBAfzrX/8iOTmZo0ePMnz4cADmzJmjDqFt3rwZuP98n7vn4+Tk5PDZZ58xdOhQ2rVrh7e3N88++yxHjhwp0bUNHDiQ9PR09u/fX+Tcjh07yM/PZ8CAAQCEhITwzDPP4OvrS+vWrRk6dCjh4eEPfY2lS5fi6elZ5HjhcOKlS5cMjh84cIBnn30Wb29vfHx8eOmll7hw4YJBmaSkJObMmUNAQAAtW7bE39+fl19+uUhddwoJCcHT05O///67yLmPPvqIli1bkpqaCkB8fDxTpkyhc+fOtGrVioCAAKZPn056evpDr7e4OnbsCKDGPHv2bHx8fLh48SITJ07Ex8eHGTNmAJCfn89XX33FU089RatWrejUqRNz585V4y2kKAqff/45AQEBtGnThjFjxhR57+D+c95OnTrFxIkT6dChA97e3gwYMIA1a9ao8a1duxbAYBi4UGnHeC8DBw4kPz+fsLCwIuf2799Penq6+nndtGkTY8eOxc/Pj5YtWxIYGMh333330Ne43+fyQe/Z+PHjadeuHW3atGH06NH89ttvBmUyMjL4z3/+o/7f4Ofnx4svvsgff/xRrOsWAqCasQMQoiIJDQ2ld+/eaLVagoKCWLduHadPn6Z169Zqmdu3b/Pcc88RExPDsGHDaNGiBbdu3eKnn37i2rVrNGnShKlTp7JkyRJGjhxJu3btAGjbtu0jxZKRkcEPP/xAUFAQTz/9NLdv32bjxo1MmDCBH374AS8vr0eqr0+fPsybN4/t27fTp08fg3Pbt2+nfv36aqxff/01PXr0YMCAAej1enbs2MHrr7/O8uXL6dat2yO97v1s3bqV2bNn4+/vz4wZM9DpdKxbt45nn32WLVu20KBBAwCmTJnCX3/9xejRo6lfvz7JyckcOnSIK1euqGXu1r9/f/773/+yc+dOJkyYYHBu586ddO7cGQcHB3Jychg/fjw5OTmMHj2amjVrcu3aNfbv309aWhp2dnalcq0XL14EwNHRUT2Wm5urJgKzZs3CysoKgLlz57JlyxaGDh3KmDFjuHTpEmvXruXs2bOsW7dO7Rn97LPP+OKLL+jatStdu3bljz/+YNy4cej1+ofGc+jQISZNmkStWrUYO3YsNWvWJCYmhv379/P8888zcuRIrl+/zqFDh/jggw+KPL88YuzQoQN16tQhNDSUF1980eDc9u3bsba2plevXgCsW7eOZs2a0aNHD6pVq8bPP//M/PnzURSF55577qGvVRyRkZFMnDiRli1b8tprr6HRaNi8eTPPP/883333nfp/xHvvvceuXbsYPXo0TZo0ISUlhd9++42YmBieeOKJUolFVAGKEKJYzpw5o3h4eCiHDh1SFEVR8vPzlYCAAOX99983KPfZZ58pHh4eyu7du4vUkZ+fryiKopw+fVrx8PBQNm3aVKRM9+7dlVmzZhU5Pnr0aGX06NHq49zcXCU7O9ugTGpqqtKpUydlzpw5Bsc9PDyUJUuWPPQap06dqrRq1UpJT09Xj8XExCgeHh7KRx99pB7T6XQGz8vJyVGCgoKUsWPHPvBalixZonh4eBR53U2bNikeHh5KYmKioiiKkpGRobRv31555513DMolJSUp7dq1U4+npqYqHh4eysqVKx96bXcbOXKkMmTIEINjp06dUjw8PJQtW7YoiqIoZ8+eVTw8PJSdO3c+cv33Unidhw8fVm7evKlcuXJF2bFjh/Lkk08qrVu3Vq5evaooiqLMmjVL8fDwUD788EOD5x87dkzx8PBQtm3bZnA8IiLC4PjNmzeVJ554QnnppZfUz5yiKMrHH3+seHh4GLTJkSNHFA8PD+XIkSOKohR8rnr06KF0795dSU1NNXidO+uaP3/+PduyLGK8n8WLFyseHh5KbGyseiw9PV1p1aqV8sYbb6jH7v68KoqijBs3TunZs6fBsbu/Y3d/Lgvd/Z7l5+crffr0UcaNG2dwLTqdTunRo4fy4osvqsfatWunzJ8//6HXJsSDyLCpEMUUGhpKzZo18fX1BUCj0RAYGEhYWBh5eXlqud27d9O8eXN69+5dpA6NRlNq8Zibm6PVaoGCYaqUlBRyc3Np2bIlZ8+eLVGdAwcOJDs7m927d6vHtm/fDqAOQQFqLxBAamoq6enptGvXrsSve7fDhw+TlpbGU089RXJysvrHzMyMNm3aqMNVVlZWWFhY8OuvvxYZknuY/v3788cff6i9XlDQ66bVatUeG1tbWwB++eWXUr2Z4IUXXsDPz4+uXbsyffp0qlevzrJly6hdu7ZBuVGjRhk8Dg8Px87Ojs6dOxu8L0888QQ2Njbq+3L48GH0ej2jR482+Mw9//zzD43t7NmzXLp0ibFjx2Jvb29wrjif3/KIsdDAgQOBfz6jALt27SI7O/u+n9f09HSSk5N58sknSUxMLJXh7+joaOLj4xkwYAC3bt1SrzkzMxM/Pz+OHTtGfn4+APb29pw6deqec/WEKC4ZNhWiGPLy8tixYwe+vr4G819at27NqlWriIyMxN/fHygYArt72LGsbNmyhVWrVhEXF2cw1HS/4cKHCQgIwNHRke3btzN06FCgYL5b8+bNadasmVru559/5osvviA6OtrgBofSSk7j4+OB+/8gL0yqtFotM2bMYPHixXTu3Jk2bdrQrVs3Bg8ejIuLywNfo1+/fixatIiwsDAmT56MoiiEh4cTEBCg1u/q6sqLL77I6tWrCQ0NpX379vTo0YOBAwc+1pDp3LlzcXNzw9zcnJo1a+Lm5lbkhoFq1apRp04dg2MJCQmkp6fj5+d3z3pv3rwJwOXLlwFo3LixwXlnZ2ccHBweGFtiYiIAHh4exb6e8o6xUPPmzfHw8GD79u1MmTIFKEjknJyc1O8jwG+//cbSpUs5efJkkSQ8PT39sYe/Cz+vs2bNum+Z9PR0HBwcmDFjBrNnz6Zbt2488cQTdO3alcGDB+Pq6vpYMYiqRZI3IYrhyJEjJCUlsWPHDnbs2FHkfGhoqMEPi7KQl5eHubm5+vjHH39k9uzZ9OrVi/Hjx1OjRg3Mzc1Zvny5+gP4UVlYWNCvXz9++OEHbty4weXLl4mPj2fmzJlqmePHj/Pyyy/ToUMH3nvvPVxcXLCwsGDTpk0GPSD3cr/k7s6eSyiYyA7wwQcf3DMJu/N9eOGFF+jRowd79+7ll19+4bPPPmPFihWsWbOGFi1a3DeW2rVr0759e3bu3MnkyZM5efIkly9fVm8MKDR79myGDBnCvn37OHToEO+//z7Lly9nw4YNRZKr4mrdujWtWrV6YBmtVlskocvPz6dGjRp8+OGH93yOs7NzieIpTeUd44ABA/joo484c+YMderU4ejRo4wcOZJq1Qp+vF28eJEXXngBd3d3Zs+eTd26dbGwsODAgQN89dVXao/Yvdzv83r3cwo/r//617/uO9fUxsYGKFiWp3379uzZs4dDhw4REhJCcHAwS5cupWvXro98/aJqkuRNiGIIDQ2lRo0azJ07t8i5PXv2sGfPHubPn4+VlRUNGzZ86B1zD+qhcnBwIC0trcjxy5cvG/x2vmvXLlxdXVm2bJlBfUuWLCnOJd3XgAEDWL9+PWFhYVy6dAmNRkNQUJDB61paWhISEqIO20LBHX0PUzgMl5aWZjAkV9gLU6jwOmvUqEGnTp0eWm/Dhg0ZN24c48aNIz4+nsGDB7Nq1ar7JhCF+vfvz/z584mNjSUsLAxra2u6d+9epFzh3ZSvvPIKJ06cYNSoUaxbt47p06c/NLbS1LBhQyIjI2nbtq3BUODd6tWrBxT0CN35mUlOTn7o8HJh+fPnzz/wvb/fZ7g8YrxTUFAQH3/8Mdu3b6devXrk5eUZDJn+9NNP5OTk8MUXX6ivCRRrR4nCz+jdQ6t336VcGL+trW2xPq+1atXiueee47nnnuPmzZsMGTKEL7/8UpI3UWwy502Ih8jKymL37t1069aNfv36Ffnz3HPPcfv2bX766Seg4K7NP//8kz179hSpq/A3dGtra4B7Jmmurq6cOnXKYDjy559/5sqVKwblCnufCuuEgqUKTp48+VjX265dO+rXr8+2bdsICwtT7+q783U1Go1Bb9nD1igr1LBhQwCOHTumHsvMzGTr1q0G5bp06YKtrS3Lly+/552HycnJAOh0OrKzs4u8RvXq1e+5Xt3d+vbti7m5OTt27CA8PJxu3bqpPSRQcEdvbm6uwXM8PDwwMzMzqP/y5cvExMQ89PUeV//+/cnLy+Pzzz8vci43N1f9PHXq1AkLCwu+/fZbg89H4VIfD/LEE0/QoEEDvv766yKfzzvrut9nuDxivFO9evVo3749YWFhbNu2jQYNGhjcuX2v70l6enqxftm41+c1Ly+PDRs2GJRr2bIlDRs2ZNWqVdy+fbtIPYWf17y8vCKJYI0aNahVq1axPq9CFJKeNyEe4qeffuL27dv06NHjnue9vb1xdnZm27ZtBAYGMn78eHbt2sXrr7/OsGHDeOKJJ0hNTeWnn35i/vz5NG/enIYNG2Jvb8/69eupXr06NjY2tG7dGldXV55++ml27drFhAkT6N+/PxcvXiQ0NFT9QVKoW7du7N69m1dffZVu3bpx6dIl1q9fT9OmTR9rQVeNRsOAAQP48ssvAXj99dcNznft2pXVq1czYcIEgoKCuHnzJt999x0NGzbk3LlzD6y7c+fO1KtXj7fffpvY2FjMzc3ZtGkTTk5OBr1vtra2zJs3j3/9618MHTqUwMBAnJ2duXz5MgcOHKBt27bMnTuX+Ph4XnjhBfr160fTpk0xNzdn79693Lhxo1gr69eoUQNfX19Wr17N7du3CQwMNDh/5MgR/v3vf9OvXz8aN25MXl4eP/74I+bm5vTt21ctN2vWLH799deHXv/jevLJJxk5ciTLly8nOjqazp07Y2FhQXx8POHh4bz99tv069cPZ2dnxo0bx/Lly5k0aRJdu3bl7NmzRERE4OTk9MDXMDMzY968ebz88ssMHjyYoUOH4uLiQmxsLH/99RchISEA6rIW77//Pv7+/upuBuUR490GDhzIu+++y/Xr15k8ebLBucLXnzx5Ms888wy3b9/mhx9+oEaNGiQlJT2w3mbNmuHt7c3HH39MamoqDg4OhIWFFUnozczMeP/995k4cSJBQUEMHTqU2rVrc+3aNY4ePYqtrS1ffvklt2/fVteIbN68OTY2Nhw+fJgzZ87IHsDikUjyJsRDbNu2DUtLSzp37nzP82ZmZnTr1o3Q0FBu3bqFk5MTa9euZenSpezZs4ctW7ZQo0YN/Pz81LsJLSwsWLRoER9//DHz5s0jNzeXhQsX4urqSpcuXZg9ezarV69mwYIFtGzZki+//JLFixcbvO7QoUO5ceMG33//Pb/88gtNmzblv//9L+Hh4fz666+Pdc2FyVvhSvZ38vPz4z//+Q/BwcEsWLCABg0aMGPGDP7++++HJi8WFhYsW7aM+fPn89lnn+Hi4sLzzz+Pvb09c+bMKRJDrVq1WLFiBSEhIeTk5Kjz1ApvpqhTpw5PPfUUkZGRbNu2DXNzc9zd3fn000+LxH0/gYGBHD58mOrVqxcZtvL09MTf35+ff/6Za9euYW1tjaenJ8HBwXh7exer/tL273//m5YtW7J+/Xo++eQTzM3NqV+/PgMHDjTocZo2bRparZb169dz9OhR9eaaSZMmPfQ1unTpwpo1a/jf//7HqlWrUBQFV1dXRowYoZbp06cPY8aMYceOHWzbtg1FUdSEuTxivFPfvn35f//v/5GTk6PegVrI3d2dJUuW8Omnn7J48WJq1qzJqFGjcHZ25q233npo3R9++CFz585lxYoV2NvbM3z4cHx9fYusLefr68v333/P559/zrfffktmZiYuLi60bt2akSNHAgV3vY4aNYpDhw6xe/duFEWhYcOGvPfeezz77LOPdM2iatMod/YlCyGEEEIIkyZz3oQQQgghKhBJ3oQQQgghKhBJ3oQQQgghKhBJ3oQQQgghKhBJ3oQQQgghKhCTSt527tzJyy+/TEBAAN7e3gwaNIiNGzcaLK44ZswYdbXzO//cvUBmeno6b731Fk8++SQ+Pj5MnTqV69evF3nNEydOMHLkSFq3bk337t1ZsWIFd9+AqygKK1asoFu3bupt34+7EKoQQgghREmY1FIhI0eOpH79+vTq1QsnJycOHz7MypUrefXVV3nttdeAguQtNze3yAbAXl5eWFpaqo/Hjx/PX3/9xaxZs7C0tOTTTz/FzMyMTZs2qXveJSQkMHjwYDp37sxzzz3HuXPn+PDDD5k+fTrjx49X61qxYgVLlixhxowZeHp6snbtWg4fPsyPP/5Y4s2Eo6KiUBQFCwuLEj1fCCGEEOVPr9ej0Wjw8fExWgwmtUjvF198YbBpsZ+fHykpKaxevZpXXnlF3aTZ3t7+gQtkRkVF8csvvxASEqJuFu7m5kZgYCC7d+9WV1EPCQnBycmJjz/+GK1Wi5+fH8nJyXz55ZeMGTMGrVZLdnY2y5cvZ9y4cbzwwgtAwfZB/fr1IyQkhHnz5pXoWhVFUXv4FEVBr9djYWHxwD0vRdmSdjAd0hamQdrBNEg7mI47f3Ybk0klb3cmboW8vLzYsGEDmZmZ2NraFqueiIgI7O3tDVbEd3d3x8vLi4iICDV5i4iIoHfv3gabawcGBrJ8+XKioqLw9fXlxIkTZGRk0L9/f7WMVquld+/e99y7srgKe9xatWpFZmYm0dHRNG3a1GBfRVG+pB1Mh7SFaZB2MA3SDqajsC2MPWpmUsnbvfz222/Url3bIHH79ddf8fb2Ji8vjzZt2vD666/ToUMH9XxsbCxubm5FfkNxd3cnNjYWKGiAK1eu4O7uXqSMRqMhNjYWX19ftfzd5Zo0acKaNWvIysrCysqqRNemKAqZmZnodDoA9W9hHNIOpkPawjRIO5gGaQfTYSptYNLJ2/HjxwkLCzOY39ahQwcGDRpE48aNuX79OiEhIbz44ot888036vhzWloadnZ2RepzcHDg999/BwpuaICCIdg7abVarK2tSU1NVevSarUG8+kKn6coCqmpqSVO3vR6PdHR0erj+Pj4EtUjSpe0g+mQtjAN0g6mQdpBFDLZ5O3q1atMnz4dX19fxo4dqx6fOnWqQblu3boRFBTE559/TnBwcHmH+VgsLCxo2rQpOp2O+Ph4GjdujLW1tbHDqrKkHUyHtIVpkHYwDdIOpqOwLYzNJJO3tLQ0Jk6ciKOjI0uXLlVvVLgXGxsbunbtyq5du9Rj9vb2XL16tUjZ1NRUHBwcANSeucIeuEI5OTnodDq1nL29PTk5OWRnZxv0vqWlpaHRaNRyJaHRaAzmL1hbW8t8BhMg7WA6pC1Mg7SDaZB2EIVMLnnLyspi0qRJpKen8/33399z+PNh3N3diYyMRFEUg3lvcXFxeHh4AAVJX926ddU5bXeWURRFneNW+HdcXBzNmzdXy8XGxlKvXr0SD5k+iry8PPR6fZm/TlWXnZ2t/v2gXxjKkoWFBebm5kZ5bSGEEBWDSSVvubm5TJs2jdjYWNauXUvt2rUf+pzMzEz2799Pq1at1GMBAQF8/vnnREZG0qlTJ6Ag+Tp79iwTJkwwKLdv3z5mzpyp3jkSFhaGvb29On+ubdu22NrasnPnTjV50+v17N69m4CAgFK79ntRFIWrV6+SkpJSpq8jCuTn51OtWjUuX75stOQNwNHRkTp16siSAEIIIe7JpJK3+fPn8/PPPzN79mwyMjIMdjFo0aIFp0+fZuXKlfTu3Zv69etz/fp1Vq9eTVJSEp999pla1sfHB39/f9566y11kd5PPvkET09P+vTpo5YbP348oaGhvPnmm4waNYrz588TEhLC9OnT1eVDLC0tmTRpEkuXLsXZ2RkPDw/WrVtHSkqKwUK+ZaEwcatVqxY2Njbyw7yM5eXlqcPjxuj9Krz7uHAnkLp165Z7DEIIIUyfSSVvhw4dAmDRokVFzu3btw8XFxf0ej2ffPIJKSkpWFtb4+Pjw/z582ndurVB+U8//ZSFCxcyd+5ccnNz8ff355133lF3VwBo1KgRISEhLFq0iJdeeglnZ2emTp3KuHHjDOqaOHEiiqKwatUqkpOT8fLyIiQkpMS7KxRHXl6emrjVqFGjzF5H/CMvLw8AKysrow1dFk5Gvn79OrVq1ZIhVCGEEEWY1PZYVcmZM2cAw0V6vby81MmoWVlZxMXFyd1F5SgvL09dt8+YSVPh3Uxubm7lMqfSFN3rOyHKn7SDaZB2MB2FbaHVag2ma5U3k9qYXhQlQ6VVj7S5EEKIBzGpYVMhhBBCiMeRnplDakY2t3V6qltb4GBriZ2N9uFPrEAkeRNCCCFEpZCUomPphiiiziWpx3w8XZgywgcXx8ozBUmGTUW5GjhwIJ6enhw/fvyRn7t06VJOnDhRBlH9o23btqxatapMX0MIIUTpS8/MKZK4AUSdS2LphijSM3OMFFnpk+RNlJsLFy5w7tw5AEJDQx/5+cuWLSMqKqq0wxJCCFEJpGZkF0ncCkWdSyI1I7ucIyo7kryJchMaGoqZmRm+vr6Eh4fLrhFCCCFKTUbmg3+mPOx8RSLJWxWRnpnDpevpnEtI5tL19HLvPlYUhe3bt9OxY0defPFFUlJSOHjwoEGZmJgYXnvtNZ588knatGnDwIED2b59OwCenp4AfPDBB3h6euLp6cnRo0e5dOkSnp6ehIeHG9T1n//8hx49eqiPr1+/zpw5c+jZsyetW7emT58+fPzxx+TkVJ5udCGEqMqsLP9Z4snKTAco9z1f0ckNC1WAKUzgPHHiBH///Tevvvoq/v7+ODo6sn37djXBio+PZ+TIkdStW5e3334bFxcXzp8/z+XLlwH4/vvvGTlyJGPGjCEoKAiApk2bFnvrsFu3buHo6MicOXOwt7cnPj6epUuXkpSUxMKFC8vkmoUQQpQfM42GNk1rcCPxDHW014nPcuWmvmCR+zbNXDCrRMswSfJWyT1sAufM0e3L5Rbq7du3Y2lpSZ8+fbCwsKBv375s27aN27dvU716dZYuXYqFhQXr1q3D1tYWQN2XFsDb2xso2DKq8N9AsZM3T09PZs2apT5u27Yt1tbWzJ49m7lz58pCyEIIUcFl3k7DJfcMFpYFWwzamGVxk4LEbWAXd8zNJXkTFURxJnCWdfKWm5tLeHg4Xbt2xc7ODoABAwbw/fffs2fPHgYPHsyRI0fo27evmriVNkVRWLNmDRs2bODSpUtkZ/8zcTUxMREPD48yeV0hhBBl7/fffyc0dDs5OdmYmVvQpkNXatRxQ2thxp8Jt9h9NJ7Xn2lr7DBLjSRvldxt3YMnaD7sfGk4dOgQycnJdO/enbS0NAA8PDxwcXFh+/btDB48WN3HtaysWbOGxYsXM2HCBHx9fbG3t+fMmTP8+9//NkjkhBBCVDwxMTHk5GRTp259/s51I3j3DeAGUDBNaOoIn0q1UK8kb5VcdWuLxzpfGgqXBZkzZw5z5swxOHfr1i1u3ryJo6Mj169ff+S6LS0tAYrcuVqYJBYKDw+nR48evPnmm+qxmJiYR349IYQQpkFRFHU7wf79+1OrVi18fX25nZUrOyyIis3B1hIfT5d7Dp36eLrgYGtZpq+v0+nYt28fvXr1YuzYsQbnbty4wRtvvEFYWBh+fn7s2rWLGTNm3Hfo1MLCokgvWY0aNbCwsDBIxHJycjh27JhBuaysLCwsDBPVkqw1J4QQwrgUReHYsWPExcUxYsQINBoNWq0WPz8/AOxstJUuWbubJG+VnJ2NlikjfO55t2l5dCPv27ePzMxMxowZg6+vb5HzK1euZPv27SxevJj9+/fz7LPPMmHCBFxcXIiJiUGn0zFx4kQA3N3d2bdvH+3bt8fa2ho3NzdsbW3p3bs3a9eupVGjRjg5OfHtt98a/EYGBTc/fP3113z77bc0btyYbdu2kZCQUKbXLoQQonRlZmaybds2dcH36OhoWrRoYeSoyp8kb1WAi6M1M0e3N0o38vbt26lXr949EzeAwYMHs2DBAszMzFi/fj0fffQR8+fPJy8vj8aNG/PSSy+pZefOncuCBQuYOHEiWVlZfP311/j6+vLuu+/y7rvv8v7771O9enXGjx+Pm5sb+/btU5/76quvcuvWLZYsWQJA3759eeedd5g8eXLZvgFCCCFKRXx8PJs3byY9PR1zc3N69+6Nl5eXscMyCo2iKMrDi4nSdubMGQBatWpFZmYm0dHReHl5YWNjAxQM88XFxeHm5oaVlZUxQ60y8vLyyMrKwsrKCnNz4y3mKG3PPb8TovxJO5iGqt4O+fn5HDhwgIiICKBguszw4cOpU6dOucdS2BZarZZWrVqV++sXkp43IYQQQpisbdu2cerUKaBgzc/+/fuj1VbuOW0PI8mbEEIIIUzWk08+yYULF+jXr59Re7tMiSRvQgghhDAZer2eS5cu4ebmBkC9evV4/fXXq3xv251kY3ohhBBCmIRr164RHBzM2rVruXr1qnpcEjdD0vMmhBBCCKNSFIXjx4+ze/ducnNzsbW1ld1vHkCSNyGEEEIYjU6nY9u2bfz5558ANGvWjEGDBlG9enUjR2a6JHkTQgghhFEkJCSwefNm0tLSMDMzo3fv3vj6+hossi6KkuRNCCGEEEaRmJhIWloazs7ODB8+nLp16xo7pApBkjchhBBClJs7ty/s3LkzZmZmtGvXDkvLst1ruzKRu02FEEIIUS6io6P56quv0Ov1AGg0Gjp16iSJ2yOS5E2UuaVLl+Lp6an+6dixI2PHjuX48eNl9pr/+c9/6NGjh/p48+bNeHp6kpycXOw69u7dy9q1a8s0LiGEqAr0ej07duxgw4YNXLx4kcjISGOHVKHJsKkoF1ZWVqxZswaAq1ev8vnnn/PCCy+wefNmPDw8yvz1u3Xrxvfff4+9vX2xn7N3715+//13nnvuuTKMTAghKrekpCQ2btzI9evXAfDz86Nz585Gjqpik+RNlAszMzO8vb3Vx61bt6ZHjx6sX7+euXPnGpRVFAW9Xl+qizI6Ozvj7OxcavUJIYR4MEVROHHiBOHh4eTm5lK9enUGDx5M06ZNjR1ahSfDpsIo6tWrh7OzM5cuXWL27NkEBQVx4MABBg4cSKtWrfjpp58AiIqKYuzYsXh7e9OuXTvefPNNbt68aVDXtWvXmDx5Mm3atKFLly4EBwcXeb17DZvm5OTwySef0LNnT1q2bEn37t157733AJg9ezZbtmzhwoUL6nDv7Nmz1eeWVlxCCFFZHTx4kO3bt5Obm4u7uzuTJ0+WxK2USM9bBZSTk3Pfc2ZmZlSrVq1YZTUaDRYWFiUq+7gyMjJISUmhVq1a5Obmcv36dd5//31efvll6tatS7169YiKimLMmDF07dqVTz75BJ1Ox6effsorr7zC999/r9b1yiuvcO3aNebNm4ednR3BwcFcuXLF4H24lylTpnDkyBEmTZqEt7c3N27cYNeuXWqdycnJxMbG8uGHHwKoPXdlHZcQQlQG3t7eHDt2jI4dO9KpUydZu60UyU+RCmjhwoX3PdesWTOeffZZ9fGHH36o3tVzt0aNGvHCCy+ojz/77DMyMzPvWbZevXpMnDixZAH/n9zcXKBgztvixYvJy8ujb9++7Nixg9TUVIKDg2nTpo1a/u2336Zly5YsW7ZM/dJ7eHiovXRdu3YlIiKC33//na+++go/Pz8AfH196dq1K46OjveN5dChQ+zfv5+PPvqIoKAgAPLy8ujZsycADRs2xNnZmcuXLxsM9wJ89NFHZRaXEEJUVPn5+cTGxqq9a/b29kyZMkX2JS0DMmwqykVmZiZPPPEETzzxBD179uTo0aPMnTuXLl26AODo6GiQuOl0Ok6cOEG/fv3Iy8sjNzeX3NxcGjduTN26dTlz5gwAp0+fxs7OTk2QAOzs7OjUqdMD44mMjMTa2pqnnnrqka6jrOMSQoiKKC0tjW+++Ya1a9eq21yBbChfVqTnrQKaM2fOfc+ZmRnm4zNmzLhv2bu7sF9//fVil31UVlZWfPvtt2g0GpycnKhbt65BrDVr1jQon5aWRl5eHgsXLrxnT+OVK1cAuH79+j1vRKhRo8YD40lJScHFxeWRr6us4xJCiIrm3Llz/Pjjj+h0OiwsLNRRFlF2JHmrgB7lN5myKvuozMzMaNWq1X3P351E2dnZodFomDRpEr169SpS3snJCYBatWrdc+22u28euJujoyNJSUkGK30XR1nHJYQQFUVubi579uzh119/BaBOnToMHz5cfkktB5K8CZNkY2ODt7c3sbGxD0z6WrVqRXp6OpGRkeoQZXp6OocPH37g3LJOnToRHBzMzp07CQwMvGcZCwsLsrOzyzUuIYSoCG7cuMHGjRu5du0aAB07dqRnz55yQ1Y5kXdZmKx//etfPP/880ybNo2nnnoKe3t7rl69yuHDhxk6dCi+vr4EBATwxBNPMHPmTGbMmIGdnR0rVqzA1tb2gXV36tSJrl278tZbb3Hx4kXatGlDcnIyO3fu5LPPPgOgSZMmbNq0ie3bt9OoUSOcnJxo0KBBmcYlhBAVQVJSEteuXcPGxobBgwfTrFkzY4dUpUjyJkxW27Zt+e6771i6dClz5sxBr9dTp04dOnbsSKNGjYCC4dbPP/+c9957j7lz52Jvb8+YMWO4ceMG+/bte2D9S5cuZdmyZXz//fcsW7aMGjVq4Ovrq54fPnw4p0+f5v/9v/9HSkoKQ4YMYdGiRWUelxBCmKI7p5l4eXnRv39/vLy8sLOzM3JkVY9GURTF2EFURYV3JbZq1YrMzEyio6Px8vLCxsYGgKysLOLi4nBzc8PKysqYoVYZeXl5ZGVlYWVlhbm5udHikLbnnt8JUf6kHUyDKbTDpUuX2LlzJ88880yVTtYK20Kr1T5w6kxZk6VChBBCCHFPiqJw8OBBVq1axeXLl2XkwETIsKkQQgghikhPT2fLli3ExcUB0LJlS/r162fkqARI8iaEEEKIu1y4cIGtW7eSmZmJhYUF/fv3x9vbW7a4MhGSvAkhhBBC9ccff7Bx40YAateuzfDhw4sspC6MS5I3Eyf3k1Q90uZCCGNq1qwZNWvWxN3dnd69e8vabSZIWsREWVhYAAV3tlhbWxs5GlGeMjMzgX8+A0IIUdb++usvmjRpgkajQavVMnHiRNmX1IRJ8maizM3NcXR05Pr160DByv4y16Bs5eXlqTsqGGOpEEVRyMzM5Pr16zg6Ohp1uRIhRNWQnZ1NWFgYp0+fplevXnTu3BmQDeVNnSRvJqxOnToAagInylZ+fj65ublUq1YNMzPjraLj6Oiotr0QQpSVy5cvs3HjRm7duoVGo5EpGxWIJG8mTKPRULduXWrVqoVerzd2OJWeTqcjNjaWhg0bGm2o2sLCQnrchBBlSlEUIiMj2bdvH/n5+Tg4ODB06FAaNmxo7NBEMUnyVgGYm5vLD/RykJ+fD4ClpWWV3dlACFG5ZWRksHXrVmJiYoCCba4GDBggc6srGEnehBBCiCoiPT2duLg4qlWrRr9+/Wjbtq3Mp66AJHkTQgghKrE7N5SvW7cugwYNok6dOtSqVcvIkYmSkr1NhRBCiEoqOTmZ1atXc+XKFfVY69atJXGr4CR5E0IIISqh06dPs3z5chITEwkLC5O7SSsRGTYVQgghKpHs7Gx27tzJqVOnAGjUqBFDhgyRuW2ViCRvQgghRCVx+fJlNm3aRHJyMhqNhoCAAAICAoy6dqUofZK8CSGEEJXA5cuXCQkJIT8/H3t7e4YOHUqjRo2MHZYoA5K8CSGEEJVA3bp1cXNzw8LCgoEDB8rabZWYJG9CCCFEBZWQkEDdunXRarVoNBpGjBiBhYWFzG+r5ExqEHznzp28/PLLBAQE4O3tzaBBg9i4cWORO2R++OEH+vbtS6tWrRg4cCA///xzkbrS09N56623ePLJJ/Hx8WHq1Kn33CP0xIkTjBw5ktatW9O9e3dWrFhR5PUURWHFihV069aN1q1bM3LkSE6ePFmq1y6EEEIUV15eHnv37uWrr75i165d6vHCJE5UbiaVvH311VdYW1sze/ZsvvjiCwICAnj33Xf53//+p5bZsWMH7777Lv379yc4OBhvb29ee+21IsnUtGnTOHToEPPmzePDDz8kLi6OiRMnkpubq5ZJSEhg/PjxuLi4sHz5cp5//nmWLFnCqlWrDOoKDg5myZIlvPDCCyxfvhwXFxfGjRtHYmJimb4fQgghqq70zBwuXU/n4nUdjrUakf1/P75u3brF6tWrOXToEFCwD3bh9n6iajCpYdMvvvgCZ2dn9bGfnx8pKSmsXr2aV155BTMzM5YsWcJTTz3FtGnTAOjYsSPnz5/nf//7H8HBwQBERUXxyy+/EBISgr+/PwBubm4EBgaye/duAgMDAQgJCcHJyYmPP/4YrVaLn58fycnJfPnll4wZMwatVkt2djbLly9n3LhxvPDCCwC0a9eOfv36ERISwrx588rt/RFCCFE1JKXoWLohiqhzSeoxH08X+nlbEfHTbrKzs7GysmLAgAG0aNHCiJEKYzCpnrc7E7dCXl5eZGRkkJmZSWJiIvHx8fTv39+gTGBgIJGRkeTk5AAQERGBvb09nTt3Vsu4u7vj5eVFRESEeiwiIoKePXui1WoN6kpLSyMqKgooGFbNyMgweE2tVkvv3r0N6hJCCCFKQ3pmTpHEzYw8khN+Y8/OULKzs3F1dWXSpEmSuFVRJpW83ctvv/1G7dq1sbW1JTY2FijoRbtTkyZN0Ov16jBmbGwsbm5uRcb93d3d1ToyMzO5cuUK7u7uRcpoNBq1XOHfd5dr0qQJly9fJisrq5SuVAghhIDUjGyDxA3AXJOPY7VUFAW82/nywgsv4OjoaJwAhdGZ1LDp3Y4fP05YWBizZs0CIDU1FQB7e3uDcoWPC8+npaVhZ2dXpD4HBwd+//13oOCGhnvVpdVqsba2NqhLq9ViaWlZ5DUVRSE1NRUrK6sSXZ+iKGRmZqLT6QDUv4VxSDuYDmkL0yDtYBwZmTn/9y8FKOiE0CsWxOkaoaDhmZZPSseBkZjKd8Fkk7erV68yffp0fH19GTt2rLHDKRN6vZ7o6Gj1cXx8vPGCESppB9MhbWEapB3Kl6NLI6ppcmlsdZEbemdSch0BSMsr6GywMMs3+Nkhqh6TTN7S0tKYOHEijo6OLF26VN3Ww8HBASjoNXNxcTEof+d5e3t7rl69WqTe1NRUtUxhz1xhD1yhnJwcdDqdQV05OTlkZ2cb9L6lpaWh0WjUciVhYWFB06ZN0el0xMfH07hxY1lU0YikHUyHtIVpkHYwjr/iLtLG4QKa/GxszDNJzbBH+b9ZTj6eLjg72lC3ppeRo6yaCr8TxmZyyVtWVhaTJk0iPT2d77//3mD4s3DeWWxsrMEctNjYWCwsLHB1dVXLRUZGoiiKwby3uLg4PDw8ALCxsaFu3brqnLY7yyiKotZf+HdcXBzNmzc3eM169eqVeMgUCm7vtrGxUR9bW1sbPBbGIe1gOqQtTIO0Q/nIz89n//79HDx4EA2gmFfnQkYDg8Rt6ggfnOwlka7qTCp5y83NZdq0acTGxrJ27Vpq165tcN7V1ZXGjRsTHh5Or1691ONhYWH4+fmpd40GBATw+eefExkZSadOnYCC5Ovs2bNMmDBBfV5AQAD79u1j5syZWFhYqHXZ29vj4+MDQNu2bbG1tWXnzp1q8qbX69m9ezcBAQFl92YIIYSoMlJSUti8ebN6452Pjw/+AT3IzFHIyNRjYZaPs6ONJG4CMLHkbf78+fz888/Mnj2bjIwMg4V3W7RogVarZcqUKcyYMYOGDRvi6+tLWFgYp0+f5ttvv1XL+vj44O/vz1tvvcWsWbOwtLTkk08+wdPTkz59+qjlxo8fT2hoKG+++SajRo3i/PnzhISEMH36dDURtLS0ZNKkSSxduhRnZ2c8PDxYt24dKSkpjB8/vtzeGyGEEJVTRkYGy5cvJysrC0tLS4KCgmjZsiUAzhSsjhAdHS1DpUJlUslb4WrRixYtKnJu3759NGjQgKCgIHQ6HcHBwaxYsQI3NzeWLVum9pQV+vTTT1m4cCFz584lNzcXf39/3nnnHapV++eSGzVqREhICIsWLeKll17C2dmZqVOnMm7cOIO6Jk6ciKIorFq1iuTkZLy8vAgJCVGHaYUQQoiSsrW1pWXLlly9epWhQ4fi5ORk7JCEidMod2/kKcrFmTNnAGjVqpX6W5WXl5fMKzEiaQfTIW1hGqQdys61a9ewtrZWl6vKzc1Fo9Fgbm5epKy0g+kobAutVkurVq2MFofJL9IrhBBCVBaKonDs2DFWrlzJli1b1D1Jq1Wrds/ETYh7MalhUyGEEKKy0ul0bNu2jT///BMoSNj0en2RReCFeBhJ3oQQQogylpCQwObNm0lLS8PMzIzevXvj6+tbZBtHIYpDkjchhBCijOTn5xMREUFERASKouDs7Mzw4cOpW7eusUMTFZgkb0IIIUQZycvL448//kBRFNq0aUNgYKC6FJUQJSXJmxBCCFHKCnf4sbCwYPjw4Vy7do3WrVsbOyxRSUjyJoQQQpSSwh14HB0d6dy5MwC1a9cusmOQEI9DkjchhBCiFFy/fp1NmzZx/fp1zM3NadWqlbqOmxClSZI3IYQQ4jEoisKJEycIDw8nNzeX6tWrM2TIEEncRJmR5E0IIYQoIZ1OR2hoKNHR0QA0adKEwYMHY2tra+TIRGUmyZsQQghRAnl5eaxcuZLk5GTMzMzo2bMnfn5+snabKHOSvAkhhBAlYG5uTocOHfj1118ZPnw49erVM3ZIooqQ5E0IIYQoprS0NLKysqhVqxYAvr6+tG3bVtZuE+VKkjchhBCiGM6dO8ePP/6ItbU1L730EpaWlmg0GkncRLmT5E0IIYR4gNzcXHbv3s2xY8cAcHBwICsrSzaUF0YjyZsQQghxHzdu3GDjxo1cu3YNgI4dO9KzZ0+qVZMfn8J45NMnhBBC3EVRFKKioggPD0ev12NjY8PgwYNp1qyZsUMTQpI3IYQQ4l7Onj2LXq/Hzc2NIUOGYGdnZ+yQhAAkeRNCCCFUhRvKazQaBg8ezJkzZ+jYsaOs3SZMipmxAxBCCCGMTVEUDh48yI4dO9Rjtra2suiuMEnS8yaEEKJKS09PZ8uWLcTFxQHQunVrGjZsaOSohLg/Sd6EEEJUWRcuXGDr1q1kZmZiYWFB//79cXV1NXZYQjyQJG9CCCGqnNzcXPbt28eRI0cAqF27NsOHD6dmzZpGjkyIh5PkTQghRJWzfv16YmJigIItrnr16iVrt4kKQz6pQgghqhxfX1+uXLnCoEGD8PDwMHY4QjwSSd6EEEJUetnZ2SQlJdGgQQMAmjVrxtSpU2WLK1EhyVIhQgghKrW///6b5cuXs3btWlJSUtTjkriJikp63oQQQlRKiqJw+PBhfvrpJ/Lz83FwcECn0+Ho6Gjs0IR4LJK8CSGEqHQyMjLYsmULsbGxALRo0YIBAwZgZWVl5MiEeHySvAkhhKhU/vrrL7Zu3crt27epVq0a/fv3x8fHR3ZKEJWGJG9CCCEqlfPnz3P79m1q167NsGHDcHFxMXZIQpQqSd6EEEJUeIUbygP06dMHOzs7/Pz8ZO02USnJ3aZCCCEqtNOnT7N+/Xry8/MBqFatGl26dJHETVRa8skWQghRIWVnZ7Nz505OnToFwKlTp/Dx8TFyVEKUPUnehBBCVDiXL19m06ZNJCcno9FoCAgIoE2bNsYOS4hyIcmbEEKICkNRFI4cOcLevXvJz8/H3t6eoUOH0qhRI2OHJkS5keRNCCFEhbFr1y6OHj0KQPPmzRk4cCDW1tZGjkqI8iXJmxBCiAqjbdu2nDp1ip49e9KuXTtZu01USZK8CSGEMFl5eXkkJibSuHFjAGrVqsW0adNkX1JRpclSIUIIIUzSrVu3WL16NV9//TWXLl1Sj0viJqo66XkTQghhcn7//Xe2b99OdnY2VlZW6HQ6Y4ckhMmQ5E0IIYTJyMnJYefOnZw8eRIAV1dXhg0bhoODg3EDE8KESPImhBDCJFy9epWNGzdy8+ZNNBoNXbp0oWvXrpiZyQwfIe4kyZsQQgiTkJCQwM2bN7Gzs2Po0KHqTQpCCEOSvAkhhDAJTz75JHq9nrZt22JjY2PscIQwWdIXLYQQwiji4uL46quvyM7OBkCj0eDv7y+JmxAPIcmbEEKIcpWfn89PP/3E119/TUJCAgcPHjR2SEJUKDJsKoQQotykpKSwadMmdd02Hx8fAgICjByVEBWLJG9CCCHKxR9//EFoaCjZ2dlYWloSFBREy5YtjR2WEBVOiZK3y5cvc/nyZdq3b68e+/PPP1m1ahU5OTkEBQXRq1evUgtSCCFExXbs2DHCwsIAaNCgAUOHDsXJycnIUQlRMZUoeXv//ffJzMzkq6++AuDGjRuMHTsWvV5P9erV2bVrF5999hl9+vQpzViFEEJUUF5eXhw8eJA2bdrQrVs3zM3NjR2SEBVWiW5YOH36NJ06dVIfb926laysLH788UciIiLw8/Nj1apVpRakEEKIikVRFGJjY9XHtra2vPrqq/Ts2VMSNyEeU4mSt9TUVGrUqKE+3r9/Px06dKBhw4aYmZnRu3dvgy+tEEKIqiMzM5Pvv/+eb775hjNnzqjHZUN5IUpHiZI3Z2dnLl++DEBaWhonT56kS5cu6vm8vDxyc3NLJ0IhhBAVRkJCAsuXL+fcuXOYmZmpa7gJIUpPiea8derUiW+++QZbW1uOHj2Koij07NlTPf/XX39Rt27dUgtSCCGEacvPzyciIoKIiAgURaFGjRoMGzZMfhYIUQZKlLy9+eabxMXFsXjxYiwsLPjXv/6Fq6srADk5OezcuZMBAwaUaqBCCCFMU2pqKps3b+bixYsAeHt7079/f7RarZEjE6JyKlHyVrNmTdavX096ejqWlpYGX9D8/HzWrFlDnTp1Si1IIYQQpispKYmLFy+i1WoJCgqiVatWxg5JiErtsRbptbOzK3LMysqK5s2bP061QgghKpCmTZsSGBhIkyZNcHZ2NnY4QlR6Jd7b9PLly8ydO5e+ffvSoUMHjh07BkBycjLvv/8+Z8+eLbUghRBCmI7r16+zevVqUlJS1GMdOnSQxE2IclKi5O2vv/5iyJAh7Ny5kwYNGpCRkaHeXers7Mxvv/3Gt99++8j1JiQkMHfuXAYNGkSLFi0ICgoqUmbMmDF4enoW+RMTE2NQLj09nbfeeosnn3wSHx8fpk6dyvXr14vUd+LECUaOHEnr1q3p3r07K1asQFEUgzKKorBixQq6detG69atGTlyJCdPnnzk6xNCiIogPTOHS9fTuXhdh2OtRmT/3+IBiqJw/PhxgoODuXjxIrt27TJuoEJUUSUaNv3vf/+LnZ0dGzZsADBYsBega9eu7Ny585HrvXDhAgcOHKBNmzbk5+cXSaIKtW3bllmzZhkca9CggcHjadOm8ddffzFv3jwsLS359NNPmThxIps2baJatYLLTkhIYPz48XTu3Jlp06Zx7tw5PvzwQ8zNzRk/frxaV3BwMEuWLGHGjBl4enqydu1axo0bx48//qjeqCGEEJVBUoqOpRuiiDqXpB7z8XThxf4eRP6ylwvnzwHQpEkTnnrqKWOFKUSVVqLk7dixY7z66qs4Oztz69atIufr1avHtWvXHrneHj16qHuizp49m99///2e5ezt7fH29r5vPVFRUfzyyy+EhITg7+8PgJubG4GBgezevZvAwEAAQkJCcHJy4uOPP0ar1eLn50dycjJffvklY8aMQavVkp2dzfLlyxk3bhwvvPACAO3ataNfv36EhIQwb968R75OIYQwRemZOUUSN4ALf8Wx5quDaPKzMDMzo2fPnvj5+aHRaIwUqRBVW4mGTRVFwcrK6r7nk5OTS3SLuJlZiafgGYiIiMDe3p7OnTurx9zd3fHy8iIiIsKgXM+ePQ1iDQwMJC0tjaioKKBgWDUjI4P+/furZbRaLb179zaoSwghKrrUjOwiiZu9eRqeNn+hyc/Cpro9eqf2tPJuL4mbEEZUop63Fi1acODAAZ577rki53Jzc9mxYwdt2rR57ODu59dff8Xb25u8vDzatGnD66+/TocOHdTzsbGxuLm5FfnPxd3dXd22KzMzkytXruDu7l6kjEajITY2Fl9fX7X83eWaNGnCmjVryMrKemAi+yCKopCZmYlOpwNQ/xbGIe1gOqQtjCM9M6fosTxbdPlW6PKsCRw2lH+v/o1baVmYI7volBf5PpgOU2mDEiVvL730EpMnT+a9995T5zzcvHmTw4cP8+WXXxIbG8vcuXNLNdBCHTp0YNCgQTRu3Jjr168TEhLCiy++yDfffIOPjw9QsGXXvZYxcXBwUIdi09PTgYIh2DtptVqsra1JTU1V69JqtUX25LO3t0dRFFJTU0ucvOn1eqKjo9XH8fHxJapHlC5pB9MhbVG+nOs0AcDOPJ30PFtAg4IZf95uRj7mODnaApCaoSPp70tGjLRqku+DKFSi5K1r164sXLiQBQsWqDctzJw5E0VRsLW1ZfHixQY9YaVp6tSpBo+7detGUFAQn3/+OcHBwWXymmXFwsKCpk2botPpiI+Pp3HjxlhbWxs7rCpL2sF0SFsYx9WbWfjUvom5LpG/s+pwJadgsfV8zGnTzIW8vIKbyBxsralZz8uYoVYp8n0wHYVtYWwlXqR38ODB9OnTh0OHDpGQkEB+fj4NGzbE398fW1vb0ozxgWxsbOjatavBLev29vZcvXq1SNnU1FQcHByAfxYYLuyBK5STk4NOp1PL2dvbk5OTQ3Z2tkHvW1paGhqNRi1XEhqNBhsbG/WxtbW1wWNhHNIOpkPaovwkJSWx48cNmOtuAGCmyVfPtWnmwsAu7mRk5uDj6YKTvRU2NrL1VXmT74Mo9Fg7LNjY2NC7d+/SiqXUuLu7ExkZiaIoBvPe4uLi8PDwAApir1u3rjqn7c4yiqKoc9wK/46LizPYOSI2NpZ69eqVeMhUCCHKW3pmDqkZ2dzW6alubYGDrSW21hZERUWxc+fOgvU6zbTUaepLYJsW5Ojz0VqY8WfCLcIj4/FtWYepI3ywk8RNCKMqUfJ2+fLlYpWrV69eSap/JJmZmezfv99gL72AgAA+//xzIiMj1TXo4uLiOHv2LBMmTDAot2/fPmbOnImFhQUAYWFh2Nvbq/Pn2rZti62tLTt37lSTN71ez+7duwkICCjz6xNCiNJwz/XbmjniYX+FmAsFa7e5u7sT0KMfITsusD3k6D/lPF2YPLQ1djZaSdyEMAElSt569OhRrNvE75yMXxw6nY4DBw4A8Pfff5ORkUF4eDgATz75JLGxsaxcuZLevXtTv359dYuWpKQkPvvsM7UeHx8f/P39eeutt5g1axaWlpZ88skneHp60qdPH7Xc+PHjCQ0N5c0332TUqFGcP3+ekJAQpk+fri4fYmlpyaRJk1i6dCnOzs54eHiwbt06UlJSDBbyFUIIU3UzTcflpAz6+jZmgL87fybcYltEDNExVzCzvYC5mRk9evSgU6dOaDQaZo52IDUjm4xMPRZm+Tg72uBkL8N1QpiKEiVvCxYsKJK85eXl8ffff/Pjjz/i7Ox8z2VEHubmzZu8/vrrBscKH3/99dfUqVMHvV7PJ598QkpKCtbW1vj4+DB//nxat25t8LxPP/2UhQsXMnfuXHJzc/H39+edd95Rd1cAaNSoESEhISxatIiXXnoJZ2dnpk6dyrhx4wzqmjhxIoqisGrVKpKTk/Hy8iIkJER2VxBCmLykFB1Lv48i6vw/PW5tmrkwc3R7/vvtcWIzXXn9WT/atfFUzxf2sGVmZhIdHU3dmnJzghCmpETJ29ChQ+97buLEiYwYMaLIjQDF0aBBA86dO/fAMiEhIcWqy87OjgULFrBgwYIHlmvbtq16x+z9aDQaJk2axKRJk4r12kIIYQrUHRP+L3Gz0OhpbH2Rv2Jvsw0YGNCEDXvzsLavadxAhRCPpHS2NLiDjY0NQ4cO5auvvirtqoUQQjyCO3dMcKiWSovqf+JQLZ3GVomcunCd5o2cALDSPta9a0KIclYm39j8/Hxu3LhRFlULIYQopts6PRryaWB5mdqWBf8nZ+ZZE6NrBGjI0efTppkL1pbmxg1UCPFISjV5y8jI4NixY4SEhNCiRYvSrFoIIcQj0mel41X9AjbmBVv6XMuuyaXseij/N+hia2PByF4e2ModpEJUKCVK3po3b37fu00VRaFevXq89957jxWYEEKIB7vXum2FS3ncuHGDbZvWYmOuR59vTnxWQ1Jz/1lU3MfDBXMzqFOjuiz/IUQFU6Lk7dVXX71n8ubg4EDDhg3p3LmzwV2dQgghStc9123zdGHKCB9cHK2pUaMG7u7uZNzWcTGnEal/pRuUk3XbhKi4SpRhTZkypbTjEEIIUUyFd5FGxyUzopcHzRs5kaPPJzP9Jr/+nkhA28bY2WgZOnQo1apV43ZW7n176IQQFY90jwkhRAWTmpFN3N+p/OflznyzM5oNe89RR3udepZXwLoO3h7PYmejVRcblx42ISqXYiVvc+bMeeSKNRrNQ9dYE0II8egys/TMndCRNTui+eOvyzSzuYhDtYJh0eT0LJZvOcXMMU9KwiZEJVWs5O3o0aMPL3SX4myfJYQQ4tHZ2Wi5fktHXGwMT1S/iIVZLnmKhsSsBtzQO8P5m6RmZEvyJkQlVazk7aeffirrOIQQQhRTVraeE78exKN6LACZeVbE6hqTlW+llrmt0xsrPCFEGZM5b0IIUcGkZ2Ry7VIMANdyanIp65+12wpVt7YwRmhCiHIgyZsQQlQwzk72ODd+ksQrt0hMLDpFxcfTBQdbSyNEJoQoDyVO3g4cOMBXX33F2bNnSU9PR1GUImWio6MfKzghhBCQnZ1NWFgYTZo0oXXr1jjYWnL9tiUDendEORjLqQv/rPXWppkLrw73lvluQlRiJUredu3axbRp02jatCmBgYGsW7eOoKAgFEXhp59+olGjRvTq1au0YxVCiCrn8uXLbNq0ieTkZM6fP4+npyd2NpZMGtqG5ZtP4dnIiUEB7uTo87G1saBuzerUcrIxdthCiDJUouRt+fLltG7dmu+++47U1FTWrVvHsGHD8PPz49KlS4wcOZIGDRqUdqxCCFFlKIpCZGQk+/btIz8/HwcHB4YOHYqlZcFwqIujNa8/01YW3xWiCipR8hYTE8Mbb7yBubm5ug1Wbm4uAA0aNGDUqFEEBwczePDgUgtUCCGqioyMDH788Uf++usvALy8vBgwYADW1tYG5WTxXSGqphIlb1ZWVlhYFNzJZG9vj1arJSnpnzkXNWvW5NKlS6UToRBCVCFZWVksX76cjIwMqlWrRt++fWnXrp2snSmEUJk9vEhRbm5uxMTEqI+9vLz48ccfyc3NJTs7m+3bt1O3bt1SC1IIIaoKKysrWrVqRa1atZg4cSLt27eXxE0IYaBEyVvv3r3Zt28fOTk5AEyePJlff/2VDh060LFjR44fP85LL71UqoEKIURldevWLVJSUtTHPXv2ZMKECdSqVct4QQkhTFaxh01//vlnAgICMDc3Z/z48YwfP1491717d7755ht2796Nubk5Xbt2pWPHjmUSsBBCVCZnzpxh+/bt1KpVixdeeAFzc3P1jxBC3Euxk7eXX34ZJycn+vfvz4ABA/Dx8TE43759e9q3b1/qAQohRGWQnplD2u1s8vIU8hWF9AwdZ078woU//wAK9oPOzs7GxkaW+RBCPFixk7d///vfhIaGsn79etatW0e9evUYMGAAAwYMoEmTJmUZoxBCVGhJKTqWbz5FH9/GbDsYy/mYBNytE7A2z0YBOjzpR/++vTAzK9FMFiFEFVPs/ylGjBjBN998w88//8zMmTNxcHDgyy+/JCgoiCFDhrB69WquXbtWlrEKIUSFk56Zw9Lvo2hU14FtETFcSTiLV/ULWJtnk5NvwfnbTTiaaMvtrFxjhyqEqCAe+de82rVrM27cODZv3szOnTt5+eWXyczMZPHixXTv3p3nn3+eTZs2kZGRURbxCiFEhXIrLYuo80k0b+TE6b+uU8MiGTONwi29PX/c9iQ9z46oc0mkZmQbO1QhRAXxWH30bm5uTJ06lV27drFhwwbGjBlDbGws77zzDv7+/qUVoxBCVFgZOj0AOfp8FMyI1TUiQVefGJ0beco/M1du/185IYR4mFKbYNGgQQNcXV2pU6cOiqKQnS2/RQohqra8vDyiTx2lrvYqWouC/26z861I0rsAhmu3Vbe2MEKEQoiKqEQ7LBS6ffs2e/bsITQ0lKNHj5Kbm0v9+vWZNGkSAwcOLK0YhRCiwklJSWHTpk1cunSJelZw+s+LtGnmwqkLSUXK+ni64GBraYQohRAV0SMnb3q9ngMHDhAaGsqBAwfIysrCwcGB4cOHM2DAANq1a1cWcQohRIXxxx9/EBoaSnZ2NpaWlrTp0I1jcfkM7OIOYJDA+Xi6MHWEj+xRKoQotmInb5GRkWzfvp09e/aQnp6OVqule/fuDBw4kICAAHWDeiGEqKpycnIIDw8nKioKKJhOMmzYMPRYYlb9GuZmGsb09+KFoBbc1ulxtLXE2cFKEjchxCMpdsb14osvYmZmhq+vLwMHDqR3797Y2tqWZWxCCFFhKIrCV199xZUrVwDo0qULXbt2VXdK6NS6HqkZ2dzW6bHSVqO2s40kbUKIEil28jZ79mwCAwNlrz0hhLgHjUZDu3bt2L9/P0OHDsXNzc3gvJ2NVpI1IUSpKHby9sILL5RhGEIIUfFkZmaSnp5O7dq1AWjbti1PPPEEVlZWRo5MCFGZyUQ1IYQogfj4eDZv3oyZmRmTJ0/GysoKjUYjiZsQosxJ8iaEEI8gPz+fAwcOcPDgQRRFoUaNGty+fVuSNiFEuZHkTQghiik1NZXNmzdz8eJFALy9venfvz9arcxlE0KUH0nehBCiGKKjo9m2bRtZWVlotVqCgoJo1aqVscMSQlRBkrwJIcRDKIrC6dOnycrKon79+gwbNgwnJydjhyWEqKKKlbwtW7bskSvWaDS8+uqrj/w8IYQwNRqNhoEDB1K3bl06d+6srt0mhBDGIMmbEELcRVEUfvvtN/7++28GDhyIRqPB2tqagIAAY4cmhBDFS97+/PPPso5DCCFMgk6nIzQ0lOjoaABatGhBs2bNjByVEEL8Q+a8CSGqrPTMHHXLqurWFmSkXGfnjm2kpaVhZmZGr169aNq0qbHDFEIIA5K8CSGqpKQUHUs3RBF1LglQqKu9Rj2rq2gAZ2dnhg0bRr169YwdphBCFFHi5O3PP//k22+/5ezZs6Snp5Ofn29wXqPRsHfv3scOUAghSlt6Zs4diRu4WSdQwyIFgHzrujw7ZhQ1HO2MGKEQQtyfWUmedPToUZ5++mn2799PrVq1SExMxNXVlVq1anH58mVsbGzo0KFDaccqhBClIjUjW03cAG7k1CBXMSNW15AT12qjyzFicEII8RAlSt6WLFmCq6sr4eHhLFiwAIBJkyaxbt061q9fz7Vr1+jXr1+pBiqEEKUlLV1HdfPb6uP0PDvOpLcgWe8MwG2d3lihCSHEQ5UoeTt79izDhw/H1tZWXe+ocNi0TZs2jBw5ks8++6z0ohRCiFKSlJTEvp0/4GETg6VZtno8745ZJNWtLYwRmhBCFEuJ5ryZm5tTvXp1AOzt7alWrRo3b95Uz7u6uhITE1M6EQohRClQFIWoqCh27txJbm4uZuZaLDR6srE0KOfj6YKDreV9ahFCCOMrUc9bw4YNiY+PBwpuTHB3dze4OWH//v3UrFmzVAIUQojHlZWVxaZNmwgNDSU3Nxd3d3deHDeBZk3dDMr5eLowdYQPdjay0bwQwnSVqOeta9eubNq0iTfffJNq1arx4osvMmfOHPr06QPAxYsXeeONN0o1UCGEKInExEQ2bdpEamoqZmZm9OjRg06dOqHRaJg52sFgnTcHW0tJ3IQQJq9Eydsrr7zC2LFj1fluQ4YMwczMjN27d2Nubs7kyZMZOnRoqQYqhBAl8eeff5KamoqTkxPDhg2jfv366jk7G60ka0KICqdEyZuFhQVOTk4GxwYNGsSgQYNKJSghhCgtPXr0oFq1anTq1AlLS5nLJoSo+Eo0500IIUzV+fPnWbduHXl5eUDBDVbdu3eXxE0IUWmUqOdt7NixDy2j0WhYs2ZNSaoXokK7e79MmUdVPnJzc9mzZw+//vorAMeOHaNjx45GjkoIIUpfiZI3RVGKHMvPz+fy5ctcuXKFRo0aUatWrccOToiKxnC/zAI+ni5MGeGDi6O1ESOr3G7cuMGmTZu4evUqAL6+vrRv397IUQkhRNkoUfL2zTff3Pfczz//zLvvvsucOXNKHJQQFdHd+2UWijqXxNINUcwc3V564EqZoiicPHmSnTt3otfrsbGxYdCgQXh4eBg7NCGEKDOlPuete/fuDBw4UN02S4iq4u79Mu8UdS6J1Izse54TJXfgwAG2bduGXq/Hzc2NyZMnS+ImhKj0yuSGhYYNG3LmzJmyqFoIk/Ww/TBlv8zS16pVK6ysrOjRowejR4/Gzs7O2CEJIUSZK9Gw6YPk5uayc+fOIkuJCFHZPWw/TNkv8/EpisLFixdp1KgRADVq1OD111/HysrKyJEJIUT5KVHydr/5bOnp6Zw8eZIbN24we/bsR643ISGBkJAQTp06xYULF3B3d2f79u1Fyv3www+sXLmSy5cv4+bmxvTp0+nevXuRWBYuXMjevXvR6/V06dKFd955p8iNFCdOnGDx4sVER0dTo0YNRo0axcSJE9FoNGoZRVEIDg7mu+++Izk5GS8vL+bMmYO3t/cjX6OovBxsLfHxdLnn0Knsl/n40tPT2bp1K7GxsTz//PM0btwYQBI3IUSVU6Lk7ejRo0WOaTQaHBwcaNeuHU8//TT+/v6PXO+FCxc4cOAAbdq0IT8//553te7YsYN3332XyZMn07FjR8LCwnjttddYu3atQTI1bdo0/vrrL+bNm4elpSWffvopEydOZNOmTVSrVnDZCQkJjB8/ns6dOzNt2jTOnTvHhx9+iLm5OePHj1frCg4OZsmSJcyYMQNPT0/Wrl3LuHHj+PHHH3F1dX3k6xSVk52NlikjfO55t6nsl/l4Lly4wNatW8nMzKRatWqkp6cbOyQhhDCaEiVvP/30U2nHARSshN6rVy8AZs+eze+//16kzJIlS3jqqaeYNm0aAB07duT8+fP873//Izg4GICoqCh++eUXQkJC1CTSzc2NwMBAdu/eTWBgIAAhISE4OTnx8ccfo9Vq8fPzIzk5mS+//JIxY8ag1WrJzs5m+fLljBs3jhdeeAGAdu3a0a9fP0JCQpg3b16ZvBeiYnJxtGbm6Payzlspyc3NZdeuXRw5cgSA2rVrM2zYMFxcXIwcmRBCGE+JbljYunUrly5duu/5S5cusXXr1kcPxuzB4SQmJhIfH0///v0NjgcGBhIZGUlOTg4AERER2Nvb07lzZ7WMu7s7Xl5eREREqMciIiLo2bMnWq3WoK60tDSioqKAgmHVjIwMg9fUarX07t3boC4hCtnZaGlQyw7PRs40qGUniVsJZWRk8N1336mJW4cOHZgwYYIkbkKIKq9EyducOXPU5OZeTp8+XSbrvMXGxgIFvWh3atKkCXq9nsTERLWcm5ubwbw1KEjgCuvIzMzkypUruLu7Fymj0WjUcoV/312uSZMmXL58maysrFK6OiHEnZKTk7l27RrW1taMHDmSwMBAdcqDEEJUZaW2w8KdMjMzMTc3L1FAD5KamgqAvb29wfHCx4Xn09LS7rlkgIODgzoUWzhn5u66tFot1tbWBnVptdoi+yLa29ujKAqpqaklnjCtKAqZmZnodDoA9W9hHNIOpkOn0+Hq6oqNjQ3e3t7Y2dmRmZlp7LCqHPlOmAZpB9NhKm1Q7OTtzz//5M8//1QfHz9+XN34+U5paWmsX7++SO+YKEqv1xMdHa0+jo+PN14wQiXtYBwpKSlER0fTrl07tFotGo2GmjVrPnCKhigf8p0wDdIOolCxk7e9e/eybNkyoODO0u+//57vv//+nmXt7e1ZvHhx6UR4BwcHB6Cg1+zOeS9paWkG5+3t7dU9Du+Umpqqlinsmbv7rrWcnBx0Op1BXTk5OWRnZxv0vqWlpal32JaUhYUFTZs2RafTER8fT+PGjbG2lv0vjUXawTgUReH48eMcPnyY/Px8rl27RpcuXaQtTIB8J0yDtIPpKGwLYyt28jZixAi6deuGoig8/fTTTJ06lYCAAIMyGo0Ga2trGjZsWCZzUwrnncXGxhrMQYuNjcXCwkJdtsPd3Z3IyEgURTGY9xYXF6dunWNjY0PdunXVOW13llEURa2/8O+4uDiaN29u8Jr16tV7rDWmNBoNNjY26mNra2uDx8I4pB3KT0ZGBj/++CN//fUXAF5eXvTt21edmiFtYRqkHUyDtIMoVOwMq1atWuoCt19//TVNmzbF2dm5zAK7F1dXVxo3bkx4eLi6pAhAWFgYfn5+6l2jAQEBfP7550RGRtKpUyegIPk6e/YsEyZMUJ8XEBDAvn37mDlzJhYWFmpd9vb2+Pj4ANC2bVtsbW3ZuXOnmrzp9Xp2795dJHkVQhRfTEwMW7Zs4fbt21SrVo2+ffvSrl07NBqNzG8TQogHKFH3mIeHB1evXr1v8nbu3Dnq1KnzyEOKOp2OAwcOAPD333+TkZFBeHg4AE8++STOzs5MmTKFGTNm0LBhQ3x9fQkLC+P06dN8++23aj0+Pj74+/vz1ltvMWvWLCwtLfnkk0/w9PSkT58+arnx48cTGhrKm2++yahRozh//jwhISFMnz5dTQQtLS2ZNGkSS5cuxdnZGQ8PD9atW0dKSorBQr5CiOI7c+YMmzdvBgp+MRw2bFiR3U+EEELcW4mSt4ULFxIXF8eGDRvuef69997D3d2dBQsWPFK9N2/e5PXXXzc4Vvj466+/xtfXl6CgIHQ6HcHBwaxYsQI3NzeWLVum9pQV+vTTT1m4cCFz584lNzcXf39/3nnnHYPh3EaNGhESEsKiRYt46aWXcHZ2ZurUqYwbN86grokTJ6IoCqtWrVK3xwoJCZHdFYQooaZNm+Lg4ECzZs3o06eP2vMthBDi4TTKw9b9uIeuXbsyatQoJk+efM/zy5cvZ/369fz888+PHWBldebMGQBatWpFZmYm0dHReHl5yXwGI5J2KFsJCQk0bNhQnYeq0+nuO/la2sI0SDuYBmkH01HYFlqtllatWhktjhIt0pucnIyTk9N9zzs6OnLz5s0SByWEqDxycnLYunUrX331lcHi3nLXnBBClEyJhk1dXFw4e/bsfc//8ccf5X4zgxDC9Fy5coVNmzZx8+ZNuRFBCCFKSYmSt169evHdd98REBBAz549Dc7t3buXzZs388wzz5RKgEKIikdRFI4ePcrevXvJy8vD3t6eoUOH0qhRI2OHJoQQFV6JkrcpU6YQGRnJa6+9RvPmzWnWrBkAFy5c4M8//6RJkyZMnTq1VAMVQlQMt2/f5scff+TChQsAeHp6MnDgQJmrI4QQpaREyZudnR3ff/89K1euZM+ePezatQuAhg0b8sorrzB+/Hj5j1qIKurGjRtcuHABc3Nz+vbtS/v27Q0WyxZCCPF4SrwNgo2NDVOnTr1vD9udW1EJIaqORo0aERgYSMOGDaldu7axwxFCiEqnRHeb3k9OTg47d+7klVdewd/fvzSrFkKYqJSUFL755huDO8w7dOggiZsQQpSRx96AVFEUIiMjCQ0NZc+ePWRkZODs7ExQUFBpxCeEMGF//PEHoaGhZGdns2PHDsaOHWvskIQQotIrcfL2+++/Exoayo4dO7hx4wYajYbAwEBGjx6Nt7e3zHERohLLyckhPDxcXbetQYMGDBw40MhRCSFE1fBIyVtiYiLbtm0jNDSUhIQEateuzYABA2jdujXTp0+nb9++RbapEkJULteuXWPjxo3cuHEDgC5dutC1a1fMzc2NHJkQQlQNxU7eRo4cyenTp3FycqJv3768//77tG/fHoCLFy+WWYBCCNORmJjImjVryMvLw9bWlqFDh+Lm5mbssIQQokopdvJ26tQpGjRowOzZs+nWrZvBBu9CiKqhXr161KlTh+rVqzNo0CBZEkgIIYyg2BnYu+++y/bt23nttddwcHCgb9++BAYG4uvrW5bxCSGM7NKlS9StWxdzc3PMzc0ZPXo0lpaWMq9VCCGMpNjJ23PPPcdzzz1HYmIioaGhbN++nQ0bNlCzZk18fX3RaDTyn7kQlUh+fj779+/n4MGDdOrUid69ewNgZWVl5MiEEKJqe+SxT1dXV1555RVeeeUV9Y7TsLAwFEVh/vz5RERE0KNHDzp16oSlpWVZxCyEKGMpKSls3ryZxMREAHQ6HYqiyC9oQghhAh5r4lrLli1p2bIls2bN4siRI2zbto2wsDB++OEHrK2t1WUEhBAVx9mzZwkNDSUrKwtLS0uCgoJo2bKlscMSQgjxf0rlrgMzMzM6depEp06dmD9/Pvv27SM0NLQ0qhZClBO9Xk94eDgnTpwAoH79+gwbNgwnJycjRyaEEOJOpX7LqKWlJYGBgQQGBpZ21UKIMpSens7vv/8OQOfOnenevXulX7stPTOH1Ixsbuv0VLe2wMHWEjsbrbHDEkKIB5L1PoQQADg7OzNo0CCsrKxwd3c3djhlLilFx9INUUSdS1KP+Xi6MGWEDy6O1kaMTAghHqxUN6YXQlQcOp2OH374gbi4OPVYixYtqkTilp6ZUyRxA4g6l8TSDVGkZ+YYKTIhhHg4Sd6EqIISEhL48ssvOXv2LD/++CN5eXnGDqlcpWZkF0ncCkWdSyI1I7ucIxJCiOKTYVMhqpD8/HwOHjzIgQMHUBQFZ2dnhg0bVunntt3ttk7/WOeFEMKYJHkToopIS0tj8+bNJCQkANC6dWsCAwOr5HqM1a0tHuu8EEIYkyRvQlQBqampLF++HJ1Oh1arJTAwkDZt2hg7LKNxsLXEx9PlnkOnPp4uONhWvYRWCFFxyJw3IaoAe3t7mjRpQt26dZk0aVKVTtwA7Gy0TBnhg4+ni8FxH08Xpo7wkeVChBAmTXrehKikkpKSqF69OjY2Nmg0GgYMGKBuLi/AxdGamaPbyzpvQogKR5I3ISoZRVE4ceIE4eHhNG3alBEjRqDRaNBqJSm5m52NVpI1IUSFI8mbEJVIVlYWoaGhnD17FoCcnBz0er0kbkIIUYlI8ibEHRyda3EjLRddUnKFG0ZLTExk06ZNpKamYmZmRo8ePejUqRMajcbYoQkhhChFkrwJ8X8yshS+2p3IyfMn1GMVYbuk/Px8fvnlF/bv34+iKDg5OTFs2DDq169v7NCEEEKUAbnbVAgKtktatvEUJ89XvO2ScnJyOHHiBIqi0KpVKyZNmiSJmxBCVGLS8yYExdsuyVSHT62srBg2bBg3b96kTZs2MkwqhBCVnCRvQlCxtkvKzc1l79691KpVi7Zt2wLg6uqKq6urkSMTQghRHiR5E4KKs13SjRs32LRpE1evXsXCwgJPT0+qV69u7LCEEEKUI0nehMD0t0tSFIWTJ0+yc+dO9Ho9NjY2DBo0SBI3IYSogiR5E4KCxVpfG96GZT+cIuqOmxZMYbukrKwsduzYwe+//w6Am5sbQ4YMwc7OzmgxCSGEMB5J3oT4P7ZWGp7v48qEQS3RZeeaxDpver2e4OBgkpOT0Wg0dPYPoFkLHy4n66muSzd6fEIIIcqfJG9C3CEl+TpeXjWwsbE3digAWFhY0LJlS06fPk2PPkH8cPAan+7Yr56vCOvQCSGEKF2yzpsQJiY9PZ1bt26pj7t27cpzY1/kh4PXiszJqwjr0AkhhChdkrwJYUIuXLjAl19+yYYNG8jNzQXAzMyMLL3moevQCSGEqBpk2FQIE5Cbm8u+ffs4cuQIAHZ2dmRmZmJvXzB8W5HWoRNCCFG2JHkTwshu3rzJpk2buHLlCgBPPvkkvXv3plq1f76eFWUdOiGEEGVPkjchjOjUqVOEhYWRk5ODtbU1gwYNwtPTs0g5U1+HTgghRPmROW9CGEl+fj7Hjx8nJyeHRo0aMXny5HsmblCwDt2UET74eLoYHDeFdeiEEEKUL+l5E8JIzMzMGDZsGGfOnKFz586YmT34dykXR2tmjm5PakY2t3V6k1iHTgghRPmT5E2IcqIoCpGRkeh0Onr27AmAo6MjXbp0KXYddjZaSdaEEKKKk+RNiHKQkZHB1q1biYmJAcDLy4t69eoZOSohhBAVkSRvQpSxmJgYtmzZwu3bt6lWrRp9+/albt26xg5LCCFEBSXJmxBlJC8vj59++onDhw8DUKtWLYYNG0atWrWMHJkQQoiKTJI3IcqAoiisXbuWuLg4ANq3b0+fPn2wsJD12IQQQjweSd6EKAMajQYfHx+uXLnCwIED8fLyMnZIQgghKglJ3oRJSM/MqfBLYOTk5HDr1i1q164NQKtWrWjSpAk2NjZGjkwIIURlIsmbMLqkFB1LN0QZ7B7g4+nClBE+uDhaGzGy4rty5QobN24kJyeHyZMnU716dQBJ3IQQQpQ62WFBGFV6Zk6RxA0g6lwSSzdEkZ6ZY6TIikdRFI4cOcLKlStJTk7GzMyMtLQ0Y4clhBCiEpOeN2FUqRnZ99yvEwoSuNSMbJMdPr19+zY//vgjFy5cAKB58+YMHDgQa+uK0VsohBCiYpLkTRjVbZ3+sc4bS2xsLFu2bCEjIwNzc3P69u1L+/bt0Wg0xg5NCCFEJSfJmzCq6tYPXjrjYeeN5eTJk2RkZODi4sKwYcPUmxSEEEKIsibJmzAqB1tLfDxd7jl06uPpgoOtpRGierinnnoKBwcHAgICZO02IYQQ5UpuWBBGZWejZcoIH3w8XQyO+3i6MHWEj8nMd/v999/ZsmULiqIAYGlpSc+ePSVxE0IIUe4qXM/b5s2bmTNnTpHjEydOZMaMGerjH374gZUrV3L58mXc3NyYPn063bt3N3hOeno6CxcuZO/evej1erp06cI777xTZPuiEydOsHjxYqKjo6lRowajRo1i4sSJMr+plLg4WjNzdHuTXOctJyeHnTt3cvLkSQCaNWtGy5YtjRuUEEKIKq3CJW+FVq5ciZ2dnfr4zjlHO3bs4N1332Xy5Ml07NiRsLAwXnvtNdauXYu3t7dabtq0afz111/MmzcPS0tLPv30UyZOnMimTZuoVq3grUlISGD8+PF07tyZadOmce7cOT788EPMzc0ZP358uV1vZWdnozWJZO1OV69eZePGjdy8eROALl260KJFCyNHJYQQoqqrsMnbE088gbOz8z3PLVmyhKeeeopp06YB0LFjR86fP8///vc/goODAYiKiuKXX34hJCQEf39/ANzc3AgMDGT37t0EBgYCEBISgpOTEx9//DFarRY/Pz+Sk5P58ssvGTNmDFqtaSUc4vEpisLRo0fZs2cPeXl52NnZMWTIENzc3IwdmhBCCFH55rwlJiYSHx9P//79DY4HBgYSGRlJTk7Boq8RERHY29vTuXNntYy7uzteXl5ERESoxyIiIujZs6dBkhYYGEhaWhpRUVFlfDXCGPbt20d4eDh5eXl4eHgwefJkSdyEEEKYjArb8xYUFMStW7eoV68eI0aMYMKECZibmxMbGwtQ5IdtkyZN0Ov1JCYm0qRJE2JjY3Fzcysyb83d3V2tIzMzkytXruDu7l6kjEajITY2Fl9f3xJfg6IoZGZmotPpANS/hXEUvv/u7u78/vvvBAQE4OPjAxR8FkT5ke+EaZB2MA3SDqbDVNqgwiVvLi4uTJkyhTZt2qDRaPjpp5/49NNPuXbtGnPnziU1NRUAe3t7g+cVPi48n5aWZjBnrpCDgwO///47UHBDw73q0mq1WFtbq3WVlF6vJzo6Wn0cHx//WPWJksnPzyctLQ1HR0cAsrOz6d69O1qtlj///NO4wVVx8p0wDdIOpkHaQRSqcMlbly5d6NKli/rY398fS0tL1qxZw+TJk40Y2aOzsLCgadOm6HQ64uPjady4sWytVM5SU1PZsWMH165d4+mnnyY9PV3awQTId8I0SDuYBmkH01HYFsZW4ZK3e+nfvz+rVq0iOjoaBwcHoKDXzMXln7XDCjcLLzxvb2/P1atXi9SVmpqqlinsmSvsgSuUk5ODTqdTy5WURqPBxsZGfWxtbW3wWJSts2fPEhoaSlZWFlqtJUm3MrGv0YBMvQVa62omd/drVSTfCdMg7WAapB1EoUqRvN2pcH5abGyswVy12NhYLCwscHV1VctFRkaiKIrBvLe4uDg8PDwAsLGxoW7duuocuDvLKIpSZC6cqBj0ej3h4eGcOHECgNp16nI5z51FGxKABKBgkeApI3xwcZTfcoUQQpiWSnG3aVhYGObm5rRo0QJXV1caN25MeHh4kTJ+fn7qXaMBAQGkpqYSGRmplomLi+Ps2bMEBASoxwICAti3bx96vd6gLnt7e3Uyu6g4rl+/TnBwsJq4dfD14zItiIq5bVAu6lwSSzdEkZ6ZY4wwK7T0zBwuXU/nXEIyl66ny3sohBClrML1vI0fPx5fX188PT2BgmUdNmzYwNixY9Vh0ilTpjBjxgwaNmyIr68vYWFhnD59mm+//Vatx8fHB39/f9566y1mzZqFpaUln3zyCZ6envTp08fg9UJDQ3nzzTcZNWoU58+fJyQkhOnTp8sabxVQdHQ0SUlJ2NraMmTIELS2Lnyx56d7lo06l0RqRrYMnz6CpBQdSzdEGexVK72YQghRuipc8ubm5samTZu4evUq+fn5NG7cmLfeeosxY8aoZYKCgtDpdAQHB7NixQrc3NxYtmxZkZ6yTz/9lIULFzJ37lxyc3Px9/fnnXfeUXdXAGjUqBEhISEsWrSIl156CWdnZ6ZOncq4cePK7ZpF6enSpQu5ubl07NiR6tWrcy4h+YHlb+v0Dzwv/pGemVMkcYN/ejFnjm4vibAQQpSCCpe8vfPOO8Uq9/TTT/P0008/sIydnR0LFixgwYIFDyzXtm1bNmzYUOwYhelISEjg8OHDPP3001SrVg0zMzN69uypnq9u/eCN5R92vqJLz8wptT1lUzOyiyRuhaQXUwghSk+FS96EKI78/HwiIiKIiIhAURQOHTpE165di5RzsLXEx9PlnkmHj6cLDraW5RGuUZT2EOfDeimlF1MIIUpHpbhhQYg7paamsmbNGg4cOICiKLRp0wY/P797lrWz0TJlhA8+ni4Gx308XZg6wqfS9hQ9bIizJDcZVPVeTCGEKC/S8yYqlejoaLZt2/Z/a7dpeeqpp2jduvUDn+PiaM3M0e25lZZFaoYOB1trnOytKm3iBmUzxFmVezGFEKI8SfImKo0jR46wa9cuAOrVq8ewYcNwdnYu1nPtbLSYk0vS35eoWc8Lm/skLqU5R8yYbuv0WGnNGRjQhOaNnMjR56O1MOPPhFtsi4gp0RBnYS/mvYZiK3MvphBClDdJ3kSl0bx5cw4cOEDbtm3p0aMH5ubmpVp/ZVoGw9bGgpmj27PtYCwb9p5Xj7dp5sLM0e2xtSnZEGdhL2ZlSHCFEMJUyZw3UWEpisKlS5fUx46OjkyZMoXevXuXeuJWFnPEjMnKshrbDsZy6oLh9Zy6kMS2g7FYWZb89zo7Gy0Natnh2ciZBrXsJHETQohSJsmbqJCysrLYuHEjISEhXLhwQT1eVvv+FWeOWEWiy8otkrgVOnUhCV1WbjlHJIQQorhk2FRUOImJiWzatInU1FTMzMxISUkp89esbMtgVLbrEUKIqkSSN1Fh5Ofn88svv7B//34URcHJyYlhw4ZRv379Mn/tyrYMRmW7HiGEqEokeRMVQlpaGlu2bCE+Ph6AVq1a8dRTT2FpWT7LT1S2ZTAq2/UIIURVInPeRIVw8eJF4uPjsbCwYNCgQQwZMqTcEjeofIv5VrbrEUKIqkR63kSF0LJlS27dukWLFi2oUaOGUWKobMtgVLbrEUKIqkKSN2GSbty4QXh4OEOGDKF69eoAdOnSxchRFfRYVabkprJdjxBCVAUybCpMiqIoREVFsWLFCmJiYtQdE4QQQghRQHrehMnIyspi+/bt/PHHHwC4ubnRu3dvI0clhBBCmBZJ3oRJuHTpEps2bSIlJQUzMzO6d+9O586d0Wg0xg7tkVWW/U+FEEKYJknehNGdP3+e9evXoygKjo6ODBs2jAYNGhg7rBKpTPufCiGEME2SvIky8Si9T40aNcLJyYm6desSFBSElZVVOUdbOh62/+nM0e2lB04IIcRjk+RNlLri9D79/fff1KtXD41Gg6WlJePHj8fa2rpCDpMWKs7+p5K8CSGEeFxyt6koVQ/rfbqVlsmuXbtYuXIlv/76q3rexsamQiduIPuFCiGEKB/S8yZK1YN6n85eSGTtN6e4eeN6QdnU1PIMrczJfqFCCCHKgyRvolTdu3dJoYbFLRpaXeLmjXysra0ZNGgQnp6e5R5fWZL9QoUQQpQHGTYVperu3iUz8nCzuoib9UXMNfnUrdeAyZMnV7rEDWS/UCGEEOVDet7EI3vQnaR39z5Zm2XhbHELRQHFrgkjRw3H3rZi3k1aHLJfqBBCiLImyZt4JA+7k7Sw96mwzO386iRkNcC1QV2mju6OQyVO3ArJfqFCCCHKkiRvlVBZrfBfnHXMNPk57Avfzgt9/XlpcCvpfRJCCCFKmSRvlUxZrvD/sHXM/og+xy8/7+L27dukp6czYcKECr/8hxBCCGFq5IaFSuRhPWPpmTmPXN+l6+mcS0jm0vV0MjLvvU6ZhnwaWF5m1/bN3L59m1q1ajF48GBJ3IQQQogyID1vlUhprvB/rx689yd3KlLOUpONu00C1c0zAWjfvj19+vTBwkLWNBNCCCHKgiRvlUhprfB/vx6803/doE0zF05dKLyTVEfz6hcw1+SjaKoxaNAgfNq0LFHsZTVPTwghhKhsJHmrREprhf/79eBti4hh5uj2mJkV9OTp8q24nWeDnU01nh/9DG6utUsUd1nO0xNCCCEqG0neKpHSWuH/fj10WTl5LF0bwfxXeql3klYz60xNJ7sSLwFSnDtYpQdOCCGE+IfcsFCJlNYK//fuoVOorb2Ou/ZPfjt6kAa17PBs5EwTV5fHWrutOPP0hBBCCPEP6XmrZEpjhf+7e/CqafQ0tkrE0SINgOysTPLz8zEze/zcv7Tm6QkhhBBVhSRvldDjrvB/5y4Jf/0Vi5t1AlqzXBTM6Na9J127+JXaMiClNU9PCCGEqCokeRP35GynpWPDDMyvxADg6FSDAYMG496oQam+TmnN0xNCCCGqCpnzJu7p9u3bnDkVBUDbtm155eVJpZ64QenN0xNCCCGqCul5q0RKc600e3t7Bg0aRH5+Pi1atCjlSA2Vxjw9IYQQoqqQ5K2SeNy10nJycti5cydeXl54eHgA0Lx58zKL926PO09PCCGEqCpk2LQSeNw9Ta9evcqKFSs4efIk27ZtQ6+XOzyFEEIIUyXJWyVQ0rXSFEXh6NGjrFy5kps3b2JnZ8fw4cNlX1IhhKgkNm/eTPv27Y0dhihlkrxVAiVZKy0zM5P169cTHh5OXl4eHh4eTJ48mcaNG5dRlEIIUX5mz56Np6cnnp6ePPHEE/To0YMPPviA7GxZ+Ls4jh49ypAhQ2jZsiW9e/dm8+bND31OWFgYgwYNok2bNnTv3p2VK1eWqN5r164xY8YMfH19ad26NQMGDODMmTPq+du3b/Pvf/+bgIAAWrduTWBgIOvWrXu8C65gZM5bJfCoa6VlZmby5Zdfkp6ejrm5OX369KFDhw6ltnZbVVWaN4wIIR5fly5dWLhwIbm5ufzxxx/MmjULjUbDzJkzjR3aI8nLyyM/P7/cXi8xMZFJkybxzDPP8OGHHxIZGck777yDi4sLXbp0uedzDhw4wMyZM3nnnXfw9/cnJiaGd955BysrK0aPHl3selNTUxk1ahS+vr4EBwfj5OREQkICDg4O6mstWrSII0eO8N///pf69etz6NAh5s+fT61atejZs2fZv0EmQJK3SuBR10qzsbGhSZMmXLp0iWHDhlGnTp3yCrXSetwbRoQQpU+r1eLiUrAMUd26denUqROHDx9+4HPCw8P53//+R0JCAtbW1nh5efH5559jY2NDXl4eH3zwAZs2bcLc3Jxhw4Zx8+ZN0tPT+fzzzwHo0aMHY8eO5YUXXlDrHDRoEL169WLKlCkArF69ms2bN5OYmIiDgwPdu3dn5syZVK9eHSgY6lywYAGLFy/mo48+Ij4+no8//picnByWLl3K9u3bSU9Pp1mzZmoPVaHNmzezZMkSbt26hb+/P+3atXvk9239+vU0aNCA2bNnA9CkSRN+++03vvrqq/smb9u2baNnz56MGjUKAFdXVyZNmkRwcDDPPfccGo2mWPUGBwdTp04dFi5cqNbt6upq8FpRUVEMHjxYve6RI0fy/fffc/r06SqTvMmwaSVQnLXSUlJSyMjIUM/179+fiRMnSuJWCh73hhEhRNk7f/48UVFRD5zTe/36dd58802GDRtGWFgYX3/9Nb1790ZRFABWrVrFli1bWLBgAd999x2pqans2bPnkWPRaDS8/fbbbN++3aAX6U5ZWVkEBwfz/vvvs3HjRuzt7Vm0aBFRUVF88sknbNu2jX79+jFhwgTi4+MBOHXqFG+//TbPPfccW7duxdfXly+++MKg3kuXLuHp6cnRo0fvG9/Jkyfx8/MzOObv78/Jkyfv+5ycnBwsLQ07CqysrLh69Sp///13sev96aefaNmyJVOnTsXPz4/BgwezYcMGg+f4+Pjw008/ce3aNRRF4ciRI8TFxeHv73/f+Cob6XmrJB60VtrZs2fZtm0bDRo0UH8D0mplOK+0FOeGERk+FaL87d+/Hx8fH3Jzc8nJycHMzIx33333vuWTkpLIzc2ld+/e1K9fHwBPT0/1/Jo1a3jppZfo06cPAPPnz+eXX3555Lju7JVr0KAB06ZN47333mPevHnqcb1ez7x582jevDmZmZkcPHiQbdu28fPPP1O7dm0Axo8fz8GDB9m8eTNvvPEGX3/9NV26dGHixIkAuLm5ERUVxcGDB9V6LSwscHNzw9r6/iMCN27coGbNmgbHatasSUZGBllZWVhZWRV5jr+/PwsXLiQyMhJfX18SEhJYtWoVUPC+NmjQoFj1JiYmsm7dOl588UUmT57MmTNneP/997GwsGDIkCEAvPvuu7z77rsEBARQrVo1NBoN77//Ph06dCjGu185SPJWidy9Vpperyc0NJQTJ04AkJ2dTVZW1gO/tOLRleSGESFE2fP19WXevHnodDq++uorzM3N6du3LwDHjx9XkxwoSMSeeuop/Pz8GDBgAP7+/vj7+9O3b18cHBxIT08nKSmJNm3aqM+pVq0aLVu2VHvmiuvw4cMsX76c2NhYMjIyyMvLIzs7G51Op/7/bGFhYZA4JiYmkpeXR79+/QzqysnJwdHREYCYmBh69eplcN7b29sgeatduzbh4eGPFG9xjBgxgosXLzJp0iRyc3OxtbVl7NixLF26FDOz4g/yKYpCy5YteeONNwBo0aIFFy5cYP369Wry9s0333Dy5Em++OIL6tWrx/Hjx9U5b506dSr1azNFkrxVUteuXWPjxo3cuHEDKPitqFu3bpibmxs5ssrnUW8YEUKUD2traxo1agTAggULGDRoED/88ANPP/00LVu2ZOvWrWrZGjVqYG5uzurVqzlx4gSHDh3im2++4ZNPPmHDhg1qgvQw97rxKzc3V/33pUuXmDRpEqNGjWL69Ok4ODjw22+/8fbbb6PX69XkzcrKyqCurKwszM3N1fl2d7KxsSnuW1IsNWvWVH92FLpx4wa2trb37HUD1BtB3njjDW7cuIGTkxORkZHAP3PWilOvi4sLTZo0MSjj7u7Orl27gIL34ZNPPmHZsmV069YNKFhQPjo6mpCQkCqTvMmct0pGURSOHTtGcHCw+qUYM2YMPXv2lMStjBTeMHIv97phRAhR/szMzJg0aRKfffaZOkTXqFEj9Y+trS1QkIS0a9eOqVOnsnXrViwsLNi7dy92dna4uLhw6tQptc7Cu1jv5OzszPXr19XHGRkZXLp0SX38xx9/oCgKs2fPxtvbGzc3N4Py99O4cWPy8vJITk42iLtRo0bqTRlNmjTh9OnTBs+7M97i8vb25siRIwbHDh8+jLe390Ofa25uTu3atdFqtezYsQMfHx+cnZ2LXW/btm2Ji4szKBMfH68OY+fm5qLX64skyebm5o/cA1qRSfJWyeTm5nLkyBHy8vJo1qwZkydPxt3d3dhhVWrFuWFECGF8/fr1w8zMjLVr197z/KlTp/jyyy85c+YMly9fZvfu3SQnJ6v/h44dO5bg4GD27t1LTEwM8+fPJy0tzaCOjh07sm3bNo4fP865c+eYNWuWwbBho0aN0Ov1fPPNNyQmJrJ161bWr1//0Njr1q1LYGAg//rXv9i9ezeJiYmcPn2a5cuXs3//fgDGjBnDwYMHCQkJIT4+nm+//dZgyBQKRmX69etXJMm70zPPPENiYiIffPABMTExrF27lp07dxrM1fv22295/vnn1cfJycmsW7eOmJgYoqOjef/99wkPD+ett956pHqff/55tR0SEhIIDQ1lw4YNPPvsswDY2try5JNP8t///pejR4+SmJjI5s2b2bp1a5Eh48pMhk0rGQsLC4YPH05CQgK+vr6ydls5edANI0II01CtWjVGjx7NypUrGTVqVJHhRltbW44dO8aaNWvIyMigXr16zJ49m65duwIwbtw4kpKS1IRs2LBh9O7dm/T0dLWOSZMmqUOjdnZ2vP766wY9b82bN2fOnDkEBwfz8ccf0759e9544w1mzZr10PjnzZvHmjVrWLRoEdevX8fR0RFvb291+NDb25v/9//+H0uXLmXJkiX4+fnx8ssvq8uYQMFc6Li4OHQ63X1fx9XVleXLl7Nw4UK+/vpr6tSpw/vvv2+wTMitW7dITEw0eN7WrVv54IMPUBQFb29vvvnmG1q3bv1I9bZu3Zply5bx8ccf87///Y8GDRrw1ltvMXDgQLXMxx9/zMcff8yMGTNITU2lXr16TJ8+XV2mpCrQKFWpn9GEFK4W3apVKzIzM4mOjsbLy6vU5y6Utsq8EG1FaofKTtrCNEg7PNzs2bNJS0szSJBKm7SD6ShsC61WS6tWrYwWh/S8iWKThWiFEEII45M5b6JYZCFaIYQQwjRIz5soFlmIVgghilq0aJGxQxBVkPS8iWKRhWiFEEII0yDJmygWWYhWCCGEMA2SvIlikYVohRBCCNMgyZsoFlmIVgghhDANcsNCMcXExPD+++8TFRVF9erVGTRoENOmTUOrrTpJiyxEK4QQQhifJG/FkJqayvPPP0/jxo1ZunQp165dY9GiRWRlZTF37lxjh1eu7Gy0kqwJIYQQRiTJWzGsX7+e27dvs2zZMhwdHQHIy8tj/vz5TJo0idq1axs3QCGEEEJUGTLnrRgiIiLw8/NTEzeA/v37k5+fz6FDh4wXmBBCCCGqHOl5K4bY2FiGDRtmcMze3h4XFxdiY2NLXK+iKGRmZqobBD9oo2BR9qQdTIe0hWmQdjAN0g6mw1TaQJK3YkhLS8Pe3r7IcQcHB1JTU0tcr16vJzo6Wn0cHx9f4rpE6ZF2MB3SFqZB2sE0SDuIQpK8GZGFhQVNmzZFp9MRHx9P48aNsbaWDd6NRdrBdEhbmAZpB9Mg7WA6CtvC2CR5KwZ7e3vS09OLHE9NTcXBwaHE9Wo0GmxsbNTH1tbWBo+FcUg7mA5pC9Mg7WAapB1EIblhoRjc3d2LzG1LT08nKSkJd3d3I0UlhBBCiKpIkrdiCAgI4PDhw6SlpanHwsPDMTMzo3PnzkaMTAghhBBVjSRvxfDMM89QvXp1Xn31VX755Rc2bdrEBx98wDPPPCNrvAkhhBCiXEnyVgwODg6sWbMGc3NzXn31VT766COGDx/O7NmzjR2aEEIIIaoYjaIoirGDqIpOnDiBoihotVoURUGv12NhYYFGozF2aFWWtIPpkLYwDdIOpkHawXQUtoVGo6Ft27ZGi0PuNjWSO7+AGo2mSm1wb6qkHUyHtIVpkHYwDdIOpkOj0ah/jBqH9LwJIYQQQlQcMudNCCGEEKICkeRNCCGEEKICkeRNCCGEEKICkeRNCCGEEKICkeRNCCGEEKICkeRNCCGEEKICkeRNCCGEEKICkeRNCCGEEKICkeRNCCGEEKICkeRNCCGEEKICkeRNCCGEEKICkeRNCCGEEKICkeTNiGJiYnjxxRfx9vamc+fOfPDBB+Tk5Bg7rApp8+bNeHp6Fvnz4YcfGpT74Ycf6Nu3L61atWLgwIH8/PPPRepKT0/nrbfe4sknn8THx4epU6dy/fr1IuVOnDjByJEjad26Nd27d2fFihUoilJm12iKEhISmDt3LoMGDaJFixYEBQXds1x5v++KorBixQq6detG69atGTlyJCdPniyVazZVxWmLMWPG3PN7EhMTY1BO2qJkdu7cycsvv0xAQADe3t4MGjSIjRs3FnlP5PtQ9orTFhX6+6AIo0hJSVE6d+6sPPfcc0pERITyww8/KO3atVPmz59v7NAqpE2bNikeHh5KRESEEhUVpf65fPmyWmb79u2Kp6en8sknnyiRkZHKu+++q7Ro0UKJiooyqGvcuHFKQECAsmPHDmXv3r1KUFCQMnDgQEWv16tl4uPjFW9vb+XVV19VDh8+rKxevVp54oknlJUrV5bXJZuEPXv2KAEBAcqUKVOUoKAg5amnnipSxhjv+/Lly5UnnnhCWb16tXL48GHl1VdfVXx8fJSLFy+WyftgCorTFqNHj1aeeeYZg+9IVFSUkpWVZVBO2qJkRowYoUyfPl3ZsWOHcvjwYeXDDz9UmjdvrixdulQtI9+H8lGctqjI3wdJ3ozkyy+/VLy9vZVbt26px9avX694eXkpV69eNV5gFVRh8nbz5s37lunTp4/yxhtvGBwbOXKkMmHCBPXxiRMnFA8PD+XgwYPqsZiYGMXT01PZsWOHeuzdd99VunfvrmRnZ6vHPvroI6V9+/YGxyq7vLw89d+zZs26Z8JQ3u97VlaW0rZtW+Wjjz5Sy2RnZyvdu3dX3nvvvZJfrIkrTluMHj1aeemllx5Yj7RFyd3r/5933nlHadu2rdo+8n0oH8Vpi4r8fZBhUyOJiIjAz88PR0dH9Vj//v3Jz8/n0KFDxguskkpMTCQ+Pp7+/fsbHA8MDCQyMlIdro6IiMDe3p7OnTurZdzd3fHy8iIiIkI9FhERQc+ePdFqtQZ1paWlERUVVcZXYzrMzB78X4gx3vcTJ06QkZFh8JparZbevXsb1FXZPKwtikvaouScnZ2LHPPy8iIjI4PMzEz5PpSjh7VFcZlqW0jyZiSxsbG4u7sbHLO3t8fFxYXY2FgjRVXxBQUF4eXlRc+ePVm+fDl5eXkA6nvq5uZmUL5Jkybo9XoSExPVcm5ubmg0GoNy7u7uah2ZmZlcuXKlSPu5u7uj0Wik/e5gjPe98O+7yzVp0oTLly+TlZVVSldXMf366694e3vTqlUrRo8ezbFjxwzOS1uUrt9++43atWtja2sr3wcju7MtClXU74Mkb0aSlpaGvb19keMODg6kpqYaIaKKzcXFhSlTprB48WKCg4Pp2rUrn376Kf/5z38A1Pf07ve88HHh+bS0NOzs7IrUf2e7pKen37MurVaLtbW1tN8djPG+p6WlodVqsbS0LPKaiqJU6fbp0KEDb7/9NitXrmTx4sXodDpefPFFg95iaYvSc/z4ccLCwhg3bhwg3wdjurstoGJ/H6oVu6QQJqxLly506dJFfezv74+lpSVr1qxh8uTJRoxMCNMxdepUg8fdunUjKCiIzz//nODgYCNFVTldvXqV6dOn4+vry9ixY40dTpV2v7aoyN8H6XkzEnt7ezVbv1NqaioODg5GiKjy6d+/P3l5eURHR6vv6d3veVpaGoB63t7enoyMjCJ13dkuhb+F3V1XTk4OOp1O2u8Oxnjf7e3tycnJITs7u8hrajQaaZ872NjY0LVrV/744w/1mLTF40tLS2PixIk4OjqydOlSdT6ifB/K3/3a4l4q0vdBkjcjuXO8vFB6ejpJSUlFxsPF4yt8T+9+z2NjY7GwsMDV1VUtFxcXV2Rtnri4OLUOGxsb6tatW6SuwudJ+/3DGO974d9xcXFFXrNevXpYWVmV0tVVTtIWjycrK4tJkyaRnp7OypUrDYbc5PtQvh7UFsVlqm0hyZuRBAQEcPjwYfU3LoDw8HDMzMwM7moRJRcWFoa5uTktWrTA1dWVxo0bEx4eXqSMn5+feodQQEAAqampREZGqmXi4uI4e/YsAQEB6rGAgAD27duHXq83qMve/v+3d/dBUVX/H8DfilAiDwqoRMiojbvaLqsoaiC5ujZSCmRMRMQCQkPYjDTqOEGlGD5M2RBllEomISNgKTQBgsJQoAPIMFjkCNODDAGaWpC0CSMse35/+Ns7Lg+Chuj6fb9m/GPPPfecz713rvPhnHvPtYOHh8c9PjLzcT/O+/z582FjY4OioiKpTk9PD4qLi03aopsPWpeVlcHd3V0q47W4e3q9Hhs2bEBjYyO++OILTJ061WQ774fRM9S1GIhZ3Q93tLAIjRjjIr1arVacPn1aHDt2THh6enKR3rsUFRUlUlNTRVlZmSgrKxNbt24Vcrlc7Nq1S6qTn58v5HK52LNnjzhz5oxISEgQTz75pDh79my/ttRqtSgsLBSlpaW3XZAxNjZWVFZWivT09P/JRXo7OztFUVGRKCoqElqtVqjVaum3cZ2l+3HeU1NThVKpFOnp6aKyslLExsY+9IuSDnUtampqRExMjDh27JioqqoS3377rVizZo1QKBSirq7OpC1ei7uzZcsWIZPJRFpaWr+FX41rffF+GB1DXQtzvx/GCPE/9j2fB8iFCxewY8cO/PDDD5gwYQKef/55bNy40WSdGBqenTt34vTp07h8+TIMBgOmT5+OoKAghIWFmbziffToURw4cACXLl3CjBkzsGnTJixfvtykLZ1Oh/feew8lJSXQ6/Xw8fHBli1b+v3ldvbsWbz//vtoaGiAg4MDQkNDER0d3e+V8odZa2srVqxYMeC2jIwMLF68GMDon3fx/5+gycrKQnt7O+bMmYO33nrroR4VHepaODs7Y/v27fj5559x7do1jB8/Hh4eHli/fj1UKpVJfV6Lu6PRaHDx4sUBt5WWlsLV1RUA74fRMNS16O3tNev7gckbERERkRnhM29EREREZoTJGxEREZEZYfJGREREZEaYvBERERGZESZvRERERGaEyRsRERGRGWHyRkRERGRGmLwRERERmREmb0T00NBoNIiPj5d+V1dXQy6Xo7q6+j5GZapvjKMlLCwMYWFho94vEY08Jm9ENCJyc3Mhl8ulf+7u7vD19cX27dvx119/3e/w7kh5eTlSUlLuS9/FxcWQy+U4evTooHUqKiogl8uRkZExipER0YNi3P0OgIgeLm+88QZcXV3R3d2N2tpaZGdno7y8HAUFBRg/fvyoxrJw4UL89NNPsLS0vKP9ysvLkZmZidjY2HsU2eCWLVsGW1tb5OfnIygoaMA6BQUFsLCwwOrVq0c5OiJ6EDB5I6IRtXTpUri7uwMAgoKCMHHiRHz55ZcoLS2Fn5/fgPt0dnbC2tp6xGMZO3YsHnnkkRFv916ysrKCr68vcnNzceXKlX4fv75x4wZKSkrg7e0NR0fH+xQlEd1PnDYlonvqqaeeAgC0trYCAOLj4+Hh4YHm5mZER0fDw8MDmzdvBgAYDAakp6dj9erVcHd3h7e3NxISEtDR0WHSphACe/fuxdKlSzF37lyEhYXh119/7df3YM+81dXVITo6GgsXLsS8efPg7++PQ4cOSfFlZmYCgMk0sNFIxziQgIAAGAwGFBYW9ttWVlYGnU4Hf39/AEBOTg7Cw8Ph5eUFpVKJVatWISsra8g+jNPcxutidLtz9uqrr2LBggWYO3cutFotamtrTer8+++/2LVrFzQaDZRKJby8vBAZGYnz588P67iJaHg48kZE91RzczMAYOLEiVKZXq+XEoG4uDg8+uijAICEhAR88803CAwMRFhYGFpbW5GZmYn6+npkZ2dL05979uzBvn37oFaroVarcf78eURFRaGnp2fIeCoqKhATE4MpU6YgPDwcTk5OuHDhAsrKyhAREYHg4GBcvXoVFRUV+OCDD/rtPxoxLly4EM7OzsjPz0dkZKTJNuP08zPPPAMAyM7OxqxZs6DRaDBu3Dh8//33SExMhBACoaGhQ/Y1HFVVVYiOjoZSqcT69esxZswY5ObmIiIiAllZWVCpVACAbdu24eTJk9BqtXjiiSdw7do11NbW4sKFC1AoFCMSCxEBEEREIyAnJ0fIZDJRWVkp2traxB9//CGOHz8uFi1aJFQqlbh8+bIQQoi4uDghk8lEUlKSyf41NTVCJpOJvLw8k/JTp06ZlLe1tQmFQiFee+01YTAYpHrJyclCJpOJuLg4qezMmTNCJpOJM2fOCCGE0Ov1QqPRiOXLl4uOjg6Tfm5tKzExUchksn7HeC9iHMzu3buFTCYTjY2NUplOpxPu7u5i06ZNUllXV1e/faOiosSKFStMyrRardBqtdJv4/VqaWkxqdf3nBkMBrFy5UoRFRVlcixdXV1Co9GIyMhIqWzBggUiMTFxyGMjov+G06ZENKLWrl0LLy8vqNVqbNy4ERMmTMCnn37a79mtkJAQk98nTpyAra0tlixZgvb2dumfQqGAtbW1NI1XWVmJnp4eaLVajBkzRto/IiJiyNjq6+vR2tqK8PBw2NnZmWy7ta3BjEaMRgEBAQBujrQZnTx5Ejdu3JCmTAFIo5YAoNPp0N7ejkWLFqGlpQU6nW7Y/Q2moaEBTU1N8Pf3x99//y0dc2dnJ7y8vFBTUwODwQAAsLOzQ11dHa5cufKf+yWiwXHalIhGVEJCAmbMmAELCws4OTlhxowZGDvW9O/EcePGwdnZ2aTs999/h06ng5eX14DttrW1AQAuXboEAJg+fbrJdgcHB9jb2982tpaWFgCATCYb9vGMdoxGs2fPhkwmQ0FBgfTWa0FBASZNmgQfHx+pXm1tLVJSUvDjjz+iq6vLpA2dTgdbW9th9TeYpqYmAEBcXNygdXQ6Hezt7bF582bEx8dj2bJlUCgUUKvVWLNmDaZNm/afYiAiU0zeiGhEqVQq6W3TwVhZWfVL6AwGAxwdHZGUlDTgPg4ODiMW490a7Rj9/f3x4Ycf4ty5c3B2dkZ1dTWCg4MxbtzN/7qbm5uxdu1azJw5E/Hx8XjsscdgaWmJ8vJypKenSyNiAxlspLHvPkIIAMCbb76JOXPmDLiP8U3hVatWwdPTEyUlJaioqMDBgwdx4MABpKSkQK1W3/HxE9HAmLwR0QPBzc0NVVVVmD9/vslUYF8uLi4Abo4I3Tqi097e3u+Nz76M9X/55Rd4e3sPWm+wxGY0YryVn58fkpOTUVBQABcXF/T29ppMmX733Xfo7u7Gvn37pD4BDOuLEsZp475TqxcvXjT5bYzfxsbmtufMaMqUKQgNDUVoaCja2trwwgsvYP/+/UzeiEYQn3kjogfCc889h97eXuzdu7ffNr1ej3/++QcA4O3tDUtLSxw+fFgaFQIgLfVxOwqFAq6ursjIyJDaM7q1LeNiwn3rjEaMt3JxcYGnpycKCwuRl5cHV1dXzJ8/X9puYWHRL3adToecnJwh23ZzcwMA1NTUSGW9vb34+uuvTeoplUq4ubkhLS0N169f79dOe3u7tG/fRNDR0RFTpkxBd3f3kPEQ0fBx5I2IHgiLFi1CcHAwUlNT0dDQgCVLlsDS0hJNTU04ceIE3nnnHTz77LNwcHBAVFQUUlNTERMTA7Vajfr6epw6dQqTJk26bR9jx47Fu+++i9dffx1r1qxBYGAgJk+ejMbGRvz22284ePAgAEjLWuzcuRM+Pj7S1wxGI8a+AgICsHXrVly9ehXr1q0z2Wbsf926dXj55Zdx/fp1HD16FI6Ojvjzzz9v2+6sWbMwb948JCcno6OjA/b29igsLIRer+93znbu3Ino6Gj4+fkhMDAQU6dOxZUrV1BdXQ0bGxvs378f169fh1qthq+vL2bPng1ra2tUVlbi3Llz9+VbrkQPMyZvRPTA2L59O5RKJY4cOYKPPvoIFhYWePzxxxEQEGAy4rRhwwZYWVnhyJEjqK6uhkqlQlpaGmJiYobs4+mnn8ahQ4fw2WefIS0tDUIITJs2DS+99JJUZ+XKlQgLC8Px48eRl5cHIYT0KarRiPFWvr6+2LFjB7q7u6U3UI1mzpyJTz75BB9//DF2794NJycnhISEwMHBAW+//faQbSclJSEhIQGff/457Ozs8OKLL2Lx4sX91pZbvHgxvvrqK+zduxeHDx9GZ2cnJk+eDJVKheDgYAA333oNCQlBRUUFiouLIYSAm5sbtm3bhldeeeWOjpmIbm+MuHW8nYiIiIgeaHzmjYiIiMiMMHkjIiIiMiNM3oiIiIjMCJM3IiIiIjPC5I2IiIjIjDB5IyIiIjIjTN6IiIiIzAiTNyIiIiIzwuSNiIiIyIwweSMiIiIyI0zeiIiIiMwIkzciIiIiM/J/zW3gmghNOLgAAAAASUVORK5CYII=\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "base_learners.show_gridsearch_results()\n", - "# " - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 503 - }, - "id": "tByXkX_7ShlR", - "outputId": "6df9c904-2fe4-49f0-94a0-ea0e9e6badb4" - }, - "id": "tByXkX_7ShlR", - "execution_count": 418, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " mean_fit_time std_fit_time mean_score_time std_score_time \\\n", - "0 0.000371 0.000077 0.000586 0.000126 \n", - "1 0.000329 0.000014 0.000514 0.000017 \n", - "2 0.000335 0.000030 0.000522 0.000017 \n", - "3 0.000354 0.000025 0.000564 0.000089 \n", - "4 0.000349 0.000030 0.000568 0.000064 \n", - "5 0.000348 0.000018 0.000564 0.000048 \n", - "6 0.000348 0.000024 0.000543 0.000007 \n", - "7 0.000348 0.000017 0.000564 0.000048 \n", - "\n", - " param_n_neighbors params split0_test_score split1_test_score \\\n", - "0 1 {'n_neighbors': 1} 0.841000 0.608121 \n", - "1 2 {'n_neighbors': 2} 0.844238 0.610294 \n", - "2 3 {'n_neighbors': 3} 0.842322 0.595516 \n", - "3 4 {'n_neighbors': 4} 0.839970 0.591315 \n", - "4 5 {'n_neighbors': 5} 0.895925 0.594712 \n", - "5 6 {'n_neighbors': 6} 0.889689 0.648802 \n", - "6 7 {'n_neighbors': 7} 0.891601 0.661135 \n", - "7 9 {'n_neighbors': 9} 0.846929 0.659553 \n", - "\n", - " split2_test_score split3_test_score split4_test_score split5_test_score \\\n", - "0 0.887363 0.680558 0.422247 0.928936 \n", - "1 0.932285 0.735121 0.499204 0.938424 \n", - "2 0.899601 0.692629 0.453821 0.966832 \n", - "3 0.893564 0.663273 0.491373 0.980681 \n", - "4 0.821005 0.632979 0.440295 0.984016 \n", - "5 0.728457 0.617250 0.431368 0.965106 \n", - "6 0.658852 0.603143 0.546505 0.926007 \n", - "7 0.616130 0.607879 0.687173 0.841535 \n", - "\n", - " split6_test_score split7_test_score split8_test_score split9_test_score \\\n", - "0 0.767535 0.976304 0.584126 0.756899 \n", - "1 0.779691 0.969325 0.608054 0.796522 \n", - "2 0.774986 0.923542 0.620148 0.801093 \n", - "3 0.755867 0.914635 0.547926 0.796078 \n", - "4 0.738676 0.867384 0.526988 0.778860 \n", - "5 0.723796 0.824544 0.476143 0.786384 \n", - "6 0.730003 0.777480 0.420351 0.772348 \n", - "7 0.713261 0.751171 0.310519 0.727944 \n", - "\n", - " mean_test_score std_test_score rank_test_score \n", - "0 0.745309 0.164440 4 \n", - "1 0.771316 0.150667 1 \n", - "2 0.757049 0.155729 2 \n", - "3 0.747468 0.158601 3 \n", - "4 0.728084 0.165679 5 \n", - "5 0.709154 0.161715 6 \n", - "6 0.698742 0.146377 7 \n", - "7 0.676209 0.144413 8 " - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
mean_fit_timestd_fit_timemean_score_timestd_score_timeparam_n_neighborsparamssplit0_test_scoresplit1_test_scoresplit2_test_scoresplit3_test_scoresplit4_test_scoresplit5_test_scoresplit6_test_scoresplit7_test_scoresplit8_test_scoresplit9_test_scoremean_test_scorestd_test_scorerank_test_score
00.0003710.0000770.0005860.0001261{'n_neighbors': 1}0.8410000.6081210.8873630.6805580.4222470.9289360.7675350.9763040.5841260.7568990.7453090.1644404
10.0003290.0000140.0005140.0000172{'n_neighbors': 2}0.8442380.6102940.9322850.7351210.4992040.9384240.7796910.9693250.6080540.7965220.7713160.1506671
20.0003350.0000300.0005220.0000173{'n_neighbors': 3}0.8423220.5955160.8996010.6926290.4538210.9668320.7749860.9235420.6201480.8010930.7570490.1557292
30.0003540.0000250.0005640.0000894{'n_neighbors': 4}0.8399700.5913150.8935640.6632730.4913730.9806810.7558670.9146350.5479260.7960780.7474680.1586013
40.0003490.0000300.0005680.0000645{'n_neighbors': 5}0.8959250.5947120.8210050.6329790.4402950.9840160.7386760.8673840.5269880.7788600.7280840.1656795
50.0003480.0000180.0005640.0000486{'n_neighbors': 6}0.8896890.6488020.7284570.6172500.4313680.9651060.7237960.8245440.4761430.7863840.7091540.1617156
60.0003480.0000240.0005430.0000077{'n_neighbors': 7}0.8916010.6611350.6588520.6031430.5465050.9260070.7300030.7774800.4203510.7723480.6987420.1463777
70.0003480.0000170.0005640.0000489{'n_neighbors': 9}0.8469290.6595530.6161300.6078790.6871730.8415350.7132610.7511710.3105190.7279440.6762090.1444138
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 418 - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Stacked Learners (K-NN, and Lasso with Lasso as the meta estimator)" - ], - "metadata": { - "id": "XZeQqfa8pZel" - }, - "id": "XZeQqfa8pZel" - }, - { - "cell_type": "code", - "source": [ - "stacked_learner = StackedLearner(data, selected_features = data.columns[:-1].to_list())\n", - "# \n", - "data_split = base_learners.show_data_split()" - ], - "metadata": { - "id": "cKDTCgD3OHT_" - }, - "id": "cKDTCgD3OHT_", - "execution_count": 419, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "data_split['train']\n", - "# " - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 488 - }, - "id": "Ls1x8wCMOSRH", - "outputId": "842e1742-83e8-44a2-8eb4-be89faa48e12" - }, - "id": "Ls1x8wCMOSRH", - "execution_count": 420, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " TeamExp ManagerExp YearEnd Length Transactions Entities \\\n", - "30 -1.248950 -0.018888 0.131773 0.007412 -0.619216 -0.525408 \n", - "67 -0.498803 -0.001902 1.152470 0.953984 -0.490354 1.904772 \n", - "62 1.050009 0.819632 -0.897301 1.832558 3.069220 0.867987 \n", - "47 -1.248950 -1.705033 0.131773 -0.770875 -0.579577 -1.447553 \n", - "42 1.044258 0.824184 0.131773 0.688413 0.659131 0.317047 \n", - ".. ... ... ... ... ... ... \n", - "71 -1.248950 -1.705033 1.158783 -0.479017 -0.995783 -0.787251 \n", - "14 -0.495158 -0.017136 0.109866 0.684620 1.053886 0.200062 \n", - "92 0.279855 -0.018888 -0.895237 -1.062733 -0.871912 -1.322324 \n", - "51 -0.484548 -1.705033 -1.922247 0.007412 -0.574622 -0.605099 \n", - "102 -0.484548 0.017310 1.158783 -0.673589 -0.188145 -0.627868 \n", - "\n", - " PointsAdjust Envergure PointsNonAjust Language Effort \n", - "30 -0.696982 0.162186 -0.675359 0.840533 9135.000000 \n", - "67 0.325048 -1.197900 -0.008901 -0.816984 14969.962096 \n", - "62 2.863781 0.170628 2.742024 -0.150081 23898.320763 \n", - "47 -0.994572 -0.466877 -1.012184 2.506467 710.000000 \n", - "42 0.656443 0.701383 0.767045 -0.825402 9520.000000 \n", - ".. ... ... ... ... ... \n", - "71 -1.100563 -1.275671 -1.162765 -0.825402 2583.000000 \n", - "14 0.921849 0.725381 1.049938 0.839811 13866.040390 \n", - "92 -1.190248 -0.017546 -1.158802 -0.825402 3136.000000 \n", - "51 -0.688829 0.701383 -0.604031 -0.825402 9051.000000 \n", - "102 -0.379009 -0.377010 -0.445526 0.840533 6783.000000 \n", - "\n", - "[103 rows x 11 columns]" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TeamExpManagerExpYearEndLengthTransactionsEntitiesPointsAdjustEnvergurePointsNonAjustLanguageEffort
30-1.248950-0.0188880.1317730.007412-0.619216-0.525408-0.6969820.162186-0.6753590.8405339135.000000
67-0.498803-0.0019021.1524700.953984-0.4903541.9047720.325048-1.197900-0.008901-0.81698414969.962096
621.0500090.819632-0.8973011.8325583.0692200.8679872.8637810.1706282.742024-0.15008123898.320763
47-1.248950-1.7050330.131773-0.770875-0.579577-1.447553-0.994572-0.466877-1.0121842.506467710.000000
421.0442580.8241840.1317730.6884130.6591310.3170470.6564430.7013830.767045-0.8254029520.000000
....................................
71-1.248950-1.7050331.158783-0.479017-0.995783-0.787251-1.100563-1.275671-1.162765-0.8254022583.000000
14-0.495158-0.0171360.1098660.6846201.0538860.2000620.9218490.7253811.0499380.83981113866.040390
920.279855-0.018888-0.895237-1.062733-0.871912-1.322324-1.190248-0.017546-1.158802-0.8254023136.000000
51-0.484548-1.705033-1.9222470.007412-0.574622-0.605099-0.6888290.701383-0.604031-0.8254029051.000000
102-0.4845480.0173101.158783-0.673589-0.188145-0.627868-0.379009-0.377010-0.4455260.8405336783.000000
\n", - "

103 rows × 11 columns

\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 420 - } - ] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "data_split['test']\n", - "# " - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "id": "gnIDBJuVOcl6", - "outputId": "259ea93a-8853-4ef9-9baf-6b241b9d42a7" - }, - "id": "gnIDBJuVOcl6", - "execution_count": 421, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " TeamExp ManagerExp YearEnd Length Transactions Entities \\\n", - "26 -0.472431 -0.022722 0.143340 0.679351 1.025065 0.195942 \n", - "13 -1.248950 -1.705033 1.158783 -0.770875 0.936601 -1.333708 \n", - "24 1.044258 -1.705033 1.158783 0.299269 0.208241 -0.992173 \n", - "21 -0.475002 0.843365 1.150256 -0.181917 0.321613 0.212459 \n", - "15 -0.496335 -0.033229 1.133001 0.996950 -0.449018 1.883568 \n", - "29 -0.484548 -0.018888 -1.922247 -0.381732 -0.634080 -1.003557 \n", - "19 1.048734 0.828269 -0.861547 1.859603 3.151492 0.851736 \n", - "12 1.044258 -1.705033 -0.895237 -0.284446 -0.430932 1.273346 \n", - "8 -1.248950 -0.018888 0.131773 -0.673589 -1.089925 -1.527245 \n", - "16 -0.460527 -0.032977 -0.899507 -0.029503 -0.192936 -0.511525 \n", - "9 -0.484548 -0.018888 -0.895237 -0.965447 -0.723267 -1.060480 \n", - "33 1.044258 3.353402 0.131773 -0.381732 -0.956144 -1.037711 \n", - "0 1.044258 0.824184 -0.895237 -0.089874 -0.723267 0.055203 \n", - "4 0.279855 -1.705033 -0.895237 -0.284446 -0.564713 1.808418 \n", - "17 -0.480910 -0.007811 0.131453 0.730399 1.080777 0.177256 \n", - "27 -0.480497 -0.012580 0.160158 0.685122 1.023529 0.206476 \n", - "5 -0.484548 -1.705033 0.131773 0.104698 -0.396248 -0.445716 \n", - "11 -0.527974 -0.016741 1.143025 1.004564 -0.431188 1.920675 \n", - "1 -2.013353 -2.548105 0.131773 -1.257304 -0.604351 -0.810020 \n", - "2 1.034028 -0.015622 -0.917742 -0.581509 -0.634344 0.163236 \n", - "32 0.279855 0.824184 1.158783 -0.284446 -1.253434 2.514258 \n", - "3 -0.454658 -0.027977 -0.880717 0.017430 -0.237801 -0.524837 \n", - "30 1.602790 0.823549 0.126909 2.172413 0.107915 0.724340 \n", - "23 1.037029 0.823374 0.143329 -0.492687 0.287556 1.192951 \n", - "31 1.051303 -0.009232 -0.887994 -0.571275 -0.635836 0.175732 \n", - "10 1.044258 -1.705033 -0.895237 -0.284446 -0.871912 0.738274 \n", - "22 -2.013353 -0.861961 -1.922247 -1.062733 -0.242649 -1.049095 \n", - "18 -1.248950 0.824184 0.131773 -0.868161 -0.857048 0.396738 \n", - "25 0.279855 -0.018888 2.185793 -0.089874 0.198331 -0.229410 \n", - "6 1.044258 0.824184 -0.895237 1.855843 3.091952 0.863503 \n", - "20 1.044258 0.824184 1.158783 -0.770875 -0.435887 -0.992173 \n", - "34 -0.484548 -1.705033 -0.895237 -0.770875 -0.708403 -1.402015 \n", - "7 -2.013353 -2.548105 0.131773 -1.257304 -0.321926 -0.468485 \n", - "14 -0.498774 -0.023706 -0.908924 -0.006037 -0.179280 -0.477384 \n", - "28 1.063195 -0.025195 -0.880943 -0.567687 -0.648400 0.150583 \n", - "\n", - " PointsAdjust Envergure PointsNonAjust Language Effort \n", - "26 0.956430 0.689813 1.048224 0.850665 13746.008270 \n", - "13 0.293627 -0.377010 0.160760 -0.825402 4620.000000 \n", - "24 -0.183333 0.611517 -0.104738 -0.825402 10577.000000 \n", - "21 0.304483 0.234532 0.335723 0.829760 11393.193024 \n", - "15 0.296364 -1.159078 -0.019603 -0.820223 14969.503918 \n", - "29 -0.880428 -1.725002 -1.024072 0.840533 2275.000000 \n", - "19 2.815097 0.173133 2.745228 -0.158133 24059.461063 \n", - "12 0.102028 0.431784 0.148872 -0.825402 3948.000000 \n", - "8 -1.442996 -0.466877 -1.412412 0.840533 1267.000000 \n", - "16 -0.316550 0.226506 -0.331508 -0.825270 14366.050859 \n", - "9 -0.974189 -1.275671 -1.059736 -0.825402 2989.000000 \n", - "33 -1.157635 -1.635136 -1.230130 -0.825402 1603.000000 \n", - "0 -0.574684 -0.466877 -0.635733 -0.825402 7252.000000 \n", - "4 0.183559 0.611517 0.267751 -0.825402 4277.000000 \n", - "17 0.883042 0.717566 1.008301 0.841939 13967.497235 \n", - "27 0.929863 0.711749 1.068558 0.832289 13856.608009 \n", - "5 -0.485000 0.252052 -0.457414 -0.825402 6699.000000 \n", - "11 0.315516 -1.205231 -0.006517 -0.816774 14991.009450 \n", - "1 -0.786666 -0.736475 -0.853678 -0.825402 2149.000000 \n", - "2 -0.480001 1.666754 -0.261609 -0.847846 12710.730114 \n", - "32 -0.130337 -1.006073 -0.330609 0.840533 4494.000000 \n", - "3 -0.347176 0.253569 -0.311438 -0.831022 14446.029890 \n", - "30 0.336379 1.590695 0.664470 -0.803209 20010.328053 \n", - "23 0.654761 0.164813 0.645797 0.856870 15089.456669 \n", - "31 -0.505234 1.686868 -0.229040 -0.841204 12781.375116 \n", - "10 -0.452387 0.072320 -0.449488 -0.825402 3164.000000 \n", - "22 -0.574684 -2.354065 -0.873492 2.506467 595.000000 \n", - "18 -0.562455 0.072320 -0.556480 -0.825402 3983.000000 \n", - "25 0.081645 1.779776 0.394556 0.840533 8050.000000 \n", - "6 2.853719 0.162186 2.744406 -0.159669 23940.000000 \n", - "20 -0.713288 0.791249 -0.619882 2.506467 2429.000000 \n", - "34 -1.084257 -0.646609 -1.103325 0.840533 2569.000000 \n", - "7 -0.432004 0.072320 -0.429675 -0.825402 5635.000000 \n", - "14 -0.319927 0.241080 -0.326440 -0.828606 14544.038884 \n", - "28 -0.474082 1.702341 -0.248170 -0.821717 12788.787051 " - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TeamExpManagerExpYearEndLengthTransactionsEntitiesPointsAdjustEnvergurePointsNonAjustLanguageEffort
26-0.472431-0.0227220.1433400.6793511.0250650.1959420.9564300.6898131.0482240.85066513746.008270
13-1.248950-1.7050331.158783-0.7708750.936601-1.3337080.293627-0.3770100.160760-0.8254024620.000000
241.044258-1.7050331.1587830.2992690.208241-0.992173-0.1833330.611517-0.104738-0.82540210577.000000
21-0.4750020.8433651.150256-0.1819170.3216130.2124590.3044830.2345320.3357230.82976011393.193024
15-0.496335-0.0332291.1330010.996950-0.4490181.8835680.296364-1.159078-0.019603-0.82022314969.503918
29-0.484548-0.018888-1.922247-0.381732-0.634080-1.003557-0.880428-1.725002-1.0240720.8405332275.000000
191.0487340.828269-0.8615471.8596033.1514920.8517362.8150970.1731332.745228-0.15813324059.461063
121.044258-1.705033-0.895237-0.284446-0.4309321.2733460.1020280.4317840.148872-0.8254023948.000000
8-1.248950-0.0188880.131773-0.673589-1.089925-1.527245-1.442996-0.466877-1.4124120.8405331267.000000
16-0.460527-0.032977-0.899507-0.029503-0.192936-0.511525-0.3165500.226506-0.331508-0.82527014366.050859
9-0.484548-0.018888-0.895237-0.965447-0.723267-1.060480-0.974189-1.275671-1.059736-0.8254022989.000000
331.0442583.3534020.131773-0.381732-0.956144-1.037711-1.157635-1.635136-1.230130-0.8254021603.000000
01.0442580.824184-0.895237-0.089874-0.7232670.055203-0.574684-0.466877-0.635733-0.8254027252.000000
40.279855-1.705033-0.895237-0.284446-0.5647131.8084180.1835590.6115170.267751-0.8254024277.000000
17-0.480910-0.0078110.1314530.7303991.0807770.1772560.8830420.7175661.0083010.84193913967.497235
27-0.480497-0.0125800.1601580.6851221.0235290.2064760.9298630.7117491.0685580.83228913856.608009
5-0.484548-1.7050330.1317730.104698-0.396248-0.445716-0.4850000.252052-0.457414-0.8254026699.000000
11-0.527974-0.0167411.1430251.004564-0.4311881.9206750.315516-1.205231-0.006517-0.81677414991.009450
1-2.013353-2.5481050.131773-1.257304-0.604351-0.810020-0.786666-0.736475-0.853678-0.8254022149.000000
21.034028-0.015622-0.917742-0.581509-0.6343440.163236-0.4800011.666754-0.261609-0.84784612710.730114
320.2798550.8241841.158783-0.284446-1.2534342.514258-0.130337-1.006073-0.3306090.8405334494.000000
3-0.454658-0.027977-0.8807170.017430-0.237801-0.524837-0.3471760.253569-0.311438-0.83102214446.029890
301.6027900.8235490.1269092.1724130.1079150.7243400.3363791.5906950.664470-0.80320920010.328053
231.0370290.8233740.143329-0.4926870.2875561.1929510.6547610.1648130.6457970.85687015089.456669
311.051303-0.009232-0.887994-0.571275-0.6358360.175732-0.5052341.686868-0.229040-0.84120412781.375116
101.044258-1.705033-0.895237-0.284446-0.8719120.738274-0.4523870.072320-0.449488-0.8254023164.000000
22-2.013353-0.861961-1.922247-1.062733-0.242649-1.049095-0.574684-2.354065-0.8734922.506467595.000000
18-1.2489500.8241840.131773-0.868161-0.8570480.396738-0.5624550.072320-0.556480-0.8254023983.000000
250.279855-0.0188882.185793-0.0898740.198331-0.2294100.0816451.7797760.3945560.8405338050.000000
61.0442580.824184-0.8952371.8558433.0919520.8635032.8537190.1621862.744406-0.15966923940.000000
201.0442580.8241841.158783-0.770875-0.435887-0.992173-0.7132880.791249-0.6198822.5064672429.000000
34-0.484548-1.705033-0.895237-0.770875-0.708403-1.402015-1.084257-0.646609-1.1033250.8405332569.000000
7-2.013353-2.5481050.131773-1.257304-0.321926-0.468485-0.4320040.072320-0.429675-0.8254025635.000000
14-0.498774-0.023706-0.908924-0.006037-0.179280-0.477384-0.3199270.241080-0.326440-0.82860614544.038884
281.063195-0.025195-0.880943-0.567687-0.6484000.150583-0.4740821.702341-0.248170-0.82171712788.787051
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 421 - } - ] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "stacked_learner_model = stacked_learner.learn()\n", - "# \n", - "evaluations = stacked_learner.evaluate_model(stacked_learner_model, with_table = True, return_train_score = True)\n", - "# " - ], - "metadata": { - "id": "nNQhcpB0hlLw", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "1169b2c2-7ed6-431d-8d9d-425dcbb21d9e" - }, - "id": "nNQhcpB0hlLw", - "execution_count": 422, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Best parameters: {'n_neighbors': 2}\n", - "Best score: 0.7717047207403731\n" - ] - }, - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.672e+07, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.764e+07, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.200e+07, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.181e+07, tolerance: 3.272e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.053e+07, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.921e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.913e+07, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.386e+06, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.843e+06, tolerance: 3.272e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.639e+07, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.496e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.438e+07, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.555e+06, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.083e+06, tolerance: 3.272e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.278e+07, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.034e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.271e+06, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.712e+06, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.415e+05, tolerance: 3.272e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.674e+06, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.577e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.166e+06, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.055e+06, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.698e+05, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.973e+05, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.945e+05, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.160e+06, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.062e+06, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.659e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.212e+06, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.312e+06, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.222e+06, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.473e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.555e+05, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.019e+06, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.786e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.257e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.800e+05, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.936e+05, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.043e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.140e+05, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.276e+05, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.626e+05, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.436e+06, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.063e+05, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.085e+05, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.260e+06, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.350e+05, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.116e+06, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.925e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.431e+05, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.866e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.829e+05, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.950e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.297e+05, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.137e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.402e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.736e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.130e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.186e+05, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.564e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n" - ] - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Best hyperparameters: {'alpha': 99}\n", - "Best cross-validated score: 0.8340356401497655\n" - ] - }, - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.672e+07, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.764e+07, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.200e+07, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.181e+07, tolerance: 3.272e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.053e+07, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.921e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.913e+07, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.386e+06, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.843e+06, tolerance: 3.272e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.639e+07, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.496e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.438e+07, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.555e+06, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.083e+06, tolerance: 3.272e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.278e+07, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.034e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.271e+06, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.712e+06, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.415e+05, tolerance: 3.272e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.674e+06, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.577e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.166e+06, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.055e+06, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.698e+05, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.973e+05, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.945e+05, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.160e+06, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.062e+06, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.659e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.212e+06, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.312e+06, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.222e+06, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.473e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.555e+05, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.019e+06, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.786e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.257e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.800e+05, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.936e+05, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.043e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.140e+05, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.276e+05, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.626e+05, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.436e+06, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.063e+05, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.085e+05, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.260e+06, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.350e+05, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.116e+06, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.925e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.431e+05, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.866e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.829e+05, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.950e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.297e+05, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.137e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.402e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.736e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.130e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.186e+05, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.564e+05, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n" - ] - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Best hyperparameters: {'alpha': 99}\n", - "Best cross-validated score: 0.8340356401497655\n", - "Best parameters: {'final_estimator__fit_intercept': True}\n", - "Best score: 0.8357586283209194\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "evaluations['train_scores']" - ], - "metadata": { - "id": "pMD0IC-k8wPx", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "03b71a33-8da8-4d9b-ed30-c4a63638d6bd" - }, - "id": "pMD0IC-k8wPx", - "execution_count": 423, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'MSE': 3811341.9980829773,\n", - " 'RMSE': 1952.2658625512504,\n", - " 'MAE': 1420.9552809716386,\n", - " 'R^2': 0.9184143809933291,\n", - " 'unexplained_variance': 0.08158561900667094,\n", - " 'lasso_coefs': Empty DataFrame\n", - " Columns: []\n", - " Index: []}" - ] - }, - "metadata": {}, - "execution_count": 423 - } - ] - }, - { - "cell_type": "code", - "source": [ - "evaluations['test_scores']" - ], - "metadata": { - "id": "a6BwFuR38w_V", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "ce188fb4-bd03-47b5-9508-88bdcbc9bfe2" - }, - "id": "a6BwFuR38w_V", - "execution_count": 424, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'MSE': 7494780.0007039085,\n", - " 'RMSE': 2737.659584518117,\n", - " 'MAE': 1912.638070819492,\n", - " 'R^2': 0.8193340975001216,\n", - " 'unexplained_variance': 0.18066590249987835}" - ] - }, - "metadata": {}, - "execution_count": 424 - } - ] - }, - { - "cell_type": "code", - "source": [ - "evaluations['values_table']" - ], - "metadata": { - "id": "tP6KPlcn8wwe", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "outputId": "b5a1794f-784b-45e1-dc8b-2b4ebeababa7" - }, - "id": "tP6KPlcn8wwe", - "execution_count": 425, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " Actual Values Predicted Values\n", - "0 7252.000000 7581.061223\n", - "1 2149.000000 3174.674281\n", - "2 12710.730114 11799.918950\n", - "3 14446.029890 11082.345063\n", - "4 4277.000000 11933.806188\n", - "5 6699.000000 7825.340128\n", - "6 23940.000000 22750.909259\n", - "7 5635.000000 4865.772986\n", - "8 1267.000000 2486.103855\n", - "9 2989.000000 3099.065225\n", - "10 3164.000000 8315.512517\n", - "11 14991.009450 14490.695551\n", - "12 3948.000000 10986.410841\n", - "13 4620.000000 5915.135366\n", - "14 14544.038884 11078.952712\n", - "15 14969.503918 14405.114317\n", - "16 14366.050859 10959.616974\n", - "17 13967.497235 13604.679146\n", - "18 3983.000000 7902.572114\n", - "19 24059.461063 22743.763421\n", - "20 2429.000000 2515.612974\n", - "21 11393.193024 10726.834781\n", - "22 595.000000 -535.049125\n", - "23 15089.456669 13301.171719\n", - "24 10577.000000 7816.005837\n", - "25 8050.000000 11155.592072\n", - "26 13746.008270 13621.302835\n", - "27 13856.608009 13725.363791\n", - "28 12788.787051 11821.162122\n", - "29 2275.000000 1843.320232\n", - "30 20010.328053 19281.812994\n", - "31 12781.375116 11921.259444\n", - "32 4494.000000 10461.310247\n", - "33 1603.000000 3648.588420\n", - "34 2569.000000 1140.577565" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Actual ValuesPredicted Values
07252.0000007581.061223
12149.0000003174.674281
212710.73011411799.918950
314446.02989011082.345063
44277.00000011933.806188
56699.0000007825.340128
623940.00000022750.909259
75635.0000004865.772986
81267.0000002486.103855
92989.0000003099.065225
103164.0000008315.512517
1114991.00945014490.695551
123948.00000010986.410841
134620.0000005915.135366
1414544.03888411078.952712
1514969.50391814405.114317
1614366.05085910959.616974
1713967.49723513604.679146
183983.0000007902.572114
1924059.46106322743.763421
202429.0000002515.612974
2111393.19302410726.834781
22595.000000-535.049125
2315089.45666913301.171719
2410577.0000007816.005837
258050.00000011155.592072
2613746.00827013621.302835
2713856.60800913725.363791
2812788.78705111821.162122
292275.0000001843.320232
3020010.32805319281.812994
3112781.37511611921.259444
324494.00000010461.310247
331603.0000003648.588420
342569.0000001140.577565
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 425 - } - ] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "plot_graph(df = evaluations['values_table'], \n", - " graph_type='scatter_line', \n", - " label1='Actual Values',\n", - " label2='Predicted Values', \n", - " title='Actual Values vs. Predicted Values')\n", - "# \n", - "# " - ], - "metadata": { - "id": "5JV7sp1VVwh1", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 480 - }, - "outputId": "1982767d-ff5f-4226-f702-9079ca40fe14" - }, - "id": "5JV7sp1VVwh1", - "execution_count": 426, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAHPCAYAAACP7aS6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACSU0lEQVR4nOzdeVxU5f7A8c+ADIvsirsoqCAuCC4hirhviKh00xa1ckmtNL3Z1bplem/XlttiaosLmpVZdtUU911LyTJxS3NDTCMBRdYBZhjO7w9+nBxBBRwYlu/79fKlnPPMc77nPDPM1+c853k0iqIoCCGEEEIIs7GydABCCCGEENWNJFhCCCGEEGYmCZYQQgghhJlJgiWEEEIIYWaSYAkhhBBCmJkkWEIIIYQQZiYJlhBCCCGEmUmCJYQQQghhZpJgCSGEEEKYmSRYQtQAvr6+LFq0qMKP26dPH2bPnl3hxxV3d2ebHDlyBF9fX44cOWLBqExZ6n0zZswYxowZU+HHFdWTJFhClNLq1avx9fXlkUceKXMdiYmJLFq0iLNnz5oxsrJbuXIlvr6+HD58+K5l1q5di6+vL3v27KnAyKqX9evX4+vrq/5p3749AwcO5F//+hc3btywdHilcuDAAYsk7QA7d+7E19eXb7/99q5lDh06hK+vL59//nkFRibEXyTBEqKUoqOjady4MSdPnuTKlStlqiMpKYnFixdXmgQrLCwMKysroqOj71omOjoaV1dXQkNDKzCy6mnatGm88847zJkzh8DAQNasWcOoUaPIzs6u8Fi6dOnCyZMn6dKlS6led+DAARYvXlxOUd1br169cHJyuuf7dfPmzVhbWzNkyJAKjEyIv0iCJUQpXL16ldjYWF5++WXc3d3v+Qu+Kqlfvz5BQUHs2rULvV5fZH9iYiJHjx5l0KBB2NjYWCDC6iU0NJRhw4bxyCOP8NZbb/Hkk09y7dq1e/YO6nS6conFysoKW1tbrKyqzteBVqtl4MCB/PzzzyQmJhbZn5uby65du+jWrRt16tSxQIRCSIIlRKlER0fj4uJCz549GThw4F0TrPT0dObPn0+fPn1o164doaGh/OMf/yAlJYUjR47wt7/9DYCXX35ZvV20fv164O7jT+4cH6LX6/nwww+JjIykU6dOBAQE8Pjjj/Pjjz+W6dwiIiLIyMhg//79RfZt2bKF/Px8hg4dCkBUVBSPPvooQUFB+Pv7ExkZyfbt2+97jEWLFuHr61tke+Gts2vXrplsP3DgAI8//jgBAQEEBgbyzDPPcOHCBZMyycnJvPzyy4SGhtKuXTtCQkKYMmVKkbpuFxUVha+vL3/88UeRfe+99x7t2rUjLS0NgPj4eKZOnUr37t1p3749oaGhzJgxg4yMjPueb0l17doVQI159uzZBAYG8vvvvzNx4kQCAwOZOXMmAPn5+Xz22WcMGTKE9u3b061bN+bMmaPGW0hRFD7++GNCQ0Pp0KEDY8aMKXLt4O5jsE6cOMHEiRPp0qULAQEBDB06lFWrVqnxrV69GsDklmchc8dYnIiICPLz89m6dWuRffv37ycjI0N9v65bt46xY8cSHBxMu3btCAsL46uvvrrvMe72vrzXNRs/fjydOnWiQ4cOjB49ml9++cWkTGZmJv/5z3/U3w3BwcE8/fTT/PrrryU6b1F11LJ0AEJUJdHR0fTv3x+tVkt4eDhr1qzh5MmT+Pv7q2WysrJ44oknuHTpEg8//DBt2rTh1q1b7N27l8TERFq0aMG0adNYuHAho0aNolOnTgB07NixVLFkZmby7bffEh4eziOPPEJWVhb/+9//mDBhAt9++y1+fn6lqm/AgAHMnTuXzZs3M2DAAJN9mzdvpnHjxmqsn3/+OX369GHo0KEYDAa2bNnCCy+8wJIlS+jVq1epjns33333HbNnzyYkJISZM2eSnZ3NmjVrePzxx9mwYQNNmjQBYOrUqVy8eJHRo0fTuHFjUlJSOHToEH/++ada5k6DBw/mv//9L9u2bWPChAkm+7Zt20b37t1xcXFBr9czfvx49Ho9o0ePpm7duiQmJrJ//37S09NxcnIyy7n+/vvvALi6uqrb8vLy1C/rWbNmYWdnB8CcOXPYsGEDkZGRjBkzhmvXrrF69WrOnDnDmjVr1B7GDz/8kE8++YSePXvSs2dPfv31V8aNG4fBYLhvPIcOHWLSpEnUq1ePsWPHUrduXS5dusT+/ft58sknGTVqFElJSRw6dIh33nmnyOsrIsYuXbrQoEEDoqOjefrpp032bd68GXt7e/r16wfAmjVraNWqFX369KFWrVrs27ePefPmoSgKTzzxxH2PVRIxMTFMnDiRdu3a8fzzz6PRaFi/fj1PPvkkX331lfo74vXXX2fHjh2MHj2aFi1akJqayi+//MKlS5do27atWWIRlYQihCiRU6dOKT4+PsqhQ4cURVGU/Px8JTQ0VHnjjTdMyn344YeKj4+PsnPnziJ15OfnK4qiKCdPnlR8fHyUdevWFSnTu3dvZdasWUW2jx49Whk9erT6c15enpKbm2tSJi0tTenWrZvy8ssvm2z38fFRFi5ceN9znDZtmtK+fXslIyND3Xbp0iXFx8dHee+999Rt2dnZJq/T6/VKeHi4Mnbs2Huey8KFCxUfH58ix123bp3i4+OjXL16VVEURcnMzFQ6d+6svPrqqyblkpOTlU6dOqnb09LSFB8fH2X58uX3Pbc7jRo1ShkxYoTJthMnTig+Pj7Khg0bFEVRlDNnzig+Pj7Ktm3bSl1/cQrP8/Dhw8rNmzeVP//8U9myZYvy0EMPKf7+/sr169cVRVGUWbNmKT4+Psq7775r8vqff/5Z8fHxUTZt2mSy/eDBgybbb968qbRt21Z55pln1PecoijK+++/r/j4+Ji0yY8//qj4+PgoP/74o6IoBe+rPn36KL1791bS0tJMjnN7XfPmzSu2Lcsjxrt5++23FR8fHyUuLk7dlpGRobRv3175+9//rm678/2qKIoybtw4pW/fvibb7vyM3fm+LHTnNcvPz1cGDBigjBs3zuRcsrOzlT59+ihPP/20uq1Tp07KvHnz7ntuouqTW4RClFB0dDR169YlKCgIAI1GQ1hYGFu3bsVoNKrldu7cSevWrenfv3+ROjQajdnisba2RqvVAgW3ZFJTU8nLy6Ndu3acOXOmTHVGRESQm5vLzp071W2bN28GUG+3AGpvCkBaWhoZGRl06tSpzMe90+HDh0lPT2fIkCGkpKSof6ysrOjQoYN6a8bOzg4bGxt++umnIref7mfw4MH8+uuvau8RFPReabVatefD0dERgB9++MGsA9CfeuopgoOD6dmzJzNmzKB27dosXryY+vXrm5R77LHHTH7evn07Tk5OdO/e3eS6tG3bFgcHB/W6HD58GIPBwOjRo03ec08++eR9Yztz5gzXrl1j7NixODs7m+wryfu3ImIsFBERAfz1HgXYsWMHubm5d32/ZmRkkJKSwkMPPcTVq1fNcqv37NmzxMfHM3ToUG7duqWes06nIzg4mJ9//pn8/HwAnJ2dOXHiRLFjx0T1IrcIhSgBo9HIli1bCAoKMhmP4e/vz4oVK4iJiSEkJAQouN1z5y228rJhwwZWrFjB5cuXTW6r3O3W2P2Ehobi6urK5s2biYyMBArGX7Vu3ZpWrVqp5fbt28cnn3zC2bNnTQbFmyuBjI+PB+7+ZVuY+Gi1WmbOnMnbb79N9+7d6dChA7169WL48OF4eHjc8xiDBg3irbfeYuvWrUyePBlFUdi+fTuhoaFq/U2bNuXpp59m5cqVREdH07lzZ/r06UNERMQD3R6cM2cOXl5eWFtbU7duXby8vIoMMq9VqxYNGjQw2XblyhUyMjIIDg4utt6bN28CkJCQAEDz5s1N9ru7u+Pi4nLP2K5evQqAj49Pic+nomMs1Lp1a3x8fNi8eTNTp04FCpItNzc39fMI8Msvv7Bo0SKOHz9eJFHOyMh44Fu9he/XWbNm3bVMRkYGLi4uzJw5k9mzZ9OrVy/atm1Lz549GT58OE2bNn2gGETlIwmWECXw448/kpyczJYtW9iyZUuR/dHR0Sa/0MuD0WjE2tpa/Xnjxo3Mnj2bfv36MX78eOrUqYO1tTVLlixRvyRLy8bGhkGDBvHtt99y48YNEhISiI+P56WXXlLLHD16lClTptClSxdef/11PDw8sLGxYd26dSY9CcW5WwJ2ew8gFAx+BnjnnXeKTZRuvw5PPfUUffr0Yffu3fzwww98+OGHLF26lFWrVtGmTZu7xlK/fn06d+7Mtm3bmDx5MsePHychIUEdTF5o9uzZjBgxgj179nDo0CHeeOMNlixZwtq1a4skQCXl7+9P+/bt71lGq9UWSbry8/OpU6cO7777brGvcXd3L1M85lTRMQ4dOpT33nuPU6dO0aBBA44cOcKoUaOoVavg6+3333/nqaeewtvbm9mzZ9OwYUNsbGw4cOAAn332mdqzVJy7vV/vfE3h+/Uf//jHXcc+Ojg4AAVTonTu3Jldu3Zx6NAhoqKiWLZsGYsWLaJnz56lPn9ReUmCJUQJREdHU6dOHebMmVNk365du9i1axfz5s3Dzs4OT0/P+z4Jda+eHhcXF9LT04tsT0hIMPlf7o4dO2jatCmLFy82qW/hwoUlOaW7Gjp0KF9//TVbt27l2rVraDQawsPDTY5ra2tLVFSUeosSCp7Uup/CW07p6ekmt58KezMKFZ5nnTp16Nat233r9fT0ZNy4cYwbN474+HiGDx/OihUr7volX2jw4MHMmzePuLg4tm7dir29Pb179y5SrvApuWeffZZjx47x2GOPsWbNGmbMmHHf2MzJ09OTmJgYOnbsaHLb606NGjUCCnpWbn/PpKSk3PdWamH58+fP3/Pa3+09XBEx3i48PJz333+fzZs306hRI4xGo8ntwb1796LX6/nkk0/UYwIlmrm+8D16523EO58+LYzf0dGxRO/XevXq8cQTT/DEE09w8+ZNRowYwaeffioJVjUjY7CEuI+cnBx27txJr169GDRoUJE/TzzxBFlZWezduxcoeBrvt99+Y9euXUXqKvyfrr29PUCxiVTTpk05ceKEya23ffv28eeff5qUK+zFKawTCh4TP378+AOdb6dOnWjcuDGbNm1i69at6tNatx9Xo9GY9Drdbw6nQp6engD8/PPP6jadTsd3331nUq5Hjx44OjqyZMmSYp8oS0lJASA7O5vc3Nwix6hdu3ax83ndaeDAgVhbW7Nlyxa2b99Or1691J4GKHhSMy8vz+Q1Pj4+WFlZmdSfkJDApUuX7nu8BzV48GCMRiMff/xxkX15eXnq+6lbt27Y2Njw5Zdfmrw/CqdZuJe2bdvSpEkTPv/88yLvz9vrutt7uCJivF2jRo3o3LkzW7duZdOmTTRp0sTkidziPicZGRkl+g9Bce9Xo9HI2rVrTcq1a9cOT09PVqxYQVZWVpF6Ct+vRqOxSLJWp04d6tWrV6L3q6hapAdLiPvYu3cvWVlZ9OnTp9j9AQEBuLu7s2nTJsLCwhg/fjw7duzghRde4OGHH6Zt27akpaWxd+9e5s2bR+vWrfH09MTZ2Zmvv/6a2rVr4+DggL+/P02bNuWRRx5hx44dTJgwgcGDB/P7778THR2t/rIv1KtXL3bu3Mlzzz1Hr169uHbtGl9//TUtW7Z8oEkpNRoNQ4cO5dNPPwXghRdeMNnfs2dPVq5cyYQJEwgPD+fmzZt89dVXeHp6cu7cuXvW3b17dxo1asQ///lP4uLisLa2Zt26dbi5uZn0Yjk6OjJ37lz+8Y9/EBkZSVhYGO7u7iQkJHDgwAE6duzInDlziI+P56mnnmLQoEG0bNkSa2trdu/ezY0bN0o0g3edOnUICgpi5cqVZGVlERYWZrL/xx9/5F//+heDBg2iefPmGI1GNm7ciLW1NQMHDlTLzZo1i59++um+5/+gHnroIUaNGsWSJUs4e/Ys3bt3x8bGhvj4eLZv384///lPBg0ahLu7O+PGjWPJkiVMmjSJnj17cubMGQ4ePIibm9s9j2FlZcXcuXOZMmUKw4cPJzIyEg8PD+Li4rh48SJRUVEA6pQCb7zxBiEhIeqs6RUR450iIiJ47bXXSEpKYvLkySb7Co8/efJkHn30UbKysvj222+pU6cOycnJ96y3VatWBAQE8P7775OWloaLiwtbt24tknRbWVnxxhtvMHHiRMLDw4mMjKR+/fokJiZy5MgRHB0d+fTTT8nKylLn0GvdujUODg4cPnyYU6dOyZqd1ZAkWELcx6ZNm7C1taV79+7F7reysqJXr15ER0dz69Yt3NzcWL16NYsWLWLXrl1s2LCBOnXqEBwcrD4lZmNjw1tvvcX777/P3LlzycvL480336Rp06b06NGD2bNns3LlSubPn0+7du349NNPefvtt02OGxkZyY0bN/jmm2/44YcfaNmyJf/973/Zvn07P/300wOdc2GCVThj9u2Cg4P5z3/+w7Jly5g/fz5NmjRh5syZ/PHHH/dNMGxsbFi8eDHz5s3jww8/xMPDgyeffBJnZ2defvnlIjHUq1ePpUuXEhUVhV6vV8dNFQ7Ab9CgAUOGDCEmJoZNmzZhbW2Nt7c3CxYsKBL33YSFhXH48GFq165d5BaNr68vISEh7Nu3j8TEROzt7fH19WXZsmUEBASUqH5z+9e//kW7du34+uuv+eCDD7C2tqZx48ZERESY9NxMnz4drVbL119/zZEjR9QHMiZNmnTfY/To0YNVq1bx0UcfsWLFChRFoWnTpowcOVItM2DAAMaMGcOWLVvYtGkTiqKoSW1FxHi7gQMH8u9//xu9Xq8+WVjI29ubhQsXsmDBAt5++23q1q3LY489hru7O6+88sp963733XeZM2cOS5cuxdnZmb/97W8EBQUVmXsrKCiIb775ho8//pgvv/wSnU6Hh4cH/v7+jBo1Cih4mvGxxx7j0KFD7Ny5E0VR8PT05PXXX+fxxx8v1TmLyk+j3N5vKoQQQgghHpiMwRJCCCGEMDNJsIQQQgghzEwSLCGEEEIIM5MESwghhBDCzCTBEkIIIYQws0qVYG3bto0pU6YQGhpKQEAAw4YN43//+5/JBHFjxoxRZ1W+/c+dk/xlZGTwyiuv8NBDDxEYGMi0adNISkoqcsxjx44xatQo/P396d27N0uXLuXOBysVRWHp0qX06tVLfeT2QSdzFEIIIUT1VammaRg1ahSNGzemX79+uLm5cfjwYZYvX85zzz3H888/DxQkWHl5eUUW1fTz88PW1lb9efz48Vy8eJFZs2Zha2vLggULsLKyYt26deoaVVeuXGH48OF0796dJ554gnPnzvHuu+8yY8YMxo8fr9a1dOlSFi5cyMyZM/H19WX16tUcPnyYjRs3lnmBztjYWBRFwcbGpkyvF0IIIUTFMxgMaDQaAgMD71muUk00+sknn5gsBBocHExqaiorV67k2WefVRc+dXZ2vuckf7Gxsfzwww9ERUWpC/B6eXkRFhbGzp071dmao6KicHNz4/3330er1RIcHExKSgqffvopY8aMQavVkpuby5IlSxg3bhxPPfUUULCUyKBBg4iKimLu3LllOldFUYr0lFU0RVEwGAzY2Njcc208UX6kDSxLrr/lSRtYnrRB6ZT0u7tSJVjFrbLu5+fH2rVr0el0ODo6lqiegwcP4uzsbDLztre3N35+fhw8eFBNsA4ePEj//v1NFqwNCwtjyZIlxMbGEhQUxLFjx8jMzGTw4MFqGa1WS//+/Ytda66kCnuu2rdvX+Y6HpROp+Ps2bO0bNnSZP01UXGkDSxLrr/lSRtYnrRB6Zw6dapE5SrVGKzi/PLLL9SvX98kufrpp58ICAigffv2jB492mQhToC4uDi8vLyKZOLe3t7ExcUBBW+oP//8E29v7yJlNBqNWq7w7zvLtWjRgoSEBHJycsxzokIIIYSoNipVD9adjh49ytatW03GW3Xp0oVhw4bRvHlzkpKSiIqK4umnn+aLL75Q74emp6fj5ORUpD4XFxdOnz4NoK5o7uzsbFJGq9Vib29PWlqaWpdWqzUZ31X4OkVRSEtLw87OrkznpyjKAy3K+6Cys7NN/hYVT9rAsuT6W560geVJG5SOoiglupVaaROs69evM2PGDIKCghg7dqy6fdq0aSblevXqRXh4OB9//DHLli2r6DAfiMFg4OzZs5YOg/j4eEuHUONJG1iWXH/LkzawPGmDkrt9aNHdVMoEKz09nYkTJ+Lq6sqiRYvUwe3FcXBwoGfPnuzYsUPd5uzszPXr14uUTUtLw8XFBUDt4SrsySqk1+vJzs5Wyzk7O6PX68nNzTXpxUpPT0ej0ajlysLGxoaWLVuW+fUPKjs7m/j4eJo3b469vb3F4qjJpA0sS66/5UkbWJ60QelcvHixROUqXYKVk5PDpEmTyMjI4Jtvvin2Vt/9eHt7ExMTU6Qb7/Lly/j4+AAFiVnDhg3VMVa3l1EURR1zVfj35cuXad26tVouLi6ORo0alfn2IIBGoynRgEKj0YjBYCjzce6mMHG1srK6ZxIrys+dbWBjY4O1tbWFo6p57O3tZXCvhUkbWJ60QcmU9EnLSpVg5eXlMX36dOLi4li9ejX169e/72t0Oh379+83eRovNDSUjz/+mJiYGLp16wYUJEhnzpxhwoQJJuX27NnDSy+9pD7Vt3XrVpydndXxXB07dsTR0ZFt27apCZbBYGDnzp2Ehoaa7dyLoygK169fJzU1tVzqz8/Pp1atWiQkJEiCZSHFtYGrqysNGjSQx6WFEKIKq1QJ1rx589i3bx+zZ88mMzPTZLb0Nm3acPLkSZYvX07//v1p3LgxSUlJrFy5kuTkZD788EO1bGBgICEhIbzyyivqRKMffPABvr6+DBgwQC03fvx4oqOjefHFF3nsscc4f/48UVFRzJgxQ72/amtry6RJk1i0aBHu7u74+PiwZs0aUlNTTSYjLQ+FyVW9evVwcHAw+xeu0WhUb31Kr4ll3N4GVlZW6HQ6dcWBhg0bWjg6IYQQZVWpEqxDhw4B8NZbbxXZt2fPHjw8PDAYDHzwwQekpqZib29PYGAg8+bNw9/f36T8ggULePPNN5kzZw55eXmEhITw6quvqrO4AzRr1oyoqCjeeustnnnmGdzd3Zk2bRrjxo0zqWvixIkoisKKFStISUnBz8+PqKioMs/iXhJGo1FNrurUqVNuxwCws7OTBMtC7myDwvEPSUlJ1KtXT9pFCCGqqEq1VE5NUjhR2d0mGs3JyeHy5cvlOujQaDSSk5MjCZYFFdcGhQNOvby8HmiMn7i/wgkW/fz8ZOyJhUgbWJ60Qenc7/u7kAy8qeRkHE7NI20uhBBVX6W6RSiEEEII8SAydHrSMnPJyjZQ294GF0dbnBzuP2+VuUmCJYQQQohqITk1m0VrY4k9l6xuC/T1YOrIQDxcK3aOL7lFKCpUREQEvr6+HD16tNSvXbRoEceOHSuHqP7i6+tLVFRUuR5DCCGE+WXo9EWSK4DYc8ksWhtLhk5fofFIgiUqzIULFzh37hwA0dHRpX794sWLiY2NNXdYQgghqoG0zNwiyVWh2HPJpGXmVmg8kmCJChMdHY2VlRVBQUFs3769XGanF0IIUTNl6u79nXK//eYmCVYNkaHTcy0pg3NXUriWlFHhXaWKorB582a6du3K008/TWpqKt9//71JmUuXLvH888/z0EMP0aFDByIiIti8eTNQcOsO4J133sHX1xdfX1+OHDnCtWvX8PX1Zfv27SZ1/ec//6FPnz7qz0lJSbz88sv07dsXf39/BgwYwPvvv49eX7HXQQghRPmws733dEP3229uMsi9BrjroL9HAqioByuOHTvGH3/8wXPPPUdISAiurq5s3rxZTYLi4+MZNWoUDRs25J///CceHh6cP3+ehIQEAL755htGjRrFmDFjCA8PB6Bly5YlXkbo1q1buLq68vLLL+Ps7Ex8fDyLFi0iOTmZN998s1zOWQghRMWx0mjo0MqDExeK3ibs0MoDqwqeAkcSrGrunoP+vj3OjFEdqIipLDdv3oytrS0DBgzAxsaGgQMHsmnTJrKysqhduzaLFi3CxsaGNWvW4OjoCKCuIwkQEBAAFCwfU/hvoMQJlq+vL7NmzVJ/7tixI/b29syePZs5c+bICvJCCFHFWVtriOjhDWCSZHVo5UFED2+srSXBEmZ0v0F/GdlGnB3LN4a8vDy2b99Oz549cXJyAmDo0KF888037Nq1i+HDh/Pjjz8ycOBANbkyN0VRWLVqFWvXruXatWvk5v412PHq1av4+PiUy3GFEEJUDOfatqw88iu+zdwYFuqN3pCP1saK367cYueReF54tGOFxiMJVjWXlX3vQX26nPIf9Hfo0CFSUlLo3bs36enpAPj4+ODh4cHmzZsZPny4uu5ieVm1ahVvv/02EyZMICgoCGdnZ06dOsW//vUvk2RLCCFE1eTkoGVSZAcWrY1l7e7z6vZAXw+mjQys8MlGJcGq5mrb29xzv4PdvfebQ+GUDC+//DIvv/yyyb5bt25x8+ZNXF1dSUpKKnXdtra2AEWeSCxM5Apt376dPn368OKLL6rbLl26VOrjCSGEqLw8XO15aXRnmcldlD8XR1sCfT2KvU0Y6OuBk335PlWRnZ3Nnj176NevH2PHjjXZd+PGDf7+97+zdetWgoOD2bFjBzNnzrzrbUIbG5sivU116tTBxsbGJFnS6/X8/PPPJuVycnKwsTFNJssyF5cQQojKzclBa5GE6k6SYFVzTg5apo4MvOtThNpaSrkef8+ePeh0OsaMGUNQUFCR/cuXL2fz5s28/fbb7N+/n8cff5wJEybg4eHBpUuXyM7OZuLEiQB4e3uzZ88eOnfujL29PV5eXjg6OtK/f39Wr15Ns2bNcHNz48svv0RRFJNFk7t168bnn3/Ol19+SfPmzdm0aRNXrlwp13MXQghRc0mCVQPcrcvUwdaanJyccj325s2badSoUbHJFcDw4cOZP38+VlZWfP3117z33nvMmzcPo9FI8+bNeeaZZ9Syc+bMYf78+UycOJGcnBw+//xzgoKCeO2113jttdd44403qF27NuPHj8fLy4s9e/aor33uuee4desWCxcuBGDgwIG8+uqrTJ48uVzPXwghRM2kURSlfLswRLFOnToFQPv27Yvdn5OTw+XLl/Hy8sLOrnwmUjAajeTk5GBnZ4e1dcVOwCYKFNcGFdH2ooBOp+Ps2bP4+fnh4OBg6XBqJGkDy5M2KJ37fX8XkpnchRBCCCHMTBIsIYQQQggzkwRLCCGEEMLMJMESQgghhDAzSbCEEEIIIcxMEiwhhBBCCDOTBEsIIYQQwswkwRJCCCGEMDNJsIQQQghR5V2+fJlff/3V0mGoZKkcIYQQQlRZeXl57N27l5iYGLRaLQ0bNsTd3d3SYUkPlih/ixYtwtfXV/3TtWtXxo4dy9GjR8vtmP/5z3/o06eP+vP69evx9fUlJSWlxHXs3r2b1atXl2tcQgghyi4pKYnly5cTExMDQLt27XB0dLRwVAWkB0tUCDs7O1atWgXA9evX+fjjj3nqqadYv349Pj4+5X78Xr168c033+Ds7Fzi1+zevZvTp0/zxBNPlGNkQgghSktRFH766Sd2795NXl4eDg4ORERE4Ovra+nQVJJgiQphZWVFQECA+rO/vz99+vTh66+/Zs6cOSZlFUXBYDCg1WrNdnx3d/dK0WUshBDiweTn5/P1119z4cIFAFq2bMmwYcMqTc9VIblFKCyiUaNGuLu7c+3aNWbPnk14eDgHDhwgIiKC9u3bs3fvXgBiY2MZO3YsAQEBdOrUiRdffJGbN2+a1JWYmMjkyZPp0KEDPXr0YNmyZUWOV9wtQr1ezwcffEDfvn1p164doaGhzJ49G4DZs2ezYcMGLly4oN7aLNxnzriEEEKUjpWVFfXq1aNWrVqEhYXx+OOPV7rkCqQHq0rS6/V33WdlZUWtWrVKVDY/P7/E9Wo0GmxsbEoR5b1lZmaSmppKvXr1yMvLIykpiTfeeIMpU6bQsGFDGjVqRGxsLGPGjKFnz5588MEHZGdns2DBAp599lm++eYbta5nn32WxMRE5s6di5OTE8uWLePPP/80uQ7FmTp1Kj/++COTJk0iICCAlJQUdu7cqdaZkpJCXFwc7777LoDaA1becQkhhDCl1+vJyclRh3n07t2bwMBA6tSpY+HI7k5+01dBb7755l33tWrViscff1z9+d1338VgMBRb1tPTk5EjR6o/f/jhh+h0umLLNmrUiIkTJ5Yx4gJ5eXlAwRist99+G6PRyMCBA9myZQtpaWksW7aMDh06qOX/+c9/0q5dOxYvXoxGowHAx8dH7e3q2bMnBw8e5PTp03z22WcEBwcDEBQURM+ePXF1db1rLIcOHWL//v289957hIeHq9sL/+3p6Ym7uzsJCQkmtzYB3nvvvXKLSwghhKk//viD9evXY2dnx7hx47C2tsba2rpSJ1cgtwhFBdHpdLRt25a2bdvSt29fjhw5wpw5c+jRowcArq6uJslVdnY2x44dY9CgQRiNRvLy8sjLy6N58+Y0bNiQU6dOAXDy5EmcnJzUJAbAycmJbt263TOemJgY7O3tGTJkSKnOo7zjEkIIUSA/P58DBw4QFRVFSkoKmZmZpKWlWTqsEpMerCro5Zdfvus+KyvTnHnmzJl3LZufn4/RaFR/fuGFF+5atrCnpqzs7Oz48ssv0Wg0uLm50bBhQ5NY69ata1I+PT0do9HIm2++WWyP3Z9//gkUPKJb3OD1+/3PJjU1FQ8Pj1KfV3nHJYQQAm7dusWGDRu4evUqUDD9QlhYGPb29haOrOQkwaqCSvN03b3KGo1GkwTLnE/t3cnKyor27dvfdf+diY6TkxMajYZJkybRr1+/IuXd3NwAqFevXrFzW9054PxOrq6uJCcnoyhKqZKs8o5LCCFqMkVROHHiBNu2bUOv12Nra0tYWBj+/v6WDq3UJMESlZKDgwMBAQHExcXdMzFr3749GRkZxMTEqLfjMjIyOHz48D3HOnXr1o1ly5axbds2wsLCii1jY2NDbm5uhcYlhBA1maIo/Pzzz+j1ejw9PRkxYkSV/Z0pCZaotP7xj3/w5JNPMn36dIYMGYKzszPXr1/n8OHDREZGEhQURGhoKG3btuWll15i5syZODk5sXTp0vs+stutWzd69uzJK6+8wu+//06HDh1ITU1lx44dLFiwAIAWLVqwbt06Nm/eTLNmzXBzc6NJkyblGpcQQtREhXcTrKysiIyM5OzZs3Tr1q3IsJeqRBIsUWl17NiRr776ikWLFvHyyy9jMBho0KABXbt2pVmzZkDBrcWPP/6Y119/nTlz5uDs7MyYMWO4ceMGe/bsuWf9ixYtYvHixXzzzTcsXryYOnXq0L17d3X/3/72N06ePMm///1vUlNTGTFiBG+99Va5xyWEEDVFXl4ee/bsoVatWvTt2xcoGKsaEhJi4cgenEZRFMXSQdREhU+b3e02U05ODpcvX8bLyws7O7tyicFoNJKTk4OdnR3W1tblcgxxb8W1QUW0vSig0+k4e/Ysfn5+ODg4WDqcGknawPIs1QZJSUmsW7eOpKQkNBoNzz//fJVYceN+39+FpAdLCCGEEBVGURSOHDnC7t27MRqNODg4MGzYsCqRXJWGJFhCCCGEqBAZGRls3LiRS5cuAQWTY0dERFTL8amSYAkhhBCi3BmNRlasWEFqaiq1atViwIABdO7c+YHnWaysJMESQgghRLmztrYmNDSUn3/+mcjIyCITTFc3kmBVcvIMQs0jbS6EqC6uXbtGfn4+np6eAAQEBODv718jHqyquhNMVHM2NjYAd118WVRfhW1e+B4QQoiqJj8/n/3797NixQrWrVtHdnY2UDCFTU1IrkB6sCota2trXF1dSUpKAgpmEDf3fWqj0ajOVF5T3vCVze1tYGVlhU6nIykpCVdXV2kTIUSVlJKSwoYNG7h27RoAzZo1q7bjrO5FEqxKrEGDBgBqkmVu+fn55OXlUatWrSo9W25VVlwbuLq6qm0vhBBVhaIoHD9+nO3bt6vrCA4ZMuS+80VVV5JgVWIajYaGDRtSr149DAaD2evPzs4mLi4OT0/PKrVCeXVyZxvY2NhIz5UQosrJy8tj/fr1nD17FijotRo+fHiVXUfQHCTBqgKsra3L5Us3Pz8fAFtbW5kx3EKkDYQQ1YG1tTVWVlZYWVnRu3fvKr+OoDlIgiWEEEKIUsvLyyMvLw87Ozs0Gg1Dhgyhe/fuNGzY0NKhVQqSYAkhhBCiVBITE1m/fj116tThkUceQaPRYG9vL8NNbiMJlhBCCCFKRFEUfvzxR/bs2YPRaCQrK4uMjAycnZ0tHVqlIwmWEEIIIe4rPT2djRs3EhcXB4CPjw8RERHUrl3bwpFVTpJgCSGEEOKezpw5w+bNm8nOzqZWrVoMHDiQTp061cj5rUpKEiwhhBBC3JXBYGDnzp1kZ2fTsGHDGrGOoDlIgiWEEEKIu7KxsWHEiBFcvHiRXr16yVx9JVSpJqnYtm0bU6ZMITQ0lICAAIYNG8b//ve/IovffvvttwwcOJD27dsTERHBvn37itSVkZHBK6+8wkMPPURgYCDTpk0rdkb0Y8eOMWrUKPz9/enduzdLly4tcjxFUVi6dCm9evXC39+fUaNGcfz4cbOeuxBCCFEZFK4jGBsbq25r1qwZffv2leSqFCpVgvXZZ59hb2/P7Nmz+eSTTwgNDeW1117jo48+Usts2bKF1157jcGDB7Ns2TICAgJ4/vnniyQ806dP59ChQ8ydO5d3332Xy5cvM3HiRPLy8tQyV65cYfz48Xh4eLBkyRKefPJJFi5cyIoVK0zqWrZsGQsXLuSpp55iyZIleHh4MG7cOK5evVqu10MIIYQoiQydnmtJGZy7ksK1pAwydPoy1ZOSksKKFSs4cOAA27ZtIzMz08yR1hyV6hbhJ598gru7u/pzcHAwqamprFy5kmeffRYrKysWLlzIkCFDmD59OgBdu3bl/PnzfPTRRyxbtgyA2NhYfvjhB6KioggJCQHAy8uLsLAwdu7cSVhYGABRUVG4ubnx/vvvo9VqCQ4OJiUlhU8//ZQxY8ag1WrJzc1lyZIljBs3jqeeegqATp06MWjQIKKiopg7d26FXR8hhBDiTsmp2SxaG0vsuWR1W6CvB1NHBuLhWrJ5qRRF4eTJk+zduxeDwYCtrS3h4eE4OjqWV9jVXqXqwbo9uSrk5+dHZmYmOp2Oq1evEh8fz+DBg03KhIWFERMTg15fkLEfPHgQZ2dnunfvrpbx9vbGz8+PgwcPqtsOHjxI37590Wq1JnWlp6erXaPHjh0jMzPT5JharZb+/fub1CWEEEJUtAydvkhyBRB7LplFa2NL1JOl0+n45Zdf2LFjBwaDgebNmzNlyhTatWtXXmHXCJWqB6s4v/zyC/Xr18fR0ZFffvkFKOiNul2LFi0wGAxcvXqVFi1aEBcXh5eXV5HHR729vdX5O3Q6HX/++Sfe3t5Fymg0GuLi4ggKClLL31muRYsWrFq1ipycnDKvIacoCjqdrkyvNYfs7GyTv0XFkzawLLn+lidt8GBupecVSa4KxZ5L5lZ6DtbkFbsfQK/Xs2rVKjIzM7GysiIkJIQuXbpgZWVl0e+nykxRlBJNT1GpE6yjR4+ydetWZs2aBUBaWhpAkRljC38u3J+eno6Tk1OR+lxcXDh9+jRQMAi+uLq0Wi329vYmdWm1WmxtbYscU1EU0tLSypxgGQwGdeVxS4qPj7d0CDWetIFlyfW3PGmDstG6NLnn/rTMbJL/uHbPMg0aNOD69esEBgbi7OzMuXPnzBlitXT7na+7qbQJ1vXr15kxYwZBQUGMHTvW0uGUCxsbG1q2bGmx42dnZxMfH0/z5s1l/SgLkTawLLn+lidt8GBupN+9dwrAxdGeuo38TLYlJSVRq1YtdVhO06ZNiY+Pp0WLFtIGJXDx4sUSlauUCVZ6ejoTJ07E1dWVRYsWYWVVMFTMxcUFKOh98vDwMCl/+35nZ2euX79epN60tDS1TGEPV2FPViG9Xk92drZJXXq9ntzcXJNerPT0dDQajVquLDQaDQ4ODmV+vbnY29tXijhqMmkDy5Lrb3nSBmXjhp5AX49ibxMG+nrg5myHg0NBb4uiKMTExLB3717q1avH+PHj1WkXrK2tpQ1KqKSz11eqQe4AOTk5TJo0iYyMDJYvX25yq69wHFThuKhCcXFx2NjY0LRpU7Xc5cuXi8xndfnyZbUOBwcHGjZsWKSuwtcVliv8+/Lly0WO2ahRozLfHhRCCCEelJODlqkjAwn09TDZHujrwbSRgTj9f3KVnp7OF198wa5duzAajTg5OWEwGCwRco1RqXqw8vLymD59OnFxcaxevZr69eub7G/atCnNmzdn+/bt9OvXT92+detWgoOD1XuioaGhfPzxx8TExNCtWzegIEE6c+YMEyZMUF8XGhrKnj17eOmll7CxsVHrcnZ2JjAwEICOHTvi6OjItm3baN26NfDXsgGhoaHldzGEEEKIEvBwteel0Z1Jy8wlK9tAbXsbXBxt1eTq119/ZfPmzeTk5Mg6ghWoUiVY8+bNY9++fcyePZvMzEyTyUPbtGmDVqtl6tSpzJw5E09PT4KCgti6dSsnT57kyy+/VMsGBgYSEhLCK6+8wqxZs7C1teWDDz7A19eXAQMGqOXGjx9PdHQ0L774Io899hjnz58nKiqKGTNmqMmara0tkyZNYtGiRbi7u+Pj48OaNWtITU1l/PjxFXZthBBCiLtxctCqCVUhg8HAli1bOHHiBACNGjVixIgRso5gBalUCdahQ4cAeOutt4rs27NnD02aNCE8PJzs7GyWLVvG0qVL8fLyYvHixWqPU6EFCxbw5ptvMmfOHPLy8ggJCeHVV1+lVq2/TrlZs2ZERUXx1ltv8cwzz+Du7s60adMYN26cSV0TJ05EURRWrFhBSkoKfn5+REVFqbckhRBCiMrGysqKGzduoNFoCAkJoWfPnrLUTQXSKHcOVBIV4tSpUwC0b9/eYjHodDrOnj2Ln5+fDGy0EGkDy5Lrb3nSBuZlNBoB1EQqJSWFjIwMmjVrdtfXSBuUTkm/vyvdIHchhBBClN7NmzdZuXIle/fuVbe5u7vfM7kS5adS3SIUQgghROkoisKxY8fUpW5SUlIICQmROa0sTBIsIYQQoorS6XRs2rRJnX29efPmDB8+XJKrSkASLCGEEKIKunjxIhs3blTXEezTpw/dunWT6RcqCUmwhBBCiComOzub//3vf+Tm5lK3bl0efvhhGjRoYOmwxG0kwRJCCCGqGHt7ewYPHswff/xB//791cmyReUhCZYQQghRyRWuI9igQQN1CbcOHTrQoUMHC0cm7kYSLCGEEKISS0tL47vvviM+Ph4nJyeeffZZWQe3CpAESwghhKikbl9H0MbGhp49e2Jra2vpsEQJSIIlhBBCVDK5ubnqWrtQsI5gZGQkderUsXBkoqQkwRJCCCEqEZ1Ox7Jly0hNTZV1BKswSbCEEEKISsTe3p4mTZoAMGLECDw9PS0ckSgLSbCEEEIIC7t58yb29vY4ODig0WgYMmQIGo1GxltVYbLYsxBCCGEhiqLwyy+/sGTJEqKjo1EUBQA7OztJrqo46cESQgghLCArK4vo6Gh1HcGcnBwMBgNardbCkQlzkARLCCGEqGAXLlxg48aNZGVlYW1tTZ8+fQgODpZ1BKsRSbCEEEKICmIwGNi1axc///wzAB4eHkRGRso6gtWQJFhCCCFEBTEajZw/fx6AoKAg+vbtK+sIVlOSYAkhhBDlqHDgukajwc7Ojocffpjc3Fxatmxp4chEeZIESwghhCgnhesItm3bls6dOwPQtGlTC0clKoIkWEIIIUQ5OH36NJs3byY3N5fk5GQ6dOggtwNrEEmwhBBCCDPKyclh69atnDp1CoDGjRszYsQISa5qGEmwhBBCCDO5cuUKGzZsIC0tDY1GQ48ePQgNDZV1BGsgSbCEEEIIM0hPT+fzzz8nPz8fNzc3RowYIeOtajBJsIQQQggzcHZ2JiQkhPT0dAYNGiRL3dRwkmAJIYQQZaAoCseOHcPT0xMPDw8AevXqJbOxC0ASLCGEEKLUsrKy2LRpE+fPn6dBgwZMmDABa2trSa6EShIsIYQQohTOnz/Ppk2b1HUE/f39sbKysnRYopKRBEsIIYQoAYPBwM6dOzl69CgA9erVIzIykvr161s4MlEZSYIlhBBC3Ed6ejpffPEFN27cAArWEezXrx+1asnXqCievDOEEEKI+3B0dMTe3h5HR0eGDx9OixYtLB2SqOQkwRJCCCGKkZaWRu3atalVqxZWVlY8/PDD2NjY4ODgYOnQRBUgo/KEEEKIO5w6dYpPPvmEPXv2qNtcXFwkuRIlJj1YQgghxP+7cx3Ba9euYTQaZakbUWqSYAkhhBAUXUcwNDSU0NBQmYJBlIkkWEIIIWo0o9HIvn37OHToEICsIyjMQhIsIYQQNVpmZqY6t1VAQICsIyjMQhIsIYQQNZqLiwtDhw7FysoKPz8/S4cjqgm5sSyEEKJGyczMZM2aNVy8eFHd1rZtW0muhFlJgiWEEKLGOH/+PJ988gnnz59ny5Yt5OfnWzokUU3JLUIhhBDVnsFgYMeOHfzyyy/AX+sIyhOCorxIgiWEEKJaS0hIYP369dy8eROArl270rdvX1lHUJQreXcJIYSotm7cuEFUVBT5+fk4OTkxfPhwvL29LR2WqAEkwRJCCFFt1a1bl7Zt22I0GgkPD8fe3t7SIYkaQhIsIYQQ1crp06fx8vKidu3aAAwbNgwrKys0Go2FIxM1iYzuE0IIUS3k5OSwbt061q1bx6ZNm1AUBQBra2tJrkSFkx4sIYQQVV58fDwbNmwgPT0djUZDo0aNUBRFEithMZJgCSGEqLKMRiN79+7l8OHDQME6gpGRkTRp0sTCkYmaThIsIYQQVVJqairffPMN169fByAwMJBBgwah1WotHJkQkmAJIYSoouzt7cnJycHe3p6hQ4fKUjeiUpEESwghRJWh0+mwt7dHo9Fga2vLqFGjqF27Nk5OTpYOTQgTZUqwEhISSEhIoHPnzuq23377jRUrVqDX6wkPD6dfv35mC1IIIYQ4d+4cmzZtolevXnTp0gWABg0aWDgqIYpXpgTrjTfeQKfT8dlnnwEFM+WOHTsWg8FA7dq12bFjBx9++CEDBgwwZ6xCCCFqIL1ez86dO9V1BE+ePEnnzp3lCUFRqZVpHqyTJ0/SrVs39efvvvuOnJwcNm7cyMGDBwkODmbFihVmC1IIIUTNlJCQwNKlS9XkKjg4mCeffFKSK1HplakHKy0tjTp16qg/79+/ny5duuDp6QlA//79+eCDD8wToRBCiBonPz+fH374gQMHDqjrCI4YMQIvLy9LhyZEiZSpB8vd3Z2EhAQA0tPTOX78OD169FD3G41G8vLySl3vlStXmDNnDsOGDaNNmzaEh4cXKTNmzBh8fX2L/Ll06ZJJuYyMDF555RUeeughAgMDmTZtGklJSUXqO3bsGKNGjcLf35/evXuzdOlSdfbfQoqisHTpUnr16oW/vz+jRo3i+PHjpT4/IYSoLDJ0eq4lZXDuSgrXkjLI0OktHZKJ5ORk9u/fT35+Pm3btmXKlCmSXIkqpUw9WN26deOLL77A0dGRI0eOoCgKffv2VfdfvHiRhg0blrreCxcucODAATp06EB+fn6RRKdQx44dmTVrlsm2OyeVmz59OhcvXmTu3LnY2tqyYMECJk6cyLp166hVq+C0r1y5wvjx4+nevTvTp0/n3LlzvPvuu1hbWzN+/Hi1rmXLlrFw4UJmzpyJr68vq1evZty4cWzcuJGmTZuW+jyFEMKSklOzWbQ2lthzyeq2QF8Ppo4MxMP1wRdDztDpScvMJSvbQG17G1wcbXFyKN3cVPXr16dfv37Url0bf39/uSUoqpwyJVgvvvgily9f5u2338bGxoZ//OMfaqKh1+vZtm0bQ4cOLXW9ffr0UZ8+nD17NqdPny62nLOzMwEBAXetJzY2lh9++IGoqChCQkIA8PLyIiwsjJ07dxIWFgZAVFQUbm5uvP/++2i1WoKDg0lJSeHTTz9lzJgxaLVacnNzWbJkCePGjeOpp54CoFOnTgwaNIioqCjmzp1b6vMUQghLydDpiyRXALHnklm0NpaXRncudTJ0u6RbOv68kUWmzoDWxoqfziRy5c80JkV2uGfylpOTw44dO+jevTv16tUDMBnrK0RVU6YEq27dunz99ddkZGRga2trMmtufn4+q1atKtOjs1ZW5ll7+uDBgzg7O9O9e3d1m7e3N35+fhw8eFBNsA4ePEj//v1N4g8LC2PJkiXExsYSFBTEsWPHyMzMZPDgwWoZrVZL//792bVrl1niFUKIipKWmVskuSoUey6ZtMzcMidYiSlZLFp7ghMX/qq/QysPInp4s2T9CV54tGOxdd+4cYMDBw6QkZFBcnIyEydOlB4rUeU90ESjxU3sZmdnR+vWrR+k2vv66aefCAgIwGg00qFDB1544QV1ThSAuLg4vLy8inxAvb29iYuLAwomq/vzzz/x9vYuUkaj0RAXF0dQUJBa/s5yLVq0YNWqVeTk5GBnZ1em81AUBZ1OV6bXmkN2drbJ36LiSRtYVk28/pn3GWuVqTOU6fdSbh589K1pcgWoP/s2c+NWeg7W/DU+Ny8vj/379xMbGwsUrCPYt2/fGtUelUFN/Bw8iJIuIl7mBCshIYFPP/2UI0eOkJKSwscff0yXLl3Uf0dGRtKmTZuyVn9XXbp0YdiwYTRv3pykpCSioqJ4+umn+eKLLwgMDAQKBt4Xl/y5uLiotx0zMjKAgtuNt9Nqtdjb25OWlqbWpdVqsbW1NSnn7OyMoiikpaWVOcEyGAycPXu2TK81p/j4eEuHUONJG1hWTbr+rh7N7rnfxiq/TL+XXD2aEXu++J6xExeSGRbqTVpmNsl/XAMKfgfHxsaSnp4OgKenJ23atCE1NZXU1NRSH188uJr0OXhQJVnvskwJ1sWLF3niiSfIz8/H39+f33//XX1q0N3dnV9++QWdTsf8+fPLUv09TZs2zeTnXr16ER4ezscff8yyZcvMfrzyZGNjQ8uWLS12/OzsbOLj42nevDn29g8+sFWUnrSBZdXE65+bVzCgvbjbhIG+Hri7OtCwbunX9Ps96d69H3pDPvXdHanbyI/r16+zfft28vLysLOzo127dnTt2rXGtEFlUxM/Bw/i4sWLJSpXpgTrv//9L05OTqxduxYoOhCxZ8+ebNu2rSxVl5qDgwM9e/Zkx44d6jZnZ2d1dfXbpaWl4eLiAvx1e7OwJ6uQXq8nOztbLefs7Ixeryc3N9ekFys9PR2NRqOWKwuNRoODg0OZX28u9vb2lSKOmkzawLLMdf3N8fRceXMApo4MLPYpwmkjA3FzLtsXrKOD8T77bXBztsPBQUvz5s1p2LAhtra29O/fn6tXr8pnoBKQNiiZko4PLFOC9fPPP/Pcc8/h7u7OrVu3iuxv1KgRiYmJZanaLLy9vYmJiSlyn/Ty5cv4+PgABYlZw4YN1TFWt5dRFEUdc1X49+XLl03GlsXFxdGoUaMy3x4UQlQv5T31gTl5uNrz0ujOZk0GXRxt79oz1qGVB4asJOy1bkDBA02PP/44tra2Mu5HVFtlemxPUZR7JhYpKSkluj9pDjqdjv3799O+fXt1W2hoKGlpacTExKjbLl++zJkzZwgNDTUpt2fPHgwGg7pt69atODs7q+O5OnbsiKOjo0mPnMFgYOfOnSZ1CSFqrvtNfVDZJvEEcHLQ0qSeE77N3GlSz+mBe9qcHLRMHRlIoK+HyfbAVu74101ky8b/sXv3bnW7nZ2dPCkoqrUy9WC1adOGAwcO8MQTTxTZl5eXx5YtW+jQoUOp683OzubAgQMA/PHHH2RmZrJ9+3YAHnroIeLi4li+fDn9+/encePGJCUlsXLlSpKTk/nwww/VegIDAwkJCeGVV15h1qxZ2Nra8sEHH+Dr62uyAPX48eOJjo7mxRdf5LHHHuP8+fNERUUxY8YMNUG0tbVl0qRJLFq0CHd3d3x8fFizZg2pqakmk5EKIWquTJ2eoSHeDAxqjtbGit+u3GLTwUvk6I0PPPVBVXJnz5gu/QYH923n7K8Fdzqsra1L/ASWEFVdmRKsZ555hsmTJ/P6668zZMgQAG7evMnhw4f59NNPiYuLY86cOaWu9+bNm7zwwgsm2wp//vzzz2nQoAEGg4EPPviA1NRU7O3tCQwMZN68efj7+5u8bsGCBbz55pvMmTOHvLw8QkJCePXVV9VZ3AGaNWtGVFQUb731Fs888wzu7u5MmzaNcePGmdQ1ceJEFEVhxYoVpKSk4OfnR1RUlMziLoQgOTWbT9adNHmCrkMrD14a3Zn/fnmUHL2RTJ3hHjVUL04OWmrb1eKHH35g//79KIqCs7Mzw4cPl6VuRI2iUe62Hs19fPfdd8yfP5+MjAz1fySKouDo6MjcuXOLXUdQ/OXUqVMAJrc2K5pOp+Ps2bP4+fnJwEYLkTawrAe9/hk6Pf/98uhdxx35NnNj7e7zLJrZi+YNy/5ATFWSmprK+vXruXr1KgBt27ZlyJAhd306TT4DlidtUDol/f4u8zxYw4cPZ8CAARw6dIgrV66Qn5+Pp6cnISEhODo6lrVaIYSoMu41K3rh3E8dWnlgVYNuiWk0GpKSktBqtYSFhck6gqLGeqCZ3B0cHOjfv7+5YhFCiColK/vet/4UBSJ6eGNtXb0TjLy8PHX4hYuLC4888gju7u64ublZODIhLKdMCVZCQkKJyjVq1Kgs1QshRJVQ297mnvudHGxYt+8CLzzasYIienClncsrLi6OjRs3Eh4eTqtWrYCCpcSEqOnKlGD16dOnRF2+lWEZGCGEKC/3m/vp98QMJkd2qDJPEJZmLq+8vDz27t2rTodz6NAhWrZsKbcDhfh/ZUqw5s+fX+RDZDQa+eOPP9i4cSPu7u7FTuEghBDVSeHcT8UlJZMj/XFy0FaZ5OrOubzstNZEhLagdTM3LiekkZ2Th5tzQW9WUlIS69evVyeU7tSpEwMGDJDkSojblCnBioyMvOu+iRMnMnLkyCJL0AghRHVUHrOiW0LhgH07rTWRvVvS3b8RyzaeZu3u82qZQJ+69PRViPlhP0ajEQcHByIiIvD19bVg5EJUTg80yL04Dg4OREZG8tlnnzF27FhzVy+EEJVOVeqpupusbAN2WmteGt2ZlPQcln53mhMXTG99Xrx0GevrlwBo2bIlw4YNk6fGhbiLMi2Vcz/5+fncuHGjPKoWQghRDmrb2xAR2oJN38dRx8WuSHIFkGF0Iklfh+AefXj88ccluRLiHsyaYGVmZrJv3z6ioqJo06aNOasWQghRjlwcbfFvWZcTF5LRG/IBsMJIU9s/qKX5azqK33Oa0qxFWxlvJcR9lOkWYevWre/64VIUhUaNGvH6668/UGBCCCEqjpODFm0tawC0NlbUts7Cy+4KdtZ6bK1yuZjtrZa93/QUQogyJljPPfdcsQmWi4sLnp6edO/e3WTNPyGEEJWfU20bQCHm8A+0rn0RDQq5+TYk6j3UMoG+Hrg42louSCGqiDJlQVOnTjV3HEIIISxMydPRqU48t/5IQwPk29bnTLIHxv//qgj09WDayMAqP6BfiIog3UxCCCH4/fffWb16NRqDHkVTi2u5Tej50EOEN3NDAeq7OeDuYifJlRAlVKIE6+WXXy51xRqNhvnz55f6dUIIISpe/fr1qV27Ng0aNGDAoHAUa7sqPa+XEJZWogTryJEjpa5YnjARQojKLSEhgYYNG6LRaLC1teXJJ5/EyckJK6tymcFHiBqlRAnW3r17yzsOIYQQFSQvL489e/bw448/MmjQIIKCgoCCB5WEEOYhY7CEEKIGSUpKYt26dSQlJQGQmppq2YCEqKYkwRJCiBpAURSOHDnC7t271XUEhw0bho+Pj6VDE6JaKnOCdeDAAT777DPOnDlDRkYGiqIUKXP27NkHCk4IIWqKDJ2+3BaMzsjI4LvvviMuLg6AVq1aERERIUvdCFGOypRg7dixg+nTp9OyZUvCwsJYs2YN4eHhKIrC3r17adasGf369TN3rEIIUS0lpmTx0bcnOBufQkRoC1o3cyPhRhb13R1wd37wqRHS09OJj4+nVq1aDBgwgM6dO8uDSEKUszIlWEuWLMHf35+vvvqKtLQ01qxZw8MPP0xwcDDXrl1j1KhRNGnSxNyxCiFEtZN0S8eitSc4dyWFl0Z3ZtP3cazdfV7dH+jrwdSRgXi42peqXkVR1CSqcePGDB06lMaNG+Ph4XGfVwohzKFMz+JeunSJsLAwrK2t1SVx8vLyAGjSpAmPPfYYy5YtM1+UQghRDWXo9Px5I4sTF5KJCG3Bpu/jOHEh2aRM7LlkFq2NJUOnL3G9165d45NPPiExMVHdFhAQIMmVEBWoTAmWnZ0dNjYFi306Ozuj1WpJTv7rl0LdunW5du2aeSIUQohqKi0zl0ydAYDWzdyKJFeFYs8lk5aZe9/68vPz2b9/PytWrCA5OZk9e/aYNV4hRMmVKcHy8vLi0qVL6s9+fn5s3LiRvLw8cnNz2bx5Mw0bNjRbkEIIUR1lZRvQ2hT8GtYb8u9b9l5SUlJYuXIlBw4cQFEU2rdvT2RkpNliFUKUTpkSrP79+7Nnzx70+oIu68mTJ/PTTz/RpUsXunbtytGjR3nmmWfMGqgQQlQ3te1t+O3KLTq08lATrXuVLY6iKMTGxrJkyRKuXbuGra0tkZGRREZGYmdnVx5hCyFKoMSD3Pft20doaCjW1taMHz+e8ePHq/t69+7NF198wc6dO7G2tqZnz5507dq1XAIWQojqwsXRlit/phHRw5ubaTl0aOVR7G3CQF8PXBxti63j7NmzbNq0CYBmzZoxfPhwXF1dyzNsIUQJlDjBmjJlCm5ubgwePJihQ4cSGBhosr9z58507tzZ7AEKIUR15eSgZVJkB5asP0GLJq48M7wdyzeeJvb8X0lWoK8H00YG3nWqhtatW+Pt7Y2XlxfdunWTdQSFqCRKnGD961//Ijo6mq+//po1a9bQqFEjhg4dytChQ2nRokV5xiiEENWWh6s9LzzakbTMXHQ5BqY87I8hL5/s3LxiJxzNy8sjJiaGrl27YmNjg5WVFaNHj5Z5rYSoZEqcYI0cOZKRI0eSmJjIli1b2Lx5M59++ilLliyhdevWREREEBYWRv369cszXiGEqHacHLQlmkw0MTGR9evXk5SUREZGBmFhYQCSXAlRCZW6L7l+/fqMGzeO9evXs23bNqZMmYJOp+Ptt9+md+/ePPnkk6xbt47MzMzyiFcIIWocRVGIiYlh2bJlJCUlUbt2bVq2bGnpsIQQ9/BAN+u9vLyYNm0aO3bsYO3atYwZM4a4uDheffVVQkJCzBWjEELUWOnp6Xz55Zfs3LkTo9GIj48PU6ZMkUWahajkyrzY852aNGlC06ZNadCgAcnJyeTm3n9SPCGEEHcXHx/P2rVryc7OplatWgwcOJBOnTrJLUEhqoAHSrCysrLYtWsX0dHRHDlyhLy8PBo3bsykSZOIiIgwV4xCCFEjubm5oSgKDRs2JDIykrp161o6JCFECZU6wTIYDBw4cIDo6GgOHDhATk4OLi4u/O1vf2Po0KF06tSpPOIUQoga4datW7i5uQHg4uLCk08+iYeHB9bW1haOTAhRGiVOsGJiYti8eTO7du0iIyMDrVZL7969iYiIIDQ0VF30WQghROkZjUYOHjzI999/z6OPPqqOsWrQoIGFIxNClEWJs6Knn34aKysrgoKCiIiIoH///jg6OpZnbEIIUSOkpKSwfv16/vjjDwDi4uJkELsQVVyJE6zZs2cTFhZGvXr1yjMeIYSoMQrXEdy+fTsGgwFbW1vCw8Np166dpUMTQjygEidYTz31VDmGIYQQVUOGTk9aZi5Z2YZiZ1ovKZ1OR3R0NL/99hsAzZs3Z/jw4bi4uJg7ZCGEBcjAKSGEKKHk1GwWrY0l9pzpWoFTRwbi4Wpfqrp+//13fvvtN6ysrOjTpw/dunWT6ReEqEYkwRJCiBLI0OmLJFcAseeSWbQ2lpdGdy5VT1br1q3p1asXPj4+NGzY0NzhCiEsTJZdF0KIEkjLzC2SXBWKPZdMWua9J1dOTExk1apVZGRkqNt69uwpyZUQ1ZQkWEIIUQJZ2YYy7b99HcH4+Hh2795dHuEJISoZuUUohBAlUNveptT709PT+e6777h8+TIAvr6+DBgwoFziE0JULiVKsBYvXlzqijUaDc8991ypXyeEEJWRi6Mtgb4exd4mDPT1wMXR1mTbr7/+yubNm8nJycHGxoaBAwfSsWNHGcguRA0hCZYQQpSAk4OWqSMDi32KcNrIQJMB7sePH2fjxo0ANGrUiMjISOrUqVPhMQshLKdECVbhPC1CCFGTebja89LozvedB6tNmzYcOnRIfVJQ1hEUouaRMVhCCFEKTg7aIgmV0Wjk5MmTBAQEoNFo0Gq1TJo0SdZoFaIGk0+/EEI8gJs3b7Jhwwb++OMPcnNz6dq1K4AkV0LUcGX+DfDbb7/x5ZdfcubMGTIyMsjPzzfZr9Fo5HFkIUS1pSgKx44dY8eOHRgMBuzs7HBycrJ0WEKISqJMCdaRI0eYMGECLi4utGvXjjNnztC1a1dyc3M5fvw4LVu2lMVKhaihzLVWX2WWlZVFdHQ0586dA2QdQSFEUWVKsBYuXEjTpk1Zu3Yter2ebt26MWnSJIKDgzlx4gQTJ05k5syZ5o5VCFHJmXOtvsoqPj6edevWkZmZiZWVFX379iU4OFimXxBCmCjTTO5nzpzhb3/7G46OjurTMYW3CDt06MCoUaP48MMPzRelEKLSu99afRk6vYUiMx9FUdBqteh0Ojw8PJg4caIs0iyEKFaZerCsra2pXbs2AM7OztSqVYubN2+q+5s2bcqlS5fME6EQokooyVp9VfVWYXZ2Nvb29mg0Gho1asTjjz+Op6cnNjb3nt1dCFFzlakHy9PTk/j4eKBgMLu3t7fJgPb9+/dTt25dswQohKgayrpWX2WmKAqHDx9mwYIFXL9+Xd3eokULSa6EEPdUpgSrZ8+ebNmyhby8PACefvppdu7cyYABAxgwYAB79+5l1KhRZg1UCFG5lWWtvsosLS2Nzz//nF27dqHX6zl58qSlQxJCVCFlSrCeffZZNm7cqI6/GjFiBG+//TatWrWidevWzJ8/n2eeeabU9V65coU5c+YwbNgw2rRpQ3h4eLHlvv32WwYOHEj79u2JiIhg3759RcpkZGTwyiuv8NBDDxEYGMi0adNISkoqUu7YsWOMGjUKf39/evfuzdKlS1EUxaSMoigsXbqUXr164e/vz6hRozh+/Hipz0+I6qxwrb7iFLdWX2V2+vRpPv30U+Lj47GxsWHo0KH079/f0mEJIaqQMo3BsrGxwc3NzWTbsGHDGDZs2AMFc+HCBQ4cOECHDh3Iz88vkugAbNmyhddee43JkyfTtWtXtm7dyvPPP8/q1asJCAhQy02fPp2LFy8yd+5cbG1tWbBgARMnTmTdunXqBIBXrlxh/PjxdO/enenTp3Pu3DneffddrK2tGT9+vFrXsmXLWLhwITNnzsTX15fVq1czbtw4Nm7cSNOmTR/onIWoLkqzVl9llZOTw7Zt29TeqsaNGzNixAhZR1AIUWqVaqrhPn360K9fPwBmz57N6dOni5RZuHAhQ4YMYfr06QB07dqV8+fP89FHH7Fs2TIAYmNj+eGHH4iKiiIkJAQALy8vwsLC2LlzJ2FhYQBERUXh5ubG+++/j1arJTg4mJSUFD799FPGjBmDVqslNzeXJUuWMG7cOJ566ikAOnXqxKBBg4iKimLu3Lnle1GEqEJKulZfZXXq1ClOnjyJRqOhR48ehIaGyjqCQogyKVOCNXbs2PuW0Wg0rFq1qlT1Wlnd+47l1atXiY+P56WXXjLZHhYWxjvvvINer0er1XLw4EGcnZ3p3r27Wsbb2xs/Pz8OHjyoJlgHDx6kf//+aLVak7qWLFlCbGwsQUFBHDt2jMzMTAYPHqyW0Wq19O/fn127dpXq/ISoCYpbq6+q6Ny5MwkJCQQGBuLp6WnpcIQQVViZxmApilLkj9Fo5OrVq/z0008kJiYWWTrHHOLi4oCC3qjbtWjRAoPBwNWrV9VyXl5eReam8fb2VuvQ6XT8+eefeHt7Fymj0WjUcoV/31muRYsWJCQkkJOTY6azE0JUtJSUFI4dO4bBUPCEo0ajYdiwYZJcCSEeWJl6sL744ou77tu3bx+vvfYaL7/8cpmDupu0tDSgYO6t2xX+XLg/PT292DXBXFxc1NuOGRkZxdal1Wqxt7c3qUur1WJrazpA19nZGUVRSEtLw87OrkznoygKOp2uTK81h+zsbJO/RcWTNrAMRVE4efIke/fuJS8vj/3798sgdguRz4DlSRuUjqIoJZpc2OxjsHr37k1ERATz58/nyy+/NHf11YrBYODs2bOWDkOd00xYjrRBxcnNzeXkyZMkJiYCUKdOHerUqVMpPos1mXwGLE/aoORuH1p0N+UyyN3T05PVq1ebvd7ChVQzMjLw8PjrcfD09HST/c7OziaTAhZKS0tTyxT2cBX2ZBXS6/VkZ2eb1KXX68nNzTXpxUpPT0ej0TzQ4q42Nja0bNmyzK9/UNnZ2cTHx9O8eXPs7avHOnFVjbRBxYqLi2Pv3r3odDqsra3p2rUrrq6ueHl5yfW3EPkMWJ60QelcvHixROXMnmDl5eWxbdu2ItM4mEPhOKi4uDiTMVFxcXHY2NioUyZ4e3sTExNTpBvv8uXL+Pj4AODg4EDDhg3VMVa3l1EURa2/8O/Lly/TunVrk2M2atSozLcHoWC8h4ODQ5lfby729vaVIo6aTNqg/B09epQtW7YA4OHhQWRkJM7Ozpw9e1aufyUgbWB50gYlU9K1R8uUYN1tfFVGRgbHjx/nxo0bzJ49uyxV31PTpk1p3rw527dvV6dzANi6dSvBwcFql11oaCgff/wxMTExdOvWDShIkM6cOcOECRPU14WGhrJnzx5eeuklddmLrVu34uzsTGBgIAAdO3bE0dGRbdu2qQmWwWBg586dhIaGmv0chRDlw8fHh71799K+fXv69euHjY2NRcdACiGqtzIlWEeOHCmyrfB2WadOnXjkkUfU+adKIzs7mwMHDgDwxx9/kJmZyfbt2wF46KGHcHd3Z+rUqcycORNPT0+CgoLYunUrJ0+eNBnvFRgYSEhICK+88gqzZs3C1taWDz74AF9fXwYMGKCWGz9+PNHR0bz44os89thjnD9/nqioKGbMmKEma7a2tkyaNIlFixbh7u6Oj48Pa9asITU11WQyUiFE5ZKfn09cXJx6G97Z2Znnn39e/ocuhKgQZUqw9u7da+44ALh58yYvvPCCybbCnz///HOCgoIIDw8nOzubZcuWsXTpUry8vFi8eLHa41RowYIFvPnmm8yZM4e8vDxCQkJ49dVX1VncAZo1a0ZUVBRvvfUWzzzzDO7u7kybNo1x48aZ1DVx4kQURWHFihWkpKTg5+dHVFSUzOIuRCWVlpbGd999R3x8PI8++ii+vr4AklwJISqMRiluPZr7+O677+jcuTNNmjQpdv+1a9c4evQow4cPf9D4qq1Tp04B0L59e4vFoNPpOHv2LH5+fvLFYyHSBuZ3+vRpNm/eTG5urrqO4N0+Z3L9LU/awPKkDUqnpN/fZZpo9OWXXyY2Nvau+0+ePFku82AJIcTd5OTksH79etatW0dubi6NGzdm8uTJFv1PjBCi5irTLcL7dXoVPgIthBAV4ffff2f9+vWkpaWh0WgIDQ2lR48e8ntICGExJU6wfvvtN3777Tf156NHj2I0GouUS09P5+uvvy6ynI0QQpQXnU5HWloabm5ujBgxQsZHCiEsrsQJ1u7du1m8eDFQ8MTgN998wzfffFNsWWdnZ95++23zRCiEEMXIy8tTH1pp3bo1w4YNw8/Pr8iyVkIIYQklTrBGjhxJr169UBSFRx55hGnTphWZB0qj0WBvb4+np6fJ03pCCGEuiqLwyy+/8P333zNhwgR1VYaAgADLBiaEELcpcRZUr1496tWrBxRMmdCyZUvc3d3LLTAhhLhTVlYWmzZt4vz58wD8/PPP9OnTx8JRCSFEUWXqZvLx8eH69et3TbDOnTtHgwYNHmidPiGEuN358+fZtGkTWVlZWFtb07dvX7p27WrpsIQQolhlSrDefPNNLl++zNq1a4vd//rrr+Pt7c38+fMfKDghhChcmuro0aNAQW96ZGQk9evXt3BkQghxd2WaB+vHH3+8Z7d87969iYmJKXNQQghR6NChQ2pyFRQUxMSJEyW5EkJUemXqwUpJScHNze2u+11dXbl582aZgxJCiELdunXjypUrhISE0KJFC0uHI4QQJVKmHiwPDw/OnDlz1/2//vqrDIAXQpRJWloau3btUic01mq1PPnkk5JcCSGqlDIlWP369WPdunXs2bOnyL7du3ezfv16+vXr98DBCSFqllOnTvHJJ59w+PBhfvzxR0uHI4QQZVamW4RTp04lJiaG559/ntatW9OqVSsALly4wG+//UaLFi2YNm2aWQMVQlRfOTk5bN26VV1EtUmTJvj6+lo4KiGEKLsyJVhOTk588803LF++nF27drFjxw4APD09efbZZxk/frysyC2EKJH4+Hi+++47k3UEQ0NDsbIqUwe7EEJUCmWebt3BwYFp06bdtacqLS1N5sESQtzTTz/9xLZt2wBkHUEhRLVi1vVs9Ho9e/bsITo6mu+//17t7hdCiOJ4enpiZWWFv78/gwYNqjbrCGbo9KRl5pKVbaC2vQ0ujrY4OWgtHZYQogI9cIKlKAoxMTFER0eza9cuMjMzcXd3Jzw83BzxCSGqEUVRSExMpEGDBgA0aNCA5557rlo9dZycms2itbHEnktWtwX6ejB1ZCAervYWjEwIUZHKnGCdPn2a6OhotmzZwo0bN9BoNISFhTF69GgCAgLQaDTmjFMIUcVlZmayadMmLl26xIQJE2jYsCFAtUquMnT6IskVQOy5ZBatjeWl0Z2lJ0uIGqJUCdbVq1fZtGkT0dHRXLlyhfr16zN06FD8/f2ZMWMGAwcOJDAwsLxiFUJUUefPn2fjxo3odDqsra1JTk5WE6zqJC0zt0hyVSj2XDJpmbmSYAlRQ5Q4wRo1ahQnT57Ezc2NgQMH8sYbb9C5c2cAfv/993ILUAhRdRkMBnbs2MEvv/wCVP91BLOyDQ+0XwhRfZQ4wTpx4gRNmjRh9uzZ9OrVi1q1zDo+XghRzSQkJLB+/Xp12ayuXbvSt2/fav27o7a9zQPtF0JUHyWeaOa1117Dw8OD559/nu7duzNnzhx+/PFHdTkLIYS43ZUrV7h58yZOTk6MGTOGgQMHVuvkCsDF0ZZAX49i9wX6euDiWD2ekhRC3F+Jf9s98cQTPPHEE1y9epXo6Gg2b97M2rVrqVu3LkFBQWg0GhnYLkQNpyiK+nuga9euGAwGOnfuXGMmHnZy0DJ1ZGCxTxFOGxko46+EqEFK/d/Jpk2b8uyzz/Lss8+qTxJu3boVRVGYN28eBw8epE+fPnTr1q3azGkjhLi/kydP8tNPPzF27Fi0Wq06K3tN4+Fqz0ujO8s8WELUcA/UX9+uXTvatWvHrFmz+PHHH9m0aRNbt27l22+/xd7entjYWHPFKYSopHJyctiyZQunT58GCmZnDwkJsXBUluXkoJWESogaziwDIqysrOjWrRvdunVj3rx56mzuQojqLT4+ng0bNpCeno5Go6Fnz55069bN0mEJIYTFmX3Eqa2tLWFhYYSFhZm7aiFEJWE0Gtm7dy+HDx8GwNnFlaCQ/nh6NiUrJ096b4QQNV71fqRHCFEudu7cyU8//QRAvn1j9l91Z++aC8AFWRZGCCEoxTQNQghRKCQkBDd3d4xuHTiW6EE+1uq+wmVhMnR6C0YohBCWJQmWEOK+MjMz1R4rACcnJ4Y/MpbYK8VPzVK4LIwQQtRUcotQCHFP586dY9OmTeh0OpycnPDz8wMgO9d4z9fJsjBCiJpMEiwhRLH0ej07duzg2LFjANSvX586deqo+2VZGCGEuDtJsIQQRdy5jmBwcDB9+vQxWeqmcFmY22csLyTLwgghajpJsIQQJo4cOcLOnTvJz8/HycmJESNG4OXlVaScLAsjhBB3JwmWEMKEq6sr+fn5tG3bliFDhmBvf/fpFu5cFsbRwQY721pk5+Rx7kqKLBMjhKixJMESooZTFIX09HRcXFwA8PX1Zdy4cTRp0qREC7jfvixMcmo2H35dtEdL5sUSQtQ0Mk2DEDVYdnY269at49NPPyU9PV3d3rRp0xIlV7fL0OmL3C4EmRdLCFEzSQ+WEDXU5cuX+e6779R1BK9cuUL79u3LXF9aZm6xA97hr3mx5FahEKKmkARLiBomLy+PvXv3EhMTA4C7uzuRkZE0btz4geq937xXMi+WEKImkQRLiBokKSmJ9evXk5iYCEDHjh0ZOHAgWu2D9yzJvFhCCPEXSbCEqEF++eUXEhMTcXBwYOjQobRu3dpsdcu8WEII8RdJsISoQfr160d+fj49e/bE0dHRrHXLvFhCCPEXSbCEqMZ+++03Tp06xcMPP4yVlRU2NjYMGTKk3I5357xYMg+WEKKmkgRLiGpIr9ezfft2YmNjAWjRogUdO3askGPfPi+WEELUVJJgCVHN/PHHH6xfv56UlBQAunXrhr+/v4WjEkKImkUSLCGqifz8fH744Qf279+Poig4OzszfPjwYtcRFEIIUb4kwRKimti8ebN6S7Ak6wgKIYQoP5JgCVFNPPTQQ5w7d44BAwbg7+9f6qVuhBBCmI8kWEJUoAyd3uQJu9p21lhZlW1J0OzsbK5cuaLOZdWgQQOmT5+OjY1M6CmEEJYmCZYQFSQ5NbvYOaImhPuWuq64uDi+++47srKyGD9+PI0aNQKQ5EoIISoJSbCEqAAZOn2R5AoKFkFersCMxwJwKEE9d64jWKdOHbkVKIQQlZAkWEJUgLTM3GKXkAGIPZ9Mhi4PN+d713HnOoKdOnViwIABZllHUAghhHlJgiVEBcjKNtxzvy4n7577f/75Z3bs2IHRaMTBwYGIiAh8fUt/a1EIIUTFkARLiApQ2/7eY6Mc7O79UTQajRiNRlq1akVERITZ1xEUQghhXpJgCVEBXBxtCfT1KPY2YaCPB04ORT+KOTk52NnZARAUFISLiwutW7eWMVdCCFEFlO35cCFEqTg5aJk6MpBAXw+T7YG+HkwY6ovtbfmVXq9n06ZNLFu2DL1eD4BGo8HPz0+SKyGEqCKqXA/W+vXrefnll4tsnzhxIjNnzlR//vbbb1m+fDkJCQl4eXkxY8YMevfubfKajIwM3nzzTXbv3o3BYKBHjx68+uqr1KtXz6TcsWPHePvttzl79ix16tThscceY+LEifJlJ0rFw9Wel0Z3LjIPVvylc9R1LRhPde3aNdavX8+tW7cAuHTpEn5+fpYMWwghRBlUuQSr0PLly3FyclJ/rl+/vvrvLVu28NprrzF58mS6du3K1q1bef7551m9ejUBAQFquenTp3Px4kXmzp2Lra0tCxYsYOLEiaxbt45atQouzZUrVxg/fjzdu3dn+vTpnDt3jnfffRdra2vGjx9fYecrqgcnBy1ODn899afT6cjPzyc/P58DBw5w4MABdR3BESNG0Lx5c8sFK4QQosyqbILVtm1b3N3di923cOFChgwZwvTp0wHo2rUr58+f56OPPmLZsmUAxMbG8sMPPxAVFUVISAgAXl5ehIWFsXPnTsLCwgCIiorCzc2N999/H61WS3BwMCkpKXz66aeMGTNGHpEXDywrK4s1a9aQkJAAQLt27QgLC5N1BIUQogqrdmOwrl69Snx8PIMHDzbZHhYWRkxMjDqm5eDBgzg7O9O9e3e1jLe3N35+fhw8eFDddvDgQfr27WuSSIWFhZGenq4urCvEg/jtt99ISEjA1taWESNG8PDDD0tyJYQQVVyV7cEKDw/n1q1bNGrUiJEjRzJhwgSsra2Ji4sDCnqjbteiRQsMBgNXr16lRYsWxMXF4eXlVWQclbe3t1qHTqfjzz//xNvbu0gZjUZDXFwcQUFBZT4HRVHQ6XRlfv2Dys7ONvlbVLzs7Gzatm2Lvb09/fr1w8XFxaLviZpGPgOWJ21gedIGpaMoSonGYFe5BMvDw4OpU6fSoUMHNBoNe/fuZcGCBSQmJjJnzhzS0tIAcHY2nRa78OfC/enp6SZjuAq5uLhw+vRpoGAQfHF1abVa7O3t1brKymAwcPbs2Qeqwxzi4+MtHUKNcuPGDZKTk9XB63Z2drRp04aEhAT1NqGoWPIZsDxpA8uTNii5kgwPqnIJVo8ePejRo4f6c0hICLa2tqxatYrJkydbMLLSs7GxoWXLlhY7fnZ2NvHx8TRv3lxuSVWAvLw8vv/+e44ePQpAhw4daNSo0QO1QW4eZOjy0OUYqG1ng6NDLZMpH8S9yWfA8qQNLE/aoHQuXrxYonLV4lfx4MGDWbFiBWfPnsXFxQUo6H3y8PhrzqH09HQAdb+zszPXr18vUldaWppaprCHq7Anq5Beryc7O1stV1YajQYHh5Is8Vu+7O3tK0Uc1VlSUhLr1q0jKSkJKFhHsHXr1hgMBUvolKUNklOziywgHejrwdSRgXi4yi/J0pDPgOVJG1ietEHJlHSKpmo3yL1wvFThOKpCcXFx2NjY0LRpU7Xc5cuXURTFpNzly5fVOhwcHGjYsGGRugpfd+fYLCHupCgKP/74I0uXLiUpKQkHBwcee+wxwsPDsbG59/I595Kh0xdJrgBizyWzaG0sGTr9g4YuKLjO15IyOHclhWtJGXJdhRAlVi0SrK1bt2JtbU2bNm1o2rQpzZs3Z/v27UXKBAcHq/dNQ0NDSUtLIyYmRi1z+fJlzpw5Q2hoqLotNDSUPXv2qD0NhXU5OzsTGBhYzmcmqrrvvvtOXaS5VatWTJkyBR8fnweuNy0zt9hld6AgyUrLzH3gY9R0yanZ/PfLo0x5ey8zF37PlLf38t8vj5KcKgOBhRD3V+VuEY4fP56goCB8fQtmvt6zZw9r165l7Nix6i3BqVOnMnPmTDw9PQkKCmLr1q2cPHmSL7/8Uq0nMDCQkJAQXnnlFWbNmoWtrS0ffPABvr6+DBgwwOR40dHRvPjiizz22GOcP3+eqKgoZsyYIXNgiftq164dZ8+epX///nTu3Nlss/9nZRseaL+4t/v1EL40urPJhLFCCHGnKpdgeXl5sW7dOq5fv05+fj7NmzfnlVdeYcyYMWqZ8PBwsrOzWbZsGUuXLsXLy4vFixcX6XFasGABb775JnPmzCEvL4+QkBBeffVVdRZ3gGbNmhEVFcVbb73FM888g7u7O9OmTWPcuHEVds6i6sjNzSU5OZkmTZoA0KpVK1544QVq165t1uPUtr/37cX77Rf3VpIewvJKsDJ0epPllFwcbSWZE6IKqnIJ1quvvlqico888giPPPLIPcs4OTkxf/585s+ff89yHTt2ZO3atSWOUdRMV69eZcOGDWRnZzN58mT1IQhzJ1cALo62BPp6FJsEBPp64OJoa/Zj1iSW6iGUBxeEqD6qxRgsISwpPz+f/fv3s3LlSm7duoWtrS1ZWVnlekwnBy1TRwYS6Othsj3Q14NpIwOlx+MBWaKHUB5cEKJ6qXI9WEJUJikpKaxfv54//vgDgPbt2xMWFoadnV25H9vD1Z6XRneW20nlwBI9hJa8LSmEMD9JsIQoo9jYWLZt24bBYMDW1pYhQ4bQvn37Co3ByUFbab90q/JYosIewuJu192th/BBz1ceXBCiepEES4gyun79OgaDgWbNmjF8+HBcXV0tHVKlUR3GEpWmh9Ac5ysPLghRvcgYLCFKwWg0qv/u168fQ4YMYezYsZJc3aY6jSVyctDSpJ4Tvs3caVLP6a49V+Y438LbksWRBxeEqHokwRKiBPLy8ti+fTtffPEF+fn5QMFakp07d8bKSj5Gt6tpk6Ca63zlwQUhqhe5RSjEfSQmJrJ+/Xp1HcG4uDiLLtJd2dW0sUTmPF95cEGI6kMSLCHuonAdwT179mA0GqlduzYRERGSXN1HTRtLZO7zrcwPLgghSk4SLCGKkZ6ezsaNG9WFvn18fIiIiCiXSUOrm5o2CWpNO18hRMnI4BEhirFhwwbi4uKoVasWQ4YM4dFHH5XkqoRq2liimna+QoiSkR4sIYoxaNAgtmzZQkREBHXr1rV0OFVOTRtLVNPOVwhxf5JgCUHBOoKJiYl07twZgPr16/P000+j0WgsHFnVVdPGEtW08xVC3JskWKJGMxqNHDx4kO+//x6Ahg0b0rhxYwBJroQQQpSZJFiixrpzHUF/f3/q1Klj4ahqjqq8lI4QQtyPJFiixlEUhdjYWLZv347BYMDOzo4hQ4bQrl07S4dWY1SHpXSEEOJeJMESNUJhb0mmTs/Rw7u5dOE3AJo3b87w4cNxcXGxcIQ1x/2WlnlpdGfpyRJCVHmSYIlq787ekno2GTS119Cteyj9+oTKUjcVrCRLy0iCJYSo6uSbRVRrGTo9i745ypnz19RtSYa6nM705Yc4LVk5eRaMrmaqaUvpCCFqJkmwRLUWF38N/R+HaVX7ElYY/3+rhtx8u2q58HBVUNOW0hFC1EySYIlqSVEUDh8+zKZ1q7G3zsGafGytiiZT0ltS8QqXlimOLC0jhKguJMES1U56ejpffPEFu3btIj8/n1sGZ37N8iU736FIWektqXiytIwQoiaQQe7CrCw9t9Gvv/7K5s2bycnJwcbGhp69+7HjpIG88zeKlJXeEsuRpWWEENWdJFjCbCw9t5GiKJw4cYKcnBwaNWpEZGQkderUwcev+Likt8SyZGkZIUR1JgmWMIuKntvo9p4yB7tauDrZ4eSgJSIigmPHjtG9e3esra0B6S0RQghR8STBEmZRkXMbFfaUHT+XREPb62g1Btyadfr/njJHQkNDi7xGekuEEEJUJBnkLsziQeY2ytDpuZaUwbkrKVxLyiBDp79n2UVrYzlz4Rqta1+gkW0idbUpnL8Yz6K1sfd8rRBCCFFRpAdLmEVZ5zYq7bit1IwcrsadpU3tBKw1+eQp1lzJbkKWsbbMAi6EEKLSkB4sYRZlmdvofuO27uyNysrKYseW72hufw1rTT7peY78munLrTy3v8qYqadMCCGEeBDSgyXMonBuo9I8rVeacVuKovDll19y/fp18hUNf+Q2JFHvAWhMXmeunjIhhBDiQUiCJcymtE/rlWbclkajoW/fvmzfsYMkWpIYl1OkfFl7ysz9hKMQQgghCZYwq9I8rXe/cVs5Wbc4f/4GPj4+ALRs2ZJnvb25mZ5bbj1lQgghhDlIgiUspnDcVtHkR6FjYx2b1n2FjY0NkydPxtXVFQArK6ty7SkTQgghzEESLGExxY3bstHo8a/zJ5qMW+QDzZs3R6stmjiZs6dM1iMUQghhbpJgCYu6vTfq7JlfORqzH70+FxsbGwYNGkRgYCAajeb+Fd3D3XvKZD1CIYQQ5UMSLGFxjvY27Nm5lRMnTgDQuHFjRowYQZ06dcxSf2mecLT0YtVCCCGqB0mwhMVpNBrs7OzQaDT06NGD0NBQdR1BcynJuC2ZykEIIYS5SIIlLMJoNJKTk0Pt2rUB6NevH+3bt6dx48bldsx7jduSqRyEEEKYk8zkLirczZs3WbFiBd988w35+fkA1KpVq1yTq/spyVQOQgghRElJD5aoMIqicOzYMXbs2IHBYMDOzo4bN25Qr149S4cmUzkIIYQwK0mwRIXIysoiOjqac+fOAeDl5cXw4cNxdnYuU33mHowuUzkIIYQwJ0mwRLm7cOECGzduJCsrC2tra/r27UvXrl3LPP1CeQxGl6kchBBCmJOMwRLlKj8/n71795KVlYWHhwcTJkwgODi4zMnV/QajZ+j0Zaq3cCqHQF8Pk+33WoJHCCGEuBvpwRLlysrKihEjRhAbG0vfvn2pVevB3nLlua5gaZfgEUIIIe5GEixhVvn5+cTExJCfn0+PHj0AqFevHgMHDjRL/eU9GL00S/AIIYQQdyMJljCbtLQ0NmzYwJUrV9BoNLRu3RoPD4/7v7AUZDC6EEKIqkASLGEWp0+fZvPmzeTm/rWOYN26dc1+HBmMLoQQoiqQBEs8kJycHLZu3cqpU6eAgnUEIyMjcXd3L5fjlWZdQSGEEMJSJMESZZafn09UVBQ3btwo13UE7ySD0YUQQlR2kmBVI+aefPN+rKyseOihh4iJiWHEiBE0bdq03I51JxmMLoQQojKTBKuaKI/JN4tz48YN9Ho9jRo1AqBz58506NABrVaSHSGEEKKQTDRaDZTX5Ju3UxSFo0ePsmTJEr799ltycwsWP9ZoNJJcCSGEEHeQHqxqoDwn34SCdQQ3bdrE+fPnAXB3dycvLw9bW3liTwghhCiO9GBVA+U5+eb58+f55JNPOH/+PNbW1gwcOJDRo0dTu3btMtcphBCiYqxfv57OnTtbOowaSRKsaqA8Jt80Go1s2bKFNWvWkJWVRb169Zg4ceIDLdIshBAVZfbs2fj6+uLr60vbtm3p06cP77zzjjq8QdzbkSNHGDFiBO3ataN///6sX7/+vq/5/vvvGTlyJIGBgXTt2pWpU6dy7do1dX9SUhIvvvgiAwcOpHXr1vznP/8pUofBYGDx4sX069eP9u3bExERwcGDB03KfPXVVwwdOpSOHTvSsWNHRo0axYEDBx78pM1MEqxqoHDyzeKUdfJNKysrMjIyAOjatSsTJ06kfv36DxSnEEJUpB49evDDDz+we/duXnnlFb755hsWLlxo6bBKzWg0kp+fX2HHu3r1KpMmTSIoKIiNGzfy5JNP8uqrr/L999/f8zXPPvssXbt2ZePGjURFRXHr1i2mTp2qltHr9bi5uTFlyhRat25dbD0LFizgm2++4bXXXmPr1q08+uijPP/885w5c0Yt06BBA2bOnMn69etZt24dXbt25bnnnuPChQvmuwhmIAlWCV26dImnn36agIAAunfvzjvvvINe/+CDx82hcPLNO5Os0k6+mZ+fj8FQcDtRo9EwdOhQxowZw8CBAx94kWYhhKhoWq0WDw8PGjZsSL9+/ejWrRuHDx++52u2b9/O0KFD8ff3JygoiKeeegqdTgcUJDpvvvkmnTt3JigoiHfeeYdZs2bx7LPPqq/v06cPn332mUmdw4YNY9GiRerPK1euZOjQoQQEBNCzZ0/mzp1LVlaWur/wtt6ePXsICwujffv2JCQkoNfrefvtt+nRowcBAQE88sgjHDlyxORY69evp1evXnTo0IHnnnuO1NTUUl+3r7/+miZNmjB79mxatGjB6NGjGThwYJHzut2vv/5Kfn4+06dPx9PTk7Zt2zJu3DjOnj2rfq80adKEV199leHDh+Pk5FRsPRs3bmTy5Mn07NmTpk2b8vjjj9OzZ09WrFihlunTpw89e/akefPmeHl5MWPGDBwcHDh+/Hipz7U8ybdmCaSlpfHkk0/SvHlzFi1aRGJiIm+99RY5OTnMmTPH0uEBDz75ZmpqKt999x3Ozs5ERkYCULt2bby9vcszbCGEqBDnz58nNjZWnWKmOIW3sF566SX69etHVlYWR48eRVEUAFasWMGGDRuYP38+LVq0YMWKFezatYuuXbuWKhaNRsM///lPmjRpwtWrV5k3bx7//e9/mTt3rlomJyeHZcuW8cYbb+Dq6kqdOnX417/+xcWLF/nggw+oV68eu3btYsKECURHR9O8eXNOnDjBP//5T/7+97/Tr18/vv/+e5PEDuDatWv07duXzz//nKCgoGLjO378OMHBwSbbQkJCmD9//l3PqW3btmg0GtatW0dkZCQ6nY6NGzfSrVs3bGxKPkzFYDAUeTLd1taWY8eOFVveaDSyfft2dDodgYGBJT5ORZAEqwS+/vprsrKyWLx4Ma6urkBBo86bN49JkyZVmltnZZ1888yZM+zevZvc3Fy0Wi2pqanqeQohRFW1f/9+AgMDycvLQ6/XY2VlxWuvvXbX8snJyeTl5dG/f38aN24MgK+vr7p/1apVPPPMMwwYMACAefPm8cMPP5Q6rqeeekr9d5MmTZg+fTqvv/66SYJlMBiYO3eueistISGB9evXs2/fPvU7Z/z48Xz//fesX7+ev//973z++ef06NGDiRMnAuDl5UVsbKzJrT0bGxu8vLywt7/7/Ig3btwospZs3bp1yczMJCcnBzs7uyKvadq0KStWrFDPxWg0EhgYyNKlS0t1bUJCQvjss8/o0qULnp6exMTEsGvXLoxGo0m5c+fO8eijj5Kbm4uDgwMfffQRLVu2LNWxypskWCVw8OBBgoODTZKOwYMH8/rrr3Po0CG1x6eqycnJ4dixYyQkJAAFH/QRI0ZIciWEqBaCgoKYO3cu2dnZfPbZZ+qT0ABHjx5VExEoSJaGDBlCcHAwQ4cOJSQkhJCQEAYOHIiLiwsZGRkkJyfToUMH9TW1atWiXbt2ag9XSR0+fJglS5YQFxdHZmYmRqOR3NxcsrOz1cTHxsbGJLk7f/48RqORQYMGmdSl1+vV39mXLl2iX79+JvsDAgJMEqz69euzffv2UsVbEsnJybz22msMHz6c8PBwsrKyWLhwIdOmTWPlypUlfjjqn//8J6+++iqDBw9Go9HQtGlTIiMjWbdunUk5Ly8vvvvuOzIyMtixYwezZs3iyy+/rFRJliRYJRAXF8fDDz9sss3Z2RkPDw/i4uLKXK+iKOq9/Yp29epVtmzZQkZGBhqNhuDgYIKDg7GysrJYTDVRdna2yd+iYsn1t7zyaoO8vDx1DBbAq6++yqhRo1i9ejUjRozA29ubNWvWqOXr1KlDbm4uH330ESdOnCAmJobPP/+c999/ny+++AJnZ2eg4D+mt/+ONBqNRX6X6/X6Ij8bDAZ0Oh0JCQlMmjSJRx55hClTpuDi4kJsbCzz5s0jPT0dRVHQ6/XY2tqaXJNbt25hbW3N6tWrsbIyHT7t4OCATqdTx9HefmyDwXDf75o728DNzY3r16+bvCYhIQFHR0fy8/OLreuzzz7DwcGB559/Xt32r3/9i0GDBnHkyBH8/f1NyhuNRvLy8orUZWdnx7vvvktubi5paWl4eHiwcOFCGjduXKSsh4cHHh4eTJkyhePHj7NixQpeffXVu56nuSiKUqKEURKsEkhPT1c/XLdzcXEhLS2tzPUaDAbOnj37IKGVidFoZN++feTk5ODg4EBgYCBubm6cO3euwmMRBeLj4y0dQo0m19/yzN0GaWlpZGVlmfyOHTRoEAsXLsTb27vIOJ/bB5nb2trSq1cvQkNDmTZtGmvWrGHIkCG4urqyZ88eHBwcgILfpSdPnqR58+bqcezs7Dh37pz6s06n49q1ayQnJ3P27Fl++uknjEYjgwcPVv9DW/iE3Llz56hduzYJCQnk5+ebxG5jY4PRaCQ2NrbIE3hZWVkkJydTp04dfvzxR0JDQ9V9P/zwQ5G67qawDZo0acL3339PeHi4um/nzp14e3vftZ6EhARyc3NN9t+6dQuAy5cvFxmHpdPpSElJuW9ciYmJbNu2jaCgoHuWzczMVK9xRSjJCiaSYFmQjY2Nxboza9euza+//kqzZs1o2bLlPe/Hi/KTnZ1NfHw8zZs3lzawALn+lldebeDi4oKVlRV+fn7qtlatWrF27VpOnDjB2LFji7zm1KlT/PTTT3Tt2hV3d3dOnz5NRkYGXbt2xc/Pj7Fjx7Jq1Sq6dOlC8+bN+fLLL8nJycHJyUk9TmhoKNHR0YwYMQInJydWr15NrVq18PDwwM/PDysrKxYsWMCJEycIDQ3l+PHj6hxOvr6+ODk5ceHChSKx+/n5ERYWxvLly/n73/9O69atuXXrFkeOHMHHx4cePXowadIknn76aX7++Wd69uxJTEwMp0+fNqkrKSmJSZMm8e9//5t27doV2waTJk3ib3/7Gzt27GDYsGH8/PPPHDlyhIULF6r1fP311+zbt48lS5YABU9KTp48mYMHDzJo0CB0Oh2rV6+mYcOGDBw4UB23dft/5DUaDVZWVtSqVYsWLVqobZCUlISvry9JSUksWbKEWrVqMXPmTPXJw4ULF9K9e3caNmxIVlYW27Zt4+zZs3z88ccm16y8XLx4sUTlJMEqAWdnZ3VOqNulpaXh4uJS5no1Go36P6HyVLiOoJ2dHe3btwcKnvjw8vLi7Nmz2NvbV0gc4u6kDSxLrr/lmbsNatWqhbW1dZE6x4wZw8qVKxk7dmyRfXXr1uX48eN89dVXZGZm0qhRI2bPnq0Oap80aRKpqanMmTMHKysrHn74Yfr3709GRoZa1/PPP09iYiIvvPACTk5OvPDCC/z555/Y2Niodwxefvllli9fzqJFi+jcuTMvvvgis2bNUq+BVqst9vvhnXfe4ZNPPuGDDz4gKSkJV1dXAgICGDBgAA4ODnTt2pV///vfLFq0iE8++YTg4GCeffZZPv74Y7WuWrVqER8fj6IoReovPH6rVq1YunQpb775Jl999RUNGjTgjTfeMBnflZWVxR9//KHW0atXL9577z2WL1/O559/jp2dHQEBAURFReHu7q6+7tFHH1X/ffbsWbZt20bjxo3Zu3cvUPC9+Mknn3D16lUcHBzo2bMn7777rsnDZOnp6bz++uskJSXh5OSEr68vUVFRdO/evRTvkLIr6XgyjVLa0Xk10BNPPIGrqysfffSRui0jI4MuXbowf/78Mg1yP3XqFICa8JSXzMxMNm3axIULF7C1teXZZ59Vb3fqdDrOnj2Ln5+ffLlYiLSBZcn1t7yq3gazZ88mPT2djz/+2NKhlFlVb4OKVtLvb5lotARCQ0M5fPgw6enp6rbt27djZWVVYRlzWZw7d45PPvmECxcuYG1tTa9eve46uZsQQgghzEduEZbAo48+yhdffMFzzz3HpEmTSExM5J133uHRRx+tNHNg3U6v17Nz505++eUXAOrVq0dkZGSljFUIIYSojiTBKgEXFxdWrVrFv//9b5577jlq167N3/72N2bMmGHp0IowGAwsW7aMGzduAAXrCPbt21eWuhFCiHLw1ltvWToEUUnJt24JtWjR4p7rMFUWNjY2tGrVitzcXIYPHy5L3QghhBAWIAlWNdSnTx969Oghj50LIYQQFiIJVjVUq1YtuSUohBBCWJA8RSiEEEIIYWaSYAkhhBBCmJkkWEIIIYQQZiYJlhBCCCGEmUmCJYQQQghhZpJgCSGEEEKYmSRYQgghhBBmJgmWEEIIIYSZSYIlhBBCCGFmkmAJIYQQQpiZJFhCCCGEEGYmCZYQQgghhJlJgiWEEEIIYWYaRVEUSwdREx07dgxFUdBqtRaLQVEUDAYDNjY2aDQai8VRk0kbWJZcf8uTNrA8aYPS0ev1aDQaOnbseM9ytSooHnGHyvAm1mg0Fk3whLSBpcn1tzxpA8uTNigdjUZTou9w6cESQgghhDAzGYMlhBBCCGFmkmAJIYQQQpiZJFhCCCGEEGYmCZYQQgghhJlJgiWEEEIIYWaSYAkhhBBCmJkkWEIIIYQQZiYJlhBCCCGEmUmCJYQQQghhZpJgCSGEEEKYmSRYQgghhBBmJgmWEEIIIYSZSYJVA126dImnn36agIAAunfvzjvvvINer7d0WFXK+vXr8fX1LfLn3XffNSn37bffMnDgQNq3b09ERAT79u0rUldGRgavvPIKDz30EIGBgUybNo2kpKQi5Y4dO8aoUaPw9/end+/eLF26lJq0VvuVK1eYM2cOw4YNo02bNoSHhxdbrqKvuaIoLF26lF69euHv78+oUaM4fvy4Wc65silJG4wZM6bYz8alS5dMykkblN62bduYMmUKoaGhBAQEMGzYMP73v/8VuR7yGagkFFGjpKamKt27d1eeeOIJ5eDBg8q3336rdOrUSZk3b56lQ6tS1q1bp/j4+CgHDx5UYmNj1T8JCQlqmc2bNyu+vr7KBx98oMTExCivvfaa0qZNGyU2NtakrnHjximhoaHKli1blN27dyvh4eFKRESEYjAY1DLx8fFKQECA8txzzymHDx9WVq5cqbRt21ZZvnx5RZ2yxe3atUsJDQ1Vpk6dqoSHhytDhgwpUsYS13zJkiVK27ZtlZUrVyqHDx9WnnvuOSUwMFD5/fffy+U6WFJJ2mD06NHKo48+avK5iI2NVXJyckzKSRuU3siRI5UZM2YoW7ZsUQ4fPqy8++67SuvWrZVFixapZeQzUHlIglXDfPrpp0pAQIBy69YtddvXX3+t+Pn5KdevX7dcYFVMYYJ18+bNu5YZMGCA8ve//91k26hRo5QJEyaoPx87dkzx8fFRvv/+e3XbpUuXFF9fX2XLli3qttdee03p3bu3kpubq2577733lM6dO5tsq86MRqP671mzZhX75V7R1zwnJ0fp2LGj8t5776llcnNzld69eyuvv/562U+2kipJG4wePVp55pln7lmPtEHZFPf75tVXX1U6duyoto18BioPuUVYwxw8eJDg4GBcXV3VbYMHDyY/P59Dhw5ZLrBq5urVq8THxzN48GCT7WFhYcTExKi3ZA8ePIizszPdu3dXy3h7e+Pn58fBgwfVbQcPHqRv375otVqTutLT04mNjS3ns6kcrKzu/evKEtf82LFjZGZmmhxTq9XSv39/k7qqi/u1QUlJG5SNu7t7kW1+fn5kZmai0+nkM1DJSIJVw8TFxeHt7W2yzdnZGQ8PD+Li4iwUVdUVHh6On58fffv2ZcmSJRiNRgD1Wnp5eZmUb9GiBQaDgatXr6rlvLy80Gg0JuW8vb3VOnQ6HX/++WeRdvP29kaj0Ui7/T9LXPPCv+8s16JFCxISEsjJyTHT2VUtP/30EwEBAbRv357Ro0fz888/m+yXNjCfX375hfr16+Po6CifgUqmlqUDEBUrPT0dZ2fnIttdXFxIS0uzQERVk4eHB1OnTqVDhw5oNBr27t3LggULSExMZM6cOeq1vPNaF/5cuD89PR0nJ6ci9bu4uHD69GmgYDBqcXVptVrs7e2l3f6fJa55eno6Wq0WW1vbIsdUFIW0tDTs7Owe9NSqlC5dujBs2DCaN29OUlISUVFRPP3003zxxRcEBgYC0gbmcvToUbZu3cqsWbMA+QxUNpJgCVEGPXr0oEePHurPISEh2NrasmrVKiZPnmzByISwrGnTppn83KtXL8LDw/n4449ZtmyZhaKqfq5fv86MGTMICgpi7Nixlg5HFENuEdYwzs7O6v9MbpeWloaLi4sFIqo+Bg8ejNFo5OzZs+q1vPNap6enA6j7nZ2dyczMLFLX7e1R+D/NO+vS6/VkZ2dLu/0/S1xzZ2dn9Ho9ubm5RY6p0WikbQAHBwd69uzJr7/+qm6TNngw6enpTJw4EVdXVxYtWqSOjZPPQOUiCVYNc/s99kIZGRkkJycXuYcuyq7wWt55rePi4rCxsaFp06ZqucuXLxeZV+by5ctqHQ4ODjRs2LBIXYWvk3YrYIlrXvj35cuXixyzUaNGNfbWyP1IG5RdTk4OkyZNIiMjg+XLl5vc6pPPQOUiCVYNExoayuHDh9X/0QBs374dKysrkydKROlt3boVa2tr2rRpQ9OmTWnevDnbt28vUiY4OFh9Kic0NJS0tDRiYmLUMpcvX+bMmTOEhoaq20JDQ9mzZw8Gg8GkLmdnZ3VcS01niWvesWNHHB0d2bZtm1rGYDCwc+dOk7pqMp1Ox/79+2nfvr26TdqgbPLy8pg+fTpxcXEsX76c+vXrm+yXz0DlImOwaphHH32UL774gueee45JkyaRmJjIO++8w6OPPlrkwyrubvz48QQFBeHr6wvAnj17WLt2LWPHjsXDwwOAqVOnMnPmTDw9PQkKCmLr1q2cPHmSL7/8Uq0nMDCQkJAQXnnlFWbNmoWtrS0ffPABvr6+DBgwwOR40dHRvPjiizz22GOcP3+eqKgoZsyYYfIIdXWWnZ3NgQMHAPjjjz/IzMxUv0geeugh3N3dK/ya29raMmnSJBYtWoS7uzs+Pj6sWbOG1NRUxo8fX4FXp2Lcrw0Kv/j79+9P48aNSUpKYuXKlSQnJ/Phhx+q9UgblM28efPYt28fs2fPJjMz02S29DZt/q+9+4+Juv7jAP7kZ4kCeiARIRObh345TlGBDsnTs0kpkLGICA6EdmGbtXIu6BcG0spG9INCzUnKBCwGbXgylVliA2WMypywfuAI0MSCpAuYCPf+/uH3PuM4EP32EX89Hxt/3Pvn6/O5IS/f78+P/8DZ2Zm/A7cQOzF6jZDueK2trdiyZQu+//57TJ06FY8//vhd9YdaDrm5ufj2229x/vx5mM1mzJ49G3FxcdDr9Va3PpeXl2Pnzp04d+4c/P39sXHjRqxYscJqLJPJhHfeeQc1NTUYGhpCREQE3njjDZuE97vvvsO7776LlpYWKBQKJCYmwmAw2Nxqfafq7OzEypUrx6wrLi5GWFgYgMk/5+J/rwkpLS1FT08P5s+fj1dfffWOXFmc6Dvw9vZGTk4OfvrpJ1y8eBFTpkxBcHAwNmzYALVabdWe38H10+l0OHv27Jh1R44cga+vLwD+DtwqmGARERERyYzXYBERERHJjAkWERERkcyYYBERERHJjAkWERERkcyYYBERERHJjAkWERERkcyYYBERERHJjAkWERERkcyYYBHRHUOn0yEzM1P63NDQgICAADQ0NNzEqKyNjnGy6PV66PX6SZ+X6G7FBIuIZFFZWYmAgADpJygoCJGRkcjJycGff/55s8O7LrW1tSgoKLgpcx8+fBgBAQEoLy8ft01dXR0CAgJQXFw8iZER0fXgy56JSFYvvvgifH19MTg4iKamJpSVlaG2thZGoxFTpkyZ1FhCQkLw448/wsnJ6br61dbWoqSkBC+88MINimx8y5cvh6urK/bv34+4uLgx2xiNRjg4OGDNmjWTHB0RXSsmWEQkq2XLliEoKAgAEBcXh+nTp+Pzzz/HkSNHEBUVNWaf/v5+uLi4yB6Lvb097rnnHtnHvZGcnZ0RGRmJyspKdHV12bx899KlS6ipqUF4eDg8PDxuUpRENBFuERLRDfXQQw8BADo7OwEAmZmZCA4ORnt7OwwGA4KDg7Fp0yYAgNlsxu7du7FmzRoEBQUhPDwcWVlZ6O3ttRpTCIHCwkIsW7YMCxYsgF6vxy+//GIz93jXYJ08eRIGgwEhISFYuHAhoqOjsWfPHim+kpISALDa8rSQO8axxMTEwGw2o7q62qbu6NGjMJlMiI6OBgBUVFQgOTkZGo0GKpUKq1evRmlp6YRzWLZ0Ld+LxdXO2bPPPovFixdjwYIFSEpKQlNTk1Wbf/75B2+//TZ0Oh1UKhU0Gg1SU1Nx+vTpazpuojsJV7CI6IZqb28HAEyfPl0qGxoakv5YZ2Rk4N577wUAZGVl4auvvkJsbCz0ej06OztRUlKC5uZmlJWVSVt9H330EbZt2watVgutVovTp08jLS0Nly9fnjCeuro6pKenw8vLC8nJyfD09ERrayuOHj2KlJQUxMfH48KFC6irq8N7771n038yYgwJCYG3tzf279+P1NRUqzrLVusjjzwCACgrK8PcuXOh0+ng6OiIb775BtnZ2RBCIDExccK5rsXx48dhMBigUqmwYcMG2NnZobKyEikpKSgtLYVarQYAbN68GYcOHUJSUhIefPBBXLx4EU1NTWhtbUVgYKAssRDdNgQRkQwqKiqEUqkU9fX1oru7W/z+++/iwIEDIjQ0VKjVanH+/HkhhBAZGRlCqVSKvLw8q/6NjY1CqVSKqqoqq/Jjx45ZlXd3d4vAwEDx3HPPCbPZLLXLz88XSqVSZGRkSGUnTpwQSqVSnDhxQgghxNDQkNDpdGLFihWit7fXap6RY2VnZwulUmlzjDcixvFs3bpVKJVKcebMGanMZDKJoKAgsXHjRqlsYGDApm9aWppYuXKlVVlSUpJISkqSPlu+r46ODqt2o8+Z2WwWq1atEmlpaVbHMjAwIHQ6nUhNTZXKFi9eLLKzsyc8NqK7AbcIiUhW69atg0ajgVarxcsvv4ypU6fik08+sbmWKCEhwerzwYMH4erqiqVLl6Knp0f6CQwMhIuLi7RlVV9fj8uXLyMpKQl2dnZS/5SUlAlja25uRmdnJ5KTk+Hm5mZVN3Ks8UxGjBYxMTEArqxYWRw6dAiXLl2StgcBSKt/AGAymdDT04PQ0FB0dHTAZDJd83zjaWlpQVtbG6Kjo/HXX39Jx9zf3w+NRoPGxkaYzWYAgJubG06ePImurq5/PS/R7Y5bhEQkq6ysLPj7+8PBwQGenp7w9/eHvb31/+UcHR3h7e1tVfbbb7/BZDJBo9GMOW53dzcA4Ny5cwCA2bNnW9UrFAq4u7tfNbaOjg4AgFKpvObjmewYLebNmwelUgmj0SjdzWg0GjFjxgxERERI7ZqamlBQUIAffvgBAwMDVmOYTCa4urpe03zjaWtrAwBkZGSM28ZkMsHd3R2bNm1CZmYmli9fjsDAQGi1WqxduxazZs36VzEQ3Y6YYBGRrNRqtXQX4XicnZ1tki6z2QwPDw/k5eWN2UehUMgW4/9rsmOMjo7G+++/j1OnTsHb2xsNDQ2Ij4+Ho+OVf7rb29uxbt06zJkzB5mZmbj//vvh5OSE2tpa7N69W1pZGst4K3aj+wghAACvvPIK5s+fP2Yfyx2gq1evxpIlS1BTU4O6ujrs2rULO3fuREFBAbRa7XUfP9HtjAkWEd0S/Pz8cPz4cSxatMhq22s0Hx8fAFdWVkaujPT09NjcyTeapf3PP/+M8PDwcduNl3xMRowjRUVFIT8/H0ajET4+PhgeHrbaHvz6668xODiIbdu2SXMCuKYn11u2SEdvI549e9bqsyX+adOmXfWcWXh5eSExMRGJiYno7u7GE088ge3btzPBorsOr8EiolvCY489huHhYRQWFtrUDQ0N4e+//wYAhIeHw8nJCXv37pVWVwBIj1m4msDAQPj6+qK4uFgaz2LkWJYHoo5uMxkxjuTj44MlS5aguroaVVVV8PX1xaJFi6R6BwcHm9hNJhMqKiomHNvPzw8A0NjYKJUNDw/jyy+/tGqnUqng5+eHoqIi9PX12YzT09Mj9R2drHl4eMDLywuDg4MTxkN0p+EKFhHdEkJDQxEfH48dO3agpaUFS5cuhZOTE9ra2nDw4EG8/vrrePTRR6FQKJCWloYdO3YgPT0dWq0Wzc3NOHbsGGbMmHHVOezt7fHWW2/h+eefx9q1axEbG4uZM2fizJkz+PXXX7Fr1y4AkB4pkJubi4iICOmp6ZMR42gxMTF48803ceHCBaxfv96qzjL/+vXr8fTTT6Ovrw/l5eXw8PDAH3/8cdVx586di4ULFyI/Px+9vb1wd3dHdXU1hoaGbM5Zbm4uDAYDoqKiEBsbi/vuuw9dXV1oaGjAtGnTsH37dvT19UGr1SIyMhLz5s2Di4sL6uvrcerUqZvy7kWim40JFhHdMnJycqBSqbBv3z588MEHcHBwwAMPPICYmBirlZuXXnoJzs7O2LdvHxoaGqBWq1FUVIT09PQJ53j44YexZ88efPrppygqKoIQArNmzcJTTz0ltVm1ahX0ej0OHDiAqqoqCCGk19JMRowjRUZGYsuWLRgcHJTuLLSYM2cOPv74Y3z44YfYunUrPD09kZCQAIVCgddee23CsfPy8pCVlYXPPvsMbm5uePLJJxEWFmbz7K2wsDB88cUXKCwsxN69e9Hf34+ZM2dCrVYjPj4ewJW7GRMSElBXV4fDhw9DCAE/Pz9s3rwZzzzzzHUdM9GdwE6MXFsmIiIion+N12ARERERyYwJFhEREZHMmGARERERyYwJFhEREZHMmGARERERyYwJFhEREZHMmGARERERyYwJFhEREZHMmGARERERyYwJFhEREZHMmGARERERyYwJFhEREZHM/guIvNJYXonvOAAAAABJRU5ErkJggg==\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "stacked_learner.show_gridsearch_results()\n", - "# " - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 211 - }, - "id": "ye_0s76rSmEt", - "outputId": "6db3f114-aca4-428b-ff81-e073dec7be14" - }, - "id": "ye_0s76rSmEt", - "execution_count": 427, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " mean_fit_time std_fit_time mean_score_time std_score_time \\\n", - "0 0.012205 0.000815 0.000766 0.000036 \n", - "1 0.012941 0.003196 0.000747 0.000024 \n", - "\n", - " param_final_estimator__fit_intercept \\\n", - "0 True \n", - "1 False \n", - "\n", - " params split0_test_score \\\n", - "0 {'final_estimator__fit_intercept': True} 0.803549 \n", - "1 {'final_estimator__fit_intercept': False} 0.807004 \n", - "\n", - " split1_test_score split2_test_score split3_test_score split4_test_score \\\n", - "0 0.920322 0.821022 0.901773 0.732127 \n", - "1 0.921642 0.824891 0.895428 0.720903 \n", - "\n", - " mean_test_score std_test_score rank_test_score \n", - "0 0.835759 0.068561 1 \n", - "1 0.833974 0.070792 2 " - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
mean_fit_timestd_fit_timemean_score_timestd_score_timeparam_final_estimator__fit_interceptparamssplit0_test_scoresplit1_test_scoresplit2_test_scoresplit3_test_scoresplit4_test_scoremean_test_scorestd_test_scorerank_test_score
00.0122050.0008150.0007660.000036True{'final_estimator__fit_intercept': True}0.8035490.9203220.8210220.9017730.7321270.8357590.0685611
10.0129410.0031960.0007470.000024False{'final_estimator__fit_intercept': False}0.8070040.9216420.8248910.8954280.7209030.8339740.0707922
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 427 - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Learning Algorithms (With clustering)" - ], - "metadata": { - "id": "XBdCprbJQlDd" - }, - "id": "XBdCprbJQlDd" - }, - { - "cell_type": "markdown", - "source": [ - "### Elbow Method" - ], - "metadata": { - "id": "1coZhqpJE7UM" - }, - "id": "1coZhqpJE7UM" - }, - { - "cell_type": "code", - "source": [ - "\"\"\"\n", - "In this code, X is the dataset that you want to cluster. The for loop iterates over values of k from 1 to 10, creating a KMeans model with k clusters, fitting the model to the data, and calculating the sum of squared distances for the points to their nearest cluster center. The ssd list stores these values for each value of k. Finally, the results are plotted using Matplotlib. The idea is to look for an \"elbow\" in the plot where the decrease in SSD starts to level off, indicating that additional clusters are not providing much additional information gain.\n", - "\n", - "Note that while the elbow method can be a helpful guide in choosing the number of clusters, it is not always definitive and can sometimes be ambiguous.\n", - "\"\"\"\n", - "\n", - "# create a list to store the sum of squared distances for each value of k\n", - "ssd = []\n", - "\n", - "# try k values from 1 to N\n", - "N = 8\n", - "for k in range(1, N + 1):\n", - " # create a KMeans model with k clusters\n", - " kmeans = KMeans(n_clusters=k, random_state=42)\n", - " # fit the model to the data\n", - " kmeans.fit(data)\n", - " # calculate the sum of squared distances for the points to their nearest cluster center\n", - " ssd.append(kmeans.inertia_)\n", - " \n", - "# plot the results\n", - "plt.plot(range(1, N + 1), ssd, marker='o')\n", - "plt.xlabel('Number of clusters (k)')\n", - "plt.ylabel('Sum of squared distances (SSD)')\n", - "plt.title('Elbow method for KMeans clustering')\n", - "plt.show()\n" - ], - "metadata": { - "id": "mxm0xwRzdF-4", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 778 - }, - "outputId": "b1655ad9-1cc2-4fc0-a86c-490907825a6f" - }, - "id": "mxm0xwRzdF-4", - "execution_count": 428, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " warnings.warn(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " warnings.warn(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " warnings.warn(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " warnings.warn(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " warnings.warn(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " warnings.warn(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " warnings.warn(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " warnings.warn(\n" - ] - }, - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAHPCAYAAABJKDADAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB5AUlEQVR4nO3dd1hT1/8H8HcS9h4iCg6WASSA4t6KWmurdbWuilpXad2tv2pta2u/tnbZ1oqjrrpX62jrqqvVVq17gOIABAEVZa8gI/f3B5IaGYaQECDv1/P4QO69OfmcQzAfzjn3HJEgCAKIiIiIaiGxvgMgIiIi0hQTGSIiIqq1mMgQERFRrcVEhoiIiGotJjJERERUazGRISIiolqLiQwRERHVWkxkiIiIqNZiIkNERES1FhMZqlG8vb2xZMkS5eMlS5bA29sbqampeoyqZvP29sann36q89fZtWsXvL29kZCQ8NxrT5w4gQEDBsDf3x/e3t7IzMzUeXxUeQkJCfD29sauXbv0HYpG5syZg+DgYH2HQXrGRIZ0ruQDsLx/ly9f1neINd7FixexZMmSWpEQpKWlYcaMGTAzM8O8efPw1VdfwdzcXGevV/L+Cg8PVzmelZWFV199Ff7+/jhx4gSA/xJjHx8f3L9/v1RZ2dnZCAgIqLbksK6LiorCkiVL1Ep+iTRlpO8AyHBMmzYNjRo1KnW8SZMmeoimdrl06RLCwsIwaNAg2NjY6DucCoWHhyMnJwfTp09Hx44d9RJDdnY2xo0bh5s3byIsLAxdu3ZVOW9iYoK9e/di4sSJKscPHTpUnWHWeVFRUQgLC0Pbtm3L/N2vqv/973/gdoHERIaqTdeuXeHv76/vMEjHSoYBra2ttVZmbm4uLCws1Lo2Ozsb48ePR2RkJMLCwtCtW7dS13Tr1g379u0rlcjs3bsX3bt3xx9//KGVuEk3St4PxsbG+g6FagAOLVGtkJaWhunTpyMoKAjt2rXDggUL8PjxY5VrCgsLsXTpUvTq1QsymQzBwcH49ttvkZ+fr7xm4cKFaNeuncpfcf/73//g7e2NDRs2KI8lJyfD29sbW7ZsqTCukiGIAwcO4KWXXkJAQACGDRuGmzdvAgC2bduG3r17w9/fHyEhIWV2sV+5cgXjx49Hq1atEBgYiFGjRuHChQvK80uWLMFXX30FAOjZs6dySO7Zso4cOYJ+/fpBJpPh5ZdfVg6nPO369euYMGECgoKC0LJlS4wZM6bMob3bt29j9OjRCAgIQNeuXbFs2TIoFIoK2wIAQkJCMHv2bADAq6++Cm9vb8yZM0d5/sCBAxg8eDACAgLQrl07zJo1C0lJSSplzJkzBy1btsTdu3cxceJEtGzZErNmzXruawNATk4OJkyYgGvXrmHJkiXo3r17mdf169cPkZGRiI6OVh579OgR/v33X/Tr16/M5+Tn5+OHH35A7969IZPJ0K1bN3z11Vcq7y8A2LlzJ0aPHo0OHTpAJpPhpZdeKvN9FBwcjDfffBPnz59XDoH17NkTe/bsUbmuoKAAYWFheOGFF+Dv74927dphxIgROHny5HPbIzMzE59//jmCg4Mhk8nQtWtXvPfeexXOOQsJCUFISEip42XNR9m3bx8GDx6Mli1bIigoCP3798f69esBFA/5TZ8+HQAwevRo5fv2zJkzyucfP34cI0eORIsWLdCyZUtMmjQJt2/fLvW65b0fno2pZM7PmjVrsH37duX/BUOGDMHVq1dL1ank99bf3x/9+vXD4cOHOe+mFmKPDFWb7OzsUv+BikQi2NvbP/e5M2bMgKurK959911cvnwZGzduRGZmpvIDHgA+/PBD7N69G3369MEbb7yBq1ev4scff0R0dDSWLl0KAGjdujXWrVuH27dvQyqVAgDOnz8PsViM8+fPY/To0cpjANCmTZvnxnb+/HkcO3YMI0eOBACsXLkSoaGhmDBhArZs2YKRI0ciIyMDq1evxty5c1USptOnT2PixImQyWSYMmUKRCIRdu3ahTFjxmDLli0ICAhA7969ERsbi7179+L9999XtpeDg4OynAsXLuDQoUMYOXIkLC0tsXHjRkybNg1//vmn8vrbt2/j9ddfh6WlJSZMmAAjIyNs374dISEh2LRpEwIDAwEUf6CPHj0aRUVFmDRpEszNzbFjxw6Ympo+ty1CQ0Ph7u6O7du3K4cSS4YOd+3ahffffx/+/v545513kJKSgg0bNuDixYvYs2ePypBZYWGhMrmbPXs2zMzMnvvacrkcEydOREREBBYvXowePXqUe22bNm3QoEED7N27V/lhu3//flhYWJSZ/CgUCrz11lu4cOEChg4dCk9PT9y6dQvr169HbGwsli1bprx269ataNasGYKDg2FkZIQ///wT8+fPhyAI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\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Divide Data using K-Means Clustering" - ], - "metadata": { - "id": "KRYWVh1NFYeQ" - }, - "id": "KRYWVh1NFYeQ" - }, - { - "cell_type": "code", - "source": [ - "class DivideDataWithKMeans:\n", - " \"\"\"\n", - " Divide data with KMeans\n", - " \"\"\"\n", - " def __init__(self, dataframe, n_clusters):\n", - " self.dataframe = dataframe\n", - " self.n_clusters = n_clusters\n", - " # \n", - " self.clustered_dataframe = dataframe.copy() # we don't want the orinal to get changed in anyway\n", - " \n", - " def divide_data(self) -> List:\n", - " \"\"\"\n", - " Learners with Data Clusters using K-Means\n", - " \"\"\"\n", - " # Perform k-means clustering with N clusters\n", - " kmeans = KMeans(n_clusters=self.n_clusters)\n", - " kmeans.fit(self.clustered_dataframe)\n", - "\n", - " # Add a column to the dataframe with the cluster labels\n", - " self.clustered_dataframe['cluster'] = kmeans.labels_\n", - " \n", - " # Split the dataframe into a list of dataframes, one for each cluster\n", - " clusters = []\n", - " for i in range(self.n_clusters):\n", - " cluster_df = self.clustered_dataframe[self.clustered_dataframe['cluster'] == i].drop('cluster', axis=1)\n", - " clusters.append(cluster_df)\n", - " \n", - " return clusters\n", - "\n", - " def plot(self):\n", - " \"\"\"\n", - " Plot two different clustered dataframes in the same scatter plot using PCA\n", - " \"\"\"\n", - " pca = PCA(n_components=2)\n", - " pca_result = pca.fit_transform(self.clustered_dataframe.iloc[:,:-1])\n", - " self.clustered_dataframe['pca_1'] = pca_result[:,0]\n", - " self.clustered_dataframe['pca_2'] = pca_result[:,1]\n", - " \n", - " sns.set(style='darkgrid')\n", - " for i in range(self.n_clusters):\n", - " sns.scatterplot(data=self.clustered_dataframe[self.clustered_dataframe['cluster'] == i],\n", - " x='pca_1', y='pca_2', label=f\"Cluster {i + 1}\")\n", - " \n", - " plt.xticks(rotation=60)\n", - " plt.legend()\n", - " plt.xlabel('PCA 1')\n", - " plt.ylabel('PCA 2')\n", - " plt.title('Clusters using PCA')\n", - " plt.show()\n", - " \n", - "class Clustering(DivideDataWithKMeans):\n", - " \"\"\"\n", - " With Clustering\n", - " \"\"\"\n", - " def __init__(self, dataframe: pd.DataFrame, n_clusters: int = 2):\n", - " super().__init__(dataframe, n_clusters)\n", - "\n", - " # get clusters\n", - " self.clusters = self.divide_data()\n", - "\n", - " # Instantiate Base Learners\n", - " self.base_learners = {}\n", - " for i, cluster_df in enumerate(self.clusters):\n", - " self.base_learners[f\"base_{i}\"] = BaseLearners(cluster_df, \n", - " selected_features = cluster_df.columns[:-1].to_list())\n", - " \n", - " # Param Grids\n", - " self.param_grids = {\n", - " 'lasso': {'alpha': [i for i in range(1, 100)]},\n", - " 'knn': {'n_neighbors': [3, 5]}\n", - " }\n", - "\n", - " # Model Training and Evaluations\n", - " self.models = {}\n", - " self.model_evaluations = {}\n", - " for key, learner in self.base_learners.items():\n", - " if \"base\" in key:\n", - " lasso_model = learner.lasso(param_grid=self.param_grids['lasso'], scoring='r2')\n", - " lasso_model_evaluation = learner.evaluate_model(lasso_model, with_table = True, return_train_score = True)\n", - " # \n", - " self.models[f\"lasso_{key}\"] = lasso_model\n", - " self.model_evaluations[f\"lasso_{key}\"] = lasso_model_evaluation\n", - " # \n", - " knn_model = learner.knn(param_grid=self.param_grids['knn'], scoring='r2')\n", - " knn_model_evaluation = learner.evaluate_model(knn_model, with_table = True, return_train_score = True)\n", - " # \n", - " self.models[f\"knn_{key}\"] = knn_model\n", - " self.model_evaluations[f\"knn_{key}\"] = knn_model_evaluation\n", - " \n", - " # Instantiate Stacked Learner (with main dataframe)\n", - " list_of_base_learners = dict_to_list_of_tuples(self.models)\n", - " self.base_learners[f\"stacked_learner(with_kmeans)\"] = StackedLearner(self.dataframe, \n", - " selected_features = self.dataframe.columns[:-1].to_list(), \n", - " learners = list_of_base_learners, n_cv = 10)\n", - " \n", - " stacked_model = self.base_learners[f\"stacked_learner(with_kmeans)\"].learn()\n", - " stacked_model_evaluation = self.base_learners[f\"stacked_learner(with_kmeans)\"].evaluate_model(stacked_model, with_table = True, return_train_score = True)\n", - " # \n", - " self.models[f\"stacked_learner(with_kmeans)\"] = stacked_model\n", - " self.model_evaluations[f\"stacked_learner(with_kmeans)\"] = stacked_model_evaluation\n", - " \n", - " def evaluate(self):\n", - " \"\"\"\n", - " Return models evaluation results in a certain format such as results{'model_name': []}\n", - " \"\"\"\n", - " results = {}\n", - " for key, evaluation in self.model_evaluations.items():\n", - " key_split = key.split(\"_\")[0].strip()\n", - " if key_split not in results:\n", - " results[key_split] = []\n", - " results[key_split].append(evaluation)\n", - " else:\n", - " results[key_split].append(evaluation)\n", - " \n", - " return results\n", - "# " - ], - "metadata": { - "id": "RN7VQJxcwQqL" - }, - "id": "RN7VQJxcwQqL", - "execution_count": 429, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "clustering = Clustering(data)\n", - "# " - ], - "metadata": { - "id": "yfr__FE5JtoW", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "4db9ca77-2608-44e6-d095-d7cb19c96e5c" - }, - "id": "yfr__FE5JtoW", - "execution_count": 430, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " warnings.warn(\n" - ] - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Best hyperparameters: {'alpha': 2}\n", - "Best cross-validated score: 0.9928274058580012\n", - "Best parameters: {'n_neighbors': 3}\n", - "Best score: 0.9742852708156766\n" - ] - }, - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.119e+04, tolerance: 1.740e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.141e+04, tolerance: 1.903e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.102e+04, tolerance: 1.963e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.391e+04, tolerance: 2.069e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.144e+04, tolerance: 2.217e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.294e+04, tolerance: 2.119e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.465e+04, tolerance: 2.188e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.126e+05, tolerance: 2.268e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.537e+04, tolerance: 2.234e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.217e+04, tolerance: 1.740e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.429e+04, tolerance: 1.903e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.161e+05, tolerance: 1.963e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.053e+05, tolerance: 2.069e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.845e+04, tolerance: 2.217e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.899e+04, tolerance: 2.119e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.933e+04, tolerance: 2.188e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.655e+04, tolerance: 2.268e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.814e+04, tolerance: 2.234e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.691e+04, tolerance: 1.903e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.418e+05, tolerance: 1.963e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.243e+05, tolerance: 2.069e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.984e+04, tolerance: 2.217e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.453e+04, tolerance: 2.119e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.967e+04, tolerance: 2.188e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.394e+04, tolerance: 2.268e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.656e+04, tolerance: 2.234e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.465e+05, tolerance: 1.963e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.260e+05, tolerance: 2.069e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.454e+04, tolerance: 2.217e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.302e+04, tolerance: 2.119e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.270e+04, tolerance: 2.188e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.405e+04, tolerance: 2.268e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.781e+04, tolerance: 2.234e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.290e+05, tolerance: 1.963e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.101e+05, tolerance: 2.069e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.885e+04, tolerance: 2.188e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.177e+04, tolerance: 2.234e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.820e+04, tolerance: 1.963e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.633e+04, tolerance: 2.069e+04\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.488e+04, tolerance: 1.963e+04\n", - " model = cd_fast.enet_coordinate_descent(\n" - ] - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Best hyperparameters: {'alpha': 99}\n", - "Best cross-validated score: -4.545115334458496\n", - "Best parameters: {'n_neighbors': 5}\n", - "Best score: -2.343554486142792\n" - ] - }, - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.474e+07, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.442e+07, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.235e+07, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.551e+07, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.199e+07, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.929e+07, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.394e+07, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.762e+07, tolerance: 3.927e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.453e+07, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.799e+07, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.208e+06, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.481e+07, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.150e+07, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.318e+07, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.060e+06, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.025e+07, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.484e+07, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.518e+06, tolerance: 3.927e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.035e+07, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.671e+07, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.842e+06, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.210e+06, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.600e+07, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.541e+06, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.308e+06, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.132e+06, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.852e+06, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.683e+06, tolerance: 3.927e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.575e+06, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.597e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.559e+05, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.471e+06, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.672e+06, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.193e+06, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.715e+06, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.611e+06, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.494e+06, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.604e+06, tolerance: 3.927e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.591e+06, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.687e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.495e+06, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.361e+06, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.695e+06, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.616e+06, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.440e+06, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.919e+06, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.025e+06, tolerance: 3.927e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.266e+06, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.061e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.495e+06, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.408e+05, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.253e+06, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.489e+06, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.633e+06, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.099e+06, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.618e+05, tolerance: 3.927e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.182e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.806e+06, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.491e+05, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.565e+06, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.640e+06, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.893e+06, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.421e+05, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.289e+06, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.313e+06, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.572e+05, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.864e+06, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.128e+06, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.320e+06, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.845e+05, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.816e+06, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.019e+06, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.301e+06, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.553e+05, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.852e+05, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.363e+06, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.603e+05, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.522e+05, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.652e+05, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.702e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.405e+05, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.267e+05, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.430e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.606e+05, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.170e+05, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.218e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.267e+05, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.048e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.522e+05, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.082e+05, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.359e+05, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.885e+05, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.908e+05, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.664e+05, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.812e+05, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.322e+05, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.904e+05, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.046e+05, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.332e+05, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.372e+05, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.832e+05, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.028e+05, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.497e+05, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.811e+05, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.113e+05, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.255e+05, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.374e+05, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.567e+05, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.562e+05, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.852e+05, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.058e+05, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.366e+05, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.924e+05, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.503e+05, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n" - ] - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Best hyperparameters: {'alpha': 99}\n", - "Best cross-validated score: 0.8204992062042409\n" - ] - }, - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.208e+06, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.319e+07, tolerance: 3.568e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.116e+07, tolerance: 3.612e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.343e+06, tolerance: 2.838e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.618e+07, tolerance: 3.750e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.481e+07, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.319e+07, tolerance: 3.568e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.683e+07, tolerance: 3.670e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.061e+07, tolerance: 3.495e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.464e+06, tolerance: 2.902e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.818e+07, tolerance: 3.804e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.150e+07, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.114e+07, tolerance: 3.610e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.660e+07, tolerance: 3.671e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.493e+07, tolerance: 3.552e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.295e+06, tolerance: 2.919e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.472e+07, tolerance: 3.871e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.318e+07, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.458e+07, tolerance: 3.569e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.611e+07, tolerance: 3.672e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.302e+07, tolerance: 3.491e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.974e+06, tolerance: 2.903e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.485e+07, tolerance: 3.801e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.060e+06, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.451e+06, tolerance: 3.819e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.425e+07, tolerance: 3.785e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.333e+06, tolerance: 3.620e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.030e+06, tolerance: 3.145e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.814e+07, tolerance: 4.058e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.025e+07, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.438e+07, tolerance: 3.401e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.042e+07, tolerance: 3.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.333e+06, tolerance: 3.620e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.220e+06, tolerance: 2.721e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.505e+07, tolerance: 3.649e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.484e+07, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.391e+07, tolerance: 3.350e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.330e+06, tolerance: 3.323e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.126e+06, tolerance: 3.628e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.735e+06, tolerance: 2.657e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.376e+07, tolerance: 3.572e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.467e+08, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.518e+06, tolerance: 3.927e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.052e+06, tolerance: 3.125e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.718e+06, tolerance: 3.085e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.197e+06, tolerance: 3.440e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.735e+06, tolerance: 2.657e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.851e+06, tolerance: 3.382e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.035e+07, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.887e+07, tolerance: 3.625e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.276e+07, tolerance: 3.591e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.848e+06, tolerance: 3.923e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.195e+06, tolerance: 3.065e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.783e+07, tolerance: 3.472e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.671e+07, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.672e+07, tolerance: 3.718e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.061e+07, tolerance: 3.690e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.205e+07, tolerance: 3.996e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.548e+06, tolerance: 3.160e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.783e+07, tolerance: 3.472e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.585e+06, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.208e+06, tolerance: 4.308e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.319e+07, tolerance: 3.568e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.116e+07, tolerance: 3.612e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.343e+06, tolerance: 2.838e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.618e+07, tolerance: 3.750e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.942e+08, tolerance: 1.410e+06\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.481e+07, tolerance: 4.367e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.319e+07, tolerance: 3.568e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.683e+07, tolerance: 3.670e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.061e+07, tolerance: 3.495e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.464e+06, tolerance: 2.902e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.818e+07, tolerance: 3.804e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.641e+08, tolerance: 1.429e+06\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.150e+07, tolerance: 4.414e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.114e+07, tolerance: 3.610e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.660e+07, tolerance: 3.671e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.493e+07, tolerance: 3.552e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.295e+06, tolerance: 2.919e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.472e+07, tolerance: 3.871e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.144e+08, tolerance: 1.366e+06\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.318e+07, tolerance: 4.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.458e+07, tolerance: 3.569e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.611e+07, tolerance: 3.672e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.302e+07, tolerance: 3.491e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.974e+06, tolerance: 2.903e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.485e+07, tolerance: 3.801e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.848e+08, tolerance: 1.447e+06\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.060e+06, tolerance: 4.616e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.451e+06, tolerance: 3.819e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.425e+07, tolerance: 3.785e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.333e+06, tolerance: 3.620e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.030e+06, tolerance: 3.145e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.814e+07, tolerance: 4.058e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.964e+08, tolerance: 1.450e+06\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.025e+07, tolerance: 4.201e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.438e+07, tolerance: 3.401e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.042e+07, tolerance: 3.365e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.333e+06, tolerance: 3.620e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.220e+06, tolerance: 2.721e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.505e+07, tolerance: 3.649e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.342e+08, tolerance: 1.387e+06\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.484e+07, tolerance: 4.146e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.391e+07, tolerance: 3.350e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.330e+06, tolerance: 3.323e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.126e+06, tolerance: 3.628e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.735e+06, tolerance: 2.657e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.376e+07, tolerance: 3.572e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.793e+08, tolerance: 1.451e+06\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.518e+06, tolerance: 3.927e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.052e+06, tolerance: 3.125e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.718e+06, tolerance: 3.085e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.197e+06, tolerance: 3.440e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.735e+06, tolerance: 2.657e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.851e+06, tolerance: 3.382e+05\n", - " model = cd_fast.enet_coordinate_descent(\n" - ] - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Best parameters: {'final_estimator__fit_intercept': False}\n", - "Best score: 0.7947591313286573\n" - ] - }, - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.052e+08, tolerance: 1.337e+06\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.035e+07, tolerance: 4.422e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.887e+07, tolerance: 3.625e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.276e+07, tolerance: 3.591e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 9.848e+06, tolerance: 3.923e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.195e+06, tolerance: 3.065e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.783e+07, tolerance: 3.472e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.766e+08, tolerance: 1.429e+06\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.671e+07, tolerance: 4.513e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.672e+07, tolerance: 3.718e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.061e+07, tolerance: 3.690e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.205e+07, tolerance: 3.996e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.548e+06, tolerance: 3.160e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.783e+07, tolerance: 3.472e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.704e+08, tolerance: 1.487e+06\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 1.461e+07, tolerance: 4.812e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 8.921e+06, tolerance: 3.953e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.913e+07, tolerance: 3.887e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 7.386e+06, tolerance: 4.004e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.843e+06, tolerance: 3.272e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 2.639e+07, tolerance: 4.124e+05\n", - " model = cd_fast.enet_coordinate_descent(\n", - "/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 3.358e+08, tolerance: 1.577e+06\n", - " model = cd_fast.enet_coordinate_descent(\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "clustering.plot()\n", - "# " - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 525 - }, - "id": "AdWJPphsTp3n", - "outputId": "f6918d92-ecff-484f-d438-d6cbf152b72b" - }, - "id": "AdWJPphsTp3n", - "execution_count": 431, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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fz+Cg4NRp04d7NmzB3v27GFtkwN54vgzcSqDtSDNuvxm/aC+ePEi5s6di127dqFBgwbIysqCWq3G999/L2W4XstisWDYsGFo0qQJZs+ezaSJiJyu+FXUubm52LJlC9auXYv9+/dj6tSpGDNmjMQRejdPGH8mTnYQRRGiKNq+mXv37sWsWbPw999/Y9WqVYiLi5M4Qu+0fv16vP766/j999/h5+dXqi0EEZGzWP9QM5lMeOGFF3DixAlb42NyPncef14aZgdBEGzN0eRyOVq0aAE/Pz/06tWLSZOTZGdn46OPPsKkSZPg5+dX6rJUIiJnksvlsFgs+OWXX7BlyxbMnTtX6pB8ijuPPz+JqsD6jdy+fTuOHTuGhQsXSh2S11q4cCEMBgMSEhIAgEkTEbmcTCbD7bffjueff16ynkG+zF3Hn0t1lVi5ciVCQkLQt29f27Fjx44hIyMD9913n4SReS+DwYD3338f8fHx6NixI2ebiIjIbTBxqsClS5cQHx+POXPm2BovkmsUFhbCz89P6jCIiIhKYOJUAfYPIiIiouK4/lGO/fv3IzExERs2bADAlvtERETELVfKZLFY8N5772HgwIFsukhEREQ2nHEqQ2JiIo4fP44vvvgCAErtlE1ERES+iTNOtyirfxCbLhIRERHAxKkU9g8iIiKi8jBxKsZgMMBkMuG///0vgKI964iIiIis2I7gFuwfREREROVh4kRERERkJy7VEREREdmJiRMRERGRnZg4EREREdmJiRMRERGRnZg4EREREdmJiRMRERGRnZg4EREREdmJiRMRERGRnbgRGxG5ne+++w4vv/yy7WuVSoV69erh3nvvxfjx41GrVq0St79+/TqWLVuGn376CZcvX4YgCIiMjES3bt0wcuRIaDSaUs/xyCOP4MiRI3jjjTcwfPhwu2NbuXIlfv31Vxw+fBiXL1/GQw89hNmzZ1f/xRKRR2HiRERua9KkSahfvz4MBgP279+PVatWYefOndiwYQPUajUA4PDhwxg7dizy8/Px4IMPokWLFgCAv/76C0uWLMEff/yB5cuXl3jcs2fP4siRI4iIiEBSUlKVEqelS5ciLy8PMTExuHbtmuNeLBF5BCZOROS2OnfujJiYGADA4MGDodVq8dlnn2Hbtm3o168fsrOzMXHiRMjlcqxbtw5NmzYtcf/JkydjzZo1pR43MTERYWFhmDZtGiZNmoSLFy+ifv36dsX05Zdfol69ehAEAXFxcTV/kUTkUVjjREQeo0OHDgCAixcvAgC++eYbXLlyBdOmTSuVNAFArVq1MH78+FLHN2zYgJ49e6Jr164IDg7Ghg0b7I4hIiICgiBU8xUQkadj4kREHuP8+fMAAK1WCwDYvn07/P390bNnT7sf49ChQzh37hz69u0LlUqF7t27IykpyRnhEpEXYuJERG4rNzcXGRkZ+Oeff7Bp0yZ88skn8Pf3x/333w8ASE1NRePGjaFSqex+zMTERNStWxd33303AKBv3744ffo0jh8/7pTXQETehTVOROS2Hn/88RJfR0REYM6cOahTpw6AosQqMDDQ7sczmUzYtGkTBg4caFtu69ChA8LCwpCYmIg77rjDYbETkXdi4kREbuv1119HkyZNIJfLUatWLTRp0gQy2c2J8qCgIOTl5dn9eHv27EFGRgZiY2Nx7tw52/H27dtj48aNeOmll0o8PhHRrZg4EZHbio2NtV1VV5bIyEgcP34cBoPBruW6xMREAMDzzz9f5vl9+/bZCtCJiMrCxImIPNb999+PAwcOYMuWLejXr1+Ft83Pz8f27dvRp0+fMovJZ82ahaSkJCZORFQhzkkTkcd69NFHER4ejtmzZ+PMmTOlzqenp2PBggUAgB9//BH5+fkYMWIEevXqVeq/+++/H1u2bIHBYHD1yyAiD8IZJyLyWCEhIfjkk08wduxYDBw4sETn8GPHjmHDhg22JpVJSUnQarXlNq2Mj4/HmjVrsGPHDvTo0aPc59y+fTtOnDgBADAajUhJSbElZ/Hx8WjevLkjXyIRuRkmTkTk0Vq1aoWkpCQsW7YMO3bswPfffw+ZTIbIyEiMHTsWI0eORHp6Ovbu3Yu+fftCLpeX+TgdO3aEWq1GYmJihYnTli1bsG7dOtvXx44dw7FjxwAAt912GxMnIi8niKIoSh0EERERkSdgjRMRERGRnZg4EREREdmJiRMRERGRnZg4EREREdmJiRMRERGRnZg4EREREdmJiRMRERGRnZg4EREREdmJiRMRERGRnZg4EREREdmJiRMRERGRnZg4EREREdnp/wGxhBEOzpiCHwAAAABJRU5ErkJggg==\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "results = clustering.evaluate()\n", - "# " - ], - "metadata": { - "id": "7fwXVYRNWV2S" - }, - "id": "7fwXVYRNWV2S", - "execution_count": 432, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "### Lasso" - ], - "metadata": { - "id": "Z9bRsrTAp5-A" - }, - "id": "Z9bRsrTAp5-A" - }, - { - "cell_type": "code", - "source": [ - "lasso_model = results['lasso']\n", - "first_cluster = lasso_model[0]\n", - "second_cluster = lasso_model[1]\n", - "# " - ], - "metadata": { - "id": "5p0BPHKvp7YQ" - }, - "id": "5p0BPHKvp7YQ", - "execution_count": 433, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "#### First Cluster" - ], - "metadata": { - "id": "wXGp5ClhbVvF" - }, - "id": "wXGp5ClhbVvF" - }, - { - "cell_type": "code", - "source": [ - "first_cluster['train_scores']" - ], - "metadata": { - "id": "1HAwpe0jbkxT", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "2f5f91e6-4263-4dc2-b8f9-eac34764839b" - }, - "id": "1HAwpe0jbkxT", - "execution_count": 434, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'MSE': 56470.65900849775,\n", - " 'RMSE': 237.63555922567176,\n", - " 'MAE': 113.26985494354741,\n", - " 'R^2': 0.9961711976385146,\n", - " 'unexplained_variance': 0.003828802361485417,\n", - " 'lasso_coefs': Features Coefficient Estimate\n", - " 0 TeamExp 1439.186810\n", - " 1 ManagerExp 1431.338956\n", - " 2 YearEnd -1923.314046\n", - " 3 Length 2384.191605\n", - " 4 Transactions 412.774787\n", - " 5 Entities 0.000000\n", - " 6 PointsAdjust 7.316423\n", - " 7 Envergure -1550.177443\n", - " 8 PointsNonAjust 0.000000\n", - " 9 Language -47.297889}" - ] - }, - "metadata": {}, - "execution_count": 434 - } - ] - }, - { - "cell_type": "code", - "source": [ - "first_cluster['train_scores']['lasso_coefs']\n", - "# " - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 363 - }, - "id": "yEjw1KNy8iE1", - "outputId": "c23aa439-d109-44c8-a52c-4fcfd5e3b5ae" - }, - "id": "yEjw1KNy8iE1", - "execution_count": 435, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " Features Coefficient Estimate\n", - "0 TeamExp 1439.186810\n", - "1 ManagerExp 1431.338956\n", - "2 YearEnd -1923.314046\n", - "3 Length 2384.191605\n", - "4 Transactions 412.774787\n", - "5 Entities 0.000000\n", - "6 PointsAdjust 7.316423\n", - "7 Envergure -1550.177443\n", - "8 PointsNonAjust 0.000000\n", - "9 Language -47.297889" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
FeaturesCoefficient Estimate
0TeamExp1439.186810
1ManagerExp1431.338956
2YearEnd-1923.314046
3Length2384.191605
4Transactions412.774787
5Entities0.000000
6PointsAdjust7.316423
7Envergure-1550.177443
8PointsNonAjust0.000000
9Language-47.297889
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 435 - } - ] - }, - { - "cell_type": "code", - "source": [ - "plot_graph(df = first_cluster['train_scores']['lasso_coefs'], \n", - " graph_type='bar', \n", - " label1='Features',\n", - " label2='Coefficient Estimate', \n", - " title='Lasso Features vs. Coefficient Estimate Scores')\n", - "# \n", - "# " - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 609 - }, - "id": "qMfhFB_0JNUK", - "outputId": "40d87c3e-302f-41dd-f2b0-1d84099433d9" - }, - "id": "qMfhFB_0JNUK", - "execution_count": 436, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "WARNING:matplotlib.legend:No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n" - ] - }, - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlwAAAIrCAYAAAA6O0fJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC/o0lEQVR4nOzdd1gUV9sG8HtBUFFAsWADC5FVUcSGUsQabETBrlFjib3EXhJr7BqxoWKPJbHFrti72LATRUVBxQYK0pG25/vDb+dlAyouLMvi/buuXGZnzg7P7M7MPnPayIQQAkRERESkMXraDoCIiIgor2PCRURERKRhTLiIiIiINIwJFxEREZGGMeEiIiIi0jAmXEREREQaxoSLiIiISMOYcBERERFpGBMuIiIiIg1jwkVEpEF3795F165dYWdnB7lcjoCAAADA+fPn0a5dO9SoUQNyuRzR0dGYOHEimjZt+tV/o2nTppg4cWJ2h57rvXjxAnK5HHv27NF2KERflE/bAdC3Yc+ePZg0aRL++ecf1KhRQ9vhZNmLFy/QrFmzDNfVrFkTO3fuzPa/GRoaip07d6J58+aoWrVqtm8/L3v37h3Wr1+PM2fO4PXr15DJZKhUqRKaN2+OHj16wMTERCN/Nzk5GSNHjoShoSEmTZqEAgUKoEyZMnj//j1GjhyJypUrY+rUqTA0NETBggU1EkN2OXfuHO7evYvhw4dnqnzPnj1x7dq1DNdVrFgRR48ezfTfPnjwIMLDw9G7d+9Mv0fTNHk+RkREYOXKlbh48SJevXqFQoUKoWzZsqhfvz6GDBmCQoUKZevfo5zBhIsoC9zc3ODi4qKyzMzMTCN/KywsDF5eXihbtiwTrq9w9+5dDBgwAPHx8Wjbti1sbGwAAP/++y/Wrl2L69evY8OGDRr528+fP8fLly8xa9YsdOrUSVp+/vx5xMXF4ZdffoGjo6O0fObMmVDn8bZHjx6FTCbLlpg/5dy5c/jrr78ynXABQKlSpTB69Oh0y42Njb/qbx86dAiBgYHpEq6yZcvi7t27yJcv53/KNHU+RkZGokOHDoiNjUWHDh1QqVIlREZG4uHDh9i2bRu6devGhEtHMeEiyoJq1aqhXbt22g4jSxITE2FgYAA9vbzXwyA6OhrDhg2Dvr4+9u7dCysrK5X1o0aN0khtpFJERASA9AnGp5YbGBio9XcMDQ3Vep+mGRsba/T8kMlkyJ8/v8a2rw3//PMPXr16hW3btqF27doq62JjY9U+RtQRHx8PIyOjHPt7eV3eu8KSzkpKSsLSpUvRvn171KlTB3Z2dujevTuuXLmSruzhw4fRvn171KpVC7Vr18YPP/yATZs2SeuTk5Ph5eUFV1dX1KhRA/Xr10e3bt3g6+ursp3Lly+je/fusLOzQ926dTF48GA8efIk2/bpyZMnGDFiBOzt7VGjRg20b98ep06dUikTGRmJ+fPn44cffpD25+eff8aDBw+kMlevXkXHjh0BAJMmTYJcLlfpu/KpPjw9e/ZEz549VbYjl8tx+PBhLF68GA0bNkTNmjURGxsLALhz5w769euHOnXqoGbNmujRowdu3Lihss3Y2FjMnj0bTZs2RfXq1eHg4IA+ffrg3r17n/wcjh49CrlcnmET0/bt2yGXy/Ho0SMAwNu3bzFp0iS4uLigevXqcHZ2xuDBg/HixYvPftYZ2b59O0JDQzFx4sR0yRYAFC9eHEOGDFFZ9tdff6FNmzbS354xYwaio6PTvfdLn9XEiRPRo0cPAMAvv/wCuVwufR8TJkwAAHTs2BFyuVz67jLqw6VQKLBp0yb88MMPqFGjBho0aIB+/frB399fKpPR9x8dHY3Zs2ejUaNGqF69Or7//nusWbMGCoVCKqPsA7V+/Xrs2LEDzZs3R/Xq1dGhQwfcvXtXZV/++usvAJCOPblc/plPPvO+dDz17NkTZ8+excuXL6W/q/yMMurDNXHiRNSqVQuvXr3CwIEDUatWLTRs2FCK/+HDh+jVqxfs7OzQpEkTHDx4UCWe7DgfgcydSxl5/vw59PX1YWdnl25d4cKF0yWYd+7cQf/+/VGvXj3Y2dmluxYCmbvOLV++HHK5HI8fP8aYMWNQr149dO/eXVq/f/9+tG/fHra2trC3t8eoUaPw+vVrlW08ffoUw4cPh5OTE2rUqAEXFxeMGjUKMTExX9zvbwFruCjXiI2Nxa5du+Dm5oZOnTohLi4O//zzD37++Wfs2rVLqrb39fXF6NGj4eDggLFjxwIAgoKCcPPmTfz0008AAC8vL6xevRqdOnWCra0tYmNj8e+//+LevXtwcnICAFy6dAn9+/dHuXLlMGzYMHz48AFbt25Ft27dsGfPHpQrV+6LMSckJEi1FUrGxsYwMDBAYGAgunXrBnNzc/Tv3x9GRkY4cuQIhg4diuXLl+P7778HAISEhODkyZNo2bIlypUrh3fv3mHHjh3o0aMHDh8+DHNzc1hZWWHEiBFYtmwZunTpgjp16gBAujvgzFq5ciUMDAzQr18/JCUlwcDAAJcvX0b//v1RvXp1DBs2DDKZDHv27MFPP/2Ev//+G7a2tgCAadOm4dixY+jRowesrKwQGRmJGzdu4MmTJ1Jz3X81btxY2n97e3uVdT4+PqhcuTKsra0BAMOHD8fjx4/Ro0cPlC1bFhEREfD19cXr168z9Z2kdfr0aRQoUAAtWrTIVPnly5fDy8sLjo6O6NatG4KDg7Ft2zb4+/tj27ZtUu1CZj6rLl26wNzcHN7e3ujZsydq1KiB4sWLA/jYh2nHjh0YMWIEypUrB0tLy0/G9Ntvv2HPnj1wcXFBx44dkZqaiuvXr+POnTuf7A+ZkJCAHj16IDQ0FF27dkXp0qVx69YteHp64u3bt/jtt99Uyh86dAhxcXHo0qULZDIZ1q1bh+HDh+PkyZMwMDBAly5dEBYWBl9fXyxYsCBTnyUApKampjs/AKBAgQJSzcmXjqdBgwYhJiYGb968waRJkwDgi01qqamp6N+/P+rWrYuxY8fi4MGD+P3331GwYEEsXrwYP/zwA1xdXbF9+3ZMmDABdnZ2sLCwAJA952Nmz6WMlC1bFqmpqdi/fz88PDw+u5++vr4YOHAgSpYsiV69eqF48eJ48uQJzp49K10Lv/Y698svv6B8+fIYNWqU1Ly9atUqLF26FK1atULHjh0RERGBrVu34scff8S+fftgYmKCpKQk6XrSo0cPFC9eHKGhoTh79iyio6O/uhk5TxJEOWD37t3C2tpa3L1795NlUlJSRGJiosqyqKgo4ejoKCZNmiQtmzVrlqhdu7ZISUn55Lbatm0rBgwY8NmY2rVrJxwcHMT79++lZQEBAaJKlSpi/Pjxn31vSEiIsLa2zvC/K1euCCGE+Omnn4Sbm5vKPikUCtGlSxfh6uoqLUtMTBSpqanptl+9enXh5eUlLbt7966wtrYWu3fvThdPkyZNxIQJE9It79Gjh+jRo4f0+sqVK8La2lo0a9ZMJCQkqMTl6uoq+vbtKxQKhbQ8ISFBNG3aVPTp00daVqdOHTFjxozPfj4ZGT16tHBwcFD53sLCwkSVKlWk/YyKihLW1tZi3bp1X739jNSrV0+0bds2U2XDw8OFjY2N6Nu3r8r3sXXrVmFtbS3++ecfIcTXfVbKz/vIkSMqf+tT58OECRNEkyZNpNeXL18W1tbWYubMmeniTfu3//v9r1ixQtjZ2Yng4GCV9/zxxx+iatWq4tWrV0KI/x3H9vb2IjIyUip38uRJYW1tLU6fPi0tmzFjhrC2ts7gk8tYjx49PnmOTJkyRSqXmeNpwIABKp+LkjL+tOfEhAkThLW1tfD29paWRUVFCVtbWyGXy8Xhw4el5U+ePBHW1tZi2bJl0rKsno9fc3xk5O3bt6JBgwbC2tpatGzZUkydOlUcPHhQREdHq5RLSUkRTZs2FU2aNBFRUVHpYlDK7HVu2bJlwtraWowePVplWy9evBBVq1YVq1atUln+8OFDUa1aNWn5/fv3MzzW6X/YpEi5hr6+vtQXRaFQIDIyEikpKahevTru378vlTMxMUFCQkK65sG0TExMEBgYiKdPn2a4PiwsDAEBAfDw8ECRIkWk5VWqVIGjoyPOnTuXqZi7dOmCjRs3qvxXpUoVREZG4sqVK2jVqhViY2MRERGBiIgIvH//Hs7Oznj69ClCQ0MBfOx/o+w/lZqaivfv38PIyAgVK1ZU2e/s5O7ujgIFCkivAwIC8PTpU/zwww94//69FG98fDwcHBzg5+cnNUWZmJjgzp07UvyZ1apVK4SHh6s0Kx47dgwKhQKtW7cG8LHmw8DAANeuXUNUVFSW9zM2NjbTHYwvXbqE5ORk9OrVS6U/W6dOnVC4cGHpmPiazyqrjh8/DplMhmHDhqVb97lO8kePHkWdOnVgYmIixRcREQFHR0ekpqbCz89PpXzr1q1hamoqva5bty6Aj7U9WVG2bNl058fGjRul2hdA/ePpS9IOUjAxMUHFihVRsGBBtGrVSlpeqVIlmJiYqOxnVs/HrB4fxYsXx/79+9G1a1dER0dj+/btGDNmDBwcHLBixQqp1un+/ft48eIFevXqlW6UrfLYUOc617VrV5XXJ06cgEKhQKtWrVSOpeLFi6N8+fK4evUqgI/NnQBw8eJFJCQkfPFz+haxSZFylb1792LDhg0IDg5GcnKytDxttXf37t1x5MgR9O/fH+bm5nByckKrVq1URguOGDECQ4YMQYsWLWBtbQ1nZ2e0a9cOVapUAQC8evUKwMemnf+ysrLCxYsXM9VhtHz58iqjzJTu3r0LIQSWLl2KpUuXZvje8PBwmJubQ6FQYPPmzfj777/x4sULpKamSmXSXiSz03+bEZSJqbJvUUZiYmJgamqKsWPHYuLEiWjcuDFsbGzQqFEjuLu7S00yn+Li4gJjY2P4+PjAwcEBwMfmxKpVq0rfg6GhIcaOHYv58+fDyckJNWvWROPGjeHu7o4SJUp89X4WLlwYcXFxmSqrPCYqVaqkstzQ0BAWFhZ4+fIlgK/7rLLq+fPnKFmy5FcfB8+ePcPDhw+lz/m//tvMV7p0aZXXytgz6rv2NYyMjDI8P9JS93j6nPz586cbLWxsbIxSpUqlS1SNjY1V9jOr52N2HB8lS5bEjBkzMH36dDx9+hQXL17E2rVrsWzZMpQsWRKdOnWSkkRlU3xG1LnOZXRtEELA1dU1w7+hHCFqYWGBPn36YOPGjTh48CDq1q2Lpk2bom3btmxO/H9MuCjX2L9/PyZOnIjmzZujX79+KFasGPT19bF69WqVO9BixYph3759uHjxIs6fP4/z589jz549cHd3x/z58wEA9erVw4kTJ3Dq1Cn4+vrin3/+waZNmzBjxgyVO19NUd7B9u3bFw0bNsywjLLfjre3N5YuXYoOHTrgl19+gampKfT09DBnzhy1pghIKzU1Ffr6+umWp63dAiD9nfHjx39yiLvyoty6dWvUrVsXJ06cgK+vL9avX4+1a9di+fLlaNSo0SdjMTQ0RPPmzXHixAlMmzYN4eHhuHnzZrppA3r37o2mTZvi5MmTuHjxIpYuXYo1a9Zg06ZNqFat2lftf6VKlRAQEICkpKRsG8n3NZ+VtigUCjg5OeHnn3/OcH2FChVUXmd0jADI8vGXGeoeT5/zqf3JzH5m9XzMzuNDJpOhYsWKqFixIho3bgxXV1ccOHBAo9ew/3bKVygUkMlkWLt2bYafX9p9mThxIjw8PKTr7qxZs7B69Wrs3LkTpUqV0ljMuoIJF+Uax44dg4WFBby8vFTuQpctW5aurKGhIZo2bYqmTZtCoVBg+vTp2LFjB4YMGYLy5csD+Hg32qFDB3To0AFxcXHo0aMHli9fjk6dOqFMmTIAgODg4HTbDgoKQtGiRbP0o6m8OzcwMPjiHf6xY8dQv359zJkzR2V5dHQ0ihYtKr3+XBOSqalphrURr169ylRNgbJM4cKFvxgv8PEO/Mcff8SPP/6I8PBweHh4wNvb+4s/kK1atcLevXtx+fJlPHnyBEIIlSYeJUtLS/Tt2xd9+/bF06dP4e7ujg0bNuCPP/74YmxpNWnSBLdu3cLx48fh5ub22bLKYyIoKEjlM0tKSsKLFy+kz+VrP6ussLS0xMWLFxEZGflVtVyWlpaIj4/P1vg0Oc/Xl44nTc8xllZWz0dNHR8WFhYwMTHB27dvVf7Oo0ePPvl3suM6Z2lpCSEEypUrl2FN2X8pR2wOGTIEN2/eRLdu3bBt2zaMGjXqi+/N69iHi3IN5d1T2rvIO3fu4Pbt2yrl3r9/r/JaT09PGqKelJSUYZlChQrB0tJSWl+yZElUrVoV+/btU0lUHj16BF9fX7XvrJWKFSsGe3t77NixA2FhYenWp23S0dfXT3fnfOTIkXR9WpQzkWeUWFlYWODOnTvS/gGQZlXPjOrVq8PS0hIbNmzIsAlOGW9qamq6Id7FihVDyZIlVf72pzg6OqJIkSLw8fHBkSNHYGtrq5LcJCQkIDExUeU9lpaWKFSokMr2w8LC8OTJE5Vm54x07doVJUqUwLx58zL80QkPD8fKlSul2AwMDLBlyxaV7+Off/5BTEyMdExk9rPKDq6urhBCwMvLK926z9W2tGrVCrdu3cKFCxfSrYuOjkZKSspXx/K5409dmT2eChYsmGNTC2T1fMzq8XHnzh3Ex8enW3737l1ERkZKSY+NjQ3KlSuHzZs3p4tBGX92XOdcXV2hr68PLy+vdJ+LEEK61sbGxqY7rqytraGnp5epa8O3gDVclKN2796d4Y9Ar1690LhxYxw/fhxDhw5F48aN8eLFC2zfvh3fffedygVo8uTJiIqKQoMGDWBubo5Xr15h69atqFq1qjTXUps2bWBvbw8bGxsUKVIE/v7+0tBzpfHjx6N///7o0qULOnbsKA2XNjY2zrCT8teaNm0aunfvjh9++AGdO3eGhYUF3r17h9u3b+PNmzc4cOAAgI9TJqxYsQKTJk1CrVq18OjRIxw8eDBdzZSlpSVMTEywfft2FCpUCEZGRlLC0qlTJxw7dgw///wzWrVqhefPn+PgwYOfnW4gLT09PcyaNQv9+/eHm5sb2rdvD3Nzc4SGhuLq1asoXLgwvL29ERcXh0aNGqFFixaoUqUKjIyMcOnSJfj7+2fqWX4GBgb4/vvvcfjwYSQkJKTr5/L06VP07t0bLVu2xHfffQd9fX2cPHkS7969Q5s2baRynp6e2Lt3L06dOvXZqSJMTU2xYsUKDBgwAO7u7iozzd+/fx+HDh1CrVq1AHx8QsDAgQPh5eWFn3/+GU2bNkVwcDD+/vtv1KhRA23btv2qzyo7NGjQAO3atcOWLVvw7NkzNGzYEAqFAjdu3ED9+vVVjue0+vXrh9OnT2PQoEHw8PCAjY0NEhIS8OjRIxw7dgynTp366iciKD+3WbNmwdnZGfr6+irfSUZiYmKwf//+DNe1a9cu08eTjY0NfHx8MHfuXNSoUQNGRkZqPXMyM7LjfMzK8bF//34cPHhQmhPNwMAAT548we7du5E/f34MGjQIwMfjcPr06Rg8eDDc3d3Rvn17lChRAkFBQXj8+DHWr18PIOvXOUtLS4wcORKLFi3Cy5cv0bx5cxQqVAgvXrzAyZMn0blzZ/Tr1w9XrlzB77//jpYtW6JChQrS1Bb6+vqZnpYlr2PCRTlq27ZtGS5v37492rdvL815c/HiRXz33XdYuHAhjh49qjKyrW3btti5cyf+/vtvREdHo0SJEmjVqhWGDx8ujS7q2bMnTp8+DV9fXyQlJaFMmTIYOXIk+vXrJ23H0dER69atw7Jly7Bs2TLky5cP9erVw7hx47LUYVfpu+++w+7du+Hl5YW9e/ciMjISZmZmqFatGoYOHSqVGzRoEBISEnDw4EH4+PigWrVqWL16NRYtWqSyPQMDA8ybNw+enp6YPn06UlJSMHfuXFhYWKBhw4aYOHEiNm7ciDlz5qB69erw9vaW+rRlRv369bFjxw6sXLkSW7duRXx8PEqUKCHNKQV87PulnED2+PHjEELA0tJSSi4zo3Xr1ti1axdkMlm65sRSpUqhTZs2uHz5Mg4cOAB9fX1UqlQJS5YsUfuiXbNmTRw8eBDr16/H2bNnsX//fujp6aFSpUoYMGCAStIyfPhwmJmZYevWrZg7dy5MTU3RuXNnjB49WmWG78x8Vtll7ty5kMvl+Oeff7BgwQIYGxujevXqUqKYkYIFC2LLli1YvXo1jh49in379qFw4cKoUKEChg8frlYnZldXV/Ts2ROHDx/GgQMHIIT4YsL15s0bjB8/PsN17dq1y/Tx1L17dwQEBGDPnj34888/UbZsWY0lXNlxPmbl+OjSpQsKFCiAK1eu4PTp04iNjUXRokXh5OSEgQMHqvRjbNiwITZt2oQVK1Zgw4YNEELAwsICnTt3lspkx3VuwIABqFChAv7880+sWLECwMdz1cnJSfoe5HI5nJ2dcebMGYSGhqJgwYKQy+VYu3ZthpO4fotkIid6RRIRERF9w9iHi4iIiEjDmHARERERaRgTLiIiIiINY8JFREREpGFMuIiIiIg0jAkXERERkYZxHq5c4NatWxBCqMzzQ0RERLlbcnIyZDLZZ+fFU2LClQsIIXLkIbFERESUfb7mt5sJVy6grNmqUaOGliMhIiKizPL39890WfbhIiIiItIwJlxEREREGsaEi4iIiEjDmHARERERaRgTLiIiIiIN4yhFIiIi+uakpqYiOTn5k+sNDAygr6+fbX+PCRcRERF9M4QQePPmDSIjI79YtkiRIihVqhRkMlmW/y4TLiIiIvpmKJOtkiVLwsjIKMNkSgiB+Ph4hIWFAQBKly6d5b/LhIuIiIi+CampqVKyVaxYsc+WLViwIAAgLCwMJUuWzHLzIjvNExER0TdB2WfLyMgoU+WV5T7X1yuzmHARERHRNyWzfbKyo++WEhMuIiIiIg1jwkVERESkYUy4iIiIiDSMCRcRERGRhjHhIvqGCIVC2yF8Um6OjYjyFiFEtpbLDM7DRfQNkenp4faq1Yh99VrboagoXKY07AYP1HYYRJTHGRgYAADi4+OlebY+Jz4+XuV9WcGEi+gbE/vqNaKfPdN2GEREOU5fXx9FihSRZpDPzEzzRYoUyZZnKjLhIiIiom9GqVKlAEBKuj5H+SzF7MCEi4iIiL4ZMpkMpUuXRsmSJT87g7yBgUG21GwpMeEiIiKib46+vn62JlRfwlGKRERERBrGhIuIiIhIw5hwEREREWkYEy4iIiIiDWPCRURERKRhTLiIiIiINIwJFxEREZGGMeEiIiIi0jAmXEREREQaxoSLiIiISMOYcBERERFpGBMuIiIiIg1jwkVERESkYUy4iIiIiDSMCRcRERGRhjHhIiIiItIwJlxEREREGsaEi4iIiEjDdDrhOnLkCAYPHgwXFxfY2dmhXbt2+OeffyCEUCm3a9cutGjRAjVq1EDbtm1x5syZdNuKiYnBr7/+Cnt7e9SqVQsjRoxAWFhYunI3b95Ely5dYGtriyZNmmDNmjXp/h4RERFRWjqdcP35558oWLAgJk6ciFWrVsHFxQVTpkzBihUrpDKHDx/GlClT0KpVK6xduxZ2dnYYNmwYbt++rbKtkSNHwtfXF9OnT8cff/yB4OBg9O/fHykpKVKZZ8+eoV+/fihRogRWr16Nn376CcuWLcOGDRtyapeJiIhIB+XTdgBZsWrVKpiZmUmvHRwcEBkZiY0bN2LIkCHQ09PDsmXL0KZNG4wcORIA0KBBAzx69AgrVqzA2rVrAQC3bt3CxYsXsX79ejg7OwMAKlasiNatW+P48eNo3bo1AGD9+vUoWrQoPD09YWhoCAcHB0RERMDb2xs9e/aEoaFhzn4AREREpBN0uoYrbbKlVLVqVcTGxiI+Ph4hISF4+vQpWrVqpVKmdevWuHz5MpKSkgAA58+fh4mJCZycnKQylSpVQtWqVXH+/Hlp2fnz59GsWTOVxKp169aIjo7GrVu3snv3iIiIKI/Q6YQrIzdu3IC5uTkKFy6MoKAgAB9rq9KysrJCcnIyQkJCAABBQUGoWLEiZDKZSrlKlSpJ24iPj8fr169RqVKldGVkMplUjoiIiOi/dLpJ8b+uX78OHx8fTJgwAQAQFRUFADAxMVEpp3ytXB8dHQ1jY+N02zM1NcW///4L4GOn+oy2ZWhoiIIFC0rbUpcQAvHx8VnaBtHnyGQyFCxYUNthfFZCQgIHoRCRzhBCpKus+ZQ8k3C9efMGo0aNQv369dGrVy9th/PVkpOTERAQoO0wKA8rWLAgqlWrpu0wPis4OBgJCQnaDoOIKNMy2387TyRc0dHR6N+/P4oUKYLly5dDT+9jS6mpqSmAj7VTJUqUUCmfdr2JiQnevHmTbrtRUVFSGWUNmLKmSykpKQkJCQlSOXUZGBjgu+++y9I2iD4ns3dh2lSxYkXWcBGRznj8+HGmy+p8wvXhwwcMHDgQMTEx2LFjh0rToLK/VVBQkErfq6CgIBgYGMDCwkIqd/ny5XRVg8HBwbC2tgYAGBkZoXTp0un6agUHB0MIka5v19eSyWQwMjLK0jaIdF1ub/IkIkrra25kdbrTfEpKCkaOHImgoCCsW7cO5ubmKustLCxQoUIFHD16VGW5j48PHBwcpGpAFxcXREVF4fLly1KZ4OBg3L9/Hy4uLtIyFxcXnDp1CsnJySrbMjExQa1atTSxi0RERJQH6HQN14wZM3DmzBlMnDgRsbGxKpOZVqtWDYaGhhg+fDjGjh0LS0tL1K9fHz4+Prh79y62bt0qla1VqxacnZ3x66+/YsKECcifPz8WL14MuVwOV1dXqVy/fv1w8OBBjBkzBt26dcOjR4+wfv16jBo1inNwERER0SfpdMLl6+sLAJg3b166dadOnUK5cuXg5uaGhIQErF27FmvWrEHFihXh5eWVrkZqyZIlmDt3LqZOnYqUlBQ4Oztj8uTJyJfvfx9R+fLlsX79esybNw8DBgyAmZkZRowYgb59+2p2R4mIiEinyQR7qGqdv78/AKBGjRpajoS+BRenTEf0s2faDkOFSfnycJ45XdthEBF9la/5/dbpPlxEREREuoAJFxEREZGGMeEiIiIi0jAmXEREREQaxoSLiIiISMOYcBERERFpGBMuIiIiIg1jwkVERESkYUy4iIiIiDSMCRcRERGRhjHhIiIiItIwJlxEREREGsaEi4iIiEjDmHARERERaRgTLiIiIiINY8JFREREpGFMuIiIiIg0jAkXERERkYYx4SIiIiLSMCZcRERERBrGhIuIiIhIw5hwEREREWkYEy4iIiIiDWPCRURERKRhTLiIiIiINIwJFxEREZGGMeEiIiIi0jAmXEREREQaxoSLiIiISMOYcBERERFpGBMuIiIiIg1jwkVERESkYUy4iIiIiDSMCRcRERGRhjHhIiIiItIwJlxEREREGsaEKxdTKIS2Q/is3B4fERFRbpFP2wHQp+npybBimy9ehkVpO5R0ypY0xdBuTpkqKxQKyPRyZ26fm2MjIqK8gwlXLvcyLApPX77XdhhZItPTQ/ChtUgIf63tUFQULFYaFd36azsMIiL6BjDhohyREP4aCaHPtR0GERGRVrAthYiIiEjDmHARERERaRgTLiIiIiINY8JFREREpGFMuIiIiIg0jAkXERERkYYx4SIiIiLSMCZcRERERBrGhIuIiIhIw9ROuF69eoWpU6eiRYsWsLe3h5+fHwAgIiICs2bNwv3797MtSCIiIiJdplbC9fjxY3h4eODIkSMoV64cYmJikJKSAgAwMzPDjRs3sHXr1mwNlIiIiEhXqfUsxYULF8LY2Bg7d+4EADg6Oqqsb9SoEY4cOZL16IiIiIjyALVquPz8/NCtWzeYmZlBJpOlW1+mTBmEhoZmOTgiIiKivECthEsIgQIFCnxyfUREBAwNDdUOioiIiCgvUSvhqlatGs6dO5fhupSUFBw+fBg1a9bMUmBEREREeYVa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VsJ1+fJl/PLLL1LH84zIZLIcSbjKlSuHhw8ffrFcp06d0KlTp8+WMTY2xpw5c744h1jt2rWxc+fOr4qTiIiIvl1qJVwzZsxAwYIFsXjxYtSsWTPX9NciIiIiyo3U6jT/+vVr/Pzzz3BycmKyRURERPQFaiVccrk83VxURERERJQxtRKusWPH4u+//4a/v392x0NERESU56jVh8ve3h6//vorunbtikqVKqF06dIqD7EGPnaaX7VqVbYESURERKTL1Eq4jh07hvHjxyM1NRWhoaGIi4tLV0YXHiNCRERElBPUSrgWLVqEihUrYtmyZahYsWJ2x0RERESUp6jVhyssLAxdu3ZlskVERESUCWolXDVq1MDr16+zOxYiIiKiPEmthGvy5Mnw8fGBj49PdsdDRERElOeo1Ydr7NixSElJwZgxYzBlyhSUKlUqw1GKBw4cyJYgiYiIiHSZWglXkSJFUKRIEZQvXz674yEiIiLKc9RKuLZs2ZLdcRARERHlWWr14SIiIiKizMtUDZefnx8AoF69eiqvv0RZnoiIiOhblqmEq2fPnpDJZLhz5w4MDQ2l158ihIBMJkNAQEC2BUpERESkqzKVcG3evBkAYGhoqPKaiIiIiL4sUwmXvb39Z18TERER0aep1Wm+V69euHz58ifXX7lyBb169VI7KCIiIqK8RK2E69q1a3j37t0n10dERGS6Yz0RERFRXqf2tBCf6zT/7NkzFCpUSN1NExEREeUpmZ74dO/evdi7d6/0etWqVdi5c2e6cjExMXj48CFcXFyyJ0IiIiIiHZfphCshIQHv37+XXsfFxaV7fiIAGBkZoWvXrhg6dGj2REhERESk4zKdcHXv3h3du3cHADRt2hS//fYbmjVrprHAiIiIiPIKtZ6lePr06eyOg4iIiCjPUivhevXqFV69eoW6detKyx48eIANGzYgKSkJbm5uaN68ebYFSURERKTL1Eq4Zs2ahfj4ePz5558AgHfv3qFXr15ITk5GoUKFcOzYMSxduhSurq7ZGSsRERGRTlJrWoi7d+/C0dFRer1v3z58+PAB+/fvx/nz5+Hg4IANGzZkW5BEREREukythCsqKgrFihWTXp89exb16tWDpaUl9PT08P333yMoKCjbgiQiIiLSZWolXGZmZnj16hUAIDo6Grdv30bDhg2l9ampqUhJScmeCImIiIh0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\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "code", - "source": [ - "first_cluster['test_scores']" - ], - "metadata": { - "id": "te08w2WScGaH", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "bfc74734-475f-4e90-a67c-55d635262b18" - }, - "id": "te08w2WScGaH", - "execution_count": 437, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'MSE': 18013.17900620636,\n", - " 'RMSE': 134.21318491938993,\n", - " 'MAE': 100.08988021048735,\n", - " 'R^2': 0.9986963168253506,\n", - " 'unexplained_variance': 0.0013036831746493505}" - ] - }, - "metadata": {}, - "execution_count": 437 - } - ] - }, - { - "cell_type": "code", - "source": [ - "first_cluster['values_table']" - ], - "metadata": { - "id": "OJ8D17WNcHH4", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 645 - }, - "outputId": "5831ac3b-87ea-49c6-cbc6-46e4aab4c74d" - }, - "id": "OJ8D17WNcHH4", - "execution_count": 438, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " Actual Values Predicted Values\n", - "0 11393.193024 11470.532889\n", - "1 23955.839902 23678.943710\n", - "2 13856.608009 13763.352556\n", - "3 11328.384606 11466.108821\n", - "4 14488.895946 14501.141216\n", - "5 14987.000000 14942.534892\n", - "6 12788.787051 12824.621767\n", - "7 14940.873595 15148.817161\n", - "8 12710.730114 12896.329755\n", - "9 19914.818065 19886.140399\n", - "10 14434.000000 14437.954457\n", - "11 14544.038884 14431.992267\n", - "12 12689.287290 13000.033078\n", - "13 14991.009450 15005.007020\n", - "14 11398.804112 11340.920234\n", - "15 13866.040390 13822.247132\n", - "16 23881.420841 23803.835700\n", - "17 19781.690402 19952.811398\n", - "18 15054.360852 15064.959181" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Actual ValuesPredicted Values
011393.19302411470.532889
123955.83990223678.943710
213856.60800913763.352556
311328.38460611466.108821
414488.89594614501.141216
514987.00000014942.534892
612788.78705112824.621767
714940.87359515148.817161
812710.73011412896.329755
919914.81806519886.140399
1014434.00000014437.954457
1114544.03888414431.992267
1212689.28729013000.033078
1314991.00945015005.007020
1411398.80411211340.920234
1513866.04039013822.247132
1623881.42084123803.835700
1719781.69040219952.811398
1815054.36085215064.959181
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 438 - } - ] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "plot_graph(df = first_cluster['values_table'], \n", - " graph_type='scatter_line', \n", - " label1='Actual Values',\n", - " label2='Predicted Values', \n", - " title='Actual Values vs. Predicted Values')\n", - "# \n", - "# " - ], - "metadata": { - "id": "S22QnKuucJ_I", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 480 - }, - "outputId": "1575c226-e92a-4534-c77d-d94da5be7ae4" - }, - "id": "S22QnKuucJ_I", - "execution_count": 439, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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VK7g7r+XX36ZP//8k1GjRrFixQomT55cbGylqV69ehw6dIi2bdsaDLH9U506dYD8Hpp73zNJSUnFDtsWlD937lyRbf+g93BZxHiv/v3789lnn7Fp0ybq1KlDbm6uwVDkrl27yM7O5ttvv1XPCTzUEwIK3qP/HLL85121BfHb2to+1Pu1Ro0aPPfcczz33HPcvn2bIUOGsGDBAknCqiCZEyZEMTIzM4mKiqJbt2707du30H/PPfccd+/eZdeuXUD+XYZ///0327dvL1RXwTdmKysrgPsmW25ubhw/ftxgmG/37t1cu3bNoFxBb1BBnZB/i/yxY8ce63rbtWtH3bp12bhxI5GRkepdaPeeV6PRGPReFbfGVYF69eoB8Pvvv6vbMjIy+OWXXwzKdenSBVtbW8LCwu57p1xSUhIAOp2OrKysQuewsbG573pn/9SnTx9MTU3ZvHkzW7dupVu3bmqPBeTfgarX6w2O8fDwwMTExKD+q1evcvHixWLP97j69etHbm4u33zzTaF9er1efT917twZc3NzfvjhB4P3R8ESE0Vp0aIFrq6uLF++vND78966HvQeLosY71WnTh3at29PZGQkGzduxNXV1eBO4/v9O0lLS3uoLw33e7/m5uayevVqg3ItW7akXr16LF68mLt37xaqp+D9mpubWyihq1atGjVq1Hio96uofKQnTIhi7Nq1i7t37xIYGHjf/W3atMHZ2ZmNGzcSFBREcHAw27Zt4/XXX2fYsGG0aNGClJQUdu3axaxZs2jatCn16tXD3t6elStXYmNjg7W1NV5eXri5uTFixAi2bdvGiy++SL9+/bh06RIRERHqB0KBbt26ERUVxSuvvEK3bt24fPkyK1eupHHjxo+1sKdGo2HAgAEsWLAAgNdff91gf9euXVmyZAkvvvgi/fv35/bt2/z000/Uq1ePs2fPFlm3n58fderU4d///jcxMTGYmpqydu1anJycDHrDbG1tmTlzJv/6178YOnQoQUFBODs7c/XqVfbu3Uvbtm2ZMWMGcXFxjBs3jr59+9K4cWNMTU3ZsWMHt27deqiV0qtVq4aPjw9Llizh7t27BAUFGew/fPgw77//Pn379qVBgwbk5uayYcMGTE1N6dOnj1puypQp/Pbbb8Ve/+Pq2LEjI0eOJCwsjDNnzuDn54e5uTlxcXFs3bqVf//73/Tt2xdn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\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "#### Second Cluster" - ], - "metadata": { - "id": "oBbaeOcRcZ_l" - }, - "id": "oBbaeOcRcZ_l" - }, - { - "cell_type": "code", - "source": [ - "second_cluster['train_scores']" - ], - "metadata": { - "id": "Ty2OEYtdcZ_m", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "dc4eae0f-90ee-4bf0-aa4c-dcdfb9e0dec1" - }, - "execution_count": 440, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'MSE': 2209822.535554146,\n", - " 'RMSE': 1486.5471857812472,\n", - " 'MAE': 1110.4714958440584,\n", - " 'R^2': 0.546162307796825,\n", - " 'unexplained_variance': 0.45383769220317505,\n", - " 'lasso_coefs': Features Coefficient Estimate\n", - " 0 TeamExp -201.003138\n", - " 1 ManagerExp 139.324419\n", - " 2 YearEnd -95.660929\n", - " 3 Length 748.592962\n", - " 4 Transactions 0.000000\n", - " 5 Entities 189.304393\n", - " 6 PointsAdjust 0.000000\n", - " 7 Envergure 749.481607\n", - " 8 PointsNonAjust 956.325704\n", - " 9 Language -476.752791}" - ] - }, - "metadata": {}, - "execution_count": 440 - } - ], - "id": "Ty2OEYtdcZ_m" - }, - { - "cell_type": "code", - "source": [ - "second_cluster['train_scores']['lasso_coefs']" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 363 - }, - "id": "95RhsUol8m53", - "outputId": "33111918-a9a0-4e5c-a17c-ce50bbaa1b62" - }, - "id": "95RhsUol8m53", - "execution_count": 441, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " Features Coefficient Estimate\n", - "0 TeamExp -201.003138\n", - "1 ManagerExp 139.324419\n", - "2 YearEnd -95.660929\n", - "3 Length 748.592962\n", - "4 Transactions 0.000000\n", - "5 Entities 189.304393\n", - "6 PointsAdjust 0.000000\n", - "7 Envergure 749.481607\n", - "8 PointsNonAjust 956.325704\n", - "9 Language -476.752791" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
FeaturesCoefficient Estimate
0TeamExp-201.003138
1ManagerExp139.324419
2YearEnd-95.660929
3Length748.592962
4Transactions0.000000
5Entities189.304393
6PointsAdjust0.000000
7Envergure749.481607
8PointsNonAjust956.325704
9Language-476.752791
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 441 - } - ] - }, - { - "cell_type": "code", - "source": [ - "# \n", - "plot_graph(df = second_cluster['train_scores']['lasso_coefs'], \n", - " graph_type='bar', \n", - " label1='Features',\n", - " label2='Coefficient Estimate', \n", - " title='Lasso Features vs. Coefficient Estimate Scores')\n", - "# " - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 609 - }, - "id": "iJaf1xtYJTZ6", - "outputId": "47c48171-a890-4175-876b-5b52f5ddf221" - }, - "id": "iJaf1xtYJTZ6", - "execution_count": 442, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "WARNING:matplotlib.legend:No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n" - ] - }, - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAIrCAYAAAAk8nd6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADHhklEQVR4nOzdd1gUV9sG8HtBUFBAMXZBAeMKiGJDEcQaFMXejRp7NxGjURNrNFgSO/YWW+xdsTcUe2+oIKjYQEE6spTz/eG387IBFZeyu+T+XZdXsjNnhmd2Z2afndNkQggBIiIiIvpqepoOgIiIiEhXMZEiIiIiUhMTKSIiIiI1MZEiIiIiUhMTKSIiIiI1MZEiIiIiUhMTKSIiIiI1MZEiIiIiUhMTKSIiIiI1MZEiIlLDnTt30K1bNzg6OkIulyMgIAAA4Ofnh7Zt28LBwQFyuRwxMTEYP348mjRp8tV/o0mTJhg/fnxOh671Xrx4Ablcjt27d2s6FKIvKqDpAEi37d69GxMmTMDOnTvh4OCg6XCy7cWLF2jatGmm66pXr47t27fn+N8MCwvD9u3b0axZM9ja2ub4/vOzd+/eYc2aNTh9+jRev34NmUwGa2trNGvWDD179oSpqWmu/N3k5GSMGjUKhoaGmDBhAgoVKoSyZcvi/fv3GDVqFL799ltMnjwZhoaGMDIyypUYcsrZs2dx584djBw5Mkvle/XqhStXrmS6zsrKCkeOHMny3z5w4AAiIiLQp0+fLG+T23LzeoyMjMTSpUtx/vx5vHr1CoULF0a5cuVQt25dDBs2DIULF87Rv0d5g4kUUSY8PT3h5uamsszc3DxX/lZ4eDh8fHxQrlw5JlJf4c6dOxg0aBASEhLQpk0b2NvbAwDu3buHVatW4dq1a1i7dm2u/O3nz5/j5cuXmDFjBjp37iwt9/PzQ3x8PH766SfUr19fWj59+nSoM63pkSNHIJPJciTmTzl79iw2b96c5UQKAEqXLo3Ro0dnWG5iYvJVf/vgwYMIDAzMkEiVK1cOd+7cQYECef8VlVvXY1RUFDp27Ii4uDh07NgR1tbWiIqKwqNHj7BlyxZ0796diZSOYiJFlAk7Ozu0bdtW02FkS1JSEgwMDKCnl/9q8GNiYjBixAjo6+tjz549sLGxUVnv5eWVK08PlSIjIwFkTBw+tdzAwECtv2NoaKjWdrnNxMQkV68PmUyGggUL5tr+NWHnzp149eoVtmzZgpo1a6qsi4uLU/scUUdCQgKMjY3z7O/ld/nvDktaR6FQYOHChejQoQNq1aoFR0dH9OjRA5cuXcpQ9tChQ+jQoQNq1KiBmjVronXr1li/fr20Pjk5GT4+PnB3d4eDgwPq1q2L7t27w9/fX2U/Fy9eRI8ePeDo6IjatWtj6NChePLkSY4d05MnT/Djjz/CyckJDg4O6NChA06ePKlSJioqCrNnz0br1q2l4xkwYAAePnwolbl8+TI6deoEAJgwYQLkcrlK25BPtZHp1asXevXqpbIfuVyOQ4cOYf78+WjQoAGqV6+OuLg4AMDt27fRv39/1KpVC9WrV0fPnj1x/fp1lX3GxcXhjz/+QJMmTVC1alU4Ozujb9++uH///iffhyNHjkAul2da1bN161bI5XI8fvwYAPD27VtMmDABbm5uqFq1KlxdXTF06FC8ePHis+91ZrZu3YqwsDCMHz8+QxIFAN988w2GDRumsmzz5s1o1aqV9LenTZuGmJiYDNt+6b0aP348evbsCQD46aefIJfLpc9j3LhxAIBOnTpBLpdLn11mbaTS0tKwfv16tG7dGg4ODqhXrx769++Pu3fvSmUy+/xjYmLwxx9/oGHDhqhatSq+++47rFy5EmlpaVIZZRujNWvWYNu2bWjWrBmqVq2Kjh074s6dOyrHsnnzZgCQzj25XP6Zdz7rvnQ+9erVC2fOnMHLly+lv6t8jzJrIzV+/HjUqFEDr169wuDBg1GjRg00aNBAiv/Ro0fo3bs3HB0d0bhxYxw4cEAlnpy4HoGsXUuZef78OfT19eHo6JhhXZEiRTIkjrdv38bAgQNRp04dODo6ZrgXAlm7zy1evBhyuRxBQUH4+eefUadOHfTo0UNav2/fPnTo0AHVqlWDk5MTvLy88Pr1a5V9PH36FCNHjoSLiwscHBzg5uYGLy8vxMbGfvG4/wv4RIpyXVxcHHbs2AFPT0907twZ8fHx2LlzJwYMGIAdO3ZIj8/9/f0xevRoODs7Y8yYMQCA4OBg3LhxAz/88AMAwMfHBytWrEDnzp1RrVo1xMXF4d69e7h//z5cXFwAABcuXMDAgQNRvnx5jBgxAh8+fMCmTZvQvXt37N69G+XLl/9izImJidLTBSUTExMYGBggMDAQ3bt3R6lSpTBw4EAYGxvj8OHDGD58OBYvXozvvvsOABAaGooTJ06gRYsWKF++PN69e4dt27ahZ8+eOHToEEqVKgUbGxv8+OOPWLRoEbp27YpatWoBQIZfrFm1dOlSGBgYoH///lAoFDAwMMDFixcxcOBAVK1aFSNGjIBMJsPu3bvxww8/4J9//kG1atUAAFOmTMHRo0fRs2dP2NjYICoqCtevX8eTJ0+karN/a9SokXT8Tk5OKut8fX3x7bffonLlygCAkSNHIigoCD179kS5cuUQGRkJf39/vH79OkufSXqnTp1CoUKF0Lx58yyVX7x4MXx8fFC/fn10794dISEh2LJlC+7evYstW7ZITwOy8l517doVpUqVwvLly9GrVy84ODjgm2++AfCxjdC2bdvw448/onz58rC0tPxkTL/99ht2794NNzc3dOrUCampqbh27Rpu3779yfaGiYmJ6NmzJ8LCwtCtWzeUKVMGN2/exLx58/D27Vv89ttvKuUPHjyI+Ph4dO3aFTKZDKtXr8bIkSNx4sQJGBgYoGvXrggPD4e/vz/mzJmTpfcSAFJTUzNcHwBQqFAh6UnHl86nIUOGIDY2Fm/evMGECRMA4ItVW6mpqRg4cCBq166NMWPG4MCBA/j9999hZGSE+fPno3Xr1nB3d8fWrVsxbtw4ODo6wsLCAkDOXI9ZvZYyU65cOaSmpmLfvn1o3779Z4/T398fgwcPRsmSJdG7d2988803ePLkCc6cOSPdC7/2PvfTTz+hQoUK8PLykqqZly1bhoULF8LDwwOdOnVCZGQkNm3ahO+//x579+6FqakpFAqFdD/p2bMnvvnmG4SFheHMmTOIiYn56urcfEkQZcOuXbtE5cqVxZ07dz5ZJiUlRSQlJaksi46OFvXr1xcTJkyQls2YMUPUrFlTpKSkfHJfbdq0EYMGDfpsTG3bthXOzs7i/fv30rKAgABRpUoV8csvv3x229DQUFG5cuVM/126dEkIIcQPP/wgPD09VY4pLS1NdO3aVbi7u0vLkpKSRGpqaob9V61aVfj4+EjL7ty5IypXrix27dqVIZ7GjRuLcePGZVjes2dP0bNnT+n1pUuXROXKlUXTpk1FYmKiSlzu7u6iX79+Ii0tTVqemJgomjRpIvr27Sstq1Wrlpg2bdpn35/MjB49Wjg7O6t8buHh4aJKlSrScUZHR4vKlSuL1atXf/X+M1OnTh3Rpk2bLJWNiIgQ9vb2ol+/fiqfx6ZNm0TlypXFzp07hRBf914p3+/Dhw+r/K1PXQ/jxo0TjRs3ll5fvHhRVK5cWUyfPj1DvOn/9r8//yVLlghHR0cREhKiss1ff/0lbG1txatXr4QQ/zuPnZycRFRUlFTuxIkTonLlyuLUqVPSsmnTponKlStn8s5lrmfPnp+8RiZNmiSVy8r5NGjQIJX3RUkZf/prYty4caJy5cpi+fLl0rLo6GhRrVo1IZfLxaFDh6TlT548EZUrVxaLFi2SlmX3evya8yMzb9++FfXq1ROVK1cWLVq0EJMnTxYHDhwQMTExKuVSUlJEkyZNROPGjUV0dHSGGJSyep9btGiRqFy5shg9erTKvl68eCFsbW3FsmXLVJY/evRI2NnZScsfPHiQ6blO/8OqPcp1+vr6UluPtLQ0REVFISUlBVWrVsWDBw+kcqampkhMTMxQTZeeqakpAgMD8fTp00zXh4eHIyAgAO3bt0fRokWl5VWqVEH9+vVx9uzZLMXctWtXrFu3TuVflSpVEBUVhUuXLsHDwwNxcXGIjIxEZGQk3r9/D1dXVzx9+hRhYWEAPrZvUbZPSk1Nxfv372FsbAwrKyuV485J7dq1Q6FChaTXAQEBePr0KVq3bo33799L8SYkJMDZ2RlXr16VqoRMTU1x+/ZtKf6s8vDwQEREhEr13tGjR5GWloaWLVsC+PikwsDAAFeuXEF0dHS2jzMuLi7LDXMvXLiA5ORk9O7dW6W9WOfOnVGkSBHpnPia9yq7jh07BplMhhEjRmRY97nG5UeOHEGtWrVgamoqxRcZGYn69esjNTUVV69eVSnfsmVLmJmZSa9r164N4OPTmewoV65chutj3bp10tMSQP3z6UvSN+43NTWFlZUVjIyM4OHhIS23traGqampynFm93rM7vnxzTffYN++fejWrRtiYmKwdetW/Pzzz3B2dsaSJUukp0QPHjzAixcv0Lt37wy9TpXnhjr3uW7duqm8Pn78ONLS0uDh4aFyLn3zzTeoUKECLl++DOBjtSMAnD9/HomJiV98n/6LWLVHeWLPnj1Yu3YtQkJCkJycLC1P//i5R48eOHz4MAYOHIhSpUrBxcUFHh4eKr3nfvzxRwwbNgzNmzdH5cqV4erqirZt26JKlSoAgFevXgH4WMXybzY2Njh//nyWGlpWqFBBpdeV0p07dyCEwMKFC7Fw4cJMt42IiECpUqWQlpaGDRs24J9//sGLFy+QmpoqlUl/88tJ/36cr0w4lW13MhMbGwszMzOMGTMG48ePR6NGjWBvb4+GDRuiXbt2UtXIp7i5ucHExAS+vr5wdnYG8LFaz9bWVvocDA0NMWbMGMyePRsuLi6oXr06GjVqhHbt2qFEiRJffZxFihRBfHx8lsoqzwlra2uV5YaGhrCwsMDLly8BfN17lV3Pnz9HyZIlv/o8ePbsGR49eiS9z//27+q2MmXKqLxWxp5Z27CvYWxsnOn1kZ6659PnFCxYMEPvWRMTE5QuXTpDAmpiYqJynNm9HnPi/ChZsiSmTZuGqVOn4unTpzh//jxWrVqFRYsWoWTJkujcubOU/CmrxDOjzn0us3uDEALu7u6Z/g1lj0kLCwv07dsX69atw4EDB1C7dm00adIEbdq0YbXe/2MiRblu3759GD9+PJo1a4b+/fujePHi0NfXx4oVK1R+MRYvXhx79+7F+fPn4efnBz8/P+zevRvt2rXD7NmzAQB16tTB8ePHcfLkSfj7+2Pnzp1Yv349pk2bpvJLNbcof3H269cPDRo0yLSMsl3M8uXLsXDhQnTs2BE//fQTzMzMoKenB29vb7W6wqeXmpoKfX39DMvTP40CIP2dX3755ZNduZU325YtW6J27do4fvw4/P39sWbNGqxatQqLFy9Gw4YNPxmLoaEhmjVrhuPHj2PKlCmIiIjAjRs3MnSP79OnD5o0aYITJ07g/PnzWLhwIVauXIn169fDzs7uq47f2toaAQEBUCgUOdaz7WveK01JS0uDi4sLBgwYkOn6ihUrqrzO7BwBkO3zLyvUPZ8+51PHk5XjzO71mJPnh0wmg5WVFaysrNCoUSO4u7tj//79uXoP+3dj9rS0NMhkMqxatSrT9y/9sYwfPx7t27eX7rszZszAihUrsH37dpQuXTrXYtYVTKQo1x09ehQWFhbw8fFR+dW4aNGiDGUNDQ3RpEkTNGnSBGlpaZg6dSq2bduGYcOGoUKFCgA+/nrs2LEjOnbsiPj4ePTs2ROLFy9G586dUbZsWQBASEhIhn0HBwejWLFi2foyVP6aNjAw+OIv8qNHj6Ju3brw9vZWWR4TE4NixYpJrz9XlWNmZpbp04NXr15l6Ze9skyRIkW+GC/w8Rfz999/j++//x4RERFo3749li9f/sUvPg8PD+zZswcXL17EkydPIIRQqWpRsrS0RL9+/dCvXz88ffoU7dq1w9q1a/HXX399Mbb0GjdujJs3b+LYsWPw9PT8bFnlOREcHKzynikUCrx48UJ6X772vcoOS0tLnD9/HlFRUV/1VMrS0hIJCQk5Gl9ujlP1pfMpt8fISi+712NunR8WFhYwNTXF27dvVf7O48ePP/l3cuI+Z2lpCSEEypcvn+mTrX9T9mAcNmwYbty4ge7du2PLli3w8vL64rb5HdtIUa5T/tpJ/6vv9u3buHXrlkq59+/fq7zW09OTumIrFIpMyxQuXBiWlpbS+pIlS8LW1hZ79+5VSUAeP34Mf39/tX8JKxUvXhxOTk7Ytm0bwsPDM6xPX7Wir6+f4Zfu4cOHM7QZUY58nVnCZGFhgdu3b0vHB0AaxTsrqlatCktLS6xduzbTqjBlvKmpqRm6MhcvXhwlS5ZU+dufUr9+fRQtWhS+vr44fPgwqlWrppK0JCYmIikpSWUbS0tLFC5cWGX/4eHhePLkiUr1b2a6deuGEiVKYNasWZl+mURERGDp0qVSbAYGBti4caPK57Fz507ExsZK50RW36uc4O7uDiEEfHx8Mqz73NMRDw8P3Lx5E+fOncuwLiYmBikpKV8dy+fOP3Vl9XwyMjLKsy702b0es3t+3L59GwkJCRmW37lzB1FRUVIyY29vj/Lly2PDhg0ZYlDGnxP3OXd3d+jr68PHxyfD+yKEkO61cXFxGc6rypUrQ09PL0v3hv8CPpGiHLFr165Mb+69e/dGo0aNcOzYMQwfPhyNGjXCixcvsHXrVlSqVEnlxjJx4kRER0ejXr16KFWqFF69eoVNmzbB1tZWGiuoVatWcHJygr29PYoWLYq7d+9KXayVfvnlFwwcOBBdu3ZFp06dpG7BJiYmmTbu/VpTpkxBjx490Lp1a3Tp0gUWFhZ49+4dbt26hTdv3mD//v0APg4NsGTJEkyYMAE1atTA48ePceDAgQxPkiwtLWFqaoqtW7eicOHCMDY2lhKRzp074+jRoxgwYAA8PDzw/PlzHDhw4LPd6tPT09PDjBkzMHDgQHh6eqJDhw4oVaoUwsLCcPnyZRQpUgTLly9HfHw8GjZsiObNm6NKlSowNjbGhQsXcPfu3SzN9WZgYIDvvvsOhw4dQmJiYoZ2JE+fPkWfPn3QokULVKpUCfr6+jhx4gTevXuHVq1aSeXmzZuHPXv24OTJk58dEsHMzAxLlizBoEGD0K5dO5WRzR88eICDBw+iRo0aAD6OSD948GD4+PhgwIABaNKkCUJCQvDPP//AwcEBbdq0+ar3KifUq1cPbdu2xcaNG/Hs2TM0aNAAaWlpuH79OurWratyPqfXv39/nDp1CkOGDEH79u1hb2+PxMREPH78GEePHsXJkye/egR+5fs2Y8YMuLq6Ql9fX+UzyUxsbCz27duX6bq2bdtm+Xyyt7eHr68vZs6cCQcHBxgbG6s1J2FW5MT1mJ3zY9++fThw4IA0ppeBgQGePHmCXbt2oWDBghgyZAiAj+fh1KlTMXToULRr1w4dOnRAiRIlEBwcjKCgIKxZswZA9u9zlpaWGDVqFObOnYuXL1+iWbNmKFy4MF68eIETJ06gS5cu6N+/Py5duoTff/8dLVq0QMWKFaUhHPT19bM8/Eh+x0SKcsSWLVsyXd6hQwd06NBBGrPl/PnzqFSpEv78808cOXJEpadXmzZtsH37dvzzzz+IiYlBiRIl4OHhgZEjR0q9bXr16oVTp07B398fCoUCZcuWxahRo9C/f39pP/Xr18fq1auxaNEiLFq0CAUKFECdOnUwduzYbDV0VapUqRJ27doFHx8f7NmzB1FRUTA3N4ednR2GDx8ulRsyZAgSExNx4MAB+Pr6ws7ODitWrMDcuXNV9mdgYIBZs2Zh3rx5mDp1KlJSUjBz5kxYWFigQYMGGD9+PNatWwdvb29UrVoVy5cvl9qMZUXdunWxbds2LF26FJs2bUJCQgJKlCghjYkEfGxbpRzY9NixYxBCwNLSUkoas6Jly5bYsWMHZDJZhmq90qVLo1WrVrh48SL2798PfX19WFtbY8GCBWrfjKtXr44DBw5gzZo1OHPmDPbt2wc9PT1YW1tj0KBBKsnIyJEjYW5ujk2bNmHmzJkwMzNDly5dMHr0aJURpbPyXuWUmTNnQi6XY+fOnZgzZw5MTExQtWpVKQHMjJGRETZu3IgVK1bgyJEj2Lt3L4oUKYKKFSti5MiRajX+dXd3R69evXDo0CHs378fQogvJlJv3rzBL7/8kum6tm3bZvl86tGjBwICArB79278/fffKFeuXK4lUjlxPWbn/OjatSsKFSqES5cu4dSpU4iLi0OxYsXg4uKCwYMHq7QTbNCgAdavX48lS5Zg7dq1EELAwsICXbp0kcrkxH1u0KBBqFixIv7++28sWbIEwMdr1cXFRfoc5HI5XF1dcfr0aYSFhcHIyAhyuRyrVq3KdHDR/yKZyItWh0RERET5ENtIEREREamJiRQRERGRmphIEREREamJiRQRERGRmphIEREREamJiRQRERGRmjiOVC66efMmhBAq49QQERGRdktOToZMJvvsuG5KTKRykRAiTyYHJSIiopzzNd/dWptIPXv2DGvWrMHt27cRGBgIa2trHDx4MEO5HTt2YPXq1Xj16hWsrKzg5eWFxo0bq5SJjY3FzJkzceLECSQnJ6NBgwaYOHEiSpYsqVLuxo0bmD17NgICAlC8eHF0794dAwcOVHtiTeWTKAcHB7W2JyIiorx39+7dLJfV2jZSgYGBOHv2LCpUqCDNs/Zvhw4dwqRJk+Dh4SENVz9ixIgMk+GOGjUK/v7+mDp1Kv766y+EhIRg4MCBKhMxPnv2DP3790eJEiWwYsUK/PDDD1i0aBHWrl2bm4dJREREOkxrn0g1adIEzZo1AwCMHz8e9+7dy1Bm0aJFaNWqFUaNGgXg40Sgjx8/xpIlS7Bq1SoAH9spnT9/HmvWrIGrqysAwMrKCi1btsSxY8fQsmVLAMCaNWtQrFgxzJs3D4aGhnB2dkZkZCSWL1+OXr16wdDQMA+OmoiIiHSJ1j6RUk5S+ymhoaF4+vRphslRW7ZsiYsXL0KhUAAA/Pz8YGpqChcXF6mMtbU1bG1t4efnJy3z8/ND06ZNVRKmli1bIiYmBjdv3syJQyIiIqJ8RmufSH1JcHAwgI9Pl9KzsbFBcnIyQkNDYWNjg+DgYFhZWWVo52RtbS3tIyEhAa9fv4a1tXWGMjKZDMHBwahbt65acQohkJCQoNa2RERElPeEEFluH62ziVR0dDQAwNTUVGW58rVyfUxMDExMTDJsb2ZmJlUXxsbGZrovQ0NDGBkZSftSR3JyMgICAtTenoiIiPJeVpv06GwipSsMDAxQqVIlTYdBRET0n5GamqrSoezfChQoAH19/U+uDwoKyvLf0tlEyszMDMDHp0klSpSQlsfExKisNzU1xZs3bzJsHx0dLZVRPrFSPplSUigUSExMlMqpQyaTwdjYWO3tiYiIKGuEEHjz5g2ioqK+WLZo0aIoXbp0plV4XzPskc4mUsr2TMHBwSptm4KDg2FgYAALCwup3MWLFzPUd4aEhKBy5coAAGNjY5QpU0ZqM5W+jBAiQ9spIiIi0j7KJKpkyZIwNjbONCFStl0ODw8HAJQpUyZbf1Nre+19iYWFBSpWrIgjR46oLPf19YWzs7NUt+nm5obo6GhcvHhRKhMSEoIHDx7Azc1NWubm5oaTJ08iOTlZZV+mpqZZGiKeiIiINCc1NVVKoooXLw4jIyMUKlQowz8jIyMUL14cJUuWRFRUFFJTU7P1d7X2iVRiYiLOnj0LAHj58iXi4uKkpMnJyQnm5uYYOXIkxowZA0tLS9StWxe+vr64c+cONm3aJO2nRo0acHV1xa+//opx48ahYMGCmD9/PuRyOdzd3aVy/fv3x4EDB/Dzzz+je/fuePz4MdasWQMvLy+OIUVERKTllA9CstqcRlkuOTn5s+2lvkQmtHQyuBcvXqBp06aZrtuwYYM0HMGOHTuwatUqaYqY0aNHf3KKmOPHjyMlJQWurq6YOHEiSpUqpVLuxo0bmDVrFgICAmBubo7vv/8+W1PEKIeY5xQxREREuevDhw8ICQmBlZUVChUqlK3yX/P9rbWJVH7ARIqIiChvaCqR0tk2UkRERESaxkSKiIiISE1MpIiIiIjUxESKiIhIiwmRpukQPkvb4stq0++caiKutcMfEBERESCT6eHhzV1IiH2n6VAyMDb5BlVqdNR0GAA+TskGAAkJCTAyMvpi+YSEBJXt1MVEioiISMslxL5DXMxrTYeh1fT19VG0aFFpxPKsjGxetGjRbI0hBTCRIiIionyidOnSACAlU5+jnGsvu5hIERERUb4gk8lQpkwZlCxZUmXKt38zMDDI9pMoJSZSRERElK/o6+vnWKL0Jey1R0RERKQmJlJEREREamIiRURERKQmJlJEREREamIiRURERKQmJlJEREREamIiRURERKQmJlJEREREamIiRURERKQmJlJEREREamIiRURERKQmJlJEREREamIiRURERKQmJlJEREREamIiRURERKQmJlJEREREamIiRURERKQmJlJEREREamIiRURERKQmJlJEREREamIiRURERKQmJlJEREREamIiRURERKQmJlJEREREamIiRURERKQmnU+kTp48ic6dO6NGjRpwdXXFTz/9hNDQ0AzlduzYgebNm8PBwQFt2rTB6dOnM5SJjY3Fr7/+CicnJ9SoUQM//vgjwsPD8+IwiIiISAfpdCJ1+fJljBgxApUqVcKSJUvw66+/4uHDh+jXrx8+fPgglTt06BAmTZoEDw8PrFq1Co6OjhgxYgRu3bqlsr9Ro0bB398fU6dOxV9//YWQkBAMHDgQKSkpeXxkREREpAsKaDqA7Dh06BDKli0Lb29vyGQyAIC5uTl++OEH3Lt3D7Vr1wYALFq0CK1atcKoUaMAAPXq1cPjx4+xZMkSrFq1CgBw8+ZNnD9/HmvWrIGrqysAwMrKCi1btsSxY8fQsmXLvD9AIiIi0mo6/UQqJSUFhQsXlpIoADAxMQEACCEAAKGhoXj69Ck8PDxUtm3ZsiUuXrwIhUIBAPDz84OpqSlcXFykMtbW1rC1tYWfn19uHwoRERHpIJ1+ItWhQwfs27cPmzdvRps2bRAVFYV58+bBzs4ONWvWBAAEBwcD+Ph0KT0bGxskJycjNDQUNjY2CA4OhpWVlUpSBnxMppT7UIcQAgkJCWpvT0RE/10ymQxGRkaaDuOLEhMTpQcY+YEQIkM+8Ck6nUjVrl0bPj4++Pnnn/H7778DAGxtbbF69Wro6+sDAKKjowEApqamKtsqXyvXx8TESE+z0jMzM8O9e/fUjjE5ORkBAQFqb09ERP9dRkZGsLOz03QYXxQSEoLExERNh5GjDA0Ns1ROpxOpGzdu4JdffkGXLl3QqFEjREVFYenSpRg0aBD++ecfFCpUSNMhwsDAAJUqVdJ0GEREpIOy+lRE06ysrPLVE6mgoKAsl9XpRGrGjBmoV68exo8fLy1zdHREo0aNsG/fPnTt2hVmZmYAPg5tUKJECalcTEwMAEjrTU1N8ebNmwx/Izo6WiqjDplMBmNjY7W3JyIi0na6UP34Nb4mgdXpxuZPnjxBlSpVVJaVLl0axYoVw/PnzwF8bOMEIEM7p+DgYBgYGMDCwkIqFxISkiGjDgkJkfZBRERElJ5OJ1Jly5bFgwcPVJa9fPkS79+/R7ly5QAAFhYWqFixIo4cOaJSztfXF87OzlIdqJubG6Kjo3Hx4kWpTEhICB48eAA3N7dcPhIiIiLSRTpdtdetWzd4e3tjxowZaNKkCaKiorBs2TIUL15cZbiDkSNHYsyYMbC0tETdunXh6+uLO3fuYNOmTVIZ5cjov/76K8aNG4eCBQti/vz5kMvlcHd318ThERERkZbT6USqd+/eMDQ0xJYtW7Br1y4ULlwYjo6OWLBgAYoVKyaV8/T0RGJiIlatWoWVK1fCysoKPj4+qFGjhsr+FixYgJkzZ2Ly5MlISUmBq6srJk6ciAIFdPptIiIiolwiE/mpmb2WuXv3LgDAwcFBw5EQEZEuu+G3AnExrzUdRgZFTMugpttgTYeR477m+1un20gRERERaRITKSIiIiI1MZEiIiIiUhMTKSIiIiI1MZEiygdEWpqmQ/gsbY+P8q80LT73tDk2yjr26yfKB2R6eri1bAXiXmlhr56yZeA4NP/16iHdoKenh0OHDiEyMlLToagwNzdHq1atNB0G5QAmUkT5RNyr14h59kzTYRBpncjISISHh2s6DMqnWLVHREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpKZ8kUjt2bMH7dq1g4ODA+rWrYsBAwbgw4cP0vpTp06hTZs2cHBwQPPmzbFr164M+1AoFJg9ezZcXFzg6OiIvn37Ijg4OC8Pg4iIiHSMzidSy5Ytw/Tp09GyZUusWbMGv//+O8qXL4/U1FQAwLVr1zBixAg4Ojpi1apV8PDwwG+//YYjR46o7GfGjBnYsWMHvLy8sHjxYigUCvTp0wexsbGaOCwiIiLSAQU0HUB2BAcHw8fHB0uXLkXDhg2l5c2bN5f+f9myZahWrRp+//13AEC9evUQGhqKRYsWoUWLFgCAN2/eYOfOnZgyZQo6deoEAHBwcEDjxo2xdetWDBw4MA+PioiIiHSFTj+R2r17N8qXL6+SRKWnUChw+fJlKWFSatmyJZ48eYIXL14AAM6fP4+0tDSVckWLFoWLiwv8/Pxy7wCIiIhIp+n0E6nbt2+jcuXKWLp0KTZu3IjY2FhUrVoVEyZMQPXq1fH8+XMkJyfD2tpaZTsbGxsAH59olS9fHsHBwShevDjMzMwylNu5c2e2YhRCICEhIVv7IPocmUwGIyMj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IiLKj9RKpNzc3LB9+3ZpYMv0AgMDsWPHDjRp0iTbwRERERFpM7Uam48aNQpdunSBp6cnGjduDJlMhr1792LXrl04duwYSpQogWHDhuV0rERERERaRa0nUqVKlcLu3bvRoEEDHD58GEII7Nu3D6dPn0arVq2wffv2PB9TioiIiCivqT1IUvHixfHHH3/gjz/+QGRkJNLS0mBubs4Rc4mIiOg/I0dGm+TTp/8mkZYGmRYnztoeHxER6b4sJVI+Pj6QyWQYOnQo9PT04OPj88VtZDIZhg8fnu0ASXvJ9PQQcnAVEiO0byoMo+JlYOU5UNNhEBFRPvdVidTAgQNhaGjIRIokiRGvkRj2XNNhEBERaUSWEqmHDx9+9jURERHRfxEbkBARERGpSa1EKjQ09LMTBp86dQovXrxQOygiIiIiXaBWr705c+YgLi7uk6OXb968Gaamppg/f362giMiIiLSZmo9kbp58ybq16//yfXOzs64du2a2kERERER6QK1EqmYmBgULlz4k+uNjY0RFRWlbkxEREREOkGtRKpMmTK4cePGJ9dfv34dpUuXVjsoIiIiIl2gViLl6emJQ4cOYcOGDUhLS5OWp6amYv369fD19YWnp2eOBUlERESkjdRqbD548GBcv34d3t7eWL58OaysrAAAISEhiIyMhJOTE4YOHZqjgRIRERFpG7USKUNDQ6xduxZ79uzB8ePH8fz5x5Gtq1WrBnd3d7Rr146TFxMREVG+p/akxXp6eujYsSM6duyYk/EQERER6Qw+NiIiIiJSU5aeSPXq1Qt6enpYs2YNChQogN69e39xG5lMhvXr12c7QCIiIiJtleWqvfS984QQXyyflTJEREREuixLidTGjRs/+5qIiIjovyhLbaScnJxw9OhR6bWPjw8eP36ca0ERERER6YIsJVIJCQlITEyUXvv4+ODRo0e5FhQRERGRLshS1Z6FhQWOHDmCWrVqoUiRIgCAxMTEL86nV7Ro0ezGR0RERKS1spRIDR48GL/++ivOnj0L4GOPvClTpmDKlCmf3S4gICD7ERIRERFpqSwlUu3atUO1atVw5coVvHv3Dj4+Pvjuu+8gl8tzOz4iIiIirZWlRCouLg4VKlSAtbU1AGD37t1o164dmjZtmqvBEREREWmzLDU2r1OnDnx9faXXdevWxTfffJNrQRERERHpgiwlUgYG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EhMTIYTQcDRERJQfKL/7tFn67z0hBGQyWZa206pEKjY2VqVa7lMsLCxgaGiosszf3x+LFy/GsGHDULVq1dwK8aslJycjICBAem1gYAA7O3sM7+6iwag+LyUlFYGBgUhOTtZ0KERElA8YGRnBzs5O02F8VkhICBITE6XX/84zPkWrEqkjR45g4sSJXyzn6+sLGxsb6fX9+/cxcuRIeHp6YsSIESplTU1NERcXl2EfMTExKtV9pqamKr34lKKjozNUC34NAwMDVKpUSWVZcrIC2p6j/DtmIiIidWX16Y4mWVlZSU+kgoKCsrydViVSnTt3RufOnb9qm2fPnmHgwIGoUaMGZsyYkWG9tbU13r17lyEh+nebKGtr6wxtoWJjY/H27dsMbae+hkwmg7GxsdrbExERUe5LX/X4NYmfTjc2Dw8PR79+/VCmTBksWrQIBgYGGcq4urpCT08Px44dk5ZFR0fj/PnzcHNzk5a5ubnhwoULiImJkZYdOXIEenp6cHHR3mo4IiIi0hyteiL1NT58+ICBAwfi/fv3+O233xAYGCitMzQ0lOpiS5cujU6dOmHOnDnQ09NDqVKlsGLFCpiYmKBbt27SNt26dcPGjRsxfPhwDB48GGFhYZgzZw66devGMaSIiIgoUzqbSL179w4PHz4EAAwdOlRlXbly5XDq1Cnp9cSJE1G4cGHMnTsX8fHxqFmzJtatW6fSm8/MzAzr16/H9OnTMXz4cBQuXBidOnWCl5dX3hwQERER6RyZYB/3XHP37l0AH0dSJyIi+q+be+o6XkZn7ACmSeXMiuDnJrVUln3N97dOt5EiIiIi0iQmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqYiJFREREpCYmUkRERERqyjeJ1L1792Bra4saNWpkWKdQKDB79my4uLjA0dERffv2RXBwcIZyT548Qd++feHo6AgXFxfMmTMHCoUiL8InIiIiHZQvEikhBKZPnw5zc/NM18+YMQM7duyAl5cXFi9eDIVCgT59+iA2NlYqEx0djR9++AHJyclYvHgxvLy8sH37dsyaNSuvDoOIiIh0TL5IpHbt2oX379+jY8eOGda9efMGO3fuxNixY9GpUyc0aNAAS5YsQWxsLLZu3SqV27p1K+Lj4+Hj44MGDRqgU6dOGDt2LLZu3YqwsLC8PBwiIiLSETqfSMXExGDu3LmYMGECDAwMMqw/f/480tLS0KJFC2lZ0aJF4eLiAj8/P2mZn58fnJ2dUbRoUWmZh4cH0tLS4O/vn6vHQERERLpJ5xOpBQsWwN7eHo0bN850fXBwMIoXLw4zMzOV5TY2NirtpIKDg2Ftba1SxtTUFCVKlMi0PRURERFRAU0HkB0BAQHYuXMn9uzZ88kyMTExMDExybDc1NQU0dHRKuVMTU0zlDMzM1Mp97WEEEhISFB7eyIiIl0nk8lgZGSk6TA+KzExEUIIAB+/u2UyWZa206pEKjY2FuHh4V8sZ2FhAQMDA0ybNg09evSAjY1NHkSnnuTkZAQEBGg6DCIiIo0xMjKCnZ2dpsP4rJCQECQmJkqvDQ0Ns7SdViVSR44cwcSJE79YztfXFw8fPkRwcDDmzp2LmJgYAEBSUhKAj0+XChYsiIIFC8LU1BRxcXEZ9hETE6NS3WdqaqrSi08pOjo6Q7Xg1zAwMEClSpXU3p6IiEjXZfXpjiZZWVlJT6SCgoKyvJ1WJVKdO3dG586ds1TW19cX0dHRaNKkSYZ1derUwcCBAzFmzBhYW1vj3bt3GRKif7eJsra2ztAWKjY2Fm/fvs3QdupryGQyGBsbq709ERER5b70VY9fk/hpVSL1Ndq3bw8nJyeVZXv27IGvry9WrVqFsmXLAgBcXV2hp6eHY8eOSUladHQ0zp8/j2HDhknburm5Yfny5SptpY4cOQI9PT24uLjk0VERERGRLtHZRKp8+fIoX768yrIrV65AX18fdevWlZaVLl0anTp1wpw5c6Cnp4dSpUphxYoVMDExQbdu3aRy3bp1w8aNGzF8+HAMHjwYYWFhmDNnDrp164ZSpUrl2XERERGR7tDZROprTJw4EYULF8bcuXMRHx+PmjVrYt26dSq9+czMzLB+/XpMnz4dw4cPR+HChdGpUyd4eXlpMHIiIiLSZjKhbFlFOe7u3bsAAAcHBw1HQkREpHlzT13Hy+iMHcA0qZxZEfzcpJbKsq/5/tb5ATmJiIiINIWJFBEREZGamEgRERERqYmJFBEREZGamEgRERERqYmJFBEREZGamEgRERERqYmJFBEREZGamEgRERERqYmJFBEREZGa/hNz7REREZHmlTIx1nQIGWQ3JiZSRERElOvShEDPOraaDiNTaUJATyZTa1tW7REREVGuUzdRyQvZiY2JFBEREZGamEgRERERqYmJFBEREZGamEgRERERqYmJFBEREZGamEgRERERqYmJFBEREZGamEgRERERqYmJFBEREZGamEgRERERqYmJFBEREZGamEgRERERqYmJFBEREZGaCmg6gPwsOTkZQgjcvXtX06EQERFRFikUCshksiyVZSKVi7L6IRAREZH2kMlkWf4OlwkhRC7HQ0RERJQvsY0UERERkZqYSBERERGpiYkUERERkZqYSBERERGpiYkUERERkZqYSBERERGpiYkUERERkZqYSBERERGpiYkUERERkZqYSBERERGpiYkUERERkZqYSBERERGpiYkUERERkZqYSBHlkcDAQNy7d0/TYRARUQ5iIvUfl5aWpukQ/jOWL1+OTp06wdvbGxEREZoOh4iIcoBMCCE0HQTlndTUVAghEBMTA3NzcwCA8hSQyWSaDC3HCSG06piePn2K48ePY/369UhOTsbPP/+Mdu3awdDQUNOh0Scoz6EbN27AwMAANjY2MDY21nRY/0mpqanQ19fXuuua/kf52fzXPiMmUv8BKSkpKFCgAG7cuIE9e/bg/PnzMDc3R7ly5dC3b1/UqFEDgPYlHjlJm47t/v37mDdvHvz9/VGzZk0MHToUDRo00HRY9C/KL+779+/Dy8sLbdq0Qb9+/bQqkfr3ea1N53lu2bt3L6pXrw4rKytNh6KW/J5sXL9+HZGRkWjSpAn09fU1HU6mcvq6YdVePieEQIECBQAAP/74I+7fv4+mTZtCLpfj3bt36NWrF/744w/Ex8fr/EWt/E0QHx+Pq1ev4saNG3jy5Ani4uI0fmwpKSkAgMjISKxfvx4KhQK2trZ4/fo1Bg4ciJEjRyI4OFijMX6Jsho4LS0Nz58/x507d/Dq1SvExcVJZfLT7zLll8DkyZPh6OiIFi1awNjYGImJiXj9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\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "code", - "source": [ - "second_cluster['test_scores']" - ], - "metadata": { - "id": "nKCiD4f7cZ_n", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "888038ae-01cd-4914-8b76-85bd72bc89db" - }, - "execution_count": 443, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'MSE': 2458814.842725537,\n", - " 'RMSE': 1568.060854280068,\n", - " 'MAE': 1181.5169751642923,\n", - " 'R^2': 0.61112205706428,\n", - " 'unexplained_variance': 0.38887794293572}" - ] - }, - "metadata": {}, - "execution_count": 443 - } - ], - "id": "nKCiD4f7cZ_n" - }, - { - "cell_type": "code", - "source": [ - "second_cluster['values_table']" - ], - "metadata": { - "id": "ClKwYpNncZ_n", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 582 - }, - "outputId": "a2174012-fd75-43d7-d00c-f9f2ee718463" - }, - "execution_count": 444, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " Actual Values Predicted Values\n", - "0 2422.0 3144.714921\n", - "1 847.0 1305.245754\n", - "2 4277.0 6421.140977\n", - "3 3136.0 3645.058605\n", - "4 1435.0 3143.683121\n", - "5 5922.0 4239.445273\n", - "6 9520.0 7512.422884\n", - "7 1155.0 1478.169004\n", - "8 2821.0 4231.207053\n", - "9 5180.0 5655.482507\n", - "10 6783.0 3648.506992\n", - "11 1617.0 2552.322236\n", - "12 7854.0 4236.038404\n", - "13 2331.0 2065.523554\n", - "14 3913.0 4390.704501\n", - "15 546.0 649.208230\n", - "16 4620.0 4729.788776" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Actual ValuesPredicted Values
02422.03144.714921
1847.01305.245754
24277.06421.140977
33136.03645.058605
41435.03143.683121
55922.04239.445273
69520.07512.422884
71155.01478.169004
82821.04231.207053
95180.05655.482507
106783.03648.506992
111617.02552.322236
127854.04236.038404
132331.02065.523554
143913.04390.704501
15546.0649.208230
164620.04729.788776
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 444 - } - ], - "id": "ClKwYpNncZ_n" - }, - { - "cell_type": "code", - "source": [ - "# \n", - "plot_graph(df = second_cluster['values_table'], \n", - " graph_type='scatter_line', \n", - " label1='Actual Values',\n", - " label2='Predicted Values', \n", - " title='Actual Values vs. Predicted Values')\n", - "# \n", - "# " - ], - "metadata": { - "id": "Nc9bZ5oVcZ_n", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 480 - }, - "outputId": "b438398b-7873-4eb5-ef9e-4f7717c1f501" - }, - "execution_count": 445, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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\n" - }, - "metadata": {} - } - ], - "id": "Nc9bZ5oVcZ_n" - }, - { - "cell_type": "markdown", - "source": [ - "### K-NN" - ], - "metadata": { - "id": "T6KRtYB8p8TG" - }, - "id": "T6KRtYB8p8TG" - }, - { - "cell_type": "code", - "source": [ - "# \n", - "knn_model = results['knn']\n", - "first_cluster = knn_model[0]\n", - "second_cluster = knn_model[1]\n", - "# " - ], - "metadata": { - "id": "T8GrIM4m3M1M" - }, - "id": "T8GrIM4m3M1M", - "execution_count": 446, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "#### First Cluster" - ], - "metadata": { - "id": "3M12BmDIEcqq" - }, - "id": "3M12BmDIEcqq" - }, - { - "cell_type": "code", - "source": [ - "first_cluster['train_scores']" - ], - "metadata": { - "id": "neP8VNvYEcqr", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "b0c4c64e-bb8b-4f0a-d57c-28dfc80138f4" - }, - "execution_count": 447, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'MSE': 167033.97582698648,\n", - " 'RMSE': 408.69790289037024,\n", - " 'MAE': 124.42385827358666,\n", - " 'R^2': 0.9886748252575125,\n", - " 'unexplained_variance': 0.01132517474248751,\n", - " 'lasso_coefs': Empty DataFrame\n", - " Columns: []\n", - " Index: []}" - ] - }, - "metadata": {}, - "execution_count": 447 - } - ], - "id": "neP8VNvYEcqr" - }, - { - "cell_type": "code", - "source": [ - "first_cluster['test_scores']" - ], - "metadata": { - "id": "udWcmM3IEcqs", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "4938af15-61c6-495a-f479-c9377b9487be" - }, - "execution_count": 448, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'MSE': 4523.826504635181,\n", - " 'RMSE': 67.25939714742603,\n", - " 'MAE': 53.8494770947196,\n", - " 'R^2': 0.9996725932442523,\n", - " 'unexplained_variance': 0.0003274067557477167}" - ] - }, - "metadata": {}, - "execution_count": 448 - } - ], - "id": "udWcmM3IEcqs" - }, - { - "cell_type": "code", - "source": [ - "first_cluster['values_table']" - ], - "metadata": { - "id": "_1Yge7wNEcqt", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 645 - }, - "outputId": "bffc7f5e-ba29-4fcd-afb0-a65d62631de8" - }, - "execution_count": 449, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " Actual Values Predicted Values\n", - "0 11393.193024 11367.985250\n", - "1 23955.839902 23927.184825\n", - "2 13856.608009 13845.652207\n", - "3 11328.384606 11392.653423\n", - "4 14488.895946 14389.231142\n", - "5 14987.000000 14981.716297\n", - "6 12788.787051 12774.039618\n", - "7 14940.873595 15028.757948\n", - "8 12710.730114 12774.039618\n", - "9 19914.818065 19871.798721\n", - "10 14434.000000 14401.541421\n", - "11 14544.038884 14378.964998\n", - "12 12689.287290 12774.039618\n", - "13 14991.009450 14978.012823\n", - "14 11398.804112 11378.387902\n", - "15 13866.040390 13899.120744\n", - "16 23881.420841 23927.184825\n", - "17 19781.690402 19873.987376\n", - "18 15054.360852 14961.056340" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Actual ValuesPredicted Values
011393.19302411367.985250
123955.83990223927.184825
213856.60800913845.652207
311328.38460611392.653423
414488.89594614389.231142
514987.00000014981.716297
612788.78705112774.039618
714940.87359515028.757948
812710.73011412774.039618
919914.81806519871.798721
1014434.00000014401.541421
1114544.03888414378.964998
1212689.28729012774.039618
1314991.00945014978.012823
1411398.80411211378.387902
1513866.04039013899.120744
1623881.42084123927.184825
1719781.69040219873.987376
1815054.36085214961.056340
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 449 - } - ], - "id": "_1Yge7wNEcqt" - }, - { - "cell_type": "code", - "source": [ - "# \n", - "plot_graph(df = first_cluster['values_table'], \n", - " graph_type='scatter_line', \n", - " label1='Actual Values',\n", - " label2='Predicted Values', \n", - " title='Actual Values vs. Predicted Values')\n", - "# \n", - "# " - ], - "metadata": { - "id": "Cdwo5n9ZEcqt", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 480 - }, - "outputId": "84e96491-0e75-4562-d445-9cdc59846780" - }, - "execution_count": 450, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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v054eDjXr1/n448/5oUXXlDX6IK8Gwfeeecd3Nzc8PPzIzo6muPHj/PDDz+UtPmEeCo5OzvTtWtXTE1NadGixWN1wwshxNPmkZKu+Ph41q1bR1RUFBcuXKB69er07t2bpk2bMnbsWLp164avr2+Jg7l9+zZvvfWWwbb810uWLMHPz4/GjRuzYMECZs2axauvvoq9vT2hoaGMHTvW4LhJkyZhY2PDp59+SmpqKs2bN2fRokUGdzXa29uzePFi/vOf//D6669jY2NDSEhIgbp69epFeno6CxYsYP78+bi7uzN37tzHulYhnga5ubns3bsXLy8vatSoARSccymEECLPQyddoaGhHD9+nCpVqtCtWzemTZtGy5YtAbh48WKpBOPq6srp06cfWM7f35/Vq1cXW0ar1TJu3DjGjRtXbDlPT0++++67B57zueee47nnnntgOSEqi5SUFNasWUNsbCzHjx9n1KhRmJmV6jRRIYR4qjz0b8hjx47h6urK+PHj6dChg/xyFaISO3/+PD///DOpqamYm5vz7LPPyu8EIYR4gIf+Lfn++++zfv163njjDezt7enWrRvBwcEylCBEJZKbm8vOnTvZu3cvkPdIn5CQEKpWrWrkyIQQovx76KTrxRdf5MUXXyQ+Pp6oqCjWr1/PihUrqFq1Kn5+fmg0Gpk0K8RTLD09naVLlxIfHw9AixYt6NatG+bm5kaOTAghKoZHHg+oXbs2r732Gq+99pp6B2N0dDSKojB16lT27NlDUFAQbdu2VZ+1JoSo+CwsLDAzM8PCwoLevXurS7QIIYR4OI81CaNx48Y0btyYcePGcfDgQdatW0d0dDQrV67EysqKI0eOlFacQggjyMnJQVEUzMzMMDExYcCAAej1eqpUqWLs0IQQosIplZmvJiYmtG3blrZt2zJ16lR1VXohRMWVkJDA6tWrqVmzprrYsa2trZGjEkKIiqvUbzeysLAgODiY4ODg0q5aCFFG/v77b6KiosjMzOTOnTt06NBBEi4hhHhMco+3EEKl1+vZvHkzf/75JwBubm4MGDBAEi4hhCgFknQJIYC85yauXLmSGzduAPDss8/SoUMHTEwe+xGtQgghkKRLCEHehPnvv/+epKQkbGxs6N+/P56ensYOSwghniqSdAkhMDU1JTg4mN9//53+/fvLcKIQQjwBknQJUUldv36d1NRUPDw8APD29sbLy0sWORZCiCdEki4hKhlFUfjzzz/ZtGkTWq2WUaNGodPpACThEkKIJ0iSLiGeMslpWSSmZJKarsfGyhx7WwvsrLUAZGRkEBUVxcmTJwFwdXWVB1ULIUQZkd+2QjxFbt5NZ86KIxw5fVPd5uvtzJvP+5KVmsCqVau4e/cuJiYmdO7cmTZt2kjvlhBClBFJuoR4SiSnZRVIuACOnL7B3IVrMUs9R25uLg4ODoSEhFCrVi0jRSqEEJWTJF1CPCUSUzILJFx5NNy+fRtnbS4NGzakd+/eWFpalnl8QghR2UnSJcRTIjlNf98WBcgbOryYUYvu7X1o3aq5JFxCCGEkstS0EE8JS63p//+fQg3tdZ6xjiEv8QIFE+o3bMzclUdJTssyWoxCCFGZSdIlxFNCo9HQzEPHM9YxuFpexd4sGQezRACaPeNMTo7CkdM3SUzJNHKkQghROcnwohBPiauXL2CT/AfmZunkKCZczKjF3Wx7mj3jTJ9nPUj5/z1cqen3D0MKIYQoC5J0CVHB5ebmsmvXLn799VcAzK3seTawGxZW9mjNTfjnwh02HYjDvZY9ADZW5sYMVwghKi1JuoSo4KKiojh69CgADRo15a9bVfl85Rl1f35P1yc/HMLX2xl7WwsjRSqEEJWbJF1CVHB+fn6cOXOGHj160LhxYzolpZOcqufGnTQ0wD8X7vDJD4do4O7I6Od91dXphRBClC1JuoSoYHJycrh06RJ16tQBoEaNGowZMwZz87xhQyedVd4/e0sSUzLR2Wjp2MLV4HFAQgghyp4kXUJUIHfu3GH16tVcvXqV4cOH4+LiAqAmXPeys9ZKkiWEEOWIJF1CVBAnT55k3bp1ZGZmYmlpSVpamrFDEkII8Qgk6RLCiJLTskhMySQ1XY+NlXmhQ4DZ2dls3ryZQ4cOAeDq6srAgQNxcHAwQsRCCCFKSpIuIYzk5t30Ag+o9vV25s3nfXF2sALg1q1brFq1iuvXrwPQrl07OnbsiKmpaaF1CiGEKL9kRXohjCA5LYs5y48UeED1kdM3mbPiiPqonrNnz3L9+nWsra158cUX6dy5syRcQghRQUlPlxBGcCcpgyNnbha678jpm9xJysDOWkubNm3IyMigZcuW2NnZlXGUQgghSpP0dAlhBClFPIrH0iQdT6tY7ialAnnPU+zYsaMkXEII8RSQpEsII7C2uL+TWaGq+W0a2pyhinki/5z4wyhxCSGEeHIk6RLCCMzNTGj2jDMAJuTgbnWBulbxmGgUcrVONG/pZ+QIhRBClDaZ0yWEEaSk6+nzrAfok8i5dQRLkywUBXLtnqFnt47kIA+lFkKIp430dAlhBDZW5sz7aSvmd/7A0iQLSytb2nbqyzMNfZn145/YWEnSJYQQTxvp6RLCCOxtLXB1dUV/7SIpOXbEJdVm79oLQN5aXfa2FkaOUAghRGmTni4hytCdO3eAvOcivjmoDSbV23A+vS45///vH19vZ0Y/7yvPTBRCiKeQ9HQJUQYURWHfvn3s2LGDgQMH0qhRI5wdrHh32LMPfAyQEEKIp4MkXUI8Yampqfz888+cP38egNjYWBo1agTk9XhJkiWEEJVDuRpevHDhApMnT6Zv3740bNiQXr16FVt+27ZteHt7F1ouOTmZiRMn0rp1a3x9fRk9ejQ3btwoUO7w4cOEhobStGlTOnbsyPz581EUxaCMoijMnz+fDh060LRpU0JDQzl69OhjXauoHGJjY5k3bx7nz5/HzMyM3r1707NnT2OHJYQQwgjKVdJ19uxZdu/eTZ06dfD09Cy2bEZGBtOnT6dq1aqF7h8zZgz79u1jypQpzJo1i9jYWEaMGEF2drZa5sKFCwwfPhxnZ2ciIiIYOnQos2fPZuHChQZ1LViwgNmzZzNs2DAiIiJwdnYmLCyM+Pj4x79o8VTKzc1l586dLFmyhJSUFJydnRkxYgTNmzdHo9EYOzwhhBBGUK6GF4OCgujcuTMA48eP56+//iqybEREBC4uLri6uhYod+TIEfbu3UtkZCQBAQEAuLu7ExwczJYtWwgODgYgMjKSKlWq8Nlnn6HVavH39ychIYF58+YxePBgtFotmZmZREREEBYWxrBhwwBo0aIF3bt3JzIykilTppR+Q4gK7+LFi+zZswcAX19fevTogbm5LAMhhBCVWbnq6TIxebhwLl68yKJFi5g0aVKh+/fs2YNOp6Ndu3bqNg8PDxo0aKB+EOaX69SpE1rt/+bUBAcHk5SUxJEjR4C84ceUlBR69OihltFqtXTp0sWgLiHuVbduXQICAujfvz99+vSRhEsIIUT56ul6WP/973/p27cv9evXL3R/TEwM7u7uBYZxPDw8iImJASAtLY2rV6/i4eFRoIxGoyEmJgY/Pz+1/P3lPD09Wbx4MRkZGVhaWpboOhRFIS0trUTHGkN6errBV/E/OTk5/Prrr+h0OrV9/P39ASrU9/hJkvdP8aR9iiZtUzxpn+KVdvsoilLiaSIVLunasWMHR44cYdOmTUWWSUpKws7OrsB2e3t7dSgyOTkZAJ1OZ1BGq9ViZWVFYmKiWpdWq8XCwnCxSp1Oh6IoJCYmljjp0uv1nDp1qkTHGlNcXJyxQzAaExMT7Ks4o7W0IzNHISMzm9ysVPbs2MCtmzdxdHTE0tJS5m0VozK/fx6GtE/RpG2KJ+1TvNJsn3tHyB5FhUq6MjMzmT59Om+++SaOjo7GDuexmZubU69ePWOH8dDS09OJi4ujbt26WFlZGTsco0jNULiWkM7CtX9z7OxNHMzuUtcqHjNNDlqtBR4eHri7u1fa9imOvH+KJ+1TNGmb4kn7FK+02+fcuXMlPrZCJV2LFy/GxMSEnj17kpSUBOT1FuXm5pKUlISlpSVarRadTse1a9cKHJ+YmIi9vT2A2hOW3+OVLysri/T0dLWcTqcjKyuLzMxMg96upKQkNBqNWq4kNBoN1tbWJT7eWKysrCpk3I8rOS2Lw2eu8OvRKxw/e53alleorr0FQEqONVb2zanf0KvSts/DkvYpnrRP0aRtiiftU7zSap/HGcmoUElXTEwMFy5cUOfK3KtVq1ZMmTKFQYMG4eHhwYEDBwqMu8bGxuLl5QWAtbU1NWvWVOds3VtGURR1Dlf+19jYWIM5ZDExMbi4uJR4aFFUPIkpmTjqLDl57jL1bWKxMc2bH3At05nLmTVRzqcw1FT+yhRCCFG4cnX34oOMGDGCJUuWGPwLCAigVq1aLFmyhKCgIAACAwNJTEzkwIED6rGxsbGcPHmSwMBAdVtgYCDbt29Hr9er26Kjo9HpdPj6+gLQvHlzbG1t2bhxo1pGr9ezZcsWg7rE0y81XU+WPpccxQwNCvpcU86meXApsxbK//9RSsvKMXKUQgghyqty1dOVnp7O7t27Abh8+TIpKSnqhPnWrVvj6elZYNHUn3/+mevXr+Pn56du8/X1JSAggIkTJzJu3DgsLCz4/PPP8fb2pmvXrmq54cOHExUVxdtvv82gQYM4c+YMkZGRjB07Vp0kZ2FhQXh4OHPmzMHR0REvLy+WLl3K3bt3GT58+JNuElFO6PV6rC3N0JqbkIsJ59PdyVU06BXDyZTWWlMjRSiEEKK8K1dJ1+3bt3nrrbcMtuW/XrJkiUFi9SBffPEFM2bMYPLkyWRnZxMQEMCkSZMwM/vfJdepU4fIyEhmzpzJyJEjcXR0ZPTo0YSFhRnUNWLECBRFYeHChSQkJNCgQQMiIyOpXbv2Y1ytqChu3LjBqlWr8KrfkBzrujR7xpljZ28WKOfr7Qw56YDMqRBCCFFQuUq6XF1dOX369CMdM3PmzEK329nZMX36dKZPn17s8c2bN2fFihXFltFoNISHhxMeHv5IsYmKTVEUjh49SnR0NNnZ2WRmHiH0JV9cqtoCGCRevt7OvBHSjMsXzlCzupOxQhZCCFGOlaukS4jyIjMzkw0bNnDixAkgbzHc/v37Y2Njg51NFq+HNCU9M4eMrGxsrcyporPElGxyc3ONHLkQQojySpIuIe5z9epVVq1aRUJCAhqNhqCgINq1a6feCWtnrcXOuuDCeGlp2QW2CSGEEPkk6RLiHhkZGSxevJjMzEx0Oh0DBw7Ezc3N2GEJIYR4CkjSJcQ9LC0t6dSpE+fPn6dv376yurMQQohSI0mXqPQuXbqEqakpNWvWBKBly5a0bNlSnp8ohBCiVFWoxVGFKE2KorB//34WLVrEypUrycjIAPLuVpWESwghRGmTni5RKaWlpbF27VrOnj0LgIuLiyRaQgghnihJukSlc+HCBVavXk1ycjJmZmZ0796d5s2bS9IlhBDiiZKkS1QaiqKwZ88edu/ejaIoVK1alZCQEKpXr27s0IQQQlQCknSJSuXy5csoioKPjw89evRQn7EphBBCPGmSdImnnqIo6uT4fv36cf78eZo0aWLssIQQQlQycveieGrl5uayfft21q1bp26ztraWhEsIIYRRSE+XeColJiayevVq4uPjAWjRogWurq5GjkoIIURlJkmXeOqcPn2atWvXkpGRgYWFBb1795aESwghhNFJ0iWeGjk5OWzdupXffvsNyFt7KyQkhCpVqhg5MiGEEEKSLvEUWb58ubrYaZs2bejcuTOmpqZGjkoIIYTII0mXeGr4+flx+fJl+vbti5eXl7HDEUIIIQxI0iUqLL1ez40bN6hVqxYAnp6evPXWW7L2lhBCiHJJlowQFdLNmzf59ttv+f7777lz5466XRIuIYQQ5ZX0dIkK5+jRo0RHR6PX67GxsSElJUUmywshhCj3JOkSFUZWVhYbNmzg+PHjALi7uzNgwABsbW2NHJkQQgjxYJJ0iXIpOS2LxJRMUtP12FiZk5V2l+j1v3D79m00Gg0dOnQgICAAExMZIRdCCFExSNIlyp2bd9OZs+IIR07fVLc1r5mASept7OzsGDhwIHXq1DFihEIIIcSjk6RLlCvJaVksXHeCnu08GBLckLSMbGwszbiRkMr27dt5aXAfqlV1MHaYQgghxCOTpEuUK8mpmbzQtT7frtyHWcLvpOVYcTLVi2bPVGPEoH5kKxpjhyiEEEKUiEyIEeWKokDkjxswuf07ANam6YCGY2dvsmDtX4AkXUIIISom6ekS5UZaWhqbNvyMaUosaCBBb8+F9Nrq/mNnb5KpzzFihEIIIUTJSdIlyoWLFy+yevVqkpKSyFU0xGfU4qbeift7ttIyso0ToBBCCPGYJOkSRnfkyBGioqJQFAWdfRUOXK5Geq5VoWVtrOQtK4QQomKSOV3C6FxdXTE1NaVp06a88NJQvDzdCi3X7Bln7GzkMT9CCCEqJkm6hFEkJiaq/3d2dubVV1+lf//+1KxqzxvPNaPZM84G5Zs948wbzzXDSVd4D5gQQghR3slYjShTubm57Nq1i3379jF06FDc3PJ6tRwdHdUyNZxsGPsvX5JTs0hNz8bGygw7G60kXEIIISo0SbpEmUlKSmL16tVcvHgRgPPnz6tJ1/2cdFaSZAkhhHiqSNIlysSZM2dYu3Yt6enpaLVaevfuTePGjY0dlhBCCFFmJOkST1ROTg7btm3j4MGDANSsWZOQkBCD4UQhhBCiMpCkSzxRp06dUhMuPz8/OnfujJmZvO2EEEJUPvLpJ56oRo0aERMTg7e3N97e3sYORwghhDAaWTJClKrs7Gx27NhBRkYGABqNhj59+kjCJYQQotKTni5Ram7dusWqVau4fv06CQkJhISEGDskIYQQotyQpEuUimPHjrFhwwb0ej3W1tb4+PgYOyQhhBCiXClXw4sXLlxg8uTJ9O3bl4YNG9KrVy+D/SkpKcyZM4eQkBBatmxJ27ZtGTVqFKdPny5QV3JyMhMnTqR169b4+voyevRobty4UaDc4cOHCQ0NpWnTpnTs2JH58+ejKIpBGUVRmD9/Ph06dKBp06aEhoZy9OjRUr32iiorK4tffvmFtWvXotfrcXd3Z9SoUdSrV8/YoQkhhBDlSrlKus6ePcvu3bupU6cOnp6eBfZfuXKF5cuX065dO7744gv+85//kJycTGhoKOfPnzcoO2bMGPbt28eUKVOYNWsWsbGxjBgxguzsbLXMhQsXGD58OM7OzkRERDB06FBmz57NwoULDepasGABs2fPZtiwYURERODs7ExYWBjx8fFPpiEqiNu3b7NgwQKOHj2KRqOhQ4cOvPTSS9jZ2Rk7NCGEEKLcKVfDi0FBQXTu3BmA8ePH89dffxnsd3V1ZevWrVhZ/W+l8jZt2hAUFMRPP/3E+++/D8CRI0fYu3cvkZGRBAQEAODu7k5wcDBbtmwhODgYgMjISKpUqcJnn32GVqvF39+fhIQE5s2bx+DBg9FqtWRmZhIREUFYWBjDhg0DoEWLFnTv3p3IyEimTJnyhFul/LKysiIzMxM7OzsGDBhA3bp1jR2SEEIIUW6Vq54uE5Piw7G2tjZIuABsbGxwc3MzGDrcs2cPOp2Odu3aqds8PDxo0KABe/bsMSjXqVMntFqtui04OJikpCSOHDkC5A0/pqSk0KNHD7WMVqulS5cuBnVVFjk5Oer/ra2tGTRoEOHh4ZJwCSGEEA9QrpKukkhKSuLs2bN4eHio22JiYnB3d0ej0RiU9fDwICYmBoC0tDSuXr1qcFx+GY1Go5bL/3p/OU9PT65cuaIujVAZXLt2jd27d/P333+r22rWrImNjY0RoxJCCCEqhnI1vFgSn3zyCRqNhkGDBqnbkpKSCp1XZG9vrw5ZJicnA6DT6QzKaLVarKysSExMVOvSarVYWFgYlNPpdCiKQmJiIpaWliWKXVEU0tLSSnRsWVIUhcOHD7Nr1y5yc3M5ePAgDRo0eGDPZGWTnp5u8FUYkvYpnrRP0aRtiiftU7zSbh9FUQp06jysCp10rV69mhUrVjBz5kxq1Khh7HAemV6v59SpU8YOo1hZWVkcO3aM69evA1CjRg2aNm1a6B2jIk9cXJyxQyjXpH2KJ+1TNGmb4kn7FK802+feaUmPosImXbt372by5Mm89tpr9O/f32CfTqfj2rVrBY5JTEzE3t4eQO0Jy+/xypeVlUV6erpaTqfTkZWVRWZmpkFvV1JSEhqNRi1XEubm5uV6aYVLly6xfv16kpOTMTU1pV27dtjZ2eHu7l5gbp3I+ysqLi6OunXrSvsUQtqneNI+RZO2KZ60T/FKu33OnTtX4mMrZNJ19OhR3nrrLfr168dbb71VYL+HhwcHDhwo0AUYGxuLl5cXkDcJvGbNmuqcrXvLKIqizuHK/xobG0v9+vXVcjExMbi4uJR4aBHyHpFjbW1d4uOfpMTERJYvX05ubi6Ojo6EhIRgb2/PqVOnsLKyKrdxlwfSPsWT9imetE/RpG2KV1j7rFmzhunTp3Po0CEjRVV+lNb7p6RDi1ABJ9KfO3eO8PBw2rRpw9SpUwstExgYSGJiIgcOHFC3xcbGcvLkSQIDAw3Kbd++Hb1er26Ljo5Gp9Ph6+sLQPPmzbG1tWXjxo1qGb1ez5YtWwzqetrY29vj7+9PkyZNGDlyJDVr1jR2SEII8dDGjx+Pt7c33t7eNGrUiKCgID7++GMyMzONHVqF8Ntvv9G/f38aN25Mly5dWLNmzQOPiY6Opm/fvjRr1oyOHTvy7bffFijz448/0qNHD5o2bUq3bt1Yu3atwX69Xs/cuXPp3LkzTZo0oU+fPgVWCggKClK/t/f+KyonKE/KVU9Xeno6u3fvBuDy5cukpKSwadMmAFq3bo2iKAwfPhwLCwuGDh1qsI6Xra2tOlTn6+tLQEAAEydOZNy4cVhYWPD555/j7e1N165d1WOGDx9OVFQUb7/9NoMGDeLMmTNERkYyduxYdbzWwsKC8PBw5syZg6OjI15eXixdupS7d+8yfPjwsmqaMhEbG4uDgwNVqlQBoFOnTsDjZfVCCGEszz77LDNmzCA7O5u///6bcePGodFoePfdd40d2iPJyclBo9GU2c1L8fHxhIeH88ILLzBr1iwOHDjApEmTcHZ25tlnny30mN27d/Puu+8yadIkAgICOH/+PJMmTcLS0pKXXnoJgJ9++olPP/2UadOm0aRJE44fP86kSZPQ6XQEBQUB8MUXX7Bu3TqmTZuGh4cHv/76K2+88QbLli2jYcOGAKxatcpg+aKzZ8/y8ssv07179yfcMo+vXCVdt2/fLjBcmP96yZIlAOpcrfyFSvO1bt2a77//Xn39xRdfMGPGDCZPnkx2djYBAQFMmjQJM7P/XXKdOnWIjIxk5syZjBw5EkdHR0aPHk1YWJhB3SNGjEBRFBYuXEhCQgINGjQgMjKS2rVrl9q1G1Nubi67d+9mz5491KpVi5dffhlTU1NJtoQQFZpWq8XZ2RnIW96mbdu27N+/v9hjNm3axFdffcWFCxewsrKiQYMGfP3111hbW5OTk8PHH3/M6tWrMTU1ZeDAgdy+fZvk5GS+/vprIK8XZsiQIQafUX379qVz5868+eabACxatIg1a9YQHx+Pvb09HTt25N1331WX38kfEvzoo4/49NNPiYuLY8uWLVSrVo3PP/9cnWv7zDPP8M4779CkSRP1XGvWrGH27NncuXOHgIAAWrRo8cjttmzZMlxdXRk/fjyQt0TSn3/+yXfffVdk0rVu3To6deqkriRQu3ZtwsPDWbBgAS+++CIajYZ169YRGhqqLlBeu3ZtTpw4wYIFC9Sk65dffuHVV1+lffv2APzrX//iwIEDLFy4kFmzZgHg6OhocO758+fj5uZG69atH/lay1q5SrpcXV0feFfcw941Z2dnx/Tp05k+fXqx5Zo3b86KFSuKLaPRaAgPDyc8PPyhzl2RJCUlsWbNGi5cuABAtWrVyM3NxdTU1MiRCSFE6Tlz5gxHjhzBxcWlyDI3btzg7bff5t1336Vz586kpqZy6NAh9Xm8Cxcu5Oeff2b69Ol4enqycOFCtm7dSps2bR4pFo1Gw3vvvYerqyvx8fFMnTqVTz75xOAJJxkZGSxYsIBp06bh4OCAk5MTH374IefOnePzzz+nWrVqbN26lVdeeUX9DDtx4gTvvfce//d//0fnzp359ddfmTNnjsG5L126RKdOnViyZAl+fn6Fxnf06FH8/f0NtgUEBBT7eZqVlVVgjrOlpSXXrl3j8uXLuLq6kpWVVWD5JQsLC06cOIFer8fc3By9Xl/gzkALCwsOHz5c5HnXrVvHyy+/XCE6CspV0iXK1tmzZ1m7di1paWlotVp69epl8BeTEEJUZLt27cLX15fs7GyysrIwMTFRHxdXmJs3b5KdnU2XLl2oVasWAN7e3ur+xYsXM3LkSHWaytSpU9m7d+8jx3VvL5irqytjxozhgw8+MEi69Ho9U6ZMUW/gunLlCmvWrGHnzp1Ur14dyJsi8+uvv7Ju3To6d+7MTz/9xLPPPsuIESOAvMffHTlyhF9//VWt19zc/IF3oN+6dYuqVasabKtatSopKSlkZGQUegNZQEAAM2bM4MCBA/j5+XHhwgX1OcY3b97E1dWVgIAAVq1aRefOnWnUqBF//fUXq1atQq/Xc+fOHapVq0ZAQADfffcdrVq1ws3NjQMHDrB161aD4cR7bdu2jeTk5AKrGJRXknRVQjk5OezYsUPtZq9RowYhISE4OTkZOTIhhCg9fn5+TJkyhfT0dL777jtMTU3p1q0bAIcOHVKTE8hLoHr27Im/vz+9e/cmICCAgIAAunXrhr29PcnJydy8eZNmzZqpx5iZmdG4cWO1J+xh7d+/n4iICGJiYkhJSSEnJ4fMzEzS09PVZMjc3Nwg4Ttz5gw5OTkF5i1lZWWpSyDFxsYazFsG8PHxMUi6qlevrs6VLk3PP/88Fy9eJDw8nOzsbGxtbRkyZAhz5sxR56K99tpr3Lx5k9DQUBRFwcnJiX79+vHtt9+qZd577z0mTZpEjx490Gg01K5dmwEDBrB69epCz7t69WoCAwPVRLS8k6SrElIUhdjYWCBvLlyXLl0M5roJIcTTwMrKijp16gAwffp0+vbty8qVK3nuuedo3LixwZ1zTk5OmJqasmjRIg4fPsy+ffv4/vvv+fzzz1mxYgUODg4Pdc7Chriys7PV/1+6dInw8HAGDRrE2LFjsbe3588//+S9995Dr9erSZelpaVBXWlpaZiamqrzye4/582bNx+2WR6oatWq3Lp1y2DbrVu3sLW1LXKZpPwbFP7v//6PW7duUaVKFXUFgfz5z5aWlsyYMYMPP/yQ27dv4+zszPLly7GxsVHnaTk6OvL111+TmZnJ3bt3qVatGrNmzSp0DvXly5fZv39/gSHU8qzCLRkhSi7/rzEzMzNCQkJ4/vnn6dGjhyRcQoinnomJCeHh4Xz55ZfqEFmdOnXUf7a2tkBe8tCiRQtGjx7N2rVrMTc3Z9u2bdjZ2eHs7MyxY8fUOvPviryXo6MjN27cUF+npKRw6dIl9fXff/+NoiiMHz8eHx8f3N3dDcoXpUGDBuTk5JCQkGAQd506ddShQHd3d44fP25w3L3xPiwfHx8OHjxosG3//v34+Pg88FhTU1OqV6+OVqtlw4YN+Pr6Fpj4bm5uTo0aNTA1NSU6OpqOHTsWuDPTwsKC6tWrk52dzZYtW9S76e+1Zs0anJyc6NChwyNfo7FI0lUJZGdnEx0dza5du9Rtjo6ONGjQwHhBCSFEGevevTsmJib8+OOPhe4/duwY8+bN48SJE1y5coUtW7aQkJCgLpI9ZMgQFixYwLZt2zh//jxTp04lKSnJoI42bdqwbt06Dh06xOnTpxk3bpxBQlGnTh30ej3ff/898fHxrF27lmXLlj0wdnd3d3r37s2///1vtmzZQnx8PMePHyciIkIdPhw0aBC//vorkZGRxMXF8cMPPxgMLQJcv36d7t27F0jO7vXCCy8QHx/Pxx9/zPnz5/nxxx/ZuHGjwVy0H374gaFDh6qvExISWLp0KefPn+fUqVNMmzaNTZs2MXHiRLVMbGwsv/zyC3FxcRw/fpyxY8dy9uxZxo4da/A9yL++Q4cO8corr5Cbm8srr7xiEGNubi5r1qyhX79+FarjoOJEKh7K7aR0klOzSE3PxsbKjOysFLZvWs+1a9fQaDQ0a9aswF8dQghRGZiZmfHSSy/x7bffMmjQoAKrk9va2vLHH3+wePFiUlJScHFxYfz48eryBWFhYdy8eVNNpAYOHEiXLl0MHicXHh6uDiHa2dnx1ltvGfR01a9fnwkTJrBgwQI+++wzWrZsyf/93/8xbty4B8Y/Y8YMvvnmG2bOnMmNGzdwcHDAx8eHNm3akJ2dTdOmTfnPf/7DnDlzmD17Nv7+/rz66qvqchaQN0E/Nja22Ic/165dm4iICGbMmMGSJUuoUaMG06ZNM1gu4s6dO8THxxsct3btWj7++GMURcHHx4fvv/+epk2bqvtzc3NZtGgRsbGxmJmZ4efnx9KlS3F1dVXLZGZm8sUXXxAfH4+1tTXt27fn448/RqfTGZxr//79XLlyhYEDBz6w3coTjfKoMwBFqThx4sT/a+/Oo6K40jaAP43SUZRGcQ0un+IRRHYElEUQyEhUxGViGAU1MGEwkzEJTk5kMoCjMTOaQY1h4h5cxoWJy5wooHFJFEOjx1FMjHqigvsuGLpZpFnu94fTNRTNZsRGm+d3Dgf71ltVt94qL29XVVcDQIt+WvBOYSk+3/E9Tl94fG3fuv1DDOx0AwpRDQsLC0ycOBGDBw/+xcsvKyvD+fPn4eDgwK/iqAfz0zjmp3HMT8Oe59wkJCRAo9HIChtje57z8zxo6fw8zd9vnukyEYWacqz4b8Flhhr063ADPZRFgACEsitej/wN/s+mZ2t3k4iIqM3iPV0mQltaibwL9wEI2He6hB7KIggB3KrohZMP+kMofvkXcxMREdHT45kuE1Farv/SbgXu6bqhz0s6XC7/P2irLetMJyKilrJo0aLW7gK9QFh0mYiOL/3vuS2Fldb4ubILqtGu3ulERERkfLy8aCI6KNvDdXCP/75SyAou18E90EHJ+pqIiKg1segyEZadlIh4xa5W4fWY6+AeiHjFDpadlA3MSURERMbA0x8mwtJCid7dO2Gkmw0mBNhCV1kDpbkZijSP8HL3TrC0YNFFRETUmlh0mZAeXTrC18UGxSUVKC2vRKeO5hgywJoFFxER0XOARZeJsbRQssgiIiJ6DvGeLiIiIiIjYNFFREREZAQsuoiIiIiMgEUXERERkRGw6CIiIiIyAhZdREREREbAoouIiIjICFh0ERERERkBiy4iIiIiI2DRRURERGQECiGEaO1OtEWnTp2CEAJK5YvzlT1CCFRWVsLc3BwKhaK1u/PcYX4ax/w0jvlpGHPTOOancS2dH51OB4VCAQ8Pjyeel9+92EpexP8YCoXihSoSjY35aRzz0zjmp2HMTeOYn8a1dH4UCsUv/hvOM11ERERERsB7uoiIiIiMgEUXERERkRGw6CIiIiIyAhZdREREREbAoouIiIjICFh0ERERERkBiy4iIiIiI2DRRURERGQELLqIiIiIjIBFFxEREZERsOgiIiIiMgIWXURERERGwKLLRF29ehXJycmYMGEChg4dirCwMNn0kpISpKam4rXXXoOnpyd8fX0xa9Ys/PTTTwbL0mq1+PDDD+Ht7Q13d3e88847uHfvnkHcqVOnEBERARcXFwQFBWHNmjWo+33qQgisWbMGo0aNgouLCyIiInD69OkW3fbmaCo/dR08eBD29vb1xplafpqbG41Gg4ULF8Lf3x/Ozs545ZVXkJaWJovR6XRYvHgx/Pz84ObmhujoaBQUFBgsKz8/H9HR0XBzc4Ofnx8++eQT6HQ6g7jt27cjNDQUzs7OCA8Px7ffftsyG/0EmpOf8vJyLFmyBCEhIXB1dUVoaChWrVqFqqoqWZypHTsAsHfvXrz11lsICAiAm5sbJkyYgB07dhj0tzn70tTy01Ru2vq43NxjR++FHJcFmaQDBw6IgIAAMXv2bBEWFibGjRsnm/7TTz8JPz8/sXTpUnH06FFx8OBBMW3aNOHq6iouXboki42JiREBAQEiMzNTHDx4UISFhYnw8HBRWVkpxVy5ckW4ubmJt99+W6jVarF+/Xrh6Ogo1q1bJ1vW6tWrhaOjo1i/fr1Qq9Xi7bffFu7u7uLatWvPLhn1aCo/tZWXl4ugoCDh6+tbb5yp5ac5uSktLRXh4eFi0qRJIjMzUxw7dkykp6cbbE9SUpIYNmyY2L59u8jOzhbTpk0TI0eOFBqNRor5+eefhZ+fn4iMjBTZ2dli+/btYtiwYWL+/PmyZWVkZAh7e3uxbNkykZubK5KSksTQoUNFXl7eM8lDQ5qTn4SEBOHh4SE2b94scnNzxcqVK4WDg4NYunSpLM7Ujh0hhHj99ddFfHy8yMzMFGq1WqSkpIghQ4aI1NRUKaa5+9LU8tNUbtr6uNycY0fvRR2XWXSZqOrqaunfc+fONTgoS0tLRVlZmaytpKREeHt7iwULFkhtp06dEnZ2duLo0aNSW35+vrC3txeZmZlSW1JSkggKChIVFRVS25IlS4Snp6fU9ujRI+Hh4SGWLFkixVRUVIigoCAxb968p9vgJ9RUfmr79NNPRWRkZL1xppif5uRm2bJlIiQkRJSWlja4nNu3bwsHBweRnp4utT18+FC4ubmJNWvWSG2rVq0Sbm5u4uHDh1Jbenq6cHBwEHfu3JHaRo8eLebMmSNbR0REhHjzzTefaPueVlP5qa6uFq6uruKzzz6TtX/wwQciJCREem2Kx44QQhQWFhq0JSYmCg8PDyl3zdmXppifpnLT1sfl5hw7ei/quMzLiybKzKzxXWthYYGOHTvK2jp16oT+/fvLTsFmZ2dDpVLBz89ParO1tYWDgwOys7NlcSEhIVAqlVLb2LFjodFokJeXB+DxadySkhKMGTNGilEqlfjVr34lW5YxNJUfvWvXrmH9+vVITEysd7op5qc5udmxYwd+/etfw8LCosGY7777DjU1NXj11Velti5dusDPz88gNz4+PujSpYvUNmbMGNTU1CAnJwcAcP36dVy5ckWWG+BxDnNzc+u9FPmsNJUfIQSqqqpgaWkpa7e0tJRdtjDFYwcArK2tDdocHBxQUlKCsrKyZu9LU8xPU7lp6+NyU/nRe5HHZRZdJNFoNLh48SJsbW2ltoKCAgwcOBAKhUIWa2trK92bU1ZWhtu3b8vm08coFAopTv+7btygQYNw69YtPHr0qMW36Wl9/PHHmDBhAoYMGVLv9LaYnxs3buD+/fvo2rUrZs2aBScnJ3h7eyMxMRGlpaVSXEFBAbp16wYrKyvZ/IMGDZLd11VQUGCwzSqVCj169DDIzcCBAw2WVVlZievXr7foNj6Ndu3aYfLkydi8eTN++OEHlJaWQq1W46uvvkJUVJQU15aOnZMnT6JXr17o3Llzs/dlW8lP7dzUp62Py/Xl50Uel1l0keTvf/87FAoFpk6dKrVpNBqDd+wAYGVlheLiYgCPb1gEHv+hrE2pVKJjx45SnEajgVKpxEsvvSSLU6lUEEJIcc+Lb775Bnl5eXj33XcbjGmL+Xnw4AEAYPHixbCyssLatWsRHx+Pffv2ISkpSYprKDcqlUq2LRqNxiA3gDyH+t914/Svn5fc6M2bNw8jRozAlClT4OHhgejoaEydOhXR0dFSTFs5dv7zn/8gKysLMTExAJq/L9tCfurmpj5teVyuLz8v+rjc/omiyWTt3LkTX375JRYtWoTevXu3dndaXUVFBf76179i9uzZ9Z7ybstqamoAPD5TsXjxYgCAj48P2rdvj8TERMTHx6Nfv36t2cVWl5KSgsOHD2PhwoUYMGAATp8+jc8//xwqlQpvvvlma3fPaO7cuYP4+HgMHz4cM2bMaO3uPFeak5u2PC7Xlx9TGJd5potw5MgRJCcn4/e//z0mTZokm6ZSqVBSUmIwT3FxsXTZSP+OQv/OQU+n06G8vFyKU6lU0Ol0qKiokMVpNBooFAqDy1CtaePGjTAzM8O4ceOg0Wig0WhQWVmJmpoaaDQa6b6TtpgffT+GDx8uax8xYgQA4OLFiwAazo1Go5Fti0qlMsgNIM+h/nfdOI1GI5v+PLhw4QLS0tKwYMECTJkyBV5eXoiNjUVcXByWL18u5cTUjx2NRoPY2Fh06dIFqamp0r1wzd2XppyfhnJTW1selxvKjymMyyy62rjTp0/j3XffxcSJE+s9XWtra4vLly8bPLfk8uXL0jVuCwsLvPzyywbPX9LPp4/T/758+bIsrqCgADY2NujQoUOLbdfTKigowNWrV+Hj4wMvLy94eXkhIyMD+fn58PLyws6dOwG0zfz069dPduNpXfrBydbWFg8ePDA4/V73Hq7a91noabVa3L9/3yA3deMKCgpgbm7+XJ1Zu3TpEoDHNwDXNnToUOh0Oty9exeAaR87jx49QlxcHLRaLdatWye71NPcfWmq+WksN3pteVxuLD+mMC6z6GrDLl26hLi4OIwYMQLz58+vNyYgIADFxcXIzc2V2i5fvoxz584hICBAFnfo0CFUVlZKbVlZWVCpVHB3dwcAeHh4oHPnzti7d68UU1lZif3798uW9TyIjY3Fpk2bZD/+/v7o06cPNm3ahODgYABtMz9KpRJ+fn6ybQYAtVoNAHB0dAQA+Pv7w8zMDPv375diiouL8d133xnkRq1WS2c6AGDfvn0wMzOTPn3Ur18/DBgwAPv27ZOtMysrCz4+Po0WgcbWp08fAMDZs2dl7T/++CMUCgVsbGwAmO6xU1VVhffeew8FBQVYt24devXqJZve3H1pivlpKjdA2x6Xm8qPSYzLT/yQCXohlJWVib1794q9e/eKqKgoERgYKL0uLCwUDx48EAEBAWLkyJFCrVaLvLw86efixYuyZcXExIjAwECRlZUlDh061OhD5mbPni3UarXYsGFDgw+Zc3JyEhs2bBBqtVrMnj27VR7C11R+6tPQM6tMLT/Nyc2ZM2eEo6OjmDNnjjh69KjYvHmzcHd3F3/84x9ly0pKShKenp5ix44d4ujRoyIqKqrBh6NGRUWJo0ePih07dghPT0+Dh6Pu2bNH2Nvbi+XLl4tjx46J5ORkMXToUHHq1Klnn5RamspPVVWVmDx5svD19RXp6elCrVaLVatWCRcXF/Hhhx/KlmVqx44Qj5+rZGdnJ9LS0mTjSl5envTso+buS1PLT1O5aevjcnOOnbpetHFZIUQDz9enF9qNGzcQEhJS77RNmzYBQIM3b3p7e+Of//yn9Fqr1eJvf/sbDhw4gKqqKvj7+yMxMdHgXcipU6ewaNEinD9/HtbW1oiMjERsbKzsY7viv1+nsHXrVhQVFcHBwQF/+tOfpHcVxtJUfurerwQACQkJ+PHHH5GRkSFrN7X8NDc3ubm5SElJwYULF2BlZYXx48cjPj5edtZJp9Nh2bJl+Oqrr1BaWgoPDw8kJiZi0KBBsuXm5+fjo48+Ql5eHjp16oQJEyYYLAt4/NUxa9euxa1btzBw4EDMmTMHQUFBLZyBxjUnP/fv38fy5cuhVqtRWFiI3r17IywsDLGxsbLLEaZ27ABAcHAwbt68We+0Q4cOoW/fvgCaty9NLT9N5ebmzZttelxu7rFT24s2LrPoIiIiIjIC3tNFREREZAQsuoiIiIiMgEUXERERkRGw6CIiIiIyAhZdREREREbAoouIiIjICFh0ERERERkBiy4iIiIiI2DRRUQmIzg4GAkJCdLr48ePw97eHsePH2/FXsnV7aOxTJ8+HdOnTzf6eonof1h0EVGL2LVrF+zt7aUfZ2dnhIaGYsGCBXjw4EFrd++JHDlyBKmpqa2y7v3798Pe3h7bt29vMCYnJwf29vbSV3oR0YuhfWt3gIhMyzvvvIO+fftCp9Ph5MmT2LZtG44cOYKMjAx07NjRqH3x8vLCDz/8AHNz8yea78iRI9iyZQtmz579jHrWsFGjRsHS0hJ79uzBlClT6o3JyMhAu3btMG7cOCP3joieBosuImpRAQEBcHZ2BgBMmTIFXbp0wfr163Ho0CGEhYXVO09ZWRksLCxavC9mZmZ46aWXWny5z5JSqURoaCh27dqFu3fvGnxBb0VFBQ4cOABfX19069atlXpJRL8ELy8S0TM1YsQIAMCNGzcAAAkJCXB3d8e1a9cQGxsLd3d3vP/++wCAmpoabNiwAePGjYOzszN8fX2RnJyM4uJi2TKFEFixYgUCAgLg6uqK6dOn4+LFiwbrbuieru+//x6xsbHw8vKCm5sbxo8fj40bN0r927JlCwDILpfqtXQf6xMeHo6amhpkZWUZTDt8+DC0Wi3Gjx8PANi5cydmzJgBHx8fODk5YezYsdi6dWuT69BfDtbvF73Gcvbb3/4Ww4YNg6urK6KionDy5ElZTElJCT7++GMEBwfDyckJPj4+iI6OxtmzZ5u13USmjme6iOiZunbtGgCgS5cuUltVVZX0B3zu3Lno0KEDACA5ORn//ve/MXnyZEyfPh03btzAli1bcO7cOWzbtk26TLh8+XKsXLkSgYGBCAwMxNmzZxETE4PKysom+5OTk4O4uDj07NkTM2bMQPfu3ZGfn4/Dhw9j5syZiIiIwL1795CTk4NPPvnEYH5j9NHLywu9e/fGnj17EB0dLZumv0z7yiuvAAC2bduGwYMHIzg4GO3bt8e3336L+fPnQwiByMjIJtfVHLm5uYiNjYWTkxP+8Ic/QKFQYNeuXZg5cya2bt0KFxcXAMC8efPw9ddfIyoqCoMGDcLPP/+MkydPIj8/H46Oji3SF6IXmiAiagE7d+4UdnZ2Qq1Wi8LCQnH79m2RmZkpvL29hYuLi7hz544QQoi5c+cKOzs7kZKSIpv/xIkTws7OTuzevVvWnp2dLWsvLCwUjo6O4ne/+52oqamR4pYuXSrs7OzE3LlzpbZjx44JOzs7cezYMSGEEFVVVSI4OFgEBQWJ4uJi2XpqL2v+/PnCzs7OYBufRR8bsnjxYmFnZycKCgqkNq1WK5ydncWcOXOktvLycoN5Y2JiREhIiKwtKipKREVFSa/1++v69euyuLo5q6mpEaNHjxYxMTGybSkvLxfBwcEiOjpaahs2bJiYP39+k9tG1Fbx8iIRtag33ngDPj4+CAwMRHx8PDp16oR//OMfBvcmTZ06VfZ63759sLS0hJ+fH4qKiqQfR0dHWFhYSJe71Go1KisrERUVBYVCIc0/c+bMJvt27tw53LhxAzNmzIBKpZJNq72shhijj3rh4eEAHp/Z0vv6669RUVEhXVoEIJ0lBACtVouioiJ4e3vj+vXr0Gq1zV5fQ86fP48rV65g/PjxePjwobTNZWVl8PHxwYkTJ1BTUwMAUKlU+P7773H37t2nXi+RKeLlRSJqUcnJyRg4cCDatWuH7t27Y+DAgTAzk7+/a9++PXr37i1ru3r1KrRaLXx8fOpdbmFhIQDg1q1bAIABAwbIpltbW8PKyqrRvl2/fh0AYGdn1+ztMXYf9YYMGQI7OztkZGRIn6LMyMhA165d4e/vL8WdPHkSqampOH36NMrLy2XL0Gq1sLS0bNb6GnLlyhUAwNy5cxuM0Wq1sLKywvvvv4+EhASMGjUKjo6OCAwMxMSJE9GvX7+n6gORqWDRRUQtysXFRfr0YkOUSqVBIVZTU4Nu3bohJSWl3nmsra1brI+/lLH7OH78eCxZsgRnzpxB7969cfz4cURERKB9+8dD97Vr1/DGG2/A1tYWCQkJePnll2Fubo4jR45gw4YN0hmo+jR0Zq/uPEIIAMAHH3wABweHeufRf/J07Nix8PT0xIEDB5CTk4MvvvgCa9euRWpqKgIDA594+4lMDYsuInou9O/fH7m5ufDw8JBdMqvLxsYGwOMzMLXPoBQVFRl8grAuffyFCxfg6+vbYFxDBYkx+lhbWFgYli5dioyMDNjY2KC6ulp2afGbb76BTqfDypUrpXUCaNYT+PWXV+tegrx586bstb7/nTt3bjRnej179kRkZCQiIyNRWFiISZMmYdWqVSy6iMBHRhDRc2LMmDGorq7GihUrDKZVVVVBo9EAAHx9fWFubo7NmzdLZ2EASI98aIyjoyP69u2LTZs2ScvTq70s/UNc68YYo4+12djYwNPTE1lZWdi9ezf69u0LDw8PaXq7du0M+q7VarFz584ml92/f38AwIkTJ6S26upqfPnll7I4Jycn9O/fH2lpaSgtLTVYTlFRkTRv3QKuW7du6NmzJ3Q6XZP9IWoLeKaLiJ4L3t7eiIiIwOrVq3H+/Hn4+fnB3NwcV65cwb59+/DnP/8Zr776KqytrRETE4PVq1cjLi4OgYGBOHfuHLKzs9G1a9dG12FmZoa//OUveOuttzBx4kRMnjwZPXr0QEFBAS5duoQvvvgCAKTHGyxcuBD+/v7S09+N0ce6wsPDkZSUhHv37mHWrFmyafr1z5o1C7/5zW9QWlqK7du3o1u3brh//36jyx08eDDc3NywdOlSFBcXw8rKCllZWaiqqjLI2cKFCxEbG4uwsDBMnjwZvXr1wt27d3H8+HF07twZq1atQmlpKQIDAxEaGoohQ4bAwsICarUaZ86caZXvmiR6HrHoIqLnxoIFC+Dk5IT09HQsW7YM7dq1Q58+fRAeHi47w/Pee+9BqVQiPT0dx48fh4uLC9LS0hAXF9fkOkaOHImNGzfi888/R1paGoQQ6NevH15//XUpZvTo0Zg+fToyMzOxe/duCCGkr9wxRh9rCw0NxUcffQSdTid9olHP1tYWn332GT799FMsXrwY3bt3x9SpU2FtbY0PP/ywyWWnpKQgOTkZa9asgUqlwmuvvYbhw4cbPBts+PDh+Ne//oUVK1Zg8+bNKCsrQ48ePeDi4oKIiAgAjz9FOXXqVOTk5GD//v0QQqB///6YN28epk2b9kTbTGSqFKL2eWkiIiIieiZ4TxcRERGREbDoIiIiIjICFl1ERERERsCii4iIiMgIWHQRERERGQGLLiIiIiIjYNFFREREZAQsuoiIiIiMgEUXERERkRGw6CIiIiIyAhZdREREREbAoouIiIjICP4fQwOyW0wIBYAAAAAASUVORK5CYII=\n" - }, - "metadata": {} - } - ], - "id": "Cdwo5n9ZEcqt" - }, - { - "cell_type": "markdown", - "source": [ - "#### Second Cluster" - ], - "metadata": { - "id": "De41NQKgE5uu" - }, - "id": "De41NQKgE5uu" - }, - { - "cell_type": "code", - "source": [ - "second_cluster['train_scores']" - ], - "metadata": { - "id": "dWS9NJYDE5uw", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "913d9bc2-826f-4b9c-dc8b-6249e215561f" - }, - "execution_count": 451, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'MSE': 2814531.3808333334,\n", - " 'RMSE': 1677.6565145563418,\n", - " 'MAE': 1212.2208333333335,\n", - " 'R^2': 0.4219714904887132,\n", - " 'unexplained_variance': 0.5780285095112868,\n", - " 'lasso_coefs': Empty DataFrame\n", - " Columns: []\n", - " Index: []}" - ] - }, - "metadata": {}, - "execution_count": 451 - } - ], - "id": "dWS9NJYDE5uw" - }, - { - "cell_type": "code", - "source": [ - "second_cluster['test_scores']" - ], - "metadata": { - "id": "tbUITByiE5ux", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "60656314-5679-4117-90bb-c53e4027d7ff" - }, - "execution_count": 452, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'MSE': 2048936.3835294119,\n", - " 'RMSE': 1431.4106271540015,\n", - " 'MAE': 1211.8235294117646,\n", - " 'R^2': 0.6759470651519848,\n", - " 'unexplained_variance': 0.32405293484801523}" - ] - }, - "metadata": {}, - "execution_count": 452 - } - ], - "id": "tbUITByiE5ux" - }, - { - "cell_type": "code", - "source": [ - "second_cluster['values_table']" - ], - "metadata": { - "id": "wSZ1N88lE5uy", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 582 - }, - "outputId": "d3080435-d1cc-437b-95eb-2199f22ef306" - }, - "execution_count": 453, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " Actual Values Predicted Values\n", - "0 2422.0 3043.6\n", - "1 847.0 2193.8\n", - "2 4277.0 5280.8\n", - "3 3136.0 2399.6\n", - "4 1435.0 3712.8\n", - "5 5922.0 4608.8\n", - "6 9520.0 7030.8\n", - "7 1155.0 2658.6\n", - "8 2821.0 4312.0\n", - "9 5180.0 5107.2\n", - "10 6783.0 4300.8\n", - "11 1617.0 2195.2\n", - "12 7854.0 5877.2\n", - "13 2331.0 2447.2\n", - "14 3913.0 4932.2\n", - "15 546.0 1961.4\n", - "16 4620.0 4463.2" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Actual ValuesPredicted Values
02422.03043.6
1847.02193.8
24277.05280.8
33136.02399.6
41435.03712.8
55922.04608.8
69520.07030.8
71155.02658.6
82821.04312.0
95180.05107.2
106783.04300.8
111617.02195.2
127854.05877.2
132331.02447.2
143913.04932.2
15546.01961.4
164620.04463.2
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 453 - } - ], - "id": "wSZ1N88lE5uy" - }, - { - "cell_type": "code", - "source": [ - "# \n", - "plot_graph(df = second_cluster['values_table'], \n", - " graph_type='scatter_line', \n", - " label1='Actual Values',\n", - " label2='Predicted Values', \n", - " title='Actual Values vs. Predicted Values')\n", - "# \n", - "# " - ], - "metadata": { - "id": "0q3ns1r4E5uz", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 480 - }, - "outputId": "4a0b0ab8-90d5-4f24-8e04-2ac5960a9afa" - }, - "execution_count": 454, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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EtHmKTQDAwPk5ubCwMCgQPJUmuNqSyqVwtXVtcj9ryYxZmZmkEgkGD9+PDp37lygfe3atQEAdevWLbR206uTt19laWmJpKQkCIKgVQJVWFy5ublQqVQwMDAQk6OSxkVERNUHkycqVyYmJvDw8EBcXNxrky5XV1coFApERkaKQ2QKhQKnT59+7dyidu3aYf369di/fz9CQkIKbSOTyZCVlfXGuNRqdYG7eyWNi4iIqg8mT1TuPv30U4wYMQJTpkxBz549YW5ujkePHuH06dPo168ffH19ERAQAGdnZ3zyySeYNm0azMzM8N1338HU1PS1x27Xrh0CAwPx2Wef4d69e3B3d8eLFy9w8OBBLF++HADQtGlT7N69G+Hh4WjcuDFq164NW1vbAnGZmpoiISEB586dw9tvv12quIiIqPpg8kTlrnXr1vjpp58QGhqKmTNnIjs7G/Xr10fbtm3RuHFjAHnDfatXr8acOXMwe/ZsmJubY9iwYXj69CmOHj362uOHhoZi1apV+Pnnn7Fq1SpYW1ujffv24v533nkHly9fxldffYUXL17gX//6FxYtWlRoXHXr1oWfn1+ZxEVERNWDRBAEoaKDqE7yn8oqakgqMzMTd+7cgYODA4yMjEp8nsKGlKhslXUfl9XPvjpRKpWIjY1Fy5YtYWJiUtHhVEvsY91jH+teefTxm35/v4ylCoiIiIi0wOSJiIiISAtMnoiIiIi0wOSJiIiISAtMnioI5+nXPPyZExFVD0yeyplMJgOAIhfqpeor/2eefw0QEVHVxDpP5UxPTw+WlpZ48uQJgLzK1iVZX06tVotVslmqQDfKqo8FQYBSqcSTJ09gaWnJnxcRURXH5KkC1K9fHwDEBKokcnNzkZOTA319/QKLBlPZKOs+trS0FH/2RERUdTF5qgASiQQNGjRA3bp1kZ2dXaJjZGRkIC4uDvb29jA2Ni7jCAko2z6WyWS840REVE0weapAenp6Jf6FmpubCwAwNDRktWodYR8TEVFhON5DREREpAUmT0RERERaYPJEREREpAUmT0RERERaYPJEREREpAUmT0RERERaYPJEREREpAUmT0RERERaqHTJ09GjR9G/f394enrC398f//73v5GQkFCg3a5du9CtWze4urqiT58++OOPPwq0USgU+Oyzz+Dj4wNPT09Mnjy50CVRLly4gIEDB8LNzQ1BQUH47rvvIAiCTj4fERERVW2VKnmKiorCxIkT0axZM3z77bf47LPP8Pfff2P06NHIzMwU2+3btw+zZs1Cjx49sH79enh4eGDixIm4ePGixvGmTJmCU6dOYe7cufj6669x584djBs3Djk5OWKbu3fvYsyYMbCxscG6deswYsQIrFy5Ehs3biyvj01ERERVSKVanmXfvn1o2LAhFixYAIlEAgCwsrLCiBEjcPXqVXh5eQEAVq5ciZ49e2LKlCkAgLZt2+LmzZv49ttvsX79egBATEwM/vrrL2zYsAH+/v4AAAcHB4SEhODQoUMICQkBAGzYsAG1a9fG0qVLYWBgAD8/PyQnJ2Pt2rUYNmwYDAwMyrkXiIiIqDKrVHeecnJyUKtWLTFxAgAzMzMAEIfREhISEB8fjx49emi8NyQkBJGRkVCpVACAkydPwtzcHO3btxfbODo6omXLljh58qS47eTJk+jUqZNGkhQSEoLU1FTExMSU/YckIiKiKq1S3Xnq168ffv/9d2zbtg19+vTBixcvsHTpUrRq1QqtW7cGAMTFxQHIu4v0sqZNmyI7OxsJCQlo2rQp4uLi4ODgoJGIAXkJVP4xlEolHj58CEdHxwJtJBIJ4uLi4Ovrq/XnEAQBSqVS6/dpIyMjQ+O/VPbYx7rHPtY99rHusY91rzz6WBCEAjlDUSpV8uTl5YVVq1bh448/xpdffgkAaNmyJb7//nvo6ekBAFJSUgAA5ubmGu/Nf52/PzU1Vbxr9TILCwtcvXoVQN6E8sKOZWBgAGNjY/FY2srOzkZsbGyJ3qut+Pj4cjlPTcY+1j32se6xj3WPfax7uu7j4k7VqVTJ04ULF/Dpp59iwIAB6NixI168eIHVq1fjvffew08//QQjI6OKDrFYZDIZmjVrptNzZGRkID4+Hk2aNIGxsbFOz1VTsY91j32se+xj3WMf61559PGtW7eK3bZSJU/z589H27ZtMWPGDHGbh4cHOnbsiN9//x0DBw6EhYUFgLy7RjY2NmK71NRUABD3m5ub49GjRwXOkZKSIrbJvzOVfwcqn0qlQkZGhthOWxKJBCYmJiV6r7aMjY3L7Vw1FftY99jHusc+Lj6FUoWUtCykZ2SjlrEMFqaGMDN58x0J9rHu6bKPiztkB1Sy5On27dvo1KmTxrb69eujdu3auHfvHgCI85Pi4uI05irFxcVBJpPBzs5ObBcZGVlgDPPOnTtwcnICAJiYmKBBgwbiHKiX2wiCUGAuFBERVW9JLzIQujMGMTeSxG2echtMGuAJG0veVaI8leppu4YNG+L69esa2x48eIDnz5+jUaNGAAA7Ozs0adIEBw4c0GgXEREBPz8/cbwyICAAKSkpiIyMFNvcuXMH169fR0BAgLgtICAAR48eRXZ2tsaxzM3N4enpWeafkYiIKieFUlUgcQKAmBtJCN0ZA4VSVUGRUWVTqe48DRo0CAsWLMD8+fMRHByMFy9eYM2aNbC2ttYoTTBp0iRMmzYN9vb28PX1RUREBC5fvoytW7eKbfIrlH/22WeYPn06DA0NsWzZMsjlcnTt2lVsN2bMGISFheHjjz/G4MGDcfPmTWzYsAFTp05ljSciohokJS2rQOKUL+ZGElLSsoo1fEfVX6VKnoYPHw4DAwNs374du3fvRq1ateDh4YHly5ejdu3aYrtevXohIyMD69evx3fffQcHBwesWrWqwJ2i5cuXY+HChZg9ezZycnLg7++PL774Avr6//vYjRs3xoYNG7Bo0SK89957sLKywuTJkzF69Ohy+9xERFTx0jOyS7Wfao5KlTxJJBIMHjwYgwcPfmPb/v37o3///q9tY2ZmhgULFmDBggWvbde6dWvs3LlTq1iJiKh6qWUsK9V+qjkq1ZwnIiKiimJhaghPuU2h+zzlNrAwNSzniKiyYvJEREQEwMzEAJMGeBZIoDzlNpg8wJPznUhUqYbtiIiIKpKNpTE+GepVojpPVHMweSIiInqJmYkBkyV6LQ7bEREREWmByRMRERGRFpg8EREREWmByRMRERGRFpg8EREREWmByRMRERGRFpg8EREREWmByRMRERGRFpg8EREREWmByRMRERGRFpg8EREREWmByRMRERGRFpg8EREREWmByRMRERGRFpg8EREREWmByRMRERGRFpg8EREREWmByRMRERGRFpg8EREREWmByRMRERGRFpg8EREREWmByRMRERGRFpg8EREREWmByRMRERFVCWq1GikpKRUdBvQrOgAiIiKi10lLS8ONGzdw7NgxWFtbY/To0RUaD5MnIiIiqtQuXbqEf/75BwAglUqhVCphYmJSYfEweSIiIqJKQ6VS4cqVK7C2tkaTJk0AAO7u7rhx4wbatWsHd3d36OnpVWiMTJ6IiIio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K/7qrQIKW0olv85THUuWKyAiIipPTJ6qCDMTA43lU5RKJXJzcyswIiIiopqJw3ZEREREWmDyRERERKQFJk9EREREWmDyRERERKQFJk9EREREWmDyRERERKQFJk9EREREWmDyRERERKQFJk9EREREWmDyRERERKQFiSAIQkUHUZ1cuHABgiDAwMDgzY1LQRAEZGdnQyaTQSKR6PRcNRX7WPfYx7rHPtY99rHulUcfq1QqSCQStG7d+o1tubZdGSuvvzgSiUTnCVpNxz7WPfax7rGPdY99rHvl0ccSiaTYv8N554mIiIhIC5zzRERERKQFJk9EREREWmDyRERERKQFJk9EREREWmDyRERERKQFJk9EREREWmDyRERERKQFJk9EREREWmDyRERERKQFJk9EREREWmDyRERERKQFJk9EREREWmDyVAH279+P999/HwEBAfDw8MBbb72FX375Ba+u0bxr1y5069YNrq6u6NOnD/74448Cx1IoFPjss8/g4+MDT09PTJ48GU+ePCnQ7sKFCxg4cCDc3NwQFBSE7777rsD5qpMTJ05g6NChaNu2LVxcXNCpUycsXLgQCoVCo92xY8fQp08fuLq6olu3bti9e3eBY6lUKixevBjt27eHh4cHRo0ahbi4uALtbt++jVGjRsHDwwPt27fHkiVLoFKpdPYZK5v09HQEBARALpfjypUrGvt4LZfMnj17IJfLC/z5+uuvNdqxf0vv119/Rd++feHq6gpfX1+MHTsWmZmZ4n5+V5TcsGHDCr2O5XI59u3bJ7arUtexQOVuwIABwtSpU4V9+/YJp0+fFr7++muhRYsWQmhoqNgmPDxckMvlwrJly4TIyEhh1qxZQqtWrYSYmBiNY40ePVoICAgQ9u3bJxw5ckTo1auX0KdPHyE7O1tsEx8fL3h4eAgffvihcPr0aeGHH34QnJ2dhe+//768PnK5++2334TFixcLBw4cEM6cOSP8+OOPgo+PjzBq1CixTXR0tNCyZUth1qxZQmRkpLBs2TJBLpcL+/fv1zjWrFmzhDZt2gi7du0STp48Kbz77rtChw4dhNTUVLHNixcvhPbt2wtDhgwRTp48KezatUto06aNMG/evHL7zBVtyZIlQrt27QQnJyfh8uXL4nZeyyW3e/duwcnJSTh58qQQExMj/klMTBTbsH9Lb/Xq1YKnp6ewbt06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Cj3us2fPAACJiYkAgCZNmmjst7KygoWFxWtjS0hIAAA4OTkV+/OUd4z5WrRoAScnJ4SHh4tP/YWHh6N27drw9/cX250/fx6hoaG4ePEiMjIyNI6hUChgZmZWrPMVJT4+HgAwffr0ItsoFApYWFhg2rRpmDFjBjp27AhnZ2cEBgaib9++sLOzK1UMRFUVkyciKhY3NzfxabuiGBgYFEiocnNzYW1tja+//rrQ91hZWZVZjCVV3jH27t0b33zzDa5cuYL69esjKioKAwcOhL5+3lfyvXv3MHLkSDg6OmLGjBlo0KABZDIZTpw4gU2bNol3hApT1J22V98jCAIA4NNPP0XLli0LfU/+k5IhISHw8vLC4cOHcerUKWzYsAHr169HaGgoAgMDtf78RFUdkyci0il7e3tERkaidevWGkNRr2rYsCGAvDsiL9/RSE5OLvDE26vy29+8eRPt2rUrsl1RiUV5xPiyXr16YenSpQgPD0fDhg2hVqs1huyOHTsGlUqFNWvWiOcEUKyK6vnDlq8O7T148EDjdX78pqamr+2zfHXr1sWQIUMwZMgQPHv2DP/617+wdu1aJk9UI3HOExHpVI8ePaBWq7F69eoC+3JycpCamgoAaNeuHWQyGbZu3SreFQEglhp4HWdnZ9ja2mLLli3i8fK9fKz8Yp6vtimPGF/WsGFDeHl5ISIiAnv37oWtrS1at24t7tfT0ysQu0KhwO7du994bHt7ewBAdHS0uE2tVmPnzp0a7VxcXGBvb4+NGzciPT29wHGSk5PF976aiFlbW6Nu3bpQqVRvjIeoOuKdJyLSKR8fHwwcOBDr1q1DbGws2rdvD5lMhvj4eBw4cACff/45unfvDisrK4wePRrr1q3D+PHjERgYiOvXr+PkyZOoXbv2a88hlUoxd+5cvP/+++jbty/69esHGxsbxMXF4datW9iwYQMAiI/Vz58/H/7+/mI17/KI8VV9+vTBrFmz8OTJE0yYMEFjX/75J0yYgEGDBiE9PR27du2CtbU1kpKSXnvc5s2bw8PDA0uXLkVKSgosLCwQERGBnJycAn02f/58jBs3Dr169UK/fv1Qr149PH78GFFRUTA1NcXatWuRnp6OwMBAdOvWDS1atICJiQlOnz6NK1euVMhafkSVAZMnItK5L7/8Ei4uLtixYweWLVsGPT09NGrUCH369NG44zJlyhQYGBhgx44diIqKgpubGzZu3Ijx48e/8RwdOnTA5s2b8e2332Ljxo0QBAF2dnYYMGCA2KZr164YNmwY9u3bh71790IQBHEplPKI8WXdunXDV199BZVKJT6Bl8/R0RErV67E8uXLsXjxYtSpUweDBw+GlZUVPvvsszce++uvv8bs2bPx3XffwdzcHO+88w58fX0L1Jby9fXFzz//jNWrV2Pr1q1QKpWwsbGBm5sbBg4cCCDvqb/Bgwfj1KlTOHToEARBgL29PebMmYN3331Xq89MVF1IhJfvCxMRERHRa3HOExEREZEWmDwRERERaYHJExEREZEWmDwRERERaYHJExEREZEWmDwRERERaYHJExEREZEWmDwRERERaYHJExEREZEWmDwRERERaYHJExEREZEWmDwRERERaeH/AA81coCupPRmAAAAAElFTkSuQmCC\n" - }, - "metadata": {} - } - ], - "id": "0q3ns1r4E5uz" - }, - { - "cell_type": "markdown", - "source": [ - "### Stacked Learners (K-NN, and Lasso with Lasso as the meta estimator)" - ], - "metadata": { - "id": "wRE6bmhvp0pD" - }, - "id": "wRE6bmhvp0pD" - }, - { - "cell_type": "code", - "source": [ - "# \n", - "stacked_model_with_kmeans = results['stacked'][0]\n", - "# " - ], - "metadata": { - "id": "YvhOaMyCGlnA" - }, - "id": "YvhOaMyCGlnA", - "execution_count": 455, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "stacked_model_with_kmeans['train_scores']" - ], - "metadata": { - "id": "izqs3VZCHjdG", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "e3a7610a-86dc-4450-cbec-d3b10c454255" - }, - "execution_count": 456, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'MSE': 4091698.523858084,\n", - " 'RMSE': 2022.7947310239078,\n", - " 'MAE': 1500.417997421827,\n", - " 'R^2': 0.9124130668343199,\n", - " 'unexplained_variance': 0.08758693316568011,\n", - " 'lasso_coefs': Empty DataFrame\n", - " Columns: []\n", - " Index: []}" - ] - }, - "metadata": {}, - "execution_count": 456 - } - ], - "id": "izqs3VZCHjdG" - }, - { - "cell_type": "code", - "source": [ - "stacked_model_with_kmeans['test_scores']" - ], - "metadata": { - "id": "XgUjFlnWHjdH", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "fa10cecf-2430-4006-d6f2-bf4f163a8488" - }, - "execution_count": 457, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'MSE': 9024706.578006933,\n", - " 'RMSE': 3004.114940878084,\n", - " 'MAE': 2150.7769556887138,\n", - " 'R^2': 0.7824543537556701,\n", - " 'unexplained_variance': 0.21754564624432993}" - ] - }, - "metadata": {}, - "execution_count": 457 - } - ], - "id": "XgUjFlnWHjdH" - }, - { - "cell_type": "code", - "source": [ - "stacked_model_with_kmeans['values_table']" - ], - "metadata": { - "id": "wfmKM73zHjdI", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "outputId": "dd73a65b-8f2f-4abd-c670-a81c4d702696" - }, - "execution_count": 458, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - " Actual Values Predicted Values\n", - "0 7252.000000 6831.067010\n", - "1 2149.000000 3414.089515\n", - "2 12710.730114 11586.444351\n", - "3 14446.029890 10941.552500\n", - "4 4277.000000 12777.040861\n", - "5 6699.000000 8583.958168\n", - "6 23940.000000 22146.064713\n", - "7 5635.000000 5860.092563\n", - "8 1267.000000 2618.492066\n", - "9 2989.000000 3808.050651\n", - "10 3164.000000 7735.908192\n", - "11 14991.009450 14119.901320\n", - "12 3948.000000 11479.131355\n", - "13 4620.000000 5769.973227\n", - "14 14544.038884 10666.486777\n", - "15 14969.503918 14070.418200\n", - "16 14366.050859 10630.821787\n", - "17 13967.497235 13546.613430\n", - "18 3983.000000 8943.092638\n", - "19 24059.461063 22002.705124\n", - "20 2429.000000 2036.086415\n", - "21 11393.193024 10739.542634\n", - "22 595.000000 -75.834252\n", - "23 15089.456669 13129.808852\n", - "24 10577.000000 7365.037686\n", - "25 8050.000000 11206.045783\n", - "26 13746.008270 13862.356849\n", - "27 13856.608009 14018.847389\n", - "28 12788.787051 11703.153637\n", - "29 2275.000000 2425.615451\n", - "30 20010.328053 19156.992785\n", - "31 12781.375116 11796.972373\n", - "32 4494.000000 10948.913360\n", - "33 1603.000000 4449.512008\n", - "34 2569.000000 953.936332" - ], - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Actual ValuesPredicted Values
07252.0000006831.067010
12149.0000003414.089515
212710.73011411586.444351
314446.02989010941.552500
44277.00000012777.040861
56699.0000008583.958168
623940.00000022146.064713
75635.0000005860.092563
81267.0000002618.492066
92989.0000003808.050651
103164.0000007735.908192
1114991.00945014119.901320
123948.00000011479.131355
134620.0000005769.973227
1414544.03888410666.486777
1514969.50391814070.418200
1614366.05085910630.821787
1713967.49723513546.613430
183983.0000008943.092638
1924059.46106322002.705124
202429.0000002036.086415
2111393.19302410739.542634
22595.000000-75.834252
2315089.45666913129.808852
2410577.0000007365.037686
258050.00000011206.045783
2613746.00827013862.356849
2713856.60800914018.847389
2812788.78705111703.153637
292275.0000002425.615451
3020010.32805319156.992785
3112781.37511611796.972373
324494.00000010948.913360
331603.0000004449.512008
342569.000000953.936332
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ] - }, - "metadata": {}, - "execution_count": 458 - } - ], - "id": "wfmKM73zHjdI" - }, - { - "cell_type": "code", - "source": [ - "# \n", - "plot_graph(df = stacked_model_with_kmeans['values_table'], \n", - " graph_type='scatter_line', \n", - " label1='Actual Values',\n", - " label2='Predicted Values', \n", - " title='Actual Values vs. Predicted Values')\n", - "# " - ], - "metadata": { - "id": "CiFomy-mHjdI", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 480 - }, - "outputId": "04f9c70d-6865-4c19-c90e-cac780288bbb" - }, - "execution_count": 459, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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9nTv3j1fuby75F577TUOHz7M0KFDWb58OZMmTXpkbKbUsGFD9u7dS5s2bYyGvR5Ut25dILdn5f7PTFJS0iOHUvPKnz179qHvfWGf4bKI8X6hoaF8+eWXREZGUrduXQwGg9Hw4B9//IFOp+O7775TrwkUaeX6vM/og8OID959mhe/o6NjkT6vNWvW5IUXXuCFF17g9u3bDB48mPnz50uCVcHIHCwhHiEzM5PNmzfTrVs3+vbtm++/F154gXv37vHHH38AuXfjnT59mi1btuSrK+8vXXt7e4ACE6kGDRpw9OhRo6G37du3c/36daNyeb04eXVC7m3iR44ceazX27ZtW+rVq8e6deuIiopS79a6/7oajcao1+lRazjladiwIQAHDx5Uj6Wnp7NmzRqjcl26dMHR0ZEFCxYUeEdZUlISABkZGWRlZeW7RtWqVQtcz+tBffr0wdramvXr17Nx40a6deum9jRA7p2a2dnZRs/x8vLCysrKqP5r165x4cKFR17vcfXr1w+DwcC3336b71x2drb6eerUqRM2NjYsW7bM6PORt8zCw7Ro0YL69evz448/5vt83l9XYZ/hsojxfnXr1qVdu3ZERUWxbt066tevb3RHbkHfk9TU1CL9QVDQ59VgMLBixQqjci1btqRhw4Z8//333Lt3L189eZ9Xg8GQL1mrXr06NWvWLNLnVZQv0oMlxCP88ccf3Lt3jx49ehR43s/PDzc3N9atW0dISAijR49m06ZNvPnmmzz99NO0aNGC5ORk/vjjD2bOnEmzZs1o2LAhzs7O/Prrr1StWhUHBwd8fX1p0KABzz77LJs2beLll1+mX79+XLp0iYiICPWHfZ5u3bqxefNmXn/9dbp168aVK1f49ddfadq06WMtSqnRaBgwYADz588H4M033zQ637VrV5YsWcLLL79MaGgot2/f5pdffqFhw4acOXPmoXV37tyZunXr8u9//5vY2Fisra1ZtWoV1apVM+rFcnR0ZMaMGfzrX//iqaeeIiQkBDc3N65du8bOnTtp06YN06dPJz4+npEjR9K3b1+aNm2KtbU1W7du5datW0Vawbt69eoEBASwZMkS7t27R0hIiNH5ffv28cEHH9C3b18aN26MwWBg7dq1WFtb06dPH7XclClTOHDgwCNf/+Pq0KEDQ4YMYcGCBZw6dYrOnTtjY2NDfHw8Gzdu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\n" - }, - "metadata": {} - } - ], - "id": "CiFomy-mHjdI" - }, - { - "cell_type": "markdown", - "id": "2ae39f39-b097-446b-a74d-bff3c01d5fc7", - "metadata": { - "id": "2ae39f39-b097-446b-a74d-bff3c01d5fc7" - }, - "source": [ - "## Others [Not used]" - ] - }, - { - "cell_type": "code", - "source": [ - "# first_cluster = stacked_model[0]\n", - "# second_cluster = stacked_model[1]\n", - "# second_cluster['train_scores']\n", - "# second_cluster['test_scores']\n", - "# second_cluster['values_table']\n", - "# # \n", - "# plot_graph(df = second_cluster['values_table'], \n", - "# graph_type='scatter_line', \n", - "# label1='Actual Values',\n", - "# label2='Predicted Values', \n", - "# title='Actual Values vs. Predicted Values')\n", - "# # \n", - "# # " - ], - "metadata": { - "id": "lNPClky-s07B" - }, - "id": "lNPClky-s07B", - "execution_count": 460, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "# # \n", - "# for i, cluster_df in enumerate(clusters):\n", - "# print(f\"Cluster {i}:\")\n", - "# # Print the first 5 rows of each cluster dataframe\n", - "# # print(cluster_df.head())\n", - "# # print(cluster_df.columns)\n", - "# stacked_learner = StackedLearner(data, selected_features = data.columns[:-1].to_list())\n", - "# stacked_learner_model = stacked_learner.learn()\n", - "# evaluate_model = stacked_learner.evaluate_model(stacked_learner_model, with_table = True, return_train_score = True)\n", - "# print(evaluate_model)\n", - "# print()\n", - "# # \n", - "# # " - ], - "metadata": { - "id": "8DHCMvSqIF51" - }, - "id": "8DHCMvSqIF51", - "execution_count": 461, - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": 462, - "id": "51a04e2a-efb3-4e94-85ef-8da16de5e16d", - "metadata": { - "id": "51a04e2a-efb3-4e94-85ef-8da16de5e16d" - }, - "outputs": [], - "source": [ - "# desh_rmse_val=[] #to store rmse values for different k\n", - "# for K in range(20):\n", - "# K=K+1\n", - "# the_model=KNeighborsRegressor(n_neighbors=K)\n", - "# the_model.fit(desh_X_train, desh_Y_train)#fit the model\n", - "# pred=the_model.predict(desh_X_test)#make prediction on test set\n", - "# error = sqrt(mean_squared_error(desh_Y_test,pred))#calculate rmse\n", - "# desh_rmse_val.append(error)#store rmse values\n", - "# print('RMSE value for k= ',K, ' is: ',error)\n", - "\n", - "\n", - "# #plotting the rmse values against k values\n", - "# curve = pd.DataFrame(desh_rmse_val)\n", - "# curve.plot()\n" - ] - }, - { - "cell_type": "code", - "source": [ - " # def _k_means(self, n_clusters: int = 2, algorithm: str = 'auto', **kwargs):\n", - " # \"\"\"\n", - " # K-Means:\n", - "\n", - " # algorithm : {\"lloyd\", \"elkan\", \"auto\", \"full\"}\n", - " # algorithm='lloyd'\n", - " # max_iter=300\n", - " # tol=0.0001\n", - " # \"\"\"\n", - " # # Create a KMeans model with 3 clusters\n", - " # kmeans = KMeans(n_clusters=n_clusters, random_state=42, **kwargs)\n", - "\n", - " # # Fit the model to the data\n", - " # kmeans.fit(self.X)\n", - "\n", - " # # Get the predicted labels for each data point\n", - " # labels = kmeans.predict(self.X)\n", - " # print(labels)\n", - "\n", - " # # Score\n", - " # print(kmeans.score(self.X))\n", - "\n", - " # # Plot the data points colored by cluster\n", - " # plt.scatter(self.X[:, 0], self.X[:, 1], c=labels)\n", - " # plt.show()\n", - " # return kmeans\n", - "# \n", - "# \n", - " # base_learners = BaseLearners(data, selected_features = data.columns[:-1].to_list())\n", - "# # \n", - "# kmeans_model = base_learners._k_means()\n", - "# " - ], - "metadata": { - "id": "VO_9foRP3t8n" - }, - "id": "VO_9foRP3t8n", - "execution_count": 463, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "# class CentralisedFS:\n", - "# \"\"\"\n", - "# Centralised Approach\n", - "# \"\"\"\n", - "# def __init__(self, training_data: np.array, training_labels: list, set_of_features: list):\n", - "# super().__init__(training_data, training_labels, set_of_features) \n", - "\n", - "# self.dataframe = pd.DataFrame()\n", - " \n", - "# def execute(self):\n", - "# \"\"\"\n", - "# Centralised FS \n", - "# \"\"\"\n", - "# # \n", - "# self.final_feature_sets = {}\n", - "# _data = []\n", - "# # \n", - "# for index,technique in enumerate(self.fs_techniques):\n", - "# self._randomize_training_data()\n", - "\n", - "# print(f'[{index+ 1}] {technique}:')\n", - " \n", - "# start_time = time.time()\n", - "# features_selected, _ = self._apply_feature_selection_algo(dataset = [self.training_data, np.array(self.training_labels)], algo = technique, k = random.randint(1000, 4754)) # mutual_info, correlation, chi_squared, symmetrical_uncertainty, consistency, info_gain_ratio\n", - "# end_time = time.time()\n", - " \n", - "# feature_pct = len(features_selected)/len(self.set_of_features) * 100\n", - "# time_taken = end_time-start_time\n", - "# # print(features_selected)\n", - "# self.final_feature_sets[technique] = features_selected\n", - "\n", - "# _data.append([technique, feature_pct, time_taken, features_selected])\n", - " \n", - "# print(f'Final Feature Selected Percentage[{technique}] => {feature_pct}')\n", - "# print(f'Time Taken[{technique}] => {time_taken}')\n", - " \n", - "# self.dataframe = pd.DataFrame(_data, columns=['FS Method', 'Final Feature Selected Percentage', 'Time Taken', 'Features Selected'])\n", - "# # print(self.final_feature_set)\n", - "# # [1] rfe_svm:\n", - "# # Final Feature Selected Percentage[rfe_svm] => 3.506311360448808\n", - "# # Time Taken[rfe_svm] => 57.15518379211426\n", - "# return self.final_feature_sets\n", - "# " - ], - "metadata": { - "id": "kU-onYAT9cR3" - }, - "id": "kU-onYAT9cR3", - "execution_count": 464, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "# training_data.drop(['Effort'], axis=1, inplace=True) # 'Project'\n", - "# # \n", - "# td = training_data.to_numpy()\n", - "# # print(td[39])\n", - "# # \n", - "# set_of_features = training_data.columns.to_list()\n", - "# # \n", - "# CFS = CentralisedFS(training_data=td, training_labels=labels, set_of_features=set_of_features)\n", - "# # \n", - "# # CFS.execute()\n", - "# # \n", - "# \n", - "# CFS.final_feature_sets, len(CFS.final_feature_sets)\n", - "# print(len(list(CFS.final_feature_set.keys())))\n", - "# \n", - "# CFS.dataframe\n", - "\n", - "# \n", - "# SPLIT DATASET:\n", - "# \n", - "# # train/test split\n", - "\n", - "# # train_data = data.iloc[:30]\n", - "# # train_data\n", - "\n", - "# # test_data = data.iloc[30:]\n", - "# # test_data\n", - "\n", - "# def split_data(_data: pd.DataFrame, train_ratio: float = 0.81, class_dist_list: list = [10, 10, 10, 6, 4]):\n", - "# \"\"\"\n", - "# Split Data\n", - "# \"\"\"\n", - "# # convert data['Effort'] into class using: \n", - "# # Class: Effort | # of cases\n", - "# # 1: 0 - 1500 | 11\n", - "# # 2: 1500 - 3000 | 21\n", - "# # 3: 3000 - 4500 | 20\n", - "# # 4: 4500 - 8000 | 14\n", - "# # 5: > 8000 | 15\n", - "# # \n", - "# train_data = []\n", - "# test_data = []\n", - "\n", - "# count = 0\n", - "# for _, class_dist in enumerate(class_dist_list):\n", - "# # split data in 2 parts => 7/3\n", - "# _class = data.iloc[count:class_dist + count]\n", - "# # print(_class)\n", - "# s = round(0.7 * len(_class))\n", - "# # print(_class[:s].shape)\n", - "# train_data.append(_class[:s])\n", - "# # print(_class[s:].shape)\n", - "# test_data.append(_class[s:])\n", - "# count = count + class_dist\n", - " \n", - "# # print(test_data)\n", - "# con_train_data = pd.concat(train_data) #, pd.concat(test_data)\n", - "# con_train_data = con_train_data.reset_index().drop(['index'], axis=1)\n", - "# # \n", - "# con_test_data = pd.concat(test_data) #, pd.concat(test_data)\n", - "# con_test_data = con_test_data.reset_index().drop(['index'], axis=1)\n", - "# # con_train_data\n", - "# return con_train_data, con_test_data\n", - "# #\n", - "\n", - "\n", - "# # data.iloc[10:20]\n", - "# train_data, test_data = split_data(data)\n", - "# # \n", - "# labels = train_data['Effort'].values.tolist()\n", - "# # \n", - "# training_data = train_data\n", - "# # " - ], - "metadata": { - "id": "KVssBas5ze12" - }, - "id": "KVssBas5ze12", - "execution_count": 465, - "outputs": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.13" - }, - "colab": { - "provenance": [], - "toc_visible": true - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file diff --git a/resources/experiments/onmultitick.zip b/resources/experiments/onmultitick.zip deleted file mode 100644 index 788af9d..0000000 Binary files a/resources/experiments/onmultitick.zip and /dev/null differ diff --git a/resources/experiments/pine_scripts/ICT Concepts [LuxAlgo].pine b/resources/experiments/pine_scripts/ICT Concepts [LuxAlgo].pine deleted file mode 100644 index 5696ef5..0000000 --- a/resources/experiments/pine_scripts/ICT Concepts [LuxAlgo].pine +++ /dev/null @@ -1,1144 +0,0 @@ -// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/ -// © LuxAlgo - -//@version=5 -indicator("ICT Concepts [LuxAlgo]", max_lines_count=500, max_boxes_count=500, max_labels_count=500, max_bars_back=3000, overlay=true) -//-----------------------------------------------------------------------------} -//Strings -//-----------------------------------------------------------------------------{ -o = 'Options' -sp1 = '       ' -sp2 = '              ' -hl = 'High / Low    ' + sp1 -ny_ = 'New York' + sp1 -lo_ = 'London Open' -lc_ = 'London Close' -as_ = 'Asian' - -//-----------------------------------------------------------------------------} -//Settings -//-----------------------------------------------------------------------------{ -i_mode = input.string( 'Present' , title = 'Mode' , options =['Present', 'Historical'] ) - -//Market Structure Shift -showMS = input.bool ( true , title = '' , group = 'Market Structures', inline = 'MS' ) -len = input.int ( 5 , title = '     Length   ' +sp2 , group = 'Market Structures', inline = 'MS' , minval = 3, maxval = 10 ) - -iMSS = input.bool ( true , title = '       MSS' +sp1 , group = 'Market Structures', inline = 'M1' ) -cMSSbl = input.color (color.new(#00e6a1, 0), title = 'bullish' , group = 'Market Structures', inline = 'M1' ) -cMSSbr = input.color (color.new(#e60400, 0), title = 'bearish' , group = 'Market Structures', inline = 'M1' ) - -iBOS = input.bool ( true , title = '       BOS' +sp1 , group = 'Market Structures', inline = 'BS' ) -cBOSbl = input.color (color.new(#00e6a1, 0), title = 'bullish' , group = 'Market Structures', inline = 'BS' ) -cBOSbr = input.color (color.new(#e60400, 0), title = 'bearish' , group = 'Market Structures', inline = 'BS' ) - -//Displacement -sDispl = input.bool ( false , title = 'Show Displacement' , group = 'Displacement' ) - -perc_Body = 0.36 // input.int( 36, minval=1, maxval=36) / 100 -bxBack = 10 // input.int( 10, minval=0, maxval=10) - -sVimbl = input.bool ( true , title = '' , group = 'Volume Imbalance' , inline = 'VI' ) -visVim = input.int ( 2 , title = "   # Visible VI's  "+sp1, group = 'Volume Imbalance' , inline = 'VI' , minval = 2, maxval = 100 ) -cVimbl = input.color (color.new(#06b2d0, 0), title = '' , group = 'Volume Imbalance' , inline = 'VI' ) - -//Order Blocks -showOB = input.bool ( true , title = 'Show Order Blocks' , group = 'Order Blocks' ) -length = input.int ( 10 , title = 'Swing Lookback' , group = 'Order Blocks' , minval = 3 ) -showBull = input.int ( 1 , title = 'Show Last Bullish OB' , group = 'Order Blocks' , minval = 0 ) -showBear = input.int ( 1 , title = 'Show Last Bearish OB' , group = 'Order Blocks' , minval = 0 ) -useBody = input.bool ( true , title = 'Use Candle Body' ) - -//OB Style -bullCss = input.color (color.new(#3e89fa, 0), title = 'Bullish OB  ' , group = 'Order Blocks' , inline = 'bullcss' ) -bullBrkCss = input.color (color.new(#4785f9, 85), title = 'Bullish Break  ' , group = 'Order Blocks' , inline = 'bullcss' ) - -bearCss = input.color (color.new(#FF3131, 0), title = 'Bearish OB' , group = 'Order Blocks' , inline = 'bearcss' ) -bearBrkCss = input.color (color.new(#f9ff57, 85), title = 'Bearish Break' , group = 'Order Blocks' , inline = 'bearcss' ) - -showLabels = input.bool ( false, title = 'Show Historical Polarity Changes', group = 'Order Blocks' ) - -//Liquidity -showLq = input.bool ( true , title = 'Show Liquidity' , group = 'Liquidity' ) -a = 10 / input.float ( 4 , title = 'margin' , group = 'Liquidity' , step = 0.1, minval = 2, maxval = 7 ) -visLiq = input.int ( 2 , title = '# Visible Liq. boxes' , group = 'Liquidity' - , minval = 1 , maxval = 50 , tooltip = 'In the same direction' ) -cLIQ_B = input.color (color.new(#fa451c, 0), title = 'Buyside Liquidity  ' , group = 'Liquidity' ) -cLIQ_S = input.color (color.new(#1ce4fa, 0), title = 'Sellside Liquidity' , group = 'Liquidity' ) - -//FVG -shwFVG = input.bool ( true , title = 'Show FVGs' , group = 'Fair Value Gaps' ) -i_BPR = input.bool ( false , title = 'Balance Price Range' , group = 'Fair Value Gaps' ) -i_FVG = input.string( 'FVG' , title = o , group = 'Fair Value Gaps' , options=['FVG', 'IFVG'] - , tooltip = 'Fair Value Gaps\nor\nImplied Fair Value Gaps' ) -visBxs = input.int ( 2 , title = '# Visible FVG\'s' , group = 'Fair Value Gaps' - , minval = 1 , maxval = 20 , tooltip = 'In the same direction' ) - -//FVG Style -cFVGbl = input.color (color.new(#00e676, 0), title = 'Bullish FVG  ' , group = 'Fair Value Gaps' , inline = 'FVGbl' ) -cFVGblBR = input.color (color.new(#808000, 0), title = 'Break' , group = 'Fair Value Gaps' , inline = 'FVGbl' ) -cFVGbr = input.color (color.new(#ff5252, 0), title = 'Bearish FVG ' , group = 'Fair Value Gaps' , inline = 'FVGbr' ) -cFVGbrBR = input.color (color.new(#FF0000, 0), title = 'Break' , group = 'Fair Value Gaps' , inline = 'FVGbr' ) - -//NWOG/NDOG -iNWOG = input.bool ( true , title = '' , inline='NWOG', group = 'NWOG/NDOG' ) -cNWOG1 = input.color (color.new(#ff5252, 28), title = 'NWOG    ', inline='NWOG', group = 'NWOG/NDOG' ) -cNWOG2 = input.color (color.new(#b2b5be, 50), title = '' , inline='NWOG', group = 'NWOG/NDOG' ) -maxNWOG = input.int ( 3 , title = 'Show max', inline='NWOG', group = 'NWOG/NDOG' , minval = 0, maxval = 50 ) - -iNDOG = input.bool ( false , title = '' , inline='NDOG', group = 'NWOG/NDOG' ) -cNDOG1 = input.color (color.new(#ff9800, 20), title = 'NDOG    ', inline='NDOG', group = 'NWOG/NDOG' ) -cNDOG2 = input.color (color.new(#4dd0e1, 65), title = '' , inline='NDOG', group = 'NWOG/NDOG' ) -maxNDOG = input.int ( 1 , title = 'Show max', inline='NDOG', group = 'NWOG/NDOG' , minval = 0, maxval = 50 ) - -//Fibonacci -iFib = input.string( 'NONE' , title = 'Fibonacci between last: ', group = 'Fibonacci', options=['FVG', 'BPR', 'OB', 'Liq', 'VI', 'NWOG', 'NONE']) -iExt = input.bool ( false , title = 'Extend lines' , group = 'Fibonacci' ) - -//Killzones -showKZ = input.bool ( false , title = 'Show Killzones' , group = 'Killzones' ) -//New York -showNy = input.bool ( true , title = ny_ , inline = 'ny' , group = 'Killzones' ) and showKZ -nyCss = input.color (color.new(#ff5d00, 93), title = '' , inline = 'ny' , group = 'Killzones' ) -//London Open -showLdno = input.bool ( true , title = lo_ , inline = 'lo' , group = 'Killzones' ) and showKZ -ldnoCss = input.color (color.new(#00bcd4, 93), title = '' , inline = 'lo' , group = 'Killzones' ) -//London Close -showLdnc = input.bool ( true , title = lc_ , inline = 'lc' , group = 'Killzones' ) and showKZ -ldncCss = input.color (color.new(#2157f3, 93), title = '' , inline = 'lc' , group = 'Killzones' ) -//Asian -showAsia = input.bool ( true , title = as_ + sp2, inline = 'as' , group = 'Killzones' ) and showKZ -asiaCss = input.color (color.new(#e91e63, 93), title = '' , inline = 'as' , group = 'Killzones' ) - -//-----------------------------------------------------------------------------} -//General Calculations -//-----------------------------------------------------------------------------{ -n = bar_index -hi = high -lo = low -tf_msec = timeframe.in_seconds(timeframe.period) * 1000 -maxSize = 50 -atr = ta.atr(10) -per = i_mode == 'Present' ? last_bar_index - bar_index <= 500 : true -perB = last_bar_index - bar_index <= 1000 ? true : false -xloc = iFib == 'OB' ? xloc.bar_time : xloc.bar_index -ext = iExt ? extend.right : extend.none -plus = iFib == 'OB' ? tf_msec * 50 : 50 -mx = math.max(close , open) -mn = math.min(close , open) -body = math.abs(close - open) -meanBody = ta.sma (body , len) -max = useBody ? mx : high -min = useBody ? mn : low -blBrkConf = 0 -brBrkConf = 0 -r = color.r(chart.bg_color) -g = color.g(chart.bg_color) -b = color.b(chart.bg_color) -isDark = r < 80 and g < 80 and b < 80 - -//-----------------------------------------------------------------------------} -//User Defined Types -//-----------------------------------------------------------------------------{ -type ZZ - int [] d - int [] x - float [] y - bool [] b - -type ln_d - line l - int d - -type _2ln_lb - line l1 - line l2 - label lb - -type bx_ln - box b - line l - -type bx_ln_lb - box bx - line ln - label lb - -type mss - int dir - line [] l_mssBl - line [] l_mssBr - line [] l_bosBl - line [] l_bosBr - label[] lbMssBl - label[] lbMssBr - label[] lbBosBl - label[] lbBosBr - -type liq - box bx - bool broken - bool brokenTop - bool brokenBtm - line ln - -type ob - float top = na - float btm = na - int loc = bar_index - bool breaker = false - int break_loc = na - -type swing - float y = na - int x = na - bool crossed = false - -type FVG - box box - bool active - int pos - -var mss MSS = mss.new( - 0 - , array.new < line >() - , array.new < line >() - , array.new < line >() - , array.new < line >() - , array.new < label >() - , array.new < label >() - , array.new < label >() - , array.new < label >() - ) - -//-----------------------------------------------------------------------------} -//Variables -//-----------------------------------------------------------------------------{ -maxVimb = 2 - -var float friCp = na, var int friCi = na // Friday Close price/index -var float monOp = na, var int monOi = na // Monday Open price/index - -var float prDCp = na, var int prDCi = na // Previous Day Open price/index -var float cuDOp = na, var int cuDOi = na // Current Day Open price/index - -var _2ln_lb [] Vimbal = array.new< _2ln_lb >() - -var liq [] b_liq_B = array.new< liq >(1, liq.new(box(na), false, false, false, line(na))) -var liq [] b_liq_S = array.new< liq >(1, liq.new(box(na), false, false, false, line(na))) - -var ob [] bullish_ob = array.new< ob >() -var ob [] bearish_ob = array.new< ob >() - -var bx_ln [] bl_NWOG = array.new< bx_ln >() -var bx_ln [] bl_NDOG = array.new< bx_ln >() - -var bx_ln_lb[] a_bx_ln_lb = array.new< bx_ln_lb >() - -var FVG [] bFVG_UP = array.new< FVG >() -var FVG [] bFVG_DN = array.new< FVG >() - -var FVG [] bBPR_UP = array.new< FVG >() -var FVG [] bBPR_DN = array.new< FVG >() - -var ZZ aZZ = - ZZ.new( - array.new < int >(maxSize, 0), - array.new < int >(maxSize, 0), - array.new < float >(maxSize, na), - array.new < bool >(maxSize, na)) - -var line _diag = line.new(na, na, na, na, color=color.new(color.silver, 50), style=line.style_dashed, xloc= xloc ) -var line _vert = line.new(na, na, na, na, color=color.new(color.silver, 50), style=line.style_dotted, xloc= xloc ) -var line _zero = line.new(na, na, na, na, color=color.new(color.silver, 5), style=line.style_solid , xloc= xloc, extend=ext) -var line _0236 = line.new(na, na, na, na, color=color.new(color.orange, 25), style=line.style_solid , xloc= xloc, extend=ext) -var line _0382 = line.new(na, na, na, na, color=color.new(color.yellow, 25), style=line.style_solid , xloc= xloc, extend=ext) -var line _0500 = line.new(na, na, na, na, color=color.new(color.green , 25), style=line.style_solid , xloc= xloc, extend=ext) -var line _0618 = line.new(na, na, na, na, color=color.new(color.yellow, 25), style=line.style_solid , xloc= xloc, extend=ext) -var line _0786 = line.new(na, na, na, na, color=color.new(color.orange, 25), style=line.style_solid , xloc= xloc, extend=ext) -var line _one_ = line.new(na, na, na, na, color=color.new(color.silver, 5), style=line.style_solid , xloc= xloc, extend=ext) -var line _1618 = line.new(na, na, na, na, color=color.new(color.yellow, 25), style=line.style_solid , xloc= xloc, extend=ext) - -//-----------------------------------------------------------------------------} -//Functions/methods -//-----------------------------------------------------------------------------{ -method in_out(ZZ aZZ, int d, int x1, float y1, int x2, float y2, color col, bool b) => - aZZ.d.unshift(d), aZZ.x.unshift(x2), aZZ.y.unshift(y2), aZZ.b.unshift(b), aZZ.d.pop(), aZZ.x.pop(), aZZ.y.pop(), aZZ.b.pop() - -method timeinrange(string res, string sess) => not na(time(timeframe.period, res, sess)) - -method setLine(line ln, int x1, float y1, int x2, float y2) => ln.set_xy1(x1, y1), ln.set_xy2(x2, y2) - -method clear_aLine(line[] l) => - if l.size() > 0 - for i = l.size() -1 to 0 - l.pop().delete() - -method clear_aLabLin(label[] l) => - if l.size() > 0 - for i = l.size() -1 to 0 - l.pop().delete() - -method clear_aLabLin(line[] l) => - if l.size() > 0 - for i = l.size() -1 to 0 - l.pop().delete() - -method notransp(color css) => color.rgb(color.r(css), color.g(css), color.b(css)) - -method display(ob id, css, break_css, str)=> - if showOB - if id.breaker - a_bx_ln_lb.unshift( - bx_ln_lb.new( - box.new(id.loc, id.top, timenow + (tf_msec * 10), id.btm, na - , bgcolor = break_css - , extend = extend.none - , xloc = xloc.bar_time) - , line (na) - , label(na)) - ) - else - y = str == 'bl' ? id.btm : id.top - s = str == 'bl' ? label.style_label_up : label.style_label_down - a_bx_ln_lb.unshift( - bx_ln_lb.new( - box(na) - , line.new(id.loc, y , id.loc + (tf_msec * 10), y - , xloc = xloc.bar_time, color=css, width=2) - , label.new( id.loc + (tf_msec * 10), y - , text = str == 'bl' ? '+OB' : '-OB' - , xloc = xloc.bar_time - , style = s , color = color(na) - , textcolor=css, size = size.small)) - ) - -swings(len)=> - var os = 0 - var swing top = swing.new(na, na) - var swing btm = swing.new(na, na) - - upper = ta.highest(len) - lower = ta.lowest(len) - - os := high[len] > upper ? 0 - : low [len] < lower ? 1 : os - - if os == 0 and os[1] != 0 - top := swing.new(high[length], bar_index[length]) - - if os == 1 and os[1] != 1 - btm := swing.new(low[length], bar_index[length]) - - [top, btm] - -set_lab(i, str) => - style = str == 'Bl' ? label.style_label_down : label.style_label_up - txcol = str == 'Bl' ? color.lime : color.red - label.new(math.round(math.avg(aZZ.x.get(i), n)), aZZ.y.get(i), text='BOS' - , style=style, color=color(na), textcolor=txcol, size=size.tiny) -set_lin(i, str) => - color = str == 'Bl' ? color.lime : color.red - line.new(aZZ.x.get(i), aZZ.y.get(i), n, aZZ.y.get(i), color=color, style=line.style_dotted) - -draw(left, col) => - // - max_bars_back(time, 1000) - var int dir= na, var int x1= na, var float y1= na, var int x2= na, var float y2= na - // - sz = aZZ.d.size( ) - x2 := bar_index -1 - ph = ta.pivothigh(hi, left, 1) - pl = ta.pivotlow (lo, left, 1) - if ph - dir := aZZ.d.get (0) - x1 := aZZ.x.get (0) - y1 := aZZ.y.get (0) - y2 := nz(hi[1]) - // - if dir < 1 // if previous point was a pl, add, and change direction ( 1) - aZZ.in_out( 1, x1, y1, x2, y2, col, true) - else - if dir == 1 and ph > y1 - aZZ.x.set(0, x2), aZZ.y.set(0, y2) - // - // liquidity - if showLq and per and sz > 0 - count = 0 - st_P = 0. - st_B = 0 - minP = 0. - maxP = 10e6 - for i = 0 to math.min(sz, 50) -1 - if aZZ.d.get(i) == 1 - if aZZ.y.get(i) > ph + (atr/a) - break - else - if aZZ.y.get(i) > ph - (atr/a) and aZZ.y.get(i) < ph + (atr/a) - count += 1 - st_B := aZZ.x.get(i) - st_P := aZZ.y.get(i) - if aZZ.y.get(i) > minP - minP := aZZ.y.get(i) - if aZZ.y.get(i) < maxP - maxP := aZZ.y.get(i) - if count > 2 - getB = b_liq_B.get(0) - if st_B == getB.bx.get_left() - getB.bx.set_top(math.avg(minP, maxP) + (atr/a)) - getB.bx.set_rightbottom(n +10, math.avg(minP, maxP) - (atr/a)) - else - b_liq_B.unshift(liq.new( - box.new( - st_B, math.avg(minP, maxP) + (atr/a), n +10, math.avg(minP, maxP) - (atr/a) - , text = 'Buyside liquidity', text_size = size.tiny, text_halign = text.align_left - , text_valign = text.align_bottom, text_color = color.new(cLIQ_B, 25) - , bgcolor=color(na), border_color=color(na) - ) - , false - , false - , false - , line.new(st_B, st_P, n -1, st_P, color = color.new(cLIQ_B, 0)) - ) - ) - if b_liq_B.size() > visLiq - getLast = b_liq_B.pop() - getLast.bx.delete() - getLast.ln.delete() - // - if pl - dir := aZZ.d.get (0) - x1 := aZZ.x.get (0) - y1 := aZZ.y.get (0) - y2 := nz(lo[1]) - // - if dir > -1 // if previous point was a ph, add, and change direction (-1) - aZZ.in_out(-1, x1, y1, x2, y2, col, true) - else - if dir == -1 and pl < y1 - aZZ.x.set(0, x2), aZZ.y.set(0, y2) - // - //Liquidity - if showLq and per and sz > 0 - count = 0 - st_P = 0. - st_B = 0 - minP = 0. - maxP = 10e6 - for i = 0 to math.min(sz, 50) -1 - if aZZ.d.get(i) == -1 - if aZZ.y.get(i) < pl - (atr/a) - break - else - if aZZ.y.get(i) > pl - (atr/a) and aZZ.y.get(i) < pl + (atr/a) - count += 1 - st_B := aZZ.x.get(i) - st_P := aZZ.y.get(i) - if aZZ.y.get(i) > minP - minP := aZZ.y.get(i) - if aZZ.y.get(i) < maxP - maxP := aZZ.y.get(i) - if count > 2 - getB = b_liq_S.get(0) - if st_B == getB.bx.get_left() - getB.bx.set_top(math.avg(minP, maxP) + (atr/a)) - getB.bx.set_rightbottom(n +10, math.avg(minP, maxP) - (atr/a)) - else - b_liq_S.unshift(liq.new( - box.new( - st_B, math.avg(minP, maxP) + (atr/a), n +10, math.avg(minP, maxP) - (atr/a) - , text = 'Sellside liquidity', text_size = size.tiny, text_halign = text.align_left - , text_valign = text.align_bottom, text_color = color.new(cLIQ_S, 25) - , bgcolor=color(na), border_color=color(na) - ) - , false - , false - , false - , line.new(st_B, st_P, n -1, st_P, color = color.new(cLIQ_S, 0)) - ) - ) - if b_liq_S.size() > visLiq - getLast = b_liq_S.pop() - getLast.bx.delete() - getLast.ln.delete() - // - //Market Structure Shift - if showMS - // - iH = aZZ.d.get(2) == 1 ? 2 : 1 - iL = aZZ.d.get(2) == -1 ? 2 : 1 - // - switch - // MSS Bullish - close > aZZ.y.get(iH) and aZZ.d.get(iH) == 1 and MSS.dir < 1 => - MSS.dir := 1 - if i_mode == 'Present' - MSS.l_bosBl.clear_aLabLin(), MSS.l_bosBr.clear_aLabLin() - MSS.lbBosBl.clear_aLabLin(), MSS.lbBosBr.clear_aLabLin() - MSS.l_mssBl.clear_aLabLin(), MSS.l_mssBr.clear_aLabLin() - MSS.lbMssBl.clear_aLabLin(), MSS.lbMssBr.clear_aLabLin() - // - MSS.l_mssBl.unshift(line.new ( - aZZ.x.get(iH), aZZ.y.get(iH), n, aZZ.y.get(iH), color=cMSSbl)) - MSS.lbMssBl.unshift(label.new( - math.round(math.avg(aZZ.x.get(iH), n)), aZZ.y.get(iH), text ='MSS' - , style=label.style_label_down, size=size.tiny, color=color(na), textcolor=cMSSbl)) - // MSS Bearish - close < aZZ.y.get(iL) and aZZ.d.get(iL) == -1 and MSS.dir > -1 => - MSS.dir := -1 - if i_mode == 'Present' - MSS.l_bosBl.clear_aLabLin(), MSS.l_bosBr.clear_aLabLin() - MSS.lbBosBl.clear_aLabLin(), MSS.lbBosBr.clear_aLabLin() - MSS.l_mssBl.clear_aLabLin(), MSS.l_mssBr.clear_aLabLin() - MSS.lbMssBl.clear_aLabLin(), MSS.lbMssBr.clear_aLabLin() - // - MSS.l_mssBr.unshift(line.new ( - aZZ.x.get(iL), aZZ.y.get(iL), n, aZZ.y.get(iL), color=cMSSbr)) - MSS.lbMssBr.unshift(label.new( - math.round(math.avg(aZZ.x.get(iL), n)), aZZ.y.get(iL), text ='MSS' - , style=label.style_label_up , size=size.tiny, color=color(na), textcolor=cMSSbr)) - // BOS Bullish - MSS.dir == 1 and close > aZZ.y.get(iH) and iBOS => - if MSS.l_bosBl.size() > 0 - if aZZ.y.get(iH) != MSS.l_bosBl.get(0).get_y2() and - aZZ.y.get(iH) != MSS.l_mssBl.get(0).get_y2() - MSS.l_bosBl.unshift(set_lin(iH, 'Bl')), MSS.lbBosBl.unshift(set_lab(iH, 'Bl')) - else - if aZZ.y.get(iH) != MSS.l_mssBl.get(0).get_y2() - MSS.l_bosBl.unshift(set_lin(iH, 'Bl')), MSS.lbBosBl.unshift(set_lab(iH, 'Bl')) - // BOS Bearish - MSS.dir == -1 and close < aZZ.y.get(iL) and iBOS => - if MSS.l_bosBr.size() > 0 - if aZZ.y.get(iL) != MSS.l_bosBr.get(0).get_y2() and - aZZ.y.get(iL) != MSS.l_mssBr.get(0).get_y2() - MSS.l_bosBr.unshift(set_lin(iL, 'Br')), MSS.lbBosBr.unshift(set_lab(iL, 'Br')) - else - if aZZ.y.get(iL) != MSS.l_mssBr.get(0).get_y2() - MSS.l_bosBr.unshift(set_lin(iL, 'Br')), MSS.lbBosBr.unshift(set_lab(iL, 'Br')) - if not iMSS - MSS.l_mssBl.get(0).set_color(color(na)), MSS.lbMssBl.get(0).set_textcolor(color(na)) - MSS.l_mssBr.get(0).set_color(color(na)), MSS.lbMssBr.get(0).set_textcolor(color(na)) - - - -//-----------------------------------------------------------------------------} -//Calculations -//-----------------------------------------------------------------------------{ -draw(len, color.yellow) - -if MSS.l_bosBl.size() > 200 - MSS.l_bosBl.pop().delete() - MSS.lbBosBl.pop().delete() - -if MSS.l_bosBr.size() > 200 - MSS.l_bosBr.pop().delete() - MSS.lbBosBr.pop().delete() - -//Killzones -ny = time(timeframe.period, input.session('0700-0900', '', inline = 'ny', group = 'Killzones'), 'America/New_York') and showNy -ldn_open = time(timeframe.period, input.session('0700-1000', '', inline = 'lo', group = 'Killzones'), 'Europe/London' ) and showLdno // 0200-0500 UTC-5 -ldn_close = time(timeframe.period, input.session('1500-1700', '', inline = 'lc', group = 'Killzones'), 'Europe/London' ) and showLdnc // 1000-1200 UTC-5 -asian = time(timeframe.period, input.session('1000-1400', '', inline = 'as', group = 'Killzones'), 'Asia/Tokyo' ) and showAsia // 2000-0000 UTC-5 - -//Pivotpoints -ph = ta.pivothigh(3, 1), lPh = fixnan(ph) -pl = ta.pivotlow (3, 1), lPl = fixnan(pl) - -//Candles -L_body = - high - mx < body * perc_Body and - mn - low < body * perc_Body - -L_bodyUP = body > meanBody and L_body and close > open -L_bodyDN = body > meanBody and L_body and close < open - -bsNOTbodyUP = ta.barssince(not L_bodyUP) -bsNOTbodyDN = ta.barssince(not L_bodyDN) - -bsIs_bodyUP = ta.barssince( L_bodyUP) -bsIs_bodyDN = ta.barssince( L_bodyDN) - -lwst = math.min(lPh [bsNOTbodyUP[1]], low[bsNOTbodyUP[1]]) -hgst = math.max(high[bsNOTbodyDN[1]], lPl[bsNOTbodyDN[1]]) - -//Imbalance -imbalanceUP = L_bodyUP[1] and (i_FVG == 'FVG' ? low > high[2] : low < high[2]) -imbalanceDN = L_bodyDN[1] and (i_FVG == 'FVG' ? high < low [2] : high > low [2]) - -//Volume Imbalance -vImb_Bl = open > close[1] and high[1] > low and close > close[1] and open > open[1] and high[1] < mn -vImb_Br = open < close[1] and low [1] < high and close < close[1] and open < open[1] and low [1] > mx - -if sVimbl - if vImb_Bl - Vimbal.unshift( - _2ln_lb.new( - line.new (n -1, mx[1], n +3, mx[1], color=cVimbl) - , line.new (n , mn , n +3, mn , color=cVimbl) - , label.new(n +3, math.avg (mx[1], mn), text='VI' - , color=color(na) , textcolor=cVimbl, style=label.style_label_left) - ) - ) - if vImb_Br - Vimbal.unshift( - _2ln_lb.new( - line.new (n -1, mn[1], n +3, mn[1], color=cVimbl) - , line.new (n , mx , n +3, mx , color=cVimbl) - , label.new(n +3, math.avg (mn[1], mx), text='VI' - , color=color(na) , textcolor=cVimbl, style=label.style_label_left) - ) - ) - if Vimbal.size() > visVim - pop = Vimbal.pop() - pop.l1.delete() - pop.l2.delete() - pop.lb.delete() - -//Fair Value Gap -if barstate.isfirst - for i = 0 to visBxs -1 - bFVG_UP.unshift(FVG.new(box(na), false)) - bFVG_DN.unshift(FVG.new(box(na), false)) - if i_BPR - bBPR_UP.unshift(FVG.new(box(na), false)) - bBPR_DN.unshift(FVG.new(box(na), false)) - -if imbalanceUP and per and shwFVG - if imbalanceUP[1] - bFVG_UP.get(0).box.set_lefttop (n -2, low ) - bFVG_UP.get(0).box.set_rightbottom(n +8, high[2]) - else - bFVG_UP.unshift(FVG.new( - box.new( - n -2 - , i_FVG == 'FVG' ? low : high[2] - , n, i_FVG == 'FVG' ? high[2] : low - , bgcolor = i_BPR ? color(na) : color.new(cFVGbl, 90) - , border_color= i_BPR ? color(na) : color.new(cFVGbl, 65) - , text_color = i_BPR ? color(na) : color.new(cFVGbl, 65) - , text_size=size.small - , text=i_FVG - ) - , true) - ) - bFVG_UP.pop().box.delete() - -if imbalanceDN and per and shwFVG - if imbalanceDN[1] - bFVG_DN.get(0).box.set_lefttop (n -2, low[2]) - bFVG_DN.get(0).box.set_rightbottom(n +8, high ) - else - bFVG_DN.unshift(FVG.new( - box.new( - n -2 - , i_FVG == 'FVG' ? low[2] : high - , n, i_FVG == 'FVG' ? high : low[2] - , bgcolor = i_BPR ? color(na) : color.new(cFVGbr, 90) - , border_color= i_BPR ? color(na) : color.new(cFVGbr, 65) - , text_color = i_BPR ? color(na) : color.new(cFVGbr, 65) - , text_size=size.small - , text=i_FVG - ) - , true) - ) - bFVG_DN.pop().box.delete() - -//Balance Price Range (overlap of 2 latest FVG bull/bear) -if i_BPR and bFVG_UP.size() > 0 and bFVG_DN.size() > 0 - bxUP = bFVG_UP.get(0) - bxDN = bFVG_DN.get(0) - bxUPbtm = bxUP.box.get_bottom() - bxDNbtm = bxDN.box.get_bottom() - bxUPtop = bxUP.box.get_top() - bxDNtop = bxDN.box.get_top() - left = math.min(bxUP.box.get_left (), bxDN.box.get_left ()) - right = math.max(bxUP.box.get_right(), bxDN.box.get_right()) - // - if bxUPbtm < bxDNtop and - bxDNbtm < bxUPbtm - if left == bBPR_UP.get(0).box.get_left() - if bBPR_UP.get(0).active - bBPR_UP.get(0).box.set_right(right) - else - bBPR_UP.unshift(FVG.new( - box.new( - left, bxDNtop, right, bxUPbtm - , bgcolor = i_BPR ? color.new(cFVGbl, 90) : color(na) - , border_color= i_BPR ? color.new(cFVGbl, 65) : color(na) - , text_color = i_BPR ? color.new(cFVGbl, 65) : color(na) - , text_size=size.small - , text= 'BPR' - ) - , true - , close > bxUPbtm ? 1 : close < bxDNtop ? -1 : 0 - ) - ) - bBPR_UP.pop().box.delete() - // - if bxDNbtm < bxUPtop and - bxUPbtm < bxDNbtm - if left == bBPR_DN.get(0).box.get_left() - if bBPR_DN.get(0).active - bBPR_DN.get(0).box.set_right(right) - else - bBPR_DN.unshift(FVG.new( - box.new( - left, bxUPtop, right, bxDNbtm - , bgcolor = i_BPR ? color.new(cFVGbr, 90) : color(na) - , border_color= i_BPR ? color.new(cFVGbr, 65) : color(na) - , text_color = i_BPR ? color.new(cFVGbr, 65) : color(na) - , text_size=size.small - , text= 'BPR' - ) - , true - , close > bxDNbtm ? 1 : close < bxUPtop ? -1 : 0 - ) - ) - bBPR_DN.pop().box.delete() - -//FVG's breaks -for i = 0 to math.min(bxBack, bFVG_UP.size() -1) - getUPi = bFVG_UP.get(i) - if getUPi.active - getUPi.box.set_right(bar_index +8) - if low < getUPi.box.get_top() and not i_BPR - getUPi.box.set_border_style(line.style_dashed) - if low < getUPi.box.get_bottom() - if not i_BPR - getUPi.box.set_bgcolor(color.new(cFVGblBR, 95)) - getUPi.box.set_border_style(line.style_dotted) - getUPi.box.set_right(bar_index) - getUPi.active := false - -for i = 0 to math.min(bxBack, bFVG_DN.size() -1) - getDNi = bFVG_DN.get(i) - if getDNi.active - getDNi.box.set_right(bar_index +8) - if high > getDNi.box.get_bottom() and not i_BPR - getDNi.box.set_border_style(line.style_dashed) - if high > getDNi.box.get_top() - if not i_BPR - getDNi.box.set_bgcolor(color.new(cFVGbrBR, 95)) - getDNi.box.set_border_style(line.style_dotted) - getDNi.box.set_right(bar_index) - getDNi.active := false - -if i_BPR - for i = 0 to math.min(bxBack, bBPR_UP.size() -1) - getUPi = bBPR_UP.get(i) - if getUPi.active - getUPi.box.set_right(bar_index +8) - switch getUPi.pos - -1 => - if high > getUPi.box.get_bottom() - getUPi.box.set_border_style(line.style_dashed) - if high > getUPi.box.get_top () - getUPi.box.set_bgcolor(color.new(cFVGblBR, 95)) - getUPi.box.set_border_style(line.style_dotted) - getUPi.box.set_right(bar_index) - getUPi.active := false - 1 => - if low < getUPi.box.get_top () - getUPi.box.set_border_style(line.style_dashed) - if low < getUPi.box.get_bottom() - getUPi.box.set_bgcolor(color.new(cFVGblBR, 95)) - getUPi.box.set_border_style(line.style_dotted) - getUPi.box.set_right(bar_index) - getUPi.active := false - - for i = 0 to math.min(bxBack, bBPR_DN.size() -1) - getDNi = bBPR_DN.get(i) - if getDNi.active - getDNi.box.set_right(bar_index +8) - switch getDNi.pos - -1 => - if high > getDNi.box.get_bottom() - getDNi.box.set_border_style(line.style_dashed) - if high > getDNi.box.get_top () - getDNi.box.set_bgcolor(color.new(cFVGbrBR, 95)) - getDNi.box.set_border_style(line.style_dotted) - getDNi.box.set_right(bar_index) - getDNi.active := false - 1 => - if low < getDNi.box.get_top () - getDNi.box.set_border_style(line.style_dashed) - if low < getDNi.box.get_bottom() - getDNi.box.set_bgcolor(color.new(cFVGbrBR, 95)) - getDNi.box.set_border_style(line.style_dotted) - getDNi.box.set_right(bar_index) - getDNi.active := false - -//NWOG/NDOG -if barstate.isfirst - for i = 0 to maxNWOG -1 - bl_NWOG.unshift(bx_ln.new(box(na), line(na))) - for i = 0 to maxNDOG -1 - bl_NDOG.unshift(bx_ln.new(box(na), line(na))) - -if dayofweek == dayofweek.friday - friCp := close, friCi := n - -if ta.change(dayofweek) - if dayofweek == dayofweek.monday and iNWOG - monOp := open , monOi := n - bl_NWOG.unshift(bx_ln.new( - box.new( - friCi , math.max (friCp , monOp ) - , monOi , math.min (friCp , monOp ) - , bgcolor = color ( na ) - , border_color = cNWOG2 - , extend = extend.right ) - , - line.new( - monOi , math.avg (friCp , monOp ) - , monOi +1 , math.avg (friCp , monOp ) - , color = cNWOG1 - , style = line.style_dotted - , extend = extend.right ) - )) - bl = bl_NWOG.pop(), bl.b.delete(), bl.l.delete() - if iNDOG - cuDOp := open , cuDOi := n - prDCp := close[1], prDCi := n -1 - // - bl_NDOG.unshift(bx_ln.new( - box.new( - prDCi , math.max (prDCp , cuDOp ) - , cuDOi , math.min (prDCp , cuDOp ) - , bgcolor = color ( na ) - , border_color = cNDOG2 - , extend = extend.right ) - , - line.new( - cuDOi , math.avg (prDCp , cuDOp ) - , cuDOi +1 , math.avg (prDCp , cuDOp ) - , color = cNDOG1 - , style = line.style_dotted - , extend = extend.right ) - )) - bl = bl_NDOG.pop(), bl.b.delete(), bl.l.delete() - -//Liquidity -for i = 0 to b_liq_B.size() -1 - x = b_liq_B.get(i) - if not x.broken - x.bx.set_right(n +3) - x.ln.set_x2 (n +3) - if not x.brokenTop - if close > x.bx.get_top () - x.brokenTop := true - if not x.brokenBtm - if close > x.bx.get_bottom() - x.brokenBtm := true - if x.brokenBtm - x.bx.set_bgcolor(color.new(cLIQ_B, 90)) - x.ln.delete() - if x.brokenTop - x.broken := true - x.bx.set_right(n) - -for i = 0 to b_liq_S.size() -1 - x = b_liq_S.get(i) - if not x.broken - x.bx.set_right(n +3) - x.ln.set_x2 (n +3) - if not x.brokenTop - if close < x.bx.get_top () - x.brokenTop := true - if not x.brokenBtm - if close < x.bx.get_bottom() - x.brokenBtm := true - if x.brokenTop - x.bx.set_bgcolor(color.new(cLIQ_S, 90)) - x.ln.delete() - if x.brokenBtm - x.broken := true - x.bx.set_right(n) - -//Order Blocks -[top, btm] = swings(length) - -if showOB and per - if close > top.y and not top.crossed - top.crossed := true - - minima = max[1] - maxima = min[1] - loc = time[1] - - for i = 1 to (n - top.x)-1 - minima := math.min(min[i], minima) - maxima := minima == min[i] ? max[i] : maxima - loc := minima == min[i] ? time[i] : loc - bullish_ob.unshift(ob.new(maxima, minima, loc)) - - if bullish_ob.size() > 0 - for i = bullish_ob.size()-1 to 0 - element = bullish_ob.get(i) - - if not element.breaker - if math.min(close, open) < element.btm - element.breaker := true - element.break_loc := time - else - if close > element.top - bullish_ob.remove(i) - else if i < showBull and top.y < element.top and top.y > element.btm - blBrkConf := 1 - - //Set label - if blBrkConf > blBrkConf[1] and showLabels - label.new(top.x, top.y, '▼', color = na - , textcolor = bearCss.notransp() - , style = label.style_label_down - , size = size.tiny) - -if showOB and per - if close < btm.y and not btm.crossed - btm.crossed := true - - minima = min[1] - maxima = max[1] - loc = time[1] - - for i = 1 to (n - btm.x)-1 - maxima := math.max(max[i], maxima) - minima := maxima == max[i] ? min[i] : minima - loc := maxima == max[i] ? time[i] : loc - bearish_ob.unshift(ob.new(maxima, minima, loc)) - - if bearish_ob.size() > 0 - for i = bearish_ob.size()-1 to 0 - element = bearish_ob.get(i) - - if not element.breaker - if math.max(close, open) > element.top - element.breaker := true - element.break_loc := time - else - if close < element.btm - bearish_ob.remove(i) - else if i < showBear and btm.y > element.btm and btm.y < element.top - brBrkConf := 1 - - //Set label - if brBrkConf > brBrkConf[1] and showLabels - label.new(btm.x, btm.y, '▲', color = na - , textcolor = bullCss.notransp() - , style = label.style_label_up - , size = size.tiny) - -//-----------------------------------------------------------------------------} -//Set Order Blocks -//-----------------------------------------------------------------------------{ -if barstate.islast and showOB - if a_bx_ln_lb.size() > 0 - for i = a_bx_ln_lb.size() -1 to 0 - item = a_bx_ln_lb.remove(i) - item.bx.delete() - item.ln.delete() - item.lb.delete() - //Bullish - if showBull > 0 - blSz = bullish_ob.size() - if blSz > 0 - for i = 0 to math.min(showBull, bullish_ob.size()) -1 - get_ob = bullish_ob.get(i) - get_ob.display(bullCss, bullBrkCss, 'bl') - //Bearish - if showBear > 0 - brSz = bearish_ob.size() - if brSz > 0 - for i = 0 to math.min(showBear, bearish_ob.size()) -1 - get_ob = bearish_ob.get(i) - get_ob.display(bearCss, bearBrkCss, 'br') - -//-----------------------------------------------------------------------------} -//Fibonacci -//-----------------------------------------------------------------------------{ -if barstate.islast - x1 = 0, y1 = 0., x2 = 0, y2 = 0., box up = na, box dn = na - switch iFib - 'FVG' => - if bFVG_UP.size() > 0 and bFVG_DN.size() > 0 - up := bFVG_UP.get(0).box - dn := bFVG_DN.get(0).box - dnFirst = up.get_left() > dn.get_left() - dnBottm = up.get_top () > dn.get_top () - x1 := dnFirst ? dn.get_left () : up.get_left () - x2 := dnFirst ? up.get_right () : dn.get_right () - y1 := dnFirst ? - dnBottm ? dn.get_bottom() : dn.get_top () : - dnBottm ? up.get_top () : up.get_bottom() - y2 := dnFirst ? - dnBottm ? up.get_top () : up.get_bottom() : - dnBottm ? dn.get_bottom() : dn.get_top () - 'BPR' => - if bBPR_UP.size() > 0 and bBPR_DN.size() > 0 - up := bBPR_UP.get(0).box - dn := bBPR_DN.get(0).box - dnFirst = up.get_left() > dn.get_left() - dnBottm = up.get_top () > dn.get_top () - x1 := dnFirst ? dn.get_left () : up.get_left () - x2 := dnFirst ? up.get_right () : dn.get_right () - y1 := dnFirst ? - dnBottm ? dn.get_bottom() : dn.get_top () : - dnBottm ? up.get_top () : up.get_bottom() - y2 := dnFirst ? - dnBottm ? up.get_top () : up.get_bottom() : - dnBottm ? dn.get_bottom() : dn.get_top () - 'OB' => - oSz = a_bx_ln_lb.size() - if oSz > 1 - xA = nz( - a_bx_ln_lb.get(oSz -1).ln.get_x1 () - , a_bx_ln_lb.get(oSz -1).bx.get_left () - ) - xB = nz( - a_bx_ln_lb.get(oSz -2).ln.get_x1 () - , a_bx_ln_lb.get(oSz -2).bx.get_left () - ) - AFirst = xB > xA - // - yAT = nz( - a_bx_ln_lb.get(oSz -1).ln.get_y1 () - , a_bx_ln_lb.get(oSz -1).bx.get_top () - ) - yAB = nz( - a_bx_ln_lb.get(oSz -1).ln.get_y1 () - , a_bx_ln_lb.get(oSz -1).bx.get_bottom() - ) - yBT = nz( - a_bx_ln_lb.get(oSz -2).ln.get_y1 () - , a_bx_ln_lb.get(oSz -2).bx.get_top () - ) - yBB = nz( - a_bx_ln_lb.get(oSz -2).ln.get_y1 () - , a_bx_ln_lb.get(oSz -2).bx.get_bottom() - ) - ABottom = yAB < yBB - // - x1 := AFirst ? xA : xB - x2 := AFirst ? xB : xA - y1 := AFirst ? - ABottom ? yAB : yAT : - ABottom ? yBT : yBB - y2 := AFirst ? - ABottom ? yBT : yBB : - ABottom ? yAB : yAT - 'Liq' => - if b_liq_B.size() > 0 and b_liq_S.size() > 0 - xA = nz( - b_liq_B.get(0).ln.get_x1 () - , b_liq_B.get(0).bx.get_left () - ) - xB = nz( - b_liq_S.get(0).ln.get_x1 () - , b_liq_S.get(0).bx.get_left () - ) - AFirst = xB > xA - // - yAT = nz( - b_liq_B.get(0).ln.get_y1 () - , b_liq_B.get(0).bx.get_top () - ) - yAB = nz( - b_liq_B.get(0).ln.get_y1 () - , b_liq_B.get(0).bx.get_bottom() - ) - yBT = nz( - b_liq_S.get(0).ln.get_y1 () - , b_liq_S.get(0).bx.get_top () - ) - yBB = nz( - b_liq_S.get(0).ln.get_y1 () - , b_liq_S.get(0).bx.get_bottom() - ) - ABottom = yAB < yBB - // - x1 := AFirst ? xA : xB - x2 := AFirst ? xB : xA - y1 := AFirst ? - ABottom ? yAB : yAT : - ABottom ? yBT : yBB - y2 := AFirst ? - ABottom ? yBT : yBB : - ABottom ? yAB : yAT - 'VI' => - if Vimbal.size() > 1 - AxA = Vimbal.get(1).l2.get_x1(), AxB = Vimbal.get(1).l1.get_x1() - BxA = Vimbal.get(0).l2.get_x1(), BxB = Vimbal.get(0).l1.get_x1() - AyA = Vimbal.get(1).l2.get_y1(), AyB = Vimbal.get(1).l1.get_y1() - ByA = Vimbal.get(0).l2.get_y1(), ByB = Vimbal.get(0).l1.get_y1() - ABt = math.min(ByA, ByB) > math.min(AyA, AyB) - x1 := math.max(AxA, AxB) - x2 := math.max(BxA, BxB) - y1 := ABt ? math.min(AyA, AyB) : math.max(AyA, AyB) - y2 := ABt ? math.max(ByA, ByB) : math.min(ByA, ByB) - 'NWOG' => - if bl_NWOG.size() > 1 - up := bl_NWOG.get(0).b - dn := bl_NWOG.get(1).b - dnFirst = up.get_left() > dn.get_left() - dnBottm = up.get_top () > dn.get_top () - x1 := dnFirst ? dn.get_left () : up.get_left () - x2 := dnFirst ? up.get_right() : dn.get_right() - y1 := dnFirst ? - dnBottm ? dn.get_bottom() : dn.get_top () : - dnBottm ? up.get_top () : up.get_bottom() - y2 := dnFirst ? - dnBottm ? up.get_top () : up.get_bottom() : - dnBottm ? dn.get_bottom() : dn.get_top () - // - if iFib != 'NONE' - rt = math.max(x1, x2) - lt = math.min(x1, x2) - tp = math.max(y1, y2) - bt = math.min(y1, y2) - _0 = rt == x1 ? y1 : y2 - _1 = rt == x1 ? y2 : y1 - // - df = _1 - _0 - m0236 = df * 0.236 - m0382 = df * 0.382 - m0500 = df * 0.500 - m0618 = df * 0.618 - m0786 = df * 0.786 - m1618 = df * 1.618 - // - _diag.setLine(x1, y1 , x2 , y2 ) - _vert.setLine(rt, _0 , rt , _0 + m1618) - _zero.setLine(rt, _0 , rt + plus, _0 ) - _0236.setLine(rt, _0 + m0236, rt + plus, _0 + m0236) - _0382.setLine(rt, _0 + m0382, rt + plus, _0 + m0382) - _0500.setLine(rt, _0 + m0500, rt + plus, _0 + m0500) - _0618.setLine(rt, _0 + m0618, rt + plus, _0 + m0618) - _0786.setLine(rt, _0 + m0786, rt + plus, _0 + m0786) - _one_.setLine(rt, _1 , rt + plus, _1 ) - _1618.setLine(rt, _0 + m1618, rt + plus, _0 + m1618) - -//-----------------------------------------------------------------------------} -//Displacement -//-----------------------------------------------------------------------------{ -plotshape(sDispl ? per ? - L_bodyUP ? low : na : na : na - , title = 'Displacement UP' - , style = shape.labelup - , color = color.lime - , location = location.belowbar) -plotshape(sDispl ? per ? - L_bodyDN ? high : na : na : na - , title = 'Displacement DN' - , style = shape.labeldown - , color = color.red - , location = location.abovebar) - -//-----------------------------------------------------------------------------} -//background - Killzones -//-----------------------------------------------------------------------------{ -bgcolor (per ? ny ? nyCss : na : na, editable = false) -bgcolor (per ? ldn_open ? ldnoCss : na : na, editable = false) -bgcolor (per ? ldn_close ? ldncCss : na : na, editable = false) -bgcolor (per ? asian ? asiaCss : na : na, editable = false) - -//-----------------------------------------------------------------------------} diff --git a/resources/experiments/pine_scripts/Machine Learning-Perceptron-based strategy (edited by Fortesense Labs).pine b/resources/experiments/pine_scripts/Machine Learning-Perceptron-based strategy (edited by Fortesense Labs).pine deleted file mode 100644 index 2d1baea..0000000 --- a/resources/experiments/pine_scripts/Machine Learning-Perceptron-based strategy (edited by Fortesense Labs).pine +++ /dev/null @@ -1,282 +0,0 @@ -// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ -// © capissimo [Machine Learning: Perceptron-based strategy by capissimo copy] - -//@version=4 -study('Custom Perceptron-based strategy', overlay=true) - -// Machine Learning: Perceptron-based strategy (v.2) - -// Perceptron-based strategy - -// Description: - -// The Learning Perceptron is the simplest possible artificial neural network -// (ANN), consisting of just a single neuron and capable of learning a certain -// class of binary classification problems. The idea behind ANNs is that by -// selecting good values for the weight parameters (and the bias), the ANN can -// model the relationships between the inputs and some target. - -// Generally, ANN neurons receive a number of inputs, weight each of those inputs, -// sum the weights, and then transform that sum using a special function called -// an activation function. The output of that activation function is then either -// used as the prediction (in a single neuron model) or is combined with the outputs -// of other neurons for further use in more complex models. - -// The purpose of the activation function is to take the input signal (that’s the -// weighted sum of the inputs and the bias) and turn it into an output signal. -// Think of this activation function as firing (activating) the neuron when it -// returns 1, and doing nothing when it returns 0. This sort of computation is -// accomplished with a function called step function: f(z) = {1 if z > 0 else 0}. -// This function then transforms any weighted sum of the inputs and converts it -// into a binary output (either 1 or 0). The trick to making this useful is finding -// (learning) a set of weights that lead to good predictions using this activation -// function. - -// Training our perceptron is simply a matter of initializing the weights to zero -// (or random value) and then implementing the perceptron learning rule, which -// just updates the weights based on the error of each observation with the current -// weights. This has the effect of moving the classifier’s decision boundary in the -// direction that would have helped it classify the last observation correctly. -// This is achieved via a for loop which iterates over each observation, making a -// prediction of each observation, calculating the error of that prediction and then -// updating the weights accordingly. In this way, weights are gradually updated -// until they converge. Each sweep through the training data is called an epoch. - -// In this script the perceptron is retrained on each new bar trying to classify -// this bar by drawing the moving average curve above or below the bar. - -// This script was tested with BTCUSD and USDJPY, and EURUSD. - -// Note: TradingViews's playback feature helps to see this strategy in action. -// Warning: Signals ARE(!) repainting. - -// Style tags: Trend Following, Trend Analysis -// Asset class: Equities, Futures, ETFs, Currencies and Commodities -// Dataset: FX Minutes/Hours/Days - -//-------------------- Inputs - -ptype = input('HLC3', 'Price Type', options=['Open','High','Low','Close','HL2','OC2','OHL3','HLC3','OHLC4']) -ftype = input('Both','Filter Signals by', options=['Volatility','Volume','Both','None']) -holding_p = input(9, 'Holding Period |1..n|', minval=1) // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 [The higher the timeframe, the lesser the holding period] [1 to 3 is the optimal holding period range] -show_pma = input(false, 'Show Perceptron MA?') -show_ema = input(false, 'Show EMA?') - -//-------------------- System Variables - -var int depth = 20 //-- the size of the dataset sample (20) -var int epochs = 5 //-- number of sweeps through the data sample to train perceptron (5) - -var int BUY = 1 // -1 -var int SELL = 0 // 1 -var int HOLD = -1 // 0 - -var int p = 14 //-- the lookback window is constant (14) - -//-------------------- Dynamic Arrays - -var float weight1 = 0.0 //-- or random value -var float weight2 = 0.0 //-- same here -var float bias = 0.0 // 0.0 -var float errors = 0.0 - -var int signal = HOLD -var int hp_counter = 0 //-- holding period counter - -//-------------------- Custom Functions - -cAqua(g) => g>9?#0080FFff:g>8?#0080FFe5:g>7?#0080FFcc:g>6?#0080FFb2:g>5?#0080FF99 - : g>4?#0080FF7f:g>3?#0080FF66:g>2?#0080FF4c:g>1?#0080FF33:#00C0FF19 -cPink(g) => g>9?#FF0080ff:g>8?#FF0080e5:g>7?#FF0080cc:g>6?#FF0080b2:g>5?#FF008099 - : g>4?#FF00807f:g>3?#FF008066:g>2?#FF00804c:g>1?#FF008033:#FF008019 - -volumeBreak(thres) => - rsivol = rsi(volume, 16) // 14 - osc = hma(rsivol, 10) - osc > thres - -volatilityBreak(volmin, volmax) => atr(volmin) > atr(volmax) - -step_function(output) => output > 0 ? 1 : -1 - -//-------------------- Logic - -ds = ptype=='Open' ? open - : ptype=='High' ? high - : ptype=='Low' ? low - : ptype=='Close' ? close - : ptype=='HL2' ? (high+low)/2 - : ptype=='OC2' ? (open+close)/2 - : ptype=='OHL3' ? (open+high+low)/3 - : ptype=='HLC3' ? (high+low+close)/3 - : (open+high+low+close)/4 - -// (1, 10) and (49) -filter = ftype=='Volatility' ? volatilityBreak(1, 10) - : ftype=='Volume' ? volumeBreak(49) - : ftype=='Both' ? volatilityBreak(1, 14) and volumeBreak(39) - : true - -// Training loop -// Note: factors must be scaled to the identical interval. Here -// by default it is [0..100] due to the nature of the selected factors -for j=1 to epochs //-- for each epoch - for i=1 to depth //-- iterate over the dataset to the specified depth - factor1 = rsi(ds[i], p) //-- and look into all but the latest data points - factor2 = cci(ds[i], p) - hypothesis = weight1*factor1 + weight2*factor2 + bias - yhat = step_function(hypothesis) - error = ds[i] - yhat - weight1 := weight1 + error*factor1 //-- learning rule - weight2 := weight2 + error*factor2 - bias := bias + error - - output = weight1*rsi(ds, p) + weight2*cci(ds, p) + bias //-- now produce Nth period output for the - prediction = step_function(output) //-- latest data point and classify it - errors := sum(abs(ds - prediction), depth)/2 //-- Note: this effectively produces a moving average! - -//slope = -weight1/weight2 -//intercept = -bias/weight2 - -//err_ma = errors/10 + (adj ? -1 : 0) //-- some asset prices require adjustment -err_ma = errors/10 + -1 //-- by trial and error - -signal := ds > err_ma and filter ? BUY : ds < err_ma and filter ? SELL : nz(signal[1]) - -changed = change(signal) - -hp_counter := changed ? 0 : hp_counter + 1 - -startLongTrade = changed and signal==BUY -startShortTrade = changed and signal==SELL - -endLongTrade = (signal==BUY and hp_counter==holding_p and not changed) or (changed and signal==SELL) -endShortTrade = (signal==SELL and hp_counter==holding_p and not changed) or (changed and signal==BUY) - -//-------------------- Rendering - -plot(show_pma ? err_ma : na, 'Perceptron', color.blue, 2) -plot(show_ema ? ema(ds, p) : na, 'EMA', color.orange, 2) - -plotshape(startLongTrade, 'Buy', shape.labelup, location.belowbar, cAqua(10), 0, 0, '', color.white, false, size.small) // shape.labelup -plotshape(startShortTrade, 'Sell', shape.labeldown, location.abovebar, cPink(10), 0, 0, '', color.white, false, size.small) // shape.labeldown -plot(endLongTrade ? high : na, 'StopBuy', cAqua(15), 2, plot.style_cross) -plot(endShortTrade ? low : na, 'StopSell', cPink(15), 2, plot.style_cross) - -//-------------------- Alerting - -// Plain Text -// alertcondition(startLongTrade, "Buy Alert", "Possible Long Trade") -// alertcondition(startShortTrade, "Sell Alert", "Possible Short Trade") - -// alertcondition(endLongTrade, "Stop Buy Alert", "Stop Long Trade") -// alertcondition(endShortTrade, "Stop Sell Alert", "Stop Short Trade") - -// JSON -// current_atr = str.format("{0}", atr(p)) // current avg. pips = ATR + or - 1/2 -// Number of positions to open = Based on the current avg. pips, intended TP/SL, and the intended volume/lot size - -alertcondition(startLongTrade, "Buy Alert", "{'actionType': 'BUY'}") // 'currentAtr': '" + str.tostring(){{atr(p)}}+ "' -alertcondition(startShortTrade, "Sell Alert", "{'actionType': 'SELL'}") - -alertcondition(endLongTrade, "Stop Buy Alert", "{'actionType': 'STOP_BUY'}") -alertcondition(endShortTrade, "Stop Sell Alert", "{'actionType': 'STOP_SELL'}") - -//-------------------- Backtesting - -lot_size = input(0.1, 'Lot Size', options=[0.01,0.02,0.03,0.05,0.1,0.2,0.3,0.5,1.0,2.0,3.0,5.0,10.0,20.0,30.0,50.0,100.0,1000.0]) - -ohl3 = (open+high+low)/3 -// hlc3 = (high+low+close)/3 -// ohlc4 = (open+high+low+close)/4 - -back_ptype = ohl3 - -var float start_long_trade = 0. -var float long_trades = 0. -var float start_short_trade = 0. -var float short_trades = 0. -var int wins = 0 -var int trade_count = 0 - -if startLongTrade - start_long_trade := back_ptype -if endLongTrade - trade_count := 1 - ldiff = (open - start_long_trade) - wins := ldiff > 0 ? 1 : 0 - long_trades := ldiff * lot_size -if startShortTrade - start_short_trade := back_ptype -if endShortTrade - trade_count := 1 - sdiff = (start_short_trade - open) - wins := sdiff > 0 ? 1 : 0 - short_trades := sdiff * lot_size - -cumreturn = cum(long_trades) + cum(short_trades) //-- cumulative return -totaltrades = cum(trade_count) -totalwins = cum(wins) -totallosses = totaltrades - totalwins == 0 ? 1 : totaltrades - totalwins - -//-------------------- Information - -show_info = input(true, 'Show Info?') - -var label lbl = na - -tbase = (time - time[1]) / 1000 -tcurr = (timenow - time_close[1]) / 1000 - -// info = 'CR: ' + tostring(cumreturn, '#.#') -// + '\nTrades: ' + tostring(totaltrades, '#') -// + '\nWin/Loss: ' + tostring(totalwins/totallosses, '#.##') -// + '\nWinrate: ' + tostring(totalwins/totaltrades, '#.##%') -// + '\nLossrate: ' + tostring(totallosses/totaltrades,'#.##%') -// + '\nBar Time: ' + tostring(tcurr/tbase, '#.##%') - -info = '\nTrades: ' + tostring(totaltrades, '#') - + '\nWin/Loss: ' + tostring(totalwins/totallosses, '#.##') - + '\nWinrate: ' + tostring(totalwins/totaltrades, '#.##%') - + '\nLossrate: ' + tostring(totallosses/totaltrades,'#.##%') - + '\nBar Time: ' + tostring(tcurr/tbase, '#.##%') - -if show_info and barstate.islast - lbl := label.new(bar_index, close, info, xloc.bar_index, yloc.price, - color.new(color.blue, 100), label.style_label_left, color.white, size.small, text.align_left) - label.delete(lbl[1]) - - -// if startLongTrade and bar_index < 100 -// strategy.entry(id="Buy",strategy.long) - -// if startLongTrade -// strategy.entry("buy", strategy.long, 0.01) - // strategy.entry("sell", strategy.short, 10, when=strategy.position_size > 0) - -// if endLongTrade -// plot(strategy.equity) - -// https://www.tradingview.com/pine-script-docs/en/v4/essential/Strategies.html - -// if the was and open buy position -// close it if a sell alert conmes in and vice versa - -//-------------------- Alerting - -// Plain Text -// alertcondition(startLongTrade, "Buy Alert", "Possible Long Trade") -// alertcondition(startShortTrade, "Sell Alert", "Possible Short Trade") - -// alertcondition(endLongTrade, "Stop Buy Alert", "Stop Long Trade") -// alertcondition(endShortTrade, "Stop Sell Alert", "Stop Short Trade") - -// JSON -// current_atr = str.format("{0}", atr(p)) // current avg. pips = ATR + or - 1/2 -// Number of positions to open = Based on the current avg. pips, intended TP/SL, and the intended volume/lot size - -// alertcondition(startLongTrade, "Buy Alert", "{'actionType': 'BUY'}") // 'currentAtr': '" + str.tostring(){{atr(p)}}+ "' -// alertcondition(startShortTrade, "Sell Alert", "{'actionType': 'SELL'}") - -// alertcondition(endLongTrade, "Stop Buy Alert", "{'actionType': 'STOP_BUY'}") -// alertcondition(endShortTrade, "Stop Sell Alert", "{'actionType': 'STOP_SELL'}") diff --git a/resources/experiments/pine_scripts/Machine Learning-kNN (New Approach) (edited by Fortesense Labs).pine b/resources/experiments/pine_scripts/Machine Learning-kNN (New Approach) (edited by Fortesense Labs).pine deleted file mode 100644 index fcca9f7..0000000 --- a/resources/experiments/pine_scripts/Machine Learning-kNN (New Approach) (edited by Fortesense Labs).pine +++ /dev/null @@ -1,119 +0,0 @@ -// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ -// © capissimo [Machine Learning: kNN (New Approach) by capissimo copy] - -//@version=5 -indicator("Custom kNN (New Approach)", '', true, format=format.price, precision=5, timeframe="", timeframe_gaps=true) - -// "Machine Learning: kNN (New Approach) -// kNN is a very robust and simple method for data classification and prediction. It is very -// effective if the training data is large. However, it is distinguished by difficulty at -// determining its main parameter, K (a number of nearest neighbors), beforehand. The -// computation cost is also quite high because we need to compute distance of each instance -// to all training samples. Nevertheless, in algorithmic trading KNN is reported to perform -// on a par with such techniques as SVM and Random Forest. It is also widely used in the area -// of data science. - -// The input data is just a long series of prices over time without any particular features. -// The value to be predicted is just the next bar's price. The way that this problem is -// solved for both nearest neighbor techniques and for some other types of prediction -// algorithms is to create training records by taking, for instance, 10 consecutive prices -// and using the first 9 as predictor values and the 10th as the prediction value. -// Doing this way, given 100 data points in your time series you could create 10 different -// training records. It's possible to create even more training records than 10 by creating -// a new record starting at every data point. For instance, you could take the first 10 data -// points and create a record. Then you could take the 10 consecutive data points starting at -// the second data point, the 10 consecutive data points starting at the third data point, etc. - -// By default, shown are only 10 initial data points as predictor values and the 6th as the -// prediction value. - -// Here is a step-by-step workthrough on how to compute K nearest neighbors (KNN) algorithm for -// quantitative data: - -// 1. Determine parameter K = number of nearest neighbors. -// 2. Calculate the distance between the instance and all the training samples. As we are -// dealing with one-dimensional distance, we simply take absolute value from the instance to -// value of x (| x – v |). -// 3. Rank the distance and determine nearest neighbors based on the K'th minimum distance. -// 4. Gather the values of the nearest neighbors. -// 5. Use average of nearest neighbors as the prediction value of the instance. - -// The original logic of the algorithm was slightly modified, and as a result at approx. N=17 -// the resulting curve nicely approximates that of the sma(20). See the description below. -// Beside the sma-like MA this algorithm also gives you a hint on the direction of the next bar -// move. - -//-- Inputs - -TF = input.timeframe('1', 'Resolution', ['1','3','5','10','15','30','45','60','120','180','240','480','D','W','M']) -N = input.int (14, '# of Data Points [2:n]', 2) -K = input.int (50, '# of Nearest Neighbors (K) [1:252]', 1, 252) -ADJ = input.bool (true, 'Adjust Prediction', inline='b') -REP = input.bool (false, 'Non-Repainting', inline='b') -ADDON = input.string ('Pivot Point', 'Add-On', ['None','Pivot Point','Z-Score']) -LAGP = input.int (5, 'Pivot Point Lag [2:n] if selected', 2) -LAGZ = input.int (20, 'Z-Score Lag [2:n] if selected', 2) -DISP = input.string ('Both', 'Show Outcomes', ['Curve','Predict','Both']) -ODS = input.source (hlcc4, 'Projection Base') - -//-- Functions - -knn(data) => //-- calculate nearest neighbors (if any) - nearest_neighbors = array.new_float(0) - distances = array.new_float(0) - - for i = 0 to N-1 - float d = math.abs(data[i] - data[i+1]) - //-- euclidean will do just as well - // float d = math.sqrt(math.pow(data[i] - data[i+1], 2)) - array.push(distances, d) - int size = array.size(distances) - - //-- The original logic was too funky, imho :-) - // float new_neighbor = dK?K:0)?data[i+1]:0 - // if new_neighbor > 0 - // array.push(nearest_neighbors, new_neighbor) - //-- The following logic reasonably smooths the outcome! - float new_neighbor = dK?K:0)?data[i+1]:data[i] - array.push(nearest_neighbors, new_neighbor) - - nearest_neighbors - -predict(neighbors, data) => //-- predict the expected price and calculate next bar's direction - float prediction = array.avg(neighbors) - int direction = prediction < data[ADJ?0:1] ? 1 : prediction > data[ADJ?0:1] ? -1 : 0 - [prediction, direction] - -green(g) => g>9 ? #006400 : g>8 ? #1A741A : g>7 ? #338333 : g>6 ? #4D934D : g>5 ? #66A266 : g>4 ? #80B280 : g>3 ? #99C199 : g>2 ? #B3D1B3 : g>1? #CCE0CC : #E6F0E6 -red(g) => g>9 ? #E00000 : g>8 ? #E31A1A : g>7 ? #E63333 : g>6 ? #E94D4D : g>5 ? #EC6666 : g>4 ? #F08080 : g>3 ? #F39999 : g>2 ? #F6B3B3 : g>1? #F9CCCC : #FCE6E6 - -ordinary_color(dir) => - dir==1?green(9):dir==-1?red(9):na - -pivot_color(h,l, p, dir) => - ph = ta.highestbars(h, LAGP)==0 ? h : na - pl = ta.lowestbars(l, LAGP)==0 ? l : na - ph and dir==1 ? green(9) : pl and dir==-1 ? red(9):na - -zscore_color(data, p, dir) => - zs = (data - ta.sma(data, p)) / ta.stdev(data, p) // standardize - zs/(p/5)>0 and dir==1 ? green(9) : zs/(p/5)<0 and dir==-1 ? red(9) : na - -//-- Logic - -rep = REP?1:0 -[O,H,L,C] = request.security('', TF, [open,high[rep],low[rep],close[rep]]) -nn = knn(C) -[pred,dir] = predict(nn, C) -clr = ADDON=='Z-Score'?zscore_color(C, LAGZ, dir):ADDON=='Pivot Point'?pivot_color(H,L,LAGP, dir):ordinary_color(dir) - -//-- Visuals - -//plot(ta.sma(close,20)) -plot(DISP=='Curve' or DISP=='Both' ? pred : na, 'kNN Curve', clr, 3, offset=0) -plot(DISP=='Predict' or DISP=='Both' ? ODS : na, 'Prediction', clr, 5, plot.style_circles, offset=2, show_last=1) - -// plot(pred[5], linewidth = 12) -// alert -// ODS and clr [color series] -// alert(ODS) diff --git a/resources/experiments/pine_scripts/README.md b/resources/experiments/pine_scripts/README.md deleted file mode 100644 index 8d00b35..0000000 --- a/resources/experiments/pine_scripts/README.md +++ /dev/null @@ -1,8 +0,0 @@ - -## Links -- https://www.mql5.com/en/market/product/93461?source=External -- https://www.tradingview.com/script/5ERKwGoq-FVG-Sessions-LuxAlgo/ -- https://fr.tradingview.com/script/ib4uqBJx-ICT-Concepts-LuxAlgo/ - - -OPENAI_API_KEY=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 diff --git a/resources/experiments/pine_scripts/SMC_mt5_black.tpl b/resources/experiments/pine_scripts/SMC_mt5_black.tpl deleted file mode 100644 index 7f797df..0000000 Binary files a/resources/experiments/pine_scripts/SMC_mt5_black.tpl and /dev/null differ diff --git a/resources/experiments/pine_scripts/Smart Money Concepts [LuxAlgo] by LuxAlgo copy.pine b/resources/experiments/pine_scripts/Smart Money Concepts [LuxAlgo] by LuxAlgo copy.pine deleted file mode 100644 index e707918..0000000 --- a/resources/experiments/pine_scripts/Smart Money Concepts [LuxAlgo] by LuxAlgo copy.pine +++ /dev/null @@ -1,1041 +0,0 @@ -// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/ -// © LuxAlgo - -//@version=5 -indicator("Smart Money Concepts [LUX]", "Smart Money Concepts [LuxAlgo]" - , overlay = true - , max_labels_count = 500 - , max_lines_count = 500 - , max_boxes_count = 500 - , max_bars_back = 500) -//-----------------------------------------------------------------------------{ -//Constants -//-----------------------------------------------------------------------------{ -color TRANSP_CSS = #ffffff00 - -//Tooltips -string MODE_TOOLTIP = 'Allows to display historical Structure or only the recent ones' -string STYLE_TOOLTIP = 'Indicator color theme' -string COLOR_CANDLES_TOOLTIP = 'Display additional candles with a color reflecting the current trend detected by structure' -string SHOW_INTERNAL = 'Display internal market structure' -string CONFLUENCE_FILTER = 'Filter non significant internal structure breakouts' -string SHOW_SWING = 'Display swing market Structure' -string SHOW_SWING_POINTS = 'Display swing point as labels on the chart' -string SHOW_SWHL_POINTS = 'Highlight most recent strong and weak high/low points on the chart' -string INTERNAL_OB = 'Display internal order blocks on the chart\n\nNumber of internal order blocks to display on the chart' -string SWING_OB = 'Display swing order blocks on the chart\n\nNumber of internal swing blocks to display on the chart' -string FILTER_OB = 'Method used to filter out volatile order blocks \n\nIt is recommended to use the cumulative mean range method when a low amount of data is available' -string SHOW_EQHL = 'Display equal highs and equal lows on the chart' -string EQHL_BARS = 'Number of bars used to confirm equal highs and equal lows' -string EQHL_THRESHOLD = 'Sensitivity threshold in a range (0, 1) used for the detection of equal highs & lows\n\nLower values will return fewer but more pertinent results' -string SHOW_FVG = 'Display fair values gaps on the chart' -string AUTO_FVG = 'Filter out non significant fair value gaps' -string FVG_TF = 'Fair value gaps timeframe' -string EXTEND_FVG = 'Determine how many bars to extend the Fair Value Gap boxes on chart' -string PED_ZONES = 'Display premium, discount, and equilibrium zones on chart' - -//-----------------------------------------------------------------------------{ -//Settings -//-----------------------------------------------------------------------------{ -//General -//----------------------------------------{ -mode = input.string('Historical' - , options = ['Historical', 'Present'] - , group = 'Smart Money Concepts' - , tooltip = MODE_TOOLTIP) - -style = input.string('Colored' - , options = ['Colored', 'Monochrome'] - , group = 'Smart Money Concepts' - , tooltip = STYLE_TOOLTIP) - -show_trend = input(false, 'Color Candles' - , group = 'Smart Money Concepts' - , tooltip = COLOR_CANDLES_TOOLTIP) - -//----------------------------------------} -//Internal Structure -//----------------------------------------{ -show_internals = input(true, 'Show Internal Structure' - , group = 'Real Time Internal Structure' - , tooltip = SHOW_INTERNAL) - -show_ibull = input.string('All', 'Bullish Structure' - , options = ['All', 'BOS', 'CHoCH'] - , inline = 'ibull' - , group = 'Real Time Internal Structure') - -swing_ibull_css = input(#089981, '' - , inline = 'ibull' - , group = 'Real Time Internal Structure') - -//Bear Structure -show_ibear = input.string('All', 'Bearish Structure' - , options = ['All', 'BOS', 'CHoCH'] - , inline = 'ibear' - , group = 'Real Time Internal Structure') - -swing_ibear_css = input(#f23645, '' - , inline = 'ibear' - , group = 'Real Time Internal Structure') - -ifilter_confluence = input(false, 'Confluence Filter' - , group = 'Real Time Internal Structure' - , tooltip = CONFLUENCE_FILTER) - -//----------------------------------------} -//Swing Structure -//----------------------------------------{ -show_Structure = input(true, 'Show Swing Structure' - , group = 'Real Time Swing Structure' - , tooltip = SHOW_SWING) - -//Bull Structure -show_bull = input.string('All', 'Bullish Structure' - , options = ['All', 'BOS', 'CHoCH'] - , inline = 'bull' - , group = 'Real Time Swing Structure') - -swing_bull_css = input(#089981, '' - , inline = 'bull' - , group = 'Real Time Swing Structure') - -//Bear Structure -show_bear = input.string('All', 'Bearish Structure' - , options = ['All', 'BOS', 'CHoCH'] - , inline = 'bear' - , group = 'Real Time Swing Structure') - -swing_bear_css = input(#f23645, '' - , inline = 'bear' - , group = 'Real Time Swing Structure') - -//Swings -show_swings = input(false, 'Show Swings Points' - , inline = 'swings' - , group = 'Real Time Swing Structure' - , tooltip = SHOW_SWING_POINTS) - -length = input.int(50, '' - , minval = 10 - , inline = 'swings' - , group = 'Real Time Swing Structure') - -show_hl_swings = input(true, 'Show Strong/Weak High/Low' - , group = 'Real Time Swing Structure' - , tooltip = SHOW_SWHL_POINTS) - -//----------------------------------------} -//Order Blocks -//----------------------------------------{ -show_iob = input(true, 'Internal Order Blocks' - , inline = 'iob' - , group = 'Order Blocks' - , tooltip = INTERNAL_OB) - -iob_showlast = input.int(5, '' - , minval = 1 - , inline = 'iob' - , group = 'Order Blocks') - -show_ob = input(false, 'Swing Order Blocks' - , inline = 'ob' - , group = 'Order Blocks' - , tooltip = SWING_OB) - -ob_showlast = input.int(5, '' - , minval = 1 - , inline = 'ob' - , group = 'Order Blocks') - -ob_filter = input.string('Atr', 'Order Block Filter' - , options = ['Atr', 'Cumulative Mean Range'] - , group = 'Order Blocks' - , tooltip = FILTER_OB) - -ibull_ob_css = input.color(color.new(#3179f5, 80), 'Internal Bullish OB' - , group = 'Order Blocks') - -ibear_ob_css = input.color(color.new(#f77c80, 80), 'Internal Bearish OB' - , group = 'Order Blocks') - -bull_ob_css = input.color(color.new(#1848cc, 80), 'Bullish OB' - , group = 'Order Blocks') - -bear_ob_css = input.color(color.new(#b22833, 80), 'Bearish OB' - , group = 'Order Blocks') - -//----------------------------------------} -//EQH/EQL -//----------------------------------------{ -show_eq = input(true, 'Equal High/Low' - , group = 'EQH/EQL' - , tooltip = SHOW_EQHL) - -eq_len = input.int(3, 'Bars Confirmation' - , minval = 1 - , group = 'EQH/EQL' - , tooltip = EQHL_BARS) - -eq_threshold = input.float(0.1, 'Threshold' - , minval = 0 - , maxval = 0.5 - , step = 0.1 - , group = 'EQH/EQL' - , tooltip = EQHL_THRESHOLD) - -//----------------------------------------} -//Fair Value Gaps -//----------------------------------------{ -show_fvg = input(false, 'Fair Value Gaps' - , group = 'Fair Value Gaps' - , tooltip = SHOW_FVG) - -fvg_auto = input(true, "Auto Threshold" - , group = 'Fair Value Gaps' - , tooltip = AUTO_FVG) - -fvg_tf = input.timeframe('', "Timeframe" - , group = 'Fair Value Gaps' - , tooltip = FVG_TF) - -bull_fvg_css = input.color(color.new(#00ff68, 70), 'Bullish FVG' - , group = 'Fair Value Gaps') - -bear_fvg_css = input.color(color.new(#ff0008, 70), 'Bearish FVG' - , group = 'Fair Value Gaps') - -fvg_extend = input.int(1, "Extend FVG" - , minval = 0 - , group = 'Fair Value Gaps' - , tooltip = EXTEND_FVG) - -//----------------------------------------} -//Previous day/week high/low -//----------------------------------------{ -//Daily -show_pdhl = input(false, 'Daily' - , inline = 'daily' - , group = 'Highs & Lows MTF') - -pdhl_style = input.string('⎯⎯⎯', '' - , options = ['⎯⎯⎯', '----', '····'] - , inline = 'daily' - , group = 'Highs & Lows MTF') - -pdhl_css = input(#2157f3, '' - , inline = 'daily' - , group = 'Highs & Lows MTF') - -//Weekly -show_pwhl = input(false, 'Weekly' - , inline = 'weekly' - , group = 'Highs & Lows MTF') - -pwhl_style = input.string('⎯⎯⎯', '' - , options = ['⎯⎯⎯', '----', '····'] - , inline = 'weekly' - , group = 'Highs & Lows MTF') - -pwhl_css = input(#2157f3, '' - , inline = 'weekly' - , group = 'Highs & Lows MTF') - -//Monthly -show_pmhl = input(false, 'Monthly' - , inline = 'monthly' - , group = 'Highs & Lows MTF') - -pmhl_style = input.string('⎯⎯⎯', '' - , options = ['⎯⎯⎯', '----', '····'] - , inline = 'monthly' - , group = 'Highs & Lows MTF') - -pmhl_css = input(#2157f3, '' - , inline = 'monthly' - , group = 'Highs & Lows MTF') - -//----------------------------------------} -//Premium/Discount zones -//----------------------------------------{ -show_sd = input(false, 'Premium/Discount Zones' - , group = 'Premium & Discount Zones' - , tooltip = PED_ZONES) - -premium_css = input.color(#f23645, 'Premium Zone' - , group = 'Premium & Discount Zones') - -eq_css = input.color(#b2b5be, 'Equilibrium Zone' - , group = 'Premium & Discount Zones') - -discount_css = input.color(#089981, 'Discount Zone' - , group = 'Premium & Discount Zones') - -//-----------------------------------------------------------------------------} -//Functions -//-----------------------------------------------------------------------------{ -n = bar_index - -atr = ta.atr(200) -cmean_range = ta.cum(high - low) / n - -//HL Output function -hl() => [high, low] - -//Get ohlc values function -get_ohlc()=> [close[1], open[1], high, low, high[2], low[2]] - -//Display Structure function -display_Structure(x, y, txt, css, dashed, down, lbl_size)=> - structure_line = line.new(x, y, n, y - , color = css - , style = dashed ? line.style_dashed : line.style_solid) - - structure_lbl = label.new(int(math.avg(x, n)), y, txt - , color = TRANSP_CSS - , textcolor = css - , style = down ? label.style_label_down : label.style_label_up - , size = lbl_size) - - if mode == 'Present' - line.delete(structure_line[1]) - label.delete(structure_lbl[1]) - -//Swings detection/measurements -swings(len)=> - var os = 0 - - upper = ta.highest(len) - lower = ta.lowest(len) - - os := high[len] > upper ? 0 : low[len] < lower ? 1 : os[1] - - top = os == 0 and os[1] != 0 ? high[len] : 0 - btm = os == 1 and os[1] != 1 ? low[len] : 0 - - [top, btm] - -//Order block coordinates function -ob_coord(use_max, loc, target_top, target_btm, target_left, target_type)=> - min = 99999999. - max = 0. - idx = 1 - - ob_threshold = ob_filter == 'Atr' ? atr : cmean_range - - //Search for highest/lowest high within the structure interval and get range - if use_max - for i = 1 to (n - loc)-1 - if (high[i] - low[i]) < ob_threshold[i] * 2 - max := math.max(high[i], max) - min := max == high[i] ? low[i] : min - idx := max == high[i] ? i : idx - else - for i = 1 to (n - loc)-1 - if (high[i] - low[i]) < ob_threshold[i] * 2 - min := math.min(low[i], min) - max := min == low[i] ? high[i] : max - idx := min == low[i] ? i : idx - - array.unshift(target_top, max) - array.unshift(target_btm, min) - array.unshift(target_left, time[idx]) - array.unshift(target_type, use_max ? -1 : 1) - -//Set order blocks -display_ob(boxes, target_top, target_btm, target_left, target_type, show_last, swing, size)=> - for i = 0 to math.min(show_last-1, size-1) - get_box = array.get(boxes, i) - - box.set_lefttop(get_box, array.get(target_left, i), array.get(target_top, i)) - box.set_rightbottom(get_box, array.get(target_left, i), array.get(target_btm, i)) - box.set_extend(get_box, extend.right) - - color css = na - - if swing - if style == 'Monochrome' - css := array.get(target_type, i) == 1 ? color.new(#b2b5be, 80) : color.new(#5d606b, 80) - border_css = array.get(target_type, i) == 1 ? #b2b5be : #5d606b - box.set_border_color(get_box, border_css) - else - css := array.get(target_type, i) == 1 ? bull_ob_css : bear_ob_css - box.set_border_color(get_box, css) - - box.set_bgcolor(get_box, css) - else - if style == 'Monochrome' - css := array.get(target_type, i) == 1 ? color.new(#b2b5be, 80) : color.new(#5d606b, 80) - else - css := array.get(target_type, i) == 1 ? ibull_ob_css : ibear_ob_css - - box.set_border_color(get_box, css) - box.set_bgcolor(get_box, css) - -//Line Style function -get_line_style(style) => - out = switch style - '⎯⎯⎯' => line.style_solid - '----' => line.style_dashed - '····' => line.style_dotted - -//Set line/labels function for previous high/lows -phl(h, l, tf, css)=> - var line high_line = line.new(na,na,na,na - , xloc = xloc.bar_time - , color = css - , style = get_line_style(pdhl_style)) - - var label high_lbl = label.new(na,na - , xloc = xloc.bar_time - , text = str.format('P{0}H', tf) - , color = TRANSP_CSS - , textcolor = css - , size = size.small - , style = label.style_label_left) - - var line low_line = line.new(na,na,na,na - , xloc = xloc.bar_time - , color = css - , style = get_line_style(pdhl_style)) - - var label low_lbl = label.new(na,na - , xloc = xloc.bar_time - , text = str.format('P{0}L', tf) - , color = TRANSP_CSS - , textcolor = css - , size = size.small - , style = label.style_label_left) - - hy = ta.valuewhen(h != h[1], h, 1) - hx = ta.valuewhen(h == high, time, 1) - - ly = ta.valuewhen(l != l[1], l, 1) - lx = ta.valuewhen(l == low, time, 1) - - if barstate.islast - ext = time + (time - time[1])*20 - - //High - line.set_xy1(high_line, hx, hy) - line.set_xy2(high_line, ext, hy) - - label.set_xy(high_lbl, ext, hy) - - //Low - line.set_xy1(low_line, lx, ly) - line.set_xy2(low_line, ext, ly) - - label.set_xy(low_lbl, ext, ly) - -//-----------------------------------------------------------------------------} -//Global variables -//-----------------------------------------------------------------------------{ -var trend = 0, var itrend = 0 - -var top_y = 0., var top_x = 0 -var btm_y = 0., var btm_x = 0 - -var itop_y = 0., var itop_x = 0 -var ibtm_y = 0., var ibtm_x = 0 - -var trail_up = high, var trail_dn = low -var trail_up_x = 0, var trail_dn_x = 0 - -var top_cross = true, var btm_cross = true -var itop_cross = true, var ibtm_cross = true - -var txt_top = '', var txt_btm = '' - -//Alerts -bull_choch_alert = false -bull_bos_alert = false - -bear_choch_alert = false -bear_bos_alert = false - -bull_ichoch_alert = false -bull_ibos_alert = false - -bear_ichoch_alert = false -bear_ibos_alert = false - -bull_iob_break = false -bear_iob_break = false - -bull_ob_break = false -bear_ob_break = false - -eqh_alert = false -eql_alert = false - -//Structure colors -var bull_css = style == 'Monochrome' ? #b2b5be - : swing_bull_css - -var bear_css = style == 'Monochrome' ? #b2b5be - : swing_bear_css - -var ibull_css = style == 'Monochrome' ? #b2b5be - : swing_ibull_css - -var ibear_css = style == 'Monochrome' ? #b2b5be - : swing_ibear_css - -//Swings -[top, btm] = swings(length) - -[itop, ibtm] = swings(5) - -//-----------------------------------------------------------------------------} -//Pivot High -//-----------------------------------------------------------------------------{ -var line extend_top = na - -var label extend_top_lbl = label.new(na, na - , color = TRANSP_CSS - , textcolor = bear_css - , style = label.style_label_down - , size = size.tiny) - -if top - top_cross := true - txt_top := top > top_y ? 'HH' : 'LH' - - if show_swings - top_lbl = label.new(n-length, top, txt_top - , color = TRANSP_CSS - , textcolor = bear_css - , style = label.style_label_down - , size = size.small) - - if mode == 'Present' - label.delete(top_lbl[1]) - - //Extend recent top to last bar - line.delete(extend_top[1]) - extend_top := line.new(n-length, top, n, top - , color = bear_css) - - top_y := top - top_x := n - length - - trail_up := top - trail_up_x := n - length - -if itop - itop_cross := true - - itop_y := itop - itop_x := n - 5 - -//Trailing maximum -trail_up := math.max(high, trail_up) -trail_up_x := trail_up == high ? n : trail_up_x - -//Set top extension label/line -if barstate.islast and show_hl_swings - line.set_xy1(extend_top, trail_up_x, trail_up) - line.set_xy2(extend_top, n + 20, trail_up) - - label.set_x(extend_top_lbl, n + 20) - label.set_y(extend_top_lbl, trail_up) - label.set_text(extend_top_lbl, trend < 0 ? 'Strong High' : 'Weak High') - -//-----------------------------------------------------------------------------} -//Pivot Low -//-----------------------------------------------------------------------------{ -var line extend_btm = na - -var label extend_btm_lbl = label.new(na, na - , color = TRANSP_CSS - , textcolor = bull_css - , style = label.style_label_up - , size = size.tiny) - -if btm - btm_cross := true - txt_btm := btm < btm_y ? 'LL' : 'HL' - - if show_swings - btm_lbl = label.new(n - length, btm, txt_btm - , color = TRANSP_CSS - , textcolor = bull_css - , style = label.style_label_up - , size = size.small) - - if mode == 'Present' - label.delete(btm_lbl[1]) - - //Extend recent btm to last bar - line.delete(extend_btm[1]) - extend_btm := line.new(n - length, btm, n, btm - , color = bull_css) - - btm_y := btm - btm_x := n-length - - trail_dn := btm - trail_dn_x := n-length - -if ibtm - ibtm_cross := true - - ibtm_y := ibtm - ibtm_x := n - 5 - -//Trailing minimum -trail_dn := math.min(low, trail_dn) -trail_dn_x := trail_dn == low ? n : trail_dn_x - -//Set btm extension label/line -if barstate.islast and show_hl_swings - line.set_xy1(extend_btm, trail_dn_x, trail_dn) - line.set_xy2(extend_btm, n + 20, trail_dn) - - label.set_x(extend_btm_lbl, n + 20) - label.set_y(extend_btm_lbl, trail_dn) - label.set_text(extend_btm_lbl, trend > 0 ? 'Strong Low' : 'Weak Low') - -//-----------------------------------------------------------------------------} -//Order Blocks Arrays -//-----------------------------------------------------------------------------{ -var iob_top = array.new_float(0) -var iob_btm = array.new_float(0) -var iob_left = array.new_int(0) -var iob_type = array.new_int(0) - -var ob_top = array.new_float(0) -var ob_btm = array.new_float(0) -var ob_left = array.new_int(0) -var ob_type = array.new_int(0) - -//-----------------------------------------------------------------------------} -//Pivot High BOS/CHoCH -//-----------------------------------------------------------------------------{ -//Filtering -var bull_concordant = true - -if ifilter_confluence - bull_concordant := high - math.max(close, open) > math.min(close, open - low) - -//Detect internal bullish Structure -if ta.crossover(close, itop_y) and itop_cross and top_y != itop_y and bull_concordant - bool choch = na - - if itrend < 0 - choch := true - bull_ichoch_alert := true - else - bull_ibos_alert := true - - txt = choch ? 'CHoCH' : 'BOS' - - if show_internals - if show_ibull == 'All' or (show_ibull == 'BOS' and not choch) or (show_ibull == 'CHoCH' and choch) - display_Structure(itop_x, itop_y, txt, ibull_css, true, true, size.tiny) - - itop_cross := false - itrend := 1 - - //Internal Order Block - if show_iob - ob_coord(false, itop_x, iob_top, iob_btm, iob_left, iob_type) - -//Detect bullish Structure -if ta.crossover(close, top_y) and top_cross - bool choch = na - - if trend < 0 - choch := true - bull_choch_alert := true - else - bull_bos_alert := true - - txt = choch ? 'CHoCH' : 'BOS' - - if show_Structure - if show_bull == 'All' or (show_bull == 'BOS' and not choch) or (show_bull == 'CHoCH' and choch) - display_Structure(top_x, top_y, txt, bull_css, false, true, size.small) - - //Order Block - if show_ob - ob_coord(false, top_x, ob_top, ob_btm, ob_left, ob_type) - - top_cross := false - trend := 1 - -//-----------------------------------------------------------------------------} -//Pivot Low BOS/CHoCH -//-----------------------------------------------------------------------------{ -var bear_concordant = true - -if ifilter_confluence - bear_concordant := high - math.max(close, open) < math.min(close, open - low) - -//Detect internal bearish Structure -if ta.crossunder(close, ibtm_y) and ibtm_cross and btm_y != ibtm_y and bear_concordant - bool choch = false - - if itrend > 0 - choch := true - bear_ichoch_alert := true - else - bear_ibos_alert := true - - txt = choch ? 'CHoCH' : 'BOS' - - if show_internals - if show_ibear == 'All' or (show_ibear == 'BOS' and not choch) or (show_ibear == 'CHoCH' and choch) - display_Structure(ibtm_x, ibtm_y, txt, ibear_css, true, false, size.tiny) - - ibtm_cross := false - itrend := -1 - - //Internal Order Block - if show_iob - ob_coord(true, ibtm_x, iob_top, iob_btm, iob_left, iob_type) - -//Detect bearish Structure -if ta.crossunder(close, btm_y) and btm_cross - bool choch = na - - if trend > 0 - choch := true - bear_choch_alert := true - else - bear_bos_alert := true - - txt = choch ? 'CHoCH' : 'BOS' - - if show_Structure - if show_bear == 'All' or (show_bear == 'BOS' and not choch) or (show_bear == 'CHoCH' and choch) - display_Structure(btm_x, btm_y, txt, bear_css, false, false, size.small) - - //Order Block - if show_ob - ob_coord(true, btm_x, ob_top, ob_btm, ob_left, ob_type) - - btm_cross := false - trend := -1 - -//-----------------------------------------------------------------------------} -//Order Blocks -//-----------------------------------------------------------------------------{ -//Set order blocks -var iob_boxes = array.new_box(0) -var ob_boxes = array.new_box(0) - -//Delete internal order blocks box coordinates if top/bottom is broken -for element in iob_type - index = array.indexof(iob_type, element) - - if close < array.get(iob_btm, index) and element == 1 - array.remove(iob_top, index) - array.remove(iob_btm, index) - array.remove(iob_left, index) - array.remove(iob_type, index) - bull_iob_break := true - - else if close > array.get(iob_top, index) and element == -1 - array.remove(iob_top, index) - array.remove(iob_btm, index) - array.remove(iob_left, index) - array.remove(iob_type, index) - bear_iob_break := true - -//Delete internal order blocks box coordinates if top/bottom is broken -for element in ob_type - index = array.indexof(ob_type, element) - - if close < array.get(ob_btm, index) and element == 1 - array.remove(ob_top, index) - array.remove(ob_btm, index) - array.remove(ob_left, index) - array.remove(ob_type, index) - bull_ob_break := true - - else if close > array.get(ob_top, index) and element == -1 - array.remove(ob_top, index) - array.remove(ob_btm, index) - array.remove(ob_left, index) - array.remove(ob_type, index) - bear_ob_break := true - -iob_size = array.size(iob_type) -ob_size = array.size(ob_type) - -if barstate.isfirst - if show_iob - for i = 0 to iob_showlast-1 - array.push(iob_boxes, box.new(na,na,na,na, xloc = xloc.bar_time)) - if show_ob - for i = 0 to ob_showlast-1 - array.push(ob_boxes, box.new(na,na,na,na, xloc = xloc.bar_time)) - -if iob_size > 0 - if barstate.islast - display_ob(iob_boxes, iob_top, iob_btm, iob_left, iob_type, iob_showlast, false, iob_size) - -if ob_size > 0 - if barstate.islast - display_ob(ob_boxes, ob_top, ob_btm, ob_left, ob_type, ob_showlast, true, ob_size) - -//-----------------------------------------------------------------------------} -//EQH/EQL -//-----------------------------------------------------------------------------{ -var eq_prev_top = 0. -var eq_top_x = 0 - -var eq_prev_btm = 0. -var eq_btm_x = 0 - -if show_eq - eq_top = ta.pivothigh(eq_len, eq_len) - eq_btm = ta.pivotlow(eq_len, eq_len) - - if eq_top - max = math.max(eq_top, eq_prev_top) - min = math.min(eq_top, eq_prev_top) - - if max < min + atr * eq_threshold - eqh_line = line.new(eq_top_x, eq_prev_top, n-eq_len, eq_top - , color = bear_css - , style = line.style_dotted) - - eqh_lbl = label.new(int(math.avg(n-eq_len, eq_top_x)), eq_top, 'EQH' - , color = #00000000 - , textcolor = bear_css - , style = label.style_label_down - , size = size.tiny) - - if mode == 'Present' - line.delete(eqh_line[1]) - label.delete(eqh_lbl[1]) - - eqh_alert := true - - eq_prev_top := eq_top - eq_top_x := n-eq_len - - if eq_btm - max = math.max(eq_btm, eq_prev_btm) - min = math.min(eq_btm, eq_prev_btm) - - if min > max - atr * eq_threshold - eql_line = line.new(eq_btm_x, eq_prev_btm, n-eq_len, eq_btm - , color = bull_css - , style = line.style_dotted) - - eql_lbl = label.new(int(math.avg(n-eq_len, eq_btm_x)), eq_btm, 'EQL' - , color = #00000000 - , textcolor = bull_css - , style = label.style_label_up - , size = size.tiny) - - eql_alert := true - - if mode == 'Present' - line.delete(eql_line[1]) - label.delete(eql_lbl[1]) - - eq_prev_btm := eq_btm - eq_btm_x := n-eq_len - -//-----------------------------------------------------------------------------} -//Fair Value Gaps -//-----------------------------------------------------------------------------{ -var bullish_fvg_max = array.new_box(0) -var bullish_fvg_min = array.new_box(0) - -var bearish_fvg_max = array.new_box(0) -var bearish_fvg_min = array.new_box(0) - -float bullish_fvg_avg = na -float bearish_fvg_avg = na - -bullish_fvg_cnd = false -bearish_fvg_cnd = false - -[src_c1, src_o1, src_h, src_l, src_h2, src_l2] = - request.security(syminfo.tickerid, fvg_tf, get_ohlc()) - -if show_fvg - delta_per = (src_c1 - src_o1) / src_o1 * 100 - - change_tf = timeframe.change(fvg_tf) - - threshold = fvg_auto ? ta.cum(math.abs(change_tf ? delta_per : 0)) / n * 2 - : 0 - - //FVG conditions - bullish_fvg_cnd := src_l > src_h2 - and src_c1 > src_h2 - and delta_per > threshold - and change_tf - - bearish_fvg_cnd := src_h < src_l2 - and src_c1 < src_l2 - and -delta_per > threshold - and change_tf - - //FVG Areas - if bullish_fvg_cnd - array.unshift(bullish_fvg_max, box.new(n-1, src_l, n + fvg_extend, math.avg(src_l, src_h2) - , border_color = bull_fvg_css - , bgcolor = bull_fvg_css)) - - array.unshift(bullish_fvg_min, box.new(n-1, math.avg(src_l, src_h2), n + fvg_extend, src_h2 - , border_color = bull_fvg_css - , bgcolor = bull_fvg_css)) - - if bearish_fvg_cnd - array.unshift(bearish_fvg_max, box.new(n-1, src_h, n + fvg_extend, math.avg(src_h, src_l2) - , border_color = bear_fvg_css - , bgcolor = bear_fvg_css)) - - array.unshift(bearish_fvg_min, box.new(n-1, math.avg(src_h, src_l2), n + fvg_extend, src_l2 - , border_color = bear_fvg_css - , bgcolor = bear_fvg_css)) - - for bx in bullish_fvg_min - if low < box.get_bottom(bx) - box.delete(bx) - box.delete(array.get(bullish_fvg_max, array.indexof(bullish_fvg_min, bx))) - - for bx in bearish_fvg_max - if high > box.get_top(bx) - box.delete(bx) - box.delete(array.get(bearish_fvg_min, array.indexof(bearish_fvg_max, bx))) - -//-----------------------------------------------------------------------------} -//Previous day/week high/lows -//-----------------------------------------------------------------------------{ -//Daily high/low -[pdh, pdl] = request.security(syminfo.tickerid, 'D', hl() - , lookahead = barmerge.lookahead_on) - -//Weekly high/low -[pwh, pwl] = request.security(syminfo.tickerid, 'W', hl() - , lookahead = barmerge.lookahead_on) - -//Monthly high/low -[pmh, pml] = request.security(syminfo.tickerid, 'M', hl() - , lookahead = barmerge.lookahead_on) - -//Display Daily -if show_pdhl - phl(pdh, pdl, 'D', pdhl_css) - -//Display Weekly -if show_pwhl - phl(pwh, pwl, 'W', pwhl_css) - -//Display Monthly -if show_pmhl - phl(pmh, pml, 'M', pmhl_css) - -//-----------------------------------------------------------------------------} -//Premium/Discount/Equilibrium zones -//-----------------------------------------------------------------------------{ -var premium = box.new(na, na, na, na - , bgcolor = color.new(premium_css, 80) - , border_color = na) - -var premium_lbl = label.new(na, na - , text = 'Premium' - , color = TRANSP_CSS - , textcolor = premium_css - , style = label.style_label_down - , size = size.small) - -var eq = box.new(na, na, na, na - , bgcolor = color.rgb(120, 123, 134, 80) - , border_color = na) - -var eq_lbl = label.new(na, na - , text = 'Equilibrium' - , color = TRANSP_CSS - , textcolor = eq_css - , style = label.style_label_left - , size = size.small) - -var discount = box.new(na, na, na, na - , bgcolor = color.new(discount_css, 80) - , border_color = na) - -var discount_lbl = label.new(na, na - , text = 'Discount' - , color = TRANSP_CSS - , textcolor = discount_css - , style = label.style_label_up - , size = size.small) - -//Show Premium/Discount Areas -if barstate.islast and show_sd - avg = math.avg(trail_up, trail_dn) - - box.set_lefttop(premium, math.max(top_x, btm_x), trail_up) - box.set_rightbottom(premium, n, .95 * trail_up + .05 * trail_dn) - - label.set_xy(premium_lbl, int(math.avg(math.max(top_x, btm_x), n)), trail_up) - - box.set_lefttop(eq, math.max(top_x, btm_x), .525 * trail_up + .475*trail_dn) - box.set_rightbottom(eq, n, .525 * trail_dn + .475 * trail_up) - - label.set_xy(eq_lbl, n, avg) - - box.set_lefttop(discount, math.max(top_x, btm_x), .95 * trail_dn + .05 * trail_up) - box.set_rightbottom(discount, n, trail_dn) - label.set_xy(discount_lbl, int(math.avg(math.max(top_x, btm_x), n)), trail_dn) - -//-----------------------------------------------------------------------------} -//Trend -//-----------------------------------------------------------------------------{ -var color trend_css = na - -if show_trend - if style == 'Colored' - trend_css := itrend == 1 ? bull_css : bear_css - else if style == 'Monochrome' - trend_css := itrend == 1 ? #b2b5be : #5d606b - -plotcandle(open, high, low, close - , color = trend_css - , wickcolor = trend_css - , bordercolor = trend_css - , editable = false) - -//-----------------------------------------------------------------------------} -//Alerts -//-----------------------------------------------------------------------------{ -//Internal Structure -alertcondition(bull_ibos_alert, 'Internal Bullish BOS', 'Internal Bullish BOS formed') -alertcondition(bull_ichoch_alert, 'Internal Bullish CHoCH', 'Internal Bullish CHoCH formed') - -alertcondition(bear_ibos_alert, 'Internal Bearish BOS', 'Internal Bearish BOS formed') -alertcondition(bear_ichoch_alert, 'Internal Bearish CHoCH', 'Internal Bearish CHoCH formed') - -//Swing Structure -alertcondition(bull_bos_alert, 'Bullish BOS', 'Internal Bullish BOS formed') -alertcondition(bull_choch_alert, 'Bullish CHoCH', 'Internal Bullish CHoCH formed') - -alertcondition(bear_bos_alert, 'Bearish BOS', 'Bearish BOS formed') -alertcondition(bear_choch_alert, 'Bearish CHoCH', 'Bearish CHoCH formed') - -//order Blocks -alertcondition(bull_iob_break, 'Bullish Internal OB Breakout', 'Price broke bullish iternal OB') -alertcondition(bear_iob_break, 'Bearish Internal OB Breakout', 'Price broke bearish iternal OB') - -alertcondition(bull_ob_break, 'Bullish OB Breakout', 'Price broke bullish iternal OB') -alertcondition(bear_ob_break, 'bearish OB Breakout', 'Price broke bearish iternal OB') - -//EQH/EQL -alertcondition(eqh_alert, 'Equal Highs', 'Equal highs detected') -alertcondition(eql_alert, 'Equal Lows', 'Equal lows detected') - -//FVG -alertcondition(bullish_fvg_cnd, 'Bullish FVG', 'Bullish FVG formed') -alertcondition(bearish_fvg_cnd, 'Bearish FVG', 'Bearish FVG formed') - -//-----------------------------------------------------------------------------} diff --git a/resources/experiments/scripts[Test].zip b/resources/experiments/scripts[Test].zip deleted file mode 100644 index 5aa6498..0000000 Binary files a/resources/experiments/scripts[Test].zip and /dev/null differ diff --git a/resources/experiments/service[MetaTrader5_Lib].zip b/resources/experiments/service[MetaTrader5_Lib].zip deleted file mode 100644 index ffb111c..0000000 Binary files a/resources/experiments/service[MetaTrader5_Lib].zip and /dev/null differ diff --git a/resources/experiments/thunderbird.zip b/resources/experiments/thunderbird.zip deleted file mode 100644 index dda7968..0000000 Binary files a/resources/experiments/thunderbird.zip and /dev/null differ diff --git a/resources/experiments/webservice_DWX.zip b/resources/experiments/webservice_DWX.zip deleted file mode 100644 index 9d63b4e..0000000 Binary files a/resources/experiments/webservice_DWX.zip and /dev/null differ diff --git a/resources/go server/application/adapter/assetprice.go b/resources/go server/application/adapter/assetprice.go deleted file mode 100644 index 7e8f869..0000000 --- a/resources/go server/application/adapter/assetprice.go +++ /dev/null @@ -1,42 +0,0 @@ -// Package adapter is a layer that connects the infrastructure with the application layer -package adapter - -import ( - assetPriceController "github.com/FortesenseLabs/wisefinance-mtservices/application/controllers/assetprice" - assetPriceService "github.com/FortesenseLabs/wisefinance-mtservices/application/services/assetprice" - - barPriceRepository "github.com/FortesenseLabs/wisefinance-mtservices/application/database/barprice" - tickPriceRepository "github.com/FortesenseLabs/wisefinance-mtservices/application/database/tickprice" - - "github.com/FortesenseLabs/wisefinance-mtservices/application/utils/logger" - "gorm.io/gorm" -) - -// AssetPriceAdapter is a function that returns a asset price controller -func AssetPriceAdapter(logger *logger.Logger, db *gorm.DB) *assetPriceController.Controller { - logger.Info("Attaching AssetPrice Adapter...") - - barRepository := barPriceRepository.Repository{ - Name: "BarPriceRepository", - DB: db, - Logger: logger} - - tickRepository := tickPriceRepository.Repository{ - Name: "TickPriceRepository", - DB: db, - Logger: logger} - - // logger.Info("Initialize Cache...") - // cacheDuration := time.Minute * 1 // Cache duration, adjust as needed (1, 3, 5, 10) - // c := cache.New(cacheDuration, cacheDuration) - - service := assetPriceService.Service{ - Name: "AssetPriceService", - BarPriceRepository: barRepository, - TickPriceRepository: tickRepository, - Logger: logger} - return &assetPriceController.Controller{ - Name: "AssetPriceController", - AssetPrice: service, - Logger: logger} -} diff --git a/resources/go server/application/config/Config.go b/resources/go server/application/config/Config.go deleted file mode 100644 index 7cc88d1..0000000 --- a/resources/go server/application/config/Config.go +++ /dev/null @@ -1,45 +0,0 @@ -// parse all configs -package config - -import ( - "fmt" - "log" - - "github.com/spf13/viper" -) - -// Set Config -func (config *Config) Read() error { - filename := "config.json" - - viper.SetConfigFile(filename) - - if err := viper.ReadInConfig(); err != nil { - configErr := fmt.Errorf("failed to read config file: %s", err) - log.Fatalf("%v", configErr) - return configErr - } - - if err := viper.Unmarshal(&config); err != nil { - configErr := fmt.Errorf("failed to unmarshal config: %s", err) - log.Fatalf("%v", configErr) - return configErr - } - - // log.Info(fmt.Sprintf("%+v\n", config)) - return nil -} - -// Get All Configs -func GetAllConfigs() *Config { - var config Config - - // check for development or production environment here - err := config.Read() - if err != nil { - _ = fmt.Errorf("fatal error in config file: %s", err.Error()) - panic(err) - } - - return &config -} diff --git a/resources/go server/application/config/DataBase.go b/resources/go server/application/config/DataBase.go deleted file mode 100644 index 4fdc264..0000000 --- a/resources/go server/application/config/DataBase.go +++ /dev/null @@ -1,47 +0,0 @@ -// Package config provides the database connection -package config - -import ( - "gorm.io/driver/mysql" - "gorm.io/gorm" - "gorm.io/gorm/logger" - "gorm.io/plugin/dbresolver" -) - -// GormOpen is a function that returns a gorm database connection using initial configuration -func GormOpen() (gormDB *gorm.DB, err error) { - var infoDatabase infoDatabaseSQL - - var allConfigs = GetAllConfigs() - - err = infoDatabase.getDiverConn(allConfigs.Databases.MySQL.WiseFinanceDB) - if err != nil { - return nil, err - } - gormDB, err = gorm.Open(mysql.Open(infoDatabase.DriverConn), &gorm.Config{ - PrepareStmt: true, - Logger: logger.Default.LogMode(logger.Silent), - }) - if err != nil { - return - } - - dialector := mysql.New(mysql.Config{ - DSN: infoDatabase.DriverConn, - }) - - err = gormDB.Use(dbresolver.Register(dbresolver.Config{ - Replicas: []gorm.Dialector{dialector}, - })) - if err != nil { - return nil, err - } - var result int - - // Test the connection by executing a simple query - if err = gormDB.Raw("SELECT 1").Scan(&result).Error; err != nil { - return nil, err - } - - return -} diff --git a/resources/go server/application/config/DataBaseSQL.go b/resources/go server/application/config/DataBaseSQL.go deleted file mode 100644 index 783007b..0000000 --- a/resources/go server/application/config/DataBaseSQL.go +++ /dev/null @@ -1,35 +0,0 @@ -// Package config provides the database connection -package config - -import ( - "fmt" - // driver mysql on this implementation - _ "github.com/go-sql-driver/mysql" - "github.com/mitchellh/mapstructure" -) - -func (infoDB *infoDatabaseSQL) getDiverConn(dbKeyName interface{}) (err error) { - err = mapstructure.Decode(dbKeyName, infoDB) - if err != nil { - return - } - - if infoDB.UseSocket { - // dbURI := fmt.Sprintf("%s:%s@unix(%s)/%s?parseTime=true", - // dbUser, dbPwd, unixSocketPath, dbName) - infoDB.DriverConn = fmt.Sprintf("%s:%s@unix(%s)/%s?parseTime=true", - infoDB.Username, infoDB.Password, infoDB.SocketPath, infoDB.Name) - - infoDB.DriverConn = fmt.Sprintf("%s:%s@unix(%s)/%s?parseTime=true", - infoDB.Username, infoDB.Password, infoDB.SocketPath, infoDB.Name) - } else { - // "%s:%s@tcp(%s:%s)/%s?parseTime=true" - infoDB.DriverConn = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true", - infoDB.Username, infoDB.Password, infoDB.Hostname, infoDB.Port, infoDB.Name) - // - infoDB.DriverConn = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true", - infoDB.Username, infoDB.Password, infoDB.Hostname, infoDB.Port, infoDB.Name) - } - - return -} diff --git a/resources/go server/application/config/structures.go b/resources/go server/application/config/structures.go deleted file mode 100644 index a1676f0..0000000 --- a/resources/go server/application/config/structures.go +++ /dev/null @@ -1,63 +0,0 @@ -package config - -import ( - "time" - - "gorm.io/gorm" -) - -// Repository represents the repository using gorm -type Repository struct { - DB *gorm.DB -} - -// DBConfig represents db configuration -type DBConfig struct { - Host string - Port int - User string - DBName string - Password string -} - -type infoDatabaseSQL struct { - Hostname string - Name string - Username string - Password string - Port string - Parameter string - DriverConn string - UseSocket bool - SocketPath string -} - -// All Configs - -type Config struct { - Environment string `mapstructure:"Environment"` - Timezone string `mapstructure:"Timezone"` - ServerPort int `mapstructure:"ServerPort"` - Secure struct { - Username string `mapstructure:"Username"` - Password string `mapstructure:"Password"` - IPWhiteList map[string]bool `mapstructure:"IPWhiteList"` - } `mapstructure:"Secure"` - Databases struct { - MySQL struct { - WiseFinanceDB struct { - Hostname string `mapstructure:"Hostname"` - Name string `mapstructure:"Name"` - Username string `mapstructure:"Username"` - Password string `mapstructure:"Password"` - Port string `mapstructure:"Port"` - Parameter string `mapstructure:"Parameter"` - UseSocket bool `mapstructure:"UseSocket"` - SocketPath string `mapstructure:"SocketPath"` - } `mapstructure:"WiseFinanceDB"` - } `mapstructure:"MySQL"` - } `mapstructure:"Databases"` - CronJobs struct { - TaskWaitTimeMinute time.Duration `mapstructure:"TaskWaitTimeMinute"` - } `mapstructure:"CronJobs"` -} diff --git a/resources/go server/application/controllers/assetprice/AssetPrice.go b/resources/go server/application/controllers/assetprice/AssetPrice.go deleted file mode 100644 index f226a36..0000000 --- a/resources/go server/application/controllers/assetprice/AssetPrice.go +++ /dev/null @@ -1,109 +0,0 @@ -package assetprice - -import ( - "fmt" - "net/http" - - errorsModel "github.com/FortesenseLabs/wisefinance-mtservices/application/models/errors" - AssetPrice "github.com/FortesenseLabs/wisefinance-mtservices/application/services/assetprice" - - "github.com/FortesenseLabs/wisefinance-mtservices/application/utils/logger" - "github.com/gin-gonic/gin" -) - -// Controller is a struct that contains the asset price service -type Controller struct { - Name string - AssetPrice AssetPrice.Service - Logger *logger.Logger -} - -func (c *Controller) TickPriceDataController(ctx *gin.Context) { - var payload *TickEvent - if err := ctx.ShouldBindJSON(&payload); err != nil { - ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - return - } - - // time(timestamp) => time(timestamp) * 1e12 - // for data.tick [time(timestamp), bid, ask] - // data, ok := payload.Data.(map[string]interface{}) - // if !ok { - // c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid data format"}) - // return - // } - - // tickData := TickData{} - // tickData.Symbol, _ = data["symbol"].(string) - // tickData.Timeframe, _ = data["timeframe"].(string) - // tickData.Tick, _ = data["tick"].([]float64) - - tick, err := c.AssetPrice.CreateTick(mapToModelfromTickDataRequest(payload)) - if err != nil { - appError := errorsModel.NewAppError(c.Logger, err, errorsModel.ExternalServiceError) - _ = ctx.Error(appError) - return - } - - response := gin.H{ - "message": "Data Received", - "symbol": tick.Symbol, - "time": tick.Time, - "bid": tick.Bid, - "ask": tick.Ask, - "command": "", // send command through either a get request route or the ticks price data route - } - - c.Logger.Info(fmt.Sprintf("[TICK] Data Received: %v\n", response)) - - // time_msc, _ := payload.Data.Tick[0].(string) - // i, err := strconv.ParseInt(time_msc, 10, 64) - // if err != nil { - // panic(err) - // } - // timestamp := time.Unix(i, 0) - c.Logger.Info(fmt.Sprintf("Original Timestamp: %v | Processed Time: %v\n", payload.Data.Tick[0], payload.Data.Tick[0])) - - ctx.JSON(http.StatusOK, response) -} - -func (c *Controller) BarPriceDataController(ctx *gin.Context) { - var payload BarEvent - - if err := ctx.ShouldBindJSON(&payload); err != nil { - ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - return - } - - // time(timestamp) => time(timestamp) * 1e9 - // for data.bar [time(timestamp), open, high, low, close, tick_volume, spread, real_volume] - // data, ok := payload.Data.(map[string]BarData) - // if !ok { - // c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid data format"}) - // return - // } - - // barData := BarData{} - // barData.Symbol, _ = data["symbol"].(string) - // barData.Timeframe, _ = data["timeframe"].(string) - // barData.Bar, _ = data["bar"].([][]float64) - - response := gin.H{ - "message": "Data Received", - "symbol": payload.Data.Symbol, - "timeframe": payload.Data.Timeframe, - "bar": payload.Data.Bar, - } - - c.Logger.Info(fmt.Sprintf("[BAR] Data Received: %v\n", response)) - - // time_msc, _ := payload.Data.Bar[0][0].(string) - // i, err := strconv.ParseInt(time_msc, 10, 64) - // if err != nil { - // panic(err) - // } - // timestamp := time.Unix(i, 0) - c.Logger.Info(fmt.Sprintf("Original Timestamp: %v | Processed Time: %v\n", payload.Data.Bar[0][0], payload.Data.Bar[0][0])) - - ctx.JSON(http.StatusOK, response) -} diff --git a/resources/go server/application/controllers/assetprice/Mapper.go b/resources/go server/application/controllers/assetprice/Mapper.go deleted file mode 100644 index 7dc051d..0000000 --- a/resources/go server/application/controllers/assetprice/Mapper.go +++ /dev/null @@ -1,16 +0,0 @@ -package assetprice - -import ( - tickPriceModel "github.com/FortesenseLabs/wisefinance-mtservices/application/models/assetprice" -) - -func mapToModelfromTickDataRequest(tickEvent *TickEvent) (tickData *tickPriceModel.TickData) { - tickData = &tickPriceModel.TickData{ - Symbol: tickEvent.Data.Symbol, - Timeframe: tickEvent.Data.Timeframe, - Time: tickEvent.Data.Tick[0].(string), - Bid: tickEvent.Data.Tick[1].(float64), - Ask: tickEvent.Data.Tick[2].(float64)} - - return -} diff --git a/resources/go server/application/controllers/assetprice/Requests.go b/resources/go server/application/controllers/assetprice/Requests.go deleted file mode 100644 index ad21f4c..0000000 --- a/resources/go server/application/controllers/assetprice/Requests.go +++ /dev/null @@ -1,25 +0,0 @@ -package assetprice - -// Tick Data -type TickData struct { - Symbol string `json:"symbol"` - Timeframe string `json:"timeframe"` - Tick []interface{} `json:"tick"` -} - -type TickEvent struct { - Event string `json:"event"` - Data TickData `json:"data"` -} - -// Bar Data -type BarData struct { - Bar [][]interface{} `json:"bar"` - Symbol string `json:"symbol"` - Timeframe string `json:"timeframe"` -} - -type BarEvent struct { - Event string `json:"event"` - Data BarData `json:"data"` -} diff --git a/resources/go server/application/controllers/assetprice/Response.go b/resources/go server/application/controllers/assetprice/Response.go deleted file mode 100644 index c69a1d7..0000000 --- a/resources/go server/application/controllers/assetprice/Response.go +++ /dev/null @@ -1,17 +0,0 @@ -package assetprice - -import "time" - -// MessageResponse is a struct that contains the response body for the message -type MessageResponse struct { - Message string `json:"message"` -} - -// ResponseTick is a struct that contains the response body for the tick data -type ResponseTick struct { - CurrencyCode string `json:"currencyCode" example:"USD"` - Balance float64 `json:"balance" example:"0.00"` - AccountNumber string `json:"accountNumber" example:"2504201765"` - CreatedAt time.Time `json:"createdAt,omitempty" example:"2021-02-24 20:19:39" gorm:"autoCreateTime:mili"` - UpdatedAt time.Time `json:"updatedAt,omitempty" example:"2021-02-24 20:19:39" gorm:"autoUpdateTime:mili"` -} diff --git a/resources/go server/application/controllers/command/Command.go b/resources/go server/application/controllers/command/Command.go deleted file mode 100644 index 338fb7c..0000000 --- a/resources/go server/application/controllers/command/Command.go +++ /dev/null @@ -1,15 +0,0 @@ -package command - -import ( - "net/http" - - "github.com/gin-gonic/gin" -) - -func ClientCommandController(c *gin.Context) { - response := gin.H{ - "command": "ACCOUNT", - } - - c.JSON(http.StatusOK, response) -} diff --git a/resources/go server/application/controllers/errors/Errors.go b/resources/go server/application/controllers/errors/Errors.go deleted file mode 100644 index 9bc05a8..0000000 --- a/resources/go server/application/controllers/errors/Errors.go +++ /dev/null @@ -1,65 +0,0 @@ -// Package errors contains the error handler controller -package errors - -import ( - "net/http" - - errorsModel "github.com/FortesenseLabs/wisefinance-mtservices/application/models/errors" - "github.com/FortesenseLabs/wisefinance-mtservices/application/utils/logger" - "github.com/gin-gonic/gin" -) - -// MessagesResponse is a struct that contains the response body for the message -type MessagesResponse struct { - Message string `json:"message"` -} - -// Handler is Gin middleware to handle errors. -func Handler(logger *logger.Logger) gin.HandlerFunc { - return func(c *gin.Context) { - // Execute request handlers and then handle any errors - c.Next() - errs := c.Errors - - if len(errs) > 0 { - err, ok := errs[0].Err.(*errorsModel.AppError) - if ok { - logger.Error(err.Err) - - resp := MessagesResponse{Message: err.Error()} - switch err.Type { - case errorsModel.NotFound: - c.JSON(http.StatusNotFound, resp) - return - case errorsModel.ValidationError: - c.JSON(http.StatusBadRequest, resp) - return - case errorsModel.TokenGeneratorError: - c.JSON(http.StatusUnauthorized, resp) - return - case errorsModel.ResourceAlreadyExists: - c.JSON(http.StatusConflict, resp) - return - case errorsModel.NotAuthenticated: - c.JSON(http.StatusUnauthorized, resp) - return - case errorsModel.NotAuthorized: - c.JSON(http.StatusForbidden, resp) - return - case errorsModel.ExternalServiceError: - c.JSON(http.StatusServiceUnavailable, resp) - return - case errorsModel.RepositoryError: - c.JSON(http.StatusInternalServerError, MessagesResponse{Message: "We are working to improve the flow of this request."}) - return - default: - c.JSON(http.StatusInternalServerError, MessagesResponse{Message: "We are working to improve the flow of this request."}) - return - } - } - - return - } - } - -} diff --git a/resources/go server/application/database/barprice/barprice.go b/resources/go server/application/database/barprice/barprice.go deleted file mode 100644 index e080864..0000000 --- a/resources/go server/application/database/barprice/barprice.go +++ /dev/null @@ -1,145 +0,0 @@ -// Package barprice contains the business logic for the barprice entity -package barprice - -import ( - "encoding/json" - - barPriceModel "github.com/FortesenseLabs/wisefinance-mtservices/application/models/assetprice" - errorsModel "github.com/FortesenseLabs/wisefinance-mtservices/application/models/errors" - - "github.com/FortesenseLabs/wisefinance-mtservices/application/utils/logger" - "github.com/google/uuid" - "gorm.io/gorm" -) - -// Repository is a struct that contains the database implementation for bar price entity -type Repository struct { - Name string - DB *gorm.DB - Logger *logger.Logger -} - -// GetAll Fetch all bar data -func (r *Repository) GetAll() (*[]barPriceModel.BarData, error) { - var bars []BarData - err := r.DB.Find(&bars).Error - if err != nil { - r.Logger.Error(err) - - err = errorsModel.NewAppErrorWithType(nil, errorsModel.UnknownError) - return nil, err - } - - return arrayToDomainMapper(&bars), err -} - -// Create ... Insert New data -func (r *Repository) Create(barPrice *barPriceModel.BarData) (*barPriceModel.BarData, error) { - barPrice.ID = uuid.New().String() - barRepository := fromDomainMapper(barPrice) - txDb := r.DB.Create(barRepository) - err := txDb.Error - if err != nil { - r.Logger.Error(err) - - byteErr, _ := json.Marshal(err) - var newError errorsModel.GormErr - err = json.Unmarshal(byteErr, &newError) - if err != nil { - return &barPriceModel.BarData{}, err - } - switch newError.Number { - case 1062: - err = errorsModel.NewAppErrorWithType(nil, errorsModel.ResourceAlreadyExists) - return &barPriceModel.BarData{}, err - - default: - err = errorsModel.NewAppErrorWithType(nil, errorsModel.UnknownError) - } - } - return barRepository.toDomainMapper(), err -} - -// GetOneByMap ... Fetch only one one bar by Map values -func (r *Repository) GetOneByMap(barMap map[string]interface{}) (*barPriceModel.BarData, error) { - var barRepository BarData - - tx := r.DB.Where(barMap).Limit(1).Find(&barRepository) - if tx.Error != nil { - r.Logger.Error(tx.Error) - - err := errorsModel.NewAppErrorWithType(nil, errorsModel.UnknownError) - return &barPriceModel.BarData{}, err - } - return barRepository.toDomainMapper(), nil -} - -// GetByID ... Fetch only one bar by ID -func (r *Repository) GetByID(id string) (*barPriceModel.BarData, error) { - var bar BarData - err := r.DB.Where("id = ?", id).First(&bar).Error - - if err != nil { - r.Logger.Error(err) - - switch err.Error() { - case gorm.ErrRecordNotFound.Error(): - err = errorsModel.NewAppErrorWithType(nil, errorsModel.NotFound) - default: - err = errorsModel.NewAppErrorWithType(nil, errorsModel.UnknownError) - } - } - - return bar.toDomainMapper(), err -} - -// Update ... Update bar -func (r *Repository) Update(id string, barMap map[string]interface{}) (*barPriceModel.BarData, error) { - var bar BarData - - bar.ID = id - err := r.DB.Model(&bar). - Updates(barMap).Error - // Select("bar", "balance", "accountNumber", "trackingReference"). - - // err = config.DB.Save(bar).Error - if err != nil { - r.Logger.Error(err) - - byteErr, _ := json.Marshal(err) - var newError errorsModel.GormErr - err = json.Unmarshal(byteErr, &newError) - if err != nil { - return &barPriceModel.BarData{}, err - } - switch newError.Number { - case 1062: - err = errorsModel.NewAppErrorWithType(nil, errorsModel.ResourceAlreadyExists) - default: - err = errorsModel.NewAppErrorWithType(nil, errorsModel.UnknownError) - } - return &barPriceModel.BarData{}, err - - } - - err = r.DB.Where("id = ?", id).First(&bar).Error - - return bar.toDomainMapper(), err -} - -// Delete ... Delete bar -func (r *Repository) Delete(id string) (err error) { - tx := r.DB.Delete(&BarData{}, id) - if tx.Error != nil { - r.Logger.Error(tx.Error) - - err = errorsModel.NewAppErrorWithType(nil, errorsModel.UnknownError) - return - } - - if tx.RowsAffected == 0 { - err = errorsModel.NewAppErrorWithType(nil, errorsModel.NotFound) - } - - return -} diff --git a/resources/go server/application/database/barprice/mappers.go b/resources/go server/application/database/barprice/mappers.go deleted file mode 100644 index 26898fb..0000000 --- a/resources/go server/application/database/barprice/mappers.go +++ /dev/null @@ -1,49 +0,0 @@ -// Package barprice contains the business logic for the barprice entity -package barprice - -import barPriceModel "github.com/FortesenseLabs/wisefinance-mtservices/application/models/assetprice" - -func (barPrice *BarData) toDomainMapper() *barPriceModel.BarData { - return &barPriceModel.BarData{ - ID: barPrice.ID, - Symbol: barPrice.Symbol, - Timeframe: barPrice.Timeframe, - Time: barPrice.Time, - Open: barPrice.Open, - High: barPrice.High, - Low: barPrice.Low, - Close: barPrice.Close, - TickVolume: barPrice.TickVolume, - RealVolume: barPrice.RealVolume, - Spread: barPrice.Spread, - CreatedAt: barPrice.CreatedAt, - UpdatedAt: barPrice.UpdatedAt, - } -} - -func fromDomainMapper(barPrice *barPriceModel.BarData) *BarData { - return &BarData{ - ID: barPrice.ID, - Symbol: barPrice.Symbol, - Timeframe: barPrice.Timeframe, - Time: barPrice.Time, - Open: barPrice.Open, - High: barPrice.High, - Low: barPrice.Low, - Close: barPrice.Close, - TickVolume: barPrice.TickVolume, - RealVolume: barPrice.RealVolume, - Spread: barPrice.Spread, - CreatedAt: barPrice.CreatedAt, - UpdatedAt: barPrice.UpdatedAt, - } -} - -func arrayToDomainMapper(barPrices *[]BarData) *[]barPriceModel.BarData { - barPricesModel := make([]barPriceModel.BarData, len(*barPrices)) - for i, barPrice := range *barPrices { - barPricesModel[i] = *barPrice.toDomainMapper() - } - - return &barPricesModel -} diff --git a/resources/go server/application/database/barprice/structures.go b/resources/go server/application/database/barprice/structures.go deleted file mode 100644 index 5c6efbe..0000000 --- a/resources/go server/application/database/barprice/structures.go +++ /dev/null @@ -1,28 +0,0 @@ -// Package barprice contains the business logic for the barprice entity -package barprice - -import ( - "time" -) - -// BarData is a struct that contains the bar price information -type BarData struct { - ID string `json:"id" example:"d4c4d4a4-54c4-4d4c-a4d4-c454d4c4d4a4" gorm:"primaryKey"` - Symbol string `json:"symbol" example:"user@mail.com"` - Timeframe string `json:"timeframe" example:"08029938477"` - Time string `json:"time" example:"08029938477"` - Open float64 `json:"open" example:"0.00"` - High float64 `json:"high" example:"0.00"` - Low float64 `json:"low" example:"0.00"` - Close float64 `json:"close" example:"0.00"` - TickVolume float64 `json:"tick_volume" example:"0.00"` - RealVolume float64 `json:"real_volume" example:"0.00"` - Spread float64 `json:"spread" example:"0.00"` - CreatedAt time.Time `json:"created_at,omitempty" example:"2021-02-24 20:19:39" gorm:"autoCreateTime:mili"` - UpdatedAt time.Time `json:"updated_at,omitempty" example:"2021-02-24 20:19:39" gorm:"autoUpdateTime:mili"` -} - -// TableName overrides the table name used by Wallet to `wallets` -func (*BarData) TableName() string { - return "bars" -} diff --git a/resources/go server/application/database/migrations/migrations.go b/resources/go server/application/database/migrations/migrations.go deleted file mode 100644 index 1b6b563..0000000 --- a/resources/go server/application/database/migrations/migrations.go +++ /dev/null @@ -1,29 +0,0 @@ -package migrations - -import ( - "fmt" - - barPriceRepository "github.com/FortesenseLabs/wisefinance-mtservices/application/database/barprice" - tickPriceRepository "github.com/FortesenseLabs/wisefinance-mtservices/application/database/tickprice" - - "github.com/FortesenseLabs/wisefinance-mtservices/application/utils/logger" - "gorm.io/gorm" -) - -func RunAutoMigrations(logger *logger.Logger, db *gorm.DB) { - // List of models to migrate - models := []interface{}{ - &tickPriceRepository.TickData{}, - &barPriceRepository.BarData{}, // Add BarData model here - } - - // Auto-migrate the list of models here - for _, model := range models { - err := db.AutoMigrate(model) - if err != nil { - logger.Fatal(fmt.Errorf("failed to auto-migrate model: %v", err)) - } - } - - logger.Info("Auto-migrations completed successfully.") -} diff --git a/resources/go server/application/database/tickprice/mappers.go b/resources/go server/application/database/tickprice/mappers.go deleted file mode 100644 index 3482872..0000000 --- a/resources/go server/application/database/tickprice/mappers.go +++ /dev/null @@ -1,39 +0,0 @@ -// Package tickprice contains the business logic for the tickprice entity -package tickprice - -import tickPriceModel "github.com/FortesenseLabs/wisefinance-mtservices/application/models/assetprice" - -func (tickPrice *TickData) toDomainMapper() *tickPriceModel.TickData { - return &tickPriceModel.TickData{ - ID: tickPrice.ID, - Symbol: tickPrice.Symbol, - Timeframe: tickPrice.Timeframe, - Time: tickPrice.Time, - Bid: tickPrice.Bid, - Ask: tickPrice.Ask, - CreatedAt: tickPrice.CreatedAt, - UpdatedAt: tickPrice.UpdatedAt, - } -} - -func fromDomainMapper(tickPrice *tickPriceModel.TickData) *TickData { - return &TickData{ - ID: tickPrice.ID, - Symbol: tickPrice.Symbol, - Timeframe: tickPrice.Timeframe, - Time: tickPrice.Time, - Bid: tickPrice.Bid, - Ask: tickPrice.Ask, - CreatedAt: tickPrice.CreatedAt, - UpdatedAt: tickPrice.UpdatedAt, - } -} - -func arrayToDomainMapper(tickPrices *[]TickData) *[]tickPriceModel.TickData { - tickPricesModel := make([]tickPriceModel.TickData, len(*tickPrices)) - for i, tickPrice := range *tickPrices { - tickPricesModel[i] = *tickPrice.toDomainMapper() - } - - return &tickPricesModel -} diff --git a/resources/go server/application/database/tickprice/structures.go b/resources/go server/application/database/tickprice/structures.go deleted file mode 100644 index fa7c596..0000000 --- a/resources/go server/application/database/tickprice/structures.go +++ /dev/null @@ -1,23 +0,0 @@ -// Package tickprice contains the business logic for the tickprice entity -package tickprice - -import ( - "time" -) - -// TickData is a struct that contains the tick price information -type TickData struct { - ID string `json:"id" example:"d4c4d4a4-54c4-4d4c-a4d4-c454d4c4d4a4" gorm:"primaryKey"` - Symbol string `json:"symbol" example:"EURUSD"` - Timeframe string `json:"timeframe" example:"1693776279131"` - Time string `json:"time" example:"1693776279131"` - Bid float64 `json:"bid" example:"0.00"` - Ask float64 `json:"ask" example:"0.00"` - CreatedAt time.Time `json:"created_at,omitempty" example:"2021-02-24 20:19:39" gorm:"autoCreateTime:mili"` - UpdatedAt time.Time `json:"updated_at,omitempty" example:"2021-02-24 20:19:39" gorm:"autoUpdateTime:mili"` -} - -// TableName overrides the table name used by Wallet to `wallets` -func (*TickData) TableName() string { - return "ticks" -} diff --git a/resources/go server/application/database/tickprice/tickprice.go b/resources/go server/application/database/tickprice/tickprice.go deleted file mode 100644 index c5ac20a..0000000 --- a/resources/go server/application/database/tickprice/tickprice.go +++ /dev/null @@ -1,145 +0,0 @@ -// Package tickprice contains the business logic for the tickprice entity -package tickprice - -import ( - "encoding/json" - - tickPriceModel "github.com/FortesenseLabs/wisefinance-mtservices/application/models/assetprice" - errorsModel "github.com/FortesenseLabs/wisefinance-mtservices/application/models/errors" - - "github.com/FortesenseLabs/wisefinance-mtservices/application/utils/logger" - "github.com/google/uuid" - "gorm.io/gorm" -) - -// Repository is a struct that contains the database implementation for tick price entity -type Repository struct { - Name string - DB *gorm.DB - Logger *logger.Logger -} - -// GetAll Fetch all tick data -func (r *Repository) GetAll() (*[]tickPriceModel.TickData, error) { - var ticks []TickData - err := r.DB.Find(&ticks).Error - if err != nil { - r.Logger.Error(err) - - err = errorsModel.NewAppErrorWithType(nil, errorsModel.UnknownError) - return nil, err - } - - return arrayToDomainMapper(&ticks), err -} - -// Create ... Insert New data -func (r *Repository) Create(tickPrice *tickPriceModel.TickData) (*tickPriceModel.TickData, error) { - tickPrice.ID = uuid.New().String() - tickRepository := fromDomainMapper(tickPrice) - txDb := r.DB.Create(tickRepository) - err := txDb.Error - if err != nil { - r.Logger.Error(err) - - byteErr, _ := json.Marshal(err) - var newError errorsModel.GormErr - err = json.Unmarshal(byteErr, &newError) - if err != nil { - return &tickPriceModel.TickData{}, err - } - switch newError.Number { - case 1062: - err = errorsModel.NewAppErrorWithType(nil, errorsModel.ResourceAlreadyExists) - return &tickPriceModel.TickData{}, err - - default: - err = errorsModel.NewAppErrorWithType(nil, errorsModel.UnknownError) - } - } - return tickRepository.toDomainMapper(), err -} - -// GetOneByMap ... Fetch only one one tick by Map values -func (r *Repository) GetOneByMap(tickMap map[string]interface{}) (*tickPriceModel.TickData, error) { - var tickRepository TickData - - tx := r.DB.Where(tickMap).Limit(1).Find(&tickRepository) - if tx.Error != nil { - r.Logger.Error(tx.Error) - - err := errorsModel.NewAppErrorWithType(nil, errorsModel.UnknownError) - return &tickPriceModel.TickData{}, err - } - return tickRepository.toDomainMapper(), nil -} - -// GetByID ... Fetch only one tick by ID -func (r *Repository) GetByID(id string) (*tickPriceModel.TickData, error) { - var tick TickData - err := r.DB.Where("id = ?", id).First(&tick).Error - - if err != nil { - r.Logger.Error(err) - - switch err.Error() { - case gorm.ErrRecordNotFound.Error(): - err = errorsModel.NewAppErrorWithType(nil, errorsModel.NotFound) - default: - err = errorsModel.NewAppErrorWithType(nil, errorsModel.UnknownError) - } - } - - return tick.toDomainMapper(), err -} - -// Update ... Update tick -func (r *Repository) Update(id string, tickMap map[string]interface{}) (*tickPriceModel.TickData, error) { - var tick TickData - - tick.ID = id - err := r.DB.Model(&tick). - Updates(tickMap).Error - // Select("tick", "balance", "accountNumber", "trackingReference"). - - // err = config.DB.Save(tick).Error - if err != nil { - r.Logger.Error(err) - - byteErr, _ := json.Marshal(err) - var newError errorsModel.GormErr - err = json.Unmarshal(byteErr, &newError) - if err != nil { - return &tickPriceModel.TickData{}, err - } - switch newError.Number { - case 1062: - err = errorsModel.NewAppErrorWithType(nil, errorsModel.ResourceAlreadyExists) - default: - err = errorsModel.NewAppErrorWithType(nil, errorsModel.UnknownError) - } - return &tickPriceModel.TickData{}, err - - } - - err = r.DB.Where("id = ?", id).First(&tick).Error - - return tick.toDomainMapper(), err -} - -// Delete ... Delete tick -func (r *Repository) Delete(id string) (err error) { - tx := r.DB.Delete(&TickData{}, id) - if tx.Error != nil { - r.Logger.Error(tx.Error) - - err = errorsModel.NewAppErrorWithType(nil, errorsModel.UnknownError) - return - } - - if tx.RowsAffected == 0 { - err = errorsModel.NewAppErrorWithType(nil, errorsModel.NotFound) - } - - return -} diff --git a/resources/go server/application/models/assetprice/assetprice.go b/resources/go server/application/models/assetprice/assetprice.go deleted file mode 100644 index 00c28c6..0000000 --- a/resources/go server/application/models/assetprice/assetprice.go +++ /dev/null @@ -1,20 +0,0 @@ -// Package assetprice contains the business logic for the assetprice entity -package assetprice - -// Service is the interface that provides tick and bar data methods -type Service interface { - GetAllTicks() ([]*TickData, error) - GetTickByID(string) (*TickData, error) - GetOneTickByMap(map[string]interface{}) map[string]interface{} - DeleteTick(string) error - UpdateTick(string, map[string]interface{}) (*TickData, error) - CreateTick(*TickData) (*TickData, error) - - // bar - GetAllBars() ([]*BarData, error) - GetBarByID(string) (*BarData, error) - GetOneBarByMap(map[string]interface{}) map[string]interface{} - DeleteBar(string) error - UpdateBar(string, map[string]interface{}) (*BarData, error) - CreateBar(*BarData) (*BarData, error) -} diff --git a/resources/go server/application/models/assetprice/barprice.go b/resources/go server/application/models/assetprice/barprice.go deleted file mode 100644 index 2625823..0000000 --- a/resources/go server/application/models/assetprice/barprice.go +++ /dev/null @@ -1,23 +0,0 @@ -// Package assetprice contains the business logic for the assetprice entity -package assetprice - -import ( - "time" -) - -// BarData is a struct that contains the BarData information -type BarData struct { - ID string - Symbol string - Timeframe string - Time string - Open float64 - High float64 - Low float64 - Close float64 - TickVolume float64 - RealVolume float64 - Spread float64 - CreatedAt time.Time - UpdatedAt time.Time -} diff --git a/resources/go server/application/models/assetprice/tickprice.go b/resources/go server/application/models/assetprice/tickprice.go deleted file mode 100644 index 547cc96..0000000 --- a/resources/go server/application/models/assetprice/tickprice.go +++ /dev/null @@ -1,18 +0,0 @@ -// Package assetprice contains the business logic for the assetprice entity -package assetprice - -import ( - "time" -) - -// TickData is a struct that contains the TickData information -type TickData struct { - ID string - Symbol string - Timeframe string - Time string - Bid float64 - Ask float64 - CreatedAt time.Time - UpdatedAt time.Time -} diff --git a/resources/go server/application/models/errors/Errors.go b/resources/go server/application/models/errors/Errors.go deleted file mode 100644 index 53056da..0000000 --- a/resources/go server/application/models/errors/Errors.go +++ /dev/null @@ -1,69 +0,0 @@ -// Package errors defines the domain errors used in the application. -package errors - -import ( - "errors" - - "github.com/FortesenseLabs/wisefinance-mtservices/application/utils/logger" -) - -// AppError defines an application (domain) error -type AppError struct { - Err error - Type string - Logger *logger.Logger -} - -// NewAppError initializes a new domain error using an error and its type. -func NewAppError(logger *logger.Logger, err error, errType string) *AppError { - return &AppError{ - Err: err, - Type: errType, - Logger: logger, - } -} - -// NewAppErrorWithType initializes a new default error for a given type. -func NewAppErrorWithType(logger *logger.Logger, errType string) *AppError { - // Add controller error logging here - // logger.Error(err) // log the exact error - - var err error - - switch errType { - case NotFound: - err = errors.New(notFoundMessage) - case ValidationError: - err = errors.New(validationErrorMessage) - case ResourceAlreadyExists: - err = errors.New(alreadyExistsErrorMessage) - case RepositoryError: - err = errors.New(repositoryErrorMessage) - case NotAuthenticated: - err = errors.New(notAuthenticatedErrorMessage) - case NotAuthorized: - err = errors.New(notAuthorizedErrorMessage) - case TokenGeneratorError: - err = errors.New(tokenGeneratorErrorMessage) - case ExternalServiceError: - err = errors.New(ExternalServiceErrorMessage) - default: - err = errors.New(unknownErrorMessage) - } - - return &AppError{ - Err: err, - Type: errType, - Logger: logger, - } -} - -// String converts the app error to a human-readable string. -func (appErr *AppError) Error() string { - // Add controller error logging here - if appErr.Logger != nil { - appErr.Logger.Error(appErr.Err) - } - - return appErr.Err.Error() -} diff --git a/resources/go server/application/models/errors/Gorm.go b/resources/go server/application/models/errors/Gorm.go deleted file mode 100644 index 706d663..0000000 --- a/resources/go server/application/models/errors/Gorm.go +++ /dev/null @@ -1,8 +0,0 @@ -// Package errors defines the domain errors used in the application. -package errors - -// GormErr is a struct that contains the error number and message for Gorm errors -type GormErr struct { - Number int `json:"Number"` - Message string `json:"Message"` -} diff --git a/resources/go server/application/models/errors/Types.go b/resources/go server/application/models/errors/Types.go deleted file mode 100644 index 0c9d206..0000000 --- a/resources/go server/application/models/errors/Types.go +++ /dev/null @@ -1,48 +0,0 @@ -// Package errors defines the domain errors used in the application. -package errors - -const ( - // NotFound error indicates a missing / not found record - NotFound = "NotFound" - notFoundMessage = "record not found" - - // ValidationError indicates an error in input validation - ValidationError = "ValidationError" - validationErrorMessage = "validation error" - - // ResourceAlreadyExists indicates a duplicate / already existing record - ResourceAlreadyExists = "ResourceAlreadyExists" - alreadyExistsErrorMessage = "resource already exists" - - // RepositoryError indicates a repository (e.g database) error - RepositoryError = "RepositoryError" - repositoryErrorMessage = "error in repository operation" - - // NotAuthenticated indicates an authentication error - NotAuthenticated = "NotAuthenticated" - notAuthenticatedErrorMessage = "not Authenticated" - - // TokenGeneratorError indicates an token generation error - TokenGeneratorError = "TokenGeneratorError" - tokenGeneratorErrorMessage = "error in token generation" - - // TokenValidationError indicates an token validation error - // TokenValidationError = "TokenValidationError" - // tokenValidationErrorMessage = "error in token validation" - - // NotAuthorized indicates an authorization error - NotAuthorized = "NotAuthorized" - notAuthorizedErrorMessage = "not authorized" - - // UnknownError indicates an error that the app cannot find the cause for - UnknownError = "UnknownError" - unknownErrorMessage = "something went wrong" - - // ExternalServiceError indicates an external api service error - ExternalServiceError = "ExternalServiceError" - ExternalServiceErrorMessage = "something went wrong while communicating with the external service" - - // InvalidURLError indicates an invalid URL error - InvalidURLError = "InvalidURLError" - invalidURLErrorMessage = "invalid URL" -) \ No newline at end of file diff --git a/resources/go server/application/routes/assetprice.go b/resources/go server/application/routes/assetprice.go deleted file mode 100644 index 51981da..0000000 --- a/resources/go server/application/routes/assetprice.go +++ /dev/null @@ -1,18 +0,0 @@ -// Package routes contains all routes of the application -package routes - -import ( - assetPriceController "github.com/FortesenseLabs/wisefinance-mtservices/application/controllers/assetprice" - "github.com/gin-gonic/gin" -) - -// AssetPriceRoutes is a function that contains all routes of asset price -func AssetPriceRoutes(router *gin.RouterGroup, controller *assetPriceController.Controller) { - routerAuth := router.Group("/price") - - routerAuth.POST("/stream/bar", controller.BarPriceDataController) - routerAuth.POST("/stream/tick", controller.TickPriceDataController) -} - -// router.POST("/api/price/stream/bar", application.BarPriceDataController) -// router.POST("/api/price/stream/tick", application.TickPriceDataController) diff --git a/resources/go server/application/routes/health.go b/resources/go server/application/routes/health.go deleted file mode 100644 index 5f8e545..0000000 --- a/resources/go server/application/routes/health.go +++ /dev/null @@ -1,21 +0,0 @@ -// Package routes contains all routes of the application -package routes - -import ( - "net/http" - - "github.com/gin-gonic/gin" -) - -// HealthRoutes is a function that contains all routes of the application health -func HealthRoutes(router *gin.RouterGroup) { - routerAuth := router.Group("/health") - { - routerAuth.GET("", func(c *gin.Context) { - c.JSON(http.StatusOK, gin.H{"message": "available"}) - }) - } - -} - -// update the health routes in the MQL client diff --git a/resources/go server/application/routes/routes.go b/resources/go server/application/routes/routes.go deleted file mode 100644 index b350f36..0000000 --- a/resources/go server/application/routes/routes.go +++ /dev/null @@ -1,24 +0,0 @@ -package routes - -import ( - "github.com/FortesenseLabs/wisefinance-mtservices/application/adapter" - "github.com/FortesenseLabs/wisefinance-mtservices/application/utils/logger" - "github.com/gin-gonic/gin" - "gorm.io/gorm" -) - -func ApplicationV1Router(router *gin.Engine, db *gorm.DB, logger *logger.Logger) { - routerV1 := router.Group("/api") - { - // Home - WelcomeRoutes(routerV1) - HealthRoutes(routerV1) - - AssetPriceRoutes(routerV1, adapter.AssetPriceAdapter(logger, db)) - - } -} - -// router.GET("/", application.IndexController) -// router.GET("/health", application.HealthStatusController) -// router.GET("/command", application.ClientCommandController) diff --git a/resources/go server/application/routes/welcome.go b/resources/go server/application/routes/welcome.go deleted file mode 100644 index 27e56f6..0000000 --- a/resources/go server/application/routes/welcome.go +++ /dev/null @@ -1,19 +0,0 @@ -// Package routes contains all routes of the application -package routes - -import ( - "net/http" - - "github.com/gin-gonic/gin" -) - -// WelcomeRoutes is a function that contains all routes of the user -func WelcomeRoutes(router *gin.RouterGroup) { - routerAuth := router.Group("/") - { - routerAuth.GET("/", func(c *gin.Context) { - c.JSON(http.StatusOK, gin.H{"message": "Hello, Welcome to the Wisefinance MT Server!"}) - }) - } - -} diff --git a/resources/go server/application/services/api/command.go b/resources/go server/application/services/api/command.go deleted file mode 100644 index 7401a04..0000000 --- a/resources/go server/application/services/api/command.go +++ /dev/null @@ -1,40 +0,0 @@ -package api - -// func Command(**kwargs) -> dict: -// """Construct a request dictionary from default and send it to server""" - -// # default dictionary -// request = { -// "action": None, -// "actionType": None, -// "symbol": None, -// "chartTF": None, -// "fromDate": None, -// "toDate": None, -// "id": None, -// "magic": None, -// "volume": None, -// "price": None, -// "stoploss": None, -// "takeprofit": None, -// "expiration": None, -// "deviation": None, -// "comment": None, -// "chartId": None, -// "indicatorChartId": None, -// "chartIndicatorSubWindow": None, -// "style": None, -// } - -// # update dict values if exist -// for key, value in kwargs.items(): -// if key in request: -// request[key] = value -// else: -// raise KeyError("Unknown key in **kwargs ERROR") - -// # send dict to server -// self._send_request(request) - -// # return server reply -// return self._pull_reply() diff --git a/resources/go server/application/services/assetprice/assetTickprice.go b/resources/go server/application/services/assetprice/assetTickprice.go deleted file mode 100644 index 39748cf..0000000 --- a/resources/go server/application/services/assetprice/assetTickprice.go +++ /dev/null @@ -1,64 +0,0 @@ -package assetprice - -import ( - "fmt" - "strings" - - "github.com/FortesenseLabs/wisefinance-mtservices/application/database/barprice" - "github.com/FortesenseLabs/wisefinance-mtservices/application/database/tickprice" - tickPriceModel "github.com/FortesenseLabs/wisefinance-mtservices/application/models/assetprice" - - "github.com/FortesenseLabs/wisefinance-mtservices/application/utils/logger" - "github.com/patrickmn/go-cache" -) - -// Service is a struct that contains the repository implementation for asset price service -type Service struct { - Name string - BarPriceRepository barprice.Repository - TickPriceRepository tickprice.Repository - Logger *logger.Logger // logger - Cache *cache.Cache -} - -// GetAllTicks is a function that returns tick history -func (s *Service) GetAllTicks() (*[]tickPriceModel.TickData, error) { - return s.TickPriceRepository.GetAll() -} - -// GetTickByID is a function that returns a tick by id -func (s *Service) GetTickByID(id string) (*tickPriceModel.TickData, error) { - return s.TickPriceRepository.GetByID(id) -} - -// GetOneByMap is a function that returns a tick by map -func (s *Service) GetOneTickByMap(tickMap map[string]interface{}) (*tickPriceModel.TickData, error) { - return s.TickPriceRepository.GetOneByMap(tickMap) -} - -// Delete is a function that deletes a tick by id -func (s *Service) DeleteTick(id string) error { - return s.TickPriceRepository.Delete(id) -} - -// Update is a function that updates a tick by id -func (s *Service) UpdateTick(tickId string, tickMap map[string]interface{}) (*tickPriceModel.TickData, error) { - return s.TickPriceRepository.Update(tickId, tickMap) -} - -// CreateTick is a function that creates a new tick -func (s *Service) CreateTick(tick *tickPriceModel.TickData) (*tickPriceModel.TickData, error) { - // time(timestamp) => time(timestamp) * 1e12 - // for data.tick [time(timestamp), bid, ask] - - tick, err := s.TickPriceRepository.Create(tick) - if err != nil { - errMsg := "failed to create tick" - s.Logger.Error(fmt.Errorf("%s for %s: %v", errMsg, tick.Time, err)) - splittedString := strings.Split(err.Error(), ":") - formattedErrMsg := strings.TrimSpace(splittedString[len(splittedString)-1]) - return nil, fmt.Errorf("%s: %s", errMsg, formattedErrMsg) - } - - return tick, nil -} diff --git a/resources/go server/application/utils/logger/logger.go b/resources/go server/application/utils/logger/logger.go deleted file mode 100644 index 0366e71..0000000 --- a/resources/go server/application/utils/logger/logger.go +++ /dev/null @@ -1,121 +0,0 @@ -package logger - -import ( - "context" - "log" - "os" - - "cloud.google.com/go/logging" -) - -// NewLogger creates a new Logger instance and initializes the logging mechanism -func NewLogger(projectId string, logName string) (*Logger, error) { - logger := &Logger{} - - err := logger.initLoggingClient(projectId) - if err != nil { - return nil, err - } - - err = logger.initLogger(logName) - if err != nil { - return nil, err - } - - return logger, nil -} - -func (l *Logger) initLoggingClient(projectID string) error { - loggingClient, err := logging.NewClient(context.Background(), projectID) - if err != nil { - return err - } - - l.client = loggingClient - return nil -} - -func (l *Logger) initLogger(logName string) error { - - if l.detectLoggingMechanism() == "gcp" { - l.gcpLogger = l.client.Logger(logName) - l.standardLogger = nil - } else { - standardLogger := log.New(os.Stdout, "", log.Ldate|log.Ltime) - l.standardLogger = &StandardLogger{logger: standardLogger} - l.gcpLogger = nil - } - - return nil -} - -func (l *Logger) detectLoggingMechanism() string { - // Check if running on Google Cloud Platform - if os.Getenv("GAE_USE_LOGGING") != "" { - return "gcp" // Use Google Cloud Logging - } - - // Check if running on a specific environment or platform - // Add detection logic here based on application's environment - - // Default to using standard log package - return "standard" -} - -func (l *Logger) Info(message string) { - if l.gcpLogger != nil { - entry := logging.Entry{ - Payload: message, - Severity: logging.Info, - } - l.gcpLogger.Log(entry) - - return - } - - l.standardLogger.Info(message) -} - -func (l *Logger) Error(err error) { - if l.gcpLogger != nil { - entry := logging.Entry{ - Payload: err.Error(), - Severity: logging.Error, - } - l.gcpLogger.Log(entry) - - return - } - - l.standardLogger.Error(err) -} - -func (l *Logger) Fatal(err error) { - if l.gcpLogger != nil { - entry := logging.Entry{ - Payload: err.Error(), - Severity: logging.Critical, - } - l.gcpLogger.Log(entry) - log.Fatalln(err) - - return - } - - l.standardLogger.Fatal(err) -} - -// Info logs an informational message using the standard log package -func (sl *StandardLogger) Info(message string) { - sl.logger.Println("[INFO]", message) -} - -// Error logs an error message using the standard log package -func (sl *StandardLogger) Error(err error) { - sl.logger.Println("[ERROR]", err) -} - -// Fatal logs a fatal error message using the standard log package and exits the program -func (sl *StandardLogger) Fatal(err error) { - sl.logger.Fatalln("[FATAL]", err) -} diff --git a/resources/go server/application/utils/logger/structures.go b/resources/go server/application/utils/logger/structures.go deleted file mode 100644 index bfd7564..0000000 --- a/resources/go server/application/utils/logger/structures.go +++ /dev/null @@ -1,20 +0,0 @@ -package logger - -import ( - "log" - - "cloud.google.com/go/logging" -) - -// StandardLogger is a struct for the standard log package -type StandardLogger struct { - logger *log.Logger -} - -// Logger is a logging struct that supports different logging mechanisms -type Logger struct { - client *logging.Client - gcpLogger *logging.Logger - - standardLogger *StandardLogger -} diff --git a/resources/go server/application/utils/utils.go b/resources/go server/application/utils/utils.go deleted file mode 100644 index eb09bab..0000000 --- a/resources/go server/application/utils/utils.go +++ /dev/null @@ -1,139 +0,0 @@ -// Package utils contains the common functions and structures for the application -package utils - -import ( - "fmt" - "math" - "math/rand" - "strings" - "time" - - "github.com/gin-gonic/gin" - "github.com/spf13/viper" -) - -func FloatToTime(number float64) time.Duration { - _, exponent := math.Frexp(number) - exponential := int(exponent) - 1 - - result := number * math.Pow(2, float64(exponential)) - duration := time.Duration(result * float64(time.Millisecond)) - - return duration -} - -// Get GCP Project ID -func GetGCPProjectID() string { - // - var GCPKeyName = map[string]string{ - "ProjectID": "Services.GCP.ProjectID", - } - - viper.SetConfigFile("config.json") - if err := viper.ReadInConfig(); err != nil { - _ = fmt.Errorf("fatal error in config file: %s", err.Error()) - } - - projectID := viper.GetString(GCPKeyName["ProjectID"]) - return projectID -} - -// Get Timezone -func GetTimezone() (*time.Location, error) { - // - var TimezoneKeyName = map[string]string{ - "Timezone": "Timezone", - } - - viper.SetConfigFile("config.json") - if err := viper.ReadInConfig(); err != nil { - _ = fmt.Errorf("fatal error in config file: %s", err.Error()) - } - - tz := viper.GetString(TimezoneKeyName["Timezone"]) - return time.LoadLocation(tz) -} - -// Parse params includes context keys, and route path e.g /user/:userId -func ParseParams(ctx *gin.Context, paramName string, isRoute bool) string { - val, _ := ctx.Keys[paramName].(string) - if len(val) == 0 && isRoute { - val = strings.TrimSpace(ctx.Param(paramName)) // Get the value of ":" parameter from the URL path - } - - return val -} - -// Normalize Phone Number to any country's local format -func NormalizePhoneNumber(phoneNumber string, numberLength int) (string, error) { - nigerianFormats := []string{"080", "081", "070", "090"} - // - // Replace the plus sign with zero - normalizedNumber := strings.ReplaceAll(phoneNumber, "+", "0") - - // Remove the first three digits and replace them with a random value - rand.NewSource(time.Now().UnixNano()) - replacement := nigerianFormats - if len(normalizedNumber) > 3 { - normalizedNumber = replacement[rand.Intn(len(replacement))] + normalizedNumber[3:] - } - - // Check if the resulting string is N digits long - if len(normalizedNumber) < numberLength { - normalizedNumber = fmt.Sprintf("%-*s", numberLength, normalizedNumber) - } else if len(normalizedNumber) > numberLength { - normalizedNumber = normalizedNumber[:numberLength] - } - return normalizedNumber, nil -} - -// delete a field from a map if exists -func DeleteMapFieldIfExists(m map[string]interface{}, field string) map[string]interface{} { - _, exists := m[field] - if exists { - delete(m, field) - } - - return m -} - -// check if a map has any value -func MapHasValues(txFilter map[string]interface{}) bool { - for _, value := range txFilter { - if value != nil { - return true - } - } - return false -} - -// get map values -func GetMapValues(m map[string]interface{}) []interface{} { - values := make([]interface{}, 0, len(m)) - for _, value := range m { - values = append(values, value) - } - return values -} - -// extract non-empty keys/values from map -func ExtractNonEmptyMapKeys(filter map[string]interface{}) map[string]interface{} { - tempMap := map[string]interface{}{} - for key, value := range filter { - if value != nil { - fmt.Println(value) - tempMap[key] = value - } - } - return tempMap -} - -// KoboToNGN converts a kobo amount to naira. -func KoboToNGN(kobo int) float64 { - return float64(kobo) / 100 -} - -// NGNToKobo converts a naira amount to kobo. -func NGNToKobo(naira float64) int { - return int(naira * 100) -} diff --git a/resources/go server/config.json b/resources/go server/config.json deleted file mode 100644 index d423755..0000000 --- a/resources/go server/config.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "Environment": "development", - "Timezone": "Africa/Lagos", - "ServerPort": 9090, - "Secure": { - "Username": "bitspend", - "Password": "12345", - "IPWhiteList": { - "": false - } - }, - "Databases": { - "MySQL": { - "WiseFinanceDB": { - "Hostname": "localhost", - "Name": "wisefinance_db", - "Username": "root", - "Password": "password", - "Port": "3306", - "Parameter": "?parseTime=true", - "UseSocket": false, - "SocketPath": "" - } - } - }, - "CronJobs": { - "TaskWaitTimeMinute": 5 - } -} diff --git a/resources/go server/config.json.example b/resources/go server/config.json.example deleted file mode 100644 index 8199617..0000000 --- a/resources/go server/config.json.example +++ /dev/null @@ -1,29 +0,0 @@ -{ - "Environment": "development", - "Timezone": "Africa/Lagos", - "ServerPort": 8000, - "Secure": { - "Username": "", - "Password": "", - "IPWhiteList": { - "": false - } - }, - "Databases": { - "MySQL": { - "WiseFinanceDB": { - "Hostname": "", - "Name": "", - "Username": "", - "Password": "", - "Port": "3306", - "Parameter": "?parseTime=true", - "UseSocket": false, - "SocketPath": "" - } - } - }, - "CronJobs": { - "TaskWaitTimeMinute": 5 - } -} diff --git a/resources/go server/go.mod b/resources/go server/go.mod deleted file mode 100644 index 0d4af51..0000000 --- a/resources/go server/go.mod +++ /dev/null @@ -1,76 +0,0 @@ -module github.com/FortesenseLabs/wisefinance-mtservices - -go 1.20 - -require ( - github.com/gin-gonic/gin v1.9.1 - github.com/mitchellh/mapstructure v1.5.0 -) - -require ( - cloud.google.com/go v0.110.0 // indirect - cloud.google.com/go/compute v1.19.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/longrunning v0.4.1 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/s2a-go v0.1.3 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.8.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.5 // indirect - github.com/magiconair/properties v1.8.7 // indirect - github.com/spf13/afero v1.9.5 // indirect - github.com/spf13/cast v1.5.1 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/subosito/gotenv v1.4.2 // indirect - go.opencensus.io v0.24.0 // indirect - golang.org/x/oauth2 v0.7.0 // indirect - golang.org/x/sync v0.1.0 // indirect - google.golang.org/api v0.122.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect - google.golang.org/grpc v1.55.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect -) - -require ( - cloud.google.com/go/logging v1.7.0 - github.com/aviddiviner/gin-limit v0.0.0-20170918012823-43b5f79762c1 - github.com/bytedance/sonic v1.9.1 // indirect - github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect - github.com/gabriel-vasile/mimetype v1.4.2 // indirect - github.com/gin-contrib/cors v1.4.0 - github.com/gin-contrib/sse v0.1.0 // indirect - github.com/go-playground/locales v0.14.1 // indirect - github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.14.0 // indirect - github.com/go-sql-driver/mysql v1.7.1 - github.com/goccy/go-json v0.10.2 // indirect - github.com/google/uuid v1.3.1 - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect - github.com/leodido/go-urn v1.2.4 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/pelletier/go-toml/v2 v2.0.8 // indirect - github.com/spf13/viper v1.16.0 - github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - github.com/ugorji/go/codec v1.2.11 // indirect - golang.org/x/arch v0.3.0 // indirect - golang.org/x/crypto v0.9.0 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - gorm.io/driver/mysql v1.5.1 - gorm.io/gorm v1.25.4 - gorm.io/plugin/dbresolver v1.4.7 -) diff --git a/resources/go server/go.sum b/resources/go server/go.sum deleted file mode 100644 index 60f7f8d..0000000 --- a/resources/go server/go.sum +++ /dev/null @@ -1,658 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.0 h1:+9zda3WGgW1ZSTlVppLCYFIr48Pa35q1uG2N1itbCEQ= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= -cloud.google.com/go/logging v1.7.0 h1:CJYxlNNNNAMkHp9em/YEXcfJg+rPDg7YfwoRpMU+t5I= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/aviddiviner/gin-limit v0.0.0-20170918012823-43b5f79762c1 h1:OLrWlPirfG33eUv6tAZBb2SW2K+xBenfJIWJ+nORMTU= -github.com/aviddiviner/gin-limit v0.0.0-20170918012823-43b5f79762c1/go.mod h1:v4YSuwMq3CcRnBfKwKzvCATH1jq46sgSHJ8EEUx2ne0= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= -github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/cors v1.4.0 h1:oJ6gwtUl3lqV0WEIwM/LxPF1QZ5qe2lGWdY2+bz7y0g= -github.com/gin-contrib/cors v1.4.0/go.mod h1:bs9pNM0x/UsmHPBWT2xZz9ROh8xYjYkiURUfmBoMlcs= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= -github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= -github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= -github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= -github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= -github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.3 h1:FAgZmpLl/SXurPEZyCMPBIiiYeTbqfjlbdnCNTAkbGE= -github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.8.0 h1:UBtEZqx1bjXtOQ5BVTkuYghXrr3N4V123VKJK67vJZc= -github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= -github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= -github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= -github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= -github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= -github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= -github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= -github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= -golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.122.0 h1:zDobeejm3E7pEG1mNHvdxvjs5XJoCMzyNH+CmwL94Es= -google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/mysql v1.4.3/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c= -gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw= -gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o= -gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= -gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= -gorm.io/gorm v1.25.4 h1:iyNd8fNAe8W9dvtlgeRI5zSVZPsq3OpcTu37cYcpCmw= -gorm.io/gorm v1.25.4/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= -gorm.io/plugin/dbresolver v1.4.7 h1:ZwtwmJQxTx9us7o6zEHFvH1q4OeEo1pooU7efmnunJA= -gorm.io/plugin/dbresolver v1.4.7/go.mod h1:l4Cn87EHLEYuqUncpEeTC2tTJQkjngPSD+lo8hIvcT0= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/resources/go server/main.go b/resources/go server/main.go deleted file mode 100644 index 32f148c..0000000 --- a/resources/go server/main.go +++ /dev/null @@ -1,130 +0,0 @@ -package main - -import ( - "context" - "fmt" - "net/http" - "os" - "os/signal" - "strings" - "syscall" - "time" - - "github.com/FortesenseLabs/wisefinance-mtservices/application/config" - "github.com/FortesenseLabs/wisefinance-mtservices/application/database/migrations" - - "github.com/FortesenseLabs/wisefinance-mtservices/application/routes" - "github.com/FortesenseLabs/wisefinance-mtservices/application/utils/logger" - "github.com/gin-contrib/cors" - - limit "github.com/aviddiviner/gin-limit" - "github.com/gin-gonic/gin" - "gorm.io/gorm" -) - -var allConfigs = config.GetAllConfigs() - -func main() { - // Creates a logger. - logger, err := logger.NewLogger("", "backend-log") - if err != nil { - logger.Fatal(fmt.Errorf("failed to initialize logger: %v", err)) - } - - // logger.InitLog(allConfigs.Services.GCP.ProjectID, "backend-log") - logger.Info("Wisefinance MetaTrader Backend Server...") - // Create a context for graceful shutdown - _, cancel := context.WithCancel(context.Background()) - defer cancel() - - // const HOST = "127.0.0.1" - // const PORT = 9090 - - router := gin.Default() - router.Use(limit.MaxAllowed(200)) - - // Configure CORS - // router.Use(cors.Default()) - corsConfig := cors.DefaultConfig() - // corsConfig.AddAllowHeaders("Authorization") - corsConfig.AllowAllOrigins = true - router.Use(cors.New(corsConfig)) - - logger.Info("Connecting to Database!!!") - - DB, err := config.GormOpen() - if err != nil { - logger.Fatal(fmt.Errorf("fatal error in database file: %s", err)) - } - - logger.Info("Running Auto Migrations...") - migrations.RunAutoMigrations(logger, DB) - - logger.Info("Starting Server!!!") - - routes.ApplicationV1Router(router, DB, logger) - - // Start the server - server := &http.Server{ - Addr: fmt.Sprintf(":%v", allConfigs.ServerPort), - Handler: router, - ReadTimeout: 18000 * time.Second, - WriteTimeout: 18000 * time.Second, - MaxHeaderBytes: 1 << 20, - } - - go func() { - startServer(logger, server, router) - }() - - logger.Info("Server started") - - // Graceful shutdown - gracefulShutdown(logger, server, cancel, DB) - -} - -func startServer(logger *logger.Logger, server *http.Server, router http.Handler) { - if err := server.ListenAndServe(); err != nil { - err = fmt.Errorf("fatal error description: %s", strings.ToLower(err.Error())) - logger.Fatal(err) - } -} - -func gracefulShutdown(logger *logger.Logger, server *http.Server, cancel context.CancelFunc, dbConnection *gorm.DB) { - quit := make(chan os.Signal, 1) - signal.Notify(quit, os.Interrupt, syscall.SIGTERM) - <-quit - - logger.Info("Server is shutting down...") - - // Set a timeout for graceful shutdown - ctx, cancelShutdown := context.WithTimeout(context.Background(), 5*time.Second) - defer cancelShutdown() - - // Perform any cleanup or additional shutdown steps here - - // Close the database connection - db, err := dbConnection.DB() - if err != nil { - logger.Error(fmt.Errorf("failed to get database connection: %v", err)) - } - - if err := db.Close(); err != nil { - logger.Error(fmt.Errorf("failed to close database connection: %v", err)) - } - - // Shutdown the server - if err := server.Shutdown(ctx); err != nil { - logger.Error(fmt.Errorf("failed to gracefully shutdown server: %v", err)) - } - - cancel() - - logger.Info("Server has stopped") -} - -// https://stackoverflow.com/questions/24987131/how-to-parse-unix-timestamp-to-time-time -// https://github.com/ejtraderLabs/ejtraderMT/ -// https://learning-0mq-with-pyzmq.readthedocs.io/en/latest/pyzmq/patterns/pushpull.html -// https://github.com/ejtraderLabs/ejtraderMT/blob/master/ejtraderMT/api/mql.py diff --git a/resources/mt5-rest/.gitignore b/resources/mt5-rest/.gitignore deleted file mode 100644 index 38a5668..0000000 --- a/resources/mt5-rest/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -x64 -packages -.vs -*.suo -*.user -*.userosscache -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db diff --git a/resources/mt5-rest/MQL5/Experts/Advisors/RestApi.ex5 b/resources/mt5-rest/MQL5/Experts/Advisors/RestApi.ex5 deleted file mode 100644 index 647127b..0000000 Binary files a/resources/mt5-rest/MQL5/Experts/Advisors/RestApi.ex5 and /dev/null differ diff --git a/resources/mt5-rest/MQL5/Experts/Advisors/RestApi.mq5 b/resources/mt5-rest/MQL5/Experts/Advisors/RestApi.mq5 deleted file mode 100644 index 8e8f5df..0000000 Binary files a/resources/mt5-rest/MQL5/Experts/Advisors/RestApi.mq5 and /dev/null differ diff --git a/resources/mt5-rest/MQL5/Include/RestApi.mqh b/resources/mt5-rest/MQL5/Include/RestApi.mqh deleted file mode 100644 index 7561b87..0000000 Binary files a/resources/mt5-rest/MQL5/Include/RestApi.mqh and /dev/null differ diff --git a/resources/mt5-rest/MQL5/Include/json.mqh b/resources/mt5-rest/MQL5/Include/json.mqh deleted file mode 100644 index fd1b58c..0000000 Binary files a/resources/mt5-rest/MQL5/Include/json.mqh and /dev/null differ diff --git a/resources/mt5-rest/MQL5/Libraries/LIBEAY32.dll b/resources/mt5-rest/MQL5/Libraries/LIBEAY32.dll deleted file mode 100644 index 346d575..0000000 Binary files a/resources/mt5-rest/MQL5/Libraries/LIBEAY32.dll and /dev/null differ diff --git a/resources/mt5-rest/MQL5/Libraries/SSLEAY32.dll b/resources/mt5-rest/MQL5/Libraries/SSLEAY32.dll deleted file mode 100644 index 2b84f95..0000000 Binary files a/resources/mt5-rest/MQL5/Libraries/SSLEAY32.dll and /dev/null differ diff --git a/resources/mt5-rest/MQL5/Libraries/boost_date_time-vc141-mt-x64-1_69.dll b/resources/mt5-rest/MQL5/Libraries/boost_date_time-vc141-mt-x64-1_69.dll deleted file mode 100644 index 72e3ad3..0000000 Binary files a/resources/mt5-rest/MQL5/Libraries/boost_date_time-vc141-mt-x64-1_69.dll and /dev/null differ diff --git a/resources/mt5-rest/MQL5/Libraries/cpprest_2_10.dll b/resources/mt5-rest/MQL5/Libraries/cpprest_2_10.dll deleted file mode 100644 index ff63c71..0000000 Binary files a/resources/mt5-rest/MQL5/Libraries/cpprest_2_10.dll and /dev/null differ diff --git a/resources/mt5-rest/MQL5/Libraries/docs.html b/resources/mt5-rest/MQL5/Libraries/docs.html deleted file mode 100644 index 549b879..0000000 --- a/resources/mt5-rest/MQL5/Libraries/docs.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - -
- - \ No newline at end of file diff --git a/resources/mt5-rest/MQL5/Libraries/mt5-rest.dll b/resources/mt5-rest/MQL5/Libraries/mt5-rest.dll deleted file mode 100644 index a39a011..0000000 Binary files a/resources/mt5-rest/MQL5/Libraries/mt5-rest.dll and /dev/null differ diff --git a/resources/mt5-rest/MQL5/Libraries/swagger.json b/resources/mt5-rest/MQL5/Libraries/swagger.json deleted file mode 100644 index 4b56b7c..0000000 --- a/resources/mt5-rest/MQL5/Libraries/swagger.json +++ /dev/null @@ -1,822 +0,0 @@ -{ - "swagger" : "2.0", - "info" : { - "description" : "Turns Metatrader5 into REST API server", - "version" : "1.0.0", - "title" : "Metatrader5 REST API", - "contact" : { - "email" : "mikhail@dev4traders.com" - } - }, - "tags" : [ { - "name" : "symbol", - "description" : "Market symbol" - },{ - "name" : "account", - "description" : "MT5 account" - }, { - "name" : "trade", - "description" : "Trade" - }, { - "name" : "position", - "description" : "Position" - }, { - "name" : "deal", - "description" : "Deal/Transaction" - }, { - "name" : "order", - "description" : "Order" - } ], - "paths" : { - "/info" : { - "get" : { - "tags" : [ "account" ], - "security":[{"apiKey":[]}], - "summary" : "get account info", - "operationId" : "info", - "description" : "Loads Account balance, broker, name, etc..\n", - "produces" : [ "application/json" ], - "responses" : { - "200" : { - "description" : "info in json", - "schema" : { - "$ref" : "#/definitions/AccountItem" - } - }, - "400" : { - "description" : "bad input parameter" - } - } - } - }, - "/balance" : { - "get" : { - "tags" : [ "account" ], - "security":[{"apiKey":[]}], - "summary" : "get account balance", - "operationId" : "balance", - "description" : "Loads Account balance, margin, free margin\n", - "produces" : [ "application/json" ], - "responses" : { - "200" : { - "description" : "balance info in json", - "schema" : { - "$ref" : "#/definitions/BalanceItem" - } - }, - "400" : { - "description" : "bad input parameter" - } - } - } - }, - "/symbols/{name}" : { - "get" : { - "tags" : [ "symbol" ], - "parameters":[{"name":"name","in":"path","required":true,"type":"string"}], - "security":[{"apiKey":[]}], - "summary" : "get symbol info", - "operationId" : "symbol", - "description" : "Loads Symbol info by name\n", - "produces" : [ "application/json" ], - "responses" : { - "200" : { - "description" : "bid/ask in json", - "schema" : { - "$ref" : "#/definitions/Symbol" - } - }, - "400" : { - "description" : "bad input parameter" - } - } - } - }, - "/orders" : { - "get" : { - "tags" : [ "order" ], - "security":[{"apiKey":[]}], - "summary" : "get account orders", - "operationId" : "orders", - "description" : "Loads Account Orders\n", - "produces" : [ "application/json" ], - "responses" : { - "200" : { - "description" : "orders array in json", - "schema" : { - "$ref" : "#/definitions/ArrayOfOrders" - } - }, - "400" : { - "description" : "bad input parameter" - } - } - } - }, - "/orders/{id}" : { - "get" : { - "tags" : [ "order" ], - "parameters":[{"name":"id","in":"path","required":true,"type":"string"}], - "security":[{"apiKey":[]}], - "summary" : "get account order", - "operationId" : "order", - "description" : "Loads Account Order by id\n", - "produces" : [ "application/json" ], - "responses" : { - "200" : { - "description" : "order in json", - "schema" : { - "$ref" : "#/definitions/Order" - } - }, - "400" : { - "description" : "bad input parameter" - } - } - } - }, - "/history" : { - "get" : { - "tags" : [ "order" ], - "security":[{"apiKey":[]}], - "summary" : "get account orders history", - "operationId" : "orders_history", - "description" : "Loads Account Orders History\n", - "produces" : [ "application/json" ], - "responses" : { - "200" : { - "description" : "orders array in json", - "schema" : { - "$ref" : "#/definitions/ArrayOfOrdersHistory" - } - }, - "400" : { - "description" : "bad input parameter" - } - } - } - }, - "/history/{id}" : { - "get" : { - "tags" : [ "order" ], - "parameters":[{"name":"id","in":"path","required":true,"type":"string"}], - "security":[{"apiKey":[]}], - "summary" : "get account order from history", - "operationId" : "order_history", - "description" : "Loads Account Order from History by id\n", - "produces" : [ "application/json" ], - "responses" : { - "200" : { - "description" : "order in json", - "schema" : { - "$ref" : "#/definitions/OrderHistory" - } - }, - "400" : { - "description" : "bad input parameter" - } - } - } - }, - "/deals?offset={offset}&limit={limit}" : { - "get" : { - "tags" : [ "deal" ], - "security":[{"apiKey":[]}], - "summary" : "get account deals", - "operationId" : "dealrequest", - "description" : "Loads Account Deals\n", - "produces" : [ "application/json" ], - "parameters" : [ - { - "in" : "query", - "name" : "offset", - "required" : true, - "schema" : { - "type" : "string" - } - }, - { - "in" : "query", - "name" : "limit", - "required" : true, - "schema" : { - "type" : "string" - } - } ], - "responses" : { - "200" : { - "description" : "deals array in json", - "schema" : { - "$ref" : "#/definitions/ArrayOfDeals" - } - }, - "400" : { - "description" : "bad input parameter" - } - } - } - }, - "/deals/{id}" : { - "get" : { - "tags" : [ "deal" ], - "parameters":[{"name":"id","in":"path","required":true,"type":"string"}], - "security":[{"apiKey":[]}], - "summary" : "get account deals", - "operationId" : "deals", - "description" : "Loads Account Deals by id\n", - "produces" : [ "application/json" ], - "responses" : { - "200" : { - "description" : "Deal in json", - "schema" : { - "$ref" : "#/definitions/Deal" - } - }, - "400" : { - "description" : "bad input parameter" - } - } - } - }, - "/positions" : { - "get" : { - "tags" : [ "position" ], - "security":[{"apiKey":[]}], - "summary" : "get account positions", - "operationId" : "positions", - "description" : "Loads Account Positions\n", - "produces" : [ "application/json" ], - "responses" : { - "200" : { - "description" : "positions array in json", - "schema" : { - "$ref" : "#/definitions/ArrayOfPositions" - } - }, - "400" : { - "description" : "bad input parameter" - } - } - } - }, - "/positions/{id}" : { - "get" : { - "tags" : [ "position" ], - "parameters":[{"name":"id","in":"path","required":true,"type":"string"}], - "security":[{"apiKey":[]}], - "summary" : "get account position", - "operationId" : "position", - "description" : "Loads Account Position by id\n", - "produces" : [ "application/json" ], - "responses" : { - "200" : { - "description" : "position in json", - "schema" : { - "$ref" : "#/definitions/Position" - } - }, - "400" : { - "description" : "bad input parameter" - } - } - } - }, - "/trade" : { - "post" : { - "tags" : [ "trade" ], - "security":[{"apiKey":[]}], - "summary" : "Send Order", - "produces" : [ "application/json" ], - "consumes" : [ "application/json" ], - "parameters" : [ { - "in" : "body", - "name" : "body", - "description" : "{\"actionType\": \"ORDER_TYPE_BUY\" }", - "required" : true, - "schema" : { - "$ref" : "#/definitions/TradeInput" - } - } ], - "responses" : { - "200" : { - "description" : "successful operation", - "schema" : { - "$ref" : "#/definitions/TradeReturn" - } - }, - "400" : { - "description" : "bad input parameter" - } - } - } - } - }, - "securityDefinitions": { - "apiKey": { - "type": "apiKey", - "in": "header", - "name": "Authorization" - } - }, - "definitions" : { - "TradeInput" : { - "type" : "object", - "properties" : { - "id" : { - "type" : "integer", - "example" : 1 - }, - "symbol" : { - "type" : "string", - "example" : "EURUSD" - }, - "actionType" : { - "type" : "string", - "enum" : [ "ORDER_TYPE_SELL", "ORDER_TYPE_BUY", "ORDER_TYPE_BUY_LIMIT", "ORDER_TYPE_SELL_LIMIT", "ORDER_TYPE_BUY_STOP", "ORDER_TYPE_SELL_STOP", "POSITION_MODIFY", "POSITION_PARTIAL", "POSITION_CLOSE_ID", "POSITION_CLOSE_SYMBOL", "ORDER_MODIFY", "ORDER_CANCEL" ] - }, - "volume" : { - "type" : "number", - "example" : 0.1 - }, - "price" : { - "type" : "number", - "example" : 1.12121 - }, - "stoploss" : { - "type" : "number", - "example" : 1.12121 - }, - "takeprofit" : { - "type" : "number", - "example" : 1.12121 - } - } - }, - "TradeReturn" : { - "type" : "object", - "properties" : { - "error" : { - "type" : "integer", - "example" : 6533 - }, - "description" : { - "type" : "string", - "example" : "ERR_WRONG_ACTION" - } - } - }, - "Symbol" : { - "type" : "object", - "properties" : { - "ask" : { - "type" : "number", - "example" : 1.22323 - }, - "bid" : { - "type" : "number", - "example" : 1.34341 - } - } - }, - "AccountItem" : { - "type" : "object", - "properties" : { - "currency" : { - "type" : "string", - "example" : "USD" - }, - "server" : { - "type" : "string", - "example" : "MetaQuotes-Demo" - }, - "broker" : { - "type" : "string", - "example" : "MetaQuotes Software Corp." - }, - "balance" : { - "type" : "number", - "example" : 1000.0 - }, - "equity" : { - "type" : "number", - "example" : 1000.0 - }, - "margin" : { - "type" : "number", - "example" : 1000.0 - }, - "margin_free" : { - "type" : "number", - "example" : 1000.0 - }, - "margin_level" : { - "type" : "number", - "example" : 1000.0 - }, - "orders_total" : { - "type" : "integer", - "example" : 2 - }, - "positions_total" : { - "type" : "integer", - "example" : 2 - } - } - }, - "BalanceItem" : { - "type" : "object", - "properties" : { - "balance" : { - "type" : "number", - "example" : 1000.0 - }, - "equity" : { - "type" : "number", - "example" : 1000.0 - }, - "margin" : { - "type" : "number", - "example" : 1000.0 - }, - "margin_free" : { - "type" : "number", - "example" : 1000.0 - } - } - }, - "ArrayOfOrders" : { - "type" : "array", - "items" : { - "type" : "object", - "properties" : { - "id" : { - "type" : "integer", - "example" : 1 - }, - "type" : { - "type" : "string", - "enum" : [ "ORDER_TYPE_SELL", "ORDER_TYPE_BUY", "ORDER_TYPE_BUY_LIMIT", "ORDER_TYPE_SELL_LIMIT", "ORDER_TYPE_BUY_STOP", "ORDER_TYPE_SELL_STOP", "POSITION_MODIFY", "POSITION_PARTIAL", "POSITION_CLOSE_ID", "POSITION_CLOSE_SYMBOL", "ORDER_MODIFY", "ORDER_CANCEL" ] - }, - "magic" : { - "type" : "integer", - "example" : 0 - }, - "symbol" : { - "type" : "string", - "example" : "EURUSD" - }, - "time_setup" : { - "type" : "string", - "example" : "2019-06-05T19:35:50.000Z" - }, - "open" : { - "type" : "number", - "example" : 1.65656 - }, - "stoploss" : { - "type" : "number", - "example" : 1.65656 - }, - "takeprofit" : { - "type" : "number", - "example" : 1.65656 - }, - "volume" : { - "type" : "number", - "example" : 0.1 - } - } - } - }, - "Order" : { - "type" : "object", - "properties" : { - "id" : { - "type" : "integer", - "example" : 1 - }, - "type" : { - "type" : "string", - "enum" : [ "ORDER_TYPE_SELL", "ORDER_TYPE_BUY", "ORDER_TYPE_BUY_LIMIT", "ORDER_TYPE_SELL_LIMIT", "ORDER_TYPE_BUY_STOP", "ORDER_TYPE_SELL_STOP", "POSITION_MODIFY", "POSITION_PARTIAL", "POSITION_CLOSE_ID", "POSITION_CLOSE_SYMBOL", "ORDER_MODIFY", "ORDER_CANCEL" ] - }, - "magic" : { - "type" : "integer", - "example" : 0 - }, - "symbol" : { - "type" : "string", - "example" : "EURUSD" - }, - "time_setup" : { - "type" : "string", - "example" : "2019-06-05T19:35:50.000Z" - }, - "open" : { - "type" : "number", - "example" : 1.65656 - }, - "stoploss" : { - "type" : "number", - "example" : 1.65656 - }, - "takeprofit" : { - "type" : "number", - "example" : 1.65656 - }, - "volume" : { - "type" : "number", - "example" : 0.1 - } - } - }, - "ArrayOfOrdersHistory" : { - "type" : "array", - "items" : { - "type" : "object", - "properties" : { - "id" : { - "type" : "integer", - "example" : 1 - }, - "type" : { - "type" : "string", - "enum" : [ "ORDER_TYPE_SELL", "ORDER_TYPE_BUY", "ORDER_TYPE_BUY_LIMIT", "ORDER_TYPE_SELL_LIMIT", "ORDER_TYPE_BUY_STOP", "ORDER_TYPE_SELL_STOP", "POSITION_MODIFY", "POSITION_PARTIAL", "POSITION_CLOSE_ID", "POSITION_CLOSE_SYMBOL", "ORDER_MODIFY", "ORDER_CANCEL" ] - }, - "state" : { - "type" : "string", - "enum" : [ "ORDER_STATE_STARTED", "ORDER_STATE_PLACED", "ORDER_STATE_CANCELED", "ORDER_STATE_PARTIAL", "ORDER_STATE_FILLED", "ORDER_STATE_REJECTED", "ORDER_STATE_EXPIRED", "ORDER_STATE_REQUEST_ADD", "ORDER_STATE_REQUEST_MODIFY", "ORDER_STATE_REQUEST_CANCEL" ] - }, - "magic" : { - "type" : "integer", - "example" : 0 - }, - "symbol" : { - "type" : "string", - "example" : "EURUSD" - }, - "time_setup" : { - "type" : "string", - "example" : "2019-06-05T19:35:50.000Z" - }, - "time_done" : { - "type" : "string", - "example" : "2019-06-05T19:35:50.000Z" - }, - "open" : { - "type" : "number", - "example" : 1.65656 - }, - "stoploss" : { - "type" : "number", - "example" : 1.65656 - }, - "takeprofit" : { - "type" : "number", - "example" : 1.65656 - }, - "volume" : { - "type" : "number", - "example" : 0.1 - } - } - } - }, - "OrderHistory" : { - "type" : "object", - "properties" : { - "id" : { - "type" : "integer", - "example" : 1 - }, - "type" : { - "type" : "string", - "enum" : [ "ORDER_TYPE_SELL", "ORDER_TYPE_BUY", "ORDER_TYPE_BUY_LIMIT", "ORDER_TYPE_SELL_LIMIT", "ORDER_TYPE_BUY_STOP", "ORDER_TYPE_SELL_STOP", "POSITION_MODIFY", "POSITION_PARTIAL", "POSITION_CLOSE_ID", "POSITION_CLOSE_SYMBOL", "ORDER_MODIFY", "ORDER_CANCEL" ] - }, - "state" : { - "type" : "string", - "enum" : [ "ORDER_STATE_STARTED", "ORDER_STATE_PLACED", "ORDER_STATE_CANCELED", "ORDER_STATE_PARTIAL", "ORDER_STATE_FILLED", "ORDER_STATE_REJECTED", "ORDER_STATE_EXPIRED", "ORDER_STATE_REQUEST_ADD", "ORDER_STATE_REQUEST_MODIFY", "ORDER_STATE_REQUEST_CANCEL" ] - }, - "magic" : { - "type" : "integer", - "example" : 0 - }, - "symbol" : { - "type" : "string", - "example" : "EURUSD" - }, - "time_setup" : { - "type" : "string", - "example" : "2019-06-05T19:35:50.000Z" - }, - "time_done" : { - "type" : "string", - "example" : "2019-06-05T19:35:50.000Z" - }, - "open" : { - "type" : "number", - "example" : 1.65656 - }, - "stoploss" : { - "type" : "number", - "example" : 1.65656 - }, - "takeprofit" : { - "type" : "number", - "example" : 1.65656 - }, - "volume" : { - "type" : "number", - "example" : 0.1 - } - } - }, - "ArrayOfDeals" : { - "type" : "array", - "items" : { - "type" : "object", - "properties" : { - "id" : { - "type" : "integer", - "example" : 1 - }, - "price" : { - "type" : "number", - "example" : 1.65656 - }, - "commission" : { - "type" : "number", - "example" : 0.1 - }, - "time" : { - "type" : "string", - "example" : "2019-06-05T19:35:50.000Z" - }, - "symbol" : { - "type" : "string", - "example" : "EURUSD" - }, - "type" : { - "type" : "string", - "enum": [ "DEAL_TYPE_BUY", "DEAL_TYPE_SELL", "DEAL_TYPE_BALANCE", "DEAL_TYPE_CREDIT", "DEAL_TYPE_CHARGE", "DEAL_TYPE_CORRECTION", "DEAL_TYPE_BONUS", "DEAL_TYPE_COMMISSION", "DEAL_TYPE_COMMISSION_DAILY", "DEAL_TYPE_COMMISSION_MONTHLY", "DEAL_TYPE_COMMISSION_AGENT_DAILY", "DEAL_TYPE_COMMISSION_AGENT_MONTHLY", "DEAL_TYPE_INTEREST", "DEAL_TYPE_BUY_CANCELED", "DEAL_TYPE_SELL_CANCELED", "DEAL_DIVIDEND", "DEAL_DIVIDEND_FRANKED", "DEAL_TAX" ] - }, - "profit" : { - "type" : "number", - "example" : 0.1 - }, - "volume" : { - "type" : "number", - "example" : 0.1 - }, - "position_id" : { - "type" : "integer", - "example" : 1 - }, - "order_id" : { - "type" : "integer", - "example" : 1 - } - } - } - }, - "Deal" : { - "type" : "object", - "properties" : { - "id" : { - "type" : "integer", - "example" : 1 - }, - "price" : { - "type" : "number", - "example" : 1.65656 - }, - "commission" : { - "type" : "number", - "example" : 0.1 - }, - "time" : { - "type" : "string", - "example" : "2019-06-05T19:35:50.000Z" - }, - "symbol" : { - "type" : "string", - "example" : "EURUSD" - }, - "type" : { - "type" : "string", - "enum": [ "DEAL_TYPE_BUY", "DEAL_TYPE_SELL", "DEAL_TYPE_BALANCE", "DEAL_TYPE_CREDIT", "DEAL_TYPE_CHARGE", "DEAL_TYPE_CORRECTION", "DEAL_TYPE_BONUS", "DEAL_TYPE_COMMISSION", "DEAL_TYPE_COMMISSION_DAILY", "DEAL_TYPE_COMMISSION_MONTHLY", "DEAL_TYPE_COMMISSION_AGENT_DAILY", "DEAL_TYPE_COMMISSION_AGENT_MONTHLY", "DEAL_TYPE_INTEREST", "DEAL_TYPE_BUY_CANCELED", "DEAL_TYPE_SELL_CANCELED", "DEAL_DIVIDEND", "DEAL_DIVIDEND_FRANKED", "DEAL_TAX" ] - }, - "profit" : { - "type" : "number", - "example" : 0.1 - }, - "volume" : { - "type" : "number", - "example" : 0.1 - }, - "position_id" : { - "type" : "integer", - "example" : 1 - }, - "order_id" : { - "type" : "integer", - "example" : 1 - } - } - }, - "Position" : { - "type" : "object", - "properties" : { - "id" : { - "type" : "integer", - "example" : 1 - }, - "type" : { - "type" : "string", - "enum": ["POSITION_TYPE_BUY", "POSITION_TYPE_SELL"] - }, - "magic" : { - "type" : "integer", - "example" : 0 - }, - "symbol" : { - "type" : "string", - "example" : "EURUSD" - }, - "time_setup" : { - "type" : "string", - "example" : "2019-06-05T19:35:50.000Z" - }, - "open" : { - "type" : "number", - "example" : 1.65656 - }, - "price_current" : { - "type" : "number", - "example" : 1.65656 - }, - "stoploss" : { - "type" : "number", - "example" : 1.65656 - }, - "takeprofit" : { - "type" : "number", - "example" : 1.65656 - }, - "volume" : { - "type" : "number", - "example" : 0.1 - } - } - }, - "ArrayOfPositions" : { - "type" : "array", - "items" : { - "type" : "object", - "properties" : { - "id" : { - "type" : "integer", - "example" : 1 - }, - "type" : { - "type" : "string", - "enum": ["POSITION_TYPE_BUY", "POSITION_TYPE_SELL"] - }, - "magic" : { - "type" : "integer", - "example" : 0 - }, - "symbol" : { - "type" : "string", - "example" : "EURUSD" - }, - "time_setup" : { - "type" : "string", - "example" : "2019-06-05T19:35:50.000Z" - }, - "open" : { - "type" : "number", - "example" : 1.65656 - }, - "price_current" : { - "type" : "number", - "example" : 1.65656 - }, - "stoploss" : { - "type" : "number", - "example" : 1.65656 - }, - "takeprofit" : { - "type" : "number", - "example" : 1.65656 - }, - "volume" : { - "type" : "number", - "example" : 0.1 - } - } - } - } - }, - "host" : "localhost:6542", - "schemes" : [ "http" ] -} \ No newline at end of file diff --git a/resources/mt5-rest/MQL5/Libraries/zlib1.dll b/resources/mt5-rest/MQL5/Libraries/zlib1.dll deleted file mode 100644 index 4914aef..0000000 Binary files a/resources/mt5-rest/MQL5/Libraries/zlib1.dll and /dev/null differ diff --git a/resources/mt5-rest/README.md b/resources/mt5-rest/README.md deleted file mode 100644 index 48f97fa..0000000 --- a/resources/mt5-rest/README.md +++ /dev/null @@ -1,165 +0,0 @@ -Turns Metatrader5 into REST API server. - -Note: make sure you have VSredist: https://www.microsoft.com/en-ie/download/details.aspx?id=48145 - -time_setup, time is MQL5 datetime, check docs at: https://www.mql5.com/en/docs/basis/types/integer/datetime - -check "error" for /trade command on that page: https://www.mql5.com/en/docs/constants/errorswarnings/enum_trade_return_codes - -for enums check that page: https://www.mql5.com/en/docs/constants - -## how to compile -clone repo to any folder on our PC. - -Copy MQL5 folder to Data folder of mt5 (how to get where is Data folder is localted, open mt5, click File->Open Data Folder or just click Ctrl+Shft+D). -In MT5 Navigator (to show Naavigator click Ctrl+N) select Expert Advisors->Advisors. Right click on RestApi, select Modify. Editor will be opened, press F7 to compile. Done. - -To compile C++ dll use Visual Studio 2017. Use .sln file to open solution in VS, select Realease x64 and press Ctrl+Shft+b to build dll file. Output is located under /x64 folder. - - -## Commands - -POST /sub - setup web hook. options: callback_url and callback_format (json or x-form) - -GET /symbols/{name} - get symbol informaiton including ask/bid prices. - -GET /info - get account details, number of orders, number of positions - -GET /positions - returns list of positions - -GET /positions/{id} - return position by id - -GET /deals?offset={offset}&limit={limit} - returns list of deals/transactions - -GET /deals/{id} - return deal by id - -GET /orders - returns list of orders - -GET /orders/{id} - return order by id - -GET /history - returns list of history orders - -GET /history/{id} - return order history by id - -POST /trade - open position, details in POST body - -# Example of POST body for trade command - -## Open Buy -```json -{ - "symbol":"EURUSD", - "actionType": "ORDER_TYPE_BUY", - "volume": 0.1, - "stoploss": 1.3455, - "takeprofit": 1.33333, - "comment": "test buy" -} -``` - -## Open Sell -```json -{ - "symbol":"EURUSD", - "actionType": "ORDER_TYPE_SELL", - "volume": 0.1, - "stoploss": 1.3455, - "takeprofit": 1.33333, - "comment": "test buy" -} -``` - -## Open Buy Limit -```json -{ - "symbol":"EURUSD", - "actionType": "ORDER_TYPE_BUY_LIMIT", - "price": 1.4444, - "volume": 0.1, - "stoploss": 1.3455, - "takeprofit": 1.33333, - "comment": "test buy limit" -} -``` - -## Open Sell Limit -```json -{ - "symbol":"EURUSD", - "actionType": "ORDER_TYPE_SELL_LIMIT", - "price": 1.4444, - "volume": 0.1, - "stoploss": 1.3455, - "takeprofit": 1.33333, - "comment": "test sell limit" -} -``` - -## Open Buy Stop -```json -{ - "symbol":"EURUSD", - "actionType": - "ORDER_TYPE_BUY_STOP", - "price": 1.4444, - "volume": 0.1, - "stoploss": 1.3455, - "takeprofit": 1.33333, - "comment": "test buy stop" -} -``` - -## Open Sell Stop -```json -{ - "symbol":"EURUSD", - "actionType": "ORDER_TYPE_SELL_STOP", - "price": 1.4444, - "volume": 0.1, - "stoploss": 1.3455, - "takeprofit": 1.33333, - "comment": "test sell stop" -} -``` - -## Position Close by ID -```json -{ "actionType": "POSITION_CLOSE_ID", "id": 1212121 } -``` - -## Order Cancel -```json -{ "actionType": "ORDER_CANCEL", "id": 1212121 } -``` - -## Order Cancel -```json -{ "actionType": "POSITION_PARTIAL", "id": 1212121, "volume": 0.1 } -``` - - -# Examples of /trade output -```json -{ - "error": 10018, - "desription": "TRADE_RETCODE_MARKET_CLOSED", - "order_id": 0, - "volume": 0, - "price": 0, - "bid": 0, - "ask": 0, - "function": "CRestApi::tradingModule" -} -``` -```json -{ - "error": 10009, - "desription": "TRADE_RETCODE_DONE", - "order_id": 405895526, - "volume": 0.1, - "price": 1.13047, - "bid": 1.13038, - "ask": 1.13047, - "function": "CRestApi::tradingModule" -} -``` diff --git a/resources/mt5-rest/mt5-rest.sln b/resources/mt5-rest/mt5-rest.sln deleted file mode 100644 index 1629187..0000000 --- a/resources/mt5-rest/mt5-rest.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mt4-rest", "mt5-rest\mt5-rest.vcxproj", "{7359E8DF-CF85-409D-833B-3B66F8DAC462}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7359E8DF-CF85-409D-833B-3B66F8DAC462}.Debug|x64.ActiveCfg = Debug|x64 - {7359E8DF-CF85-409D-833B-3B66F8DAC462}.Debug|x64.Build.0 = Debug|x64 - {7359E8DF-CF85-409D-833B-3B66F8DAC462}.Debug|x86.ActiveCfg = Debug|Win32 - {7359E8DF-CF85-409D-833B-3B66F8DAC462}.Debug|x86.Build.0 = Debug|Win32 - {7359E8DF-CF85-409D-833B-3B66F8DAC462}.Release|x64.ActiveCfg = Release|x64 - {7359E8DF-CF85-409D-833B-3B66F8DAC462}.Release|x64.Build.0 = Release|x64 - {7359E8DF-CF85-409D-833B-3B66F8DAC462}.Release|x86.ActiveCfg = Release|Win32 - {7359E8DF-CF85-409D-833B-3B66F8DAC462}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {08964258-A61B-48D7-9E07-0818CDD29B8B} - EndGlobalSection -EndGlobal diff --git a/resources/mt5-rest/mt5-rest/basic_controller.cpp b/resources/mt5-rest/mt5-rest/basic_controller.cpp deleted file mode 100644 index 8568f34..0000000 --- a/resources/mt5-rest/mt5-rest/basic_controller.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include "stdafx.h" -#include "network_utils.hpp" // -> these two lines must stay in this order, boost/cpprestsdk header include order breaks "U" -#include "basic_controller.hpp" // -| - -namespace cfx { - BasicController::BasicController() { - - } - - BasicController::~BasicController() { - - } - void BasicController::setEndpoint(const utility::string_t & value) { - uri endpointURI(value); - uri_builder endpointBuilder; - - endpointBuilder.set_scheme(endpointURI.scheme()); - - if (endpointURI.host() == U("host_auto_ip4")) { - endpointBuilder.set_host(NetworkUtils::hostIP4()); - } - else if (endpointURI.host() == U("host_auto_ip6")) { - endpointBuilder.set_host(NetworkUtils::hostIP6()); - } - else { - endpointBuilder.set_host(endpointURI.host()); - } - endpointBuilder.set_port(endpointURI.port()); - endpointBuilder.set_path(endpointURI.path()); - - _listener = http_listener(endpointBuilder.to_uri()); - } - - utility::string_t BasicController::endpoint() const { - return _listener.uri().to_string(); - } - - utility::string_t BasicController::getHostPort() const { - return _listener.uri().host() + L":" + std::to_wstring( _listener.uri().port() ); - } - - pplx::task BasicController::accept() { - initRestOpHandlers(); - return _listener.open(); - } - - pplx::task BasicController::shutdown() { - return _listener.close(); - } - - std::vector BasicController::requestPath(const http_request & message) { - auto relativePath = uri::decode(message.relative_uri().path()); - return uri::split_path(relativePath); - } - - std::map BasicController::requestQueryParams(const http_request & message) { - auto query = message.relative_uri().query(); - return uri::split_query(query); - } -} diff --git a/resources/mt5-rest/mt5-rest/basic_controller.hpp b/resources/mt5-rest/mt5-rest/basic_controller.hpp deleted file mode 100644 index 769c28f..0000000 --- a/resources/mt5-rest/mt5-rest/basic_controller.hpp +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include -#include -#include -#include "controller.hpp" - -using namespace web; -using namespace http::experimental::listener; - -namespace cfx { - class BasicController { - protected: - http_listener _listener; // main micro service network endpoint - - public: - BasicController(); - ~BasicController(); - - void setEndpoint(const utility::string_t & value); - utility::string_t endpoint() const; - utility::string_t getHostPort() const; - pplx::task accept(); - pplx::task shutdown(); - - virtual void initRestOpHandlers() { - /* had to be implemented by the child class */ - } - - std::vector requestPath(const http_request & message); - std::map requestQueryParams(const http_request & message); - }; -} diff --git a/resources/mt5-rest/mt5-rest/controller.hpp b/resources/mt5-rest/mt5-rest/controller.hpp deleted file mode 100644 index 2a7e6b6..0000000 --- a/resources/mt5-rest/mt5-rest/controller.hpp +++ /dev/null @@ -1,53 +0,0 @@ -// -// Created by Ivan Mejia on 12/03/16. -// -// MIT License -// -// Copyright (c) 2016 ivmeroLabs. All rights reserved. -// -// 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. -// - -#pragma once - -#include - -using namespace web; -using namespace http; - -namespace cfx { - - /*! - * Dispatcher class represents the basic interface for a - * web serivce handler. - */ - class Controller { - public: - virtual void handleGet(http_request message) = 0; - virtual void handlePut(http_request message) = 0; - virtual void handlePost(http_request message) = 0; - virtual void handleDelete(http_request message) = 0; - virtual void handlePatch(http_request messge) = 0; - virtual void handleHead(http_request message) = 0; - virtual void handleOptions(http_request message) = 0; - virtual void handleTrace(http_request message) = 0; - virtual void handleConnect(http_request message) = 0; - virtual void handleMerge(http_request message) = 0; - }; -} diff --git a/resources/mt5-rest/mt5-rest/main.cpp b/resources/mt5-rest/mt5-rest/main.cpp deleted file mode 100644 index 3d0a851..0000000 Binary files a/resources/mt5-rest/mt5-rest/main.cpp and /dev/null differ diff --git a/resources/mt5-rest/mt5-rest/microsvc_controller.cpp b/resources/mt5-rest/mt5-rest/microsvc_controller.cpp deleted file mode 100644 index 9b05696..0000000 --- a/resources/mt5-rest/mt5-rest/microsvc_controller.cpp +++ /dev/null @@ -1,424 +0,0 @@ -#include -#include - -#include "stdafx.h" -#include "microsvc_controller.hpp" -#include "types.hpp" - -#define CMD_DOCS L"docs" -#define CMD_SUB L"sub" -#define CMD_SWAGGER L"swagger.json" -#define CMD_VERSION L"version" - -using namespace web; -using namespace http; - -void MicroserviceController::initRestOpHandlers() { - _listener.support(methods::GET, std::bind(&MicroserviceController::handleGet, this, std::placeholders::_1)); - _listener.support(methods::PUT, std::bind(&MicroserviceController::handlePut, this, std::placeholders::_1)); - _listener.support(methods::POST, std::bind(&MicroserviceController::handlePost, this, std::placeholders::_1)); - _listener.support(methods::DEL, std::bind(&MicroserviceController::handleDelete, this, std::placeholders::_1)); - _listener.support(methods::PATCH, std::bind(&MicroserviceController::handlePatch, this, std::placeholders::_1)); - _listener.support(methods::HEAD, std::bind(&MicroserviceController::handleHead, this, std::placeholders::_1)); - - pushCommand(L"inited", endpoint()); -} - -void MicroserviceController::pushCommand(string_t command, string_t options) { - - web::json::value result = web::json::value::object(); - - result[U("command")] = web::json::value::string(command); - result[U("options")] = web::json::value::string(options); - - commands.push_back(ws2s(result.serialize())); -} - -const char* MicroserviceController::getCommand() { - string command; - - if (commands.size() < 1) - return NULL; - - command.append(commands.back()); - commands.pop_back(); - - return command.c_str(); -} - -int MicroserviceController::hasCommands() { - return commands.size() > 0; -} - - -void MicroserviceController::setCommandResponse(const char* command, const char* response) { - commandResponses[command] = response; -} - -void MicroserviceController::setCallback(const char* url, const char* format) { - callback_url.clear(); - callback_format.clear(); - callback_url.append(s2ws(url)); - callback_format.append(s2ws(format)); -} - -void MicroserviceController::setCommandWaitTimeout(int timeout) { - wait_timeout = timeout*1000; -} - -void MicroserviceController::setPath(const char *_path, const char* _url_swagger) { - path_docs.clear(); - path_docs.append(_path); - - url_swagger.clear(); - url_swagger.append(_url_swagger); -} - -int MicroserviceController::onEvent(const char* data) { - - if (callback_url.length() < 1) - return -1; - - Concurrency::task task; - http_client callback_client(callback_url); - - try { - - if (callback_format == L"json") { - - task = callback_client.request(methods::POST, "", data); - } - else { - http_request request(methods::POST); - request.headers().add(L"Content-Type", L"application/x-www-form-urlencoded; charset=UTF-8"); - request.set_body(data); - task = callback_client.request(request); - } - - task.then([](http_response response) { - //ucout << response.to_string(); - if (response.status_code() == status_codes::OK) { - auto body = response.extract_string().get(); - ucout << body << std::endl; - } - }).wait(); - - return 1; - } - catch (const web::http::http_exception &e) { - ucout << e.error_code() << endl; - } - catch (const std::exception & ex) { - ucout << ex.what() << endl; - } - catch (...) { - } - - return -1; -} - -auto MicroserviceController::formatError(int code, const utility::string_t message) { - web::json::value result = web::json::value::object(); - - result[U("message")] = web::json::value::string(message); - result[U("code")] = web::json::value::number(code); - - return result; -} - -auto MicroserviceController::formatError(int code, const char* message) { - wstring msg(message, message + strlen(message)); - - return formatError(code, msg); -} - -auto MicroserviceController::formatErrorRequired(utility::string_t field) { - utility::string_t msg(field); - - msg.append(U(" is required")); - - return formatError(402, msg); -} - -void MicroserviceController::handleGet(http_request message) { - auto response = json::value::object(); - auto path = requestPath(message); - auto params = requestQueryParams(message); - - try { - - if (path.size() < 1) { - string p(path_docs); - p.append("docs.html"); - std::ifstream in(p, ios::in); - - http_response response(status_codes::OK); - response.headers().add(L"Content-Type", L"text/html; charset=UTF-8"); - - std::stringstream buffer; - buffer << in.rdbuf(); - string b = buffer.str(); - in.close(); - - response.set_body(b); - message.reply(response); - - return; - } - - if (path[0] == CMD_SWAGGER) { - string p(path_docs); - p.append("swagger.json"); - std::ifstream in(p, ios::in); - - http_response response(status_codes::OK); - response.headers().add(L"Content-Type", L"text/json; charset=UTF-8"); - - std::stringstream buffer; - buffer << in.rdbuf(); - string b = buffer.str(); - in.close(); - - boost::algorithm::replace_all(b, "localhost:6542", url_swagger); - - response.set_body(b); - - message.reply(response); - - return; - } - - if (!token.empty()) { - if (!message.headers().has(header_names::authorization)) { - message.reply(status_codes::Unauthorized); - return; - } - - auto headers = message.headers(); - - if (headers[header_names::authorization] != token) { - message.reply(status_codes::Unauthorized); - return; - } - } - - web::json::value result = web::json::value::object(); - - result[L"command"] = web::json::value::string(path[0]); - - if (path.size() > 1) { - result[L"id"] = web::json::value::string(path[1]); - } - - for (auto it = params.begin(); it != params.end(); ++it) { - result[it->first] = web::json::value::string(it->second); - } - - string command = ws2s(result.serialize()); - commands.push_back(command); - - DWORD dw1 = GetTickCount(); - - while(dw1 + wait_timeout > GetTickCount()) { - - if (commandResponses.contains(command)) { - message.reply(status_codes::OK, commandResponses[command], "application/json"); - commandResponses.remove(command); - return; - } - - Sleep(1); - } - - throw exception("Failed to get info, timeout"); - } - catch (const FormatException & e) { - message.reply(status_codes::BadRequest, formatError(405, e.what())); - } - catch (const RequiredException & e) { - message.reply(status_codes::BadRequest, formatError(405, e.what())); - } - catch (const json::json_exception & e) { - message.reply(status_codes::BadRequest, formatError(410, e.what())); - ucout << e.what() << endl; - } - catch (const std::exception & ex) { - message.reply(status_codes::BadRequest, formatError(410, ex.what())); - ucout << ex.what() << endl; - } - catch (...) { - message.reply(status_codes::InternalError); - } -} - -void MicroserviceController::handlePost(http_request message) { - auto response = json::value::object(); - - try { - - auto path = requestPath(message); - auto params = requestQueryParams(message); - - ucout << message.to_string() << endl; - - if (path.size() < 1) { - message.reply(status_codes::NotFound); - return; - } - - if (!token.empty()) { - if (!message.headers().has(header_names::authorization)) { - message.reply(status_codes::Unauthorized); - return; - } - - auto headers = message.headers(); - - if (headers[header_names::authorization] != token) { - message.reply(status_codes::Unauthorized); - return; - } - } - - if (path[0] == CMD_SUB) { - callback_url = params[U("callback_url")]; - callback_format = params[U("callback_format")]; - - response[U("message")] = json::value::string(L"Succesfully subscribed"); - response[U("code")] = json::value::number(200); - message.reply(status_codes::OK, response); - - return; - } - - message.extract_utf8string(true).then([=](std::string body) { - - if (body.length() < 1) { - throw exception("POST body is empty"); - } - - std::size_t pos = body.find("}"); - std::string command = body.substr(0, pos); - - command.append(",\"command\":\""); - command.append(ws2s(path[0])); - command.append("\"}"); - - commands.push_back(command); - - for (int i = 0; i < wait_timeout; i++) { - if (commandResponses.contains(command)) { - message.reply(status_codes::OK, commandResponses[command], "application/json"); - commandResponses.remove(command); - return; - } - - Sleep(1); - } - - throw exception("Failed to get info, timeout"); - }).wait(); - - } - catch (const ManagerException & e) { - message.reply(status_codes::BadRequest, formatError(e.code, e.what())); - } - catch (const FormatException & e) { - message.reply(status_codes::BadRequest, formatError(405, e.what())); - } - catch (const RequiredException & e) { - message.reply(status_codes::BadRequest, formatError(405, e.what())); - } - catch (const json::json_exception & e) { - message.reply(status_codes::BadRequest, formatError(410, e.what())); - ucout << e.what() << endl; - } - catch (const std::exception & ex) { - message.reply(status_codes::BadRequest, formatError(410, ex.what())); - ucout << ex.what() << endl; - } - catch (...) { - message.reply(status_codes::InternalError); - } - -} - -void MicroserviceController::handleDelete(http_request message) { - try { - auto path = requestPath(message); - auto params = requestQueryParams(message); - - if (path.size() < 1) { - message.reply(status_codes::NotFound); - return; - } - - } - catch (const ManagerException & e) { - message.reply(status_codes::BadRequest, formatError(e.code, e.what())); - } - catch (const FormatException & e) { - message.reply(status_codes::BadRequest, formatError(405, e.what())); - } - catch (const RequiredException & e) { - message.reply(status_codes::BadRequest, formatError(405, e.what())); - } - catch (const json::json_exception & e) { - message.reply(status_codes::BadRequest, formatError(410, e.what())); - ucout << e.what() << endl; - } - catch (const std::exception & ex) { - message.reply(status_codes::BadRequest, formatError(410, ex.what())); - ucout << ex.what() << endl; - } - catch (...) { - message.reply(status_codes::InternalError); - } -} - -void MicroserviceController::handleHead(http_request message) { - auto response = json::value::object(); - response[U("version")] = json::value::string(U("0.1.1")); - response[U("code")] = json::value::number(200); - message.reply(status_codes::OK, "version"); -} - -void MicroserviceController::handleOptions(http_request message) { - http_response response(status_codes::OK); - response.headers().add(U("Allow"), U("GET, POST, OPTIONS")); - response.headers().add(U("Access-Control-Allow-Origin"), U("*")); - response.headers().add(U("Access-Control-Allow-Methods"), U("GET, POST, OPTIONS")); - response.headers().add(U("Access-Control-Allow-Headers"), U("Content-Type")); - message.reply(response); -} - -void MicroserviceController::handleTrace(http_request message) { - message.reply(status_codes::NotImplemented, responseNotImpl(methods::TRCE)); -} - -void MicroserviceController::handleConnect(http_request message) { - message.reply(status_codes::NotImplemented, responseNotImpl(methods::CONNECT)); -} - -void MicroserviceController::handleMerge(http_request message) { - message.reply(status_codes::NotImplemented, responseNotImpl(methods::MERGE)); -} - -void MicroserviceController::handlePatch(http_request message) { - message.reply(status_codes::NotImplemented, responseNotImpl(methods::MERGE)); -} - -void MicroserviceController::handlePut(http_request message) { - message.reply(status_codes::NotImplemented, responseNotImpl(methods::MERGE)); -} - -json::value MicroserviceController::responseNotImpl(const http::method & method) { - - using namespace json; - - auto response = value::object(); - response[U("serviceName")] = value::string(U("MT4 REST")); - response[U("http_method")] = value::string(method); - - return response; -} diff --git a/resources/mt5-rest/mt5-rest/microsvc_controller.hpp b/resources/mt5-rest/mt5-rest/microsvc_controller.hpp deleted file mode 100644 index 1c3d7e8..0000000 --- a/resources/mt5-rest/mt5-rest/microsvc_controller.hpp +++ /dev/null @@ -1,76 +0,0 @@ -#pragma once - -#include -#include - -#include -#include -#include "basic_controller.hpp" -#include "session_manager.hpp" -#include "safe_vector.hpp" -#include "safe_map.hpp" - -using namespace cfx; -using namespace std; -using namespace utility; -using namespace web::http::client; - -static string ws2s(const std::wstring& wstr) { - using convert_typeX = std::codecvt_utf8; - std::wstring_convert converterX; - - return converterX.to_bytes(wstr); -}; - -static wstring s2ws(const std::string& str) { - using convert_typeX = std::codecvt_utf8; - std::wstring_convert converterX; - - return converterX.from_bytes(str); -}; - -class MicroserviceController : public BasicController, Controller { -public: - MicroserviceController() : BasicController() {} - ~MicroserviceController() { - } - void handleGet(http_request message) override; - void handlePut(http_request message) override; - void handlePost(http_request message) override; - void handlePatch(http_request message) override; - void handleDelete(http_request message) override; - void handleHead(http_request message) override; - void handleOptions(http_request message) override; - void handleTrace(http_request message) override; - void handleConnect(http_request message) override; - void handleMerge(http_request message) override; - void initRestOpHandlers() override; - - auto formatError(int code, const utility::string_t message); - auto formatError(int code, const char* message); - auto formatErrorRequired(utility::string_t field); - - const char* getCommand(); - void setCommandResponse(const char* command, const char* reponse); - void pushCommand(string_t command, string_t options); - int hasCommands(); - int onEvent(const char* data); - void setCommandWaitTimeout(int timeout); - void setPath(const char* path, const char* url_swaggger); - void setCallback(const char* url, const char* format); - void setAuthToken(const char* _token) { - token.clear(); - token.append(s2ws(_token)); - }; - -private: - static json::value responseNotImpl(const http::method & method); - SafeVector commands; - SafeMap commandResponses; - string_t callback_url; - string_t callback_format; - int wait_timeout; - string path_docs; - string url_swagger; - string_t token; -}; diff --git a/resources/mt5-rest/mt5-rest/mt5-rest.def b/resources/mt5-rest/mt5-rest/mt5-rest.def deleted file mode 100644 index fe7ae28..0000000 --- a/resources/mt5-rest/mt5-rest/mt5-rest.def +++ /dev/null @@ -1,5 +0,0 @@ -LIBRARY "mt5-rest.dll" -EXPORTS -Init -Deinit -SetAuthToken \ No newline at end of file diff --git a/resources/mt5-rest/mt5-rest/mt5-rest.vcxproj b/resources/mt5-rest/mt5-rest/mt5-rest.vcxproj deleted file mode 100644 index 4345846..0000000 --- a/resources/mt5-rest/mt5-rest/mt5-rest.vcxproj +++ /dev/null @@ -1,195 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 15.0 - {7359E8DF-CF85-409D-833B-3B66F8DAC462} - Win32Proj - microservicetutorial - 10.0.17763.0 - mt5-rest - - - - Application - true - v141 - Unicode - - - Application - false - v141 - true - Unicode - - - Application - true - v141 - Unicode - - - DynamicLibrary - false - v141 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - $(SolutionDir)$(Platform)\$(Configuration)\ - - - - Use - Level3 - Disabled - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - false - - - - - Console - true - - - - - Use - Level3 - Disabled - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - false - - - Console - true - - - - - Use - Level3 - MaxSpeed - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - Use - Level3 - MaxSpeed - true - true - true - _CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - ..\packages\x64-windows\include;..\..\boost_1_69_0;%(AdditionalIncludeDirectories); - Sync - - - Console - true - true - true - ..\packages\x64-windows\lib\;..\..\boost_1_69_0\lib64-msvc-14.1;$(SolutionDir)$(Platform)\$(Configuration); - cpprest_2_10.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - mt5-rest.def - - - taskkill /IM ServiceHub.DataWarehouseHost.exe /F 2>nul 1>nul -Exit 0 - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - Create - - - - - - - - - - \ No newline at end of file diff --git a/resources/mt5-rest/mt5-rest/network_utils.cpp b/resources/mt5-rest/mt5-rest/network_utils.cpp deleted file mode 100644 index 1de7aaf..0000000 --- a/resources/mt5-rest/mt5-rest/network_utils.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "stdafx.h" -#include "network_utils.hpp" - - -namespace cfx { - - HostInetInfo NetworkUtils::queryHostInetInfo() { - io_service ios; - tcp::resolver resolver(ios); - tcp::resolver::query query(host_name(), ""); - return resolver.resolve(query); - } - - utility::string_t NetworkUtils::hostIP(unsigned short family) { - auto hostInetInfo = queryHostInetInfo(); - tcp::resolver::iterator end; - while (hostInetInfo != end) { - tcp::endpoint ep = *hostInetInfo++; - sockaddr sa = *ep.data(); - if (sa.sa_family == family) { - return utility::conversions::to_string_t(ep.address().to_string()); - } - } - return nullptr; - } - -} diff --git a/resources/mt5-rest/mt5-rest/network_utils.hpp b/resources/mt5-rest/mt5-rest/network_utils.hpp deleted file mode 100644 index 8e2536c..0000000 --- a/resources/mt5-rest/mt5-rest/network_utils.hpp +++ /dev/null @@ -1,59 +0,0 @@ -// -// Created by Ivan Mejia on 11/28/16. -// -// MIT License -// -// Copyright (c) 2016 ivmeroLabs. All rights reserved. -// -// 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. -// - -#pragma once - -#include "stdafx.h" -#include - -using namespace boost::asio; -using namespace boost::asio::ip; - -namespace cfx { - - using HostInetInfo = tcp::resolver::iterator; - - class NetworkUtils { - private: - static HostInetInfo queryHostInetInfo(); - static utility::string_t hostIP(unsigned short family); - public: - // gets the host IP4 string formatted - static utility::string_t hostIP4() { - return hostIP(AF_INET); - } - - // gets the host IP6 string formatted - static utility::string_t hostIP6() { - - return hostIP(AF_INET6); - } - static std::string hostName() { - return ip::host_name(); - } - }; - -} diff --git a/resources/mt5-rest/mt5-rest/safe_map.cpp b/resources/mt5-rest/mt5-rest/safe_map.cpp deleted file mode 100644 index f0b13a4..0000000 --- a/resources/mt5-rest/mt5-rest/safe_map.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include "stdafx.h" -#include -#include -#include "safe_map.hpp" - -string& SafeMap::operator[](string key) { - return data[key]; -} - -void SafeMap::add(string key, string value) { - lock_guard lock(mut); - data[key] = value; - cond.notify_one(); -} - -bool SafeMap::contains(string key) { - return data.count(key) > 0; -} - -void SafeMap::remove(string key) { - lock_guard lock(mut); - data.erase(key); - cond.notify_one(); -} \ No newline at end of file diff --git a/resources/mt5-rest/mt5-rest/safe_map.hpp b/resources/mt5-rest/mt5-rest/safe_map.hpp deleted file mode 100644 index f9c0cdf..0000000 --- a/resources/mt5-rest/mt5-rest/safe_map.hpp +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef SAFEMAP_HPP -#define SAFEMAP_HPP - -#include -#include -#include -#include - -using namespace std; - -class SafeMap { -public: - SafeMap() : data(), mut(), cond() {} - SafeMap(const SafeMap& orig) : data(orig.data), mut(), cond() {} - ~SafeMap() {} - - void add(string key, string value); - string& operator[](const string key); - void remove(string key); - bool contains(string key); - -private: - map data; - mutex mut; - condition_variable cond; -}; - -#endif /* SAFEMAP_HPP */ \ No newline at end of file diff --git a/resources/mt5-rest/mt5-rest/safe_vector.cpp b/resources/mt5-rest/mt5-rest/safe_vector.cpp deleted file mode 100644 index 42dd1e5..0000000 --- a/resources/mt5-rest/mt5-rest/safe_vector.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "stdafx.h" -#include -#include -#include "safe_vector.hpp" - -void SafeVector::insert(string in, const int index) -{ - lock_guard lock(mut); - vec[index] = move(in); - cond.notify_one(); -} - -void SafeVector::push_back(string in) -{ - lock_guard lock(mut); - vec.push_back(move(in)); - cond.notify_one(); -} - -void SafeVector::pop_back() -{ - lock_guard lock(mut); - vec.pop_back(); - cond.notify_one(); -} - -string& SafeVector::back() -{ - return vec.back(); -} - -size_t SafeVector::size() { - return vec.size(); -} - -string& SafeVector::operator[](const int index) -{ - return vec[index]; -} - -vector::iterator SafeVector::begin() -{ - return vec.begin(); -} - -vector::iterator SafeVector::end() -{ - return vec.end(); -} - -vector SafeVector::toVector() -{ - return vec; -} \ No newline at end of file diff --git a/resources/mt5-rest/mt5-rest/safe_vector.hpp b/resources/mt5-rest/mt5-rest/safe_vector.hpp deleted file mode 100644 index 00e7ad7..0000000 --- a/resources/mt5-rest/mt5-rest/safe_vector.hpp +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef SAFEVECTOR_HPP -#define SAFEVECTOR_HPP - -#include -#include -#include -#include -using namespace std; - -class SafeVector { -public: - SafeVector() : vec(), mut(), cond() {} - SafeVector(const SafeVector& orig) : vec(orig.vec), mut(), cond() {} - ~SafeVector() {} - - void insert(string in, const int index); - void push_back(string in); - void pop_back(); - size_t size(); - string& operator[](const int index); - string& back(); - vector::iterator begin(); - vector::iterator end(); - vector toVector(); - -private: - vector vec; - mutex mut; - condition_variable cond; -}; - -#endif /* SAFEVECTOR_HPP */ \ No newline at end of file diff --git a/resources/mt5-rest/mt5-rest/session_manager.cpp b/resources/mt5-rest/mt5-rest/session_manager.cpp deleted file mode 100644 index 139f3fe..0000000 --- a/resources/mt5-rest/mt5-rest/session_manager.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "stdafx.h" -#include "session_manager.hpp" - -ManagersDatabase managerDB; -std::mutex DBMutex; - -utility::string_t SessionManager:: save(const utility::string_t server, const utility::string_t login, const string_t password) { - - std::unique_lock lock{ DBMutex }; - utility::string_t token; - - token.append(login); - - if (managerDB.find(token) != managerDB.end()) { - return token; - } - - ManagerInformation info; - info.server = server; - info.login = login; - info.password = password; - managerDB.insert( - std::pair(token, - info)); - - return token; -} - -bool SessionManager::check( const utility::string_t key, ManagerInformation & info) { - - if (managerDB.find(key) != managerDB.end()) { - auto i = managerDB[key]; - info = i; - return true; - } - - return false; -} \ No newline at end of file diff --git a/resources/mt5-rest/mt5-rest/session_manager.hpp b/resources/mt5-rest/mt5-rest/session_manager.hpp deleted file mode 100644 index 23dd8c9..0000000 --- a/resources/mt5-rest/mt5-rest/session_manager.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include -#include -#include - -using namespace utility; - -typedef struct { - utility::string_t server; - utility::string_t login; - utility::string_t password; -} ManagerInformation; - -using ManagersDatabase = std::map; - -class SessionManager { -public: - utility::string_t save(const utility::string_t server, const utility::string_t login, const utility::string_t password); - bool check(const utility::string_t key, ManagerInformation & managerInfo); -}; \ No newline at end of file diff --git a/resources/mt5-rest/mt5-rest/std_micro_service.hpp b/resources/mt5-rest/mt5-rest/std_micro_service.hpp deleted file mode 100644 index 56771c7..0000000 --- a/resources/mt5-rest/mt5-rest/std_micro_service.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// -// Created by Ivan Mejia on 12/03/16. -// -// MIT License -// -// Copyright (c) 2016 ivmeroLabs. All rights reserved. -// -// 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. -// - -#pragma once - - diff --git a/resources/mt5-rest/mt5-rest/stdafx.cpp b/resources/mt5-rest/mt5-rest/stdafx.cpp deleted file mode 100644 index 444e4bf..0000000 Binary files a/resources/mt5-rest/mt5-rest/stdafx.cpp and /dev/null differ diff --git a/resources/mt5-rest/mt5-rest/stdafx.h b/resources/mt5-rest/mt5-rest/stdafx.h deleted file mode 100644 index 333c841..0000000 Binary files a/resources/mt5-rest/mt5-rest/stdafx.h and /dev/null differ diff --git a/resources/mt5-rest/mt5-rest/targetver.h b/resources/mt5-rest/mt5-rest/targetver.h deleted file mode 100644 index 567cd34..0000000 Binary files a/resources/mt5-rest/mt5-rest/targetver.h and /dev/null differ diff --git a/resources/mt5-rest/mt5-rest/types.hpp b/resources/mt5-rest/mt5-rest/types.hpp deleted file mode 100644 index 4253b5e..0000000 --- a/resources/mt5-rest/mt5-rest/types.hpp +++ /dev/null @@ -1,67 +0,0 @@ -#pragma once -#include "stdafx.h" - -using namespace std; -using jtype = json::value::value_type; - -class FormatException : public std::exception { - char message[100]; -public: - FormatException(const utility::string_t field, const utility::string_t type) { - utility::string_t t(field); - t.append(L" should be "); - t.append(type); - - size_t i; - wcstombs_s(&i, message, t.length() + 1, t.c_str(), t.length()); - } - const char * what() const throw() { - return message; - } -}; - -class ManagerException : public std::exception { - char description[100]; - -public: - int code; - ManagerException(const int code_, const char * description_) { - code = code_; - strncpy_s(description, description_, 100); - } - - const char * what() const throw() { - return description; - } - -}; - -class RequiredException : public std::exception { - char message[100]; -public: - RequiredException(const utility::string_t field) { - utility::string_t t(field); - t.append(L" is required"); - - size_t i; - wcstombs_s(&i, message, t.length() + 1, t.c_str(), t.length()); - } - const char * what() const throw() { - return message; - } -}; - -struct Error { - utility::string_t description; - int code; - - web::json::value AsJSON() const - { - web::json::value result = web::json::value::object(); - - result[U("descr")] = web::json::value::string(description); - result[U("code")] = web::json::value::number(code); - - return result; - } -}; \ No newline at end of file diff --git a/resources/mt5-rest/mt5-rest/usr_interrupt_handler.hpp b/resources/mt5-rest/mt5-rest/usr_interrupt_handler.hpp deleted file mode 100644 index f8baa43..0000000 --- a/resources/mt5-rest/mt5-rest/usr_interrupt_handler.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include -#include -#include - -static std::condition_variable _condition; -static std::mutex _mutex; - -namespace cfx { - class InterruptHandler { - public: - static void hookSIGINT() { - signal(SIGINT, handleUserInterrupt); - } - - static void handleUserInterrupt(int signal) { - if (signal == SIGINT) { - std::cout << "SIGINT trapped ..." << '\n'; - _condition.notify_one(); - } - } - - static void waitForUserInterrupt() { - std::unique_lock lock{ _mutex }; - _condition.wait(lock); - std::cout << "user has signaled to interrup program..." << '\n'; - lock.unlock(); - } - }; -} diff --git a/resources/server.py b/resources/server.py deleted file mode 100644 index 8aadce3..0000000 --- a/resources/server.py +++ /dev/null @@ -1,16 +0,0 @@ -import socket - -serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - -serversocket.bind(("localhost", 8466)) -serversocket.listen(10) - -connection, addr = serversocket.accept() -print("[INFO]\tConexión establecida con:", addr) - -msg = "\0" -while not "END CONNECTION\0" in msg and msg != "": - msg = connection.recv(1024).decode() - print("[INFO]\tMensaje:", msg) -connection.close() -serversocket.close() diff --git a/resources/socket-library-mt4-mt5.mqh b/resources/socket-library-mt4-mt5.mqh deleted file mode 100644 index 3419931..0000000 --- a/resources/socket-library-mt4-mt5.mqh +++ /dev/null @@ -1,1188 +0,0 @@ -/* ******************************************************************************* - -Socket library, for both MT4 and MT5 (32-bit and 64-bit) - -Features: - - * Both client and server sockets - * Both send and receive - * Both MT4 and MT5 (32-bit and 64-bit) - * Optional event-driven handling (EAs only, not scripts or indicators), - offering faster responses to socket events than OnTimer() - * Direct use of Winsock; no need for a custom DLL sitting - between this code and ws2_32.dll - -Based on the following forum posts: - - https://www.mql5.com/en/forum/203049#comment_5232176 - https://www.mql5.com/en/forum/160115/page3#comment_3817302 - - -CLIENT SOCKETS --------------- - -You create a connection to a server using one of the following two -constructors for ClientSocket: - - ClientSocket(ushort localport); - ClientSocket(string HostnameOrIPAddress, ushort port); - -The first connects to a port on localhost (127.0.0.1). The second -connects to a remote server, which can be specified either by -passing an IP address such as "123.123.123.123" or a hostname -such as "www.myserver.com". - -After creating the instance of the class, and periodically afterwards, -you should check the value of IsSocketConnected(). If false, then -the connection has failed (or has later been closed). You then need to -destroy the class and create a new connection. One common pattern of usage -therefore looks like the following: - - ClientSocket * glbConnection = NULL; - - void OnTick() - { - // Create a socket if none already exists - if (!glbConnection) glbConnection = new ClientSocket(12345); - - if (glbConnection.IsSocketConnected()) { - // Socket is okay. Do some action such as sending or receiving - } - - // Socket may already have been dead, or now detected as failed - // following the attempt above at sending or receiving. - // If so, delete the socket and try a new one on the next call to OnTick() - if (!glbConnection.IsSocketConnected()) { - delete glbConnection; - glbConnection = NULL; - } - } - -You send data down a socket using the simple Send() method, which takes -a string parameter. Any failure to send returns false, which will -also mean that IsSocketConnected() then returns false. The format -of the data which you are sending to the server is obviously -entirely up to you... - -You can receive pending incoming data on a socket using Receive(), which -returns either the pending data or an empty string. You will normally want -to call Receive() from OnTimer(), or using the event handling described below. - -A non-blank return value from Receive() does not necessarily mean that -the socket is still active. The server may have sent some data *and* closed -the socket. - - string strMessage = MySocket.Receive(); - if (strMessage != "") { - // Process the message - } - - // Regardless of whether there was any data, the socket may - // now be dead. - if (!MySocket.IsSocketConnected()) { - // ... socket has been closed - } - -You can also give Receive() an optional message terminator, such as "\r\n". -It will then store up data, and only return complete messages (minus the -terminator). If you use a terminator then there may have been multiple -complete messages since your last call to Receive(), and you should -keep calling Receive() until it returns an empty string, in order to collect -all the messages. For example: - - string strMessage; - do { - strMessage = MySocket.Receive("\r\n"); - if (strMessage != "") { - // Do something with the message - } - } (while strMessage != ""); - -You close a socket simply by destroying the ClientSocket object. - - -SERVER SOCKETS --------------- - -For anyone not used to socket programming: the model is that you create -a server socket; you accept connections on it; and each acceptance -creates a new socket for communicating with that client. No data -is sent or received through the server socket itself. - -You create a server socket by telling the constructor a port number, -and whether to accept connections only from the local machine or -from any remote computer (subject to firewall rules etc). - - ServerSocket(ushort ServerPort, bool ForLocalhostOnly); - -You should check the value of Created() after creating the ServerSocket() -object. Any failure will usually be because something is already -listening on your chosen port. - - MyServerSocket = new ServerSocket(12345, true); - if (!MyServerSocket.Created()) { - // Almost certainly because port 12345 is already in use - } - -You must be careful to destroy any server sockets which you -create. If you don't then the port will remain in use and locked -until MT4/5 is shut down, and you (or any other program) will not -be able to create a new socket on that port. The normal way -of handling this is to do destruction in OnDeinit(): - - ServerSocket * glbServerSocket; - ... - - void OnDeinit(const int reason) - { - if (glbServerSocket) delete glbServerSocket; - } - -You accept incoming connections using Accept(), typically from -periodic checks in OnTimer() or using the event handling described below. -Accept() returns either NULL if there is no waiting client, or a new -instance of ClientSocket() which you then use for communicating with -the client. There can be multiple simultaneous new connections, -and you will therefore typically want to keep calling Accept() -until it returns NULL. For example: - - ClientSocket * pNewClient; - do { - pNewClient = MyServerSocket.Accept(); - if (pNewClient) { - // Store client socket for future use. - // Must remember to delete it when finished, to avoid memory leaks. - } - } (while pNewClient != NULL); - -To repeat the overview above: Accept() gives you a new instance of -ClientSocket (which you must later delete). You then communicate with the -client using the Send() and Receive() on ClientSocket. No data is -ever sent or received through the server socket itself. - - -EVENT-DRIVEN HANDLING ---------------------- - -The timing infrastructure in Windows does not normally have millisecond -granularity. EventSetMillisecondTimer(1) is usually in fact equivalent -to EventSetMillisecondTimer(16). Therefore, checks for socket -activity in OnTimer() potentially have a delay of at least 16 milliseconds -before you respond to a new connection or incoming data. - -In an EA (but not a script or indicator) you can achieve <1ms response -times using event-driven handling. The way this works is that the -socket library generates dummy key-down messages to OnChartEvent() -when socket activity occurs. Responding to these events can be -significantly faster than a periodic check in OnTimer(). - -You need to request the event-driven handling by #defining SOCKET_LIBRARY_USE_EVENTS -before including the library. For example: - - #define SOCKET_LIBRARY_USE_EVENTS - #include - -(Note that this has no effect in a custom indicator or script. It only -works with EAs.) - -You then process notifications in OnChartEvent as follows: - - void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam) - { - if (id == CHARTEVENT_KEYDOWN) { - // May be a real key press, or a dummy notification - // resulting from socket activity. If lparam matches - // any .GetSocketHandle() then it's from a socket. - // If not, it's a real key press. (If lparam>256 then - // it's also pretty reliably a socket message rather - // than a real key press.) - - if (lparam == MyServerSocket.GetSocketHandle()) { - // Activity on a server socket - } else if (lparam == MyClientSocket.GetSocketHandle()) { - // Activity on a client socket - } else { - // Doesn't match a socket. Assume real key pres - } - } - } - -For a comprehensive example of using the event-driven handling, -see the example socket server code. - - -NOTES ON MT4/5 CROSS-COMPATIBILITY ----------------------------------- - -It appears to be safe for a 64-bit application to use 4-byte socket -handles, despite the fact that the Win32 SDK defines SOCKET as 8-byte -on x64. Nevertheless, this code uses 8-byte handles when running -on 64-bit MT5. - -The area which definitely does cause problems is gethostbyname(), -because it returns a memory block containing pointers whose size -depends on the environment. (The issue here is 32-bit vs 64-bit, -not MT4 vs MT5.) - -This code not only needs to handle 4-byte vs 8-byte memory pointers. -The further problem is that MQL5 has no integer data type whose -size varies with the environment. Therefore, it's necessary to -have two versions of the #import of gethostbyname(), and to -force the compiler to use the applicable one despite the fact -that they only really vary by their return type. Manipulating -the hostent* returned by gethostbyname() is then very ugly, -made doubly so by the need for different paths of execution -on 32-bit and 64-bit, using a range of different #imports of -the RtlMoveMemory() function which the code uses to -process the pointers. - -******************************************************************************* */ - -#property strict - - -// ------------------------------------------------------------- -// Winsock constants and structures -// ------------------------------------------------------------- - -#define SOCKET_HANDLE32 uint -#define SOCKET_HANDLE64 ulong -#define AF_INET 2 -#define SOCK_STREAM 1 -#define IPPROTO_TCP 6 -#define INVALID_SOCKET32 0xFFFFFFFF -#define INVALID_SOCKET64 0xFFFFFFFFFFFFFFFF -#define SOCKET_ERROR -1 -#define INADDR_NONE 0xFFFFFFFF -#define FIONBIO 0x8004667E -#define WSAWOULDBLOCK 10035 - -struct sockaddr { - short family; - ushort port; - uint address; - ulong ignore; -}; - -struct linger { - ushort onoff; - ushort linger_seconds; -}; - -// ------------------------------------------------------------- -// DLL imports -// ------------------------------------------------------------- - -#import "ws2_32.dll" - // Imports for 32-bit environment - SOCKET_HANDLE32 socket(int, int, int); // Artificially differs from 64-bit version based on 3rd parameter - int connect(SOCKET_HANDLE32, sockaddr&, int); - int closesocket(SOCKET_HANDLE32); - int send(SOCKET_HANDLE32, uchar&[],int,int); - int recv(SOCKET_HANDLE32, uchar&[], int, int); - int ioctlsocket(SOCKET_HANDLE32, uint, uint&); - int bind(SOCKET_HANDLE32, sockaddr&, int); - int listen(SOCKET_HANDLE32, int); - SOCKET_HANDLE32 accept(SOCKET_HANDLE32, int, int); - int WSAAsyncSelect(SOCKET_HANDLE32, int, uint, int); - int shutdown(SOCKET_HANDLE32, int); - - // Imports for 64-bit environment - SOCKET_HANDLE64 socket(int, int, uint); // Artificially differs from 32-bit version based on 3rd parameter - int connect(SOCKET_HANDLE64, sockaddr&, int); - int closesocket(SOCKET_HANDLE64); - int send(SOCKET_HANDLE64, uchar&[], int, int); - int recv(SOCKET_HANDLE64, uchar&[], int, int); - int ioctlsocket(SOCKET_HANDLE64, uint, uint&); - int bind(SOCKET_HANDLE64, sockaddr&, int); - int listen(SOCKET_HANDLE64, int); - SOCKET_HANDLE64 accept(SOCKET_HANDLE64, int, int); - int WSAAsyncSelect(SOCKET_HANDLE64, long, uint, int); - int shutdown(SOCKET_HANDLE64, int); - - // gethostbyname() has to vary between 32/64-bit, because - // it returns a memory pointer whose size will be either - // 4 bytes or 8 bytes. In order to keep the compiler - // happy, we therefore need versions which take - // artificially-different parameters on 32/64-bit - uint gethostbyname(uchar&[]); // For 32-bit - ulong gethostbyname(char&[]); // For 64-bit - - // Neutral; no difference between 32-bit and 64-bit - uint inet_addr(uchar&[]); - int WSAGetLastError(); - uint htonl(uint); - ushort htons(ushort); -#import - -// For navigating the Winsock hostent structure, with indescribably horrible -// variation between 32-bit and 64-bit -#import "kernel32.dll" - void RtlMoveMemory(uint&, uint, int); - void RtlMoveMemory(ushort&, uint, int); - void RtlMoveMemory(ulong&, ulong, int); - void RtlMoveMemory(ushort&, ulong, int); -#import - -// ------------------------------------------------------------- -// Forward definitions of classes -// ------------------------------------------------------------- - -class ClientSocket; -class ServerSocket; - - -// ------------------------------------------------------------- -// Client socket class -// ------------------------------------------------------------- - -class ClientSocket -{ - private: - // Need different socket handles for 32-bit and 64-bit environments - SOCKET_HANDLE32 mSocket32; - SOCKET_HANDLE64 mSocket64; - - // Other state variables - bool mConnected; - int mLastWSAError; - string mPendingReceiveData; // Backlog of incoming data, if using a message-terminator in Receive() - - // Event handling - bool mDoneEventHandling; - void SetupSocketEventHandling(); - - public: - // Constructors for connecting to a server, either locally or remotely - ClientSocket(ushort localport); - ClientSocket(string HostnameOrIPAddress, ushort port); - - // Constructors used by ServerSocket() when accepting a client connection - ClientSocket(ServerSocket* ForInternalUseOnly, SOCKET_HANDLE32 ForInternalUseOnly_clientsocket32); - ClientSocket(ServerSocket* ForInternalUseOnly, SOCKET_HANDLE64 ForInternalUseOnly_clientsocket64); - - // Destructor - ~ClientSocket(); - - // Simple send and receive methods - bool Send(string strMsg); - bool Send(uchar & callerBuffer[], int startAt = 0, int szToSend = -1); - string Receive(string MessageSeparator = ""); - int Receive(uchar & callerBuffer[]); - - // State information - bool IsSocketConnected() {return mConnected;} - int GetLastSocketError() {return mLastWSAError;} - ulong GetSocketHandle() {return (mSocket32 ? mSocket32 : mSocket64);} - - // Buffer sizes, overwriteable once the class has been created - int ReceiveBufferSize; - int SendBufferSize; -}; - - -// ------------------------------------------------------------- -// Constructor for a simple connection to 127.0.0.1 -// ------------------------------------------------------------- - -ClientSocket::ClientSocket(ushort localport) -{ - // Default buffer sizes - ReceiveBufferSize = 10000; - SendBufferSize = 999999999; - - // Need to create either a 32-bit or 64-bit socket handle - mConnected = false; - mLastWSAError = 0; - if (TerminalInfoInteger(TERMINAL_X64)) { - uint proto = IPPROTO_TCP; - mSocket64 = socket(AF_INET, SOCK_STREAM, proto); - if (mSocket64 == INVALID_SOCKET64) { - mLastWSAError = WSAGetLastError(); - #ifdef SOCKET_LIBRARY_LOGGING - Print("socket() failed, 64-bit, error: ", mLastWSAError); - #endif - return; - } - } else { - int proto = IPPROTO_TCP; - mSocket32 = socket(AF_INET, SOCK_STREAM, proto); - if (mSocket32 == INVALID_SOCKET32) { - mLastWSAError = WSAGetLastError(); - #ifdef SOCKET_LIBRARY_LOGGING - Print("socket() failed, 32-bit, error: ", mLastWSAError); - #endif - return; - } - } - - // Fixed definition for connecting to 127.0.0.1, with variable port - sockaddr server; - server.family = AF_INET; - server.port = htons(localport); - server.address = 0x100007f; // 127.0.0.1 - - // connect() call has to differ between 32-bit and 64-bit - int res; - if (TerminalInfoInteger(TERMINAL_X64)) { - res = connect(mSocket64, server, sizeof(sockaddr)); - } else { - res = connect(mSocket32, server, sizeof(sockaddr)); - } - if (res == SOCKET_ERROR) { - // Ooops - mLastWSAError = WSAGetLastError(); - #ifdef SOCKET_LIBRARY_LOGGING - Print("connect() to localhost failed, error: ", mLastWSAError); - #endif - return; - } else { - mConnected = true; - - // Set up event handling. Can fail if called in OnInit() when - // MT4/5 is still loading, because no window handle is available - #ifdef SOCKET_LIBRARY_USE_EVENTS - SetupSocketEventHandling(); - #endif - } -} - -// ------------------------------------------------------------- -// Constructor for connection to a hostname or IP address -// ------------------------------------------------------------- - -ClientSocket::ClientSocket(string HostnameOrIPAddress, ushort port) -{ - // Default buffer sizes - ReceiveBufferSize = 10000; - SendBufferSize = 999999999; - - // Need to create either a 32-bit or 64-bit socket handle - mConnected = false; - mLastWSAError = 0; - if (TerminalInfoInteger(TERMINAL_X64)) { - uint proto = IPPROTO_TCP; - mSocket64 = socket(AF_INET, SOCK_STREAM, proto); - if (mSocket64 == INVALID_SOCKET64) { - mLastWSAError = WSAGetLastError(); - #ifdef SOCKET_LIBRARY_LOGGING - Print("socket() failed, 64-bit, error: ", mLastWSAError); - #endif - return; - } - } else { - int proto = IPPROTO_TCP; - mSocket32 = socket(AF_INET, SOCK_STREAM, proto); - if (mSocket32 == INVALID_SOCKET32) { - mLastWSAError = WSAGetLastError(); - #ifdef SOCKET_LIBRARY_LOGGING - Print("socket() failed, 32-bit, error: ", mLastWSAError); - #endif - return; - } - } - - // Is the host parameter an IP address? - uchar arrName[]; - StringToCharArray(HostnameOrIPAddress, arrName); - ArrayResize(arrName, ArraySize(arrName) + 1); - uint addr = inet_addr(arrName); - - if (addr == INADDR_NONE) { - // Not an IP address. Need to look up the name - // ....................................................................................... - // Unbelievably horrible handling of the hostent structure depending on whether - // we're in 32-bit or 64-bit, with different-length memory pointers. - // Ultimately, we're having to deal here with extracting a uint** from - // the memory block provided by Winsock - and with additional - // complications such as needing different versions of gethostbyname(), - // because the return value is a pointer, which is 4 bytes in x86 and - // 8 bytes in x64. So, we must artifically pass different types of buffer - // to gethostbyname() depending on the environment, so that the compiler - // doesn't treat them as imports which differ only by their return type. - if (TerminalInfoInteger(TERMINAL_X64)) { - char arrName64[]; - ArrayResize(arrName64, ArraySize(arrName)); - for (int i = 0; i < ArraySize(arrName); i++) arrName64[i] = (char)arrName[i]; - ulong nres = gethostbyname(arrName64); - if (nres == 0) { - // Name lookup failed - mLastWSAError = WSAGetLastError(); - #ifdef SOCKET_LIBRARY_LOGGING - Print("Name-resolution in gethostbyname() failed, 64-bit, error: ", mLastWSAError); - #endif - return; - } else { - // Need to navigate the hostent structure. Very, very ugly... - ushort addrlen; - RtlMoveMemory(addrlen, nres + 18, 2); - if (addrlen == 0) { - // No addresses associated with name - #ifdef SOCKET_LIBRARY_LOGGING - Print("Name-resolution in gethostbyname() returned no addresses, 64-bit, error: ", mLastWSAError); - #endif - return; - } else { - ulong ptr1, ptr2, ptr3; - RtlMoveMemory(ptr1, nres + 24, 8); - RtlMoveMemory(ptr2, ptr1, 8); - RtlMoveMemory(ptr3, ptr2, 4); - addr = (uint)ptr3; - } - } - } else { - uint nres = gethostbyname(arrName); - if (nres == 0) { - // Name lookup failed - mLastWSAError = WSAGetLastError(); - #ifdef SOCKET_LIBRARY_LOGGING - Print("Name-resolution in gethostbyname() failed, 32-bit, error: ", mLastWSAError); - #endif - return; - } else { - // Need to navigate the hostent structure. Very, very ugly... - ushort addrlen; - RtlMoveMemory(addrlen, nres + 10, 2); - if (addrlen == 0) { - // No addresses associated with name - #ifdef SOCKET_LIBRARY_LOGGING - Print("Name-resolution in gethostbyname() returned no addresses, 32-bit, error: ", mLastWSAError); - #endif - return; - } else { - int ptr1, ptr2; - RtlMoveMemory(ptr1, nres + 12, 4); - RtlMoveMemory(ptr2, ptr1, 4); - RtlMoveMemory(addr, ptr2, 4); - } - } - } - - } else { - // The HostnameOrIPAddress parameter is an IP address, - // which we have stored in addr - } - - // Fill in the address and port into a sockaddr_in structure - sockaddr server; - server.family = AF_INET; - server.port = htons(port); - server.address = addr; // Already in network-byte-order - - // connect() call has to differ between 32-bit and 64-bit - int res; - if (TerminalInfoInteger(TERMINAL_X64)) { - res = connect(mSocket64, server, sizeof(sockaddr)); - } else { - res = connect(mSocket32, server, sizeof(sockaddr)); - } - if (res == SOCKET_ERROR) { - // Ooops - mLastWSAError = WSAGetLastError(); - #ifdef SOCKET_LIBRARY_LOGGING - Print("connect() to server failed, error: ", mLastWSAError); - #endif - } else { - mConnected = true; - - // Set up event handling. Can fail if called in OnInit() when - // MT4/5 is still loading, because no window handle is available - #ifdef SOCKET_LIBRARY_USE_EVENTS - SetupSocketEventHandling(); - #endif - } -} - -// ------------------------------------------------------------- -// Constructors for internal use only, when accepting connections -// on a server socket -// ------------------------------------------------------------- - -ClientSocket::ClientSocket(ServerSocket* ForInternalUseOnly, SOCKET_HANDLE32 ForInternalUseOnly_clientsocket32) -{ - // Constructor ror "internal" use only, when accepting an incoming connection - // on a server socket - mConnected = true; - ReceiveBufferSize = 10000; - SendBufferSize = 999999999; - - mSocket32 = ForInternalUseOnly_clientsocket32; -} - -ClientSocket::ClientSocket(ServerSocket* ForInternalUseOnly, SOCKET_HANDLE64 ForInternalUseOnly_clientsocket64) -{ - // Constructor ror "internal" use only, when accepting an incoming connection - // on a server socket - mConnected = true; - ReceiveBufferSize = 10000; - SendBufferSize = 999999999; - - mSocket64 = ForInternalUseOnly_clientsocket64; -} - - -// ------------------------------------------------------------- -// Destructor. Close the socket if created -// ------------------------------------------------------------- - -ClientSocket::~ClientSocket() -{ - if (TerminalInfoInteger(TERMINAL_X64)) { - if (mSocket64 != 0) { - shutdown(mSocket64, 2); - closesocket(mSocket64); - } - } else { - if (mSocket32 != 0) { - shutdown(mSocket32, 2); - closesocket(mSocket32); - } - } -} - -// ------------------------------------------------------------- -// Simple send function which takes a string parameter -// ------------------------------------------------------------- - -bool ClientSocket::Send(string strMsg) -{ - if (!mConnected) return false; - - // Make sure that event handling is set up, if requested - #ifdef SOCKET_LIBRARY_USE_EVENTS - SetupSocketEventHandling(); - #endif - - int szToSend = StringLen(strMsg); - if (szToSend == 0) return true; // Ignore empty strings - - bool bRetval = true; - uchar arr[]; - StringToCharArray(strMsg, arr); - - while (szToSend > 0) { - int res, szAmountToSend = (szToSend > SendBufferSize ? SendBufferSize : szToSend); - if (TerminalInfoInteger(TERMINAL_X64)) { - res = send(mSocket64, arr, szToSend, 0); - } else { - res = send(mSocket32, arr, szToSend, 0); - } - - if (res == SOCKET_ERROR || res == 0) { - mLastWSAError = WSAGetLastError(); - if (mLastWSAError == WSAWOULDBLOCK) { - // Blocking operation. Retry. - } else { - #ifdef SOCKET_LIBRARY_LOGGING - Print("send() failed, error: ", mLastWSAError); - #endif - - // Assume death of socket for any other type of error - szToSend = -1; - bRetval = false; - mConnected = false; - } - } else { - szToSend -= res; - if (szToSend > 0) { - // If further data remains to be sent, shuffle the array downwards - // by copying it onto itself. Note that the MQL4/5 documentation - // says that the result of this is "undefined", but it seems - // to work reliably in real life (because it almost certainly - // just translates inside MT4/5 into a simple call to RtlMoveMemory, - // which does allow overlapping source & destination). - ArrayCopy(arr, arr, 0, res, szToSend); - } - } - } - - return bRetval; -} - - -// ------------------------------------------------------------- -// Simple send function which takes an array of uchar[], -// instead of a string. Can optionally be given a start-index -// within the array (rather then default zero) and a number -// of bytes to send. -// ------------------------------------------------------------- - -bool ClientSocket::Send(uchar & callerBuffer[], int startAt = 0, int szToSend = -1) -{ - if (!mConnected) return false; - - // Make sure that event handling is set up, if requested - #ifdef SOCKET_LIBRARY_USE_EVENTS - SetupSocketEventHandling(); - #endif - - // Process the start-at and send-size parameters - int arraySize = ArraySize(callerBuffer); - if (!arraySize) return true; // Ignore empty arrays - if (startAt >= arraySize) return true; // Not a valid start point; nothing to send - if (szToSend <= 0) szToSend = arraySize; - if (startAt + szToSend > arraySize) szToSend = arraySize - startAt; - - // Take a copy of the array - uchar arr[]; - ArrayResize(arr, szToSend); - ArrayCopy(arr, callerBuffer, 0, startAt, szToSend); - - bool bRetval = true; - - while (szToSend > 0) { - int res, szAmountToSend = (szToSend > SendBufferSize ? SendBufferSize : szToSend); - if (TerminalInfoInteger(TERMINAL_X64)) { - res = send(mSocket64, arr, szToSend, 0); - } else { - res = send(mSocket32, arr, szToSend, 0); - } - - if (res == SOCKET_ERROR || res == 0) { - mLastWSAError = WSAGetLastError(); - if (mLastWSAError == WSAWOULDBLOCK) { - // Blocking operation. Retry. - } else { - #ifdef SOCKET_LIBRARY_LOGGING - Print("send() failed, error: ", mLastWSAError); - #endif - - // Assume death of socket for any other type of error - szToSend = -1; - bRetval = false; - mConnected = false; - } - } else { - szToSend -= res; - if (szToSend > 0) { - // If further data remains to be sent, shuffle the array downwards - // by copying it onto itself. Note that the MQL4/5 documentation - // says that the result of this is "undefined", but it seems - // to work reliably in real life (because it almost certainly - // just translates inside MT4/5 into a simple call to RtlMoveMemory, - // which does allow overlapping source & destination). - ArrayCopy(arr, arr, 0, res, szToSend); - } - } - } - - return bRetval; -} - - -// ------------------------------------------------------------- -// Simple receive function. Without a message separator, -// it simply returns all the data sitting on the socket. -// With a separator, it stores up incoming data until -// it sees the separator, and then returns the text minus -// the separator. -// Returns a blank string once no (more) data is waiting -// for collection. -// ------------------------------------------------------------- - -string ClientSocket::Receive(string MessageSeparator = "") -{ - if (!mConnected) return ""; - - // Make sure that event handling is set up, if requested - #ifdef SOCKET_LIBRARY_USE_EVENTS - SetupSocketEventHandling(); - #endif - - string strRetval = ""; - - uchar arrBuffer[]; - ArrayResize(arrBuffer, ReceiveBufferSize); - - uint nonblock = 1; - if (TerminalInfoInteger(TERMINAL_X64)) { - ioctlsocket(mSocket64, FIONBIO, nonblock); - - int res = 1; - while (res > 0) { - res = recv(mSocket64, arrBuffer, ReceiveBufferSize, 0); - if (res > 0) { - StringAdd(mPendingReceiveData, CharArrayToString(arrBuffer, 0, res)); - - } else if (res == 0) { - // Socket closed - #ifdef SOCKET_LIBRARY_LOGGING - Print("Socket closed"); - #endif - mConnected = false; - - } else { - mLastWSAError = WSAGetLastError(); - - if (mLastWSAError != WSAWOULDBLOCK) { - #ifdef SOCKET_LIBRARY_LOGGING - Print("recv() failed, result:, " , res, ", error: ", mLastWSAError, " queued bytes: " , StringLen(mPendingReceiveData)); - #endif - mConnected = false; - } - } - } - } else { - ioctlsocket(mSocket32, FIONBIO, nonblock); - - int res = 1; - while (res > 0) { - res = recv(mSocket32, arrBuffer, ReceiveBufferSize, 0); - if (res > 0) { - StringAdd(mPendingReceiveData, CharArrayToString(arrBuffer, 0, res)); - - } else if (res == 0) { - // Socket closed - #ifdef SOCKET_LIBRARY_LOGGING - Print("Socket closed"); - #endif - mConnected = false; - - } else { - mLastWSAError = WSAGetLastError(); - - if (mLastWSAError != WSAWOULDBLOCK) { - #ifdef SOCKET_LIBRARY_LOGGING - Print("recv() failed, result:, " , res, ", error: ", mLastWSAError, " queued bytes: " , StringLen(mPendingReceiveData)); - #endif - mConnected = false; - } - } - } - } - - if (mPendingReceiveData == "") { - // No data - - } else if (MessageSeparator == "") { - // No requested message separator to wait for - strRetval = mPendingReceiveData; - mPendingReceiveData = ""; - - } else { - int idx = StringFind(mPendingReceiveData, MessageSeparator); - if (idx >= 0) { - while (idx == 0) { - mPendingReceiveData = StringSubstr(mPendingReceiveData, idx + StringLen(MessageSeparator)); - idx = StringFind(mPendingReceiveData, MessageSeparator); - } - - strRetval = StringSubstr(mPendingReceiveData, 0, idx); - mPendingReceiveData = StringSubstr(mPendingReceiveData, idx + StringLen(MessageSeparator)); - } - } - - return strRetval; -} - -// ------------------------------------------------------------- -// Receive function which fills an array, provided by reference. -// Always clears the array. Returns the number of bytes -// put into the array. -// If you send and receive binary data, then you can no longer -// use the built-in messaging protocol provided by this library's -// option to process a message terminator such as \r\n. You have -// to implement the messaging yourself. -// ------------------------------------------------------------- - -int ClientSocket::Receive(uchar & callerBuffer[]) -{ - if (!mConnected) return 0; - - ArrayResize(callerBuffer, 0); - int ctTotalReceived = 0; - - // Make sure that event handling is set up, if requested - #ifdef SOCKET_LIBRARY_USE_EVENTS - SetupSocketEventHandling(); - #endif - - uchar arrBuffer[]; - ArrayResize(arrBuffer, ReceiveBufferSize); - - uint nonblock = 1; - if (TerminalInfoInteger(TERMINAL_X64)) { - ioctlsocket(mSocket64, FIONBIO, nonblock); - } else { - ioctlsocket(mSocket32, FIONBIO, nonblock); - } - - int res = 1; - while (res > 0) { - if (TerminalInfoInteger(TERMINAL_X64)) { - res = recv(mSocket64, arrBuffer, ReceiveBufferSize, 0); - } else { - res = recv(mSocket32, arrBuffer, ReceiveBufferSize, 0); - } - - if (res > 0) { - ArrayResize(callerBuffer, ctTotalReceived + res); - ArrayCopy(callerBuffer, arrBuffer, ctTotalReceived, 0, res); - ctTotalReceived += res; - - } else if (res == 0) { - // Socket closed - #ifdef SOCKET_LIBRARY_LOGGING - Print("Socket closed"); - #endif - mConnected = false; - - } else { - mLastWSAError = WSAGetLastError(); - - if (mLastWSAError != WSAWOULDBLOCK) { - #ifdef SOCKET_LIBRARY_LOGGING - Print("recv() failed, result:, " , res, ", error: ", mLastWSAError); - #endif - mConnected = false; - } - } - } - - return ctTotalReceived; -} - -// ------------------------------------------------------------- -// Event handling in client socket -// ------------------------------------------------------------- - -void ClientSocket::SetupSocketEventHandling() -{ - #ifdef SOCKET_LIBRARY_USE_EVENTS - if (mDoneEventHandling) return; - - // Can only do event handling in an EA. Ignore otherwise. - if (MQLInfoInteger(MQL_PROGRAM_TYPE) != PROGRAM_EXPERT) { - mDoneEventHandling = true; - return; - } - - long hWnd = ChartGetInteger(0, CHART_WINDOW_HANDLE); - if (!hWnd) return; - mDoneEventHandling = true; // Don't actually care whether it succeeds. - - if (TerminalInfoInteger(TERMINAL_X64)) { - WSAAsyncSelect(mSocket64, hWnd, 0x100 /* WM_KEYDOWN */, 0xFF /* All events */); - } else { - WSAAsyncSelect(mSocket32, (int)hWnd, 0x100 /* WM_KEYDOWN */, 0xFF /* All events */); - } - #endif -} - - -// ------------------------------------------------------------- -// Server socket class -// ------------------------------------------------------------- - -class ServerSocket -{ - private: - // Need different socket handles for 32-bit and 64-bit environments - SOCKET_HANDLE32 mSocket32; - SOCKET_HANDLE64 mSocket64; - - // Other state variables - bool mCreated; - int mLastWSAError; - - // Optional event handling - void SetupSocketEventHandling(); - bool mDoneEventHandling; - - public: - // Constructor, specifying whether we allow remote connections - ServerSocket(ushort ServerPort, bool ForLocalhostOnly); - - // Destructor - ~ServerSocket(); - - // Accept function, which returns NULL if no waiting client, or - // a new instace of ClientSocket() - ClientSocket * Accept(); - - // Access to state information - bool Created() {return mCreated;} - int GetLastSocketError() {return mLastWSAError;} - ulong GetSocketHandle() {return (mSocket32 ? mSocket32 : mSocket64);} -}; - - -// ------------------------------------------------------------- -// Constructor for server socket -// ------------------------------------------------------------- - -ServerSocket::ServerSocket(ushort serverport, bool ForLocalhostOnly) -{ - // Create socket and make it non-blocking - mCreated = false; - mLastWSAError = 0; - if (TerminalInfoInteger(TERMINAL_X64)) { - // Force compiler to use the 64-bit version of socket() - // by passing it a uint 3rd parameter - uint proto = IPPROTO_TCP; - mSocket64 = socket(AF_INET, SOCK_STREAM, proto); - - if (mSocket64 == INVALID_SOCKET64) { - mLastWSAError = WSAGetLastError(); - #ifdef SOCKET_LIBRARY_LOGGING - Print("socket() failed, 64-bit, error: ", mLastWSAError); - #endif - return; - } - uint nonblock = 1; - ioctlsocket(mSocket64, FIONBIO, nonblock); - - } else { - // Force compiler to use the 32-bit version of socket() - // by passing it a int 3rd parameter - int proto = IPPROTO_TCP; - mSocket32 = socket(AF_INET, SOCK_STREAM, proto); - - if (mSocket32 == INVALID_SOCKET32) { - mLastWSAError = WSAGetLastError(); - #ifdef SOCKET_LIBRARY_LOGGING - Print("socket() failed, 32-bit, error: ", mLastWSAError); - #endif - return; - } - uint nonblock = 1; - ioctlsocket(mSocket32, FIONBIO, nonblock); - } - - // Try a bind - sockaddr server; - server.family = AF_INET; - server.port = htons(serverport); - server.address = (ForLocalhostOnly ? 0x100007f : 0); // 127.0.0.1 or INADDR_ANY - - if (TerminalInfoInteger(TERMINAL_X64)) { - int bindres = bind(mSocket64, server, sizeof(sockaddr)); - if (bindres != 0) { - // Bind failed - mLastWSAError = WSAGetLastError(); - #ifdef SOCKET_LIBRARY_LOGGING - Print("bind() failed, 64-bit, port probably already in use, error: ", mLastWSAError); - #endif - return; - - } else { - int listenres = listen(mSocket64, 10); - if (listenres != 0) { - // Listen failed - mLastWSAError = WSAGetLastError(); - #ifdef SOCKET_LIBRARY_LOGGING - Print("listen() failed, 64-bit, error: ", mLastWSAError); - #endif - return; - - } else { - mCreated = true; - } - } - } else { - int bindres = bind(mSocket32, server, sizeof(sockaddr)); - if (bindres != 0) { - // Bind failed - mLastWSAError = WSAGetLastError(); - #ifdef SOCKET_LIBRARY_LOGGING - Print("bind() failed, 32-bit, port probably already in use, error: ", mLastWSAError); - #endif - return; - - } else { - int listenres = listen(mSocket32, 10); - if (listenres != 0) { - // Listen failed - mLastWSAError = WSAGetLastError(); - #ifdef SOCKET_LIBRARY_LOGGING - Print("listen() failed, 32-bit, error: ", mLastWSAError); - #endif - return; - - } else { - mCreated = true; - } - } - } - - // Try settig up event handling; can fail here in constructor - // if no window handle is available because it's being called - // from OnInit() while MT4/5 is loading - #ifdef SOCKET_LIBRARY_USE_EVENTS - SetupSocketEventHandling(); - #endif -} - - -// ------------------------------------------------------------- -// Destructor. Close the socket if created -// ------------------------------------------------------------- - -ServerSocket::~ServerSocket() -{ - if (TerminalInfoInteger(TERMINAL_X64)) { - if (mSocket64 != 0) closesocket(mSocket64); - } else { - if (mSocket32 != 0) closesocket(mSocket32); - } -} - -// ------------------------------------------------------------- -// Accepts any incoming connection. Returns either NULL, -// or an instance of ClientSocket -// ------------------------------------------------------------- - -ClientSocket * ServerSocket::Accept() -{ - if (!mCreated) return NULL; - - // Make sure that event handling is in place; can fail in constructor - // if no window handle is available because it's being called - // from OnInit() while MT4/5 is loading - #ifdef SOCKET_LIBRARY_USE_EVENTS - SetupSocketEventHandling(); - #endif - - ClientSocket * pClient = NULL; - - if (TerminalInfoInteger(TERMINAL_X64)) { - SOCKET_HANDLE64 acc = accept(mSocket64, 0, 0); - if (acc != INVALID_SOCKET64) { - pClient = new ClientSocket(NULL, acc); - } - } else { - SOCKET_HANDLE32 acc = accept(mSocket32, 0, 0); - if (acc != INVALID_SOCKET32) { - pClient = new ClientSocket(NULL, acc); - } - } - - return pClient; -} - -// ------------------------------------------------------------- -// Event handling -// ------------------------------------------------------------- - -void ServerSocket::SetupSocketEventHandling() -{ - #ifdef SOCKET_LIBRARY_USE_EVENTS - if (mDoneEventHandling) return; - - // Can only do event handling in an EA. Ignore otherwise. - if (MQLInfoInteger(MQL_PROGRAM_TYPE) != PROGRAM_EXPERT) { - mDoneEventHandling = true; - return; - } - - long hWnd = ChartGetInteger(0, CHART_WINDOW_HANDLE); - if (!hWnd) return; - mDoneEventHandling = true; // Don't actually care whether it succeeds. - - if (TerminalInfoInteger(TERMINAL_X64)) { - WSAAsyncSelect(mSocket64, hWnd, 0x100 /* WM_KEYDOWN */, 0xFF /* All events */); - } else { - WSAAsyncSelect(mSocket32, (int)hWnd, 0x100 /* WM_KEYDOWN */, 0xFF /* All events */); - } - #endif -} \ No newline at end of file diff --git a/resources/wf-dump.mq5 b/resources/wf-dump.mq5 deleted file mode 100644 index e2d8f29..0000000 --- a/resources/wf-dump.mq5 +++ /dev/null @@ -1,51 +0,0 @@ -//+------------------------------------------------------------------+ -//| Example usage of sending a POST request | -//+------------------------------------------------------------------+ - -void SendPostRequest(string url, string data) -{ - int socket = SocketCreate(); - - //--- check the handle - if (socket != INVALID_HANDLE) - { - //--- connect if all is well - if (SocketConnect(socket, Address, Port, 1000)) - { - Print("Established connection to ", Address, ":", Port); - string subject, issuer, serial, thumbprint; - datetime expiration; - - //--- if connection is secured by the certificate, display its data - if (SocketTlsCertificate(socket, subject, issuer, serial, thumbprint, expiration)) - { - Print("TLS certificate:"); - Print(" Owner: ", subject); - Print(" Issuer: ", issuer); - Print(" Number: ", serial); - Print(" Print: ", thumbprint); - Print(" Expiration: ", expiration); - ExtTLS = true; - } - - //--- send POST request to the server - if (HTTPPost(socket, url, data)) - { - Print("POST request sent"); - - //--- read the response - if (!HTTPRecv(socket, 1000)) - Print("Failed to get a response, error ", GetLastError()); - } - else - Print("Failed to send POST request, error ", GetLastError()); - } - else - Print("Connection to ", Address, ":", Port, " failed, error ", GetLastError()); - - //--- close a socket after using - SocketClose(socket); - } - else - Print("Failed to create a socket, error ", GetLastError()); -} \ No newline at end of file diff --git a/resources/wf-server-22.mq5 b/resources/wf-server-22.mq5 deleted file mode 100644 index 1728a51..0000000 --- a/resources/wf-server-22.mq5 +++ /dev/null @@ -1,624 +0,0 @@ -//+------------------------------------------------------------------+ -//| WiseFinanceSocketServer | -//| Copyright 2023, Fortesense Labs. | -//| https://www.wisefinance.com | -//+------------------------------------------------------------------+ -// Reference: -// - https://github.com/ejtraderLabs/Metatrader5-Docker -// - https://www.mql5.com/en/code/280 - -#property copyright "Copyright 2023, Fortesense Labs." -#property link "https://www.wisefinance.com" -#property version "0.10" -#property description "Wise Finance Socket Server" - -#define SYMBOLS_TRADING "Step Index", "Boom 1000 Index", "Volatility 100 Index", "Volatility 25 Index" -#define CHART_EVENT_SYMBOL CHARTEVENT_ALL - -#include -#include -#include -#include -#include -#include -#include -#include - -// Load wiseFinanceMT includes -// Required: -// #include -// #include -// #include -// Optional: -// #include -// #include - -// Set host and Port -input string HOST = "0.0.0.0"; -input ushort PORT = 8000; // int - -// Global variables -bool debug = true; -bool liveStream = false; -bool connectedFlag = true; -int deInitReason = -1; - -// Sockets -SOCKET64 serverSocket = INVALID_SOCKET64; -SOCKET64 clients[1024]; - -// Timer interval in milliseconds -int timerInterval = 3 * 1000; - -// Variables for handling price data stream -struct SymbolSubscription -{ - string symbol; - string chartTf; - datetime lastBar; -}; - -SymbolSubscription symbolSubscriptions[]; -int symbolSubscriptionCount = 0; - -// Error handling -ControlErrors mControl; -datetime tm; - -//+------------------------------------------------------------------+ -//| Get Data from Socket | -//+------------------------------------------------------------------+ -string GetDataFromSocket(SOCKET64 socket, string &body) -{ - if (socket != INVALID_SOCKET64) - { - Print("socket received"); - return SocketRecv(socket, body); - } - return ""; -} - -//+------------------------------------------------------------------+ -//| Send Socket response | -//+------------------------------------------------------------------+ -int SocketSend(SOCKET64 socket, string data) -{ - uchar response[]; - int len = StringToCharArray(data, response) - 1; - if (len < 0) - { - return 0; - } - // Send the HTTP response back to the client - return send(socket, response, ArraySize(response), 0); -} - -//+------------------------------------------------------------------+ -//| Read Socket request | -//+------------------------------------------------------------------+ -int SocketRecv(SOCKET64 socket, string &body) -{ - if (socket != INVALID_SOCKET64) - { - char buf[4096]; - int request_len = recv(socket, buf, sizeof(buf), 0); - if (request_len > 0) - { - uchar data[]; - ArrayCopy(data, buf, ArraySize(data), 0, request_len); - body = CharArrayToString(data); // Store received data in the 'body' string. - } - else if (request_len == 0) - { - // The client has disconnected - closesocket(socket); - socket = INVALID_SOCKET64; - } - else - { - // An error occurred - int err = WSAGetLastError(); - if (err != WSAEWOULDBLOCK) - { - Print("recv failed with error: ", err); - closesocket(socket); - socket = INVALID_SOCKET64; - } - } - } - return socket; -} - -//+------------------------------------------------------------------+ -//| AcceptClients | -//+------------------------------------------------------------------+ -void AcceptClients() -{ - if (serverSocket == INVALID_SOCKET64) - { - return; - } - // Accept any new incoming connections - SOCKET64 client = INVALID_SOCKET64; - ref_sockaddr clientAddress; - int addressSize = sizeof(ref_sockaddr); - client = accept(serverSocket, clientAddress.ref, addressSize); - if (client != INVALID_SOCKET64) - { - // Add the new client socket to the list of clients - for (int i = 0; i < ArraySize(clients); i++) - { - if (clients[i] == INVALID_SOCKET64) - { - clients[i] = client; - break; - } - } - } -} - -//+------------------------------------------------------------------+ -//| StartServer | -//+------------------------------------------------------------------+ -bool StartServer(string addr, ushort port) -{ - bool result = false; - // Initialize the library - char wsaData[]; - ArrayResize(wsaData, sizeof(WSAData)); - int res = WSAStartup(MAKEWORD(2, 2), wsaData); - if (res != 0) - { - Print("-WSAStartup failed error: " + string(res)); - return result; - } - // Create a socket - serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (serverSocket == INVALID_SOCKET64) - { - Print("-Create failed error: " + WSAErrorDescript(WSAGetLastError())); - return result; - } - // Bind to address and port - Print("Trying to bind " + addr + ":" + string(port)); - char ch[]; - StringToCharArray(addr, ch); - sockaddr_in addrin; - addrin.sin_family = AF_INET; - addrin.sin_addr.u.S_addr = inet_addr(ch); - addrin.sin_port = htons(port); - ref_sockaddr ref; - ref.in = addrin; - if (bind(serverSocket, ref.ref, sizeof(addrin)) == SOCKET_ERROR) - { - int err = WSAGetLastError(); - if (err != WSAEISCONN) - { - Print("-Connect failed error: " + WSAErrorDescript(err) + ". Cleanup socket"); - return result; - } - } - // Set to non-blocking mode - int non_block = 1; - res = ioctlsocket(serverSocket, (int)FIONBIO, non_block); - if (res != NO_ERROR) - { - Print("ioctlsocket failed error: " + string(res)); - return result; - } - // Listen on the port and accept client connections - if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) - { - Print("Listen failed with error: ", WSAErrorDescript(WSAGetLastError())); - return result; - } - return !result; -} - -//+------------------------------------------------------------------+ -//| CloseServer | -//+------------------------------------------------------------------+ -void CloseServer() -{ - // Close all client sockets - for (int i = 0; i < ArraySize(clients); i++) - { - if (clients[i] != INVALID_SOCKET64) - { - closesocket(clients[i]); - clients[i] = INVALID_SOCKET64; - } - } - // Close the server socket - if (serverSocket != INVALID_SOCKET64) - { - closesocket(serverSocket); - serverSocket = INVALID_SOCKET64; - } - // Clean up Winsock - WSACleanup(); -} - -//+------------------------------------------------------------------+ -//| Expert initialization function | -//+------------------------------------------------------------------+ -void OnInit() -{ - // Setting up error reporting - mControl.SetAlert(true); - mControl.SetSound(false); - mControl.SetWriteFlag(false); - // Skip reloading of the EA script when the reason to reload is a chart timeframe change - if (deInitReason != REASON_CHARTCHANGE) - { - EventSetMillisecondTimer(1); - Print("Starting Server!!!"); - StartServer(HOST, PORT); - Print("Server Started successfully..."); - } -} - -//+------------------------------------------------------------------+ -//| OnDeinit handler | -//+------------------------------------------------------------------+ -void OnDeinit(const int reason) -{ - // Close the server socket - CloseServer(); - // TODO Ports do not get freed immediately under Wine. How to properly close ports? There is a timeout of about 60 sec. - // https://forum.winehq.org/viewtopic.php?t=22758 - // https://github.com/zeromq/cppzmq/issues/139 - deInitReason = reason; - // Print a message to the console - printf("Server Socket connection closed\n"); - // Reset - ResetSubscriptionsAndIndicators(); - EventKillTimer(); -} - -//+------------------------------------------------------------------+ -//| Check if subscribed to symbol and timeframe combination | -//+------------------------------------------------------------------+ -bool HasChartSymbol(string symbol, string chartTF) -{ - for (int i = 0; i < ArraySize(symbolSubscriptions); i++) - { - if (symbolSubscriptions[i].symbol == symbol && symbolSubscriptions[i].chartTf == chartTF) - { - return true; - } - } - return false; -} - -//+------------------------------------------------------------------+ -//| Expert timer function | -//+------------------------------------------------------------------+ -void OnTimer() -{ - // Accept any new incoming connections - AcceptClients(); - // Check for data from any of the clients - ProcessClientsData(); - tm = TimeTradeServer(); -} - -//+------------------------------------------------------------------+ -//| ProcessClientsData | -//+------------------------------------------------------------------+ -void ProcessClientsData() -{ - if (ArraySize(clients) == 0) - { - Print("Waiting for Connections!!!"); - return; - } - for (int i = 0; i < ArraySize(clients); i++) - { - string data; - clients[i] = SocketRecv(clients[i], data); - ProcessClientRequest(clients[i]); - } -} - -//+------------------------------------------------------------------+ -//| Process Client Request and Respond | -//+------------------------------------------------------------------+ -void ProcessClientRequest(SOCKET64 clientSocket) -{ - char buffer[4096]; - // Get data from request - string msg; - int bytesRead = SocketRecv(clientSocket, msg); - if (bytesRead <= 0) - { - // Error or connection closed - closesocket(clientSocket); - return; - } - RequestHandler(msg); -} - -//+------------------------------------------------------------------+ -//| Request handler - process commands | -//+------------------------------------------------------------------+ -void RequestHandler(string msg) -{ - CJAVal incomingMessage; - ResetLastError(); - if (debug) - Print("Processing:" + msg); - if (!incomingMessage.Deserialize(msg)) - { - mControl.mSetUserError(65537, GetErrorID(65537)); - CheckError(__FUNCTION__); - } - // Send response to System socket that request was received - // Some historical data requests can take a lot of time - // InformClientSocket(socket, "OK"); - // Process action command - Print("incoming message: ", &incomingMessage); - string action = incomingMessage["action"].ToStr(); - if (action == "CONFIG") - { - ScriptConfiguration(incomingMessage); - } - else if (action == "ACCOUNT") - { - GetAccountInfo(); - } - else - { - mControl.mSetUserError(65538, GetErrorID(65538)); - CheckError(__FUNCTION__); - } -} - -//+------------------------------------------------------------------+ -//| Reconfigure the script params | -//+------------------------------------------------------------------+ -void ScriptConfiguration(CJAVal &dataObject) -{ - string symbol = dataObject["symbol"].ToStr(); - string chartTF = dataObject["chartTF"].ToStr(); - ArrayResize(symbolSubscriptions, symbolSubscriptionCount + 1); - symbolSubscriptions[symbolSubscriptionCount].symbol = symbol; - symbolSubscriptions[symbolSubscriptionCount].chartTf = chartTF; - // to initialize with value 0 skips the first price - symbolSubscriptions[symbolSubscriptionCount].lastBar = 0; - symbolSubscriptionCount++; - mControl.mResetLastError(); - SymbolInfoString(symbol, SYMBOL_DESCRIPTION); - if (!CheckError(__FUNCTION__)) - { - ActionDoneOrError(ERR_SUCCESS, __FUNCTION__, "ERR_SUCCESS"); - } -} - -//+------------------------------------------------------------------+ -//| Account information | -//+------------------------------------------------------------------+ -void GetAccountInfo() -{ - CJAVal info; - info["error"] = false; - info["broker"] = AccountInfoString(ACCOUNT_COMPANY); - info["currency"] = AccountInfoString(ACCOUNT_CURRENCY); - info["server"] = AccountInfoString(ACCOUNT_SERVER); - info["trading_allowed"] = TerminalInfoInteger(TERMINAL_TRADE_ALLOWED); - info["bot_trading"] = AccountInfoInteger(ACCOUNT_TRADE_EXPERT); - info["balance"] = AccountInfoDouble(ACCOUNT_BALANCE); - info["equity"] = AccountInfoDouble(ACCOUNT_EQUITY); - info["margin"] = AccountInfoDouble(ACCOUNT_MARGIN); - info["margin_free"] = AccountInfoDouble(ACCOUNT_MARGIN_FREE); - info["margin_level"] = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL); - info["time"] = string(tm); // sending time to ejtraderMT for localtime data frame - string t = info.Serialize(); - if (debug) - Print(t); - // InformClientSocket(serverSocket, t); -} - -//+------------------------------------------------------------------+ -//| Expert multi tick function | -//| Use this function instead of the standard OnTick() function | -//| OnTick handler | -//+------------------------------------------------------------------+ -void OnTick(string symbol) -{ - // Accept any new incoming connections - AcceptClients(); - // Check for data from any of the clients - ProcessClientsData(); -} - -//+------------------------------------------------------------------+ -//| ChartEvent function | -//| This function must be declared, even if it's empty. | -//+------------------------------------------------------------------+ -void OnChartEvent(const int id, // event id - const long &lparam, // event param of long type - const double &dparam, // event param of double type - const string &sparam) // event param of string type -{ - // Print("OnChartEvent id: ", id); - // Print("OnChartEvent lparam: ", lparam); - // Print("OnChartEvent dparam: ", dparam); - // Print("OnChartEvent sparam: ", sparam); -} - -//+------------------------------------------------------------------+ -//| Convert chart timeframe from string to enum | -//+------------------------------------------------------------------+ -ENUM_TIMEFRAMES GetTimeframe(string chartTF) -{ - ENUM_TIMEFRAMES tf; - tf = NULL; - if (chartTF == "TICK") - tf = PERIOD_CURRENT; - if (chartTF == "M1") - tf = PERIOD_M1; - if (chartTF == "M5") - tf = PERIOD_M5; - if (chartTF == "M15") - tf = PERIOD_M15; - if (chartTF == "M30") - tf = PERIOD_M30; - if (chartTF == "H1") - tf = PERIOD_H1; - if (chartTF == "H2") - tf = PERIOD_H2; - if (chartTF == "H3") - tf = PERIOD_H3; - if (chartTF == "H4") - tf = PERIOD_H4; - if (chartTF == "H6") - tf = PERIOD_H6; - if (chartTF == "H8") - tf = PERIOD_H8; - if (chartTF == "H12") - tf = PERIOD_H12; - if (chartTF == "D1") - tf = PERIOD_D1; - if (chartTF == "W1") - tf = PERIOD_W1; - if (chartTF == "MN1") - tf = PERIOD_MN1; - // if tf == NULL an error will be raised in the config function - return (tf); -} - -//+------------------------------------------------------------------+ -//| Trade confirmation | -//+------------------------------------------------------------------+ -void OrderDoneOrError(bool error, string funcName, CTrade &trade) -{ - CJAVal conf; - conf["error"] = (bool)error; - conf["retcode"] = (int)trade.ResultRetcode(); - conf["desription"] = (string)GetRetcodeID(trade.ResultRetcode()); - // conf["deal"]=(int) trade.ResultDeal(); - conf["order"] = (int)trade.ResultOrder(); - conf["volume"] = (double)trade.ResultVolume(); - conf["price"] = (double)trade.ResultPrice(); - conf["bid"] = (double)trade.ResultBid(); - conf["ask"] = (double)trade.ResultAsk(); - conf["function"] = (string)funcName; - string t = conf.Serialize(); - if (debug) - Print(t); - // InformClientSocket(serverSocket, t); -} - -//+------------------------------------------------------------------+ -//| Error reporting | -//+------------------------------------------------------------------+ -bool CheckError(string funcName) -{ - int lastError = mControl.mGetLastError(); - if (lastError) - { - string desc = mControl.mGetDesc(); - if (debug) - Print("Error handling source: ", funcName, " description: ", desc); - Print("Error handling source: ", funcName, " description: ", desc); - mControl.Check(); - ActionDoneOrError(lastError, funcName, desc); - return true; - } - else - return false; -} - -//+------------------------------------------------------------------+ -//| Action confirmation | -//+------------------------------------------------------------------+ -void ActionDoneOrError(int lastError, string funcName, string desc) -{ - CJAVal conf; - conf["error"] = (bool)true; - if (lastError == 0) - conf["error"] = (bool)false; - conf["lastError"] = (string)lastError; - conf["description"] = (string)desc; - conf["function"] = (string)funcName; - string t = conf.Serialize(); - if (debug) - Print(t); - - // InformClientSocket(serverSocket, t); -} - -//+------------------------------------------------------------------+ -//| Inform Client via socket | -//+------------------------------------------------------------------+ -void InformClientSocket(SOCKET64 &socket, string data) -{ - // non-blocking - // workingSocket.send(data, true); - SocketSend(socket, data); - // TODO: Array out of range error - mControl.mResetLastError(); - // mControl.Check(); -} - -//+------------------------------------------------------------------+ -//| Clear symbol subscriptions and indicators | -//+------------------------------------------------------------------+ -void ResetSubscriptionsAndIndicators() -{ - ArrayFree(symbolSubscriptions); - symbolSubscriptionCount = 0; - bool error = false; - ActionDoneOrError(ERR_SUCCESS, __FUNCTION__, "ERR_SUCCESS"); -} - -//+------------------------------------------------------------------+ -//| Get retcode message by retcode id | -//+------------------------------------------------------------------+ -string GetRetcodeID(int retcode) -{ - switch (retcode) - { - case 10004: - return ("TRADE_RETCODE_REQUOTE"); - break; - case 10006: - return ("TRADE_RETCODE_REJECT"); - break; - case 10007: - return ("TRADE_RETCODE_CANCEL"); - break; - case 10008: - return ("TRADE_RETCODE_PLACED"); - break; - case 10009: - return ("TRADE_RETCODE_DONE"); - break; - case 10010: - return ("TRADE_RETCODE_DONE_PARTIAL"); - break; - case 10011: - return ("TRADE_RETCODE_ERROR"); - break; - case 10012: - return ("TRADE_RETCODE_TIMEOUT"); - break; - case 10013: - return ("TRADE_RETCODE_SO_MANY_REQUESTS"); - break; - case 10014: - return ("TRADE_RETCODE_NO_MONEY"); - break; - case 10015: - return ("TRADE_RETCODE_PRICE_CHANGED"); - break; - case 10016: - return ("TRADE_RETCODE_SERVER_DISABLES_AT"); - break; - default: - return ("TRADE_RETCODE_UNKNOWN"); - } -} - -//+------------------------------------------------------------------+ diff --git a/resources/wf-v1.mq5 b/resources/wf-v1.mq5 deleted file mode 100644 index b890673..0000000 --- a/resources/wf-v1.mq5 +++ /dev/null @@ -1,198 +0,0 @@ -//+------------------------------------------------------------------+ - -//| SocketExample.mq5 | - -//| Copyright 2018, MetaQuotes Software Corp. | - -//| https://www.mql5.com | - -//+------------------------------------------------------------------+ - -#property copyright "Copyright 2018, MetaQuotes Software Corp." - -#property link "https://www.mql5.com" - -#property version "1.00" - -#property description "Add Address to the list of allowed ones in the terminal settings to let the example work" - -#property script_show_inputs - -input string Address = "localhost"; - -input int Port = 9090; - -bool ExtTLS = false; - -int serverTimeout = 5000; - -MqlRates candles[]; - -//+------------------------------------------------------------------+ - -//| Send command to the server | - -//+------------------------------------------------------------------+ - -bool HTTPSend(int socket, string request) - -{ - - char req[]; - - int len = StringToCharArray(request, req) - 1; - - if (len < 0) - - return (false); - - //--- if secure TLS connection is used via the port 443 - - if (ExtTLS) - - return (SocketTlsSend(socket, req, len) == len); - - //--- if standard TCP connection is used - - return (SocketSend(socket, req, len) == len); -} - -//+------------------------------------------------------------------+ - -//| Read server response | - -//+------------------------------------------------------------------+ - -bool HTTPRecv(int socket, uint timeout) - -{ - - char rsp[]; - - string result; - - uint timeout_check = GetTickCount() + timeout; - - //--- read data from sockets till they are still present but not longer than timeout - - do - - { - - uint len = SocketIsReadable(socket); - - if (len) - - { - - int rsp_len; - - //--- various reading commands depending on whether the connection is secure or not - - if (ExtTLS) - - rsp_len = SocketTlsRead(socket, rsp, len); - - else - - rsp_len = SocketRead(socket, rsp, len, timeout); - - //--- analyze the response - - if (rsp_len > 0) - - { - - result += CharArrayToString(rsp, 0, rsp_len); - - //--- print only the response header - - int header_end = StringFind(result, "\r\n\r\n"); - - if (header_end > 0) - - { - Print("HTTP header received:"); - Print(StringSubstr(result, 0, header_end)); - - //--- parse the body - string body = StringSubstr(result, header_end + 4); - Print("HTTP body received:"); - Print(body); - - return (true); - } - } - } - - } while (GetTickCount() < timeout_check && !IsStopped()); - - return (false); -} - -//+------------------------------------------------------------------+ -//| for every symbol tick function | -//+------------------------------------------------------------------+ - -void OnTick() -{ - CopyRates(_Symbol, _Period, 0, 1, candles); -} -//+------------------------------------------------------------------+ -//| Script program start function | -//+------------------------------------------------------------------+ -void OnStart() -{ - // Initializing candles - ArraySetAsSeries(candles, true); - - while (!IsStopped()) - { - int socket = SocketCreate(); - - //--- check the handle - if (socket != INVALID_HANDLE) - { - //--- connect if all is well - if (SocketConnect(socket, Address, Port, 1000)) - { - Print("Established connection to ", Address, ":", Port); - string subject, issuer, serial, thumbprint; - datetime expiration; - - //--- if connection is secured by the certificate, display its data - if (SocketTlsCertificate(socket, subject, issuer, serial, thumbprint, expiration)) - { - Print("TLS certificate:"); - Print(" Owner: ", subject); - Print(" Issuer: ", issuer); - Print(" Number: ", serial); - Print(" Print: ", thumbprint); - Print(" Expiration: ", expiration); - ExtTLS = true; - } - - //--- send GET request to the server - if (HTTPSend(socket, "GET / HTTP/1.1\r\nHost: www.mql5.com\r\nUser-Agent: MT5\r\n\r\n")) - { - Print("GET request sent"); - - //--- read the response - if (!HTTPRecv(socket, 1000)) - Print("Failed to get a response, error ", GetLastError()); - } - else - Print("Failed to send GET request, error ", GetLastError()); - } - else - Print("Connection to ", Address, ":", Port, " failed, error ", GetLastError()); - - //--- close a socket after using - SocketClose(socket); - } - else - Print("Failed to create a socket, error ", GetLastError()); - - Sleep(serverTimeout); // Wait for N seconds before checking the server again - } -} diff --git a/server/MQL5/Dockerfile.MetaTrader5 b/server/MQL5/Dockerfile.MetaTrader5 new file mode 100644 index 0000000..1019b1c --- /dev/null +++ b/server/MQL5/Dockerfile.MetaTrader5 @@ -0,0 +1,45 @@ +FROM golang:1.14-buster AS novnc-build + +WORKDIR /src + +RUN go mod init build && \ + go get github.com/geek1011/easy-novnc@v1.1.0 && \ + go build -o /bin/easy-novnc github.com/geek1011/easy-novnc + +FROM engineervix/pyinstaller-windows:latest + +# Install required packages +RUN apt-get update -y && \ + apt-get install -y --no-install-recommends openbox tigervnc-standalone-server supervisor gosu && \ + rm -rf /var/lib/apt/lists && \ + mkdir -p /usr/share/desktop-directories + +RUN apt-get update -y && \ + apt-get install -y --no-install-recommends lxterminal nano openssh-client rsync xdg-utils htop tar xzip gzip bzip2 zip unzip && \ + rm -rf /var/lib/apt/lists + +RUN apt-get update -y && \ + apt-get install -y --no-install-recommends thunderbird && \ + rm -rf /var/lib/apt/lists + +COPY --from=novnc-build /bin/easy-novnc /usr/local/bin/ +COPY assets/menu.xml /etc/xdg/openbox/ +COPY assets/supervisord.conf /etc/ + +# set wine C drive directory +ENV DRIVE_C=/wine/drive_c +WORKDIR ${DRIVE_C} + +# Copy Metatrader5 folder inside wine and install required packages +COPY Metatrader5 ${DRIVE_C}/Metatrader5 +# RUN pip install pandas MetaTrader5 +COPY assets/metatrader.desktop /usr/share/applications/ + +# Install wine-python-pip +RUN wget https://bootstrap.pypa.io/get-pip.py -O ${DRIVE_C}/Python37/Scripts/get-pip.py && \ + wine ${DRIVE_C}/Python37/python.exe "${DRIVE_C}/Python37/Scripts/get-pip.py" + +# Port +EXPOSE 8080 + +CMD ["supervisord"] \ No newline at end of file diff --git a/server/MQL5/Experts/MT5.mq5 b/server/MQL5/Experts/MT5.mq5 deleted file mode 100644 index 1518a45..0000000 Binary files a/server/MQL5/Experts/MT5.mq5 and /dev/null differ diff --git a/server/MQL5/Experts/sym_port.txt b/server/MQL5/Experts/sym_port.txt deleted file mode 100644 index 789949f..0000000 --- a/server/MQL5/Experts/sym_port.txt +++ /dev/null @@ -1,61 +0,0 @@ -EURUSD=2000 -GBPUSD=2001 -USDCHF=2002 -USDJPY=2003 -USDCAD=2004 -AUDUSD=2005 -AUDNZD=2006 -AUDCAD=2007 -AUDCHF=2008 -AUDJPY=2009 -CHFJPY=2010 -EURGBP=2011 -EURAUD=2012 -EURCHF=2013 -EURJPY=2014 -EURNZD=2015 -EURCAD=2016 -GBPCHF=2017 -GBPJPY=2018 -CADCHF=2019 -CADJPY=2020 -GBPAUD=2021 -GBPCAD=2022 -GBPNZD=2023 -NZDCAD=2024 -NZDCHF=2025 -NZDJPY=2026 -NZDUSD=2027 -USDSGD=2028 -AUDSGD=2029 -CHFSGD=2030 -EURDKK=2031 -EURHKD=2032 -EURNOK=2033 -EURPLN=2034 -EURSEK=2035 -EURSGD=2036 -EURTRY=2037 -EURZAR=2038 -GBPDKK=2039 -GBPNOK=2040 -GBPSEK=2041 -GBPSGD=2042 -GBPTRY=2043 -NOKJPY=2044 -NOKSEK=2045 -SEKJPY=2046 -SGDJPY=2047 -USDCNH=2048 -USDCZK=2049 -USDDKK=2050 -USDHKD=2051 -USDHUF=2052 -USDMXN=2053 -USDNOK=2054 -USDPLN=2055 -USDRUB=2056 -USDSEK=2057 -USDTHB=2058 -USDTRY=2059 -USDZAR=2060 diff --git a/server/MQL5/Makefile b/server/MQL5/Makefile new file mode 100644 index 0000000..3060a96 --- /dev/null +++ b/server/MQL5/Makefile @@ -0,0 +1,11 @@ +build: + docker build -t MetaTrader5 -f ./Dockerfile.MetaTrader5 . + +run: build + docker run --rm -d -p 8080:8080 --name MetaTrader5 -v MetaTrader5:/data MetaTrader5 + +shell: + docker exec -it MetaTrader5 sh + +users: build + docker exec -it MetaTrader5 adduser novouser \ No newline at end of file diff --git a/server/MQL5/assets/Caddyfile b/server/MQL5/assets/Caddyfile new file mode 100644 index 0000000..2875924 --- /dev/null +++ b/server/MQL5/assets/Caddyfile @@ -0,0 +1,24 @@ +{ + order webdav last +} +:8080 { + log + root * /data + reverse_proxy mt5-app:8080 + + handle_path /files/* { + file_server browse + } + redir /files /files/ + + handle /webdav/* { + webdav { + prefix /webdav + } + } + redir /webdav /webdav/ + + basicauth /* { + {env.APP_USERNAME} {env.APP_PASSWORD_HASH} + } +} \ No newline at end of file diff --git a/server/MQL5/assets/Metatrader5/Bases/Custom/history/Step Index_MT4/2023.hcc b/server/MQL5/assets/Metatrader5/Bases/Custom/history/Step Index_MT4/2023.hcc new file mode 100644 index 0000000..cb6c31a Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/Custom/history/Step Index_MT4/2023.hcc differ diff --git a/server/MQL5/assets/Metatrader5/Bases/Custom/history/Step Index_MT5/2023.hcc b/server/MQL5/assets/Metatrader5/Bases/Custom/history/Step Index_MT5/2023.hcc new file mode 100644 index 0000000..effdfa3 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/Custom/history/Step Index_MT5/2023.hcc differ diff --git a/server/MQL5/assets/Metatrader5/Bases/Default/mail/mail-5006484391.dat b/server/MQL5/assets/Metatrader5/Bases/Default/mail/mail-5006484391.dat new file mode 100644 index 0000000..4b4414b Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/Default/mail/mail-5006484391.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/Default/mail/mail-5013086634.dat b/server/MQL5/assets/Metatrader5/Bases/Default/mail/mail-5013086634.dat new file mode 100644 index 0000000..2f53ed8 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/Default/mail/mail-5013086634.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/Default/mail/mail-5014655401.dat b/server/MQL5/assets/Metatrader5/Bases/Default/mail/mail-5014655401.dat new file mode 100644 index 0000000..463e8ce Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/Default/mail/mail-5014655401.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/Default/news/news.dat b/server/MQL5/assets/Metatrader5/Bases/Default/news/news.dat new file mode 100644 index 0000000..f2d1944 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/Default/news/news.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/Default/trades/5006484391/cache.dat b/server/MQL5/assets/Metatrader5/Bases/Default/trades/5006484391/cache.dat new file mode 100644 index 0000000..831ef85 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/Default/trades/5006484391/cache.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/Default/trades/5013086634/cache.dat b/server/MQL5/assets/Metatrader5/Bases/Default/trades/5013086634/cache.dat new file mode 100644 index 0000000..aba5af4 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/Default/trades/5013086634/cache.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/Default/trades/5014655401/cache.dat b/server/MQL5/assets/Metatrader5/Bases/Default/trades/5014655401/cache.dat new file mode 100644 index 0000000..e60046a Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/Default/trades/5014655401/cache.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/history/Boom 1000 Index/2023.hcc b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/history/Boom 1000 Index/2023.hcc new file mode 100644 index 0000000..273ea27 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/history/Boom 1000 Index/2023.hcc differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/history/EURUSD/2023.hcc b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/history/EURUSD/2023.hcc new file mode 100644 index 0000000..10b3ca2 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/history/EURUSD/2023.hcc differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/history/EURUSD/cache/H1.hc b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/history/EURUSD/cache/H1.hc new file mode 100644 index 0000000..e44bc41 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/history/EURUSD/cache/H1.hc differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/history/EURUSD/cache/M1.hc b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/history/EURUSD/cache/M1.hc new file mode 100644 index 0000000..9ac5968 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/history/EURUSD/cache/M1.hc differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/history/Step Index/2023.hcc b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/history/Step Index/2023.hcc new file mode 100644 index 0000000..1dd2c68 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/history/Step Index/2023.hcc differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/mail/mail-5013086634.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/mail/mail-5013086634.dat new file mode 100644 index 0000000..57d23d2 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/mail/mail-5013086634.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/mail/mail-5014655401.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/mail/mail-5014655401.dat new file mode 100644 index 0000000..85e30d5 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/mail/mail-5014655401.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/news/news.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/news/news.dat new file mode 100644 index 0000000..f2d1944 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/news/news.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/subscriptions/subscriptions-5013086634.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/subscriptions/subscriptions-5013086634.dat new file mode 100644 index 0000000..4da7081 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/subscriptions/subscriptions-5013086634.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/subscriptions/subscriptions-5014655401.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/subscriptions/subscriptions-5014655401.dat new file mode 100644 index 0000000..7e5ce08 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/subscriptions/subscriptions-5014655401.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/symbols/selected-5013086634.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/symbols/selected-5013086634.dat new file mode 100644 index 0000000..9b2a818 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/symbols/selected-5013086634.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/symbols/selected-5014655401.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/symbols/selected-5014655401.dat new file mode 100644 index 0000000..77229b4 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/symbols/selected-5014655401.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/symbols/symbols-5013086634.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/symbols/symbols-5013086634.dat new file mode 100644 index 0000000..ac073ae Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/symbols/symbols-5013086634.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/symbols/symbols-5014655401.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/symbols/symbols-5014655401.dat new file mode 100644 index 0000000..1e085da Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/symbols/symbols-5014655401.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/AUDUSD/ticks.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/AUDUSD/ticks.dat new file mode 100644 index 0000000..f3b61fc Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/AUDUSD/ticks.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/EURUSD/ticks.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/EURUSD/ticks.dat new file mode 100644 index 0000000..101fc0d Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/EURUSD/ticks.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/GBPUSD/ticks.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/GBPUSD/ticks.dat new file mode 100644 index 0000000..1f09173 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/GBPUSD/ticks.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/NZDUSD/ticks.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/NZDUSD/ticks.dat new file mode 100644 index 0000000..9f2950a Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/NZDUSD/ticks.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDCAD/ticks.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDCAD/ticks.dat new file mode 100644 index 0000000..e41cadd Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDCAD/ticks.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDCHF/ticks.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDCHF/ticks.dat new file mode 100644 index 0000000..702cdbc Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDCHF/ticks.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDCNH/ticks.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDCNH/ticks.dat new file mode 100644 index 0000000..f6677d3 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDCNH/ticks.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDJPY/ticks.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDJPY/ticks.dat new file mode 100644 index 0000000..9c13a39 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDJPY/ticks.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDRUB/ticks.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDRUB/ticks.dat new file mode 100644 index 0000000..04673de Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDRUB/ticks.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDSEK/ticks.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDSEK/ticks.dat new file mode 100644 index 0000000..4e202de Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/ticks/USDSEK/ticks.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/trades/5013086634/cache.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/trades/5013086634/cache.dat new file mode 100644 index 0000000..4e373d8 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/trades/5013086634/cache.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/trades/5013086634/deals_2023.05.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/trades/5013086634/deals_2023.05.dat new file mode 100644 index 0000000..f87131e Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/trades/5013086634/deals_2023.05.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/trades/5014655401/cache.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/trades/5014655401/cache.dat new file mode 100644 index 0000000..a6b9cd4 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/trades/5014655401/cache.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/trades/5014655401/deals_2023.06.dat b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/trades/5014655401/deals_2023.06.dat new file mode 100644 index 0000000..0019834 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/MetaQuotes-Demo/trades/5014655401/deals_2023.06.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/alerts.dat b/server/MQL5/assets/Metatrader5/Bases/alerts.dat new file mode 100644 index 0000000..637bae6 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/alerts.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/books.dat b/server/MQL5/assets/Metatrader5/Bases/books.dat new file mode 100644 index 0000000..d7ec3d6 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/books.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/dns.dat b/server/MQL5/assets/Metatrader5/Bases/dns.dat new file mode 100644 index 0000000..b951e74 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/dns.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/gvariables.dat b/server/MQL5/assets/Metatrader5/Bases/gvariables.dat new file mode 100644 index 0000000..b6afe1d Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/gvariables.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/indicators.dat b/server/MQL5/assets/Metatrader5/Bases/indicators.dat new file mode 100644 index 0000000..346ee81 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/indicators.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/objects.dat b/server/MQL5/assets/Metatrader5/Bases/objects.dat new file mode 100644 index 0000000..ac8d410 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/objects.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/options.dat b/server/MQL5/assets/Metatrader5/Bases/options.dat new file mode 100644 index 0000000..7d47b66 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/options.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/signals/signals.dat b/server/MQL5/assets/Metatrader5/Bases/signals/signals.dat new file mode 100644 index 0000000..24ec22e Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/signals/signals.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/strategy.dat b/server/MQL5/assets/Metatrader5/Bases/strategy.dat new file mode 100644 index 0000000..7ee4d9c Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/strategy.dat differ diff --git a/server/MQL5/assets/Metatrader5/Bases/symbols.custom.dat b/server/MQL5/assets/Metatrader5/Bases/symbols.custom.dat new file mode 100644 index 0000000..3701e02 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Bases/symbols.custom.dat differ diff --git a/server/MQL5/assets/Metatrader5/Config/accounts.dat b/server/MQL5/assets/Metatrader5/Config/accounts.dat new file mode 100644 index 0000000..a8deb2d Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Config/accounts.dat differ diff --git a/server/MQL5/assets/Metatrader5/Config/agents.dat b/server/MQL5/assets/Metatrader5/Config/agents.dat new file mode 100644 index 0000000..786744c Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Config/agents.dat differ diff --git a/server/MQL5/assets/Metatrader5/Config/common.ini b/server/MQL5/assets/Metatrader5/Config/common.ini new file mode 100644 index 0000000..9b20350 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Config/common.ini differ diff --git a/server/MQL5/assets/Metatrader5/Config/hotkeys.ini b/server/MQL5/assets/Metatrader5/Config/hotkeys.ini new file mode 100644 index 0000000..46b134b --- /dev/null +++ b/server/MQL5/assets/Metatrader5/Config/hotkeys.ini @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/server/MQL5/assets/Metatrader5/Config/jupyter.ini b/server/MQL5/assets/Metatrader5/Config/jupyter.ini new file mode 100644 index 0000000..4a15eb9 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Config/jupyter.ini differ diff --git a/server/MQL5/assets/Metatrader5/Config/metaeditor.ini b/server/MQL5/assets/Metatrader5/Config/metaeditor.ini new file mode 100644 index 0000000..7958f79 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Config/metaeditor.ini differ diff --git a/server/MQL5/assets/Metatrader5/Config/servers.dat b/server/MQL5/assets/Metatrader5/Config/servers.dat new file mode 100644 index 0000000..87427c7 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Config/servers.dat differ diff --git a/server/MQL5/assets/Metatrader5/Config/settings.ini b/server/MQL5/assets/Metatrader5/Config/settings.ini new file mode 100644 index 0000000..36594b2 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Config/settings.ini differ diff --git a/server/MQL5/assets/Metatrader5/Config/terminal.ini b/server/MQL5/assets/Metatrader5/Config/terminal.ini new file mode 100644 index 0000000..3c17e83 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Config/terminal.ini differ diff --git a/server/MQL5/assets/Metatrader5/Config/terminal.lic b/server/MQL5/assets/Metatrader5/Config/terminal.lic new file mode 100644 index 0000000..0c71d4e Binary files /dev/null and b/server/MQL5/assets/Metatrader5/Config/terminal.lic differ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Experts/wisefinance-socket-server.ex5 b/server/MQL5/assets/Metatrader5/MQL5/Experts/wisefinance-socket-server.ex5 new file mode 100644 index 0000000..cd9dff3 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/MQL5/Experts/wisefinance-socket-server.ex5 differ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Images/dollar.bmp b/server/MQL5/assets/Metatrader5/MQL5/Images/dollar.bmp new file mode 100644 index 0000000..69235ce Binary files /dev/null and b/server/MQL5/assets/Metatrader5/MQL5/Images/dollar.bmp differ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Images/euro.bmp b/server/MQL5/assets/Metatrader5/MQL5/Images/euro.bmp new file mode 100644 index 0000000..180ca4b Binary files /dev/null and b/server/MQL5/assets/Metatrader5/MQL5/Images/euro.bmp differ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Arrays/Array.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Arrays/Array.mqh new file mode 100644 index 0000000..60f08b5 --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/Arrays/Array.mqh @@ -0,0 +1,182 @@ +//+------------------------------------------------------------------+ +//| Array.mqh | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include +//+------------------------------------------------------------------+ +//| Class CArray | +//| Purpose: Base class of dynamic arrays. | +//| Derives from class CObject. | +//+------------------------------------------------------------------+ +class CArray : public CObject + { +protected: + int m_step_resize; // increment size of the array + int m_data_total; // number of elements + int m_data_max; // maximmum size of the array without memory reallocation + int m_sort_mode; // mode of array sorting + +public: + CArray(void); + ~CArray(void); + //--- methods of access to protected data + int Step(void) const { return(m_step_resize); } + bool Step(const int step); + int Total(void) const { return(m_data_total); } + int Available(void) const { return(m_data_max-m_data_total); } + int Max(void) const { return(m_data_max); } + bool IsSorted(const int mode=0) const { return(m_sort_mode==mode); } + int SortMode(void) const { return(m_sort_mode); } + //--- cleaning method + void Clear(void) { m_data_total=0; } + //--- methods for working with files + virtual bool Save(const int file_handle); + virtual bool Load(const int file_handle); + //--- sorting method + void Sort(const int mode=0); + +protected: + virtual void QuickSort(int beg,int end,const int mode=0) { m_sort_mode=-1; } + //--- templates for methods of searching for minimum and maximum + template + int Minimum(const T &data[],const int start,const int count) const; + template + int Maximum(const T &data[],const int start,const int count) const; + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CArray::CArray(void) : m_step_resize(16), + m_data_total(0), + m_data_max(0), + m_sort_mode(-1) + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CArray::~CArray(void) + { + } +//+------------------------------------------------------------------+ +//| Method Set for variable m_step_resize | +//+------------------------------------------------------------------+ +bool CArray::Step(const int step) + { +//--- check + if(step>0) + { + m_step_resize=step; + return(true); + } +//--- failure + return(false); + } +//+------------------------------------------------------------------+ +//| Sorting an array in ascending order | +//+------------------------------------------------------------------+ +void CArray::Sort(const int mode) + { +//--- check + if(IsSorted(mode)) + return; + m_sort_mode=mode; + if(m_data_total<=1) + return; +//--- sort + QuickSort(0,m_data_total-1,mode); + } +//+------------------------------------------------------------------+ +//| Writing header of array to file | +//+------------------------------------------------------------------+ +bool CArray::Save(const int file_handle) + { +//--- check handle + if(file_handle!=INVALID_HANDLE) + { + //--- write start marker - 0xFFFFFFFFFFFFFFFF + if(FileWriteLong(file_handle,-1)==sizeof(long)) + { + //--- write array type + if(FileWriteInteger(file_handle,Type(),INT_VALUE)==INT_VALUE) + return(true); + } + } +//--- failure + return(false); + } +//+------------------------------------------------------------------+ +//| Reading header of array from file | +//+------------------------------------------------------------------+ +bool CArray::Load(const int file_handle) + { +//--- check handle + if(file_handle!=INVALID_HANDLE) + { + //--- read and check start marker - 0xFFFFFFFFFFFFFFFF + if(FileReadLong(file_handle)==-1) + { + //--- read and check array type + if(FileReadInteger(file_handle,INT_VALUE)==Type()) + return(true); + } + } +//--- failure + return(false); + } +//+------------------------------------------------------------------+ +//| Find minimum of array | +//+------------------------------------------------------------------+ +template +int CArray::Minimum(const T &data[],const int start,const int count) const + { + int real_count; +//--- check for empty array + if(m_data_total<1) + { + SetUserError(ERR_USER_ARRAY_IS_EMPTY); + return(-1); + } + //--- check for start is out of range + if(start<0 || start>=m_data_total) + { + SetUserError(ERR_USER_ITEM_NOT_FOUND); + return(-1); + } +//--- compute count of elements + real_count=(count==WHOLE_ARRAY || start+count>m_data_total) ? m_data_total-start : count; +#ifdef __MQL5__ + return(ArrayMinimum(data,start,real_count)); +#else + return(ArrayMinimum(data,real_count,start)); +#endif + } +//+------------------------------------------------------------------+ +//| Find maximum of array | +//+------------------------------------------------------------------+ +template +int CArray::Maximum(const T &data[],const int start,const int count) const + { + int real_count; +//--- check for empty array + if(m_data_total<1) + { + SetUserError(ERR_USER_ARRAY_IS_EMPTY); + return(-1); + } + //--- check for start is out of range + if(start<0 || start>=m_data_total) + { + SetUserError(ERR_USER_ITEM_NOT_FOUND); + return(-1); + } +//--- compute count of elements + real_count=(count==WHOLE_ARRAY || start+count>m_data_total) ? m_data_total-start : count; +#ifdef __MQL5__ + return(ArrayMaximum(data,start,real_count)); +#else + return(ArrayMaximum(data,real_count,start)); +#endif + } +//+------------------------------------------------------------------+ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Arrays/ArrayChar.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Arrays/ArrayChar.mqh new file mode 100644 index 0000000..c98e5b5 --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/Arrays/ArrayChar.mqh @@ -0,0 +1,771 @@ +//+------------------------------------------------------------------+ +//| ArrayChar.mqh | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include "Array.mqh" +//+------------------------------------------------------------------+ +//| Class CArrayChar. | +//| Purpose: Class of dynamic array of variables | +//| of char or uchar type. | +//| Derives from class CArray. | +//+------------------------------------------------------------------+ +class CArrayChar : public CArray + { +protected: + char m_data[]; // data array + +public: + CArrayChar(void); + ~CArrayChar(void); + //--- method of identifying the object + virtual int Type(void) const { return(TYPE_CHAR); } + //--- methods for working with files + virtual bool Save(const int file_handle); + virtual bool Load(const int file_handle); + //--- methods of managing dynamic memory + bool Reserve(const int size); + bool Resize(const int size); + bool Shutdown(void); + //--- methods of filling the array + bool Add(const char element); + bool AddArray(const char &src[]); + bool AddArray(const CArrayChar *src); + bool Insert(const char element,const int pos); + bool InsertArray(const char &src[],const int pos); + bool InsertArray(const CArrayChar *src,const int pos); + bool AssignArray(const char &src[]); + bool AssignArray(const CArrayChar *src); + //--- method of access to the array + char At(const int index) const; + char operator[](const int index) const { return(At(index)); } + //--- methods of searching for minimum and maximum + int Minimum(const int start,const int count) const { return(CArray::Minimum(m_data,start,count)); } + int Maximum(const int start,const int count) const { return(CArray::Maximum(m_data,start,count)); } + //--- methods of changing + bool Update(const int index,const char element); + bool Shift(const int index,const int shift); + //--- methods of deleting + bool Delete(const int index); + bool DeleteRange(int from,int to); + //--- methods for comparing arrays + bool CompareArray(const char &array[]) const; + bool CompareArray(const CArrayChar *array) const; + //--- methods for working with the sorted array + bool InsertSort(const char element); + int Search(const char element) const; + int SearchGreat(const char element) const; + int SearchLess(const char element) const; + int SearchGreatOrEqual(const char element) const; + int SearchLessOrEqual(const char element) const; + int SearchFirst(const char element) const; + int SearchLast(const char element) const; + int SearchLinear(const char element) const; + +protected: + virtual void QuickSort(int beg,int end,const int mode=0); + int QuickSearch(const char element) const; + int MemMove(const int dest,const int src,int count); + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CArrayChar::CArrayChar(void) + { +//--- initialize protected data + m_data_max=ArraySize(m_data); + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CArrayChar::~CArrayChar(void) + { + if(m_data_max!=0) + Shutdown(); + } +//+------------------------------------------------------------------+ +//| Moving the memory within a single array | +//+------------------------------------------------------------------+ +int CArrayChar::MemMove(const int dest,const int src,int count) + { + int i; +//--- check parameters + if(dest<0 || src<0 || count<0) + return(-1); +//--- check count + if(src+count>m_data_total) + count=m_data_total-src; + if(count<0) + return(-1); +//--- no need to copy + if(dest==src || count==0) + return(dest); +//--- check data total + if(dest+count>m_data_total) + { + if(m_data_max=0;i--) + m_data[dest+i]=m_data[src+i]; + } +//--- successful + return(dest); + } +//+------------------------------------------------------------------+ +//| Request for more memory in an array. Checks if the requested | +//| number of free elements already exists; allocates additional | +//| memory with a given step | +//+------------------------------------------------------------------+ +bool CArrayChar::Reserve(const int size) + { + int new_size; +//--- check + if(size<=0) + return(false); +//--- resize array + if(Available()=size); + } +//+------------------------------------------------------------------+ +//| Resizing (with removal of elements on the right) | +//+------------------------------------------------------------------+ +bool CArrayChar::Resize(const int size) + { + int new_size; +//--- check + if(size<0) + return(false); +//--- resize array + new_size=m_step_resize*(1+size/m_step_resize); + if(m_data_max!=new_size) + { + if((m_data_max=ArrayResize(m_data,new_size))==-1) + { + m_data_max=ArraySize(m_data); + return(false); + } + } + if(m_data_total>size) + m_data_total=size; +//--- result + return(m_data_max==new_size); + } +//+------------------------------------------------------------------+ +//| Complete cleaning of the array with the release of memory | +//+------------------------------------------------------------------+ +bool CArrayChar::Shutdown(void) + { +//--- check + if(m_data_max==0) + return(true); +//--- clean + if(ArrayResize(m_data,0)==-1) + return(false); + m_data_total=0; + m_data_max=0; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Adding an element to the end of the array | +//+------------------------------------------------------------------+ +bool CArrayChar::Add(const char element) + { +//--- check/reserve elements of array + if(!Reserve(1)) + return(false); +//--- add + m_data[m_data_total++]=element; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Adding an element to the end of the array from another array | +//+------------------------------------------------------------------+ +bool CArrayChar::AddArray(const char &src[]) + { + int num=ArraySize(src); +//--- check/reserve elements of array + if(!Reserve(num)) + return(false); +//--- add + for(int i=0;i=m_data_total) + return(CHAR_MAX); +//--- result + return(m_data[index]); + } +//+------------------------------------------------------------------+ +//| Updating element in the specified position | +//+------------------------------------------------------------------+ +bool CArrayChar::Update(const int index,const char element) + { +//--- check + if(index<0 || index>=m_data_total) + return(false); +//--- update + m_data[index]=element; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Moving element from the specified position | +//| on the specified shift | +//+------------------------------------------------------------------+ +bool CArrayChar::Shift(const int index,const int shift) + { + char tmp_char; +//--- check + if(index<0 || index+shift<0 || index+shift>=m_data_total) + return(false); + if(shift==0) + return(true); +//--- move + tmp_char=m_data[index]; + if(shift>0) + { + if(MemMove(index,index+1,shift)<0) + return(false); + } + else + { + if(MemMove(index+shift+1,index+shift,-shift)<0) + return(false); + } + m_data[index+shift]=tmp_char; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Deleting element from the specified position | +//+------------------------------------------------------------------+ +bool CArrayChar::Delete(const int index) + { +//--- check + if(index<0 || index>=m_data_total) + return(false); +//--- delete + if(indexto || from>=m_data_total) + return(false); +//--- delete + if(to>=m_data_total-1) + to=m_data_total-1; + if(MemMove(from,to+1,m_data_total-to-1)<0) + return(false); + m_data_total-=to-from+1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Equality comparison of two arrays | +//+------------------------------------------------------------------+ +bool CArrayChar::CompareArray(const char &array[]) const + { +//--- compare + if(m_data_total!=ArraySize(array)) + return(false); + for(int i=0;i>1" is quick division by 2 + p_char=m_data[(beg+end)>>1]; + while(ip_char) + { + //--- control the output of the array bounds + if(j==0) + break; + j--; + } + if(i<=j) + { + t_char=m_data[i]; + m_data[i++]=m_data[j]; + m_data[j]=t_char; + //--- control the output of the array bounds + if(j==0) + break; + j--; + } + } + if(begelement) + Insert(element,pos); + else + Insert(element,pos+1); +//--- restore the sorting flag after Insert(...) + m_sort_mode=0; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Search of position of element in a array | +//+------------------------------------------------------------------+ +int CArrayChar::SearchLinear(const char element) const + { +//--- check + if(m_data_total==0) + return(-1); +//--- + for(int i=0;i=i) + { + //--- ">>1" is quick division by 2 + m=(j+i)>>1; + if(m<0 || m>=m_data_total) + break; + t_char=m_data[m]; + if(t_char==element) + break; + if(t_char>element) + j=m-1; + else + i=m+1; + } +//--- position + return(m); + } +//+------------------------------------------------------------------+ +//| Search of position of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayChar::Search(const char element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is greater than | +//| specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayChar::SearchGreat(const char element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + while(m_data[pos]<=element) + if(++pos==m_data_total) + return(-1); +//--- position + return(pos); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is less than | +//| specified in the sorted array | +//+------------------------------------------------------------------+ +int CArrayChar::SearchLess(const char element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + while(m_data[pos]>=element) + if(pos--==0) + return(-1); +//--- position + return(pos); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is greater than or | +//| equal to the specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayChar::SearchGreatOrEqual(const char element) const + { +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + for(int pos=QuickSearch(element);pos=element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is less than or equal | +//| to the specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayChar::SearchLessOrEqual(const char element) const + { +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + for(int pos=QuickSearch(element);pos>=0;pos--) + if(m_data[pos]<=element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Find position of first appearance of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayChar::SearchFirst(const char element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + { + while(m_data[pos]==element) + if(pos--==0) + break; + return(pos+1); + } +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Find position of last appearance of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayChar::SearchLast(const char element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + { + while(m_data[pos]==element) + if(++pos==m_data_total) + break; + return(pos-1); + } +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Writing array to file | +//+------------------------------------------------------------------+ +bool CArrayChar::Save(const int file_handle) + { + int i=0; +//--- check + if(!CArray::Save(file_handle)) + return(false); +//--- write array length + if(FileWriteInteger(file_handle,m_data_total,INT_VALUE)!=INT_VALUE) + return(false); +//--- write array + for(i=0;im_data_total) + count=m_data_total-src; + if(count<0) + return(-1); +//--- no need to copy + if(dest==src || count==0) + return(dest); +//--- check data total + if(dest+count>m_data_total) + { + if(m_data_max=0;i--) + m_data[dest+i]=m_data[src+i]; + } +//--- successful + return(dest); + } +//+------------------------------------------------------------------+ +//| Request for more memory in an array. Checks if the requested | +//| number of free elements already exists; allocates additional | +//| memory with a given step | +//+------------------------------------------------------------------+ +bool CArrayDouble::Reserve(const int size) + { + int new_size; +//--- check + if(size<=0) + return(false); +//--- resize array + if(Available()=size); + } +//+------------------------------------------------------------------+ +//| Resizing (with removal of elements on the right) | +//+------------------------------------------------------------------+ +bool CArrayDouble::Resize(const int size) + { + int new_size; +//--- check + if(size<0) + return(false); +//--- resize array + new_size=m_step_resize*(1+size/m_step_resize); + if(m_data_max!=new_size) + { + if((m_data_max=ArrayResize(m_data,new_size))==-1) + { + m_data_max=ArraySize(m_data); + return(false); + } + } + if(m_data_total>size) + m_data_total=size; +//--- result + return(m_data_max==new_size); + } +//+------------------------------------------------------------------+ +//| Complete cleaning of the array with the release of memory | +//+------------------------------------------------------------------+ +bool CArrayDouble::Shutdown(void) + { +//--- check + if(m_data_max==0) + return(true); +//--- clean + if(ArrayResize(m_data,0)==-1) + return(false); + m_data_total=0; + m_data_max=0; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Adding an element to the end of the array | +//+------------------------------------------------------------------+ +bool CArrayDouble::Add(const double element) + { +//--- check/reserve elements of array + if(!Reserve(1)) + return(false); +//--- add + m_data[m_data_total++]=element; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Adding an element to the end of the array from another array | +//+------------------------------------------------------------------+ +bool CArrayDouble::AddArray(const double &src[]) + { + int num=ArraySize(src); +//--- check/reserve elements of array + if(!Reserve(num)) + return(false); +//--- add + for(int i=0;i=m_data_total) + return(DBL_MAX); +//--- result + return(m_data[index]); + } +//+------------------------------------------------------------------+ +//| Updating element in the specified position | +//+------------------------------------------------------------------+ +bool CArrayDouble::Update(const int index,const double element) + { +//--- check + if(index<0 || index>=m_data_total) + return(false); +//--- update + m_data[index]=element; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Moving element from the specified position | +//| on the specified shift | +//+------------------------------------------------------------------+ +bool CArrayDouble::Shift(const int index,const int shift) + { + double tmp_double; +//--- check + if(index<0 || index+shift<0 || index+shift>=m_data_total) + return(false); + if(shift==0) + return(true); +//--- move + tmp_double=m_data[index]; + if(shift>0) + { + if(MemMove(index,index+1,shift)<0) + return(false); + } + else + { + if(MemMove(index+shift+1,index+shift,-shift)<0) + return(false); + } + m_data[index+shift]=tmp_double; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Deleting element from the specified position | +//+------------------------------------------------------------------+ +bool CArrayDouble::Delete(const int index) + { +//--- check + if(index<0 || index>=m_data_total) + return(false); +//--- delete + if(indexto || from>=m_data_total) + return(false); +//--- delete + if(to>=m_data_total-1) + to=m_data_total-1; + if(MemMove(from,to+1,m_data_total-to-1)<0) + return(false); + m_data_total-=to-from+1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Equality comparison of two arrays | +//+------------------------------------------------------------------+ +bool CArrayDouble::CompareArray(const double &array[]) const + { +//--- compare + if(m_data_total!=ArraySize(array)) + return(false); + for(int i=0;i>1" is quick division by 2 + p_double=m_data[(beg+end)>>1]; + while(ip_double) + { + //--- control the output of the array bounds + if(j==0) + break; + j--; + } + if(i<=j) + { + t_double=m_data[i]; + m_data[i++]=m_data[j]; + m_data[j]=t_double; + //--- control the output of the array bounds + if(j==0) + break; + j--; + } + } + if(begelement) + Insert(element,pos); + else + Insert(element,pos+1); +//--- restore the sorting flag after Insert(...) + m_sort_mode=0; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Search of position of element in a array | +//+------------------------------------------------------------------+ +int CArrayDouble::SearchLinear(const double element) const + { +//--- check + if(m_data_total==0) + return(-1); +//--- + for(int i=0;i=i) + { + //--- ">>1" is quick division by 2 + m=(j+i)>>1; + if(m<0 || m>=m_data_total) + break; + t_double=m_data[m]; + //--- compare with delta + if(MathAbs(t_double-element)<=m_delta) + break; + if(t_double>element) + j=m-1; + else + i=m+1; + } +//--- position + return(m); + } +//+------------------------------------------------------------------+ +//| Search of position of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayDouble::Search(const double element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); +//--- compare with delta + if(MathAbs(m_data[pos]-element)<=m_delta) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is greater than | +//| specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayDouble::SearchGreat(const double element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); +//--- compare with delta + while(m_data[pos]<=element+m_delta) + if(++pos==m_data_total) + return(-1); +//--- position + return(pos); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is less than | +//| specified in the sorted array | +//+------------------------------------------------------------------+ +int CArrayDouble::SearchLess(const double element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); +//--- compare with delta + while(m_data[pos]>=element-m_delta) + if(pos--==0) + return(-1); +//--- position + return(pos); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is greater than or | +//| equal to the specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayDouble::SearchGreatOrEqual(const double element) const + { +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + for(int pos=QuickSearch(element);pos=element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is less than or equal | +//| to the specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayDouble::SearchLessOrEqual(const double element) const + { +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + for(int pos=QuickSearch(element);pos>=0;pos--) + if(m_data[pos]<=element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Find position of first appearance of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayDouble::SearchFirst(const double element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + { + //--- compare with delta + while(MathAbs(m_data[pos]-element)<=m_delta) + if(pos--==0) + break; + return(pos+1); + } +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Find position of last appearance of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayDouble::SearchLast(const double element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + { + //--- compare with delta + while(MathAbs(m_data[pos]-element)<=m_delta) + if(++pos==m_data_total) + break; + return(pos-1); + } +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Writing array to file | +//+------------------------------------------------------------------+ +bool CArrayDouble::Save(const int file_handle) + { + int i=0; +//--- check + if(!CArray::Save(file_handle)) + return(false); +//--- write array length + if(FileWriteInteger(file_handle,m_data_total,INT_VALUE)!=INT_VALUE) + return(false); +//--- write array + for(i=0;im_data_total) + count=m_data_total-src; + if(count<0) + return(-1); +//--- no need to copy + if(dest==src || count==0) + return(dest); +//--- check data total + if(dest+count>m_data_total) + { + if(m_data_max=0;i--) + m_data[dest+i]=m_data[src+i]; + } +//--- successful + return(dest); + } +//+------------------------------------------------------------------+ +//| Request for more memory in an array. Checks if the requested | +//| number of free elements already exists; allocates additional | +//| memory with a given step | +//+------------------------------------------------------------------+ +bool CArrayFloat::Reserve(const int size) + { + int new_size; +//--- check + if(size<=0) + return(false); +//--- resize array + if(Available()=size); + } +//+------------------------------------------------------------------+ +//| Resizing (with removal of elements on the right) | +//+------------------------------------------------------------------+ +bool CArrayFloat::Resize(const int size) + { + int new_size; +//--- check + if(size<0) + return(false); +//--- resize array + new_size=m_step_resize*(1+size/m_step_resize); + if(m_data_max!=new_size) + { + if((m_data_max=ArrayResize(m_data,new_size))==-1) + { + m_data_max=ArraySize(m_data); + return(false); + } + } + if(m_data_total>size) + m_data_total=size; +//--- result + return(m_data_max==new_size); + } +//+------------------------------------------------------------------+ +//| Complete cleaning of the array with the release of memory | +//+------------------------------------------------------------------+ +bool CArrayFloat::Shutdown(void) + { +//--- check + if(m_data_max==0) + return(true); +//--- clean + if(ArrayResize(m_data,0)==-1) + return(false); + m_data_total=0; + m_data_max=0; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Adding an element to the end of the array | +//+------------------------------------------------------------------+ +bool CArrayFloat::Add(const float element) + { +//--- check/reserve elements of array + if(!Reserve(1)) + return(false); +//--- add + m_data[m_data_total++]=element; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Adding an element to the end of the array from another array | +//+------------------------------------------------------------------+ +bool CArrayFloat::AddArray(const float &src[]) + { + int num=ArraySize(src); +//--- check/reserve elements of array + if(!Reserve(num)) + return(false); +//--- add + for(int i=0;i=m_data_total) + return(FLT_MAX); +//--- result + return(m_data[index]); + } +//+------------------------------------------------------------------+ +//| Updating element in the specified position | +//+------------------------------------------------------------------+ +bool CArrayFloat::Update(const int index,const float element) + { +//--- check + if(index<0 || index>=m_data_total) + return(false); +//--- update + m_data[index]=element; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Moving element from the specified position | +//| on the specified shift | +//+------------------------------------------------------------------+ +bool CArrayFloat::Shift(const int index,const int shift) + { + float tmp_float; +//--- check + if(index<0 || index+shift<0 || index+shift>=m_data_total) + return(false); + if(shift==0) + return(true); +//--- move + tmp_float=m_data[index]; + if(shift>0) + { + if(MemMove(index,index+1,shift)<0) + return(false); + } + else + { + if(MemMove(index+shift+1,index+shift,-shift)<0) + return(false); + } + m_data[index+shift]=tmp_float; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Deleting element from the specified position | +//+------------------------------------------------------------------+ +bool CArrayFloat::Delete(const int index) + { +//--- check + if(index<0 || index>=m_data_total) + return(false); +//--- delete + if(indexto || from>=m_data_total) + return(false); +//--- delete + if(to>=m_data_total-1) + to=m_data_total-1; + if(MemMove(from,to+1,m_data_total-to-1)<0) + return(false); + m_data_total-=to-from+1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Equality comparison of two arrays | +//+------------------------------------------------------------------+ +bool CArrayFloat::CompareArray(const float &array[]) const + { +//--- compare + if(m_data_total!=ArraySize(array)) + return(false); + for(int i=0;i>1" is quick division by 2 + p_float=m_data[(beg+end)>>1]; + while(ip_float) + { + //--- control the output of the array bounds + if(j==0) + break; + j--; + } + if(i<=j) + { + t_float=m_data[i]; + m_data[i++]=m_data[j]; + m_data[j]=t_float; + //--- control the output of the array bounds + if(j==0) + break; + j--; + } + } + if(begelement) + Insert(element,pos); + else + Insert(element,pos+1); +//--- restore the sorting flag after Insert(...) + m_sort_mode=0; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Search of position of element in a array | +//+------------------------------------------------------------------+ +int CArrayFloat::SearchLinear(const float element) const + { +//--- check + if(m_data_total==0) + return(-1); +//--- + for(int i=0;i=i) + { + //--- ">>1" is quick division by 2 + m=(j+i)>>1; + if(m<0 || m>=m_data_total) + break; + t_float=m_data[m]; + //--- compare with delta + if(MathAbs(t_float-element)<=m_delta) + break; + if(t_float>element) + j=m-1; + else + i=m+1; + } +//--- position + return(m); + } +//+------------------------------------------------------------------+ +//| Search of position of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayFloat::Search(const float element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); +//--- compare with delta + if(MathAbs(m_data[pos]-element)<=m_delta) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is greater than | +//| specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayFloat::SearchGreat(const float element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); +//--- compare with delta + while(m_data[pos]<=element+m_delta) + if(++pos==m_data_total) + return(-1); +//--- position + return(pos); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is less than | +//| specified in the sorted array | +//+------------------------------------------------------------------+ +int CArrayFloat::SearchLess(const float element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); +//--- compare with delta + while(m_data[pos]>=element-m_delta) + if(pos--==0) + return(-1); +//--- position + return(pos); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is greater than or | +//| equal to the specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayFloat::SearchGreatOrEqual(const float element) const + { +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + for(int pos=QuickSearch(element);pos=element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is less than or equal | +//| to the specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayFloat::SearchLessOrEqual(const float element) const + { +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + for(int pos=QuickSearch(element);pos>=0;pos--) + if(m_data[pos]<=element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Find position of first appearance of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayFloat::SearchFirst(const float element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + { + //--- compare with delta + while(MathAbs(m_data[pos]-element)<=m_delta) + if(pos--==0) + break; + return(pos+1); + } +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Find position of last appearance of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayFloat::SearchLast(const float element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + { + //--- compare with delta + while(MathAbs(m_data[pos]-element)<=m_delta) + if(++pos==m_data_total) + break; + return(pos-1); + } +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Writing array to file | +//+------------------------------------------------------------------+ +bool CArrayFloat::Save(const int file_handle) + { + int i=0; +//--- check + if(!CArray::Save(file_handle)) + return(false); +//--- write array length + if(FileWriteInteger(file_handle,m_data_total,INT_VALUE)!=INT_VALUE) + return(false); +//--- write array + for(i=0;im_data_total) + count=m_data_total-src; + if(count<0) + return(-1); +//--- no need to copy + if(dest==src || count==0) + return(dest); +//--- check data total + if(dest+count>m_data_total) + { + if(m_data_max=0;i--) + m_data[dest+i]=m_data[src+i]; + } +//--- successful + return(dest); + } +//+------------------------------------------------------------------+ +//| Request for more memory in an array. Checks if the requested | +//| number of free elements already exists; allocates additional | +//| memory with a given step | +//+------------------------------------------------------------------+ +bool CArrayInt::Reserve(const int size) + { + int new_size; +//--- check + if(size<=0) + return(false); +//--- resize array + if(Available()=size); + } +//+------------------------------------------------------------------+ +//| Resizing (with removal of elements on the right) | +//+------------------------------------------------------------------+ +bool CArrayInt::Resize(const int size) + { + int new_size; +//--- check + if(size<0) + return(false); +//--- resize array + new_size=m_step_resize*(1+size/m_step_resize); + if(m_data_max!=new_size) + { + if((m_data_max=ArrayResize(m_data,new_size))==-1) + { + m_data_max=ArraySize(m_data); + return(false); + } + } + if(m_data_total>size) + m_data_total=size; +//--- result + return(m_data_max==new_size); + } +//+------------------------------------------------------------------+ +//| Complete cleaning of the array with the release of memory | +//+------------------------------------------------------------------+ +bool CArrayInt::Shutdown(void) + { +//--- check + if(m_data_max==0) + return(true); +//--- clean + if(ArrayResize(m_data,0)==-1) + return(false); + m_data_total=0; + m_data_max=0; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Adding an element to the end of the array | +//+------------------------------------------------------------------+ +bool CArrayInt::Add(const int element) + { +//--- check/reserve elements of array + if(!Reserve(1)) + return(false); +//--- add + m_data[m_data_total++]=element; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Adding an element to the end of the array from another array | +//+------------------------------------------------------------------+ +bool CArrayInt::AddArray(const int &src[]) + { + int num=ArraySize(src); +//--- check/reserve elements of array + if(!Reserve(num)) + return(false); +//--- add + for(int i=0;i=m_data_total) + return(INT_MAX); +//--- result + return(m_data[index]); + } +//+------------------------------------------------------------------+ +//| Updating element in the specified position | +//+------------------------------------------------------------------+ +bool CArrayInt::Update(const int index,const int element) + { +//--- check + if(index<0 || index>=m_data_total) + return(false); +//--- update + m_data[index]=element; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Moving element from the specified position | +//| on the specified shift | +//+------------------------------------------------------------------+ +bool CArrayInt::Shift(const int index,const int shift) + { + int tmp_int; +//--- check + if(index<0 || index+shift<0 || index+shift>=m_data_total) + return(false); + if(shift==0) + return(true); +//--- move + tmp_int=m_data[index]; + if(shift>0) + { + if(MemMove(index,index+1,shift)<0) + return(false); + } + else + { + if(MemMove(index+shift+1,index+shift,-shift)<0) + return(false); + } + m_data[index+shift]=tmp_int; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Deleting element from the specified position | +//+------------------------------------------------------------------+ +bool CArrayInt::Delete(const int index) + { +//--- check + if(index<0 || index>=m_data_total) + return(false); +//--- delete + if(indexto || from>=m_data_total) + return(false); +//--- delete + if(to>=m_data_total-1) + to=m_data_total-1; + if(MemMove(from,to+1,m_data_total-to-1)<0) + return(false); + m_data_total-=to-from+1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Equality comparison of two arrays | +//+------------------------------------------------------------------+ +bool CArrayInt::CompareArray(const int &array[]) const + { +//--- compare + if(m_data_total!=ArraySize(array)) + return(false); + for(int i=0;i>1" is quick division by 2 + p_int=m_data[(beg+end)>>1]; + while(ip_int) + { + //--- control the output of the array bounds + if(j==0) + break; + j--; + } + if(i<=j) + { + t_int=m_data[i]; + m_data[i++]=m_data[j]; + m_data[j]=t_int; + //--- control the output of the array bounds + if(j==0) + break; + j--; + } + } + if(begelement) + Insert(element,pos); + else + Insert(element,pos+1); +//--- restore the sorting flag after Insert(...) + m_sort_mode=0; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Search of position of element in a array | +//+------------------------------------------------------------------+ +int CArrayInt::SearchLinear(const int element) const + { +//--- check + if(m_data_total==0) + return(-1); +//--- + for(int i=0;i=i) + { + //--- ">>1" is quick division by 2 + m=(j+i)>>1; + if(m<0 || m>=m_data_total) + break; + t_int=m_data[m]; + if(t_int==element) + break; + if(t_int>element) + j=m-1; + else + i=m+1; + } +//--- position + return(m); + } +//+------------------------------------------------------------------+ +//| Search of position of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayInt::Search(const int element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is greater than | +//| specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayInt::SearchGreat(const int element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + while(m_data[pos]<=element) + if(++pos==m_data_total) + return(-1); +//--- position + return(pos); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is less than | +//| specified in the sorted array | +//+------------------------------------------------------------------+ +int CArrayInt::SearchLess(const int element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + while(m_data[pos]>=element) + if(pos--==0) + return(-1); +//--- position + return(pos); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is greater than or | +//| equal to the specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayInt::SearchGreatOrEqual(const int element) const + { +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + for(int pos=QuickSearch(element);pos=element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is less than or equal | +//| to the specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayInt::SearchLessOrEqual(const int element) const + { +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + for(int pos=QuickSearch(element);pos>=0;pos--) + if(m_data[pos]<=element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Find position of first appearance of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayInt::SearchFirst(const int element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + { + while(m_data[pos]==element) + if(pos--==0) + break; + return(pos+1); + } +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Find position of last appearance of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayInt::SearchLast(const int element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + { + while(m_data[pos]==element) + if(++pos==m_data_total) + break; + return(pos-1); + } +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Writing array to file | +//+------------------------------------------------------------------+ +bool CArrayInt::Save(const int file_handle) + { + int i=0; +//--- check + if(!CArray::Save(file_handle)) + return(false); +//--- write array length + if(FileWriteInteger(file_handle,m_data_total,INT_VALUE)!=INT_VALUE) + return(false); +//--- write array + for(i=0;im_data_total) + count=m_data_total-src; + if(count<0) + return(-1); +//--- no need to copy + if(dest==src || count==0) + return(dest); +//--- check data total + if(dest+count>m_data_total) + { + if(m_data_max=0;i--) + m_data[dest+i]=m_data[src+i]; + } +//--- successful + return(dest); + } +//+------------------------------------------------------------------+ +//| Request for more memory in an array. Checks if the requested | +//| number of free elements already exists; allocates additional | +//| memory with a given step | +//+------------------------------------------------------------------+ +bool CArrayLong::Reserve(const int size) + { + int new_size; +//--- check + if(size<=0) + return(false); +//--- resize array + if(Available()=size); + } +//+------------------------------------------------------------------+ +//| Resizing (with removal of elements on the right) | +//+------------------------------------------------------------------+ +bool CArrayLong::Resize(const int size) + { + int new_size; +//--- check + if(size<0) + return(false); +//--- resize array + new_size=m_step_resize*(1+size/m_step_resize); + if(m_data_max!=new_size) + { + if((m_data_max=ArrayResize(m_data,new_size))==-1) + { + m_data_max=ArraySize(m_data); + return(false); + } + } + if(m_data_total>size) + m_data_total=size; +//--- result + return(m_data_max==new_size); + } +//+------------------------------------------------------------------+ +//| Complete cleaning of the array with the release of memory | +//+------------------------------------------------------------------+ +bool CArrayLong::Shutdown(void) + { +//--- check + if(m_data_max==0) + return(true); +//--- clean + if(ArrayResize(m_data,0)==-1) + return(false); + m_data_total=0; + m_data_max=0; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Adding an element to the end of the array | +//+------------------------------------------------------------------+ +bool CArrayLong::Add(const long element) + { +//--- check/reserve elements of array + if(!Reserve(1)) + return(false); +//--- add + m_data[m_data_total++]=element; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Adding an element to the end of the array from another array | +//+------------------------------------------------------------------+ +bool CArrayLong::AddArray(const long &src[]) + { + int num=ArraySize(src); +//--- check/reserve elements of array + if(!Reserve(num)) + return(false); +//--- add + for(int i=0;i=m_data_total) + return(LONG_MAX); +//--- result + return(m_data[index]); + } +//+------------------------------------------------------------------+ +//| Updating element in the specified position | +//+------------------------------------------------------------------+ +bool CArrayLong::Update(const int index,const long element) + { +//--- check + if(index<0 || index>=m_data_total) + return(false); +//--- update + m_data[index]=element; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Moving element from the specified position | +//| on the specified shift | +//+------------------------------------------------------------------+ +bool CArrayLong::Shift(const int index,const int shift) + { + long tmp_long; +//--- check + if(index<0 || index+shift<0 || index+shift>=m_data_total) + return(false); + if(shift==0) + return(true); +//--- move + tmp_long=m_data[index]; + if(shift>0) + { + if(MemMove(index,index+1,shift)<0) + return(false); + } + else + { + if(MemMove(index+shift+1,index+shift,-shift)<0) + return(false); + } + m_data[index+shift]=tmp_long; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Deleting element from the specified position | +//+------------------------------------------------------------------+ +bool CArrayLong::Delete(const int index) + { +//--- check + if(index<0 || index>=m_data_total) + return(false); +//--- delete + if(indexto || from>=m_data_total) + return(false); +//--- delete + if(to>=m_data_total-1) + to=m_data_total-1; + if(MemMove(from,to+1,m_data_total-to-1)<0) + return(false); + m_data_total-=to-from+1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Equality comparison of two arrays | +//+------------------------------------------------------------------+ +bool CArrayLong::CompareArray(const long &array[]) const + { +//--- compare + if(m_data_total!=ArraySize(array)) + return(false); + for(int i=0;i>1" is quick division by 2 + p_long=m_data[(beg+end)>>1]; + while(ip_long) + { + //--- control the output of the array bounds + if(j==0) + break; + j--; + } + if(i<=j) + { + t_long=m_data[i]; + m_data[i++]=m_data[j]; + m_data[j]=t_long; + //--- control the output of the array bounds + if(j==0) + break; + j--; + } + } + if(begelement) + Insert(element,pos); + else + Insert(element,pos+1); +//--- restore the sorting flag after Insert(...) + m_sort_mode=0; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Search of position of element in a array | +//+------------------------------------------------------------------+ +int CArrayLong::SearchLinear(const long element) const + { +//--- check + if(m_data_total==0) + return(-1); +//--- + for(int i=0;i=i) + { + //--- ">>1" is quick division by 2 + m=(j+i)>>1; + if(m<0 || m>=m_data_total) + break; + t_long=m_data[m]; + if(t_long==element) + break; + if(t_long>element) + j=m-1; + else + i=m+1; + } +//--- position + return(m); + } +//+------------------------------------------------------------------+ +//| Search of position of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayLong::Search(const long element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is greater than | +//| specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayLong::SearchGreat(const long element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + while(m_data[pos]<=element) + if(++pos==m_data_total) + return(-1); +//--- position + return(pos); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is less than | +//| specified in the sorted array | +//+------------------------------------------------------------------+ +int CArrayLong::SearchLess(const long element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + while(m_data[pos]>=element) + if(pos--==0) + return(-1); +//--- position + return(pos); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is greater than or | +//| equal to the specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayLong::SearchGreatOrEqual(const long element) const + { +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + for(int pos=QuickSearch(element);pos=element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is less than or equal | +//| to the specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayLong::SearchLessOrEqual(const long element) const + { +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + for(int pos=QuickSearch(element);pos>=0;pos--) + if(m_data[pos]<=element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Find position of first appearance of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayLong::SearchFirst(const long element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + { + while(m_data[pos]==element) + if(pos--==0) + break; + return(pos+1); + } +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Find position of last appearance of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayLong::SearchLast(const long element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + { + while(m_data[pos]==element) + if(++pos==m_data_total) + break; + return(pos-1); + } +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Writing array to file | +//+------------------------------------------------------------------+ +bool CArrayLong::Save(const int file_handle) + { + int i=0; +//--- check + if(!CArray::Save(file_handle)) + return(false); +//--- write array length + if(FileWriteInteger(file_handle,m_data_total,INT_VALUE)!=INT_VALUE) + return(false); +//--- write array + for(i=0;im_data_total) + count=m_data_total-src; + if(count<0) + return(-1); +//--- no need to copy + if(dest==src || count==0) + return(dest); +//--- check data total + if(dest+count>m_data_total) + { + if(m_data_max=0;i--) + { + //--- "physical" removal of the object (if necessary and possible) + if(m_free_mode && CheckPointer(m_data[dest+i])==POINTER_DYNAMIC) + delete m_data[dest+i]; + //--- + m_data[dest+i]=m_data[src+i]; + m_data[src+i]=NULL; + } + } +//--- successful + return(dest); + } +//+------------------------------------------------------------------+ +//| Request for more memory in an array. Checks if the requested | +//| number of free elements already exists; allocates additional | +//| memory with a given step | +//+------------------------------------------------------------------+ +bool CArrayObj::Reserve(const int size) + { + int new_size; +//--- check + if(size<=0) + return(false); +//--- resize array + if(Available()=size); + } +//+------------------------------------------------------------------+ +//| Resizing (with removal of elements on the right) | +//+------------------------------------------------------------------+ +bool CArrayObj::Resize(const int size) + { + int new_size; +//--- check + if(size<0) + return(false); +//--- resize array + new_size=m_step_resize*(1+size/m_step_resize); + if(m_data_total>size) + { + //--- "physical" removal of the object (if necessary and possible) + if(m_free_mode) + for(int i=size;i=m_data_total) + return(NULL); +//--- result + return(m_data[index]); + } +//+------------------------------------------------------------------+ +//| Updating element in the specified position | +//+------------------------------------------------------------------+ +bool CArrayObj::Update(const int index,CObject *element) + { +//--- check + if(index<0 || !CheckPointer(element) || index>=m_data_total) + return(false); +//--- "physical" removal of the object (if necessary and possible) + if(m_free_mode && CheckPointer(m_data[index])==POINTER_DYNAMIC) + delete m_data[index]; +//--- update + m_data[index]=element; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Moving element from the specified position | +//| on the specified shift | +//+------------------------------------------------------------------+ +bool CArrayObj::Shift(const int index,const int shift) + { + CObject *tmp_node; +//--- check + if(index<0 || index+shift<0 || index+shift>=m_data_total) + return(false); + if(shift==0) + return(true); +//--- move + tmp_node=m_data[index]; + m_data[index]=NULL; + if(shift>0) + { + if(MemMove(index,index+1,shift)<0) + return(false); + } + else + { + if(MemMove(index+shift+1,index+shift,-shift)<0) + return(false); + } + m_data[index+shift]=tmp_node; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Deleting element from the specified position | +//+------------------------------------------------------------------+ +bool CArrayObj::Delete(const int index) + { +//--- check + if(index>=m_data_total) + return(false); +//--- delete + if(index=0 && MemMove(index,index+1,m_data_total-index-1)<0) + return(false); + } + else + if(m_free_mode && CheckPointer(m_data[index])==POINTER_DYNAMIC) + delete m_data[index]; + m_data_total--; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Detach element from the specified position | +//+------------------------------------------------------------------+ +CObject *CArrayObj::Detach(const int index) + { + CObject *result; +//--- check + if(index>=m_data_total) + return(NULL); +//--- detach + result=m_data[index]; +//--- reset the array element, so as not remove the method MemMove + m_data[index]=NULL; + if(indexto || from>=m_data_total) + return(false); +//--- delete + if(to>=m_data_total-1) + to=m_data_total-1; + if(MemMove(from,to+1,m_data_total-to-1)<0) + return(false); + for(int i=to-from+1;i>0;i--,m_data_total--) + if(m_free_mode && CheckPointer(m_data[m_data_total-1])==POINTER_DYNAMIC) + delete m_data[m_data_total-1]; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Clearing of array without the release of memory | +//+------------------------------------------------------------------+ +void CArrayObj::Clear(void) + { +//--- "physical" removal of the object (if necessary and possible) + if(m_free_mode) + { + for(int i=0;i>1" is quick division by 2 + p_node=m_data[(beg+end)>>1]; + while(i0) + { + //--- control the output of the array bounds + if(j==0) + break; + j--; + } + if(i<=j) + { + t_node=m_data[i]; + m_data[i++]=m_data[j]; + m_data[j]=t_node; + //--- control the output of the array bounds + if(j==0) + break; + j--; + } + } + if(beg0) + Insert(element,pos); + else + Insert(element,pos+1); +//--- restore the sorting flag after Insert(...) + m_sort_mode=mode; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Quick search of position of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayObj::QuickSearch(const CObject *element) const + { + int i,j,m=-1; + CObject *t_node; +//--- search + i=0; + j=m_data_total-1; + while(j>=i) + { + //--- ">>1" is quick division by 2 + m=(j+i)>>1; + if(m<0 || m==m_data_total-1) + break; + t_node=m_data[m]; + if(t_node.Compare(element,m_sort_mode)==0) + break; + if(t_node.Compare(element,m_sort_mode)>0) + j=m-1; + else + i=m+1; + } +//--- position + return(m); + } +//+------------------------------------------------------------------+ +//| Search of position of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayObj::Search(const CObject *element) const + { + int pos; +//--- check + if(m_data_total==0 || !CheckPointer(element) || m_sort_mode==-1) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos].Compare(element,m_sort_mode)==0) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is greater than | +//| specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayObj::SearchGreat(const CObject *element) const + { + int pos; +//--- check + if(m_data_total==0 || !CheckPointer(element) || m_sort_mode==-1) + return(-1); +//--- search + pos=QuickSearch(element); + while(m_data[pos].Compare(element,m_sort_mode)<=0) + if(++pos==m_data_total) + return(-1); +//--- position + return(pos); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is less than | +//| specified in the sorted array | +//+------------------------------------------------------------------+ +int CArrayObj::SearchLess(const CObject *element) const + { + int pos; +//--- check + if(m_data_total==0 || !CheckPointer(element) || m_sort_mode==-1) + return(-1); +//--- search + pos=QuickSearch(element); + while(m_data[pos].Compare(element,m_sort_mode)>=0) + if(pos--==0) + return(-1); +//--- position + return(pos); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is greater than or | +//| equal to the specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayObj::SearchGreatOrEqual(const CObject *element) const + { +//--- check + if(m_data_total==0 || !CheckPointer(element) || m_sort_mode==-1) + return(-1); +//--- search + for(int pos=QuickSearch(element);pos=0) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is less than or equal | +//| to the specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayObj::SearchLessOrEqual(const CObject *element) const + { +//--- check + if(m_data_total==0 || !CheckPointer(element) || m_sort_mode==-1) + return(-1); +//--- search + for(int pos=QuickSearch(element);pos>=0;pos--) + if(m_data[pos].Compare(element,m_sort_mode)<=0) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Find position of first appearance of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayObj::SearchFirst(const CObject *element) const + { + int pos; +//--- check + if(m_data_total==0 || !CheckPointer(element) || m_sort_mode==-1) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos].Compare(element,m_sort_mode)==0) + { + while(m_data[pos].Compare(element,m_sort_mode)==0) + if(pos--==0) + break; + return(pos+1); + } +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Find position of last appearance of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayObj::SearchLast(const CObject *element) const + { + int pos; +//--- check + if(m_data_total==0 || !CheckPointer(element) || m_sort_mode==-1) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos].Compare(element,m_sort_mode)==0) + { + while(m_data[pos].Compare(element,m_sort_mode)==0) + if(++pos==m_data_total) + break; + return(pos-1); + } +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Writing array to file | +//+------------------------------------------------------------------+ +bool CArrayObj::Save(const int file_handle) + { + int i=0; +//--- check + if(!CArray::Save(file_handle)) + return(false); +//--- write array length + if(FileWriteInteger(file_handle,m_data_total,INT_VALUE)!=INT_VALUE) + return(false); +//--- write array + for(i=0;im_data_total) + count=m_data_total-src; + if(count<0) + return(-1); +//--- no need to copy + if(dest==src || count==0) + return(dest); +//--- check data total + if(dest+count>m_data_total) + { + if(m_data_max=0;i--) + m_data[dest+i]=m_data[src+i]; + } +//--- successful + return(dest); + } +//+------------------------------------------------------------------+ +//| Request for more memory in an array. Checks if the requested | +//| number of free elements already exists; allocates additional | +//| memory with a given step | +//+------------------------------------------------------------------+ +bool CArrayShort::Reserve(const int size) + { + int new_size; +//--- check + if(size<=0) + return(false); +//--- resize array + if(Available()=size); + } +//+------------------------------------------------------------------+ +//| Resizing (with removal of elements on the right) | +//+------------------------------------------------------------------+ +bool CArrayShort::Resize(const int size) + { + int new_size; +//--- check + if(size<0) + return(false); +//--- resize array + new_size=m_step_resize*(1+size/m_step_resize); + if(m_data_max!=new_size) + { + if((m_data_max=ArrayResize(m_data,new_size))==-1) + { + m_data_max=ArraySize(m_data); + return(false); + } + } + if(m_data_total>size) + m_data_total=size; +//--- result + return(m_data_max==new_size); + } +//+------------------------------------------------------------------+ +//| Complete cleaning of the array with the release of memory | +//+------------------------------------------------------------------+ +bool CArrayShort::Shutdown(void) + { +//--- check + if(m_data_max==0) + return(true); +//--- clean + if(ArrayResize(m_data,0)==-1) + return(false); + m_data_total=0; + m_data_max=0; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Adding an element to the end of the array | +//+------------------------------------------------------------------+ +bool CArrayShort::Add(const short element) + { +//--- check/reserve elements of array + if(!Reserve(1)) + return(false); +//--- add + m_data[m_data_total++]=element; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Adding an element to the end of the array from another array | +//+------------------------------------------------------------------+ +bool CArrayShort::AddArray(const short &src[]) + { + int num=ArraySize(src); +//--- check/reserve elements of array + if(!Reserve(num)) + return(false); +//--- add + for(int i=0;i=m_data_total) + return(SHORT_MAX); +//--- result + return(m_data[index]); + } +//+------------------------------------------------------------------+ +//| Updating element in the specified position | +//+------------------------------------------------------------------+ +bool CArrayShort::Update(const int index,const short element) + { +//--- check + if(index<0 || index>=m_data_total) + return(false); +//--- update + m_data[index]=element; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Moving element from the specified position | +//| on the specified shift | +//+------------------------------------------------------------------+ +bool CArrayShort::Shift(const int index,const int shift) + { + short tmp_short; +//--- check + if(index<0 || index+shift<0 || index+shift>=m_data_total) + return(false); + if(shift==0) + return(true); +//--- move + tmp_short=m_data[index]; + if(shift>0) + { + if(MemMove(index,index+1,shift)<0) + return(false); + } + else + { + if(MemMove(index+shift+1,index+shift,-shift)<0) + return(false); + } + m_data[index+shift]=tmp_short; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Deleting element from the specified position | +//+------------------------------------------------------------------+ +bool CArrayShort::Delete(const int index) + { +//--- check + if(index<0 || index>=m_data_total) + return(false); +//--- delete + if(indexto || from>=m_data_total) + return(false); +//--- delete + if(to>=m_data_total-1) + to=m_data_total-1; + if(MemMove(from,to+1,m_data_total-to-1)<0) + return(false); + m_data_total-=to-from+1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Equality comparison of two arrays | +//+------------------------------------------------------------------+ +bool CArrayShort::CompareArray(const short &array[]) const + { +//--- compare + if(m_data_total!=ArraySize(array)) + return(false); + for(int i=0;i>1" is quick division by 2 + p_short=m_data[(beg+end)>>1]; + while(ip_short) + { + //--- control the output of the array bounds + if(j==0) + break; + j--; + } + if(i<=j) + { + t_short=m_data[i]; + m_data[i++]=m_data[j]; + m_data[j]=t_short; + //--- control the output of the array bounds + if(j==0) + break; + j--; + } + } + if(begelement) + Insert(element,pos); + else + Insert(element,pos+1); +//--- restore the sorting flag after Insert(...) + m_sort_mode=0; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Search of position of element in a array | +//+------------------------------------------------------------------+ +int CArrayShort::SearchLinear(const short element) const + { +//--- check + if(m_data_total==0) + return(-1); +//--- + for(int i=0;i=i) + { + //--- ">>1" is quick division by 2 + m=(j+i)>>1; + if(m<0 || m>=m_data_total) + break; + t_short=m_data[m]; + if(t_short==element) + break; + if(t_short>element) + j=m-1; + else + i=m+1; + } +//--- position + return(m); + } +//+------------------------------------------------------------------+ +//| Search of position of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayShort::Search(const short element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is greater than | +//| specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayShort::SearchGreat(const short element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + while(m_data[pos]<=element) + if(++pos==m_data_total) + return(-1); +//--- position + return(pos); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is less than | +//| specified in the sorted array | +//+------------------------------------------------------------------+ +int CArrayShort::SearchLess(const short element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + while(m_data[pos]>=element) + if(pos--==0) + return(-1); +//--- position + return(pos); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is greater than or | +//| equal to the specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayShort::SearchGreatOrEqual(const short element) const + { +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + for(int pos=QuickSearch(element);pos=element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is less than or equal | +//| to the specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayShort::SearchLessOrEqual(const short element) const + { +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + for(int pos=QuickSearch(element);pos>=0;pos--) + if(m_data[pos]<=element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Find position of first appearance of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayShort::SearchFirst(const short element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + { + while(m_data[pos]==element) + if(pos--==0) + break; + return(pos+1); + } +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Find position of last appearance of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayShort::SearchLast(const short element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + { + while(m_data[pos]==element) + if(++pos==m_data_total) + break; + return(pos-1); + } +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Writing array to file | +//+------------------------------------------------------------------+ +bool CArrayShort::Save(const int file_handle) + { + int i=0; +//--- check + if(!CArray::Save(file_handle)) + return(false); +//--- write array length + if(FileWriteInteger(file_handle,m_data_total,INT_VALUE)!=INT_VALUE) + return(false); +//--- write array + for(i=0;im_data_total) + count=m_data_total-src; + if(count<0) + return(-1); +//--- no need to copy + if(dest==src || count==0) + return(dest); +//--- check data total + if(dest+count>m_data_total) + { + if(m_data_max=0;i--) + m_data[dest+i]=m_data[src+i]; + } +//--- successful + return(dest); + } +//+------------------------------------------------------------------+ +//| Request for more memory in an array. Checks if the requested | +//| number of free elements already exists; allocates additional | +//| memory with a given step | +//+------------------------------------------------------------------+ +bool CArrayString::Reserve(const int size) + { + int new_size; +//--- check + if(size<=0) + return(false); +//--- resize array + if(Available()=size); + } +//+------------------------------------------------------------------+ +//| Resizing (with removal of elements on the right) | +//+------------------------------------------------------------------+ +bool CArrayString::Resize(const int size) + { + int new_size; +//--- check + if(size<0) + return(false); +//--- resize array + new_size=m_step_resize*(1+size/m_step_resize); + if(m_data_max!=new_size) + { + if((m_data_max=ArrayResize(m_data,new_size))==-1) + { + m_data_max=ArraySize(m_data); + return(false); + } + } + if(m_data_total>size) + m_data_total=size; +//--- result + return(m_data_max==new_size); + } +//+------------------------------------------------------------------+ +//| Complete cleaning of the array with the release of memory | +//+------------------------------------------------------------------+ +bool CArrayString::Shutdown(void) + { +//--- check + if(m_data_max==0) + return(true); +//--- clean + if(ArrayResize(m_data,0)==-1) + return(false); + m_data_total=0; + m_data_max=0; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Adding an element to the end of the array | +//+------------------------------------------------------------------+ +bool CArrayString::Add(const string element) + { +//--- check/reserve elements of array + if(!Reserve(1)) + return(false); +//--- add + m_data[m_data_total++]=element; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Adding an element to the end of the array from another array | +//+------------------------------------------------------------------+ +bool CArrayString::AddArray(const string &src[]) + { + int num=ArraySize(src); +//--- check/reserve elements of array + if(!Reserve(num)) + return(false); +//--- add + for(int i=0;i=m_data_total) + return(""); +//--- result + return(m_data[index]); + } +//+------------------------------------------------------------------+ +//| Updating element in the specified position | +//+------------------------------------------------------------------+ +bool CArrayString::Update(const int index,const string element) + { +//--- check + if(index<0 || index>=m_data_total) + return(false); +//--- update + m_data[index]=element; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Moving element from the specified position | +//| on the specified shift | +//+------------------------------------------------------------------+ +bool CArrayString::Shift(const int index,const int shift) + { + string tmp_string; +//--- check + if(index<0 || index+shift<0 || index+shift>=m_data_total) + return(false); + if(shift==0) + return(true); +//--- move + tmp_string=m_data[index]; + if(shift>0) + { + if(MemMove(index,index+1,shift)<0) + return(false); + } + else + { + if(MemMove(index+shift+1,index+shift,-shift)<0) + return(false); + } + m_data[index+shift]=tmp_string; + m_sort_mode=-1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Deleting element from the specified position | +//+------------------------------------------------------------------+ +bool CArrayString::Delete(const int index) + { +//--- check + if(index<0 || index>=m_data_total) + return(false); +//--- delete + if(indexto || from>=m_data_total) + return(false); +//--- delete + if(to>=m_data_total-1) + to=m_data_total-1; + if(MemMove(from,to+1,m_data_total-to-1)<0) + return(false); + m_data_total-=to-from+1; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Equality comparison of two arrays | +//+------------------------------------------------------------------+ +bool CArrayString::CompareArray(const string &array[]) const + { +//--- compare + if(m_data_total!=ArraySize(array)) + return(false); + for(int i=0;i>1" is quick division by 2 + p_string=m_data[(beg+end)>>1]; + while(ip_string) + { + //--- control the output of the array bounds + if(j==0) + break; + j--; + } + if(i<=j) + { + t_string=m_data[i]; + m_data[i++]=m_data[j]; + m_data[j]=t_string; + //--- control the output of the array bounds + if(j==0) + break; + j--; + } + } + if(begelement) + Insert(element,pos); + else + Insert(element,pos+1); +//--- restore the sorting flag after Insert(...) + m_sort_mode=0; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Search of position of element in a array | +//+------------------------------------------------------------------+ +int CArrayString::SearchLinear(const string element) const + { +//--- check + if(m_data_total==0) + return(-1); +//--- + for(int i=0;i=i) + { + //--- ">>1" is quick division by 2 + m=(j+i)>>1; + if(m<0 || m>=m_data_total) + break; + t_string=m_data[m]; + if(t_string==element) + break; + if(t_string>element) + j=m-1; + else + i=m+1; + } +//--- position + return(m); + } +//+------------------------------------------------------------------+ +//| Search of position of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayString::Search(const string element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is greater than | +//| specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayString::SearchGreat(const string element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + while(m_data[pos]<=element) + if(++pos==m_data_total) + return(-1); +//--- position + return(pos); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is less than | +//| specified in the sorted array | +//+------------------------------------------------------------------+ +int CArrayString::SearchLess(const string element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + while(m_data[pos]>=element) + if(pos--==0) + return(-1); +//--- position + return(pos); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is greater than or | +//| equal to the specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayString::SearchGreatOrEqual(const string element) const + { +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + for(int pos=QuickSearch(element);pos=element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Search position of the first element which is less than or equal | +//| to the specified in a sorted array | +//+------------------------------------------------------------------+ +int CArrayString::SearchLessOrEqual(const string element) const + { +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + for(int pos=QuickSearch(element);pos>=0;pos--) + if(m_data[pos]<=element) + return(pos); +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Find position of first appearance of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayString::SearchFirst(const string element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + { + while(m_data[pos]==element) + if(pos--==0) + break; + return(pos+1); + } +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Find position of last appearance of element in a sorted array | +//+------------------------------------------------------------------+ +int CArrayString::SearchLast(const string element) const + { + int pos; +//--- check + if(m_data_total==0 || !IsSorted()) + return(-1); +//--- search + pos=QuickSearch(element); + if(m_data[pos]==element) + { + while(m_data[pos]==element) + if(++pos==m_data_total) + break; + return(pos-1); + } +//--- not found + return(-1); + } +//+------------------------------------------------------------------+ +//| Writing array to file | +//+------------------------------------------------------------------+ +bool CArrayString::Save(const int file_handle) + { + int i=0,len; +//--- check + if(!CArray::Save(file_handle)) + return(false); +//--- write array length + if(FileWriteInteger(file_handle,m_data_total,INT_VALUE)!=INT_VALUE) + return(false); +//--- write array + for(i=0;i +//+------------------------------------------------------------------+ +//| Class CList. | +//| Purpose: Provides the possibility of working with the list of | +//| CObject instances and its dervivatives | +//| Derives from class CObject. | +//+------------------------------------------------------------------+ +class CList : public CObject + { +protected: + CObject *m_first_node; // pointer to the first element of the list + CObject *m_last_node; // pointer to the last element of the list + CObject *m_curr_node; // pointer to the current element of the list + int m_curr_idx; // index of the current list item + int m_data_total; // number of elements + bool m_free_mode; // flag of the necessity of "physical" deletion of object + bool m_data_sort; // flag if the list is sorted or not + int m_sort_mode; // mode of sorting of array + +public: + CList(void); + ~CList(void); + //--- methods of access to protected data + bool FreeMode(void) const { return(m_free_mode); } + void FreeMode(bool mode) { m_free_mode=mode; } + int Total(void) const { return(m_data_total); } + bool IsSorted(void) const { return(m_data_sort); } + int SortMode(void) const { return(m_sort_mode); } + //--- method of identifying the object + virtual int Type(void) const { return(0x7779); } + //--- methods for working with files + virtual bool Save(const int file_handle); + virtual bool Load(const int file_handle); + //--- method of creating an element of the list + virtual CObject *CreateElement(void) { return(NULL); } + //--- methods of filling the list + int Add(CObject *new_node); + int Insert(CObject *new_node,int index); + //--- methods for navigating + int IndexOf(CObject *node); + CObject *GetNodeAtIndex(int index); + CObject *GetFirstNode(void); + CObject *GetPrevNode(void); + CObject *GetCurrentNode(void); + CObject *GetNextNode(void); + CObject *GetLastNode(void); + //--- methods for deleting + CObject *DetachCurrent(void); + bool DeleteCurrent(void); + bool Delete(int index); + void Clear(void); + //--- method for comparing lists + bool CompareList(CList *List); + //--- methods for changing + void Sort(int mode); + bool MoveToIndex(int index); + bool Exchange(CObject *node1,CObject *node2); + //--- method for searching + CObject *Search(CObject *element); +protected: + void QuickSort(int beg,int end,int mode); + CObject *QuickSearch(CObject *element); + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CList::CList(void) : m_first_node(NULL), + m_last_node(NULL), + m_curr_node(NULL), + m_curr_idx(-1), + m_data_total(0), + m_free_mode(true), + m_data_sort(false), + m_sort_mode(0) + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CList::~CList(void) + { + Clear(); + } +//+------------------------------------------------------------------+ +//| Method QuickSort | +//+------------------------------------------------------------------+ +void CList::QuickSort(int beg,int end,int mode) + { + int i,j,k; + CObject *i_ptr,*j_ptr,*k_ptr; +//--- + i_ptr=GetNodeAtIndex(i=beg); + j_ptr=GetNodeAtIndex(j=end); + while(i>1" is quick division by 2 + k_ptr=GetNodeAtIndex(k=(beg+end)>>1); + while(i0) + { + //--- control the output of the array bounds + if(j==0) + break; + j--; + j_ptr=j_ptr.Prev(); + } + if(i<=j) + { + Exchange(i_ptr,j_ptr); + i++; + i_ptr=GetNodeAtIndex(i); + //--- control the output of the array bounds + if(j==0) + break; + else + { + j--; + j_ptr=GetNodeAtIndex(j); + } + } + } + if(begm_data_total || index<0) + return(-1); +//--- adjust + if(index==-1) + { + if(m_curr_node==NULL) + return(Add(new_node)); + } + else + { + if(GetNodeAtIndex(index)==NULL) + return(Add(new_node)); + } +//--- no need to check m_curr_node + tmp_node=m_curr_node.Prev(); + new_node.Prev(tmp_node); + if(tmp_node!=NULL) + tmp_node.Next(new_node); + else + m_first_node=new_node; + new_node.Next(m_curr_node); + m_curr_node.Prev(new_node); + m_data_total++; + m_data_sort=false; + m_curr_node=new_node; +//--- result + return(index); + } +//+------------------------------------------------------------------+ +//| Get a pointer to the position of element in the list | +//+------------------------------------------------------------------+ +CObject *CList::GetNodeAtIndex(int index) + { + int i; + bool revers; + CObject *result; +//--- check + if(index>=m_data_total) + return(NULL); + if(index==m_curr_idx) + return(m_curr_node); +//--- optimize bust list + if(indexindex;i--) + { + result=result.Prev(); + if(result==NULL) + return(NULL); + } + } + else + { + //--- search from left to right + for(;i=m_data_total || !CheckPointer(m_curr_node)) + return(false); +//--- tune + if(m_curr_idx==index) + return(true); + if(m_curr_idx=i) + { + //--- ">>1" is quick division by 2 + m=(j+i)>>1; + if(m<0 || m>=m_data_total) + break; + t_node=GetNodeAtIndex(m); + if(t_node.Compare(element,m_sort_mode)==0) + break; + if(t_node.Compare(element,m_sort_mode)>0) + j=m-1; + else + i=m+1; + t_node=NULL; + } +//--- result + return(t_node); + } +//+------------------------------------------------------------------+ +//| Search position of an element in a sorted list | +//+------------------------------------------------------------------+ +CObject *CList::Search(CObject *element) + { + CObject *result; +//--- check + if(!CheckPointer(element) || !m_data_sort) + return(NULL); +//--- search + result=QuickSearch(element); +//--- result + return(result); + } +//+------------------------------------------------------------------+ +//| Writing list to file | +//+------------------------------------------------------------------+ +bool CList::Save(const int file_handle) + { + CObject *node; + bool result=true; +//--- check + if(!CheckPointer(m_curr_node) || file_handle==INVALID_HANDLE) + return(false); +//--- write start marker - 0xFFFFFFFFFFFFFFFF + if(FileWriteLong(file_handle,-1)!=sizeof(long)) + return(false); +//--- write type + if(FileWriteInteger(file_handle,Type(),INT_VALUE)!=INT_VALUE) + return(false); +//--- write list size + if(FileWriteInteger(file_handle,m_data_total,INT_VALUE)!=INT_VALUE) + return(false); +//--- sequential scannning of elements in the list using the call of method Save() + node=m_first_node; + while(node!=NULL) + { + result&=node.Save(file_handle); + node=node.Next(); + } +//--- successful + return(result); + } +//+------------------------------------------------------------------+ +//| Reading list from file | +//+------------------------------------------------------------------+ +bool CList::Load(const int file_handle) + { + uint i,num; + CObject *node; + bool result=true; +//--- check + if(file_handle==INVALID_HANDLE) + return(false); +//--- read and checking begin marker - 0xFFFFFFFFFFFFFFFF + if(FileReadLong(file_handle)!=-1) + return(false); +//--- read and checking type + if(FileReadInteger(file_handle,INT_VALUE)!=Type()) + return(false); +//--- read list size + num=FileReadInteger(file_handle,INT_VALUE); +//--- sequential creation of list items using the call of method Load() + Clear(); + for(i=0;i0) + p_node.Left(new_node); + else + p_node.Right(new_node); + new_node.Parent(p_node); + Balance(p_node); + } + else + m_root_node=new_node; +//--- result + return(result); + } +//+------------------------------------------------------------------+ +//| Method of removing a node from the tree | +//+------------------------------------------------------------------+ +bool CTree::Delete(CTreeNode *node) + { +//--- check + if(!CheckPointer(node)) + return(false); +//--- delete + if(Detach(node) && CheckPointer(node)==POINTER_DYNAMIC) + delete node; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Method of detaching node from the tree | +//+------------------------------------------------------------------+ +bool CTree::Detach(CTreeNode *node) + { + CTreeNode *curr_node,*tmp_node; + CTreeNode *nodeA,*nodeB; +//--- check + curr_node=node; + if(!CheckPointer(curr_node)) + return(false); +//--- detach + if(curr_node.BalanceL()>curr_node.BalanceR()) + { + nodeA=curr_node.Left(); + while(nodeA.Right()!=NULL) + nodeA=nodeA.Right(); + nodeB=nodeA.Parent(); + if(nodeB!=curr_node) + { + nodeB.Right(nodeA.Left()); + tmp_node=nodeB.Right(); + if(tmp_node!=NULL) + tmp_node.Parent(nodeB); + tmp_node=curr_node.Left(); + nodeA.Left(tmp_node); + tmp_node.Parent(nodeA); + } + //--- left link of curr_node is already installed as it should be + curr_node.Left(NULL); + //--- transferring the right link of curr_node to nodeA + nodeA.Right(curr_node.Right()); + tmp_node=curr_node.Right(); + if(tmp_node!=NULL) + tmp_node.Parent(nodeA); + curr_node.Right(NULL); + //--- transferring the root link of curr_node to nodeA + tmp_node=curr_node.Parent(); + nodeA.Parent(tmp_node); + if(tmp_node!=NULL) + { + if(tmp_node.Left()==curr_node) + tmp_node.Left(nodeA); + else + tmp_node.Right(nodeA); + } + else + { + curr_node.Parent(NULL); + m_root_node=nodeA; + tmp_node=nodeA; + } + Balance(tmp_node); + } + else + { + if(curr_node.BalanceR()>0) + { + nodeA=curr_node.Right(); + while(nodeA.Left()!=NULL) + nodeA=nodeA.Left(); + nodeB=nodeA.Parent(); + if(nodeB!=curr_node) + { + nodeB.Left(nodeA.Right()); + tmp_node=nodeB.Left(); + if(tmp_node!=NULL) + tmp_node.Parent(nodeB); + tmp_node=curr_node.Right(); + nodeA.Right(tmp_node); + tmp_node.Parent(nodeA); + } + //--- right link of curr_node is already installed as it should be + curr_node.Right(NULL); + //--- transferring the left link of curr_node to nodeA + nodeA.Left(curr_node.Left()); + tmp_node=curr_node.Left(); + if(tmp_node!=NULL) + tmp_node.Parent(nodeA); + curr_node.Left(NULL); + //--- transferring the root link of curr_node to nodeA + tmp_node=curr_node.Parent(); + nodeA.Parent(tmp_node); + if(tmp_node!=NULL) + { + if(tmp_node.Left()==curr_node) + tmp_node.Left(nodeA); + else + tmp_node.Right(nodeA); + } + else + { + curr_node.Parent(NULL); + m_root_node=nodeA; + tmp_node=nodeA; + } + Balance(tmp_node); + } + else + { + //--- node list + if(curr_node.Parent()==NULL) + m_root_node=NULL; + else + { + tmp_node=curr_node.Parent(); + if(tmp_node.Left()==curr_node) + tmp_node.Left(NULL); + else + tmp_node.Right(NULL); + curr_node.Parent(NULL); + } + Balance(curr_node.Parent()); + } + } +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Method of cleaning the tree | +//+------------------------------------------------------------------+ +void CTree::Clear(void) + { + if(CheckPointer(m_root_node)==POINTER_DYNAMIC) + delete m_root_node; + m_root_node=NULL; + } +//+------------------------------------------------------------------+ +//| Method of searching for a node in the tree | +//+------------------------------------------------------------------+ +CTreeNode *CTree::Find(const CTreeNode *node) + { + CTreeNode *result=m_root_node; +//--- find + while(result!=NULL && result.Compare(node)!=0) + result=result.GetNext(node); +//--- result + return(result); + } +//+------------------------------------------------------------------+ +//| Method of balancing the tree | +//+------------------------------------------------------------------+ +void CTree::Balance(CTreeNode *node) + { + CTreeNode *nodeA,*nodeB,*nodeC,*curr_node,*tmp_node; +//--- + curr_node=node; + while(curr_node!=NULL) + { + curr_node.RefreshBalance(); + if(MathAbs(curr_node.BalanceL()-curr_node.BalanceR())<=1) + curr_node=curr_node.Parent(); + else + { + if(curr_node.BalanceR()>curr_node.BalanceL()) + { + //--- rotation to the right + tmp_node=curr_node.Right(); + if(tmp_node.BalanceL()>tmp_node.BalanceR()) + { + //--- great rotation to the right + nodeA=curr_node; + nodeB=nodeA.Right(); + nodeC=nodeB.Left(); + nodeC.Parent(nodeA.Parent()); + tmp_node=nodeC.Parent(); + if(tmp_node!=NULL) + { + if(tmp_node.Right()==nodeA) + tmp_node.Right(nodeC); + else + tmp_node.Left(nodeC); + } + else + m_root_node=nodeC; + nodeA.Parent(nodeC); + nodeB.Parent(nodeC); + nodeA.Right(nodeC.Left()); + tmp_node=nodeA.Right(); + if(tmp_node!=NULL) + tmp_node.Parent(nodeA); + nodeC.Left(nodeA); + nodeB.Left(nodeC.Right()); + tmp_node=nodeB.Left(); + if(tmp_node!=NULL) + tmp_node.Parent(nodeB); + nodeC.Right(nodeB); + if(m_root_node==nodeA) + m_root_node=nodeC; + curr_node=nodeC.Parent(); + } + else + { + //--- slight rotation to the right + nodeA=curr_node; + nodeB=nodeA.Right(); + nodeB.Parent(nodeA.Parent()); + tmp_node=nodeB.Parent(); + if(tmp_node!=NULL) + { + if(tmp_node.Right()==nodeA) + tmp_node.Right(nodeB); + else + tmp_node.Left(nodeB); + } + else + m_root_node=nodeB; + nodeA.Parent(nodeB); + nodeA.Right(nodeB.Left()); + tmp_node=nodeA.Right(); + if(tmp_node!=NULL) + tmp_node.Parent(nodeA); + nodeB.Left(nodeA); + if(m_root_node==nodeA) + m_root_node=nodeB; + curr_node=nodeB.Parent(); + } + } + else + { + //--- rotation to the left + tmp_node=curr_node.Left(); + if(tmp_node.BalanceR()>tmp_node.BalanceL()) + { + //--- great rotation to the left + nodeA=curr_node; + nodeB=nodeA.Left(); + nodeC=nodeB.Right(); + nodeC.Parent(nodeA.Parent()); + tmp_node=nodeC.Parent(); + if(tmp_node!=NULL) + { + if(tmp_node.Right()==nodeA) + tmp_node.Right(nodeC); + else + tmp_node.Left(nodeC); + } + else + m_root_node=nodeC; + nodeA.Parent(nodeC); + nodeB.Parent(nodeC); + nodeA.Left(nodeC.Right()); + tmp_node=nodeA.Left(); + if(tmp_node!=NULL) + tmp_node.Parent(nodeA); + nodeC.Right(nodeA); + nodeB.Right(nodeC.Left()); + tmp_node=nodeB.Right(); + if(tmp_node!=NULL) + tmp_node.Parent(nodeB); + nodeC.Left(nodeB); + if(m_root_node==nodeA) + m_root_node=nodeC; + curr_node=nodeC.Parent(); + } + else + { + //--- small rotation to the left + nodeA=curr_node; + nodeB=nodeA.Left(); + nodeB.Parent(nodeA.Parent()); + tmp_node=nodeB.Parent(); + if(tmp_node!=NULL) + { + if(tmp_node.Right()==nodeA) + tmp_node.Right(nodeB); + else + tmp_node.Left(nodeB); + } + else + m_root_node=nodeB; + nodeA.Parent(nodeB); + nodeA.Left(nodeB.Right()); + tmp_node=nodeA.Left(); + if(tmp_node!=NULL) + tmp_node.Parent(nodeA); + nodeB.Right(nodeA); + if(m_root_node==nodeA) + m_root_node=nodeB; + curr_node=nodeB.Parent(); + } + } + } + } + } +//+------------------------------------------------------------------+ +//| Writing tree to file | +//+------------------------------------------------------------------+ +bool CTree::Save(const int file_handle) + { +//--- check + if(file_handle==INVALID_HANDLE) + return(false); + if(m_root_node==NULL) + return(true); +//--- result + return(m_root_node.SaveNode(file_handle)); + } +//+------------------------------------------------------------------+ +//| Reading tree from file | +//+------------------------------------------------------------------+ +bool CTree::Load(const int file_handle) + { +//--- check + if(file_handle==INVALID_HANDLE) + return(false); +//--- create root node only + Clear(); + Insert(CreateElement()); +//--- result + return(m_root_node.LoadNode(file_handle,m_root_node)); + } +//+------------------------------------------------------------------+ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Arrays/TreeNode.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Arrays/TreeNode.mqh new file mode 100644 index 0000000..a22aa68 --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/Arrays/TreeNode.mqh @@ -0,0 +1,174 @@ +//+------------------------------------------------------------------+ +//| TreeNode.mqh | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include +//+------------------------------------------------------------------+ +//| Class CTreeNode. | +//| Purpose: Base class of node of binary tree CTree. | +//| Derives from class CObject. | +//+------------------------------------------------------------------+ +class CTreeNode : public CObject + { +private: + CTreeNode *m_p_node; // link to node up + CTreeNode *m_l_node; // link to node left + CTreeNode *m_r_node; // link to node right + //--- variables + int m_balance; // balance of node + int m_l_balance; // balance of the left branch + int m_r_balance; // balance of the right branch + +public: + CTreeNode(void); + ~CTreeNode(void); + //--- methods of access to protected data + CTreeNode* Parent(void) const { return(m_p_node); } + void Parent(CTreeNode *node) { m_p_node=node; } + CTreeNode* Left(void) const { return(m_l_node); } + void Left(CTreeNode *node) { m_l_node=node; } + CTreeNode* Right(void) const { return(m_r_node); } + void Right(CTreeNode *node) { m_r_node=node; } + int Balance(void) const { return(m_balance); } + int BalanceL(void) const { return(m_l_balance); } + int BalanceR(void) const { return(m_r_balance); } + //--- method of identifying the object + virtual int Type(void) const { return(0x8888); } + //--- methods for controlling + int RefreshBalance(void); + CTreeNode *GetNext(const CTreeNode *node); + //--- methods for working with files + bool SaveNode(const int file_handle); + bool LoadNode(const int file_handle,CTreeNode *main); + +protected: + //--- method for creating an instance of class + virtual CTreeNode *CreateSample(void) { return(NULL); } + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CTreeNode::CTreeNode(void) : m_p_node(NULL), + m_l_node(NULL), + m_r_node(NULL), + m_balance(0), + m_l_balance(0), + m_r_balance(0) + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CTreeNode::~CTreeNode(void) + { +//--- delete nodes of the next level + if(m_l_node!=NULL) + delete m_l_node; + if(m_r_node!=NULL) + delete m_r_node; + } +//+------------------------------------------------------------------+ +//| Calculating the balance of the node | +//+------------------------------------------------------------------+ +int CTreeNode::RefreshBalance(void) + { +//--- calculate the balance of the left branch + if(m_l_node==NULL) + m_l_balance=0; + else + m_l_balance=m_l_node.RefreshBalance(); +//--- calculate the balance of the right branch + if(m_r_node==NULL) + m_r_balance=0; + else + m_r_balance=m_r_node.RefreshBalance(); +//--- calculate the balance of the node + if(m_r_balance>m_l_balance) + m_balance=m_r_balance+1; + else + m_balance=m_l_balance+1; +//--- result + return(m_balance); + } +//+------------------------------------------------------------------+ +//| Selecting next node | +//+------------------------------------------------------------------+ +CTreeNode *CTreeNode::GetNext(const CTreeNode *node) + { + if(Compare(node)>0) + return(m_l_node); +//--- result + return(m_r_node); + } +//+------------------------------------------------------------------+ +//| Writing node data to file | +//+------------------------------------------------------------------+ +bool CTreeNode::SaveNode(const int file_handle) + { + bool result=true; +//--- check + if(file_handle==INVALID_HANDLE) + return(false); +//--- write left node (if it is available) + if(m_l_node!=NULL) + { + FileWriteInteger(file_handle,'L',SHORT_VALUE); + result&=m_l_node.SaveNode(file_handle); + } + else + FileWriteInteger(file_handle,'X',SHORT_VALUE); +//--- write data of current node + result&=Save(file_handle); +//--- write right node (if it is available) + if(m_r_node!=NULL) + { + FileWriteInteger(file_handle,'R',SHORT_VALUE); + result&=m_r_node.SaveNode(file_handle); + } + else + FileWriteInteger(file_handle,'X',SHORT_VALUE); +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Reading node data from file | +//+------------------------------------------------------------------+ +bool CTreeNode::LoadNode(const int file_handle,CTreeNode *main) + { + bool result=true; + short s_val; + CTreeNode *node; +//--- check + if(file_handle==INVALID_HANDLE) + return(false); +//--- read directions + s_val=(short)FileReadInteger(file_handle,SHORT_VALUE); + if(s_val=='L') + { + //--- read left node (if there is data) + node=CreateSample(); + if(node==NULL) + return(false); + m_l_node=node; + node.Parent(main); + result&=node.LoadNode(file_handle,node); + } +//--- read data of current node + result&=Load(file_handle); +//--- read directions + s_val=(short)FileReadInteger(file_handle,SHORT_VALUE); + if(s_val=='R') + { + //--- read right node (if there is data) + node=CreateSample(); + if(node==NULL) + return(false); + m_r_node=node; + node.Parent(main); + result&=node.LoadNode(file_handle,node); + } +//--- result + return(result); + } +//+------------------------------------------------------------------+ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/Canvas.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/Canvas.mqh new file mode 100644 index 0000000..5000fac --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/Canvas.mqh @@ -0,0 +1,4859 @@ +//+------------------------------------------------------------------+ +//| Canvas.mqh | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include +#include + +#define SIGN(i) ((i<0) ? -1 : 1) + +//+------------------------------------------------------------------+ +//| Macro to generate color | +//+------------------------------------------------------------------+ +#define XRGB(r,g,b) (0xFF000000|(uchar(r)<<16)|(uchar(g)<<8)|uchar(b)) +#define ARGB(a,r,g,b) ((uchar(a)<<24)|(uchar(r)<<16)|(uchar(g)<<8)|uchar(b)) +#define TRGB(a,rgb) ((uchar(a)<<24)|(rgb)) +#define GETRGB(clr) ((clr)&0xFFFFFF) +#define GETRGBA(clr) uchar((clr)>>24) +#define GETRGBR(clr) uchar((clr)>>16) +#define GETRGBG(clr) uchar((clr)>>8) +#define GETRGBB(clr) uchar(clr) +#define COLOR2RGB(clr) (0xFF000000|(uchar(clr)<<16)|(uchar((clr)>>8)<<8)|uchar((clr)>>16)) +#define RGB2COLOR(rgb) ((uchar(rgb)<<16)|(uchar((rgb)>>8)<<8)|uchar((rgb)>>16)) + +//+------------------------------------------------------------------+ +//| Line end style (round, butt, square) | +//+------------------------------------------------------------------+ +enum ENUM_LINE_END + { + LINE_END_ROUND, + LINE_END_BUTT, + LINE_END_SQUARE, + }; + +//+------------------------------------------------------------------+ +//| Class CCanvas | +//| Usage: class for working with a dynamic resource | +//+------------------------------------------------------------------+ +class CCanvas + { +private: + uint m_style; // line style template + uint m_style_idx; // variable - current index of bit in line style template + static uint m_default_colors[9]; // default colors + +protected: + long m_chart_id; // chart ID + string m_objname; // object name + ENUM_OBJECT m_objtype; // object type + string m_rcname; // resource name + int m_width; // canvas width + int m_height; // canvas height + ENUM_COLOR_FORMAT m_format; // method of color processing + //--- for text + string m_fontname; // font name + int m_fontsize; // font size + uint m_fontflags; // font flags + uint m_fontangle; // angle of text tilt to the X axis in 0.1 degrees + //--- data + uint m_pixels[]; // array of pixels + +public: + CCanvas(void); + ~CCanvas(void); + //--- create/attach/destroy + virtual bool Create(const string name,const int width,const int height,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA); + bool CreateBitmap(const string name,const datetime time,const double price, + const int width,const int height,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA); + bool CreateBitmap(const long chart_id,const int subwin,const string name, + const datetime time,const double price,const int width,const int height, + ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA); + bool CreateBitmapLabel(const string name,const int x,const int y, + const int width,const int height,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA); + bool CreateBitmapLabel(const long chart_id,const int subwin,const string name, + const int x,const int y,const int width,const int height, + ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA); + virtual bool Attach(const long chart_id,const string objname,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA); + virtual bool Attach(const long chart_id,const string objname,const int width,const int height,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA); + virtual void Destroy(void); + //--- properties + string ChartObjectName(void) const { return(m_objname); } + string ResourceName(void) const { return(m_rcname); } + int Width(void) const { return(m_width); } + int Height(void) const { return(m_height); } + //--- update object on screen + void Update(const bool redraw=true); + bool Resize(const int width,const int height); + //--- clear/fill color + void Erase(const uint clr=0); + //--- data access + uint PixelGet(const int x,const int y) const; + void PixelSet(const int x,const int y,const uint clr); + //--- draw primitives + void LineVertical(int x,int y1,int y2,const uint clr); + void LineHorizontal(int x1,int x2,int y,const uint clr); + void Line(int x1,int y1,int x2,int y2,const uint clr); + void Polyline(int &x[],int &y[],const uint clr); + void Polygon(int &x[],int &y[],const uint clr); + void Rectangle(int x1,int y1,int x2,int y2,const uint clr); + void Triangle(int x1,int y1,int x2,int y2,int x3,int y3,const uint clr); + void Circle(int x,int y,int r,const uint clr); + void Ellipse(int x1,int y1,int x2,int y2,const uint clr); + void Arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,const uint clr); + void Arc(int x,int y,int rx,int ry,double fi3,double fi4,const uint clr); + void Arc(int x,int y,int rx,int ry,double fi3,double fi4,int &x3,int &y3,int &x4,int &y4,const uint clr); + void Pie(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,const uint clr,const uint fill_clr); + void Pie(int x,int y,int rx,int ry,double fi3,double fi4,const uint clr,const uint fill_clr); + //--- draw filled primitives + void FillRectangle(int x1,int y1,int x2,int y2,const uint clr); + void FillTriangle(int x1,int y1,int x2,int y2,int x3,int y3,const uint clr); + void FillPolygon(int &x[],int &y[],const uint clr); + void FillCircle(int x,int y,int r,const uint clr); + void FillEllipse(int x1,int y1,int x2,int y2,const uint clr); + void Fill(int x,int y,const uint clr); + void Fill(int x,int y,const uint clr,const uint threshould); + //--- draw primitives with antialiasing + void PixelSetAA(const double x,const double y,const uint clr); + void LineAA(const int x1,const int y1,const int x2,const int y2,const uint clr,const uint style=UINT_MAX); + void PolylineAA(int &x[],int &y[],const uint clr,const uint style=UINT_MAX); + void PolygonAA(int &x[],int &y[],const uint clr,const uint style=UINT_MAX); + void TriangleAA(const int x1,const int y1,const int x2,const int y2,const int x3,const int y3, + const uint clr,const uint style=UINT_MAX); + void CircleAA(const int x,const int y,const double r,const uint clr,const uint style=UINT_MAX); + void EllipseAA(const double x1,const double y1,const double x2,const double y2,const uint clr,const uint style=UINT_MAX); + //--- draw primitives with antialiasing by Wu's algorithm + void LineWu(int x1,int y1,int x2,int y2,const uint clr,const uint style=UINT_MAX); + void PolylineWu(const int &x[],const int &y[],const uint clr,const uint style=UINT_MAX); + void PolygonWu(const int &x[],const int &y[],const uint clr,const uint style=UINT_MAX); + void TriangleWu(const int x1,const int y1,const int x2,const int y2,const int x3,const int y3,const uint clr,const uint style=UINT_MAX); + void CircleWu(const int x,const int y,const double r,const uint clr,const uint style=UINT_MAX); + void EllipseWu(const int x1,const int y1,const int x2,const int y2,const uint clr,const uint style=UINT_MAX); + //--- draw primitives with prefiltered antialiasing + void LineThickVertical(const int x,const int y1,const int y2,const uint clr,const int size,const uint style,ENUM_LINE_END end_style); + void LineThickHorizontal(const int x1,const int x2,const int y,const uint clr,const int size,const uint style,ENUM_LINE_END end_style); + void LineThick(const int x1,const int y1,const int x2,const int y2,const uint clr,const int size,const uint style,ENUM_LINE_END end_style); + void PolylineThick(const int &x[],const int &y[],const uint clr,const int size,const uint style,ENUM_LINE_END end_style); + void PolygonThick(const int &x[],const int &y[],const uint clr,const int size,const uint style,ENUM_LINE_END end_style); + //--- draw primitives smoothing polyline and polygon + void PolylineSmooth(const int &x[],const int &y[],const uint clr,const int size, + ENUM_LINE_STYLE style=STYLE_SOLID,ENUM_LINE_END end_style=LINE_END_ROUND, + double tension=0.5,double step=10); + void PolygonSmooth(int &x[],int &y[],const uint clr,const int size, + ENUM_LINE_STYLE style=STYLE_SOLID,ENUM_LINE_END end_style=LINE_END_ROUND, + double tension=0.5,double step=10); + //--- BitBlt + void BitBlt(int dst_x,int dst_y,const uint &src[],int src_width,int src_height,int src_x,int src_y,int src_dx,int src_dy,uint mode=0); + //--- for text + bool FontSet(const string name,const int size,const uint flags=0,const uint angle=0); + bool FontNameSet(string name); + bool FontSizeSet(int size); + bool FontFlagsSet(uint flags); + bool FontAngleSet(uint angle); + void FontGet(string &name,int &size,uint &flags,uint &angle); + string FontNameGet(void) const { return(m_fontname); } + int FontSizeGet(void) const { return(m_fontsize); } + uint FontFlagsGet(void) const { return(m_fontflags); } + uint FontAngleGet(void) const { return(m_fontangle); } + void TextOut(int x,int y,string text,const uint clr,uint alignment=0); + int TextWidth(const string text); + int TextHeight(const string text); + void TextSize(const string text,int &width,int &height); + //--- services + static uint GetDefaultColor(const int i); + void TransparentLevelSet(const uchar value); + //--- load bitmap from file + bool LoadFromFile(const string filename); + //--- line style property + uint LineStyleGet(void) const; + void LineStyleSet(const uint style); + //--- load bitmap from file to buffer + static bool LoadBitmap(const string filename,uint &data[],int &width,int &height); + +private: + bool FontSet(void); + void TextOutFast(int x,int y,string text,const uint clr,uint alignment=0); + bool PixelsSimilar(const uint clr0,const uint clr1,const uint threshould); + //--- for Wu's algorithm + void PixelTransform(const int x,const int y,const uint clr,const double alpha); + //--- for circle and ellipse + void PixelTransform4(const int x,const int y,const int dx,const int dy,const uint clr,const double alpha); + void PixelSet4AA(const double x,const double y,const double dx,const double dy,const uint clr); + //--- for thick line + void SegmentVertical(const int x,const int y1,const int y2,const int ysign,const double r,const uint clr,ENUM_LINE_END end_style); + void SegmentHorizontal(const int x1,const int x2,const int y,const int xsign,const double r,const uint clr,ENUM_LINE_END end_style); + void Segment(const int x1,const int y1,const int x2,const int y2,const double kp0,const double kp1,const int xsign,const int ysign, + const double rcos_k,const double rsin_k,const double r,const uint clr,ENUM_LINE_END end_style); + double DistancePointSegment(const double px,const double py,const double x1,const double y1,const double x2,const double y2); + //--- for pie + double AngleCalc(int x1,int y1,int x2,int y2); + //--- for polygon + int PointClassify(const CPoint &p0,const CPoint &p1,const CPoint &p2); + int PolygonClassify(const CPoint &p[]); + bool IsPolygonConvex(CPoint &p[]); + void PolygonNormalize(CPoint &p[]); + void PolygonIntersect(CPoint &p[],CPoint &add[]); + void PolygonFill(CPoint &p[],const uint clr); + //--- for smoothing polyline and polygon + void CalcCurveBezierEndp(const double xend,const double yend,const double xadj,const double yadj,const double tension,double &x,double &y); + void CalcCurveBezier(const int &x[],const int &y[],const int i,const double tension,double &x1,double &y1,double &x2,double &y2); + double CalcBezierX(const double t,const double x0,const double x1,const double x2,const double x3); + double CalcBezierY(const double t,const double y0,const double y1,const double y2,const double y3); + +protected: + //--- method for prefiltered antialiasing + virtual double FilterFunction(const double x); + }; +//+------------------------------------------------------------------+ +//| Initialize static array | +//+------------------------------------------------------------------+ +uint CCanvas::m_default_colors[9]= + { + XRGB(0,0,255), // blue + XRGB(255,0,0), // red + XRGB(0,128,0), // green + XRGB(255,242,0), // yellow + XRGB(255,0,128), // pink + XRGB(0,255,0), // lime + XRGB(185,0,61), // crimson + XRGB(0,183,239), // sky blue + XRGB(255,128,0) // orange + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CCanvas::CCanvas(void) : m_chart_id(0), + m_objname(NULL), + m_objtype(WRONG_VALUE), + m_rcname(NULL), + m_width(0), + m_height(0), + m_format(COLOR_FORMAT_XRGB_NOALPHA), + m_fontname("arial"), + m_fontsize(-120), + m_fontflags(0), + m_fontangle(0), + m_style(UINT_MAX), + m_style_idx(0) + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CCanvas::~CCanvas(void) + { + } +//+------------------------------------------------------------------+ +//| Create dynamic resource | +//+------------------------------------------------------------------+ +bool CCanvas::Create(const string name,const int width,const int height,ENUM_COLOR_FORMAT clrfmt) + { + Destroy(); +//--- prepare data array + if(width>0 && height>0 && ArrayResize(m_pixels,width*height)>0) + { + //--- generate resource name + m_rcname="::"+name+(string)ChartID()+(string)(GetTickCount()+MathRand()); + //--- initialize data with zeros + ArrayInitialize(m_pixels,0); + //--- create dynamic resource + if(ResourceCreate(m_rcname,m_pixels,width,height,0,0,0,clrfmt)) + { + //--- successfully created + //--- complete initialization + m_width =width; + m_height=height; + m_format=clrfmt; + //--- succeed + return(true); + } + } +//--- error - destroy object + Destroy(); + return(false); + } +//+------------------------------------------------------------------+ +//| Create object on chart with attached dynamic resource | +//+------------------------------------------------------------------+ +bool CCanvas::CreateBitmap(const string name,const datetime time,const double price, + const int width,const int height,ENUM_COLOR_FORMAT clrfmt) + { + return(CreateBitmap(0,0,name,time,price,width,height,clrfmt)); + } +//+------------------------------------------------------------------+ +//| Create object on chart with attached dynamic resource | +//+------------------------------------------------------------------+ +bool CCanvas::CreateBitmap(const long chart_id,const int subwin,const string name, + const datetime time,const double price,const int width,const int height, + ENUM_COLOR_FORMAT clrfmt) + { +//--- create canvas + if(Create(name,width,height,clrfmt)) + { + //--- create attached object + if(ObjectCreate(chart_id,name,OBJ_BITMAP,subwin,time,price)) + { + //--- bind object with resource + if(ObjectSetString(chart_id,name,OBJPROP_BMPFILE,m_rcname)) + { + //--- successfully created + //--- complete initialization + m_chart_id=chart_id; + m_objname =name; + m_objtype =OBJ_BITMAP; + //--- succeed + return(true); + } + } + } +//--- error + return(false); + } +//+------------------------------------------------------------------+ +//| Create object on chart with attached dynamic resource | +//+------------------------------------------------------------------+ +bool CCanvas::CreateBitmapLabel(const string name,const int x,const int y, + const int width,const int height,ENUM_COLOR_FORMAT clrfmt) + { + return(CreateBitmapLabel(0,0,name,x,y,width,height,clrfmt)); + } +//+------------------------------------------------------------------+ +//| Create object on chart with attached dynamic resource | +//+------------------------------------------------------------------+ +bool CCanvas::CreateBitmapLabel(const long chart_id,const int subwin,const string name, + const int x,const int y,const int width,const int height, + ENUM_COLOR_FORMAT clrfmt) + { +//--- create canvas + if(Create(name,width,height,clrfmt)) + { + //--- create attached object + if(ObjectCreate(chart_id,name,OBJ_BITMAP_LABEL,subwin,0,0)) + { + //--- set x,y and bind object with resource + if(ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,x) && + ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,y) && + ObjectSetString(chart_id,name,OBJPROP_BMPFILE,m_rcname)) + { + //--- successfully created + //--- complete initialization + m_chart_id=chart_id; + m_objname =name; + m_objtype =OBJ_BITMAP_LABEL; + //--- succeed + return(true); + } + } + } +//--- error + return(false); + } +//+------------------------------------------------------------------+ +//| Attach new object with bitmap resource | +//+------------------------------------------------------------------+ +bool CCanvas::Attach(const long chart_id,const string objname,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA) + { + if(OBJ_BITMAP_LABEL==ObjectGetInteger(chart_id,objname,OBJPROP_TYPE)) + { + string rcname=ObjectGetString(chart_id,objname,OBJPROP_BMPFILE); + rcname=StringSubstr(rcname,StringFind(rcname,"::")); + if(ResourceReadImage(rcname,m_pixels,m_width,m_height)) + { + m_chart_id=chart_id; + m_objname=objname; + m_rcname=rcname; + m_format=clrfmt; + m_objtype=OBJ_BITMAP_LABEL; + //--- success + return(true); + } + } +//--- failed + return(false); + } +//+------------------------------------------------------------------+ +//| Attach new object without bitmap resource | +//+------------------------------------------------------------------+ +bool CCanvas::Attach(const long chart_id,const string objname,const int width,const int height,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA) + { + if(OBJ_BITMAP_LABEL==ObjectGetInteger(chart_id,objname,OBJPROP_TYPE)) + { + string rcname=ObjectGetString(chart_id,objname,OBJPROP_BMPFILE); + if(StringLen(rcname)==0 && width>0 && height>0 && ArrayResize(m_pixels,width*height)>0) + { + ZeroMemory(m_pixels); + if(ResourceCreate("::"+objname,m_pixels,width,height,0,0,0,clrfmt) && + ObjectSetString(chart_id,objname,OBJPROP_BMPFILE,"::"+objname)) + { + m_chart_id=chart_id; + m_width=width; + m_height=height; + m_objname=objname; + m_rcname="::"+objname; + m_format=clrfmt; + m_objtype=OBJ_BITMAP_LABEL; + //--- success + return(true); + } + } + } +//--- failed + return(false); + } +//+------------------------------------------------------------------+ +//| Remove object from chart and deallocate data array | +//+------------------------------------------------------------------+ +void CCanvas::Destroy(void) + { +//--- delete object + if(m_objname!=NULL) + { + ObjectDelete(m_chart_id,m_objname); + m_chart_id=0; + m_objname =NULL; + m_objtype =WRONG_VALUE; + } +//--- deallocate array + ArrayFree(m_pixels); +//--- free resource + if(m_rcname!=NULL) + { + ResourceFree(m_rcname); + m_rcname=NULL; + } +//--- zeroize data + m_width =0; + m_height=0; + } +//+------------------------------------------------------------------+ +//| Update object on screen (redraw) | +//+------------------------------------------------------------------+ +void CCanvas::Update(const bool redraw) + { +//--- check + if(m_rcname==NULL) + return; +//--- update resource and redraw + if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw) + ChartRedraw(this.m_chart_id); + } +//+------------------------------------------------------------------+ +//| Resize | +//+------------------------------------------------------------------+ +bool CCanvas::Resize(const int width,const int height) + { +//--- check + if(m_rcname!=NULL && width>0 && height>0) + if(ArrayResize(m_pixels,width*height)>0) + { + m_width =width; + m_height=height; + //--- initialize data with zeros + ArrayInitialize(m_pixels,0); + //--- create dynamic resource + if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format)) + { + //--- bind object with resource + if(m_objname!=NULL && ObjectSetString(m_chart_id,m_objname,OBJPROP_BMPFILE,m_rcname)) + return(true); + } + } +//--- error + return(false); + } +//+------------------------------------------------------------------+ +//| Clear/Fill color | +//+------------------------------------------------------------------+ +void CCanvas::Erase(const uint clr) + { + ArrayInitialize(m_pixels,clr); + } +//+------------------------------------------------------------------+ +//| Get pixel color | +//+------------------------------------------------------------------+ +uint CCanvas::PixelGet(const int x,const int y) const + { +//--- check coordinates + if(x>=0 && x=0 && y=0 && x=0 && y=m_width || y<0 || y>=m_height) + return; +//--- + int index=y*m_width+x; + uint old_clr=m_pixels[index]; +//--- check if replacement is necessary + if(old_clr==clr) + return; +//--- use pseudo stack to emulate deeply-nested recursive calls + int stack[]; + uint count=1; + int idx; + int total=ArraySize(m_pixels); +//--- allocate memory for stack + if(ArrayResize(stack,total)==-1) + return; + stack[0]=index; + m_pixels[index]=clr; + for(uint i=0; i0 && m_pixels[idx]==old_clr) + { + m_pixels[idx]=clr; + stack[count++]=idx; + } + //--- top adjacent point + idx=index-m_width; + if(idx>=0 && m_pixels[idx]==old_clr) + { + m_pixels[idx]=clr; + stack[count++]=idx; + } + //--- right adjacent point + idx=index+1; + if(x=m_width || y<0 || y>=m_height || threshould>255) + return; +//--- + int index=y*m_width+x; + uint old_clr=m_pixels[index]; +//--- check if replacement is necessary + if(old_clr==clr) + return; +//--- use pseudo stack to emulate deeply-nested recursive calls + int stack[]; + uint count=1; + int idx; + int total=ArraySize(m_pixels); +//--- allocate memory for stack + if(ArrayResize(stack,total)==-1) + return; + stack[0]=index; + m_pixels[index]=clr; + for(uint i=0; i0 && PixelsSimilar(m_pixels[idx],old_clr,threshould) && m_pixels[idx]!=clr) + { + m_pixels[idx]=clr; + stack[count++]=idx; + } + //--- top adjacent point + idx=index-m_width; + if(idx>=0 && PixelsSimilar(m_pixels[idx],old_clr,threshould) && m_pixels[idx]!=clr) + { + m_pixels[idx]=clr; + stack[count++]=idx; + } + //--- right adjacent point + idx=index+1; + if(xy2) + { + tmp=y1; + y1 =y2; + y2 =tmp; + } +//--- line is out of image boundaries + if(y2<0 || y1>=m_height || x<0 || x>=m_width) + return; +//--- stay withing image boundaries + if(y1<0) + y1=0; + if(y2>=m_height) + y2=m_height-1; +//--- draw line + int index=y1*m_width+x; + for(int i=y1; i<=y2; i++,index+=m_width) + m_pixels[index]=clr; + } +//+------------------------------------------------------------------+ +//| Draw horizontal line | +//+------------------------------------------------------------------+ +void CCanvas::LineHorizontal(int x1,int x2,int y,const uint clr) + { + int tmp; +//--- sort by X + if(x1>x2) + { + tmp=x1; + x1 =x2; + x2 =tmp; + } +//--- line is out of image boundaries + if(x2<0 || x1>=m_width || y<0 || y>=m_height) + return; +//--- stay withing image boundaries + if(x1<0) + x1=0; + if(x2>=m_width) + x2=m_width-1; +//--- draw line + ArrayFill(m_pixels,y*m_width+x1,(x2-x1)+1,clr); + } +//+------------------------------------------------------------------+ +//| Draw line according to Bresenham's algorithm | +//+------------------------------------------------------------------+ +void CCanvas::Line(int x1,int y1,int x2,int y2,const uint clr) + { +//--- line is out of image boundaries + if((x1<0 && x2<0) || (y1<0 && y2<0)) + return; + if(x1>=m_width && x2>=m_width) + return; + if(y1>=m_height && y2>=m_height) + return; +//--- get length by X and Y + int dx=(x2>x1)? x2-x1 : x1-x2; + int dy=(y2>y1)? y2-y1 : y1-y2; + if(dx==0) + { + //--- vertical line + LineVertical(x1,y1,y2,clr); + return; + } + if(dy==0) + { + //--- horizontal line + LineHorizontal(x1,x2,y1,clr); + return; + } +//--- get direction by X and Y + int sx=(x1=m_width || + y1<0 || y1>=m_height) + { + if(draw) + return; + } + else + { + //--- draw pixel + m_pixels[y1*m_width+x1]=clr; + draw=true; + } + //--- get coordinates of next pixel + int er2=er<<1; + if(er2>-dy) + { + er-=dy; + x1+=sx; + } + if(er2ArraySize(y)) + total=ArraySize(y); +//--- check + if(total<2) + return; + total--; +//--- draw + for(int i=0; iArraySize(y)) + total=ArraySize(y); +//--- check + if(total<2) + return; + total--; +//--- draw + for(int i=0; i=dx) + { + xx=x+dx; + if(xx>=0 && xx=0 && yy=0 && yy=0 && xx=0 && yy=0 && yy=0 && xx=0 && yy=0 && yy=0 && xx=0 && yy=0 && yy=0) + { + dy--; + dd_y+=2; + f+=dd_y; + } + dx++; + dd_x+=2; + f+=dd_x; + } + } +//+------------------------------------------------------------------+ +//| Draw ellipse according to Bresenham's algorithm | +//+------------------------------------------------------------------+ +void CCanvas::Ellipse(int x1,int y1,int x2,int y2,const uint clr) + { + int x,y; + int rx,ry; + int dx,dy; + int xx,yy; + int rx_sq,ry_sq; + int f; + int tmp; +//--- handle extreme conditions + if(x1==x2) + { + if(y1==y2) + PixelSet(x1,y1,clr); + else + LineVertical(x1,y1,y2,clr); + return; + } + if(y1==y2) + { + LineHorizontal(x1,x2,y1,clr); + return; + } +//--- sort by X + if(x1>x2) + { + tmp=x1; + x1 =x2; + x2 =tmp; + } +//--- sort by Y + if(y1>y2) + { + tmp=y1; + y1 =y2; + y2 =tmp; + } + x =(x2+x1)>>1; + y =(y2+y1)>>1; + rx=(x2-x1)>>1; + ry=(y2-y1)>>1; + dx=0; + dy=ry; + rx_sq=rx*rx; + ry_sq=ry*ry; + f=(rx_sq<<1)*((dy-1)*dy)+rx_sq+(ry_sq<<1)*(1-rx_sq); + while(rx_sq*dy>ry_sq*dx) + { + yy=y+dy; + if(yy>=0 && yy=0 && xx=0 && xx=0 && yy=0 && xx=0 && xx=0) + { + dy--; + f-=(rx_sq<<2)*dy; + } + f+=(ry_sq<<1)*(3+(dx<<1)); + dx++; + } + f=(ry_sq<<1)*(dx+1)*dx+(rx_sq<<1)*(dy*(dy-2)+1)+(1-(rx_sq<<1))*ry_sq; + while(dy>=0) + { + yy=y+dy; + if(yy>=0 && yy=0 && xx=0 && xx=0 && yy=0 && xx=0 && xxx2) + { + tmp=x1; + x1 =x2; + x2 =tmp; + } +//--- sort by Y + if(y1>y2) + { + tmp=y1; + y1 =y2; + y2 =tmp; + } + x =(x2+x1)>>1; + y =(y2+y1)>>1; +//--- check rays + if(x3==x && y3==y) + return; + if(x4==x && y4==y) + return; +//--- calculate parameters of ray x3,y3 + fi3=AngleCalc(x,y,x3,y3); +//--- calculate parameters of ray x4,y4 + fi4=AngleCalc(x,y,x4,y4); +//--- draw arc + Arc(x,y,x2-x,y2-y,fi3,fi4,clr); + } +//+------------------------------------------------------------------+ +//| Draws ellipse arc | +//+------------------------------------------------------------------+ +void CCanvas::Arc(int x,int y,int rx,int ry,double fi3,double fi4,const uint clr) + { + int x3,y3,x4,y4; +//--- check + if(rx<10 || ry<10) + return; + if(rx<0) + rx=-rx; + if(ry<0) + ry=-ry; +//--- check rays + if(fi3==fi4) + return; +//--- adjustment for passing through 0 + if(fi40) || // ray 3 is in the 1st or 2nd quadrant + (fi0) || // ray 4 is in the 1st or 2nd quadrant + (fi4-fi3>=M_PI)) // arc will pass through the top of the ellipse + { + dx=0; + dy=ry; + f=(rx_sq<<1)*((dy-1)*dy)+rx_sq+(ry_sq<<1)*(1-rx_sq); + while(rx_sq*dy>=ry_sq*dx) + { + yy=y-dy; + if(dx==0) + { + //--- central point + fi=AngleCalc(0,0,0,-dy); + if((fi<=fi4 && fi3<=fi) || (fi4>=2*M_PI && fi<=fi4-2*M_PI)) + { + PixelSet(x,yy,clr); + ckw=ackw=true; + } + else + ckw=ackw=false; + xx_c=x; + yy_c=yy; + fi_c=fi; + xx_a=x; + yy_a=yy; + fi_a=fi; + } + else + { + //--- iterate clockwise + xx=x+dx; + fi=AngleCalc(0,0,dx,-dy); + if((fi<=fi4 && fi3<=fi) || (fi4>=2*M_PI && fi<=fi4-2*M_PI)) + { + PixelSet(xx,yy,clr); + //--- if arc haven't been drawn before and intersection point of ray 4 and arc is not defined + //--- this means that we (while iterating over points of the ellipse) had just crossed ray 4 + if(!ckw) + { + ckw=true; + if(!ray4) + { + if(MathAbs(fi_c-MathMod(fi4,2*M_PI))MathAbs(fi-fi3)) + PixelSet(x3=xx,y3=yy,clr); + else + { + x3=xx_c; + y3=yy_c; + } + ray3=true; + } + ckw=false; + } + //--- save parameters of the last iteration + xx_c=xx; + yy_c=yy; + fi_c=fi; + //--- iterate counterclockwise + xx=x-dx; + fi=AngleCalc(0,0,-dx,-dy); + if((fi<=fi4 && fi3<=fi) || (fi4>=2*M_PI && fi<=fi4-2*M_PI)) + { + PixelSet(xx,yy,clr); + //--- if arc haven't been drawn before and intersection point of ray 3 and arc is not defined + //--- this means that we (while iterating over points of the ellipse) had just crossed ray 3 + if(!ackw) + { + ackw=true; + if(!ray3) + { + if(MathAbs(fi_a-fi3)MathAbs(fi-MathMod(fi4,2*M_PI))) + PixelSet(x4=xx,y4=yy,clr); + else + { + x4=xx_a; + y4=yy_a; + } + ray4=true; + } + ackw=false; + } + //--- save parameters of the last iteration + xx_a=xx; + yy_a=yy; + fi_a=fi; + } + //--- calculate coordinates of the next point + if(f>=0) + { + dy--; + f-=(rx_sq<<2)*dy; + } + f+=(ry_sq<<1)*(3+(dx<<1)); + dx++; + } + //--- if arc has been drawn clockwise "to the end" and ray 3 had not been found + if(ckw && !ray3) + { + fi=AngleCalc(0,0,dx,-dy); + if(MathAbs(fi_c-fi3)>MathAbs(fi-fi3)) + PixelSet(x3=x+dx,y3=y-dy,clr); + else + { + x3=xx_c; + y3=yy_c; + } + } + //--- if arc has been drawn counterclockwise "to the end" and ray 4 had not been found + if(ackw && !ray4) + { + fi=AngleCalc(0,0,-dx,-dy); + if(MathAbs(fi_a-MathMod(fi4,2*M_PI))>MathAbs(fi-MathMod(fi4,2*M_PI))) + PixelSet(x4=x-dx,y4=y-dy,clr); + else + { + x4=xx_a; + y4=yy_a; + } + } + } +//--- 2 left +//--- +//--- if arc is obviously not within the rays range, don't draw + fi=MathMod(fi4,2*M_PI); + if((fi3>M_PI_2 && fi3<3*M_PI_2) || // ray 3 is in the 2nd or 3rd quadrant + (fi>M_PI_2 && fi<3*M_PI_2) || // ray 4 is in the 2nd or 3rd quadrant + (fi4-fi3>=M_PI)) // arc will pass through the left part of the ellipse + { + dx=rx; + dy=0; + f=(ry_sq<<1)*((dx-1)*dx)+ry_sq+(rx_sq<<1)*(1-ry_sq); + while(ry_sq*dx>=rx_sq*dy) + { + xx=x-dx; + if(dy==0) + { + //--- central point + fi=AngleCalc(0,0,-dx,0); + if((fi<=fi4 && fi3<=fi) || (fi4>=2*M_PI && fi<=fi4-2*M_PI)) + { + PixelSet(xx,y,clr); + ckw=ackw=true; + } + else + ckw=ackw=false; + xx_c=xx; + yy_c=y; + fi_c=fi; + xx_a=xx; + yy_a=y; + fi_a=fi; + } + else + { + //--- iterate clockwise + yy=y-dy; + fi=AngleCalc(0,0,-dx,-dy); + if((fi<=fi4 && fi3<=fi) || (fi4>=2*M_PI && fi<=fi4-2*M_PI)) + { + PixelSet(xx,yy,clr); + //--- if arc haven't been drawn before and intersection point of ray 4 and arc is not defined + //--- this means that we (while iterating over points of the ellipse) had just crossed ray 4 + if(!ckw) + { + ckw=true; + if(!ray4) + { + if(MathAbs(fi_c-MathMod(fi4,2*M_PI))MathAbs(fi-fi3)) + PixelSet(x3=xx,y3=yy,clr); + else + { + x3=xx_c; + y3=yy_c; + } + ray3=true; + } + ckw=false; + } + //--- save parameters of the last iteration + xx_c=xx; + yy_c=yy; + fi_c=fi; + //--- iterate counterclockwise + yy=y+dy; + fi=AngleCalc(0,0,-dx,dy); + if((fi<=fi4 && fi3<=fi) || (fi4>=2*M_PI && fi<=fi4-2*M_PI)) + { + PixelSet(xx,yy,clr); + //--- if arc haven't been drawn before and intersection point of ray 3 and arc is not defined + //--- this means that we (while iterating over points of the ellipse) had just crossed ray 3 + if(!ackw) + { + ackw=true; + if(!ray3) + { + if(MathAbs(fi_a-fi3)MathAbs(fi-MathMod(fi4,2*M_PI))) + PixelSet(x4=xx,y4=yy,clr); + else + { + x4=xx_a; + y4=yy_a; + } + ray4=true; + } + ackw=false; + } + //--- save parameters of the last iteration + xx_a=xx; + yy_a=yy; + fi_a=fi; + } + //--- calculate coordinates of the next point + if(f>=0) + { + dx--; + f-=(ry_sq<<2)*dx; + } + f+=(rx_sq<<1)*(3+(dy<<1)); + dy++; + } + //--- if arc has been drawn clockwise "to the end" and ray 3 had not been found + if(ckw && !ray3) + { + fi=AngleCalc(0,0,-dx,-dy); + if(MathAbs(fi_c-fi3)>MathAbs(fi-fi3)) + PixelSet(x3=x-dx,y3=y-dy,clr); + else + { + x3=xx_c; + y3=yy_c; + } + } + //--- if arc has been drawn counterclockwise "to the end" and ray 4 had not been found + if(ackw && !ray4) + { + fi=AngleCalc(0,0,-dx,dy); + if(MathAbs(fi_a-MathMod(fi4,2*M_PI))>MathAbs(fi-MathMod(fi4,2*M_PI))) + PixelSet(x4=x-dx,y4=y+dy,clr); + else + { + x4=xx_a; + y4=yy_a; + } + } + } +//--- 3 bottom +//--- +//--- if arc is obviously not within the rays range, don't draw + fi=MathMod(fi4,2*M_PI); + if((fi3>M_PI && fi3<2*M_PI) || // ray 3 is in the 3rd or 4th quadrant + (fi>M_PI && fi<2*M_PI) || // ray 4 is in the 3rd or 4th quadrant + (fi4-fi3>=M_PI)) // arc will pass through the bottom of the ellipse + { + dx=0; + dy=ry; + f=(rx_sq<<1)*((dy-1)*dy)+rx_sq+(ry_sq<<1)*(1-rx_sq); + while(rx_sq*dy>=ry_sq*dx) + { + yy=y+dy; + if(dx==0) + { + //--- central point + fi=AngleCalc(0,0,0,dy); + if((fi<=fi4 && fi3<=fi) || (fi4>=2*M_PI && fi<=fi4-2*M_PI)) + { + PixelSet(x,yy,clr); + ckw=ackw=true; + } + else + ckw=ackw=false; + xx_c=x; + yy_c=yy; + fi_c=fi; + xx_a=x; + yy_a=yy; + fi_a=fi; + } + else + { + //--- iterate clockwise + xx=x-dx; + fi=AngleCalc(0,0,-dx,dy); + if((fi<=fi4 && fi3<=fi) || (fi4>=2*M_PI && fi<=fi4-2*M_PI)) + { + PixelSet(xx,yy,clr); + //--- if arc haven't been drawn before and intersection point of ray 4 and arc is not defined + //--- this means that we (while iterating over points of the ellipse) had just crossed ray 4 + if(!ckw) + { + ckw=true; + if(!ray4) + { + if(MathAbs(fi_c-MathMod(fi4,2*M_PI))MathAbs(fi-fi3)) + PixelSet(x3=xx,y3=yy,clr); + else + { + x3=xx_c; + y3=yy_c; + } + ray3=true; + } + ckw=false; + } + //--- save parameters of the last iteration + xx_c=xx; + yy_c=yy; + fi_c=fi; + //--- iterate counterclockwise + xx=x+dx; + fi=AngleCalc(0,0,dx,dy); + if((fi<=fi4 && fi3<=fi) || (fi4>=2*M_PI && fi<=fi4-2*M_PI)) + { + PixelSet(xx,yy,clr); + //--- if arc haven't been drawn before and intersection point of ray 3 and arc is not defined + //--- this means that we (while iterating over points of the ellipse) had just crossed ray 3 + if(!ackw) + { + ackw=true; + if(!ray3) + { + if(MathAbs(fi_a-fi3)MathAbs(fi-MathMod(fi4,2*M_PI))) + PixelSet(x4=xx,y4=yy,clr); + else + { + x4=xx_a; + y4=yy_a; + } + ray4=true; + } + ackw=false; + } + //--- save parameters of the last iteration + xx_a=xx; + yy_a=yy; + fi_a=fi; + } + //--- calculate coordinates of the next point + if(f>=0) + { + dy--; + f-=(rx_sq<<2)*dy; + } + f+=(ry_sq<<1)*(3+(dx<<1)); + dx++; + } + //--- if arc has been drawn clockwise "to the end" and ray 3 had not been found + if(ckw && !ray3) + { + fi=AngleCalc(0,0,-dx,dy); + if(MathAbs(fi_c-fi3)>MathAbs(fi-fi3)) + PixelSet(x3=x-dx,y3=y+dy,clr); + else + { + x3=xx_c; + y3=yy_c; + } + } + //--- if arc has been drawn counterclockwise "to the end" and ray 4 had not been found + if(ackw && !ray4) + { + fi=AngleCalc(0,0,dx,dy); + if(MathAbs(fi_a-MathMod(fi4,2*M_PI))>MathAbs(fi-MathMod(fi4,2*M_PI))) + PixelSet(x4=x+dx,y4=y+dy,clr); + else + { + x4=xx_a; + y4=yy_a; + } + } + } +//--- 4 right +//--- +//--- if arc is obviously not within the rays range, don't draw + fi=MathMod(fi4,2*M_PI); + if((fi33*M_PI_2) || // ray 3 is 1 or 4 quadrant + (fi3*M_PI_2) || // ray 4 is 1 or 4 quadrant + (fi4-fi3>=M_PI)) // arc will pass through the right side of the ellipse + { + dx=rx; + dy=0; + f=(ry_sq<<1)*((dx-1)*dx)+ry_sq+(rx_sq<<1)*(1-ry_sq); + while(ry_sq*dx>=rx_sq*dy) + { + xx=x+dx; + if(dy==0) + { + //--- central point + fi=AngleCalc(0,0,dx,0); + if((fi<=fi4 && fi3<=fi) || (fi4>=2*M_PI && fi<=fi4-2*M_PI)) + { + PixelSet(xx,y,clr); + ckw=ackw=true; + } + else + ckw=ackw=false; + xx_c=xx; + yy_c=y; + fi_c=fi; + xx_a=xx; + yy_a=y; + fi_a=fi; + } + else + { + //--- iterate clockwise + yy=y+dy; + fi=AngleCalc(0,0,dx,dy); + if((fi<=fi4 && fi3<=fi) || (fi4>=2*M_PI && fi<=fi4-2*M_PI)) + { + PixelSet(xx,yy,clr); + //--- if arc haven't been drawn before and intersection point of ray 4 and arc is not defined + //--- this means that we (while iterating over points of the ellipse) had just crossed ray 4 + if(!ckw) + { + ckw=true; + if(!ray4) + { + if(MathAbs(fi_c-MathMod(fi4,2*M_PI))MathAbs(fi-fi3)) + PixelSet(x3=xx,y3=yy,clr); + else + { + x3=xx_c; + y3=yy_c; + } + ray3=true; + } + ckw=false; + } + //--- save parameters of the last iteration + xx_c=xx; + yy_c=yy; + fi_c=fi; + //--- iterate counterclockwise + yy=y-dy; + fi=AngleCalc(0,0,dx,-dy); + if((fi<=fi4 && fi3<=fi) || (fi4>=2*M_PI && fi<=fi4-2*M_PI)) + { + PixelSet(xx,yy,clr); + //--- if arc haven't been drawn before and intersection point of ray 3 and arc is not defined + //--- this means that we (while iterating over points of the ellipse) had just crossed ray 3 + if(!ackw) + { + ackw=true; + if(!ray3) + { + if(MathAbs(MathMod(fi_a,2*M_PI)-fi3)MathAbs(fi-MathMod(fi4,2*M_PI))) + PixelSet(x4=xx,y4=yy,clr); + else + { + x4=xx_a; + y4=yy_a; + } + ray4=true; + } + ackw=false; + } + //--- save parameters of the last iteration + xx_a=xx; + yy_a=yy; + fi_a=fi; + } + //--- calculate coordinates of the next point + if(f>=0) + { + dx--; + f-=(ry_sq<<2)*dx; + } + f+=(rx_sq<<1)*(3+(dy<<1)); + dy++; + } + //--- if arc has been drawn clockwise "to the end" and ray 3 had not been found + if(ckw && !ray3) + { + fi=AngleCalc(0,0,dx,dy); + if(MathAbs(fi_c-fi3)>MathAbs(fi-fi3)) + PixelSet(x3=x+dx,y3=y+dy,clr); + else + { + x3=xx_c; + y3=yy_c; + } + } + //--- if arc has been drawn counterclockwise "to the end" and ray 4 had not been found + if(ackw && !ray4) + { + fi=AngleCalc(0,0,dx,-dy); + if(MathAbs(MathMod(fi_a,2*M_PI)-MathMod(fi4,2*M_PI))>MathAbs(fi-MathMod(fi4,2*M_PI))) + PixelSet(x4=x+dx,y4=y-dy,clr); + else + { + x4=xx_a; + y4=yy_a; + } + } + } + } +//+------------------------------------------------------------------+ +//| Draws ellipse pie | +//+------------------------------------------------------------------+ +void CCanvas::Pie(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,const uint clr,const uint fill_clr) + { + int tmp; + int x,y; +//--- + double fi3; + double fi4; +//--- check + if(x1==x2 || y1==y2) + return; +//--- sort by X + if(x1>x2) + { + tmp=x1; + x1 =x2; + x2 =tmp; + } +//--- sort by Y + if(y1>y2) + { + tmp=y1; + y1 =y2; + y2 =tmp; + } + x =(x2+x1)>>1; + y =(y2+y1)>>1; +//--- check rays + if(x3==x && y3==y) + return; + if(x4==x && y4==y) + return; +//--- calculate parameters of ray x3,y3 + fi3=AngleCalc(x,y,x3,y3); +//--- calculate parameters of ray x4,y4 + fi4=AngleCalc(x,y,x4,y4); +//--- draw pie + Pie(x,y,x2-x,y2-y,fi3,fi4,clr,fill_clr); + } +//+------------------------------------------------------------------+ +//| Draws ellipse pie | +//+------------------------------------------------------------------+ +void CCanvas::Pie(int x,int y,int rx,int ry,double fi3,double fi4,const uint clr,const uint fill_clr) + { + int x3=x; + int y3=y; + int x4=x; + int y4=y; +//--- check + if(rx==0 || ry==0) + return; + if(rx<0) + rx=-rx; + if(ry<0) + ry=-ry; +//--- check rays + if(fi3==fi4) + return; +//--- adjustment for passing through 0 + if(fi4ry) + rx=ry; + double fi=(fi3+fi4)/2; + int xf=x+(int)(0.9*rx*cos(fi)); + int yf=y-(int)(0.9*rx*sin(fi)); + Fill(xf,yf,fill_clr); + } +//+------------------------------------------------------------------+ +//| Draw filled circle | +//+------------------------------------------------------------------+ +void CCanvas::FillCircle(int x,int y,int r,const uint clr) + { + int f =1-r; + int dd_x=1; + int dd_y=-2*r; + int dx =0; + int dy =r; +//--- draw + while(dy>=dx) + { + LineHorizontal(x-dy,x+dy,y-dx,clr); + LineHorizontal(x-dy,x+dy,y+dx,clr); + //--- + if(f>=0) + { + LineHorizontal(x-dx,x+dx,y-dy,clr); + LineHorizontal(x-dx,x+dx,y+dy,clr); + dy--; + dd_y+=2; + f+=dd_y; + } + dx++; + dd_x+=2; + f+=dd_x; + } + } +//+------------------------------------------------------------------+ +//| Draw filled ellipse | +//+------------------------------------------------------------------+ +void CCanvas::FillEllipse(int x1,int y1,int x2,int y2,const uint clr) + { + int x,y; + int rx,ry; + int dx,dy; + int rx_sq,ry_sq; + int f; + int tmp; +//--- handle extreme conditions + if(x1==x2) + { + if(y1==y2) + PixelSet(x1,y1,clr); + else + LineVertical(x1,y1,y2,clr); + return; + } + if(y1==y2) + { + LineHorizontal(x1,x2,y1,clr); + return; + } +//--- sort by X + if(x1>x2) + { + tmp=x1; + x1 =x2; + x2 =tmp; + } +//--- sort by Y + if(y1>y2) + { + tmp=y1; + y1 =y2; + y2 =tmp; + } + x =(x2+x1)>>1; + y =(y2+y1)>>1; + rx=(x2-x1)>>1; + ry=(y2-y1)>>1; + dx=0; + dy=ry; + rx_sq=rx*rx; + ry_sq=ry*ry; + f=(rx_sq<<1)*((dy-1)*dy)+rx_sq+(ry_sq<<1)*(1-rx_sq); + while(rx_sq*dy>ry_sq*(dx)) + { + LineHorizontal(x-dx,x+dx,y+dy,clr); + LineHorizontal(x-dx,x+dx,y-dy,clr); + if(f>=0) + { + dy--; + f-=(rx_sq<<2)*dy; + } + f+=(ry_sq<<1)*(3+(dx<<1)); + dx++; + } + f=(ry_sq<<1)*(dx+1)*dx+(rx_sq<<1)*(dy*(dy-2)+1)+(1-(rx_sq<<1))*ry_sq; + while(dy>=0) + { + LineHorizontal(x-dx,x+dx,y+dy,clr); + LineHorizontal(x-dx,x+dx,y-dy,clr); + if(f<=0) + { + dx++; + f+=(ry_sq<<2)*dx; + } + dy--; + f+=(rx_sq<<1)*(3-(dy<<1)); + } + } +//+------------------------------------------------------------------+ +//| Draw filled rectangle | +//+------------------------------------------------------------------+ +void CCanvas::FillRectangle(int x1,int y1,int x2,int y2,const uint clr) + { + int tmp; +//--- sort vertexes + if(x2=m_width || y1>=m_height) + return; +//--- stay withing screen boundaries + if(x1<0) + x1=0; + if(y1<0) + y1=0; + if(x2>=m_width) + x2=m_width -1; + if(y2>=m_height) + y2=m_height-1; + int len=(x2-x1)+1; +//--- set pixels + for(; y1<=y2; y1++) + ArrayFill(m_pixels,y1*m_width+x1,len,clr); + } +//+------------------------------------------------------------------+ +//| Draw filled triangle | +//+------------------------------------------------------------------+ +void CCanvas::FillTriangle(int x1,int y1,int x2,int y2,int x3,int y3,const uint clr) + { + int xx1,xx2,tmp; + double k1=0,k2=0,xd1,xd2; +//--- sort vertexes from lesser to greater + if(y1>y2) + { + tmp=y2; + y2 =y1; + y1 =tmp; + tmp=x2; + x2 =x1; + x1=tmp; + } + if(y1>y3) + { + tmp=y1; + y1 =y3; + y3 =tmp; + tmp=x1; + x1 =x3; + x3 =tmp; + } + if(y2>y3) + { + tmp=y2; + y2 =y3; + y3 =tmp; + tmp=x2; + x2 =x3; + x3 =tmp; + } +//--- all vertexes are out of image boundaries + if(y3<0 || y1>m_height) + return; + if(x1<0 && x2<0 && x3<0) + return; + if(x1>m_width && x2>m_width && x3>m_width) + return; +//--- find coefficients of lines + if((tmp=y1-y2)!=0) + k1=(x1-x2)/(double)tmp; + if((tmp=y1-y3)!=0) + k2=(x1-x3)/(double)tmp; +//--- + xd1=x1; + xd2=x1; +//--- + for(int i=y1; i<=y3; i++) + { + if(i==y2) + { + if((tmp=y2-y3)!=0) + k1=(x2-x3)/(double)tmp; + xd1=x2; + } + //--- calculate new boundaries of triangle line + xx1 =(int)xd1; + xd1+=k1; + xx2 =(int)xd2; + xd2+=k2; + //--- triangle line is out of screen boundaries + if(i<0 || i>=m_height) + continue; + //--- sort + if(xx1>xx2) + { + tmp=xx1; + xx1=xx2; + xx2=tmp; + } + //--- line is out of screen boundaries + if(xx2<0 || xx1>=m_width) + continue; + //--- draw only what is within screen boundaries + if(xx1<0) + xx1=0; + if(xx2>=m_width) + xx2=m_width-1; + //--- draw horizontal line of triangle + ArrayFill(m_pixels,i*m_width+xx1,xx2-xx1,clr); + } + } +//+------------------------------------------------------------------+ +//| Draw filled poligon | +//+------------------------------------------------------------------+ +void CCanvas::FillPolygon(int &x[],int &y[],const uint clr) + { + static CPoint p[]; + int total=ArraySize(x); + if(total>ArraySize(y)) + total=ArraySize(y); +//--- check + if(total<3) + return; +//--- resize array of points + ArrayResize(p,total); +//--- find top-left point + int imin=0; + int xmin=x[0]; + int ymin=y[0]; + for(int i=1; iymin) + continue; + if(y[i]==ymin) + { + if(x[i]0.0) + xx[1]=xx[3]=ix+1; + if(dy<0.0) + yy[2]=yy[3]=iy-1; + if(dy==0.0) + yy[2]=yy[3]=iy; + if(dy>0.0) + yy[2]=yy[3]=iy+1; +//--- calculate radii and sum of their squares + for(int i=0; i<4; i++) + { + dx=xx[i]-x; + dy=yy[i]-y; + rr[i]=1/(dx*dx+dy*dy); + rrr+=rr[i]; + } +//--- draw pixels + for(int i=0; i<4; i++) + { + k=rr[i]/rrr; + c=PixelGet(xx[i],yy[i]); + a=(uchar)(k*GETRGBA(clr)+(1-k)*GETRGBA(c)); + r=(uchar)(k*GETRGBR(clr)+(1-k)*GETRGBR(c)); + g=(uchar)(k*GETRGBG(clr)+(1-k)*GETRGBG(c)); + b=(uchar)(k*GETRGBB(clr)+(1-k)*GETRGBB(c)); + PixelSet(xx[i],yy[i],ARGB(a,r,g,b)); + } + } +//+------------------------------------------------------------------+ +//| Get line style | +//+------------------------------------------------------------------+ +uint CCanvas::LineStyleGet(void) const + { + switch(m_style) + { + case 0xFFFFFF: + return(STYLE_SOLID); + break; + case 0x3FFFF: + return(STYLE_DASH); + break; + case 0x1C71C7: + return(STYLE_DOT); + break; + case 0x381FF: + return(STYLE_DASHDOT); + break; + case 0x1C71FF: + return(STYLE_DASHDOTDOT); + break; + default: + return (m_style); + break; + } + } +//+------------------------------------------------------------------+ +//| Set line style | +//+------------------------------------------------------------------+ +void CCanvas::LineStyleSet(const uint style) + { + switch(style) + { + case STYLE_SOLID: + m_style=0xFFFFFF; + break; + case STYLE_DASH: + m_style=0x3FFFF; + break; + case STYLE_DOT: + m_style=0x1C71C7; + break; + case STYLE_DASHDOT: + m_style=0x381FF; + break; + case STYLE_DASHDOTDOT: + m_style=0x1C71FF; + break; + default: + //--- high-order bit must be set then custom style + if((style&0x80000000)!=0) + { + m_style=style; + } + break; + } + m_style_idx=0; + } +//+------------------------------------------------------------------+ +//| Draw line with antialiasing (with style) | +//+------------------------------------------------------------------+ +void CCanvas::LineAA(const int x1,const int y1,const int x2,const int y2,const uint clr,const uint style) + { +//--- line is out of image boundaries + if((x1<0 && x2<0) || (y1<0 && y2<0)) + return; + if(x1>=m_width && x2>=m_width) + return; + if(y1>=m_height && y2>=m_height) + return; +//--- check + if(x1==x2 && y1==y2) + { + PixelSet(x1,y1,clr); + return; + } +//--- set the line style + uint prev_style=m_style; + if(style!=UINT_MAX) + LineStyleSet(style); +//--- preliminary calculations + double dx=x2-x1; + double dy=y2-y1; + double xy=sqrt(dx*dx+dy*dy); + double xx=x1; + double yy=y1; + uint mask=1<=fabs(dx) && fabs(y2-yy)>=fabs(dy)); +//--- set last pixel + if((m_style&mask)==mask) + { + PixelSetAA(x2,y2,clr); + } +//--- set the previous line style + if(style!=UINT_MAX) + m_style=prev_style; + } +//+------------------------------------------------------------------+ +//| Draw polyline with antialiasing (with style) | +//+------------------------------------------------------------------+ +void CCanvas::PolylineAA(int &x[],int &y[],const uint clr,const uint style) + { +//--- check arrays + int total=ArraySize(x); + if(total>ArraySize(y)) + total=ArraySize(y); +//--- check + if(total<2) + return; + total--; +//--- set the line style + uint prev_style=m_style; + if(style!=UINT_MAX) + LineStyleSet(style); + uint mask=1<=m_width && x2>=m_width) + { + //--- set the previous line style + if(style!=UINT_MAX) + m_style=prev_style; + return; + } + if(y1>=m_height && y2>=m_height) + { + //--- set the previous line style + if(style!=UINT_MAX) + m_style=prev_style; + return; + } + //--- check + if(x1==x2 && y1==y2) + { + PixelSet(x1,y1,clr); + //--- set the previous line style + if(style!=UINT_MAX) + m_style=prev_style; + return; + } + //--- preliminary calculations + double dx=x2-x1; + double dy=y2-y1; + double xy=sqrt(dx*dx+dy*dy); + double xx=x1; + double yy=y1; + //--- set pixels + dx/=xy; + dy/=xy; + do + { + if((m_style&mask)==mask) + { + PixelSetAA(xx,yy,clr); + } + xx+=dx; + yy+=dy; + mask<<=1; + if(mask==0x1000000) + mask=1; + } + while(fabs(x2-xx)>=fabs(dx) && fabs(y2-yy)>=fabs(dy)); + //--- set last pixel + if((m_style&mask)==mask) + { + PixelSetAA(x2,y2,clr); + } + mask<<=1; + if(mask==0x1000000) + mask=1; + } +//--- set the previous line style + if(style!=UINT_MAX) + m_style=prev_style; + } +//+------------------------------------------------------------------+ +//| Draw polygon with antialiasing (with style) | +//+------------------------------------------------------------------+ +void CCanvas::PolygonAA(int &x[],int &y[],const uint clr,const uint style) + { +//--- check arrays + int total=ArraySize(x); + if(total>ArraySize(y)) + total=ArraySize(y); +//--- check + if(total<2) + return; +//--- set the line style + uint prev_style=m_style; + if(style!=UINT_MAX) + LineStyleSet(style); + uint mask=1<=m_width && x2>=m_width) + { + //--- set the previous line style + if(style!=UINT_MAX) + m_style=prev_style; + return; + } + if(y1>=m_height && y2>=m_height) + { + //--- set the previous line style + if(style!=UINT_MAX) + m_style=prev_style; + return; + } + //--- check + if(x1==x2 && y1==y2) + { + PixelSet(x1,y1,clr); + //--- set the previous line style + if(style!=UINT_MAX) + m_style=prev_style; + return; + } + //--- preliminary calculations + double dx=x2-x1; + double dy=y2-y1; + double xy=sqrt(dx*dx+dy*dy); + double xx=x1; + double yy=y1; + //--- set pixels + dx/=xy; + dy/=xy; + do + { + if((m_style&mask)==mask) + { + PixelSetAA(xx,yy,clr); + } + xx+=dx; + yy+=dy; + mask<<=1; + if(mask==0x1000000) + mask=1; + } + while(fabs(x2-xx)>=fabs(dx) && fabs(y2-yy)>=fabs(dy)); + //--- set last pixel + if((m_style&mask)==mask) + { + PixelSetAA(x2,y2,clr); + } + } +//--- set the previous line style + if(style!=UINT_MAX) + m_style=prev_style; + } +//+------------------------------------------------------------------+ +//| Draw triangle with antialiasing | +//+------------------------------------------------------------------+ +void CCanvas::TriangleAA(const int x1,const int y1,const int x2,const int y2,const int x3,const int y3,const uint clr,const uint style) + { +//--- draw + int x[3]; + int y[3]; + x[0] = x1; + x[1] = x2; + x[2] = x3; + y[0] = y1; + y[1] = y2; + y[2] = y3; + PolygonAA(x,y,clr,style); + } +//+------------------------------------------------------------------+ +//| Draw circle with antialiasing | +//+------------------------------------------------------------------+ +void CCanvas::CircleAA(const int x,const int y,const double r,const uint clr,const uint style=UINT_MAX) + { + if(r<=0) + return; +//--- preliminary calculations + double xx=x+r; + double yy=y; + double fi=0; + double df=M_PI_2/MathCeil(r); +//--- set the line style + uint prev_style=m_style; + if(style!=UINT_MAX) + LineStyleSet(style); + uint mask=1<M_PI) + df/=2; + do + { + xx=x+r*cos(fi); + yy=y-r*sin(fi); + if((m_style&mask)==mask) + PixelSetAA(xx,yy,clr); + mask<<=1; + if(mask==0x1000000) + mask=1; + fi+=df; + } + while(fabs(2*M_PI-fi)>=df/2); +//--- set the previous line style + if(style!=UINT_MAX) + m_style=prev_style; + } +//+------------------------------------------------------------------+ +//| Draw ellipse with antialiasing | +//+------------------------------------------------------------------+ +void CCanvas::EllipseAA(const double x1,const double y1,const double x2,const double y2,const uint clr,const uint style=UINT_MAX) + { + double rx = (x2-x1)/2; + double ry = (y2-y1)/2; +//--- preliminary calculations + double x=(x2>x1) ? x1+rx : x2+rx; + double y=(y2>y1) ? y1+ry : y2+ry; + double rx2=rx*rx; + double ry2=ry*ry; +//--- set the line style + uint prev_style=m_style; + if(style!=UINT_MAX) + LineStyleSet(style); + uint mask=1<ym) + continue; + if((p[i].y==ym) && (p[i].x>xm)) + continue; + im=i; + xm=p[i].x; + ym=p[i].y; + } +//--- check the orientation of triangle + return PointClassify(p[(im-1+total)%total],p[im],p[(im+1)%total]); + } +//+------------------------------------------------------------------+ +//| Checks convexity of polygon | +//+------------------------------------------------------------------+ +bool CCanvas::IsPolygonConvex(CPoint &p[]) + { + int total=ArraySize(p); +//--- triangle - always convex + if(total==3) + return(true); + int res=SIGN(PointClassify(p[0],p[1],p[2])); + for(int i=1; iymin) + continue; + if(p[i].y==ymin) + { + if(p[i].xp[il].y) + return; + if(yy!=p[il].y) + { + dl=(p[il].x-xl)/(p[il].y-yy); + //--- make adjustment for half of left increment dl/2 + LineHorizontal((int)MathCeil(xl+dl/2),(int)MathFloor(xl),yy,clr); + xl+=dl/2; + } + else + LineHorizontal((int)MathCeil(xl),(int)MathFloor(p[il].x),yy,clr); + } + while(yy==p[ir].y) + { + ir=(ir+1)%total; + if(yy>p[ir].y) + return; + if(yy!=p[ir].y) + { + dr=(p[ir].x-xr)/(p[ir].y-yy); + //--- make adjustment for half of right increment dr/2 + LineHorizontal((int)MathCeil(xr),(int)MathFloor(xr+dr/2),yy,clr); + xr+=dr/2; + } + else + LineHorizontal((int)MathCeil(p[ir].x),(int)MathFloor(xr),yy,clr); + } + yy++; + if(yy==p[il].y) + xl=p[il].x; + else + xl+=dl; + if(yy==p[ir].y) + xr=p[ir].x; + else + xr+=dr; + LineHorizontal((int)MathCeil(xl),(int)MathFloor(xr),yy,clr); + } + while(il>=ir && ir!=0); + } +//+------------------------------------------------------------------+ +//| Draw line according to Wu's algorithm | +//+------------------------------------------------------------------+ +void CCanvas::LineWu(int x1,int y1,int x2,int y2,const uint clr,const uint style=UINT_MAX) + { +//--- calculating the variation of the coordinates + int dx = (x2 > x1) ? (x2 - x1) : (x1 - x2); + int dy = (y2 > y1) ? (y2 - y1) : (y1 - y2); +//--- set the line style + uint prev_style=m_style; + if(style!=UINT_MAX) + LineStyleSet(style); + uint mask=1<y2) + { + tmp=y1; + y1 =y2; + y2 =tmp; + } + //--- line is out of image boundaries + if(y2<0 || y1>=m_height || x1<0 || x1>=m_width) + { + //--- set the previous line style + if(style!=UINT_MAX) + m_style=prev_style; + return; + } + //--- stay withing image boundaries + if(y1<0) + y1=0; + if(y2>=m_height-1) + y2=m_height-1; + //--- draw line + int index=y1*m_width+x1; + for(int i=y1; i<=y2; i++,index+=m_width) + { + if((m_style&mask)==mask) + m_pixels[index]=clr; + + mask<<=1; + if(mask==0x1000000) + mask=1; + } + //--- set the previous line style + if(style!=UINT_MAX) + m_style=prev_style; + //--- success + return; + } +//--- check if dy==0 then draw horizontal line + if(dy==0) + { + //--- sort by X + if(x1>x2) + { + tmp=x1; + x1 =x2; + x2 =tmp; + } + //--- line is out of image boundaries + if(x2<0 || x1>=m_width || y1<0 || y1>=m_height) + { + //--- set the previous line style + if(style!=UINT_MAX) + m_style=prev_style; + return; + } + //--- stay withing image boundaries + if(x1<0) + x1=0; + if(x2>=m_width) + x2=m_width-1; + //--- draw line + for(int i=0,index=y1*m_width+x1; i 1) + else + { + //--- first point has to have a smaller Y coordinate + if(y2ArraySize(y)) + total=ArraySize(y); +//--- check + if(total<2) + return; + total--; +//--- set the line style + uint prev_style=m_style; + if(style!=UINT_MAX) + LineStyleSet(style); + uint mask=1< x1) ? (x2 - x1) : (x1 - x2); + int dy = (y2 > y1) ? (y2 - y1) : (y1 - y2); + int tmp; + //--- check if dx==0 then draw vertical line + if(dx==0) + { + //--- sort by Y + if(y1>y2) + { + tmp=y1; + y1 =y2; + y2 =tmp; + } + //--- line is out of image boundaries + if(y2<0 || y1>=m_height || x1<0 || x1>=m_width) + continue; + //--- stay withing image boundaries + if(y1<0) + y1=0; + if(y2>=m_height-1) + y2=m_height-1; + //--- draw line + int index=y1*m_width+x1; + for(int j=y1; j<=y2; j++,index+=m_width) + { + if((m_style&mask)==mask) + m_pixels[index]=clr; + + mask<<=1; + if(mask==0x1000000) + mask=1; + } + continue; + } + //--- check if dy==0 then draw horizontal line + if(dy==0) + { + //--- sort by X + if(x1>x2) + { + tmp=x1; + x1 =x2; + x2 =tmp; + } + //--- line is out of image boundaries + if(x2<0 || x1>=m_width || y1<0 || y1>=m_height) + continue; + //--- stay withing image boundaries + if(x1<0) + x1=0; + if(x2>=m_width) + x2=m_width-1; + //--- draw line + for(int j=0,index=y1*m_width+x1; j 1) + else + { + //--- first point has to have a smaller Y coordinate + if(y2ArraySize(y)) + total=ArraySize(y); +//--- check + if(total<2) + return; +//--- set the line style + uint prev_style=m_style; + if(style!=UINT_MAX) + LineStyleSet(style); + uint mask=1< x1) ? (x2 - x1) : (x1 - x2); + int dy = (y2 > y1) ? (y2 - y1) : (y1 - y2); + int tmp; + //--- check if dx==0 then draw vertical line + if(dx==0) + { + //--- sort by Y + if(y1>y2) + { + tmp=y1; + y1 =y2; + y2 =tmp; + } + //--- line is out of image boundaries + if(y2<0 || y1>=m_height || x1<0 || x1>=m_width) + continue; + //--- stay withing image boundaries + if(y1<0) + y1=0; + if(y2>=m_height-1) + y2=m_height-1; + //--- draw line + int index=y1*m_width+x1; + for(int j=y1; j<=y2; j++,index+=m_width) + { + if((m_style&mask)==mask) + m_pixels[index]=clr; + + mask<<=1; + if(mask==0x1000000) + mask=1; + } + continue; + } + //--- check if dy==0 then draw horizontal line + if(dy==0) + { + //--- sort by X + if(x1>x2) + { + tmp=x1; + x1 =x2; + x2 =tmp; + } + //--- line is out of image boundaries + if(x2<0 || x1>=m_width || y1<0 || y1>=m_height) + continue; + //--- stay withing image boundaries + if(x1<0) + x1=0; + if(x2>=m_width) + x2=m_width-1; + //--- draw line + for(int j=0,index=y1*m_width+x1; j 1) + else + { + //--- first point has to have a smaller Y coordinate + if(y2x1) ? x1+rx : x2+rx; + int y=(y2>y1) ? y1+ry : y2+ry; + if(rx<=0 || ry<=0) + return; +//--- set the line style + uint prev_style=m_style; + if(style!=UINT_MAX) + LineStyleSet(style); + uint mask=1<0) + LineWu(x,y1,x,y2,clr,style); + return; + } +//--- r be the filter radius (and also the half-width of the wide line) + double r=(size/2.0); +//--- primary calculate + int dy=MathAbs(y2-y1); + int sign=(y10) + LineWu(x1,y,x2,y,clr,style); + return; + } +//--- r be the filter radius (and also the half-width of the wide line) + double r=(size/2.0); +//--- primary calculate + int dx=MathAbs(x2-x1); + int sign=(x10) + LineWu(x1,y1,x2,y2,clr,style); + return; + } +//--- r be the filter radius (and also the half-width of the wide line) + double r=(size/2.0); +//--- compute x and y deltas + double dx=MathAbs(x2-x1); + double dy=MathAbs(y2-y1); + if(dx==0) + { + LineThickVertical(x1,y1,y2,clr,size,style,end_style); + return; + } + if(dy==0) + { + LineThickHorizontal(x1,x2,y1,clr,size,style,end_style); + return; + } +//--- compute the linear coefficients of the two (scaled) edge functions + double k=MathArctan(dx/dy); + double rcos_k=r*cos(k); + double rsin_k=r*sin(k); +//--- set the line style + uint prev_style=m_style; + if(style!=UINT_MAX) + LineStyleSet(style); + uint mask=1<0) + PolylineWu(x,y,clr,style); + return; + } +//--- check arrays + int total=ArraySize(x); + if(total>ArraySize(y)) + total=ArraySize(y); +//--- check + if(total<2) + return; + total--; +//--- r be the filter radius (and also the half-width of the wide line) + double r=(size/2.0); +//--- + double gap=1.0; +//--- set the line style + uint prev_style=m_style; + if(style!=UINT_MAX) + LineStyleSet(style); + uint mask=1<0) + PolylineWu(x,y,clr,style); + return; + } +//--- check arrays + int total=ArraySize(x); + if(total>ArraySize(y)) + total=ArraySize(y); +//--- check + if(total<2) + return; +//--- r be the filter radius (and also the half-width of the wide line) + double r=(size/2.0); +//--- + double gap=1.0; +//--- set the line style + uint prev_style=m_style; + if(style!=UINT_MAX) + LineStyleSet(style); + uint mask=1<>16) &0xff) - + uint((clr1>>16) &0xff)); + uint dg=MathAbs(uint((clr0>>8) &0xff) - + uint((clr1>>8) &0xff)); + uint db=MathAbs(uint((clr0>>0) &0xff) - + uint((clr1>>0) &0xff)); +//--- return + return (dr<=threshould || dg<=threshould || db<=threshould); + } +//+------------------------------------------------------------------+ +//| Calculate and set new color | +//+------------------------------------------------------------------+ +void CCanvas::PixelTransform(const int x,const int y,const uint clr,const double alpha) + { + int index=y*m_width+x; +//--- check + if(x<0 || y<0 || x>m_width || y>m_height || index>=ArraySize(m_pixels)) + return; +//--- check alpha + if(alpha==1) + { + m_pixels[index]=clr; + return; + } +//--- get pixel color + uint clr0=m_pixels[index]; +//--- transform of color component for the background + double r0 = ((clr0>>16) & 0xFF) * (1.0-alpha); + double g0 = ((clr0>>8) & 0xFF) * (1.0-alpha); + double b0 = ((clr0>>0) & 0xFF) * (1.0-alpha); +//--- transform of color component + double r1 = ((clr>>16) & 0xFF) * (alpha); + double g1 = ((clr>>8) & 0xFF) * (alpha); + double b1 = ((clr>>0) & 0xFF) * (alpha); +//--- components of the new color + int r = (int)(r0+r1); + int g = (int)(g0+g1); + int b = (int)(b0+b1); +//--- set new color + m_pixels[y*m_width+x]=((r<<16)|(g<<8)|(b<<0)|(255<<24)); + } +//+------------------------------------------------------------------+ +//| Draw 4 pixel with PixelTransform method | +//+------------------------------------------------------------------+ +void CCanvas::PixelTransform4(const int x,const int y,const int dx,const int dy,const uint clr,const double alpha) + { + PixelTransform(x+dx,y+dy,clr,alpha); + PixelTransform(x-dx,y+dy,clr,alpha); + PixelTransform(x+dx,y-dy,clr,alpha); + PixelTransform(x-dx,y-dy,clr,alpha); + } +//+------------------------------------------------------------------+ +//| Draw 4 pixel with antialiasing | +//+------------------------------------------------------------------+ +void CCanvas::PixelSet4AA(const double x,const double y,const double dx,const double dy,const uint clr) + { + PixelSetAA(x+dx,y+dy,clr); + PixelSetAA(x-dx,y+dy,clr); + PixelSetAA(x+dx,y-dy,clr); + PixelSetAA(x-dx,y-dy,clr); + } +//+------------------------------------------------------------------+ +//| Draw solid segment for vertical thick line | +//+------------------------------------------------------------------+ +void CCanvas::SegmentVertical(const int x,const int y1,const int y2,const int ysign,const double r,const uint clr,ENUM_LINE_END end_style) + { +//--- compute the constol points of the solid segment + int ye1,ye2; + int ys1,ys2; + switch(end_style) + { + case LINE_END_ROUND: + { + ye1=y1; + ye2=y2; + ys1=y1-(int)(ysign*r); + ys2=y2+(int)(ysign*r); + break; + } + case LINE_END_BUTT: + { + ye1=y1; + ye2=y2; + ys1=y1; + ys2=y2; + break; + } + case LINE_END_SQUARE: + { + ye1=y1-(int)(ysign*r); + ye2=y2+(int)(ysign*r); + ys1=ye1; + ys2=ye2; + break; + } + default: + return; + }; +//--- darw solid segment + for(int i=0; i<=MathAbs(ys2-ys1); i++) + { + double yi=ys1+(ysign*i); + for(int j=0; j<2*r; j++) + { + double xi=x-r+j; + double dist=DistancePointSegment(xi,yi,x,ye1,x,ye2); + double val=MathAbs(dist/r); + PixelTransform((int)xi,(int)yi,clr,FilterFunction(val)); + } + } + } +//+------------------------------------------------------------------+ +//| Draw solid segment for horizontal thick line | +//+------------------------------------------------------------------+ +void CCanvas::SegmentHorizontal(const int x1,const int x2,const int y,const int xsign,const double r,const uint clr,ENUM_LINE_END end_style) + { +//--- compute the constol points of the solid segment + int xe1,xe2; + int xs1,xs2; + switch(end_style) + { + case LINE_END_ROUND: + { + xe1=x1; + xe2=x2; + xs1=x1-(int)(xsign*r); + xs2=x2+(int)(xsign*r); + break; + } + case LINE_END_BUTT: + { + xe1=x1; + xe2=x2; + xs1=x1; + xs2=x2; + break; + } + case LINE_END_SQUARE: + { + xe1=x1-(int)(xsign*r); + xe2=x2+(int)(xsign*r); + xs1=xe1; + xs2=xe2; + break; + } + default: + return; + }; +//--- draw solid segment + for(int i=0; i<=MathAbs(xs2-xs1); i++) + { + double xi=xs1+(xsign*i); + for(int j=0; j<2*r; j++) + { + double yi=y-r+j; + double dist=DistancePointSegment(xi,yi,xe1,y,xe2,y); + double val=MathAbs(dist/r); + PixelTransform((int)xi,(int)yi,clr,FilterFunction(val)); + } + } + } +//+------------------------------------------------------------------+ +//| Draw solid segment for thick line | +//+------------------------------------------------------------------+ +void CCanvas::Segment(const int x1,const int y1,const int x2,const int y2,const double kp0,const double kp1,const int xsign,const int ysign, + const double rcos_k,const double rsin_k,const double r,const uint clr,ENUM_LINE_END end_style) + { + if(x1==x2 && y1==y2) + return; + if(x1==x2) + { + SegmentVertical(x1,y1,y2,ysign,r,clr,end_style); + return; + } + if(y1==y2) + { + SegmentHorizontal(x1,x2,y1,xsign,r,clr,end_style); + return; + } +//--- compute the constol points of the solid segment + int xe1,ye1,xe2,ye2; + int xs1,ys1,xs2,ys2; + switch(end_style) + { + case LINE_END_ROUND: + { + xe1=x1; + ye1=y1; + xe2=x2; + ye2=y2; + xs1=x1-(xsign)*(int)(rsin_k); + ys1=y1-(ysign)*(int)(rcos_k); + xs2=x2+(xsign)*(int)(rsin_k); + ys2=y2+(ysign)*(int)(rcos_k); + break; + } + case LINE_END_BUTT: + { + xe1=x1; + ye1=y1; + xe2=x2; + ye2=y2; + xs1=x1; + ys1=y1; + xs2=x2; + ys2=y2; + break; + } + case LINE_END_SQUARE: + { + xe1=x1-(xsign)*(int)(rsin_k); + ye1=y1-(ysign)*(int)(rcos_k); + xe2=x2+(xsign)*(int)(rsin_k); + ye2=y2+(ysign)*(int)(rcos_k); + xs1=xe1; + ys1=ye1; + xs2=xe2; + ys2=ye2; + break; + } + default: + return; + }; +//--- compute the four corners of the wide line + double p0x=xs1+(xsign)*(rcos_k); + double p0y=ys1-(ysign)*(rsin_k); + double p1x=xs1-(xsign)*(rcos_k); + double p1y=ys1+(ysign)*(rsin_k); + double p2x=xs2+(xsign)*(rcos_k); + double p2y=ys2-(ysign)*(rsin_k); + double p3x=xs2-(xsign)*(rcos_k); + double p3y=ys2+(ysign)*(rsin_k); +//--- draw solid segment + if(MathAbs(kp0)>=1) + { + double xi0,xi1; + double height=MathAbs(p3y-p0y); + for(int i=0; i<=height; i++) + { + double y=p0y+(ysign*i); + double xi00 = MathRound(p0x + (y-p0y)/kp0); + double xi01 = MathRound(p1x + (y-p1y)/kp1); + double xi02 = MathRound(p2x + (y-p2y)/kp1); + double xi03 = MathRound(p3x + (y-p3y)/kp0); + if(xsign==1) + { + xi0 = MathMax(xi00,xi01); + xi1 = MathMin(xi02,xi03); + } + else + { + xi0 = MathMin(xi00,xi01); + xi1 = MathMax(xi02,xi03); + } + double width=MathAbs(MathRound(xi1-xi0)); + for(int j=0; j<=width; j++) + { + double xi=xi0+(xsign*j); + double dist=DistancePointSegment(xi,y,xe1,ye1,xe2,ye2); + double val = MathAbs(dist/r); + PixelTransform((int)xi,(int)y,clr,FilterFunction(val)); + } + } + } + else + { + double yi0,yi1; + double width=MathAbs(p2x-p1x); + for(int i=0; i<=width; i++) + { + double x=p1x+(xsign*i); + double yi00 = MathRound(p0y + (x-p0x)*kp0); + double yi01 = MathRound(p1y + (x-p1x)*kp1); + double yi02 = MathRound(p2y + (x-p2x)*kp1); + double yi03 = MathRound(p3y + (x-p3x)*kp0); + if(ysign==1) + { + yi0 = MathMax(yi00,yi02); + yi1 = MathMin(yi01,yi03); + } + else + { + yi0 = MathMin(yi00,yi02); + yi1 = MathMax(yi01,yi03); + } + double height=MathAbs(yi1-yi0); + for(int j=0; j<=height; j++) + { + double yi=yi0+(ysign*j); + double dist=DistancePointSegment(x,yi,xe1,ye1,xe2,ye2); + double val=MathAbs(dist/r); + PixelTransform((int)x,(int)yi,clr,FilterFunction(val)); + } + } + } + } +//+------------------------------------------------------------------+ +//| Filter function for calculating alpha channel | +//+------------------------------------------------------------------+ +double CCanvas::FilterFunction(const double x) + { + if(x<=0.8) + return(1.0); + else + return MathExp(-(x-0.8)*(x-0.8)*50); + } +//+------------------------------------------------------------------+ +//| Calculate distance between point and segment | +//+------------------------------------------------------------------+ +double CCanvas::DistancePointSegment(const double px,const double py,const double x1,const double y1,const double x2,const double y2) + { +//--- primary calculate + double a=(px-x1)*(px-x1)+(py-y1)*(py-y1); + double b=(px-x2)*(px-x2)+(py-y2)*(py-y2); + double c=(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1); +//--- check + if(a>=b+c) + return (MathSqrt(b)); + if(b>=a+c) + return (MathSqrt(a)); +//--- calculate distance + a=MathSqrt(a); + b=MathSqrt(b); + c=MathSqrt(c); + double p=(a+b+c)/2; + double s=MathSqrt((p-a)*(p-b)*(p-c)*p); +//--- check distance + if(MathIsValidNumber(s)) + return(s*2.0/c); + else + return(0); + } +//+------------------------------------------------------------------+ +//| Draw smothing polyline | +//+------------------------------------------------------------------+ +void CCanvas::PolylineSmooth(const int &x[],const int &y[],const uint clr,const int size,ENUM_LINE_STYLE style=STYLE_SOLID, + ENUM_LINE_END end_style=LINE_END_ROUND,double tension=0.5,double step=10) + { +//--- + int arr_size= ArraySize(x); + if(arr_size!=ArraySize(y)) + return; +//--- + double x1,x2,y1,y2; + tension*=0.3; +//--- coordinates of Bezier curve + int xc[]; + int yc[]; +//--- initialize control points + double ptX[]; + double ptY[]; + int size_pt=arr_size*3-2; + + ArrayResize(ptX,size_pt); + ArrayResize(ptY,size_pt); +//--- calculation of control points + CalcCurveBezierEndp(x[0],y[0],x[1],y[1],tension,x1,y1); + + ptX[0] = x[0]; + ptY[0] = y[0]; + ptX[1] = x1; + ptY[1] = y1; + + for(int i=0; i0.0) ?(int)(distance/step) : 1; + if(size_i<1) + size_i=2; + ArrayResize(xc,ArraySize(xc)+size_i,1024); + ArrayResize(yc,ArraySize(yc)+size_i,1024); + for(int t=0; t0.0) ?(int)(distance/step) : 1; + if(size_i<1) + size_i=2; + ArrayResize(xc,ArraySize(xc)+size_i,1024); + ArrayResize(yc,ArraySize(yc)+size_i,1024); + for(int t=0; t0.0) ?(int)(distance/step) : 1; + if(size_i<1) + size_i=2; + ArrayResize(xc,ArraySize(xc)+size_i,1024); + ArrayResize(yc,ArraySize(yc)+size_i,1024); + for(int t=0; t +#include +#include +//--- enumerations +enum ENUM_SHOW_FLAGS + { + FLAG_SHOW_NONE =0, + FLAG_SHOW_LEGEND =1, + FLAG_SHOW_SCALE_LEFT =2, + FLAG_SHOW_SCALE_RIGHT =4, + FLAG_SHOW_SCALE_TOP =8, + FLAG_SHOW_SCALE_BOTTOM=16, + FLAG_SHOW_GRID =32, + FLAG_SHOW_DESCRIPTORS =64, + FLAG_SHOW_VALUE =128, + FLAG_SHOW_PERCENT =256, + FLAGS_SHOW_SCALES =(FLAG_SHOW_SCALE_LEFT+FLAG_SHOW_SCALE_RIGHT+ + FLAG_SHOW_SCALE_TOP+FLAG_SHOW_SCALE_BOTTOM), + FLAGS_SHOW_ALL =(FLAG_SHOW_LEGEND+FLAGS_SHOW_SCALES+FLAG_SHOW_GRID+ + FLAG_SHOW_DESCRIPTORS+FLAG_SHOW_VALUE+FLAG_SHOW_PERCENT) + }; +enum ENUM_ALIGNMENT + { + ALIGNMENT_LEFT = 1, // align by left border + ALIGNMENT_TOP = 2, // align by top border + ALIGNMENT_RIGHT = 4, // align by right border + ALIGNMENT_BOTTOM = 8 // align by bottom border + }; +//--- macro +#define IS_SHOW_LEGEND ((m_show_flags&FLAG_SHOW_LEGEND) !=0) +#define IS_SHOW_SCALES ((m_show_flags&FLAGS_SHOW_SCALES) !=0) +#define IS_SHOW_SCALE_LEFT ((m_show_flags&FLAG_SHOW_SCALE_LEFT) !=0) +#define IS_SHOW_SCALE_RIGHT ((m_show_flags&FLAG_SHOW_SCALE_RIGHT) !=0) +#define IS_SHOW_SCALE_TOP ((m_show_flags&FLAG_SHOW_SCALE_TOP) !=0) +#define IS_SHOW_SCALE_BOTTOM ((m_show_flags&FLAG_SHOW_SCALE_BOTTOM)!=0) +#define IS_SHOW_GRID ((m_show_flags&FLAG_SHOW_GRID) !=0) +#define IS_SHOW_DESCRIPTORS ((m_show_flags&FLAG_SHOW_DESCRIPTORS) !=0) +#define IS_SHOW_VALUE ((m_show_flags&FLAG_SHOW_VALUE) !=0) +#define IS_SHOW_PERCENT ((m_show_flags&FLAG_SHOW_PERCENT) !=0) +//+------------------------------------------------------------------+ +//| Class CChartCanvas | +//| Usage: base class for graphical charts | +//+------------------------------------------------------------------+ +class CChartCanvas : public CCanvas + { +protected: + //--- colors + uint m_color_background; + uint m_color_border; + uint m_color_text; + uint m_color_grid; + //--- adjusted parameters + uint m_max_data; + uint m_max_descr_len; + uint m_allowed_show_flags; + uint m_show_flags; + ENUM_ALIGNMENT m_legend_alignment; + uint m_threshold_drawing; + bool m_accumulative; + //--- parameters for scales and grid + double m_v_scale_min; + double m_v_scale_max; + uint m_num_grid; + int m_scale_digits; + //--- data + int m_data_offset; + uint m_data_total; + CArray *m_data; + CArrayInt m_colors; + CArrayString m_descriptors; + //--- + CArrayInt m_index; + uint m_index_size; + double m_sum; + double m_others; + uint m_max_descr_width; + uint m_max_value_width; + //--- variables + CRect m_data_area; + //--- variables for scaling and scales + double m_scale_x; + int m_x_min; + int m_x_0; + int m_x_max; + int m_dx_grid; + double m_scale_y; + int m_y_min; + int m_y_0; + int m_y_max; + int m_dy_grid; + string m_scale_text[]; + +public: + CChartCanvas(void); + ~CChartCanvas(void); + //--- create + virtual bool Create(const string name,const int width,const int height,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA); + //--- colors + uint ColorBackground(void) const { return(m_color_background); } + void ColorBackground(const uint value); + uint ColorBorder(void) const { return(m_color_border); } + void ColorBorder(const uint value); + uint ColorText(void) const { return(m_color_text); } + void ColorText(const uint value); + uint ColorGrid(void) const { return(m_color_grid); } + void ColorGrid(const uint value) { m_color_grid=value; } + //--- adjusted parameters + uint MaxData(void) const { return(m_max_data); } + void MaxData(const uint value); + uint MaxDescrLen(void) const { return(m_max_descr_len); } + void MaxDescrLen(const uint value); + //--- show flags + void AllowedShowFlags(const uint flags); + uint ShowFlags(void) const { return(m_show_flags); } + void ShowFlags(const uint flags); + bool IsShowLegend(void) const { return(IS_SHOW_LEGEND); } + bool IsShowScaleLeft(void) const { return(IS_SHOW_SCALE_LEFT); } + bool IsShowScaleRight(void) const { return(IS_SHOW_SCALE_RIGHT); } + bool IsShowScaleTop(void) const { return(IS_SHOW_SCALE_TOP); } + bool IsShowScaleBottom(void) const { return(IS_SHOW_SCALE_BOTTOM); } + bool IsShowGrid(void) const { return(IS_SHOW_GRID); } + bool IsShowDescriptors(void) const { return(IS_SHOW_DESCRIPTORS); } + bool IsShowPercent(void) const { return(IS_SHOW_PERCENT); } + void ShowLegend(const bool flag=true); + void ShowScaleLeft(const bool flag=true); + void ShowScaleRight(const bool flag=true); + void ShowScaleTop(const bool flag=true); + void ShowScaleBottom(const bool flag=true); + void ShowGrid(const bool flag=true); + void ShowDescriptors(const bool flag=true); + void ShowValue(const bool flag=true); + void ShowPercent(const bool flag=true); + void LegendAlignment(const ENUM_ALIGNMENT value); + void Accumulative(const bool flag=true); + //--- for scales and grid + double VScaleMin(void) const { return(m_v_scale_min); } + void VScaleMin(const double value); + double VScaleMax(void) const { return(m_v_scale_max); } + void VScaleMax(const double value); + uint NumGrid(void) const { return(m_num_grid); } + void NumGrid(const uint value); + void VScaleParams(const double max,const double min,const uint grid); + //--- state + int DataOffset(void) const { return(m_data_offset); } + void DataOffset(const int value); + //--- data + uint DataTotal(void) const { return(m_data_total); } + bool DescriptorUpdate(const uint pos,const string descr); + bool ColorUpdate(const uint pos,const uint clr); + +protected: + virtual void ValuesCheck(void); + virtual void Redraw(void); + virtual void DrawBackground(void); + virtual void DrawLegend(void); + int DrawLegendVertical(const int w,const int h); + int DrawLegendHorizontal(const int w,const int h); + virtual void CalcScales(void); + virtual void DrawScales(void); + virtual int DrawScaleLeft(const bool draw=true); + virtual int DrawScaleRight(const bool draw=true); + virtual int DrawScaleTop(const bool draw=true); + virtual int DrawScaleBottom(const bool draw=true); + virtual void DrawGrid(void); + virtual void DrawDescriptors(void) {} + virtual void DrawChart(void); + virtual void DrawData(const uint idx=0) {} + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CChartCanvas::CChartCanvas(void) : m_color_background(XRGB(0xFF,0xFF,0xFF)), + m_color_border(XRGB(0x9F,0x9F,0x9F)), + m_color_text(XRGB(0x3F,0x3F,0x3F)), + m_color_grid(XRGB(0xCF,0xCF,0xCF)), + m_max_data(10), + m_max_descr_len(10), + m_allowed_show_flags(FLAGS_SHOW_ALL), + m_show_flags(FLAG_SHOW_NONE), + m_legend_alignment(ALIGNMENT_BOTTOM), + m_threshold_drawing(2), + m_accumulative(false), + m_data_offset(0), + m_data_total(0), + m_data(NULL), + m_v_scale_min(0.0), + m_v_scale_max(10.0), + m_num_grid(5), + m_scale_digits(0) + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CChartCanvas::~CChartCanvas(void) + { + if(m_data!=NULL) + delete m_data; + } +//+------------------------------------------------------------------+ +//| Create dynamic resource | +//+------------------------------------------------------------------+ +bool CChartCanvas::Create(const string name,const int width,const int height,ENUM_COLOR_FORMAT clrfmt) + { +//--- call method of parent class + if(!CCanvas::Create(name,width,height,clrfmt)) + return(false); +//--- set font + FontSet("Tahoma",-100); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Sets background color | +//+------------------------------------------------------------------+ +void CChartCanvas::ColorBackground(const uint value) + { + m_color_background=value; +//--- redraw + if(m_data_total>0) + Redraw(); + } +//+------------------------------------------------------------------+ +//| Sets border color | +//+------------------------------------------------------------------+ +void CChartCanvas::ColorBorder(const uint value) + { + m_color_border=value; +//--- redraw + if(m_data_total>0) + Redraw(); + } +//+------------------------------------------------------------------+ +//| Sets text color | +//+------------------------------------------------------------------+ +void CChartCanvas::ColorText(const uint value) + { + m_color_text=value; +//--- redraw + if(m_data_total>0) + Redraw(); + } +//+------------------------------------------------------------------+ +//| Sets maximum amount of data | +//+------------------------------------------------------------------+ +void CChartCanvas::MaxData(const uint value) + { +//--- check + if((value==0) || (m_data_total==value)) + return; +//--- save + m_max_data=value; + if(m_data_total>m_max_data) + { + m_data_total=value; + m_colors.Resize(value); + m_descriptors.Resize(value); + } + } +//+------------------------------------------------------------------+ +//| Sets maximum length of descriptor | +//+------------------------------------------------------------------+ +void CChartCanvas::MaxDescrLen(const uint value) + { + m_max_descr_len=value; +//--- redraw + if(m_data_total>0) + Redraw(); + } +//+------------------------------------------------------------------+ +//| Sets allowed visibility flags | +//+------------------------------------------------------------------+ +void CChartCanvas::AllowedShowFlags(const uint flags) + { + m_allowed_show_flags=flags; + m_show_flags&=m_allowed_show_flags; + } +//+------------------------------------------------------------------+ +//| Sets visibility flags | +//+------------------------------------------------------------------+ +void CChartCanvas::ShowFlags(const uint flags) + { + m_show_flags=flags&m_allowed_show_flags; +//--- redraw + if(m_data_total>0) + Redraw(); + } +//+------------------------------------------------------------------+ +//| Sets visibility flag for "legend" | +//+------------------------------------------------------------------+ +void CChartCanvas::ShowLegend(const bool flag) + { + if((m_allowed_show_flags&FLAG_SHOW_LEGEND)!=0) + { + if(flag) + m_show_flags|=FLAG_SHOW_LEGEND; + else + m_show_flags&=~FLAG_SHOW_LEGEND; + //--- redraw + if(m_data_total>0) + Redraw(); + } + } +//+------------------------------------------------------------------+ +//| Sets visibility flag for left scale | +//+------------------------------------------------------------------+ +void CChartCanvas::ShowScaleLeft(const bool flag) + { + if((m_allowed_show_flags&FLAG_SHOW_SCALE_LEFT)!=0) + { + if(flag) + m_show_flags|=FLAG_SHOW_SCALE_LEFT; + else + m_show_flags&=~FLAG_SHOW_SCALE_LEFT; + //--- redraw + if(m_data_total>0) + Redraw(); + } + } +//+------------------------------------------------------------------+ +//| Sets visibility flag for right scale | +//+------------------------------------------------------------------+ +void CChartCanvas::ShowScaleRight(const bool flag) + { + if((m_allowed_show_flags&FLAG_SHOW_SCALE_RIGHT)!=0) + { + if(flag) + m_show_flags|=FLAG_SHOW_SCALE_RIGHT; + else + m_show_flags&=~FLAG_SHOW_SCALE_RIGHT; + //--- redraw + if(m_data_total>0) + Redraw(); + } + } +//+------------------------------------------------------------------+ +//| Sets visibility flag for top scale | +//+------------------------------------------------------------------+ +void CChartCanvas::ShowScaleTop(const bool flag) + { + if((m_allowed_show_flags&FLAG_SHOW_SCALE_TOP)!=0) + { + if(flag) + m_show_flags|=FLAG_SHOW_SCALE_TOP; + else + m_show_flags&=~FLAG_SHOW_SCALE_TOP; + //--- redraw + if(m_data_total>0) + Redraw(); + } + } +//+------------------------------------------------------------------+ +//| Sets visibility flag for bottom scale | +//+------------------------------------------------------------------+ +void CChartCanvas::ShowScaleBottom(const bool flag) + { + if((m_allowed_show_flags&FLAG_SHOW_SCALE_BOTTOM)!=0) + { + if(flag) + m_show_flags|=FLAG_SHOW_SCALE_BOTTOM; + else + m_show_flags&=~FLAG_SHOW_SCALE_BOTTOM; + //--- redraw + if(m_data_total>0) + Redraw(); + } + } +//+------------------------------------------------------------------+ +//| Sets visibility flag for grid | +//+------------------------------------------------------------------+ +void CChartCanvas::ShowGrid(const bool flag) + { + if((m_allowed_show_flags&FLAG_SHOW_GRID)!=0) + { + if(flag) + m_show_flags|=FLAG_SHOW_GRID; + else + m_show_flags&=~FLAG_SHOW_GRID; + //--- redraw + if(m_data_total>0) + Redraw(); + } + } +//+------------------------------------------------------------------+ +//| Sets visibility flag for descriptors | +//+------------------------------------------------------------------+ +void CChartCanvas::ShowDescriptors(const bool flag) + { + if((m_allowed_show_flags&FLAG_SHOW_DESCRIPTORS)!=0) + { + if(flag) + m_show_flags|=FLAG_SHOW_DESCRIPTORS; + else + m_show_flags&=~FLAG_SHOW_DESCRIPTORS; + //--- redraw + if(m_data_total>0) + Redraw(); + } + } +//+------------------------------------------------------------------+ +//| Sets visibility flag for value | +//+------------------------------------------------------------------+ +void CChartCanvas::ShowValue(const bool flag) + { + if((m_allowed_show_flags&FLAG_SHOW_VALUE)!=0) + { + if(flag) + { + m_show_flags|=FLAG_SHOW_VALUE; + m_show_flags&=~FLAG_SHOW_PERCENT; + } + else + m_show_flags&=~FLAG_SHOW_VALUE; + //--- redraw + if(m_data_total>0) + Redraw(); + } + } +//+------------------------------------------------------------------+ +//| Sets visibility flag for percentage | +//+------------------------------------------------------------------+ +void CChartCanvas::ShowPercent(const bool flag) + { + if((m_allowed_show_flags&FLAG_SHOW_PERCENT)!=0) + { + if(flag) + { + m_show_flags|=FLAG_SHOW_PERCENT; + m_show_flags&=~FLAG_SHOW_VALUE; + } + else + m_show_flags&=~FLAG_SHOW_PERCENT; + //--- redraw + if(m_data_total>0) + Redraw(); + } + } +//+------------------------------------------------------------------+ +//| Sets legend alignment | +//+------------------------------------------------------------------+ +void CChartCanvas::LegendAlignment(const ENUM_ALIGNMENT value) + { + m_legend_alignment=value; +//--- redraw + if(m_data_total>0) + Redraw(); + } +//+------------------------------------------------------------------+ +//| Sets accumulative flag | +//+------------------------------------------------------------------+ +void CChartCanvas::Accumulative(const bool flag=true) + { + m_accumulative=flag; +//--- redraw + if(m_data_total>0) + Redraw(); + } +//+------------------------------------------------------------------+ +//| Sets lower limit for vertical scale | +//+------------------------------------------------------------------+ +void CChartCanvas::VScaleMin(const double value) + { +//--- check + if(value==m_v_scale_max) + return; +//--- save + m_v_scale_min=value; +//--- redraw + if(m_data_total>0) + Redraw(); + } +//+------------------------------------------------------------------+ +//| Sets upper limit for vertical scale | +//+------------------------------------------------------------------+ +void CChartCanvas::VScaleMax(const double value) + { + if(value==m_v_scale_min) + return; +//--- save + m_v_scale_max=value; +//--- redraw + if(m_data_total>0) + Redraw(); + } +//+------------------------------------------------------------------+ +//| Sets number of vertical scale divisions | +//+------------------------------------------------------------------+ +void CChartCanvas::NumGrid(const uint value) + { +//--- check + if(value==0) + return; +//--- save + m_num_grid=value; +//--- redraw + if(m_data_total>0) + Redraw(); + } +//+------------------------------------------------------------------+ +//| Sets parameters for vertical scale | +//+------------------------------------------------------------------+ +void CChartCanvas::VScaleParams(const double max,const double min,const uint grid) + { +//--- check + if(grid==0) + return; + if(max<=min) + return; +//--- save + m_v_scale_max=max; + m_v_scale_min=min; + m_num_grid =grid; +//--- redraw + if(m_data_total>0) + Redraw(); + } +//+------------------------------------------------------------------+ +//| Sets data offset | +//+------------------------------------------------------------------+ +void CChartCanvas::DataOffset(const int value) + { + m_data_offset=value; +//--- redraw + Redraw(); + } +//+------------------------------------------------------------------+ +//| Updates parameter descriptor only (in specified position) | +//+------------------------------------------------------------------+ +bool CChartCanvas::DescriptorUpdate(const uint pos,const string descr) + { +//--- update + if(descr!=NULL && !m_descriptors.Update(pos,descr)) + return(false); +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Updates parameter color only (in specified position) | +//+------------------------------------------------------------------+ +bool CChartCanvas::ColorUpdate(const uint pos,const uint clr) + { +//--- update + if(clr!=0 && !m_colors.Update(pos,clr)) + return(false); +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Checks values for insignificance | +//+------------------------------------------------------------------+ +void CChartCanvas::ValuesCheck(void) + { + string text; + uint w,h; +//--- clear + m_max_value_width=0; + m_sum =0; + m_others =0; + m_index_size =0; + m_index.Clear(); +//--- check + if(m_data==NULL) + return; + if(m_data.Type()==TYPE_DOUBLE) + { + //--- single-series chart + //--- calculate sum of all values + for(uint i=0;im_height) + { + cols++; + rows=(int)m_index_size/cols; + if((int)m_index_size%cols!=0) + rows++; + } +//--- draw + int x0=(m_legend_alignment==ALIGNMENT_RIGHT) ? width-w*cols+h : h; + int x=0; + int y =-h/2; + int i; + if(m_data_total==m_index_size) + { + for(i=0;i<(int)m_data_total;i++,x+=w) + { + if(i%cols==0) + { + x=x0; + y+=dy; + } + FillRectangle(x,y,x+h,y+h,(uint)m_colors[i]); + TextOut(x+h,y," - "+m_descriptors[i],m_color_text); + } + } + else + { + for(i=0;i<(int)m_index_size;i++,x+=w) + { + int index=m_index[i]; + if(i%cols==0) + { + x=x0; + y+=dy; + } + FillRectangle(x,y,x+h,y+h,(uint)m_colors[index]); + TextOut(x+h,y," - "+m_descriptors[index],m_color_text); + } + if(i%cols==0) + { + x=x0; + y+=dy; + } + FillRectangle(x,y,x+h,y+h,COLOR2RGB(clrBlack)); + TextOut(x+h,y," - Others",m_color_text); + } +//--- width + return(w*cols); + } +//+------------------------------------------------------------------+ +//| Draw horizontal "legend" | +//+------------------------------------------------------------------+ +int CChartCanvas::DrawLegendHorizontal(const int w,const int h) + { + int width =m_data_area.Width(); + int height=m_data_area.Height(); + int rows =1; + int cols =(int)m_index_size; +//--- calculate + while(w*cols>m_width) + { + rows++; + cols=(int)m_index_size/rows; + if((int)m_index_size%rows!=0) + cols++; + } +//--- draw + int dx=width/(cols+1); + int x =dx-w/2+h; + int dy=(int)(1.5*h); + int y =(m_legend_alignment==ALIGNMENT_BOTTOM) ? height-dy*(rows+1) : -h/2; + int i; + if(m_data_total==m_index_size) + { + for(i=0;i<(int)m_data_total;i++,x+=dx) + { + if(i%cols==0) + { + x=dx-w/2+h; + y+=dy; + } + FillRectangle(x,y,x+h,y+h,(uint)m_colors[i]); + TextOut(x+h,y," - "+m_descriptors[i],m_color_text); + } + } + else + { + for(i=0;i<(int)m_index_size;i++,x+=dx) + { + int index=m_index[i]; + if(i%cols==0) + { + x=dx-w/2+h; + y+=dy; + } + FillRectangle(x,y,x+h,y+h,(uint)m_colors[index]); + TextOut(x+h,y," - "+m_descriptors[index],m_color_text); + } + if(i%cols==0) + { + x=dx-w/2+h; + y+=dy; + } + FillRectangle(x,y,x+h,y+h,COLOR2RGB(clrBlack)); + TextOut(x+h,y," - Others",m_color_text); + } +//--- height + return(dy*(rows+1)); + } +//+------------------------------------------------------------------+ +//| Calculates coordinates of scales | +//+------------------------------------------------------------------+ +void CChartCanvas::CalcScales(void) + { + int width =m_data_area.Width(); + int height=m_data_area.Height(); +//--- limits + m_y_max=m_data_area.top+DrawScaleTop(false); + m_y_min=m_data_area.bottom-DrawScaleBottom(false); +//--- additional + m_dy_grid=(int)((m_y_min-m_y_max)/m_num_grid); + m_y_max+=(int)(((m_y_min-m_y_max)-m_dy_grid*m_num_grid)/2); + m_y_min=(int)(m_y_max+m_dy_grid*m_num_grid); +//--- normalize + if(m_v_scale_min>=0.0) + m_y_0=m_y_min; + else + { + if(m_v_scale_max<=0.0) + m_y_0=m_y_max; + else + m_y_0=(int)(m_y_max+(m_y_min-m_y_max)*m_v_scale_max/(m_v_scale_max-m_v_scale_min)); + } +//--- scale + m_scale_y=(m_v_scale_max!=m_v_scale_min) ? (m_y_min-m_y_max)/(m_v_scale_max-m_v_scale_min) : 1; +//--- labels on scale + if(ArraySize(m_scale_text)!=m_num_grid+1 && ArrayResize(m_scale_text,m_num_grid+1)==-1) + return; + double val=m_v_scale_min; + double dval=(m_v_scale_max-m_v_scale_min)/m_num_grid; + for(uint i=0;i<=m_num_grid;i++,val+=dval) + m_scale_text[i]=DoubleToString(val,m_scale_digits); + } +//+------------------------------------------------------------------+ +//| Redraws scales | +//+------------------------------------------------------------------+ +void CChartCanvas::DrawScales(void) + { +//--- recalculate + CalcScales(); +//--- redraw scales + if(IS_SHOW_SCALE_LEFT) + DrawScaleLeft(); + if(IS_SHOW_SCALE_RIGHT) + DrawScaleRight(); + if(IS_SHOW_SCALE_TOP) + DrawScaleTop(); + if(IS_SHOW_SCALE_BOTTOM) + DrawScaleBottom(); + } +//+------------------------------------------------------------------+ +//| Redraws left scale | +//+------------------------------------------------------------------+ +int CChartCanvas::DrawScaleLeft(const bool draw) + { +//--- check flag + if(!IS_SHOW_SCALE_LEFT) + return(0); +//--- variables + int x1=m_data_area.left; + int x2; + int y=m_y_min; +//--- calculate scale width + int size=0; + for(uint i=0;i<=m_num_grid;i++) + { + if(size +//+------------------------------------------------------------------+ +//| Class CHistogramChart | +//| Usage: generates histogram chart | +//+------------------------------------------------------------------+ +class CHistogramChart : public CChartCanvas + { +private: + //--- colors + uint m_fill_brush[]; + //--- adjusted parameters + bool m_gradient; + uint m_bar_gap; + uint m_bar_min_size; + uint m_bar_border; + //--- data + CArrayObj *m_values; + +public: + CHistogramChart(void); + ~CHistogramChart(void); + //--- create + virtual bool Create(const string name,const int width,const int height,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_ARGB_NORMALIZE); + //--- adjusted parameters + void Gradient(const bool flag=true) { m_gradient=flag; } + void BarGap(const uint value) { m_bar_gap=value; } + void BarMinSize(const uint value) { m_bar_min_size=value; } + void BarBorder(const uint value) { m_bar_border=value; } + //--- data + bool SeriesAdd(const double &value[],const string descr="",const uint clr=0); + bool SeriesInsert(const uint pos,const double &value[],const string descr="",const uint clr=0); + bool SeriesUpdate(const uint pos,const double &value[],const string descr=NULL,const uint clr=0); + bool SeriesDelete(const uint pos); + bool ValueUpdate(const uint series,const uint pos,double value); + +protected: + virtual void DrawData(const uint idx); + void DrawBar(const int x,const int y,const int w,const int h,const uint clr); + void GradientBrush(const int size,const uint fill_clr); + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CHistogramChart::CHistogramChart(void) : m_gradient(true), + m_bar_gap(3), + m_bar_min_size(5), + m_bar_border(0) + { + ShowFlags(FLAG_SHOW_LEGEND|FLAGS_SHOW_SCALES|FLAG_SHOW_GRID); + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CHistogramChart::~CHistogramChart(void) + { + if(ArraySize(m_fill_brush)!=0) + ArrayFree(m_fill_brush); + } +//+------------------------------------------------------------------+ +//| Create dynamic resource | +//+------------------------------------------------------------------+ +bool CHistogramChart::Create(const string name,const int width,const int height,ENUM_COLOR_FORMAT clrfmt) + { +//--- create object to store data + if((m_values=new CArrayObj)==NULL) + return(false); +//--- pass responsibility for its destruction to the parent class + m_data=m_values; +//--- call method of parent class + if(!CChartCanvas::Create(name,width,height,clrfmt)) + return(false); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Adds data series | +//+------------------------------------------------------------------+ +bool CHistogramChart::SeriesAdd(const double &value[],const string descr,const uint clr) + { +//--- check + if(m_data_total==m_max_data) + return(false); +//--- add + CArrayDouble *arr=new CArrayDouble; + if(!m_values.Add(arr)) + return(false); + if(!arr.AssignArray(value)) + return(false); + if(!m_colors.Add((clr==0) ? GetDefaultColor(m_data_total) : clr)) + return(false); + if(!m_descriptors.Add(descr)) + return(false); + m_data_total++; +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Inserts data series | +//+------------------------------------------------------------------+ +bool CHistogramChart::SeriesInsert(const uint pos,const double &value[],const string descr,const uint clr) + { +//--- check + if(m_data_total==m_max_data) + return(false); + if(pos>=m_data_total) + return(false); +//--- insert + CArrayDouble *arr=new CArrayDouble; + if(!m_values.Insert(arr,pos)) + return(false); + if(!arr.AssignArray(value)) + return(false); + if(!m_colors.Insert((clr==0) ? GetDefaultColor(m_data_total) : clr,pos)) + return(false); + if(!m_descriptors.Insert(descr,pos)) + return(false); + m_data_total++; +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Updates data series | +//+------------------------------------------------------------------+ +bool CHistogramChart::SeriesUpdate(const uint pos,const double &value[],const string descr,const uint clr) + { +//--- check + if(pos>=m_data_total) + return(false); + CArrayDouble *data=m_values.At(pos); + if(data==NULL) + return(false); +//--- update + if(!data.AssignArray(value)) + return(false); + if(clr!=0 && !m_colors.Update(pos,clr)) + return(false); + if(descr!=NULL && !m_descriptors.Update(pos,descr)) + return(false); +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Deletes data series | +//+------------------------------------------------------------------+ +bool CHistogramChart::SeriesDelete(const uint pos) + { +//--- check + if(pos>=m_data_total && m_data_total!=0) + return(false); +//--- delete + if(!m_values.Delete(pos)) + return(false); + m_data_total--; + if(!m_colors.Delete(pos)) + return(false); + if(!m_descriptors.Delete(pos)) + return(false); +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Updates element in data series | +//+------------------------------------------------------------------+ +bool CHistogramChart::ValueUpdate(const uint series,const uint pos,double value) + { + CArrayDouble *data=m_values.At(series); +//--- check + if(data==NULL) + return(false); +//--- update + if(!data.Update(pos,value)) + return(false); +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Draws histogram | +//+------------------------------------------------------------------+ +void CHistogramChart::DrawData(const uint idx) + { + double value=0.0; +//--- check + CArrayDouble *data=m_values.At(idx); + if(data==NULL) + return; + int total=data.Total(); + if(total==0 || (int)idx>=total) + return; +//--- calculate + int x1=m_data_area.left; + int x2=m_data_area.right; + int dx=(x2-x1)/total; + uint clr=m_colors[idx]; + uint w=dx/m_data_total; + if(w0) + { + y=(m_y_0-(int)(value*m_scale_y)); + h=m_y_0-y; + } + else + { + y=m_y_0; + h=-(int)(value*m_scale_y); + } + DrawBar(x,y,w,h,clr); + //--- draw text of value + if(IS_SHOW_VALUE) + { + string text =DoubleToString(value,2); + int width=(int)(TextWidth(text)+w); + if(value>0) + { + if(width>y-m_y_max) + TextOut(x+w/2,y+w,text,m_color_text,TA_RIGHT|TA_VCENTER); + else + TextOut(x+w/2,y-w,text,m_color_text,TA_LEFT|TA_VCENTER); + } + else + { + if(width>m_y_min-y-h) + TextOut(x+w/2,y+h-w,text,m_color_text,TA_LEFT|TA_VCENTER); + else + TextOut(x+w/2,y+h+w,text,m_color_text,TA_RIGHT|TA_VCENTER); + } + } + } + if(IS_SHOW_VALUE) + FontSet(fontname,fontsize,fontflags,fontangle); + } +//+------------------------------------------------------------------+ +//| Draws bar | +//+------------------------------------------------------------------+ +void CHistogramChart::DrawBar(const int x,const int y,const int w,const int h,const uint clr) + { +//--- draw bar + if(!m_gradient || ArraySize(m_fill_brush)>1; + if((r&1)==0) + i1--; + //--- calculate + while(dy>=dx) + { + clr=fill_clr; + dclr=GETRGB(XRGB((r-dy)*GETRGBR(clr)/r,(r-dy)*GETRGBG(clr)/r,(r-dy)*GETRGBB(clr)/r)); + clr-=dclr; + m_fill_brush[i1]=clr; + m_fill_brush[i2]=clr; + //--- + if(f>=0) + { + dy--; + dd_y+=2; + f+=dd_y; + } + dx++; + if(--i1<0) + break; + i2++; + dd_x+=2; + f+=dd_x; + } + } + else + ArrayFree(m_fill_brush); + } +//+------------------------------------------------------------------+ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/Charts/LineChart.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/Charts/LineChart.mqh new file mode 100644 index 0000000..e911236 --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/Charts/LineChart.mqh @@ -0,0 +1,383 @@ +//+------------------------------------------------------------------+ +//| LineChart.mqh | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include "ChartCanvas.mqh" +#include +//+------------------------------------------------------------------+ +//| Class CLineChart | +//| Usage: generates line chart | +//+------------------------------------------------------------------+ +class CLineChart : public CChartCanvas + { +private: + //--- data + CArrayObj *m_values; + //--- adjusted parameters + bool m_filled; + +public: + CLineChart(void); + ~CLineChart(void); + //--- create + virtual bool Create(const string name,const int width,const int height,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_ARGB_NORMALIZE); + //--- adjusted parameters + void Filled(const bool flag=true) { m_filled=flag; } + //--- set up + bool SeriesAdd(const double &value[],const string descr="",const uint clr=0); + bool SeriesInsert(const uint pos,const double &value[],const string descr="",const uint clr=0); + bool SeriesUpdate(const uint pos,const double &value[],const string descr=NULL,const uint clr=0); + bool SeriesDelete(const uint pos); + bool ValueUpdate(const uint series,const uint pos,double value); + +protected: + virtual void DrawChart(void); + virtual void DrawData(const uint index=0); + +private: + double CalcArea(const uint index); + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CLineChart::CLineChart(void) : m_filled(false) + { + ShowFlags(FLAG_SHOW_LEGEND|FLAGS_SHOW_SCALES|FLAG_SHOW_GRID); + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CLineChart::~CLineChart(void) + { + } +//+------------------------------------------------------------------+ +//| Create dynamic resource | +//+------------------------------------------------------------------+ +bool CLineChart::Create(const string name,const int width,const int height,ENUM_COLOR_FORMAT clrfmt) + { +//--- create object to store data + if((m_values=new CArrayObj)==NULL) + return(false); +//--- pass responsibility for its destruction to the parent class + m_data=m_values; +//--- call method of parent class + if(!CChartCanvas::Create(name,width,height,clrfmt)) + return(false); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Adds data series | +//+------------------------------------------------------------------+ +bool CLineChart::SeriesAdd(const double &value[],const string descr,const uint clr) + { +//--- check + if(m_data_total==m_max_data) + return(false); +//--- add + CArrayDouble *arr=new CArrayDouble; + if(!m_values.Add(arr)) + return(false); + if(!arr.AssignArray(value)) + return(false); + if(!m_colors.Add((clr==0) ? GetDefaultColor(m_data_total) : clr)) + return(false); + if(!m_descriptors.Add(descr)) + return(false); + m_data_total++; +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Inserts data series | +//+------------------------------------------------------------------+ +bool CLineChart::SeriesInsert(const uint pos,const double &value[],const string descr,const uint clr) + { +//--- check + if(m_data_total==m_max_data) + return(false); + if(pos>=m_data_total) + return(false); +//--- insert + CArrayDouble *arr=new CArrayDouble; + if(!m_values.Insert(arr,pos)) + return(false); + if(!arr.AssignArray(value)) + return(false); + if(!m_colors.Insert((clr==0) ? GetDefaultColor(m_data_total) : clr,pos)) + return(false); + if(!m_descriptors.Insert(descr,pos)) + return(false); + m_data_total++; +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Updates data series | +//+------------------------------------------------------------------+ +bool CLineChart::SeriesUpdate(const uint pos,const double &value[],const string descr,const uint clr) + { +//--- check + if(pos>=m_data_total) + return(false); + CArrayDouble *data=m_values.At(pos); + if(data==NULL) + return(false); +//--- update + if(!data.AssignArray(value)) + return(false); + if(clr!=0 && !m_colors.Update(pos,clr)) + return(false); + if(descr!=NULL && !m_descriptors.Update(pos,descr)) + return(false); +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Deletes data series | +//+------------------------------------------------------------------+ +bool CLineChart::SeriesDelete(const uint pos) + { +//--- check + if(pos>=m_data_total && m_data_total!=0) + return(false); +//--- delete + if(!m_values.Delete(pos)) + return(false); + m_data_total--; + if(!m_colors.Delete(pos)) + return(false); + if(!m_descriptors.Delete(pos)) + return(false); +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Updates element in data series | +//+------------------------------------------------------------------+ +bool CLineChart::ValueUpdate(const uint series,const uint pos,double value) + { + CArrayDouble *data=m_values.At(series); +//--- check + if(data==NULL) + return(false); +//--- update + if(!data.Update(pos,value)) + return(false); +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Redraws data | +//+------------------------------------------------------------------+ +void CLineChart::DrawChart(void) + { + if(m_filled) + { + //--- calculate areas of filling + double s[]; + ArrayResize(s,m_data_total); + ArrayInitialize(s,0); + for(uint i=0;im_y_0 && y2m_y_0)) + { + //--- draw two triangles + int x3; + if(y1>y2) + { + x3=x+dx*(y1-m_y_0)/(y1-y2); + FillTriangle(x,y1,x3,m_y_0,x,m_y_0,(uint)m_colors[index]); + FillTriangle(x+dx,y2,x3,m_y_0,x+dx,m_y_0,(uint)m_colors[index]); + } + else + { + x3=x+dx*(m_y_0-y1)/(y2-y1); + FillTriangle(x,y1,x3,m_y_0,x,m_y_0,(uint)m_colors[index]); + FillTriangle(x+dx,y2,x3,m_y_0,x+dx,m_y_0,(uint)m_colors[index]); + } + continue; + } + if(y1y2) + FillTriangle(x,y1,x+dx,y2,x+dx,y1,(uint)m_colors[index]); + if(y1m_y_0 || y2>m_y_0) + { + if(y1y2) + { + FillTriangle(x,y1,x+dx,y2,x,y2,(uint)m_colors[index]); + y1=y2; + } + } + FillRectangle(x,m_y_0,x+dx,y1,(uint)m_colors[index]); + } + else + LineAA(x,y1,x+dx,y2,(uint)m_colors[index],STYLE_SOLID); + } + } +//+------------------------------------------------------------------+ +//| Area of filling | +//+------------------------------------------------------------------+ +double CLineChart::CalcArea(const uint index) + { + double area =0; + double value=0; + int dx =100; +//--- + CArrayDouble *data=m_values.At(index); + if(data==NULL) + return(0); + int total=data.Total(); + if(total<=1) + return(0); + int y1=0; + int y2=(int)(m_y_0-data[0]*m_scale_y); + for(int i=0;im_y_0 && y2m_y_0)) + { + //--- line of values crosses the Y axis + int x; + if(y1>y2) + { + //--- from the bottom up + x=dx*(y1-m_y_0)/(y1-y2); + //--- add area of lower triangle + area+=x*(y1-m_y_0)/2; + //--- add area of upper triangle + area+=(dx-x)*(m_y_0-y2)/2; + } + else + { + //--- from top down + x=dx*(m_y_0-y1)/(y2-y1); + //--- add area of upper triangle + area+=x*(m_y_0-y1)/2; + //--- add area of lower triangle + area+=(dx-x)*(y2-m_y_0)/2; + } + continue; + } + if(y1y2) + { + //--- add area of triangle + area+=dx*(y1-y2)/2; + //--- add area of rectangle + area+=dx*(m_y_0-y2); + } + if(y1m_y_0 || y2>m_y_0) + { + //--- both values are less than zero + if(y1y2) + { + //--- add area of triangle + area+=dx*(y1-y2)/2; + //--- add area of rectangle + area+=dx*(y2-m_y_0); + } + } + } +//--- + return(area); + } +//+------------------------------------------------------------------+ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/Charts/PieChart.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/Charts/PieChart.mqh new file mode 100644 index 0000000..d55e3b1 --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/Charts/PieChart.mqh @@ -0,0 +1,414 @@ +//+------------------------------------------------------------------+ +//| PieChart.mqh | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include "ChartCanvas.mqh" +//+------------------------------------------------------------------+ +//| Class CPieChart | +//| Usage: generates pie chart | +//+------------------------------------------------------------------+ +class CPieChart : public CChartCanvas + { +private: + //--- data + CArrayDouble *m_values; + //--- for draw + int m_x0; + int m_y0; + int m_r; + +public: + CPieChart(void); + ~CPieChart(void); + //--- create + virtual bool Create(const string name,const int width,const int height,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA); + //--- data + bool SeriesSet(const double &value[],const string &text[],const uint &clr[]); + bool ValueAdd(const double value,const string descr="",const uint clr=0); + bool ValueInsert(const uint pos,const double value,const string descr="",const uint clr=0); + bool ValueUpdate(const uint pos,const double value,const string descr=NULL,const uint clr=0); + bool ValueDelete(const uint pos); + +protected: + virtual void DrawChart(void); + void DrawPie(double fi3,double fi4,int idx,CPoint &p[],const uint clr); + string LabelMake(const string text,const double value,const bool to_left); + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CPieChart::CPieChart(void) + { + uint flags=FLAG_SHOW_LEGEND|FLAG_SHOW_DESCRIPTORS|FLAG_SHOW_VALUE|FLAG_SHOW_PERCENT; + AllowedShowFlags(flags); + ShowFlags(flags); + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CPieChart::~CPieChart(void) + { + } +//+------------------------------------------------------------------+ +//| Create dynamic resource | +//+------------------------------------------------------------------+ +bool CPieChart::Create(const string name,const int width,const int height,ENUM_COLOR_FORMAT clrfmt) + { +//--- create object to store data + if((m_values=new CArrayDouble)==NULL) + return(false); +//--- pass responsibility for its destruction to the parent class + m_data=m_values; +//--- call method of parent class + if(!CChartCanvas::Create(name,width,height,clrfmt)) + return(false); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Sets displayed parameters | +//+------------------------------------------------------------------+ +bool CPieChart::SeriesSet(const double &value[],const string &text[],const uint &clr[]) + { +//--- !!! user is responsible for correct filling of arrays !!! +//--- check + if(m_values==NULL) + return(false); +//--- set + if(!m_values.AssignArray(value)) + return(false); + if(!m_descriptors.AssignArray(text)) + return(false); + if(!m_colors.AssignArray(clr)) + return(false); + m_data_total=m_values.Total(); +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Adds displayed parameter (to the end) | +//+------------------------------------------------------------------+ +bool CPieChart::ValueAdd(const double value,const string descr,const uint clr) + { +//--- check + if((value<=0)) + return(false); +//--- add + if(!m_values.Add(value)) + return(false); + if(!m_descriptors.Add(descr)) + return(false); + if(!m_colors.Add((clr==0) ? GetDefaultColor(m_data_total) : clr)) + return(false); + m_data_total++; +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Inserts displayed parameter (to specified position) | +//+------------------------------------------------------------------+ +bool CPieChart::ValueInsert(const uint pos,const double value,const string descr,const uint clr) + { +//--- check + if((value<=0)) + return(false); +//--- insert + if(!m_values.Insert(value,pos)) + return(false); + if(!m_descriptors.Insert(descr,pos)) + return(false); + if(!m_colors.Insert((clr==0) ? GetDefaultColor(m_data_total) : clr,pos)) + return(false); + m_data_total++; +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Updates displayed parameter (in specified position) | +//+------------------------------------------------------------------+ +bool CPieChart::ValueUpdate(const uint pos,const double value,const string descr,const uint clr) + { +//--- check + if((value<=0)) + return(false); +//--- update + if(!m_values.Update(pos,value)) + return(false); + if(descr!=NULL && !m_descriptors.Update(pos,descr)) + return(false); + if(clr!=0 && !m_colors.Update(pos,clr)) + return(false); +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Deletes displayed parameter (from specified position) | +//+------------------------------------------------------------------+ +bool CPieChart::ValueDelete(const uint pos) + { +//--- delete + if(!m_values.Delete(pos)) + return(false); + m_data_total--; + if(!m_descriptors.Delete(pos)) + return(false); + if(!m_colors.Delete(pos)) + return(false); +//--- redraw + Redraw(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Draws | +//+------------------------------------------------------------------+ +void CPieChart::DrawChart(void) + { +//--- check + if(m_data_total==0) + return; +//--- variables + string text=""; + double angle=M_PI*(m_data_offset%360)/180; + int width,height; + int dw=0; + int dh=0; + int index; + CPoint p0[]; + CPoint p1[]; +//--- calculate geometry + width =(m_data_area.Width()<<3)/10; + height=(m_data_area.Height()<<3)/10; + if(IS_SHOW_LEGEND || !IS_SHOW_DESCRIPTORS) + { + if(IS_SHOW_VALUE) + dw=(int)m_max_value_width; + else + { + if(IS_SHOW_PERCENT) + dw=TextWidth("100.00%"); + } + } + else + { + if(IS_SHOW_DESCRIPTORS) + { + if(IS_SHOW_VALUE) + dw=(int)m_max_value_width+TextWidth(" ()"); + else + { + if(IS_SHOW_PERCENT) + dw=TextWidth(" (100.00%)"); + } + dw+=(int)m_max_descr_width; + } + } +//--- pie chart will always be round + width -=2*dw+10; + height-=20; + m_x0=m_data_area.left+(m_data_area.Width()>>1); + m_y0=m_data_area.top+(m_data_area.Height()>>1); + m_r =(((width>height) ? height : width)>>1); +//--- draw pie chart + if(ArrayResize(p0,m_data_total+1)==-1) + return; + if(m_data_total==1) + { + FillCircle(m_x0,m_y0,m_r,m_colors[0]); + Circle(m_x0,m_y0,m_r,m_color_border); + } + else + { + Circle(m_x0,m_y0,m_r,m_color_border); + for(uint i=0;i=m_x0) + { + x=p1[i].x+10; + y=p1[i].y; + index=m_index[i]; + text=LabelMake(m_descriptors[index],m_values[index],false); + if(text!="") + { + Line(p0[i].x,p0[i].y,p1[i].x,p1[i].y,m_color_border); + Line(p1[i].x,p1[i].y,x,y,m_color_border); + TextOut(x+5,y,text,m_color_text,TA_LEFT|TA_VCENTER); + } + } + if(m_data_total!=m_index_size) + { + index=(int)m_data_total-1; + if(p0[index].x>=m_x0) + { + x=p1[index].x+10; + y=p1[index].y; + text=LabelMake("Others",m_others,true); + TextOut(x+5,y,text,m_color_text,TA_LEFT|TA_VCENTER); + } + else + { + x=p1[index].x-10; + y=p1[index].y; + text=LabelMake("Others",m_others,false); + TextOut(x-5,y,text,m_color_text,TA_RIGHT|TA_VCENTER); + } + if(text!="") + { + Line(p0[index].x,p0[index].y,p1[index].x,p1[index].y,m_color_border); + Line(p1[index].x,p1[index].y,x,y,m_color_border); + } + } + ArrayFree(p1); + ArrayFree(p0); + } +//+------------------------------------------------------------------+ +//| Draw pie | +//+------------------------------------------------------------------+ +void CPieChart::DrawPie(double fi3,double fi4,int idx,CPoint &p[],const uint clr) + { +//--- draw arc + Arc(m_x0,m_y0,m_r,m_r,fi3,fi4,p[idx].x,p[idx].y,p[idx+1].x,p[idx+1].y,clr); +//--- variables + int x3=p[idx].x; + int y3=p[idx].y; + int x4=p[idx+1].x; + int y4=p[idx+1].y; +//--- draw radii + if(idx==0) + Line(m_x0,m_y0,x3,y3,clr); + if(idx!=m_data_total-1) + Line(m_x0,m_y0,x4,y4,clr); +//--- fill + double fi=(fi3+fi4)/2; + int xf=m_x0+(int)(0.99*m_r*cos(fi)); + int yf=m_y0-(int)(0.99*m_r*sin(fi)); + Fill(xf,yf,clr); +//--- for small pie + if(fi4-fi3<=M_PI_4) + Line(m_x0,m_y0,xf,yf,clr); + } +//+------------------------------------------------------------------+ +//| Make label for pie | +//+------------------------------------------------------------------+ +string CPieChart::LabelMake(const string text,const double value,const bool to_left) + { + string label=""; +//--- + if(to_left) + { + if(IS_SHOW_LEGEND || !IS_SHOW_DESCRIPTORS) + { + if(IS_SHOW_VALUE) + label=DoubleToString(value,2); + else + { + if(IS_SHOW_PERCENT) + label=DoubleToString(100*value/m_sum,2)+"%"; + } + } + else + { + label=text; + if(IS_SHOW_VALUE) + label+=" ("+DoubleToString(value,2)+")"; + else + { + if(IS_SHOW_PERCENT) + label+=" ("+DoubleToString(100*value/m_sum,2)+"%)"; + } + } + } + else + { + if(IS_SHOW_LEGEND || !IS_SHOW_DESCRIPTORS) + { + if(IS_SHOW_VALUE) + label=DoubleToString(value,2); + else + { + if(IS_SHOW_PERCENT) + label=DoubleToString(100*value/m_sum,2)+"%"; + } + } + else + { + if(IS_SHOW_VALUE) + label="("+DoubleToString(value,2)+") "; + else + { + if(IS_SHOW_PERCENT) + label="("+DoubleToString(100*value/m_sum,2)+"%) "; + } + label+=text; + } + } +//--- + return(label); + } +//+------------------------------------------------------------------+ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXBox.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXBox.mqh new file mode 100644 index 0000000..fcfa92c --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXBox.mqh @@ -0,0 +1,77 @@ +//+------------------------------------------------------------------+ +//| DXBox.mqh | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +//--- +#include "DXMesh.mqh" +#include "DXMath.mqh" +#include "DXUtils.mqh" +//+------------------------------------------------------------------+ +//| 3D Box object | +//+------------------------------------------------------------------+ +class CDXBox : public CDXMesh + { +public: + CDXBox(); + ~CDXBox(); + //--- create bon in specified context + bool Create(CDXDispatcher &dispatcher,CDXInput* buffer_scene,const DXVector3 &from,const DXVector3 &to); + //--- update box + bool Update(const DXVector3 &from,const DXVector3 &to); + +private: + //--- + void PrepareVertices(const DXVector3 &from,const DXVector3 &to); + }; +//+------------------------------------------------------------------+ +//| Class constructor | +//+------------------------------------------------------------------+ +void CDXBox::CDXBox() : CDXMesh() + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +void CDXBox::~CDXBox(void) + { + } +//+------------------------------------------------------------------+ +//| Create box in specified context | +//+------------------------------------------------------------------+ +bool CDXBox::Create(CDXDispatcher &dispatcher,CDXInput* buffer_scene,const DXVector3 &from,const DXVector3 &to) + { +//--- release previous buffers + Shutdown(); +//--- + DXVertex vertices[]; + uint indices[]; +//--- prepare box vertices and indices + DXColor white=DXColor(1.0f,1.0f,1.0f,1.0f); + if(!DXComputeBox(from,to,vertices,indices)) + return(false); + for(int i=0; i + bool Create(int context_handle,const TVertex &vertices[],uint start=0,uint count=WHOLE_ARRAY) + { + Shutdown(); + m_context=context_handle; + m_handle=DXBufferCreate(m_context,DX_BUFFER_VERTEX,vertices,start,count); + return(m_handle!=INVALID_HANDLE); + } + //+------------------------------------------------------------------+ + //| Render | + //+------------------------------------------------------------------+ + bool Render(uint start=0,uint count=WHOLE_ARRAY) + { + return(DXBufferSet(m_context,m_handle,start,count)); + } + //+------------------------------------------------------------------+ + //| Shutdown | + //+------------------------------------------------------------------+ + void Shutdown(void) + { + //--- relase handle + if(m_handle!=INVALID_HANDLE) + DXRelease(m_handle); + m_handle=INVALID_HANDLE; + } + }; +//+------------------------------------------------------------------+ +//| DX index buffer | +//+------------------------------------------------------------------+ +class CDXIndexBuffer : public CDXHandleShared + { +public: + //+------------------------------------------------------------------+ + //| Destructor | + //+------------------------------------------------------------------+ + virtual ~CDXIndexBuffer(void) + { + Shutdown(); + } + //+------------------------------------------------------------------+ + //| Create index buffer in specified context | + //+------------------------------------------------------------------+ + bool Create(int context_handle,const uint &indices[],uint start=0,uint count=WHOLE_ARRAY) + { + Shutdown(); + m_context=context_handle; + m_handle=DXBufferCreate(m_context,DX_BUFFER_INDEX,indices,start,count); + return(m_handle!=INVALID_HANDLE); + } + //+------------------------------------------------------------------+ + //| Render | + //+------------------------------------------------------------------+ + bool Render(uint start=0,uint count=WHOLE_ARRAY) + { + return(DXBufferSet(m_context,m_handle,start,count)); + } + //+------------------------------------------------------------------+ + //| Shutdown | + //+------------------------------------------------------------------+ + void Shutdown(void) + { + //--- relase handle + if(m_handle!=INVALID_HANDLE) + DXRelease(m_handle); + m_handle=INVALID_HANDLE; + } + }; +//+------------------------------------------------------------------+ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXData.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXData.mqh new file mode 100644 index 0000000..f3f29d8 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXData.mqh differ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXDispatcher.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXDispatcher.mqh new file mode 100644 index 0000000..29def1f --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXDispatcher.mqh @@ -0,0 +1,373 @@ +//+------------------------------------------------------------------+ +//| DXDispatcher.mqh | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +//--- +#include "DXObjectBase.mqh" +#include "DXData.mqh" +#include "DXBuffers.mqh" +#include "DXInput.mqh" +#include "DXTexture.mqh" +#include "DXShader.mqh" +//--- default shaders +#resource "Shaders/DefaultShaderVertex.hlsl" as string ExtDefaultShaderVertex; +#resource "Shaders/DefaultShaderPixel.hlsl" as string ExtDefaultShaderPixel; +//+------------------------------------------------------------------+ +//| DX dispatcher which holds all resources | +//+------------------------------------------------------------------+ +class CDXDispatcher : public CDXObjectBase + { +protected: + CDXObjectBase m_dx_resources; // DX resources list (Textures, Shaders, etc.) + //--- default shaders + CDXShader* m_default_vs; + CDXShader* m_default_ps; + +public: + CDXDispatcher(void); + ~CDXDispatcher(void); + //--- create/destroy + bool Create(int context); + void Destroy(void); + //--- check resources + void Check(void); + //--- get DX Context Handle + int DXContext(void) const { return(m_context); } + //--- create shaders + CDXShader* ShaderCreateDefault(ENUM_DX_SHADER_TYPE shader_type); + CDXShader* ShaderCreateFromFile(ENUM_DX_SHADER_TYPE shader_type,string path,string entry_point); + CDXShader* ShaderCreateFromSource(ENUM_DX_SHADER_TYPE shader_type,string source,string entry_point); + //--- create buffers + template + CDXVertexBuffer* VertexBufferCreate(const TVertex &vertices[],uint start=0,uint count=WHOLE_ARRAY); + CDXIndexBuffer* IndexBufferCreate(const uint &indicies[],uint start=0,uint count=WHOLE_ARRAY); + //--- create shader inputs + template + CDXInput* InputCreate(void); + CDXTexture* TextureCreateFromFile(string path,uint data_x=0,uint data_y=0,uint data_width=0,uint data_height=0); + CDXTexture* TextureCreateFromData(ENUM_DX_FORMAT format,uint width,uint height,const uint &data[],uint data_x=0,uint data_y=0,uint data_width=0,uint data_height=0); + +private: + //--- add resource to list + bool ResourceAdd(CDXObjectBase *resource); + //--- check resources + void ResourcesCheck(void); + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CDXDispatcher::CDXDispatcher(void) + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CDXDispatcher::~CDXDispatcher(void) + { + Destroy(); + } +//+------------------------------------------------------------------+ +//| Create | +//+------------------------------------------------------------------+ +bool CDXDispatcher::Create(int context) + { +//--- check if context already exist + if(m_context!=INVALID_HANDLE) + return(false); +//--- save context + m_context=context; +//--- + return(true); + } +//+------------------------------------------------------------------+ +//| Destroy | +//+------------------------------------------------------------------+ +void CDXDispatcher::Destroy(void) + { +//--- release default shaders + if(m_default_ps) + { + m_default_ps.Release(); + m_default_ps=NULL; + } + if(m_default_vs) + { + m_default_vs.Release(); + m_default_vs=NULL; + } +//--- release and delete all DX resources + while(m_dx_resources.Next()) + { + CDXHandleShared* resource=(CDXHandleShared*)m_dx_resources.Next(); + resource.Release(); + } +//--- forget context + m_context=INVALID_HANDLE; + } +//+------------------------------------------------------------------+ +//| Check resources | +//+------------------------------------------------------------------+ +void CDXDispatcher::Check(void) + { +//--- + CDXHandleShared* resource=(CDXHandleShared*)m_dx_resources.Next(); +//--- release and delete all DX resources + while(CheckPointer(resource)!=POINTER_INVALID) + { + CDXHandleShared* next=(CDXHandleShared*)resource.Next(); + //--- if references count 1 or less, then only we hold the resource + if(resource.References()<=1) + resource.Release(); + //--- + resource=next; + } + } +//+------------------------------------------------------------------+ +//| Create default shader of specified type | +//+------------------------------------------------------------------+ +CDXShader* CDXDispatcher::ShaderCreateDefault(ENUM_DX_SHADER_TYPE shader_type) + { + switch(shader_type) + { + //--- default pixel shader + case DX_SHADER_PIXEL: + { + if(m_default_ps==NULL) + m_default_ps=ShaderCreateFromSource(DX_SHADER_PIXEL,ExtDefaultShaderPixel,"PSMain"); + return(m_default_ps); + } + //--- default vertex shader + case DX_SHADER_VERTEX: + { + if(m_default_vs==NULL) + { + m_default_vs=ShaderCreateFromSource(DX_SHADER_VERTEX,ExtDefaultShaderVertex,"VSMain"); + if(m_default_vs && !m_default_vs.LayoutSet()) + { + m_default_vs.Release(); + m_default_vs=NULL; + } + } + return(m_default_vs); + } + } +//--- return result + return(NULL); + } +//+------------------------------------------------------------------+ +//| Create new shader of specified type from file | +//+------------------------------------------------------------------+ +CDXShader* CDXDispatcher::ShaderCreateFromFile(ENUM_DX_SHADER_TYPE shader_type,string path,string entry_point) + { +//--- open source file + int file=FileOpen(path,FILE_READ); + if(file==INVALID_HANDLE) + return(NULL); +//--- check file size + uint size=(uint)FileSize(file); + FileClose(file); + if(size>16*1024*1024) + return(NULL); +//--- prepare buffer + char buffer[]; + ArrayResize(buffer,size); +//--- read file into buffer + int read=(int)FileLoad(path,buffer); + if(read<=0) + return(NULL); +//--- convert vuffer to string + string source=CharArrayToString(buffer,0,WHOLE_ARRAY,CP_UTF8); +//--- add shader by source + return(ShaderCreateFromSource(shader_type,source,entry_point)); + } +//+------------------------------------------------------------------+ +//| Create new shader of specified type from source code | +//+------------------------------------------------------------------+ +CDXShader* CDXDispatcher::ShaderCreateFromSource(ENUM_DX_SHADER_TYPE shader_type,string source,string entry_point) + { +//--- check context + if(m_context==INVALID_HANDLE) + return(NULL); +//--- allocate new shader + CDXShader* shader=new CDXShader(); + if(shader==NULL) + return(NULL); +//--- create shader + if(!shader.Create(m_context,shader_type,source,entry_point)) + { + shader.Release(); + return(NULL); + } +//--- add shader to resources list + if(!ResourceAdd(shader)) + { + shader.Release(); + return(NULL); + } +//--- return shader + return(shader); + } +//+------------------------------------------------------------------+ +//| Create vertex buffer | +//+------------------------------------------------------------------+ +template +CDXVertexBuffer* CDXDispatcher::VertexBufferCreate(const TVertex &vertices[],uint start=0,uint count=WHOLE_ARRAY) + { +//--- check context + if(m_context==INVALID_HANDLE) + return(NULL); +//--- allocate new buffer + CDXVertexBuffer* buffer=new CDXVertexBuffer(); + if(buffer==NULL) + return(NULL); +//--- create buffer + if(!buffer.Create(m_context,vertices,start,count)) + { + buffer.Release(); + return(NULL); + } +//--- add buffer to resources list + if(!ResourceAdd(buffer)) + { + buffer.Release(); + return(NULL); + } +//--- return buffer + return(buffer); + } +//+------------------------------------------------------------------+ +//| Create vertex buffer | +//+------------------------------------------------------------------+ +CDXIndexBuffer* CDXDispatcher::IndexBufferCreate(const uint &indicies[],uint start=0,uint count=WHOLE_ARRAY) + { +//--- check context + if(m_context==INVALID_HANDLE) + return(NULL); +//--- allocate new buffer + CDXIndexBuffer* buffer=new CDXIndexBuffer(); + if(buffer==NULL) + return(NULL); +//--- create buffer + if(!buffer.Create(m_context,indicies,start,count)) + { + buffer.Release(); + return(NULL); + } +//--- add buffer to resources list + if(!ResourceAdd(buffer)) + { + buffer.Release(); + return(NULL); + } +//--- return input buffer + return(buffer); + } +//+------------------------------------------------------------------+ +//| Create shader input buffer | +//+------------------------------------------------------------------+ +template +CDXInput* CDXDispatcher::InputCreate(void) + { +//--- check context + if(m_context==INVALID_HANDLE) + return(NULL); +//--- allocate new input buffer + CDXInput* input_buffer=new CDXInput(); + if(input_buffer==NULL) + return(NULL); +//--- create buffer + if(!input_buffer.Create(m_context)) + { + input_buffer.Release(); + return(NULL); + } +//--- add buffer to resources list + if(!ResourceAdd(input_buffer)) + { + input_buffer.Release(); + return(NULL); + } +//--- return shader + return(input_buffer); + } +//+------------------------------------------------------------------+ +//| Create texture from bitmap file | +//+------------------------------------------------------------------+ +CDXTexture* CDXDispatcher::TextureCreateFromFile(string path,uint data_x=0,uint data_y=0,uint data_width=0,uint data_height=0) + { +//--- check context + if(m_context==INVALID_HANDLE) + return(NULL); +//--- allocate new texture + CDXTexture* texture=new CDXTexture(); + if(texture==NULL) + return(NULL); +//--- create texture + if(!texture.Create(m_context,path,data_x,data_y,data_width,data_height)) + { + texture.Release(); + return(NULL); + } +//--- add texture to resources list + if(!ResourceAdd(texture)) + { + texture.Release(); + return(NULL); + } +//--- return shader + return(texture); + } +//+------------------------------------------------------------------+ +//| Create texture from raw data, only 32-bit pixel formats supported| +//+------------------------------------------------------------------+ +CDXTexture* CDXDispatcher::TextureCreateFromData(ENUM_DX_FORMAT format,uint width,uint height,const uint &data[],uint data_x=0,uint data_y=0,uint data_width=0,uint data_height=0) + { +//--- check context + if(m_context==INVALID_HANDLE) + return(NULL); +//--- allocate new texture + CDXTexture* texture=new CDXTexture(); + if(texture==NULL) + return(NULL); +//--- create texture + if(!texture.Create(m_context,format,width,height,data,data_x,data_y,data_width,data_height)) + { + texture.Release(); + return(NULL); + } +//--- add texture to resources list + if(!ResourceAdd(texture)) + { + texture.Release(); + return(NULL); + } +//--- return shader + return(texture); + } +//+------------------------------------------------------------------+ +//| Add DX resource | +//+------------------------------------------------------------------+ +bool CDXDispatcher::ResourceAdd(CDXObjectBase *resource) + { +//--- add resource + if(!CheckPointer(resource)) + return(false); +//--- + CDXObjectBase *last=&m_dx_resources; + while(CheckPointer(last.Next())!=POINTER_INVALID) + { + if(last==resource) + return(false); + //--- + last=last.Next(); + } +//--- + resource.Next(NULL); + resource.Prev(last); + last.Next(resource); + return(true); + } +//+------------------------------------------------------------------+ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXHandle.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXHandle.mqh new file mode 100644 index 0000000..a26a337 Binary files /dev/null and b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXHandle.mqh differ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXInput.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXInput.mqh new file mode 100644 index 0000000..5096cfb Binary files /dev/null and b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXInput.mqh differ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXMath.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXMath.mqh new file mode 100644 index 0000000..e9b5d2a --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/DXMath.mqh @@ -0,0 +1,3352 @@ +//+------------------------------------------------------------------+ +//| DXMath.mqh | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2000-2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +//+------------------------------------------------------------------+ +//| DirectX Math Routines | +//+------------------------------------------------------------------+ +//| Ported from C++ code of ReactOS, written by David Adam | +//| and Tony Wasserka | +//| | +//| https://doxygen.reactos.org/de/d57/ | +//| dll_2directx_2wine_2d3dx9__36_2math_8c_source.html | +//| | +//| Copyright (C) 2007 David Adam | +//| Copyright (C) 2007 Tony Wasserka | +//+------------------------------------------------------------------+ +#define DX_PI 3.1415926535897932384626f +#define DX_PI_DIV2 1.5707963267948966192313f +#define DX_PI_DIV3 1.0471975511965977461542f +#define DX_PI_DIV4 0.7853981633974483096156f +#define DX_PI_DIV6 0.5235987755982988730771f +#define DX_PI_MUL2 6.2831853071795864769253f +#define DXSH_MINORDER 2 +#define DXSH_MAXORDER 6 +//+------------------------------------------------------------------+ +//| Preliminary declarations | +//+------------------------------------------------------------------+ +//+------------------------------------------------------------------+ +//| DXColor | +//+------------------------------------------------------------------+ +struct DXColor; +struct DXPlane; +struct DXVector2; +struct DXVector3; +struct DXVector4; +struct DXMatrix; +struct DXQuaternion; +struct DViewport; +//+------------------------------------------------------------------+ +//| DXColor | +//+------------------------------------------------------------------+ +struct DXColor + { + float r; + float g; + float b; + float a; + //--- constructors + DXColor(void) { r=0.0; g=0.0; b=0.0; a=1.0; } + DXColor(float red,float green,float blue, float alpha) { r=red; g=green; b=blue; a=alpha; } + DXColor(const DXVector4 &v) { r=v.x; g=v.y; b=v.z; a=v.w; } + DXColor(const DXVector3 &v) { r=v.x; g=v.y; b=v.z; a=1.0; } + }; +//+------------------------------------------------------------------+ +//| DXPlane | +//+------------------------------------------------------------------+ +struct DXPlane + { + float a; + float b; + float c; + float d; + }; +//+------------------------------------------------------------------+ +//| DXVector2 | +//+------------------------------------------------------------------+ +struct DXVector2 + { + float x; + float y; + //--- constructors + DXVector2(void) { x=0.0; y=0.0; } + DXVector2(float v) { x=v; y=v; } + DXVector2(float vx,float vy) { x=vx; y=vy; } + DXVector2(const DXVector3 &v) { x=v.x; y=v.y; } + DXVector2(const DXVector4 &v) { x=v.x; y=v.y; } + }; +//+------------------------------------------------------------------+ +//| DXVector3 | +//+------------------------------------------------------------------+ +struct DXVector3 + { + float x; + float y; + float z; + //--- constructors + DXVector3(void) { x=0.0; y=0.0; z=0.0; } + DXVector3(float v) { x=v; y=v; z=v; } + DXVector3(float vx,float vy,float vz) { x=vx; y=vy; z=vz; } + DXVector3(const DXVector2 &v) { x=v.x; y=v.y; z=0.0; } + DXVector3(const DXVector4 &v) { x=v.x; y=v.y; z=v.z; } + }; +//+------------------------------------------------------------------+ +//| DXVector4 | +//+------------------------------------------------------------------+ +struct DXVector4 + { + float x; + float y; + float z; + float w; + //--- constructors + DXVector4(void) { x=0.0; y=0.0; z=0.0; w=1.0; } + DXVector4(float v) { x=v; y=v; z=v; w=v; } + DXVector4(float vx,float vy,float vz,float vw) { x=vx; y=vy; z=vz; w=vw; } + DXVector4(const DXVector2 &v) { x=v.x; y=v.y; z=0.0; w=1.0; } + DXVector4(const DXVector3 &v) { x=v.x; y=v.y; z=v.z; w=1.0; } + }; +//+------------------------------------------------------------------+ +//| DXMatrix | +//+------------------------------------------------------------------+ +struct DXMatrix + { + float m[4][4]; + }; +//+------------------------------------------------------------------+ +//| DXQuaternion | +//+------------------------------------------------------------------+ +struct DXQuaternion + { + float x; + float y; + float z; + float w; + }; +//+------------------------------------------------------------------+ +//| DViewport | +//+------------------------------------------------------------------+ +struct DViewport + { + ulong x; + ulong y; + ulong width; + ulong height; + float minz; + float maxz; + }; + +/* +//--- DXColor functions +void DXColorAdd(DXColor &pout,const DXColor &pc1,const DXColor &pc2); +void DXColorAdjustContrast(DXColor &pout,const DXColor &pc,float s); +void DXColorAdjustSaturation(DXColor &pout,const DXColor &pc,float s); +void DXColorLerp(DXColor &pout,const DXColor &pc1,const DXColor &pc2,float s); +void DXColorModulate(DXColor &pout,const DXColor &pc1,const DXColor &pc2); +void DXColorNegative(DXColor &pout,const DXColor &pc); +void DXColorScale(DXColor &pout,const DXColor &pc,float s); +void DXColorSubtract(DXColor &pout,const DXColor &pc1,const DXColor &pc2); +float DXFresnelTerm(float costheta,float refractionindex); + +//--- DXVector2 functions +void DXVec2Add(DXVector2 &pout,const DXVector2 &pv1,const DXVector2 &pv2); +void DXVec2BaryCentric(DXVector2 &pout,const DXVector2 &pv1,const DXVector2 &pv2,const DXVector2 &pv3,float f,float g); +void DXVec2CatmullRom(DXVector2 &pout,const DXVector2 &pv0,const DXVector2 &pv1,const DXVector2 &pv2,const DXVector2 &pv3,float s); +float DXVec2CCW(const DXVector2 &pv1,const DXVector2 &pv2); +float DXVec2Dot(const DXVector2 &pv1,const DXVector2 &pv2); +void DXVec2Hermite(DXVector2 &pout,const DXVector2 &pv1,const DXVector2 &pt1,const DXVector2 &pv2,const DXVector2 &pt2,float s); +float DXVec2Length(const DXVector2 &v); +float DXVec2LengthSq(const DXVector2 &v); +void DXVec2Lerp(DXVector2 &pout,const DXVector2 &pv1,const DXVector2 &pv2,float s); +void DXVec2Maximize(DXVector2 &pout,const DXVector2 &pv1,const DXVector2 &pv2); +void DXVec2Minimize(DXVector2 &pout,const DXVector2 &pv1,const DXVector2 &pv2); +void DXVec2Normalize(DXVector2 &pout,const DXVector2 &pv); +void DXVec2Scale(DXVector2 &pout,const DXVector2 &pv,float s); +void DXVec2Subtract(DXVector2 &pout,const DXVector2 &pv1,const DXVector2 &pv2); +void DXVec2Transform(DXVector4 &pout,const DXVector2 &pv,const DXMatrix &pm); +void DXVec2TransformCoord(DXVector2 &pout,const DXVector2 &pv,const DXMatrix &pm); +void DXVec2TransformNormal(DXVector2 &pout,const DXVector2 &pv,const DXMatrix &pm); + +//--- DXVector3 functions +void DXVec3Add(DXVector3 &pout,const DXVector3 &pv1,const DXVector3 &pv2); +void DXVec3BaryCentric(DXVector3 &pout,const DXVector3 &pv1,const DXVector3 &pv2,const DXVector3 &pv3,float f,float g); +void DXVec3CatmullRom(DXVector3 &pout,const DXVector3 &pv0,const DXVector3 &pv1,const DXVector3 &pv2,const DXVector3 &pv3,float s); +void DXVec3Cross(DXVector3 &pout,const DXVector3 &pv1,const DXVector3 &pv2); +float DXVec3Dot(const DXVector3 &pv1,const DXVector3 &pv2); +void DXVec3Hermite(DXVector3 &pout,const DXVector3 &pv1,const DXVector3 &pt1,const DXVector3 &pv2,const DXVector3 &pt2,float s); +float DXVec3Length(const DXVector3 &pv); +float DXVec3LengthSq(const DXVector3 &pv); +void DXVec3Lerp(DXVector3 &pout,const DXVector3 &pv1,const DXVector3 &pv2,float s); +void DXVec3Maximize(DXVector3 &pout,const DXVector3 &pv1,const DXVector3 &pv2); +void DXVec3Minimize(DXVector3 &pout,const DXVector3 &pv1,const DXVector3 &pv2); +void DXVec3Normalize(DXVector3 &pout,const DXVector3 &pv); +void DXVec3Project(DXVector3 &pout,const DXVector3 &pv,const DViewport &pviewport,const DXMatrix &pprojection,const DXMatrix &pview,const DXMatrix &pworld); +void DXVec3Scale(DXVector3 &pout,const DXVector3 &pv,float s); +void DXVec3Subtract(DXVector3 &pout,const DXVector3 &pv1,const DXVector3 &pv2); +void DXVec3Transform(DXVector4 &pout,const DXVector3 &pv,const DXMatrix &pm); +void DXVec3TransformCoord(DXVector3 &pout,const DXVector3 &pv,const DXMatrix &pm); +void DXVec3TransformNormal(DXVector3 &pout,const DXVector3 &pv,const DXMatrix &pm); +void DXVec3Unproject(DXVector3 &out,const DXVector3 &v,const DViewport &viewport,const DXMatrix &projection,const DXMatrix &view,const DXMatrix &world); + +//--- DXVector4 vector functions +void DXVec4Add(DXVector4 &pout,const DXVector4 &pv1,const DXVector4 &pv2); +void DXVec4BaryCentric(DXVector4 &pout,const DXVector4 &pv1,const DXVector4 &pv2,const DXVector4 &pv3,float f,float g); +void DXVec4CatmullRom(DXVector4 &pout,const DXVector4 &pv0,const DXVector4 &pv1,const DXVector4 &pv2,const DXVector4 &pv3,float s); +void DXVec4Cross(DXVector4 &pout,const DXVector4 &pv1,const DXVector4 &pv2,const DXVector4 &pv3); +float DXVec4Dot(const DXVector4 &pv1,const DXVector4 &pv2); +void DXVec4Hermite(DXVector4 &pout,const DXVector4 &pv1,const DXVector4 &pt1,const DXVector4 &pv2,const DXVector4 &pt2,float s); +float DXVec4Length(const DXVector4 &pv); +float DXVec4LengthSq(const DXVector4 &pv); +void DXVec4Lerp(DXVector4 &pout,const DXVector4 &pv1,const DXVector4 &pv2,float s); +void DXVec4Maximize(DXVector4 &pout,const DXVector4 &pv1,const DXVector4 &pv2); +void DXVec4Minimize(DXVector4 &pout,const DXVector4 &pv1,const DXVector4 &pv2); +void DXVec4Normalize(DXVector4 &pout,const DXVector4 &pv); +void DXVec4Scale(DXVector4 &pout,const DXVector4 &pv,float s); +void DXVec4Subtract(DXVector4 &pout,const DXVector4 &pv1,const DXVector4 &pv2); +void DXVec4Transform(DXVector4 &pout,const DXVector4 &pv,const DXMatrix &pm); + +//---DXQuaternion functions +void DXQuaternionBaryCentric(DXQuaternion &pout,DXQuaternion &pq1,DXQuaternion &pq2,DXQuaternion &pq3,float f,float g); +void DXQuaternionConjugate(DXQuaternion &pout,const DXQuaternion &pq); +float DXQuaternionDot(DXQuaternion &a,DXQuaternion &b); +void DXQuaternionExp(DXQuaternion &out,const DXQuaternion &q); +void DXQuaternionIdentity(DXQuaternion &out); +bool DXQuaternionIsIdentity(DXQuaternion &pq); +float DXQuaternionLength(const DXQuaternion &pq); +float DXQuaternionLengthSq(const DXQuaternion &pq); +void DXQuaternionInverse(DXQuaternion &pout,const DXQuaternion &pq); +void DXQuaternionLn(DXQuaternion &out,const DXQuaternion &q); +void DXQuaternionMultiply(DXQuaternion &pout,const DXQuaternion &pq1,const DXQuaternion &pq2); +void DXQuaternionNormalize(DXQuaternion &out,const DXQuaternion &q); +void DXQuaternionRotationAxis(DXQuaternion &out,const DXVector3 &v,float angle); +void DXQuaternionRotationMatrix(DXQuaternion &out,const DXMatrix &m); +void DXQuaternionRotationYawPitchRoll(DXQuaternion &out,float yaw,float pitch,float roll); +void DXQuaternionSlerp(DXQuaternion &out,DXQuaternion &q1,DXQuaternion &q2,float t); +void DXQuaternionSquad(DXQuaternion &pout,DXQuaternion &pq1,DXQuaternion &pq2,DXQuaternion &pq3,DXQuaternion &pq4,float t); +void DXQuaternionSquadSetup(DXQuaternion &paout,DXQuaternion &pbout,DXQuaternion &pcout,DXQuaternion &pq0,DXQuaternion &pq1,DXQuaternion &pq2,DXQuaternion &pq3); +void DXQuaternionToAxisAngle(const DXQuaternion &pq,DXVector3 &paxis,float &pangle); +DXQuaternion add_diff(const DXQuaternion &q1,const DXQuaternion &q2,const float add); + +//--- DXMatrix functions +void DXMatrixIdentity(DXMatrix &out); +bool DXMatrixIsIdentity(DXMatrix &pm); +void DXMatrixAffineTransformation(DXMatrix &out,float scaling,const DXVector3 &rotationcenter,const DXQuaternion &rotation,const DXVector3 &translation); +void DXMatrixAffineTransformation2D(DXMatrix &out,float scaling,const DXVector2 &rotationcenter,float rotation,const DXVector2 &translation); +int DXMatrixDecompose(DXVector3 &poutscale,DXQuaternion &poutrotation,DXVector3 &pouttranslation,const DXMatrix &pm); +float DXMatrixDeterminant(const DXMatrix &pm); +void DXMatrixInverse(DXMatrix &pout,float &pdeterminant,const DXMatrix &pm); +void DXMatrixLookAtLH(DXMatrix &out,const DXVector3 &eye,const DXVector3 &at,const DXVector3 &up); +void DXMatrixLookAtRH(DXMatrix &out,const DXVector3 &eye,const DXVector3 &at,const DXVector3 &up); +void DXMatrixMultiply(DXMatrix &pout,const DXMatrix &pm1,const DXMatrix &pm2); +void DXMatrixMultiplyTranspose(DXMatrix &pout,const DXMatrix &pm1,const DXMatrix &pm2); +void DXMatrixOrthoLH(DXMatrix &pout,float w,float h,float zn,float zf); +void DXMatrixOrthoOffCenterLH(DXMatrix &pout,float l,float r,float b,float t,float zn,float zf); +void DXMatrixOrthoOffCenterRH(DXMatrix &pout,float l,float r,float b,float t,float zn,float zf); +void DXMatrixOrthoRH(DXMatrix &pout,float w,float h,float zn,float zf); +void DXMatrixPerspectiveFovLH(DXMatrix &pout,float fovy,float aspect,float zn,float zf); +void DXMatrixPerspectiveFovRH(DXMatrix &pout,float fovy,float aspect,float zn,float zf); +void DXMatrixPerspectiveLH(DXMatrix &pout,float w,float h,float zn,float zf); +void DXMatrixPerspectiveOffCenterLH(DXMatrix &pout,float l,float r,float b,float t,float zn,float zf); +void DXMatrixPerspectiveOffCenterRH(DXMatrix &pout,float l,float r,float b,float t,float zn,float zf); +void DXMatrixPerspectiveRH(DXMatrix &pout,float w,float h,float zn,float zf); +void DXMatrixReflect(DXMatrix &pout,const DXPlane &pplane); +void DXMatrixRotationAxis(DXMatrix &out,const DXVector3 &v,float angle); +void DXMatrixRotationQuaternion(DXMatrix &pout,const DXQuaternion &pq); +void DXMatrixRotationX(DXMatrix &pout,float angle); +void DXMatrixRotationY(DXMatrix &pout,float angle); +void DXMatrixRotationYawPitchRoll(DXMatrix &out,float yaw,float pitch,float roll); +void DXMatrixRotationZ(DXMatrix &pout,float angle); +void DXMatrixScaling(DXMatrix &pout,float sx,float sy,float sz); +void DXMatrixShadow(DXMatrix &pout,const DXVector4 &plight,const DXPlane &pplane); +void DXMatrixTransformation(DXMatrix &pout,const DXVector3 &pscalingcenter,const DXQuaternion &pscalingrotation,const DXVector3 &pscaling,const DXVector3 &protationcenter,const DXQuaternion &protation,const DXVector3 &ptranslation); +void DXMatrixTransformation2D(DXMatrix &pout,const DXVector2 &pscalingcenter,float scalingrotation,const DXVector2 &pscaling,const DXVector2 &protationcenter,float rotation,const DXVector2 &ptranslation); +void DXMatrixTranslation(DXMatrix &pout,float x,float y,float z); +void DXMatrixTranspose(DXMatrix &pout,const DXMatrix &pm); + +//--- DXPlane functions | +float DXPlaneDot(const DXPlane &p1,const DXVector4 &p2); +float DXPlaneDotCoord(const DXPlane &pp,const DXVector4 &pv); +float DXPlaneDotNormal(const DXPlane &pp,const DXVector4 &pv); +void DXPlaneFromPointNormal(DXPlane &pout,const DXVector3 &pvpoint,const DXVector3 &pvnormal); +void DXPlaneFromPoints(DXPlane &pout,const DXVector3 &pv1,const DXVector3 &pv2,const DXVector3 &pv3); +void DXPlaneIntersectLine(DXVector3 &pout,const DXPlane &pp,const DXVector3 &pv1,const DXVector3 &pv2); +void DXPlaneNormalize(DXPlane &out,const DXPlane &p); +void DXPlaneScale(DXPlane &pout,const DXPlane &p,float s); +void DXPlaneTransform(DXPlane &pout,const DXPlane &pplane,const DXMatrix &pm); + +//---- spherical harmonic functions +void DXSHAdd(float &out[],int order,const float &a[],const float &b[]); +float DXSHDot(int order,const float &a[],const float &b[]); +int DXSHEvalConeLight(int order,const DXVector3 &dir,float radius,float Rintensity,float Gintensity,float Bintensity,float &rout[],float &gout[],float &bout[]); +void DXSHEvalDirection(float &out[],int order,const DXVector3 &dir); +int DXSHEvalDirectionalLight(int order,const DXVector3 &dir,float Rintensity,float Gintensity,float Bintensity,float &rout[],float &gout[],float &bout[]); +int DXSHEvalHemisphereLight(int order,const DXVector3 &dir,DXColor &top,DXColor &bottom,float &rout[],float &gout[],float &bout[]); +int DXSHEvalSphericalLight(int order,const DXVector3 &dir,float radius,float Rintensity,float Gintensity,float Bintensity,float &rout[],float &gout[],float &bout[]); +void DXSHMultiply2(float &out[],const float &a[],const float &b[]); +void DXSHMultiply3(float &out[],const float &a[],const float &b[]); +void DXSHMultiply4(float &out[],const float &a[],const float &b[]); +void DXSHRotate(float &out[],int order,const DXMatrix &matrix,const float &in[]); +void DXSHRotateZ(float &out[],int order,float angle,const float &in[]); +void DXSHScale(float &out[],int order,const float &a[],const float scale); + +//--- scalar functions +float DXScalarLerp(const float val1,const float val2,float s) +float DXScalarBiasScale(const float val,const float bias,const float scale) +*/ + +//+------------------------------------------------------------------+ +//| Adds two color values together to create a new color value. | +//+------------------------------------------------------------------+ +void DXColorAdd(DXColor &pout,const DXColor &pc1,const DXColor &pc2) + { + pout.r = pc1.r + pc2.r; + pout.g = pc1.g + pc2.g; + pout.b = pc1.b + pc2.b; + pout.a = pc1.a + pc2.a; + } +//+------------------------------------------------------------------+ +//| Adjusts the contrast value of a color. | +//+------------------------------------------------------------------+ +//| The input alpha channel is copied, unmodified, | +//| to the output alpha channel. | +//| | +//| This function interpolates the red,green,and blue color | +//| components of a DXColor structure between fifty percent gray | +//| and a specified contrast value,as shown in the following example.| +//| | +//| pout.r = 0.5f + s*(pc.r - 0.5f); | +//| | +//| If s is greater than 0 and less than 1,the contrast is decreased.| +//| If s is greater than 1, the contrast is increased. | +//+------------------------------------------------------------------+ +void DXColorAdjustContrast(DXColor &pout,const DXColor &pc,float s) + { + pout.r = 0.5f + s*(pc.r - 0.5f); + pout.g = 0.5f + s*(pc.g - 0.5f); + pout.b = 0.5f + s*(pc.b - 0.5f); + pout.a = pc.a; + } +//+------------------------------------------------------------------+ +//| Adjusts the saturation value of a color. | +//+------------------------------------------------------------------+ +//| The input alpha channel is copied, unmodified, | +//| to the output alpha channel. | +//| | +//| This function interpolates the red, green, and blue color | +//| components of a DXColor structure between an unsaturated color | +//| and a color, as shown in the following example. | +//| | +//| Approximate values for each component's contribution to | +//| luminance. Based upon the NTSC standard described in | +//| ITU-R Recommendation BT.709. | +//| float grey = pc.r*0.2125f + pc.g*0.7154f + pc.b*0.0721f; | +//| | +//| pout.r = grey + s*(pc.r - grey); | +//| If s is greater than 0 and less than 1, the saturation is | +//| decreased. If s is greater than 1, the saturation is increased. | +//| | +//| The grayscale color is computed as: | +//| r = g = b = 0.2125*r + 0.7154*g + 0.0721*b | +//+------------------------------------------------------------------+ +void DXColorAdjustSaturation(DXColor &pout,const DXColor &pc,float s) + { + float grey = pc.r*0.2125f + pc.g*0.7154f + pc.b*0.0721f; + pout.r = grey + s*(pc.r - grey); + pout.g = grey + s*(pc.g - grey); + pout.b = grey + s*(pc.b - grey); + pout.a = pc.a; + } +//+------------------------------------------------------------------+ +//| Uses linear interpolation to create a color value. | +//+------------------------------------------------------------------+ +//| This function interpolates the red, green, blue, and alpha | +//| components of a DXColor structure between two colors, as shown | +//| in the following example. | +//| | +//| pout.r = pC1.r + s * (pC2.r - pC1.r); | +//| | +//| If you are linearly interpolating between the colors A and B, | +//| and s is 0, the resulting color is A. | +//| If s is 1, the resulting color is color B. | +//+------------------------------------------------------------------+ +void DXColorLerp(DXColor &pout,const DXColor &pc1,const DXColor &pc2,float s) + { + pout.r = (1-s)*pc1.r + s*pc2.r; + pout.g = (1-s)*pc1.g + s*pc2.g; + pout.b = (1-s)*pc1.b + s*pc2.b; + pout.a = (1-s)*pc1.a + s*pc2.a; + } +//+------------------------------------------------------------------+ +//| Blends two colors. | +//+------------------------------------------------------------------+ +//| This function blends together two colors by multiplying matching | +//| color components, as shown in the following example. | +//| pout.r = pC1.r * pC2.r; | +//+------------------------------------------------------------------+ +void DXColorModulate(DXColor &pout,const DXColor &pc1,const DXColor &pc2) + { + pout.r = pc1.r*pc2.r; + pout.g = pc1.g*pc2.g; + pout.b = pc1.b*pc2.b; + pout.a = pc1.a*pc2.a; + } +//+------------------------------------------------------------------+ +//| Creates the negative color value of a color value. | +//+------------------------------------------------------------------+ +//| The input alpha channel is copied, unmodified, to the output | +//| alpha channel. | +//| This function returns the negative color value by subtracting 1.0| +//| from the color components of the DXColor structure, | +//| as shown in the following example. | +//| pout.r = 1.0f - pc.r; | +//+------------------------------------------------------------------+ +void DXColorNegative(DXColor &pout,const DXColor &pc) + { + pout.r = 1.0f - pc.r; + pout.g = 1.0f - pc.g; + pout.b = 1.0f - pc.b; + pout.a = pc.a; + } +//+------------------------------------------------------------------+ +//| Scales a color value. | +//+------------------------------------------------------------------+ +//| This function computes the scaled color value by multiplying | +//| the color components of the DXColor structure by the specified | +//| scale factor, as shown in the following example. | +//| pOut.r = pC.r*s; | +//+------------------------------------------------------------------+ +void DXColorScale(DXColor &pout,const DXColor &pc,float s) + { + pout.r = s*pc.r; + pout.g = s*pc.g; + pout.b = s*pc.b; + pout.a = s*pc.a; + } +//+------------------------------------------------------------------+ +//| Subtracts two color values to create a new color value. | +//+------------------------------------------------------------------+ +void DXColorSubtract(DXColor &pout,const DXColor &pc1,const DXColor &pc2) + { + pout.r = pc1.r - pc2.r; + pout.g = pc1.g - pc2.g; + pout.b = pc1.b - pc2.b; + pout.a = pc1.a - pc2.a; + } +//+------------------------------------------------------------------+ +//| Calculate the Fresnel term. | +//+------------------------------------------------------------------+ +//| To find the Fresnel term (F): | +//| If A is angle of incidence and B is the angle of refraction, | +//| then | +//| F = 0.5*[tan2(A - B)/tan2(A + B) + sin2(A - B)/sin2(A + B)] | +//| = 0.5*sin2(A - B)/sin2(A + B)*[cos2(A + B)/cos2(A - B) + 1] | +//| | +//| Let r = sina(A)/sin(B) (the relative refractive index) | +//| Let c = cos(A) | +//| Let g = (r2 + c2 - 1)1/2 | +//| | +//| Then,expanding using the trig identities and simplifying, | +//| you get: | +//| F = 0.5*(g + c)2/(g - c)2*([c(g + c)-1]2/[c(g - c) + 1]2 + 1) | +//+------------------------------------------------------------------+ +float DXFresnelTerm(float costheta,float refractionindex) + { + float g = (float)sqrt(refractionindex*refractionindex + costheta*costheta - 1.0f); + float a = g + costheta; + float d = g - costheta; + float result = (costheta*a - 1.0f)*(costheta*a - 1.0f)/((costheta*d + 1.0f)*(costheta*d + 1.0f)) + 1.0f; + result *= 0.5f*d*d/(a*a); +//--- + return(result); + } +//+------------------------------------------------------------------+ +//| Adds two 2D vectors. | +//+------------------------------------------------------------------+ +void DXVec2Add(DXVector2 &pout,const DXVector2 &pv1,const DXVector2 &pv2) + { + pout.x = pv1.x + pv2.x; + pout.y = pv1.y + pv2.y; + } +//+------------------------------------------------------------------+ +//| Returns a point in Barycentric coordinates, | +//| using the specified 2D vectors. | +//+------------------------------------------------------------------+ +void DXVec2BaryCentric(DXVector2 &pout,const DXVector2 &pv1,const DXVector2 &pv2,const DXVector2 &pv3,float f,float g) + { + pout.x = (1.0f-f-g)*(pv1.x) + f*(pv2.x) + g*(pv3.x); + pout.y = (1.0f-f-g)*(pv1.y) + f*(pv2.y) + g*(pv3.y); + } +//+------------------------------------------------------------------+ +//| Performs a Catmull-Rom interpolation, | +//| using the specified 2D vectors. | +//+------------------------------------------------------------------+ +void DXVec2CatmullRom(DXVector2 &pout,const DXVector2 &pv0,const DXVector2 &pv1,const DXVector2 &pv2,const DXVector2 &pv3,float s) + { + pout.x = 0.5f*(2.0f*pv1.x + (pv2.x-pv0.x)*s + (2.0f*pv0.x - 5.0f*pv1.x + 4.0f*pv2.x - pv3.x)*s*s + (pv3.x - 3.0f*pv2.x + 3.0f*pv1.x - pv0.x)*s*s*s); + pout.y = 0.5f*(2.0f*pv1.y + (pv2.y-pv0.y)*s + (2.0f*pv0.y - 5.0f*pv1.y + 4.0f*pv2.y - pv3.y)*s*s + (pv3.y - 3.0f*pv2.y + 3.0f*pv1.y - pv0.y)*s*s*s); + } +//+------------------------------------------------------------------+ +//| Returns the z-component by taking the cross product | +//| of two 2D vectors. | +//+------------------------------------------------------------------+ +float DXVec2CCW(const DXVector2 &pv1,const DXVector2 &pv2) + { + return(pv1.x*pv2.y - pv1.y*pv2.x); + } +//+------------------------------------------------------------------+ +//| Determines the dot product of two 2D vectors. | +//+------------------------------------------------------------------+ +float DXVec2Dot(const DXVector2 &pv1,const DXVector2 &pv2) + { + return(pv1.x*pv2.x + pv1.y*pv2.y); + } +//+------------------------------------------------------------------+ +//| Performs a Hermite spline interpolation, | +//| using the specified 2D vectors. | +//+------------------------------------------------------------------+ +void DXVec2Hermite(DXVector2 &pout,const DXVector2 &pv1,const DXVector2 &pt1,const DXVector2 &pv2,const DXVector2 &pt2,float s) + { +//--- prepare coefficients + float h1 = 2.0f*s*s*s - 3.0f*s*s + 1.0f; + float h2 = s*s*s - 2.0f*s*s + s; + float h3 = -2.0f*s*s*s + 3.0f*s*s; + float h4 = s*s*s - s*s; +//--- calculate interpolated point + pout.x = h1*pv1.x + h2*pt1.x + h3*pv2.x + h4*pt2.x; + pout.y = h1*pv1.y + h2*pt1.y + h3*pv2.y + h4*pt2.y; + } +//+------------------------------------------------------------------+ +//| Returns the length of a 2D vector. | +//+------------------------------------------------------------------+ +float DXVec2Length(const DXVector2 &v) + { + return((float)sqrt(v.x*v.x + v.y*v.y)); + } +//+------------------------------------------------------------------+ +//| Returns the square of the length of a 2D vector. | +//+------------------------------------------------------------------+ +float DXVec2LengthSq(const DXVector2 &v) + { + return((float)(v.x*v.x + v.y*v.y)); + } +//+------------------------------------------------------------------+ +//| Performs a linear interpolation between two 2D vectors. | +//+------------------------------------------------------------------+ +void DXVec2Lerp(DXVector2 &pout,const DXVector2 &pv1,const DXVector2 &pv2,float s) + { + pout.x = (1.0f-s)*pv1.x + s*pv2.x; + pout.y = (1.0f-s)*pv1.y + s*pv2.y; + } +//+------------------------------------------------------------------+ +//| Returns a 2D vector that is made up of the largest components | +//| of two 2D vectors. | +//+------------------------------------------------------------------+ +void DXVec2Maximize(DXVector2 &pout,const DXVector2 &pv1,const DXVector2 &pv2) + { + pout.x = (float)fmax(pv1.x,pv2.x); + pout.y = (float)fmax(pv1.y,pv2.y); + } +//+------------------------------------------------------------------+ +//| Returns a 2D vector that is made up of the smallest components | +//| of two 2D vectors. | +//+------------------------------------------------------------------+ +void DXVec2Minimize(DXVector2 &pout,const DXVector2 &pv1,const DXVector2 &pv2) + { + pout.x = (float)fmin(pv1.x,pv2.x); + pout.y = (float)fmin(pv1.y,pv2.y); + } +//+------------------------------------------------------------------+ +//| Returns the normalized version of a 2D vector. | +//+------------------------------------------------------------------+ +void DXVec2Normalize(DXVector2 &pout,const DXVector2 &pv) + { +//--- calculate length + float norm = DXVec2Length(pv); + if(!norm) + { + pout.x = 0.0f; + pout.y = 0.0f; + } + else + { + pout.x = pv.x/norm; + pout.y = pv.y/norm; + } + } +//+------------------------------------------------------------------+ +//| Scales a 2D vector. | +//+------------------------------------------------------------------+ +void DXVec2Scale(DXVector2 &pout,const DXVector2 &pv,float s) + { + pout.x = s*pv.x; + pout.y = s*pv.y; + } +//+------------------------------------------------------------------+ +//| DXVec3Subtract | +//+------------------------------------------------------------------+ +void DXVec2Subtract(DXVector2 &pout,const DXVector2 &pv1,const DXVector2 &pv2) + { + pout.x = pv1.x - pv2.x; + pout.y = pv1.y - pv2.y; + } +//+------------------------------------------------------------------+ +//| Transforms a 2D vector by a given matrix. | +//| This function transforms the vector pv(x,y,0,1) by the matrix pm.| +//+------------------------------------------------------------------+ +void DXVec2Transform(DXVector4 &pout,const DXVector2 &pv,const DXMatrix &pm) + { + DXVector4 out; + out.x = pm.m[0][0]*pv.x + pm.m[1][0]*pv.y + pm.m[3][0]; + out.y = pm.m[0][1]*pv.x + pm.m[1][1]*pv.y + pm.m[3][1]; + out.z = pm.m[0][2]*pv.x + pm.m[1][2]*pv.y + pm.m[3][2]; + out.w = pm.m[0][3]*pv.x + pm.m[1][3]*pv.y + pm.m[3][3]; + pout = out; + } +//+------------------------------------------------------------------+ +//| Transforms a 2D vector by a given matrix, | +//| projecting the result back into w = 1. | +//| This function transforms the vector pv(x,y,0,1) by the matrix pm.| +//+------------------------------------------------------------------+ +void DXVec2TransformCoord(DXVector2 &pout,const DXVector2 &pv,const DXMatrix &pm) + { + float norm = pm.m[0][3]*pv.x + pm.m[1][3]*pv.y + pm.m[3][3]; + if(norm) + { + pout.x = (pm.m[0][0]*pv.x + pm.m[1][0]*pv.y + pm.m[3][0])/norm; + pout.y = (pm.m[0][1]*pv.x + pm.m[1][1]*pv.y + pm.m[3][1])/norm; + } + else + { + pout.x = 0.0f; + pout.y = 0.0f; + } + } +//+------------------------------------------------------------------+ +//| Transforms the 2D vector normal by the given matrix. | +//+------------------------------------------------------------------+ +void DXVec2TransformNormal(DXVector2 &pout,const DXVector2 &pv,const DXMatrix &pm) + { + pout.x = pm.m[0][0]*pv.x + pm.m[1][0]*pv.y; + pout.y = pm.m[0][1]*pv.x + pm.m[1][1]*pv.y; + } +//+------------------------------------------------------------------+ +//| Adds two 3D vectors. | +//+------------------------------------------------------------------+ +void DXVec3Add(DXVector3 &pout,const DXVector3 &pv1,const DXVector3 &pv2) + { + pout.x = pv1.x + pv2.x; + pout.y = pv1.y + pv2.y; + pout.z = pv1.z + pv2.z; + } +//+------------------------------------------------------------------+ +//| Returns a point in Barycentric coordinates, | +//| using the specified 3D vectors. | +//+------------------------------------------------------------------+ +void DXVec3BaryCentric(DXVector3 &pout,const DXVector3 &pv1,const DXVector3 &pv2,const DXVector3 &pv3,float f,float g) + { + pout.x = (1.0f-f-g)*pv1.x + f*pv2.x + g*pv3.x; + pout.y = (1.0f-f-g)*pv1.y + f*pv2.y + g*pv3.y; + pout.z = (1.0f-f-g)*pv1.z + f*pv2.z + g*pv3.z; + } +//+------------------------------------------------------------------+ +//| Performs a Catmull-Rom interpolation, | +//| using the specified 3D vectors. | +//+------------------------------------------------------------------+ +void DXVec3CatmullRom(DXVector3 &pout,const DXVector3 &pv0,const DXVector3 &pv1,const DXVector3 &pv2,const DXVector3 &pv3,float s) + { + pout.x = 0.5f*(2.0f*pv1.x + (pv2.x - pv0.x)*s + (2.0f*pv0.x - 5.0f*pv1.x + 4.0f*pv2.x - pv3.x)*s*s + (pv3.x - 3.0f*pv2.x + 3.0f*pv1.x - pv0.x)*s*s*s); + pout.y = 0.5f*(2.0f*pv1.y + (pv2.y - pv0.y)*s + (2.0f*pv0.y - 5.0f*pv1.y + 4.0f*pv2.y - pv3.y)*s*s + (pv3.y - 3.0f*pv2.y + 3.0f*pv1.y - pv0.y)*s*s*s); + pout.z = 0.5f*(2.0f*pv1.z + (pv2.z - pv0.z)*s + (2.0f*pv0.z - 5.0f*pv1.z + 4.0f*pv2.z - pv3.z)*s*s + (pv3.z - 3.0f*pv2.z + 3.0f*pv1.z - pv0.z)*s*s*s); + } +//+------------------------------------------------------------------+ +//| Determines the cross-product of two 3D vectors. | +//+------------------------------------------------------------------+ +void DXVec3Cross(DXVector3 &pout,const DXVector3 &pv1,const DXVector3 &pv2) + { + pout.x = pv1.y*pv2.z - pv1.z*pv2.y; + pout.y = pv1.z*pv2.x - pv1.x*pv2.z; + pout.z = pv1.x*pv2.y - pv1.y*pv2.x; + } +//+------------------------------------------------------------------+ +//| Determines the dot product of two 3D vectors. | +//+------------------------------------------------------------------+ +float DXVec3Dot(const DXVector3 &pv1,const DXVector3 &pv2) + { + return(pv1.x*pv2.x + pv1.y*pv2.y + pv1.z*pv2.z); + } +//+------------------------------------------------------------------+ +//| Performs a Hermite spline interpolation, | +//| using the specified 3D vectors. | +//+------------------------------------------------------------------+ +void DXVec3Hermite(DXVector3 &pout,const DXVector3 &pv1,const DXVector3 &pt1,const DXVector3 &pv2,const DXVector3 &pt2,float s) + { + float h1 = 2.0f*s*s*s - 3.0f*s*s + 1.0f; + float h2 = s*s*s - 2.0f*s*s + s; + float h3 = -2.0f*s*s*s + 3.0f*s*s; + float h4 = s*s*s - s*s; +//--- calculate interpolated coordinates + pout.x = h1*pv1.x + h2*pt1.x + h3*pv2.x + h4*pt2.x; + pout.y = h1*pv1.y + h2*pt1.y + h3*pv2.y + h4*pt2.y; + pout.z = h1*pv1.z + h2*pt1.z + h3*pv2.z + h4*pt2.z; + } +//+------------------------------------------------------------------+ +//| Returns the length of a 3D vector. | +//+------------------------------------------------------------------+ +float DXVec3Length(const DXVector3 &pv) + { + return((float)sqrt(pv.x*pv.x + pv.y*pv.y + pv.z*pv.z)); + } +//+------------------------------------------------------------------+ +//| Returns the square of the length of a 3D vector. | +//+------------------------------------------------------------------+ +float DXVec3LengthSq(const DXVector3 &pv) + { + return((float)(pv.x*pv.x + pv.y*pv.y + pv.z*pv.z)); + } +//+------------------------------------------------------------------+ +//| Performs a linear interpolation between two 3D vectors. | +//+------------------------------------------------------------------+ +void DXVec3Lerp(DXVector3 &pout,const DXVector3 &pv1,const DXVector3 &pv2,float s) + { + pout.x = (1.0f-s)*pv1.x + s*pv2.x; + pout.y = (1.0f-s)*pv1.y + s*pv2.y; + pout.z = (1.0f-s)*pv1.z + s*pv2.z; + } +//+------------------------------------------------------------------+ +//| Returns a 3D vector that is made up of the largest components | +//| of two 3D vectors. | +//+------------------------------------------------------------------+ +void DXVec3Maximize(DXVector3 &pout,const DXVector3 &pv1,const DXVector3 &pv2) + { + pout.x = (float)fmax(pv1.x,pv2.x); + pout.y = (float)fmax(pv1.y,pv2.y); + pout.z = (float)fmax(pv1.z,pv2.z); + } +//+------------------------------------------------------------------+ +//| Returns a 3D vector that is made up of the smallest components | +//| of two 3D vectors. | +//+------------------------------------------------------------------+ +void DXVec3Minimize(DXVector3 &pout,const DXVector3 &pv1,const DXVector3 &pv2) + { + pout.x = (float)fmin(pv1.x,pv2.x); + pout.y = (float)fmin(pv1.y,pv2.y); + pout.z = (float)fmin(pv1.z,pv2.z); + } +//+------------------------------------------------------------------+ +//| Returns the normalized version of a 3D vector. | +//+------------------------------------------------------------------+ +void DXVec3Normalize(DXVector3 &pout,const DXVector3 &pv) + { +//--- calculate length + float norm = DXVec3Length(pv); + if(!norm) + { + pout.x = 0.0f; + pout.y = 0.0f; + pout.z = 0.0f; + } + else + { + pout.x = pv.x/norm; + pout.y = pv.y/norm; + pout.z = pv.z/norm; + } + } +//+------------------------------------------------------------------+ +//| Projects a 3D vector from object space into screen space. | +//+------------------------------------------------------------------+ +void DXVec3Project(DXVector3 &pout,const DXVector3 &pv,const DViewport &pviewport,const DXMatrix &pprojection,const DXMatrix &pview,const DXMatrix &pworld) + { + DXMatrix m; + DXMatrixIdentity(m); +//--- pworld + DXMatrixMultiply(m,m,pworld); +//--- pview + DXMatrixMultiply(m,m,pview); +//--- pprojection + DXMatrixMultiply(m,m,pprojection); + DXVec3TransformCoord(pout,pv,m); +//---pviewport + pout.x = pviewport.x + (1.0f + pout.x)*pviewport.width/2.0f; + pout.y = pviewport.y + (1.0f - pout.y)*pviewport.height/2.0f; + pout.z = pviewport.minz + pout.z*(pviewport.maxz - pviewport.minz); + } +//+------------------------------------------------------------------+ +//| Scales a 3D vector. | +//+------------------------------------------------------------------+ +void DXVec3Scale(DXVector3 &pout,const DXVector3 &pv,float s) + { + pout.x = s*pv.x; + pout.y = s*pv.y; + pout.z = s*pv.z; + } +//+------------------------------------------------------------------+ +//| Subtracts two 3D vectors. | +//+------------------------------------------------------------------+ +void DXVec3Subtract(DXVector3 &pout,const DXVector3 &pv1,const DXVector3 &pv2) + { + pout.x = pv1.x - pv2.x; + pout.y = pv1.y - pv2.y; + pout.z = pv1.z - pv2.z; + } +//+------------------------------------------------------------------+ +//| Transforms vector (x,y,z,1) by a given matrix. | +//+------------------------------------------------------------------+ +void DXVec3Transform(DXVector4 &pout,const DXVector3 &pv,const DXMatrix &pm) + { + DXVector4 out; +//--- + out.x = pm.m[0][0]*pv.x + pm.m[1][0]*pv.y + pm.m[2][0]*pv.z + pm.m[3][0]; + out.y = pm.m[0][1]*pv.x + pm.m[1][1]*pv.y + pm.m[2][1]*pv.z + pm.m[3][1]; + out.z = pm.m[0][2]*pv.x + pm.m[1][2]*pv.y + pm.m[2][2]*pv.z + pm.m[3][2]; + out.w = pm.m[0][3]*pv.x + pm.m[1][3]*pv.y + pm.m[2][3]*pv.z + pm.m[3][3]; + pout = out; + } +//+------------------------------------------------------------------+ +//| Transforms a 3D vector by a given matrix, | +//| projecting the result back into w = 1. | +//+------------------------------------------------------------------+ +void DXVec3TransformCoord(DXVector3 &pout,const DXVector3 &pv,const DXMatrix &pm) + { + float norm = pm.m[0][3]*pv.x + pm.m[1][3]*pv.y + pm.m[2][3]*pv.z + pm.m[3][3]; +//--- + if(norm) + { + pout.x = (pm.m[0][0]*pv.x + pm.m[1][0]*pv.y + pm.m[2][0]*pv.z + pm.m[3][0])/norm; + pout.y = (pm.m[0][1]*pv.x + pm.m[1][1]*pv.y + pm.m[2][1]*pv.z + pm.m[3][1])/norm; + pout.z = (pm.m[0][2]*pv.x + pm.m[1][2]*pv.y + pm.m[2][2]*pv.z + pm.m[3][2])/norm; + } + else + { + pout.x = 0.0f; + pout.y = 0.0f; + pout.z = 0.0f; + } + } +//+------------------------------------------------------------------+ +//| Transforms the 3D vector normal by the given matrix. | +//+------------------------------------------------------------------+ +void DXVec3TransformNormal(DXVector3 &pout,const DXVector3 &pv,const DXMatrix &pm) + { + pout.x = pm.m[0][0]*pv.x + pm.m[1][0]*pv.y + pm.m[2][0]*pv.z; + pout.y = pm.m[0][1]*pv.x + pm.m[1][1]*pv.y + pm.m[2][1]*pv.z; + pout.z = pm.m[0][2]*pv.x + pm.m[1][2]*pv.y + pm.m[2][2]*pv.z; + } +//+------------------------------------------------------------------+ +//| Projects a vector from screen space into object space. | +//+------------------------------------------------------------------+ +void DXVec3Unproject(DXVector3 &out,const DXVector3 &v,const DViewport &viewport,const DXMatrix &projection,const DXMatrix &view,const DXMatrix &world) + { + DXMatrix m; + DXMatrixIdentity(m); +//--- world + DXMatrixMultiply(m,m,world); +//--- view + DXMatrixMultiply(m,m,view); +//--- projection + DXMatrixMultiply(m,m,projection); +//--- calculate inverse matrix + float det=0.0f; + DXMatrixInverse(m,det,m); + out = v; +//--- viewport + out.x = 2.0f*(out.x - viewport.x)/viewport.width - 1.0f; + out.y = 1.0f - 2.0f*(out.y - viewport.y)/viewport.height; + out.z = (out.z - viewport.minz)/(viewport.maxz - viewport.minz); +//--- + DXVec3TransformCoord(out,out,m); + } +//+------------------------------------------------------------------+ +//| Adds two 4D vectors. | +//+------------------------------------------------------------------+ +void DXVec4Add(DXVector4 &pout,const DXVector4 &pv1,const DXVector4 &pv2) + { + pout.x = pv1.x + pv2.x; + pout.y = pv1.y + pv2.y; + pout.z = pv1.z + pv2.z; + pout.w = pv1.w + pv2.w; + } +//+------------------------------------------------------------------+ +//| Returns a point in Barycentric coordinates, | +//| using the specified 4D vectors. | +//+------------------------------------------------------------------+ +void DXVec4BaryCentric(DXVector4 &pout,const DXVector4 &pv1,const DXVector4 &pv2,const DXVector4 &pv3,float f,float g) + { + pout.x = (1.0f-f-g)*(pv1.x) + f*(pv2.x) + g*(pv3.x); + pout.y = (1.0f-f-g)*(pv1.y) + f*(pv2.y) + g*(pv3.y); + pout.z = (1.0f-f-g)*(pv1.z) + f*(pv2.z) + g*(pv3.z); + pout.w = (1.0f-f-g)*(pv1.w) + f*(pv2.w) + g*(pv3.w); + } +//+------------------------------------------------------------------+ +//| Performs a Catmull-Rom interpolation, | +//| using the specified 4D vectors. | +//+------------------------------------------------------------------+ +void DXVec4CatmullRom(DXVector4 &pout,const DXVector4 &pv0,const DXVector4 &pv1,const DXVector4 &pv2,const DXVector4 &pv3,float s) + { + pout.x = 0.5f*(2.0f*pv1.x + (pv2.x - pv0.x)*s + (2.0f*pv0.x - 5.0f*pv1.x + 4.0f*pv2.x - pv3.x)*s*s + (pv3.x -3.0f*pv2.x + 3.0f*pv1.x - pv0.x)*s*s*s); + pout.y = 0.5f*(2.0f*pv1.y + (pv2.y - pv0.y)*s + (2.0f*pv0.y - 5.0f*pv1.y + 4.0f*pv2.y - pv3.y)*s*s + (pv3.y -3.0f*pv2.y + 3.0f*pv1.y - pv0.y)*s*s*s); + pout.z = 0.5f*(2.0f*pv1.z + (pv2.z - pv0.z)*s + (2.0f*pv0.z - 5.0f*pv1.z + 4.0f*pv2.z - pv3.z)*s*s + (pv3.z -3.0f*pv2.z + 3.0f*pv1.z - pv0.z)*s*s*s); + pout.w = 0.5f*(2.0f*pv1.w + (pv2.w - pv0.w)*s + (2.0f*pv0.w - 5.0f*pv1.w + 4.0f*pv2.w - pv3.w)*s*s + (pv3.w -3.0f*pv2.w + 3.0f*pv1.w - pv0.w)*s*s*s); + } +//+------------------------------------------------------------------+ +//| Determines the cross-product in four dimensions. | +//+------------------------------------------------------------------+ +void DXVec4Cross(DXVector4 &pout,const DXVector4 &pv1,const DXVector4 &pv2,const DXVector4 &pv3) + { + DXVector4 out; + out.x = pv1.y*(pv2.z*pv3.w - pv3.z*pv2.w) - pv1.z*(pv2.y*pv3.w - pv3.y*pv2.w) + pv1.w*(pv2.y*pv3.z - pv2.z*pv3.y); + out.y = -(pv1.x*(pv2.z*pv3.w - pv3.z*pv2.w) - pv1.z*(pv2.x*pv3.w - pv3.x*pv2.w) + pv1.w*(pv2.x*pv3.z - pv3.x*pv2.z)); + out.z = pv1.x*(pv2.y*pv3.w - pv3.y*pv2.w) - pv1.y*(pv2.x*pv3.w - pv3.x*pv2.w) + pv1.w*(pv2.x*pv3.y - pv3.x*pv2.y); + out.w = -(pv1.x*(pv2.y*pv3.z - pv3.y*pv2.z) - pv1.y*(pv2.x*pv3.z - pv3.x*pv2.z) + pv1.z*(pv2.x*pv3.y - pv3.x*pv2.y)); + pout = out; + } +//+------------------------------------------------------------------+ +//| Determines the dot product of two 4D vectors. | +//+------------------------------------------------------------------+ +float DXVec4Dot(const DXVector4 &pv1,const DXVector4 &pv2) + { + return(pv1.x*pv2.x + pv1.y*pv2.y + pv1.z*pv2.z+ pv1.w*pv2.w); + } +//+------------------------------------------------------------------+ +//| Performs a Hermite spline interpolation, | +//| using the specified 4D vectors. | +//+------------------------------------------------------------------+ +void DXVec4Hermite(DXVector4 &pout,const DXVector4 &pv1,const DXVector4 &pt1,const DXVector4 &pv2,const DXVector4 &pt2,float s) + { + float h1 = 2.0f*s*s*s - 3.0f*s*s + 1.0f; + float h2 = s*s*s - 2.0f*s*s + s; + float h3 = -2.0f*s*s*s + 3.0f*s*s; + float h4 = s*s*s - s*s; + pout.x = h1*pv1.x + h2*pt1.x + h3*pv2.x + h4*pt2.x; + pout.y = h1*pv1.y + h2*pt1.y + h3*pv2.y + h4*pt2.y; + pout.z = h1*pv1.z + h2*pt1.z + h3*pv2.z + h4*pt2.z; + pout.w = h1*pv1.w + h2*pt1.w + h3*pv2.w + h4*pt2.w; + } +//+------------------------------------------------------------------+ +//| Returns the length of a 4D vector. | +//+------------------------------------------------------------------+ +float DXVec4Length(const DXVector4 &pv) + { + return((float)sqrt(pv.x*pv.x + pv.y*pv.y + pv.z*pv.z+ pv.w*pv.w)); + } +//+------------------------------------------------------------------+ +//| Returns the square of the length of a 4D vector. | +//+------------------------------------------------------------------+ +float DXVec4LengthSq(const DXVector4 &pv) + { + return((float)(pv.x*pv.x + pv.y*pv.y + pv.z*pv.z)); + } +//+------------------------------------------------------------------+ +//| Performs a linear interpolation between two 4D vectors. | +//+------------------------------------------------------------------+ +void DXVec4Lerp(DXVector4 &pout,const DXVector4 &pv1,const DXVector4 &pv2,float s) + { + pout.x = (1.0f-s)*pv1.x + s*pv2.x; + pout.y = (1.0f-s)*pv1.y + s*pv2.y; + pout.z = (1.0f-s)*pv1.z + s*pv2.z; + pout.w = (1.0f-s)*pv1.w + s*pv2.w; + } +//+------------------------------------------------------------------+ +//| Returns a 4D vector that is made up of the largest components | +//| of two 4D vectors. | +//+------------------------------------------------------------------+ +void DXVec4Maximize(DXVector4 &pout,const DXVector4 &pv1,const DXVector4 &pv2) + { + pout.x = (float)fmax(pv1.x,pv2.x); + pout.y = (float)fmax(pv1.y,pv2.y); + pout.z = (float)fmax(pv1.z,pv2.z); + pout.w = (float)fmax(pv1.w,pv2.w); + } +//+------------------------------------------------------------------+ +//| Returns a 4D vector that is made up of the smallest components | +//| of two 4D vectors. | +//+------------------------------------------------------------------+ +void DXVec4Minimize(DXVector4 &pout,const DXVector4 &pv1,const DXVector4 &pv2) + { + pout.x = (float)fmin(pv1.x,pv2.x); + pout.y = (float)fmin(pv1.y,pv2.y); + pout.z = (float)fmin(pv1.z,pv2.z); + pout.w = (float)fmin(pv1.w,pv2.w); + } +//+------------------------------------------------------------------+ +//| Returns the normalized version of a 4D vector. | +//+------------------------------------------------------------------+ +void DXVec4Normalize(DXVector4 &pout,const DXVector4 &pv) + { +//--- calculate length + float norm = DXVec4Length(pv); + if(!norm) + { + pout.x = 0.0f; + pout.y = 0.0f; + pout.z = 0.0f; + pout.w = 0.0f; + } + else + { + pout.x = pv.x/norm; + pout.y = pv.y/norm; + pout.z = pv.z/norm; + pout.w = pv.w/norm; + } + } +//+------------------------------------------------------------------+ +//| Scales a 4D vector. | +//+------------------------------------------------------------------+ +void DXVec4Scale(DXVector4 &pout,const DXVector4 &pv,float s) + { + pout.x = s*pv.x; + pout.y = s*pv.y; + pout.z = s*pv.z; + pout.w = s*pv.w; + } +//+------------------------------------------------------------------+ +//| Subtracts two 4D vectors. | +//+------------------------------------------------------------------+ +void DXVec4Subtract(DXVector4 &pout,const DXVector4 &pv1,const DXVector4 &pv2) + { + pout.x = pv1.x - pv2.x; + pout.y = pv1.y - pv2.y; + pout.z = pv1.z - pv2.z; + pout.w = pv1.w - pv2.w; + } +//+------------------------------------------------------------------+ +//| Transforms a 4D vector by a given matrix. | +//+------------------------------------------------------------------+ +void DXVec4Transform(DXVector4 &pout,const DXVector4 &pv,const DXMatrix &pm) + { + DXVector4 temp; + temp.x = pm.m[0][0]*pv.x + pm.m[1][0]*pv.y + pm.m[2][0]*pv.z + pm.m[3][0]*pv.w; + temp.y = pm.m[0][1]*pv.x + pm.m[1][1]*pv.y + pm.m[2][1]*pv.z + pm.m[3][1]*pv.w; + temp.z = pm.m[0][2]*pv.x + pm.m[1][2]*pv.y + pm.m[2][2]*pv.z + pm.m[3][2]*pv.w; + temp.w = pm.m[0][3]*pv.x + pm.m[1][3]*pv.y + pm.m[2][3]*pv.z + pm.m[3][3]*pv.w; + pout=temp; + } +//+------------------------------------------------------------------+ +//| Returns a quaternion in barycentric coordinates. | +//+------------------------------------------------------------------+ +void DXQuaternionBaryCentric(DXQuaternion &pout,DXQuaternion &pq1,DXQuaternion &pq2,DXQuaternion &pq3,float f,float g) + { + DXQuaternion temp1,temp2; + DXQuaternionSlerp(temp1,pq1,pq2,f+g); + DXQuaternionSlerp(temp2,pq1,pq3,f+g); + DXQuaternionSlerp(pout,temp1,temp2,g/(f+g)); + } +//+------------------------------------------------------------------+ +//| Returns the conjugate of a quaternion. | +//+------------------------------------------------------------------+ +void DXQuaternionConjugate(DXQuaternion &pout,const DXQuaternion &pq) + { + pout.x = -pq.x; + pout.y = -pq.y; + pout.z = -pq.z; + pout.w = pq.w; + } +//+------------------------------------------------------------------+ +//| Returns the dot product of two quaternions. | +//+------------------------------------------------------------------+ +float DXQuaternionDot(DXQuaternion &a,DXQuaternion &b) + { + return(a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w); + } +//+------------------------------------------------------------------+ +//| Calculates the exponential. | +//| This method converts a pure quaternion to a unit quaternion. | +//| DXQuaternionExp expects a pure quaternion, where w is ignored | +//| in the calculation (w == 0). | +//+------------------------------------------------------------------+ +void DXQuaternionExp(DXQuaternion &out,const DXQuaternion &q) + { + float norm = (float)sqrt(q.x*q.x + q.y*q.y + q.z*q.z); + if(norm) + { + out.x = (float)sin(norm)*q.x/norm; + out.y = (float)sin(norm)*q.y/norm; + out.z = (float)sin(norm)*q.z/norm; + out.w = (float)cos(norm); + } + else + { + out.x = 0.0f; + out.y = 0.0f; + out.z = 0.0f; + out.w = 1.0f; + } + } +//+------------------------------------------------------------------+ +//| Returns the identity quaternion. | +//+------------------------------------------------------------------+ +void DXQuaternionIdentity(DXQuaternion &out) + { + out.x = 0.0f; + out.y = 0.0f; + out.z = 0.0f; + out.w = 1.0f; + } +//+------------------------------------------------------------------+ +//| Determines if a quaternion is an identity quaternion. | +//+------------------------------------------------------------------+ +bool DXQuaternionIsIdentity(DXQuaternion &pq) + { + return ((pq.x == 0.0f) && (pq.y == 0.0f) && (pq.z == 0.0f) && (pq.w == 1.0f)); + } +//+------------------------------------------------------------------+ +//| Returns the length of a quaternion. | +//+------------------------------------------------------------------+ +float DXQuaternionLength(const DXQuaternion &pq) + { + return((float)sqrt(pq.x*pq.x + pq.y*pq.y + pq.z*pq.z + pq.w*pq.w)); + } +//+------------------------------------------------------------------+ +//| Returns the square of the length of a quaternion. | +//+------------------------------------------------------------------+ +float DXQuaternionLengthSq(const DXQuaternion &pq) + { + return((float)(pq.x*pq.x + pq.y*pq.y + pq.z*pq.z + pq.w*pq.w)); + } +//+------------------------------------------------------------------+ +//| Conjugates and renormalizes a quaternion. | +//+------------------------------------------------------------------+ +void DXQuaternionInverse(DXQuaternion &pout,const DXQuaternion &pq) + { + float norm = DXQuaternionLengthSq(pq); + pout.x = -pq.x/norm; + pout.y = -pq.y/norm; + pout.z = -pq.z/norm; + pout.w = pq.w/norm; + } +//+------------------------------------------------------------------+ +//| Calculates the natural logarithm. | +//| The DXQuaternionLn function works only for unit quaternions. | +//+------------------------------------------------------------------+ +void DXQuaternionLn(DXQuaternion &out,const DXQuaternion &q) + { + float t; + if((q.w >= 1.0f) || (q.w == -1.0f)) + t = 1.0f; + else + t = (float)(acos(q.w)/sqrt(1.0f - q.w*q.w)); + out.x = t*q.x; + out.y = t*q.y; + out.z = t*q.z; + out.w = 0.0f; + } +//+------------------------------------------------------------------+ +//| Multiplies two quaternions. | +//+------------------------------------------------------------------+ +void DXQuaternionMultiply(DXQuaternion &pout,const DXQuaternion &pq1,const DXQuaternion &pq2) + { + DXQuaternion out; + out.x = pq2.w*pq1.x + pq2.x*pq1.w + pq2.y*pq1.z - pq2.z*pq1.y; + out.y = pq2.w*pq1.y - pq2.x*pq1.z + pq2.y*pq1.w + pq2.z*pq1.x; + out.z = pq2.w*pq1.z + pq2.x*pq1.y - pq2.y*pq1.x + pq2.z*pq1.w; + out.w = pq2.w*pq1.w - pq2.x*pq1.x - pq2.y*pq1.y - pq2.z*pq1.z; + pout = out; + } +//+------------------------------------------------------------------+ +//| Computes a unit length quaternion. | +//+------------------------------------------------------------------+ +void DXQuaternionNormalize(DXQuaternion &out,const DXQuaternion &q) + { + float norm = DXQuaternionLength(q); + if(!norm) + { + out.x = 0.0f; + out.y = 0.0f; + out.z = 0.0f; + out.w = 0.0f; + } + else + { + out.x = q.x/norm; + out.y = q.y/norm; + out.z = q.z/norm; + out.w = q.w/norm; + } + } +//+------------------------------------------------------------------+ +//| Rotates a quaternion about an arbitrary axis. | +//+------------------------------------------------------------------+ +void DXQuaternionRotationAxis(DXQuaternion &out,const DXVector3 &v,float angle) + { + DXVector3 temp; + DXVec3Normalize(temp,v); + out.x = (float)sin(angle/2.0f)*temp.x; + out.y = (float)sin(angle/2.0f)*temp.y; + out.z = (float)sin(angle/2.0f)*temp.z; + out.w = (float)cos(angle/2.0f); + } +//+------------------------------------------------------------------+ +//| Builds a quaternion from a rotation matrix. | +//+------------------------------------------------------------------+ +void DXQuaternionRotationMatrix(DXQuaternion &out,const DXMatrix &m) + { + float s; + float trace = m.m[0][0] + m.m[1][1] + m.m[2][2] + 1.0f; + if(trace>1.0f) + { + s = 2.0f*(float)sqrt(trace); + out.x = (m.m[1][2] - m.m[2][1])/s; + out.y = (m.m[2][0] - m.m[0][2])/s; + out.z = (m.m[0][1] - m.m[1][0])/s; + out.w = 0.25f*s; + } + else + { + int maxi = 0; + for(int i=1; i<3; i++) + { + if(m.m[i][i] > m.m[maxi][maxi]) + maxi = i; + } + switch(maxi) + { + case 0: + s = 2.0f*(float)sqrt(1.0f + m.m[0][0] - m.m[1][1] - m.m[2][2]); + out.x = 0.25f*s; + out.y = (m.m[0][1] + m.m[1][0])/s; + out.z = (m.m[0][2] + m.m[2][0])/s; + out.w = (m.m[1][2] - m.m[2][1])/s; + break; + + case 1: + s = 2.0f*(float)sqrt(1.0f + m.m[1][1] - m.m[0][0] - m.m[2][2]); + out.x = (m.m[0][1] + m.m[1][0])/s; + out.y = 0.25f*s; + out.z = (m.m[1][2] + m.m[2][1])/s; + out.w = (m.m[2][0] - m.m[0][2])/s; + break; + + case 2: + s = 2.0f*(float)sqrt(1.0f + m.m[2][2] - m.m[0][0] - m.m[1][1]); + out.x = (m.m[0][2] + m.m[2][0])/s; + out.y = (m.m[1][2] + m.m[2][1])/s; + out.z = 0.25f*s; + out.w = (m.m[0][1] - m.m[1][0])/s; + break; + } + } + } +//+------------------------------------------------------------------+ +//| Builds a quaternion with the given yaw, pitch, and roll. | +//+------------------------------------------------------------------+ +void DXQuaternionRotationYawPitchRoll(DXQuaternion &out,float yaw,float pitch,float roll) + { + float syaw = (float)sin(yaw/2.0f); + float cyaw = (float)cos(yaw/2.0f); + float spitch = (float)sin(pitch/2.0f); + float cpitch = (float)cos(pitch/2.0f); + float sroll = (float)sin(roll/2.0f); + float croll = (float)cos(roll/2.0f); +//--- + out.x = syaw*cpitch*sroll + cyaw*spitch*croll; + out.y = syaw*cpitch*croll - cyaw*spitch*sroll; + out.z = cyaw*cpitch*sroll - syaw*spitch*croll; + out.w = cyaw*cpitch*croll + syaw*spitch*sroll; + } +//+------------------------------------------------------------------+ +//| Interpolates between two quaternions, using spherical linear | +//| interpolation. | +//+------------------------------------------------------------------+ +void DXQuaternionSlerp(DXQuaternion &out,DXQuaternion &q1,DXQuaternion &q2,float t) + { + float temp = 1.0f - t; + float dot = DXQuaternionDot(q1,q2); + if(dot<0.0f) + { + t = -t; + dot = -dot; + } + if(1.0f-dot>0.001f) + { + float theta = (float)acos(dot); + temp = (float)sin(theta*temp)/(float)sin(theta); + t = (float)sin(theta*t)/(float)sin(theta); + } + out.x = temp*q1.x + t*q2.x; + out.y = temp*q1.y + t*q2.y; + out.z = temp*q1.z + t*q2.z; + out.w = temp*q1.w + t*q2.w; + } +//+------------------------------------------------------------------+ +//| Interpolates between quaternions, using spherical quadrangle | +//| interpolation. | +//+------------------------------------------------------------------+ +void DXQuaternionSquad(DXQuaternion &pout,DXQuaternion &pq1,DXQuaternion &pq2,DXQuaternion &pq3,DXQuaternion &pq4,float t) + { + DXQuaternion temp1,temp2; + DXQuaternionSlerp(temp1,pq1,pq4,t); + DXQuaternionSlerp(temp2,pq2,pq3,t); + DXQuaternionSlerp(pout,temp1,temp2,2.0f*t*(1.0f - t)); + } +//+------------------------------------------------------------------+ +//| add_diff | +//+------------------------------------------------------------------+ +DXQuaternion add_diff(const DXQuaternion &q1,const DXQuaternion &q2,const float add) + { + DXQuaternion temp; + temp.x = q1.x + add * q2.x; + temp.y = q1.y + add * q2.y; + temp.z = q1.z + add * q2.z; + temp.w = q1.w + add * q2.w; +//--- + return(temp); + } +//+------------------------------------------------------------------+ +//| Sets up control points for spherical quadrangle interpolation. | +//+------------------------------------------------------------------+ +void DXQuaternionSquadSetup(DXQuaternion &paout,DXQuaternion &pbout,DXQuaternion &pcout,DXQuaternion &pq0,DXQuaternion &pq1,DXQuaternion &pq2,DXQuaternion &pq3) + { + DXQuaternion q,temp1,temp2,temp3,zero; + DXQuaternion aout,cout; + zero.x = 0.0f; + zero.y = 0.0f; + zero.z = 0.0f; + zero.w = 0.0f; +//--- + if(DXQuaternionDot(pq0,pq1) < 0.0f) + temp2 = add_diff(zero,pq0,-1.0f); + else + temp2 = pq0; +//--- + if(DXQuaternionDot(pq1,pq2) < 0.0f) + cout = add_diff(zero,pq2,-1.0f); + else + cout = pq2; +//--- + if(DXQuaternionDot(cout,pq3) < 0.0f) + temp3 = add_diff(zero,pq3,-1.0f); + else + temp3 = pq3; +//--- + DXQuaternionInverse(temp1,pq1); + DXQuaternionMultiply(temp2,temp1,temp2); + DXQuaternionLn(temp2,temp2); + DXQuaternionMultiply(q,temp1,cout); + DXQuaternionLn(q,q); + temp1 = add_diff(temp2,q,1.0f); + temp1.x *= -0.25f; + temp1.y *= -0.25f; + temp1.z *= -0.25f; + temp1.w *= -0.25f; + DXQuaternionExp(temp1,temp1); + DXQuaternionMultiply(aout,pq1,temp1); +//--- + DXQuaternionInverse(temp1,cout); + DXQuaternionMultiply(temp2,temp1,pq1); + DXQuaternionLn(temp2,temp2); + DXQuaternionMultiply(q,temp1,temp3); + DXQuaternionLn(q,q); + temp1 = add_diff(temp2,q,1.0f); + temp1.x *= -0.25f; + temp1.y *= -0.25f; + temp1.z *= -0.25f; + temp1.w *= -0.25f; + DXQuaternionExp(temp1,temp1); + DXQuaternionMultiply(pbout,cout,temp1); + paout = aout; + pcout = cout; + } +//+------------------------------------------------------------------+ +//| Computes a quaternion's axis and angle of rotation. | +//+------------------------------------------------------------------+ +void DXQuaternionToAxisAngle(const DXQuaternion &pq,DXVector3 &paxis,float &pangle) + { +//--- paxis + paxis.x = pq.x; + paxis.y = pq.y; + paxis.z = pq.z; +//--- pangle + pangle = 2.0f*(float)acos(pq.w); + } +//+------------------------------------------------------------------+ +//| DXMatrixIdentity creates an identity matrix | +//+------------------------------------------------------------------+ +void DXMatrixIdentity(DXMatrix &out) + { + for(int j=0; j<4; j++) + for(int i=0; i<4; i++) + { + if(i==j) + out.m[j,i]=1.0f; + else + out.m[j,i]=0.0f; + } + } +//+------------------------------------------------------------------+ +//| Determines if a matrix is an identity matrix. | +//+------------------------------------------------------------------+ +bool DXMatrixIsIdentity(DXMatrix &pm) + { + for(int j=0; j<4; j++) + for(int i=0; i<4; i++) + { + if(i==j) + { + if(fabs(pm.m[j,i]-1.0f)>1e-6f) + return(false); + } + else + if(fabs(pm.m[j,i])>1e-6f) + return(false); + } +//--- + return(true); + } +//+------------------------------------------------------------------+ +//| Builds a 3D affine transformation matrix. | +//+------------------------------------------------------------------+ +//| This function calculates the affine transformation matrix | +//| with the following formula, with matrix concatenation | +//| evaluated in left-to-right order: | +//| Mout = Ms * (Mrc)-1 * Mr * Mrc * Mt | +//| where: | +//| Mout = output matrix (pOut) | +//| Ms = scaling matrix (Scaling) | +//| Mrc = center of rotation matrix (pRotationCenter) | +//| Mr = rotation matrix (pRotation) | +//| Mt = translation matrix (pTranslation) | +//+------------------------------------------------------------------+ +void DXMatrixAffineTransformation(DXMatrix &out,float scaling,const DXVector3 &rotationcenter,const DXQuaternion &rotation,const DXVector3 &translation) + { + DXMatrixIdentity(out); +//--- rotation + float temp00 = 1.0f - 2.0f*(rotation.y*rotation.y + rotation.z*rotation.z); + float temp01 = 2.0f * (rotation.x*rotation.y + rotation.z*rotation.w); + float temp02 = 2.0f * (rotation.x*rotation.z - rotation.y*rotation.w); + float temp10 = 2.0f * (rotation.x*rotation.y - rotation.z*rotation.w); + float temp11 = 1.0f - 2.0f*(rotation.x*rotation.x + rotation.z*rotation.z); + float temp12 = 2.0f * (rotation.y*rotation.z + rotation.x*rotation.w); + float temp20 = 2.0f * (rotation.x*rotation.z + rotation.y*rotation.w); + float temp21 = 2.0f * (rotation.y*rotation.z - rotation.x*rotation.w); + float temp22 = 1.0f - 2.0f*(rotation.x*rotation.x + rotation.y*rotation.y); +//--- scaling + out.m[0][0] = scaling*temp00; + out.m[0][1] = scaling*temp01; + out.m[0][2] = scaling*temp02; + out.m[1][0] = scaling*temp10; + out.m[1][1] = scaling*temp11; + out.m[1][2] = scaling*temp12; + out.m[2][0] = scaling*temp20; + out.m[2][1] = scaling*temp21; + out.m[2][2] = scaling*temp22; +//--- rotationcenter + out.m[3][0] = rotationcenter.x*(1.0f - temp00) - rotationcenter.y*temp10 - rotationcenter.z*temp20; + out.m[3][1] = rotationcenter.y*(1.0f - temp11) - rotationcenter.x*temp01 - rotationcenter.z*temp21; + out.m[3][2] = rotationcenter.z*(1.0f - temp22) - rotationcenter.x*temp02 - rotationcenter.y*temp12; +//--- translation + out.m[3][0] += translation.x; + out.m[3][1] += translation.y; + out.m[3][2] += translation.z; + } +//+------------------------------------------------------------------+ +//| Builds a 2D affine transformation matrix in the xy plane. | +//+------------------------------------------------------------------+ +//| This function calculates the affine transformation matrix | +//| with the following formula, with matrix concatenation evaluated | +//| in left-to-right order: | +//| Mout = Ms * (Mrc)^(-1) * Mr * Mrc * Mt | +//| where: | +//| Mout = output matrix (pOut) | +//| Ms = scaling matrix (Scaling) | +//| Mrc = center of rotation matrix (pRotationCenter) | +//| Mr = rotation matrix (Rotation) | +//| Mt = translation matrix (pTranslation) | +//+------------------------------------------------------------------+ +void DXMatrixAffineTransformation2D(DXMatrix &out,float scaling,const DXVector2 &rotationcenter,float rotation,const DXVector2 &translation) + { + float s = (float)sin(rotation/2.0f); + float tmp1 = 1.0f - 2.0f*s*s; + float tmp2 = 2.0f*s*(float)cos(rotation/2.0f); +//--- + DXMatrixIdentity(out); + out.m[0][0] = scaling*tmp1; + out.m[0][1] = scaling*tmp2; + out.m[1][0] = -scaling*tmp2; + out.m[1][1] = scaling*tmp1; +//--- rotationcenter + float x = rotationcenter.x; + float y = rotationcenter.y; + out.m[3][0] = y*tmp2 - x*tmp1 + x; + out.m[3][1] = -x*tmp2 - y*tmp1 + y; +//--- translation + out.m[3][0] += translation.x; + out.m[3][1] += translation.y; + } +#define D3DERR_INVALIDCALL -2005530516 +//#define S_OK 0; +//+------------------------------------------------------------------+ +//| Breaks down a general 3D transformation matrix into its scalar, | +//| rotational, and translational components. | +//+------------------------------------------------------------------+ +int DXMatrixDecompose(DXVector3 &poutscale,DXQuaternion &poutrotation,DXVector3 &pouttranslation,const DXMatrix &pm) + { + DXMatrix normalized; + DXVector3 vec; +//--- Compute the scaling part + vec.x=pm.m[0][0]; + vec.y=pm.m[0][1]; + vec.z=pm.m[0][2]; + poutscale.x=DXVec3Length(vec); + vec.x=pm.m[1][0]; + vec.y=pm.m[1][1]; + vec.z=pm.m[1][2]; + poutscale.y=DXVec3Length(vec); + vec.x=pm.m[2][0]; + vec.y=pm.m[2][1]; + vec.z=pm.m[2][2]; + poutscale.z=DXVec3Length(vec); +//--- compute the translation part + pouttranslation.x=pm.m[3][0]; + pouttranslation.y=pm.m[3][1]; + pouttranslation.z=pm.m[3][2]; +//--- let's calculate the rotation now + if((poutscale.x == 0.0f) || (poutscale.y == 0.0f) || (poutscale.z == 0.0f)) + return(D3DERR_INVALIDCALL); +//--- + normalized.m[0][0]=pm.m[0][0]/poutscale.x; + normalized.m[0][1]=pm.m[0][1]/poutscale.x; + normalized.m[0][2]=pm.m[0][2]/poutscale.x; + normalized.m[1][0]=pm.m[1][0]/poutscale.y; + normalized.m[1][1]=pm.m[1][1]/poutscale.y; + normalized.m[1][2]=pm.m[1][2]/poutscale.y; + normalized.m[2][0]=pm.m[2][0]/poutscale.z; + normalized.m[2][1]=pm.m[2][1]/poutscale.z; + normalized.m[2][2]=pm.m[2][2]/poutscale.z; + DXQuaternionRotationMatrix(poutrotation,normalized); +//--- + return(0); + } +//+------------------------------------------------------------------+ +//| Returns the determinant of a matrix. | +//+------------------------------------------------------------------+ +float DXMatrixDeterminant(const DXMatrix &pm) + { + float t[3],v[4]; + t[0] = pm.m[2][2]*pm.m[3][3] - pm.m[2][3]*pm.m[3][2]; + t[1] = pm.m[1][2]*pm.m[3][3] - pm.m[1][3]*pm.m[3][2]; + t[2] = pm.m[1][2]*pm.m[2][3] - pm.m[1][3]*pm.m[2][2]; + v[0] = pm.m[1][1]*t[0] - pm.m[2][1] * t[1] + pm.m[3][1]*t[2]; + v[1] = -pm.m[1][0]*t[0] + pm.m[2][0] * t[1] - pm.m[3][0]*t[2]; +//--- + t[0] = pm.m[1][0]*pm.m[2][1] - pm.m[2][0]*pm.m[1][1]; + t[1] = pm.m[1][0]*pm.m[3][1] - pm.m[3][0]*pm.m[1][1]; + t[2] = pm.m[2][0]*pm.m[3][1] - pm.m[3][0]*pm.m[2][1]; + v[2] = pm.m[3][3]*t[0] - pm.m[2][3]*t[1] + pm.m[1][3]*t[2]; + v[3] = -pm.m[3][2]*t[0] + pm.m[2][2]*t[1] - pm.m[1][2]*t[2]; +//--- + return(pm.m[0][0]*v[0] + pm.m[0][1]*v[1] + pm.m[0][2]*v[2] + pm.m[0][3]*v[3]); + } +//+------------------------------------------------------------------+ +//| Calculates the inverse of a matrix. | +//+------------------------------------------------------------------+ +void DXMatrixInverse(DXMatrix &pout,float &pdeterminant,const DXMatrix &pm) + { + float t[3],v[16]; + t[0] = pm.m[2][2]*pm.m[3][3] - pm.m[2][3]*pm.m[3][2]; + t[1] = pm.m[1][2]*pm.m[3][3] - pm.m[1][3]*pm.m[3][2]; + t[2] = pm.m[1][2]*pm.m[2][3] - pm.m[1][3]*pm.m[2][2]; + v[0] = pm.m[1][1]*t[0] - pm.m[2][1]*t[1] + pm.m[3][1]*t[2]; + v[4] = -pm.m[1][0]*t[0] + pm.m[2][0]*t[1] - pm.m[3][0]*t[2]; +//--- + t[0] = pm.m[1][0]*pm.m[2][1] - pm.m[2][0]*pm.m[1][1]; + t[1] = pm.m[1][0]*pm.m[3][1] - pm.m[3][0]*pm.m[1][1]; + t[2] = pm.m[2][0]*pm.m[3][1] - pm.m[3][0]*pm.m[2][1]; + v[8] = pm.m[3][3]*t[0] - pm.m[2][3]*t[1] + pm.m[1][3]*t[2]; + v[12] = -pm.m[3][2]*t[0] + pm.m[2][2]*t[1] - pm.m[1][2]*t[2]; +//--- + float det = pm.m[0][0]*v[0] + pm.m[0][1]*v[4] + pm.m[0][2]*v[8] + pm.m[0][3]*v[12]; + if(det == 0.0f) + { + for(int j=0; j<4; j++) + for(int i=0; i<4; i++) + { + pout.m[j,i]=0.0; + } + //--- + return; + } + if(pdeterminant) + pdeterminant = det; +//--- + t[0] = pm.m[2][2]*pm.m[3][3] - pm.m[2][3]*pm.m[3][2]; + t[1] = pm.m[0][2]*pm.m[3][3] - pm.m[0][3]*pm.m[3][2]; + t[2] = pm.m[0][2]*pm.m[2][3] - pm.m[0][3]*pm.m[2][2]; + v[1] = -pm.m[0][1]*t[0] + pm.m[2][1]*t[1] - pm.m[3][1]*t[2]; + v[5] = pm.m[0][0]*t[0] - pm.m[2][0]*t[1] + pm.m[3][0]*t[2]; +//--- + t[0] = pm.m[0][0]*pm.m[2][1] - pm.m[2][0] * pm.m[0][1]; + t[1] = pm.m[3][0]*pm.m[0][1] - pm.m[0][0] * pm.m[3][1]; + t[2] = pm.m[2][0]*pm.m[3][1] - pm.m[3][0] * pm.m[2][1]; + v[9] = -pm.m[3][3]*t[0] - pm.m[2][3]*t[1]- pm.m[0][3]*t[2]; + v[13] = pm.m[3][2]*t[0] + pm.m[2][2]*t[1] + pm.m[0][2]*t[2]; +//--- + t[0] = pm.m[1][2]*pm.m[3][3] - pm.m[1][3] * pm.m[3][2]; + t[1] = pm.m[0][2]*pm.m[3][3] - pm.m[0][3] * pm.m[3][2]; + t[2] = pm.m[0][2]*pm.m[1][3] - pm.m[0][3] * pm.m[1][2]; + v[2] = pm.m[0][1]*t[0] - pm.m[1][1]*t[1] + pm.m[3][1]*t[2]; + v[6] = -pm.m[0][0]*t[0] + pm.m[1][0]*t[1] - pm.m[3][0]*t[2]; +//--- + t[0] = pm.m[0][0]*pm.m[1][1] - pm.m[1][0] * pm.m[0][1]; + t[1] = pm.m[3][0]*pm.m[0][1] - pm.m[0][0] * pm.m[3][1]; + t[2] = pm.m[1][0]*pm.m[3][1] - pm.m[3][0] * pm.m[1][1]; + v[10] = pm.m[3][3]*t[0] + pm.m[1][3]*t[1] + pm.m[0][3]*t[2]; + v[14] = -pm.m[3][2]*t[0] - pm.m[1][2]*t[1] - pm.m[0][2]*t[2]; +//--- + t[0] = pm.m[1][2]*pm.m[2][3] - pm.m[1][3] * pm.m[2][2]; + t[1] = pm.m[0][2]*pm.m[2][3] - pm.m[0][3] * pm.m[2][2]; + t[2] = pm.m[0][2]*pm.m[1][3] - pm.m[0][3] * pm.m[1][2]; + v[3] = -pm.m[0][1]*t[0] + pm.m[1][1]*t[1] - pm.m[2][1]*t[2]; + v[7] = pm.m[0][0]*t[0] - pm.m[1][0]*t[1] + pm.m[2][0]*t[2]; +//--- + v[11] = -pm.m[0][0]*(pm.m[1][1]*pm.m[2][3] - pm.m[1][3]*pm.m[2][1]) + + pm.m[1][0]*(pm.m[0][1]*pm.m[2][3] - pm.m[0][3]*pm.m[2][1]) - + pm.m[2][0]*(pm.m[0][1]*pm.m[1][3] - pm.m[0][3]*pm.m[1][1]); +//--- + v[15] = pm.m[0][0]*(pm.m[1][1]*pm.m[2][2] - pm.m[1][2]*pm.m[2][1]) - + pm.m[1][0]*(pm.m[0][1]*pm.m[2][2] - pm.m[0][2]*pm.m[2][1]) + + pm.m[2][0]*(pm.m[0][1]*pm.m[1][2] - pm.m[0][2]*pm.m[1][1]); +//--- + det = 1.0f/det; + for(int i=0; i<4; i++) + for(int j=0; j<4; j++) + pout.m[i][j] = v[4*i + j]*det; + } +//+------------------------------------------------------------------+ +//| Builds a left-handed,look-at matrix. | +//| This function uses the following formula to compute | +//| the returned matrix. | +//| | +//| zaxis = normal(At - Eye) | +//| xaxis = normal(cross(Up,zaxis)) | +//| yaxis = cross(zaxis,xaxis) | +//| | +//| xaxis.x yaxis.x zaxis.x 0 | +//| xaxis.y yaxis.y zaxis.y 0 | +//| xaxis.z yaxis.z zaxis.z 0 | +//| -dot(xaxis,eye) -dot(yaxis,eye) -dot(zaxis,eye) 1 | +//+------------------------------------------------------------------+ +void DXMatrixLookAtLH(DXMatrix &out,const DXVector3 &eye,const DXVector3 &at,const DXVector3 &up) + { + DXVector3 right,upn,vec; + DXVec3Subtract(vec,at,eye); + DXVec3Normalize(vec,vec); + DXVec3Cross(right,up,vec); + DXVec3Cross(upn,vec,right); + DXVec3Normalize(right,right); + DXVec3Normalize(upn,upn); +//--- + out.m[0][0] = right.x; + out.m[1][0] = right.y; + out.m[2][0] = right.z; + out.m[3][0] = -DXVec3Dot(right,eye); + out.m[0][1] = upn.x; + out.m[1][1] = upn.y; + out.m[2][1] = upn.z; + out.m[3][1] = -DXVec3Dot(upn,eye); + out.m[0][2] = vec.x; + out.m[1][2] = vec.y; + out.m[2][2] = vec.z; + out.m[3][2] = -DXVec3Dot(vec,eye); + out.m[0][3] = 0.0f; + out.m[1][3] = 0.0f; + out.m[2][3] = 0.0f; + out.m[3][3] = 1.0f; + } +//+------------------------------------------------------------------+ +//| Builds a right-handed, look-at matrix. | +//+------------------------------------------------------------------+ +//| This function uses the following formula to compute | +//| the returned matrix. | +//| | +//| zaxis = normal(Eye - At) | +//| xaxis = normal(cross(Up,zaxis)) | +//| yaxis = cross(zaxis,xaxis) | +//| | +//| xaxis.x yaxis.x zaxis.x 0 | +//| xaxis.y yaxis.y zaxis.y 0 | +//| xaxis.z yaxis.z zaxis.z 0 | +//| dot(xaxis,eye) dot(yaxis,eye) dot(zaxis,eye) 1 | +//+------------------------------------------------------------------+ +void DXMatrixLookAtRH(DXMatrix &out,const DXVector3 &eye,const DXVector3 &at,const DXVector3 &up) + { + DXVector3 right,upn,vec; + DXVec3Subtract(vec,at,eye); + DXVec3Normalize(vec,vec); + DXVec3Cross(right,up,vec); + DXVec3Cross(upn,vec,right); + DXVec3Normalize(right,right); + DXVec3Normalize(upn,upn); +//--- + out.m[0][0] = -right.x; + out.m[1][0] = -right.y; + out.m[2][0] = -right.z; + out.m[3][0] = DXVec3Dot(right,eye); + out.m[0][1] = upn.x; + out.m[1][1] = upn.y; + out.m[2][1] = upn.z; + out.m[3][1] = -DXVec3Dot(upn,eye); + out.m[0][2] = -vec.x; + out.m[1][2] = -vec.y; + out.m[2][2] = -vec.z; + out.m[3][2] = DXVec3Dot(vec,eye); + out.m[0][3] = 0.0f; + out.m[1][3] = 0.0f; + out.m[2][3] = 0.0f; + out.m[3][3] = 1.0f; + } +//+------------------------------------------------------------------+ +//| Determines the product of two matrices. | +//+------------------------------------------------------------------+ +void DXMatrixMultiply(DXMatrix &pout,const DXMatrix &pm1,const DXMatrix &pm2) + { + DXMatrix out= {}; + for(int i=0; i<4; i++) + { + for(int j=0; j<4; j++) + { + out.m[i][j] = pm1.m[i][0]*pm2.m[0][j] + pm1.m[i][1]*pm2.m[1][j] + pm1.m[i][2]*pm2.m[2][j] + pm1.m[i][3]*pm2.m[3][j]; + } + } + pout = out; + } +//+------------------------------------------------------------------+ +//| Calculates the transposed product of two matrices. | +//+------------------------------------------------------------------+ +void DXMatrixMultiplyTranspose(DXMatrix &pout,const DXMatrix &pm1,const DXMatrix &pm2) + { + DXMatrix temp= {}; + for(int i = 0; i < 4; i++) + for(int j = 0; j < 4; j++) + temp.m[j][i] = pm1.m[i][0]*pm2.m[0][j] + pm1.m[i][1]*pm2.m[1][j] + pm1.m[i][2]*pm2.m[2][j] + pm1.m[i][3]*pm2.m[3][j]; + pout = temp; + } +//+------------------------------------------------------------------+ +//| Builds a left-handed orthographic projection matrix. | +//+------------------------------------------------------------------+ +void DXMatrixOrthoLH(DXMatrix &pout,float w,float h,float zn,float zf) + { + DXMatrixIdentity(pout); +//--- + pout.m[0][0] = 2.0f/w; + pout.m[1][1] = 2.0f/h; + pout.m[2][2] = 1.0f/(zf - zn); + pout.m[3][2] = zn/(zn - zf); + } +//+------------------------------------------------------------------+ +//| Builds a customized,left-handed orthographic projection matrix. | +//+------------------------------------------------------------------+ +void DXMatrixOrthoOffCenterLH(DXMatrix &pout,float l,float r,float b,float t,float zn,float zf) + { + DXMatrixIdentity(pout); +//--- + pout.m[0][0] = 2.0f/(r - l); + pout.m[1][1] = 2.0f/(t - b); + pout.m[2][2] = 1.0f/(zf -zn); + pout.m[3][0] = -1.0f -2.0f*l/(r - l); + pout.m[3][1] = 1.0f + 2.0f*t/(b - t); + pout.m[3][2] = zn/(zn -zf); + } +//+------------------------------------------------------------------+ +//| Builds a customized,right-handed orthographic projection matrix. | +//+------------------------------------------------------------------+ +void DXMatrixOrthoOffCenterRH(DXMatrix &pout,float l,float r,float b,float t,float zn,float zf) + { + DXMatrixIdentity(pout); +//--- + pout.m[0][0] = 2.0f/(r - l); + pout.m[1][1] = 2.0f/(t - b); + pout.m[2][2] = 1.0f/(zn -zf); + pout.m[3][0] = -1.0f -2.0f*l/(r - l); + pout.m[3][1] = 1.0f + 2.0f*t/(b - t); + pout.m[3][2] = zn/(zn -zf); + } +//+------------------------------------------------------------------+ +//| Builds a right-handed orthographic projection matrix. | +//+------------------------------------------------------------------+ +//| All the parameters of the DXMatrixOrthoRH function | +//| are distances in camera space. The parameters describe | +//| the dimensions of the view volume. | +//| | +//| This function uses the following formula to compute | +//| the returned matrix: | +//| 2/w 0 0 0 | +//| 0 2/h 0 0 | +//| 0 0 1/(zn-zf) 0 | +//| 0 0 zn/(zn-zf) 1 | +//+------------------------------------------------------------------+ +void DXMatrixOrthoRH(DXMatrix &pout,float w,float h,float zn,float zf) + { + DXMatrixIdentity(pout); + pout.m[0][0] = 2.0f/w; + pout.m[1][1] = 2.0f/h; + pout.m[2][2] = 1.0f/(zn - zf); + pout.m[3][2] = zn/(zn - zf); + } +//+------------------------------------------------------------------+ +//| Builds a left-handed perspective projection matrix | +//| based on a field of view. | +//+------------------------------------------------------------------+ +//| This function computes the returned matrix as shown: | +//| xScale 0 0 0 | +//| 0 yScale 0 0 | +//| 0 0 zf/(zf-zn) 1 | +//| 0 0 -zn*zf/(zf-zn) 0 | +//| where: | +//| yScale = cot(fovY/2) | +//| xScale = yScale / aspect ratio | +//+------------------------------------------------------------------+ +void DXMatrixPerspectiveFovLH(DXMatrix &pout,float fovy,float aspect,float zn,float zf) + { + DXMatrixIdentity(pout); +//--- + pout.m[0][0] = 1.0f/(aspect*(float)tan(fovy/2.0f)); + pout.m[1][1] = 1.0f/(float)tan(fovy/2.0f); + pout.m[2][2] = zf/(zf - zn); + pout.m[2][3] = 1.0f; + pout.m[3][2] = (zf*zn)/(zn - zf); + pout.m[3][3] = 0.0f; + } +//+------------------------------------------------------------------+ +//| Builds a right-handed perspective projection matrix | +//| based on a field of view. | +//+------------------------------------------------------------------+ +//| This function computes the returned matrix as shown. | +//| xScale 0 0 0 | +//| 0 yScale 0 0 | +//| 0 0 zf/(zn-zf) -1 | +//| 0 0 zn*zf/(zn-zf) 0 | +//| where: | +//| yScale = cot(fovY/2) | +//| xScale = yScale / aspect ratio | +//+------------------------------------------------------------------+ +void DXMatrixPerspectiveFovRH(DXMatrix &pout,float fovy,float aspect,float zn,float zf) + { + DXMatrixIdentity(pout); +//--- + pout.m[0][0] = 1.0f/(aspect*(float)tan(fovy/2.0f)); + pout.m[1][1] = 1.0f/(float)tan(fovy/2.0f); + pout.m[2][2] = zf/(zn - zf); + pout.m[2][3] = -1.0f; + pout.m[3][2] = (zf*zn)/(zn - zf); + pout.m[3][3] = 0.0f; + } +//+------------------------------------------------------------------+ +//| Builds a left-handed perspective projection matrix | +//+------------------------------------------------------------------+ +//| This function uses the following formula to compute | +//| the returned matrix. | +//| 2*zn/w 0 0 0 | +//| 0 2*zn/h 0 0 | +//| 0 0 zf/(zf-zn) 1 | +//| 0 0 zn*zf/(zn-zf) 0 | +//+------------------------------------------------------------------+ +void DXMatrixPerspectiveLH(DXMatrix &pout,float w,float h,float zn,float zf) + { + DXMatrixIdentity(pout); + pout.m[0][0] = 2.0f*zn/w; + pout.m[1][1] = 2.0f*zn/h; + pout.m[2][2] = zf/(zf - zn); + pout.m[3][2] = (zn*zf)/(zn - zf); + pout.m[2][3] = 1.0f; + pout.m[3][3] = 0.0f; + } +//+------------------------------------------------------------------+ +//| Builds a customized, left-handed perspective projection matrix. | +//+------------------------------------------------------------------+ +//| All the parameters of the DXMatrixPerspectiveOffCenterLH | +//| function are distances in camera space. The parameters describe | +//| the dimensions of the view volume. | +//| | +//| This function uses the following formula to compute | +//| the returned matrix. | +//| 2*zn/(r-l) 0 0 0 | +//| 0 2*zn/(t-b) 0 0 | +//| (l+r)/(l-r) (t+b)/(b-t) zf/(zf-zn) 1 | +//| 0 0 zn*zf/(zn-zf) 0 | +//+------------------------------------------------------------------+ +void DXMatrixPerspectiveOffCenterLH(DXMatrix &pout,float l,float r,float b,float t,float zn,float zf) + { + DXMatrixIdentity(pout); +//--- + pout.m[0][0] = 2.0f*zn/(r - l); + pout.m[1][1] = -2.0f*zn/(b - t); + pout.m[2][0] = -1.0f - 2.0f*l/(r - l); + pout.m[2][1] = 1.0f + 2.0f*t/(b - t); + pout.m[2][2] = - zf/(zn - zf); + pout.m[3][2] = (zn*zf)/(zn -zf); + pout.m[2][3] = 1.0f; + pout.m[3][3] = 0.0f; + } +//+------------------------------------------------------------------+ +//| Builds a customized, right-handed perspective projection matrix. | +//+------------------------------------------------------------------+ +//| All the parameters of the DXMatrixPerspectiveOffCenterRH | +//| function are distances in camera space. The parameters describe | +//| the dimensions of the view volume. | +//| | +//| This function uses the following formula to compute | +//| the returned matrix. | +//| 2*zn/(r-l) 0 0 0 | +//| 0 2*zn/(t-b) 0 0 | +//| (l+r)/(r-l) (t+b)/(t-b) zf/(zn-zf) -1 | +//| 0 0 zn*zf/(zn-zf) 0 | +//+------------------------------------------------------------------+ +void DXMatrixPerspectiveOffCenterRH(DXMatrix &pout,float l,float r,float b,float t,float zn,float zf) + { + DXMatrixIdentity(pout); +//--- + pout.m[0][0] = 2.0f*zn/(r - l); + pout.m[1][1] = -2.0f*zn/(b - t); + pout.m[2][0] = 1.0f + 2.0f*l/(r - l); + pout.m[2][1] = -1.0f -2.0f*t/(b - t); + pout.m[2][2] = zf/(zn - zf); + pout.m[3][2] = (zn*zf)/(zn -zf); + pout.m[2][3] = -1.0f; + pout.m[3][3] = 0.0f; + } +//+------------------------------------------------------------------+ +//| Builds a right-handed perspective projection matrix. | +//+------------------------------------------------------------------+ +//| All the parameters of the DXMatrixPerspectiveRH function | +//| are distances in camera space. The parameters describe | +//| the dimensions of the view volume. | +//| | +//| This function uses the following formula to compute | +//| the returned matrix. | +//| 2*zn/w 0 0 0 | +//| 0 2*zn/h 0 0 | +//| 0 0 zf/(zn-zf) -1 | +//| 0 0 zn*zf/(zn-zf) 0 | +//+------------------------------------------------------------------+ +void DXMatrixPerspectiveRH(DXMatrix &pout,float w,float h,float zn,float zf) + { + DXMatrixIdentity(pout); +//--- + pout.m[0][0] = 2.0f*zn/w; + pout.m[1][1] = 2.0f*zn/h; + pout.m[2][2] = zf/(zn - zf); + pout.m[3][2] = (zn*zf)/(zn - zf); + pout.m[2][3] = -1.0f; + pout.m[3][3] = 0.0f; + } +//+------------------------------------------------------------------+ +//| Builds a matrix that reflects the coordinate system about a plane| +//| This function normalizes the plane equation before it creates | +//| the reflected matrix. | +//| | +//| This function uses the following formula to compute | +//| the returned matrix. | +//| P = normalize(Plane); | +//| -2 * P.a * P.a + 1 -2 * P.b * P.a -2 * P.c * P.a 0 | +//| -2 * P.a * P.b -2 * P.b * P.b + 1 -2 * P.c * P.b 0 | +//| -2 * P.a * P.c -2 * P.b * P.c -2 * P.c * P.c + 1 0 | +//| -2 * P.a * P.d -2 * P.b * P.d -2 * P.c * P.d 1 | +//+------------------------------------------------------------------+ +void DXMatrixReflect(DXMatrix &pout,const DXPlane &pplane) + { + DXPlane Nplane; + DXPlaneNormalize(Nplane,pplane); + DXMatrixIdentity(pout); +//--- + pout.m[0][0] = 1.0f - 2.0f*Nplane.a*Nplane.a; + pout.m[0][1] = -2.0f*Nplane.a*Nplane.b; + pout.m[0][2] = -2.0f*Nplane.a*Nplane.c; + pout.m[1][0] = -2.0f*Nplane.a*Nplane.b; + pout.m[1][1] = 1.0f - 2.0f*Nplane.b*Nplane.b; + pout.m[1][2] = -2.0f*Nplane.b*Nplane.c; + pout.m[2][0] = -2.0f*Nplane.c*Nplane.a; + pout.m[2][1] = -2.0f*Nplane.c*Nplane.b; + pout.m[2][2] = 1.0f - 2.0f*Nplane.c*Nplane.c; + pout.m[3][0] = -2.0f*Nplane.d*Nplane.a; + pout.m[3][1] = -2.0f*Nplane.d*Nplane.b; + pout.m[3][2] = -2.0f*Nplane.d*Nplane.c; + } +//+------------------------------------------------------------------+ +//| Builds a matrix that rotates around an arbitrary axis. | +//+------------------------------------------------------------------+ +void DXMatrixRotationAxis(DXMatrix &out,const DXVector3 &v,float angle) + { + DXVector3 nv; + DXVec3Normalize(nv,v); +//--- + float sangle = (float)sin(angle); + float cangle = (float)cos(angle); + float cdiff = 1.0f - cangle; +//--- + out.m[0][0] = cdiff*nv.x*nv.x + cangle; + out.m[1][0] = cdiff*nv.x*nv.y - sangle*nv.z; + out.m[2][0] = cdiff*nv.x*nv.z + sangle*nv.y; + out.m[3][0] = 0.0f; + out.m[0][1] = cdiff*nv.y*nv.x + sangle*nv.z; + out.m[1][1] = cdiff*nv.y*nv.y + cangle; + out.m[2][1] = cdiff*nv.y*nv.z - sangle*nv.x; + out.m[3][1] = 0.0f; + out.m[0][2] = cdiff*nv.z*nv.x - sangle*nv.y; + out.m[1][2] = cdiff*nv.z*nv.y + sangle*nv.x; + out.m[2][2] = cdiff*nv.z*nv.z + cangle; + out.m[3][2] = 0.0f; + out.m[0][3] = 0.0f; + out.m[1][3] = 0.0f; + out.m[2][3] = 0.0f; + out.m[3][3] = 1.0f; + } +//+------------------------------------------------------------------+ +//| Builds a rotation matrix from a quaternion. | +//+------------------------------------------------------------------+ +void DXMatrixRotationQuaternion(DXMatrix &pout,const DXQuaternion &pq) + { + DXMatrixIdentity(pout); +//--- + pout.m[0][0] = 1.0f - 2.0f*(pq.y*pq.y + pq.z*pq.z); + pout.m[0][1] = 2.0f*(pq.x*pq.y + pq.z*pq.w); + pout.m[0][2] = 2.0f*(pq.x*pq.z - pq.y*pq.w); + pout.m[1][0] = 2.0f*(pq.x*pq.y - pq.z*pq.w); + pout.m[1][1] = 1.0f - 2.0f * (pq.x*pq.x + pq.z*pq.z); + pout.m[1][2] = 2.0f*(pq.y*pq.z + pq.x*pq.w); + pout.m[2][0] = 2.0f*(pq.x*pq.z + pq.y*pq.w); + pout.m[2][1] = 2.0f*(pq.y*pq.z - pq.x*pq.w); + pout.m[2][2] = 1.0f - 2.0f*(pq.x*pq.x + pq.y*pq.y); + } +//+------------------------------------------------------------------+ +//| Builds a matrix that rotates around the x-axis. | +//+------------------------------------------------------------------+ +void DXMatrixRotationX(DXMatrix &pout,float angle) + { + DXMatrixIdentity(pout); +//--- + pout.m[1][1] = (float)cos(angle); + pout.m[2][2] = (float)cos(angle); + pout.m[1][2] = (float)sin(angle); + pout.m[2][1] = -(float)sin(angle); + } +//+------------------------------------------------------------------+ +//| Builds a matrix that rotates around the y-axis. | +//+------------------------------------------------------------------+ +void DXMatrixRotationY(DXMatrix &pout,float angle) + { + DXMatrixIdentity(pout); +//--- + pout.m[0][0] = (float)cos(angle); + pout.m[2][2] = (float)cos(angle); + pout.m[0][2] = -(float)sin(angle); + pout.m[2][0] = (float)sin(angle); + } +//+------------------------------------------------------------------+ +//| Builds a matrix with a specified yaw, pitch, and roll. | +//+------------------------------------------------------------------+ +//| The order of transformations is roll first, then pitch, then yaw.| +//| Relative to the object's local coordinate axis, this is | +//| equivalent to rotation around the z-axis, followed by rotation | +//| around the x-axis, followed by rotation around the y-axis. | +//+------------------------------------------------------------------+ +void DXMatrixRotationYawPitchRoll(DXMatrix &out,float yaw,float pitch,float roll) + { + float sroll = (float)sin(roll); + float croll = (float)cos(roll); + float spitch = (float)sin(pitch); + float cpitch = (float)cos(pitch); + float syaw = (float)sin(yaw); + float cyaw = (float)cos(yaw); +//--- + out.m[0][0] = sroll * spitch * syaw + croll * cyaw; + out.m[0][1] = sroll * cpitch; + out.m[0][2] = sroll * spitch * cyaw - croll * syaw; + out.m[0][3] = 0.0f; + out.m[1][0] = croll * spitch * syaw - sroll * cyaw; + out.m[1][1] = croll * cpitch; + out.m[1][2] = croll * spitch * cyaw + sroll * syaw; + out.m[1][3] = 0.0f; + out.m[2][0] = cpitch * syaw; + out.m[2][1] = -spitch; + out.m[2][2] = cpitch * cyaw; + out.m[2][3] = 0.0f; + out.m[3][0] = 0.0f; + out.m[3][1] = 0.0f; + out.m[3][2] = 0.0f; + out.m[3][3] = 1.0f; + } +//+------------------------------------------------------------------+ +//| Builds a matrix that rotates around the z-axis. | +//+------------------------------------------------------------------+ +void DXMatrixRotationZ(DXMatrix &pout,float angle) + { + DXMatrixIdentity(pout); +//--- + pout.m[0][0] = (float)cos(angle); + pout.m[1][1] = (float)cos(angle); + pout.m[0][1] = (float)sin(angle); + pout.m[1][0] = -(float)sin(angle); + } +//+------------------------------------------------------------------+ +//| Builds a matrix that scales along the x-axis, | +//| the y-axis,and the z-axis. | +//+------------------------------------------------------------------+ +void DXMatrixScaling(DXMatrix &pout,float sx,float sy,float sz) + { + DXMatrixIdentity(pout); + pout.m[0][0] = sx; + pout.m[1][1] = sy; + pout.m[2][2] = sz; + } +//+------------------------------------------------------------------+ +//| Builds a matrix that flattens geometry into a plane. | +//+------------------------------------------------------------------+ +//| The DXMatrixShadow function flattens geometry into a plane, as | +//| if casting a shadow from a light. | +//| This function uses the following formula to compute the returned | +//| matrix. | +//| | +//| P = normalize(Plane); | +//| L = Light; | +//| d = -dot(P,L) | +//| | +//| P.a * L.x + d P.a * L.y P.a * L.z P.a * L.w | +//| P.b * L.x P.b * L.y + d P.b * L.z P.b * L.w | +//| P.c * L.x P.c * L.y P.c * L.z + d P.c * L.w | +//| P.d * L.x P.d * L.y P.d * L.z P.d * L.w + d | +//| | +//| If the light's w-component is 0, the ray from the origin to the | +//| light represents a directional light. If it is 1,the light is | +//| a point light. | +//+------------------------------------------------------------------+ +void DXMatrixShadow(DXMatrix &pout,const DXVector4 &plight,const DXPlane &pplane) + { + DXPlane Nplane; + DXPlaneNormalize(Nplane,pplane); + float dot = DXPlaneDot(Nplane,plight); +//--- + pout.m[0][0] = dot - Nplane.a*plight.x; + pout.m[0][1] = -Nplane.a*plight.y; + pout.m[0][2] = -Nplane.a*plight.z; + pout.m[0][3] = -Nplane.a*plight.w; + pout.m[1][0] = -Nplane.b*plight.x; + pout.m[1][1] = dot - Nplane.b*plight.y; + pout.m[1][2] = -Nplane.b*plight.z; + pout.m[1][3] = -Nplane.b*plight.w; + pout.m[2][0] = -Nplane.c*plight.x; + pout.m[2][1] = -Nplane.c*plight.y; + pout.m[2][2] = dot - Nplane.c*plight.z; + pout.m[2][3] = -Nplane.c*plight.w; + pout.m[3][0] = -Nplane.d*plight.x; + pout.m[3][1] = -Nplane.d*plight.y; + pout.m[3][2] = -Nplane.d*plight.z; + pout.m[3][3] = dot - Nplane.d*plight.w; + } +//+------------------------------------------------------------------+ +//| Builds a transformation matrix. | +//+------------------------------------------------------------------+ +//| This function calculates the transformation matrix with the | +//| following formula, with matrix concatenation evaluated | +//| in left-to-right order: | +//| | +//| Mout = (Msc)^(-1)*(Msr)^(-1)*Ms*Msr*Msc*(Mrc)^(-1)*Mr*Mrc*Mt | +//| | +//| where: | +//| Mout = output matrix (pOut) | +//| Msc = scaling center matrix (pScalingCenter) | +//| Msr = scaling rotation matrix (pScalingRotation) | +//| Ms = scaling matrix (pScaling) | +//| Mrc = center of rotation matrix (pRotationCenter) | +//| Mr = rotation matrix (pRotation) | +//| Mt = translation matrix (pTranslation) | +//+------------------------------------------------------------------+ +void DXMatrixTransformation(DXMatrix &pout,const DXVector3 &pscalingcenter,const DXQuaternion &pscalingrotation,const DXVector3 &pscaling,const DXVector3 &protationcenter,const DXQuaternion &protation,const DXVector3 &ptranslation) + { + DXMatrix m1,m2,m3,m4,m5,m6,m7; + DXQuaternion prc; + DXVector3 psc,pt; +//--- pscalingcenter + psc.x = pscalingcenter.x; + psc.y = pscalingcenter.y; + psc.z = pscalingcenter.z; +//--- protationcenter + prc.x = protationcenter.x; + prc.y = protationcenter.y; + prc.z = protationcenter.z; +//--- ptranslation + pt.x = ptranslation.x; + pt.y = ptranslation.y; + pt.z = ptranslation.z; + DXMatrixTranslation(m1,-psc.x,-psc.y,-psc.z); +//--- + DXQuaternion temp; + DXMatrixRotationQuaternion(m4,pscalingrotation); + temp.w = pscalingrotation.w; + temp.x = -pscalingrotation.x; + temp.y = -pscalingrotation.y; + temp.z = -pscalingrotation.z; + DXMatrixRotationQuaternion(m2,temp); +//--- pscaling + DXMatrixScaling(m3,pscaling.x,pscaling.y,pscaling.z); +//--- protation + DXMatrixRotationQuaternion(m6,protation); +//--- + DXMatrixTranslation(m5,psc.x - prc.x,psc.y - prc.y,psc.z - prc.z); + DXMatrixTranslation(m7,prc.x + pt.x,prc.y + pt.y,prc.z + pt.z); + DXMatrixMultiply(m1,m1,m2); + DXMatrixMultiply(m1,m1,m3); + DXMatrixMultiply(m1,m1,m4); + DXMatrixMultiply(m1,m1,m5); + DXMatrixMultiply(m1,m1,m6); + DXMatrixMultiply(pout,m1,m7); + } +//+------------------------------------------------------------------+ +//| Builds a 2D transformation matrix that represents | +//| transformations in the xy plane. | +//+------------------------------------------------------------------+ +//| This function calculates the transformation matrix with the | +//| following formula, with matrix concatenation evaluated | +//| in left-to-right order: | +//| | +//| Mout = (Msc)^(-1)*(Msr)^(-1)*Ms*Msr*Msc*(Mrc)^(-1)*Mr*Mrc*Mt | +//| | +//| where: | +//| Mout = output matrix (pOut) | +//| Msc = scaling center matrix (pScalingCenter) | +//| Msr = scaling rotation matrix (pScalingRotation) | +//| Ms = scaling matrix (pScaling) | +//| Mrc = center of rotation matrix (pRotationCenter) | +//| Mr = rotation matrix (Rotation) | +//| Mt = translation matrix (pTranslation) | +//+------------------------------------------------------------------+ +void DXMatrixTransformation2D(DXMatrix &pout,const DXVector2 &pscalingcenter,float scalingrotation,const DXVector2 &pscaling,const DXVector2 &protationcenter,float rotation,const DXVector2 &ptranslation) + { + DXQuaternion rot,sca_rot; + DXVector3 rot_center,sca,sca_center,trans; +//--- pscalingcenter + sca_center.x=pscalingcenter.x; + sca_center.y=pscalingcenter.y; + sca_center.z=0.0f; +//--- pscaling + sca.x=pscaling.x; + sca.y=pscaling.y; + sca.z=1.0f; +//--- protationcenter + rot_center.x=protationcenter.x; + rot_center.y=protationcenter.y; + rot_center.z=0.0f; +//--- ptranslation + trans.x=ptranslation.x; + trans.y=ptranslation.y; + trans.z=0.0f; +//--- + rot.w=(float)cos(rotation/2.0f); + rot.x=0.0f; + rot.y=0.0f; + rot.z=(float)sin(rotation/2.0f); +//--- + sca_rot.w=(float)cos(scalingrotation/2.0f); + sca_rot.x=0.0f; + sca_rot.y=0.0f; + sca_rot.z=(float)sin(scalingrotation/2.0f); + DXMatrixTransformation(pout,sca_center,sca_rot,sca,rot_center,rot,trans); + } +//+------------------------------------------------------------------+ +//| Builds a matrix using the specified offsets. | +//+------------------------------------------------------------------+ +void DXMatrixTranslation(DXMatrix &pout,float x,float y,float z) + { + DXMatrixIdentity(pout); +//--- + pout.m[3][0] = x; + pout.m[3][1] = y; + pout.m[3][2] = z; + } +//+------------------------------------------------------------------+ +//| Returns the matrix transpose of a matrix. | +//+------------------------------------------------------------------+ +void DXMatrixTranspose(DXMatrix &pout,const DXMatrix &pm) + { + const DXMatrix m = pm; + for(int i=0; i<4; i++) + for(int j=0; j<4; j++) + pout.m[i][j] = m.m[j][i]; + } +//+------------------------------------------------------------------+ +//| Computes the dot product of a plane and a 4D vector. | +//+------------------------------------------------------------------+ +float DXPlaneDot(const DXPlane &p1,const DXVector4 &p2) + { + return(p1.a*p2.x + p1.b*p2.y + p1.c*p2.z + p1.d*p2.w); + } +//+------------------------------------------------------------------+ +//| Computes the dot product of a plane and a 3D vector. | +//| The w parameter of the vector is assumed to be 1. | +//+------------------------------------------------------------------+ +float DXPlaneDotCoord(const DXPlane &pp,const DXVector4 &pv) + { + return(pp.a*pv.x + pp.b*pv.y + pp.c*pv.z + pp.d); + } +//+------------------------------------------------------------------+ +//| Computes the dot product of a plane and a 3D vector. | +//| The w parameter of the vector is assumed to be 0. | +//+------------------------------------------------------------------+ +float DXPlaneDotNormal(const DXPlane &pp,const DXVector4 &pv) + { + return(pp.a*pv.x + pp.b*pv.y + pp.c*pv.z); + } +//+------------------------------------------------------------------+ +//| Constructs a plane from a point and a normal. | +//+------------------------------------------------------------------+ +void DXPlaneFromPointNormal(DXPlane &pout,const DXVector3 &pvpoint,const DXVector3 &pvnormal) + { + pout.a = pvnormal.x; + pout.b = pvnormal.y; + pout.c = pvnormal.z; + pout.d = -DXVec3Dot(pvpoint,pvnormal); + } +//+------------------------------------------------------------------+ +//| Constructs a plane from three points. | +//+------------------------------------------------------------------+ +void DXPlaneFromPoints(DXPlane &pout,const DXVector3 &pv1,const DXVector3 &pv2,const DXVector3 &pv3) + { + DXVector3 edge1,edge2,normal,Nnormal; +//--- + edge1.x = 0.0f; + edge1.y = 0.0f; + edge1.z = 0.0f; + edge2.x = 0.0f; + edge2.y = 0.0f; + edge2.z = 0.0f; +//--- + DXVec3Subtract(edge1,pv2,pv1); + DXVec3Subtract(edge2,pv3,pv1); + DXVec3Cross(normal,edge1,edge2); + DXVec3Normalize(Nnormal,normal); + DXPlaneFromPointNormal(pout,pv1,Nnormal); + } +//+------------------------------------------------------------------+ +//| Finds the intersection between a plane and a line. | +//| If the line is parallel to the plane, null vector is returned. | +//+------------------------------------------------------------------+ +void DXPlaneIntersectLine(DXVector3 &pout,const DXPlane &pp,const DXVector3 &pv1,const DXVector3 &pv2) + { + DXVector3 direction,normal; + normal.x = pp.a; + normal.y = pp.b; + normal.z = pp.c; + direction.x = pv2.x - pv1.x; + direction.y = pv2.y - pv1.y; + direction.z = pv2.z - pv1.z; +//--- + float dot = DXVec3Dot(normal,direction); + if(!dot) + { + pout.x=0.0f; + pout.y=0.0f; + pout.z=0.0f; + } + float temp = (pp.d + DXVec3Dot(normal,pv1))/dot; + pout.x = pv1.x - temp*direction.x; + pout.y = pv1.y - temp*direction.y; + pout.z = pv1.z - temp*direction.z; + } +//+------------------------------------------------------------------+ +//| Normalizes the plane coefficients so that the plane normal | +//| has unit length. | +//| This function normalizes a plane so that |a,b,c| == 1. | +//+------------------------------------------------------------------+ +void DXPlaneNormalize(DXPlane &out,const DXPlane &p) + { + float norm = (float)sqrt(p.a*p.a + p.b*p.b + p.c*p.c); + if(norm) + { + out.a = p.a/norm; + out.b = p.b/norm; + out.c = p.c/norm; + out.d = p.d/norm; + } + else + { + out.a = 0.0f; + out.b = 0.0f; + out.c = 0.0f; + out.d = 0.0f; + } + } +//+------------------------------------------------------------------+ +//| Scale the plane with the given scaling factor. | +//+------------------------------------------------------------------+ +void DXPlaneScale(DXPlane &pout,const DXPlane &p,float s) + { + pout.a = p.a*s; + pout.b = p.b*s; + pout.c = p.c*s; + pout.d = p.d*s; + }; +//+------------------------------------------------------------------+ +//| Transforms a plane by a matrix. | +//| The input matrix is the inverse transpose of the actual | +//| transformation. | +//+------------------------------------------------------------------+ +void DXPlaneTransform(DXPlane &pout,const DXPlane &pplane,const DXMatrix &pm) + { + DXPlane plane = pplane; +//--- + pout.a = pm.m[0][0]*plane.a + pm.m[1][0]*plane.b + pm.m[2][0]*plane.c + pm.m[3][0]*plane.d; + pout.b = pm.m[0][1]*plane.a + pm.m[1][1]*plane.b + pm.m[2][1]*plane.c + pm.m[3][1]*plane.d; + pout.c = pm.m[0][2]*plane.a + pm.m[1][2]*plane.b + pm.m[2][2]*plane.c + pm.m[3][2]*plane.d; + pout.d = pm.m[0][3]*plane.a + pm.m[1][3]*plane.b + pm.m[2][3]*plane.c + pm.m[3][3]*plane.d; + } +//+------------------------------------------------------------------+ +//| Adds two spherical harmonic (SH) vectors; in other words, | +//| out[i] = a[i] + b[i]. | +//+------------------------------------------------------------------+ +//| Each coefficient of the basis function Y(l,m) is stored | +//| at memory location l^2 + m + l,where: | +//| l is the degree of the basis function. | +//| m is the basis function index for the given l value | +//| and ranges from -l to l, inclusive. | +//+------------------------------------------------------------------+ +void DXSHAdd(float &out[],int order,const float &a[],const float &b[]) + { + for(int i = 0; i DX_PI/2.0f) ? (DX_PI/2.0f) : radius; + float norm = (float)sin(clamped_angle)*(float)sin(clamped_angle); + if(order > DXSH_MAXORDER) + { + //--- order clamped at DXSH_MAXORDER + order = DXSH_MAXORDER; + } +//--- + weightedcapintegrale(cap,order,radius); + DXSHEvalDirection(rout,order,dir); +//--- + for(int i = 0; i DXSH_MAXORDER)) + return; + + out[0] = 0.5f/(float)sqrt(DX_PI); + out[1] = -0.5f/(float)sqrt(DX_PI/3.0f)*dir.y; + out[2] = 0.5f/(float)sqrt(DX_PI/3.0f)*dir.z; + out[3] = -0.5f/(float)sqrt(DX_PI/3.0f)*dir.x; + if(order == 2) + return; + + out[4] = 0.5f/(float)sqrt(DX_PI/15.0f)*dirxy; + out[5] = -0.5f/(float)sqrt(DX_PI/15.0f)*diryz; + out[6] = 0.25f/(float)sqrt(DX_PI/5.0f)*(3.0f*dirzz - 1.0f); + out[7] = -0.5f/(float)sqrt(DX_PI/15.0f)*dirxz; + out[8] = 0.25f/(float)sqrt(DX_PI/15.0f)*(dirxx - diryy); + if(order == 3) + return; + + out[9] = -(float)sqrt(70.0f/DX_PI)/8.0f*dir.y*(3.0f*dirxx - diryy); + out[10] = (float)sqrt(105.0f/DX_PI)/2.0f*dirxy*dir.z; + out[11] = -(float)sqrt(42.0f/DX_PI)/8.0f*dir.y*(-1.0f + 5.0f*dirzz); + out[12] = (float)sqrt(7.0f/DX_PI)/4.0f*dir.z*(5.0f*dirzz - 3.0f); + out[13] = (float)sqrt(42.0f/DX_PI)/8.0f*dir.x*(1.0f - 5.0f*dirzz); + out[14] = (float)sqrt(105.0f/DX_PI)/4.0f*dir.z*(dirxx - diryy); + out[15] = -(float)sqrt(70.0f/DX_PI)/8.0f*dir.x*(dirxx - 3.0f*diryy); + if(order == 4) + return; + + out[16] = 0.75f*float(sqrt(35.0f/DX_PI))*dirxy*(dirxx - diryy); + out[17] = 3.0f*dir.z*out[9]; + out[18] = 0.75f*(float)sqrt(5.0f/DX_PI)*dirxy*(7.0f*dirzz - 1.0f); + out[19] = 0.375f*(float)sqrt(10.0f/DX_PI)*diryz*(3.0f - 7.0f*dirzz); + out[20] = 3.0f/(16.0f*(float)sqrt(DX_PI))*(35.0f*dirzzzz - 30.f*dirzz + 3.0f); + out[21] = 0.375f*(float)sqrt(10.0f/DX_PI)*dirxz*(3.0f - 7.0f*dirzz); + out[22] = 0.375f*(float)sqrt(5.0f/DX_PI)*(dirxx - diryy)*(7.0f*dirzz - 1.0f); + out[23] = 3.0f*dir.z*out[15]; + out[24] = 3.0f / 16.0f*float(sqrt(35.0f/DX_PI))*(dirxxxx - 6.0f*dirxyxy + diryyyy); + if(order == 5) + return; + + out[25] = -3.0f/32.0f*(float)sqrt(154.0f/DX_PI)*dir.y*(5.0f*dirxxxx - 10.0f*dirxyxy + diryyyy); + out[26] = 0.75f*(float)sqrt(385.0f/DX_PI)*dirxy*dir.z*(dirxx - diryy); + out[27] = (float)sqrt(770.0f/DX_PI)/32.0f*dir.y*(3.0f*dirxx - diryy)*(1.0f - 9.0f*dirzz); + out[28] = (float)sqrt(1155.0f/DX_PI)/4.0f*dirxy*dir.z*(3.0f*dirzz - 1.0f); + out[29] = (float)sqrt(165.0f/DX_PI)/16.0f*dir.y*(14.0f*dirzz - 21.0f*dirzzzz - 1.0f); + out[30] = (float)sqrt(11.0f/DX_PI)/16.0f*dir.z*(63.0f*dirzzzz - 70.0f*dirzz + 15.0f); + out[31] = (float)sqrt(165.0f/DX_PI)/16.0f*dir.x*(14.0f*dirzz - 21.0f*dirzzzz - 1.0f); + out[32] = (float)sqrt(1155.0f/DX_PI)/8.0f*dir.z*(dirxx - diryy)*(3.0f*dirzz - 1.0f); + out[33] = (float)sqrt(770.0f/DX_PI)/32.0f*dir.x*(dirxx - 3.0f*diryy)*(1.0f - 9.0f*dirzz); + out[34] = 3.0f/16.0f*(float)sqrt(385.0f/DX_PI)*dir.z*(dirxxxx - 6.0f*dirxyxy + diryyyy); + out[35] = -3.0f/32.0f*(float)sqrt(154.0f/DX_PI)*dir.x*(dirxxxx - 10.0f*dirxyxy + 5.0f*diryyyy); + } +//+------------------------------------------------------------------+ +//| Evaluates a directional light and | +//| returns spectral spherical harmonic (SH) data. | +//+------------------------------------------------------------------+ +//| The output vector is computed so that if the intensity ratio | +//| R/G/B is equal to 1 ,the resulting exit radiance of a point | +//| directly under the light on a diffuse object with an albedo | +//| of 1 would be 1.0. This will compute three spectral samples; | +//| rout[], gout[] and bout[] will be returned. | +//+------------------------------------------------------------------+ +int DXSHEvalDirectionalLight(int order,const DXVector3 &dir,float Rintensity,float Gintensity,float Bintensity,float &rout[],float &gout[],float &bout[]) + { + float s = 0.75f; + if(order > 2) + s += 5.0f/16.0f; + if(order > 4) + s -= 3.0f/32.0f; + s /= DX_PI; + + DXSHEvalDirection(rout,order,dir); + for(int j=0; j DXSH_MAXORDER) + order = DXSH_MAXORDER; +//--- check radius + if(radius < 0.0f) + radius = -radius; + + float dist = DXVec3Length(dir); + float clamped_angle = (dist <= radius) ? DX_PI/2.0f : (float)asin(radius / dist); + + weightedcapintegrale(cap,order,clamped_angle); + DXVec3Normalize(normal,dir); + DXSHEvalDirection(rout,order,normal); + + for(int i=0; iDXSH_MAXORDER) || (order0; j--) + { + out[sum - j] = 0.0f; + out[sum - j] = c[j - 1]*in[sum - j]; + out[sum - j] += s[j - 1]*in[sum + j]; + } + out[sum] = in[sum]; + //--- + for(int j=1; j(); + if(m_buffer_object!=NULL) + { + m_buffer_object.AddRef(); + //--- use default vertex shader + m_shader_vertex=dispatcher.ShaderCreateDefault(DX_SHADER_VERTEX); + if(m_shader_vertex!=NULL) + { + m_shader_vertex.AddRef(); + //--- use default pixel shader + m_shader_pixel=dispatcher.ShaderCreateDefault(DX_SHADER_PIXEL); + if(m_shader_pixel!=NULL) + { + m_shader_pixel.AddRef(); + //--- create vertex buffer + m_buffer_vertex=dispatcher.VertexBufferCreate(vertices); + if(m_buffer_vertex!=NULL) + { + m_buffer_vertex.AddRef(); + //--- create index buffer + m_buffer_index=dispatcher.IndexBufferCreate(indices); + if(m_buffer_index!=NULL) + m_buffer_index.AddRef(); + } + } + } + } + //--- set object buffer to shaders + if(m_buffer_object==NULL || m_shader_vertex==NULL || m_shader_pixel==NULL || m_buffer_vertex==NULL || m_buffer_index==NULL) + { + Shutdown(); + return(false); + } + //--- save scene buffer + m_buffer_scene=buffer_scene; + m_buffer_scene.AddRef(); + //--- save topology + m_topology=topology; + //--- + return(true); + } + //+------------------------------------------------------------------+ + //| Create mesh object from OBJ mesh file | + //+------------------------------------------------------------------+ + bool Create(CDXDispatcher &dispatcher,CDXInput* buffer_scene,string obj_path,float scale=1.0f,bool inverse_winding=false) + { + DXVertex vertices[]; + uint indices[]; + //--- load model + if(!DXLoadObjModel(obj_path,vertices,indices,scale)) + return(false); + //--- set white vertices color + DXColor white=DXColor(1.0f,1.0f,1.0f,1.0f); + int count=ArraySize(vertices); + for(int i=0; i +void DXInverseWinding(TVertex &vertices[],uint &indices[]) + { +//--- proccess vertices + uint count=ArraySize(vertices); + for(uint i=0; i0) + faces[idx].v[i]=(int)StringToInteger(str_parsed_faces[0]); + if(elements>1) + faces[idx].t[i]=(int)StringToInteger(str_parsed_faces[1]); + if(elements>2) + faces[idx].n[i]=(int)StringToInteger(str_parsed_faces[2]); + } + //--- debug message + if(show_debug) + printf("%face d: %d vertex(%d,%d,%d,%d) texture(%d,%d,%d,%d) normal(%d,%d,%d,%d)",idx+1, + faces[idx].v[0],faces[idx].v[1],faces[idx].v[2],faces[idx].v[3], + faces[idx].t[0],faces[idx].t[1],faces[idx].t[2],faces[idx].t[3], + faces[idx].n[0],faces[idx].n[1],faces[idx].n[2],faces[idx].n[3]); + //--- + break; + } + + default: + { + break; + } + } + } +//--- close the file + FileClose(file_handle); +//--- + if(show_debug) + { + printf("File %s loaded successfully. Total lines: %d",filename,total_lines); + printf("total v_positions=%d",total_positions); + printf("total v_normals=%d",total_normals); + printf("total v_tcoords=%d",total_tcoords); + printf("total faces=%d",total_faces); + } +//--- + return(true); + } +//+------------------------------------------------------------------+ +//| Load static 3D models from Maya 2011 | +//| https://en.wikibooks.org/wiki/DirectX/10.0/Direct3D/Loading_Maya | +//| TVertex must have | +//| DXVector4 position, normal and DXVector2 tcoord members | +//+------------------------------------------------------------------+ +template +bool DXLoadObjModel(const string filename,TVertex &vertices[],uint &indices[],float scale=1.0f) + { +//--- intermediate data arrays + DXVector4 v_positions[]; + DXVector2 v_tcoords[]; + DXVector4 v_normals[]; + OBJFaceType faces[]; +//--- load data + if(!DXLoadObjData(filename,v_positions,v_tcoords,v_normals,faces,false)) + { + printf("Error loading model data from %s",filename); + return(false); + } +//--- + int total_v_positions=ArraySize(v_positions); + int total_v_tcoords =ArraySize(v_tcoords); + int total_v_normals =ArraySize(v_normals); + int total_faces =ArraySize(faces); +//--- check faces + if(total_faces==0) + { + printf("No model data."); + return(false); + } +//--- check consistency of the indices + int vertices_count=0; + int indices_count =0; + bool split_vertices=false; + for(int i=0; i4) + { + printf("Error in %d face, face vertices count is %d",i,faces[i].total); + return(false); + } + //--- + for(int j=0; jtotal_v_positions) + { + printf("Error in %d face, %d vertext index is %d. Total posiitons=%d",i,j,faces[i].v[j],total_v_positions); + return(false); + } + if(total_v_tcoords>0) + { + if(faces[i].t[j]<=0 || faces[i].t[j]>total_v_tcoords) + { + printf("Error in %d face, %d tcoord index is %d. Total tcoords=%d",i,j,faces[i].v[j],total_v_positions); + return(false); + } + if(faces[i].t[j]!=faces[i].v[j]) + split_vertices=true; + } + if(total_v_normals>0) + { + if(faces[i].n[j]<=0 || faces[i].n[j]>total_v_normals) + { + printf("Error in %d face, %d normal index is %d. Total normals=%d",i,j,faces[i].v[j],total_v_positions); + return(false); + } + if(faces[i].n[j]!=faces[i].v[j]) + split_vertices=true; + } + } + //--- calc counts + vertices_count+=faces[i].total; + if(faces[i].total<4) + indices_count+=3; + else + indices_count+=6; + } + printf("Data consistency checked."); +//--- prepare arrays + if(!split_vertices) + vertices_count=total_v_positions; + ArrayResize(vertices,vertices_count); + ArrayResize(indices, indices_count); + int v_idx=0,i_idx=0; + for(int i=0; i +bool DXComputeBox(const DXVector3 &from,const DXVector3 &to,TVertex &vertices[],uint &indices[]) + { +//--- prepare arrays + const int faces=6; + if(ArrayResize(vertices,4*faces)!=4*faces) + return(false); +//--- set indices + uint ind[]= {0,1,2, 2,3,0, 4,5,6, 6,7,4, 8,9,10, 10,11,8, 12,13,14, 14,15,12, 16,17,18, 18,19,16, 20,21,22, 22,23,20}; + ArrayResize(indices,0); + if(ArrayCopy(indices,ind)!=ArraySize(ind)) + return(false); +//--- prepare boundaries + float left=from.x,right=to.x,bottom=from.y,top=to.y,near=from.z,far=to.z; + if(from.x>to.x) + { + right=from.x; + left= to.x; + } + if(from.y>to.y) + { + top= from.y; + bottom=to.y; + } + if(from.z>to.z) + { + far=from.z; + near=to.z; + } +//--- left face + vertices[0].position=DXVector4(left,top, far, 1.0); + vertices[1].position=DXVector4(left,top, near,1.0); + vertices[2].position=DXVector4(left,bottom,near,1.0); + vertices[3].position=DXVector4(left,bottom,far, 1.0); + for(int i=0; i<4; i++) + vertices[i].normal=DXVector4(-1.0,0.0,0.0,0.0); +//--- right face + vertices[4].position=DXVector4(right,top, near,1.0); + vertices[5].position=DXVector4(right,top, far, 1.0); + vertices[6].position=DXVector4(right,bottom,far, 1.0); + vertices[7].position=DXVector4(right,bottom,near,1.0); + for(int i=4; i<8; i++) + vertices[i].normal=DXVector4(1.0,0.0,0.0,0.0); +//--- front face + vertices[8].position =DXVector4(left, top, near,1.0); + vertices[9].position =DXVector4(right,top, near,1.0); + vertices[10].position=DXVector4(right,bottom,near,1.0); + vertices[11].position=DXVector4(left, bottom,near,1.0); + for(int i=8; i<12; i++) + vertices[i].normal=DXVector4(0.0,0.0,-1.0,0.0); +//--- back face + vertices[12].position=DXVector4(right,top, far,1.0); + vertices[13].position=DXVector4(left, top, far,1.0); + vertices[14].position=DXVector4(left, bottom,far,1.0); + vertices[15].position=DXVector4(right,bottom,far,1.0); + for(int i=12; i<16; i++) + vertices[i].normal=DXVector4(0.0,0.0,1.0,0.0); +//--- top face + vertices[16].position=DXVector4(left, top,far, 1.0); + vertices[17].position=DXVector4(right,top,far, 1.0); + vertices[18].position=DXVector4(right,top,near,1.0); + vertices[19].position=DXVector4(left, top,near,1.0); + for(int i=16; i<20; i++) + vertices[i].normal=DXVector4(0.0,1.0,0.0,0.0); +//--- bottom face + vertices[20].position=DXVector4(left, bottom,near,1.0); + vertices[21].position=DXVector4(right,bottom,near,1.0); + vertices[22].position=DXVector4(right,bottom,far, 1.0); + vertices[23].position=DXVector4(left, bottom,far, 1.0); + for(int i=20; i<24; i++) + vertices[i].normal=DXVector4(0.0,-1.0,0.0,0.0); +//--- texture coordinates + for(int i=0; i +bool DXComputeSphere(float radius,uint tessellation,TVertex &vertices[],uint &indices[]) + { + if(tessellation<3) + tessellation=3; + uint segments_y =tessellation; + uint segments_xz=tessellation*2; +//--- prepare arrays + uint count=(segments_y+1)*(segments_xz+1); + if(ArrayResize(vertices,count)!=count) + return(false); + count=6*segments_y*(segments_xz); + if(ArrayResize(indices,count)!=count) + return(false); +//--- create rings of vertices at progressively higher latitudes. + for(uint i=0,idx=0; i<=segments_y; i++) + { + DXVector2 tcoord=DXVector2(0.0f,1.0f-(float)i/segments_y); + float latitude=(i*DX_PI/segments_y)-DX_PI_DIV2; + float dy =(float)sin(latitude); + float dxz=(float)cos(latitude); + //--- create a single ring of vertices at this latitude. + for(uint j=0; j<=segments_xz; j++,idx++) + { + float longitude=(j%segments_xz)*DX_PI_MUL2/segments_xz; + //--- normal + DXVector3 normal=DXVector3((float)sin(longitude)*dxz,dy,(float)cos(longitude)*dxz); + vertices[idx].normal =DXVector4(normal.x,normal.y,normal.z,0.0); + //--- position + DXVec3Scale(normal,normal,radius); + vertices[idx].position=DXVector4(normal.x,normal.y,normal.z,1.0); + //--- texture coords + tcoord.x = float(j)/segments_xz; + vertices[idx].tcoord =tcoord; + } + } +//--- fill the index buffer with triangles joining each pair of latitude rings. + uint stride=segments_xz+1; + uint idx=0; + for(uint i=0; i +bool DXComputeTorus(float outer_radius,float inner_radius,uint tessellation,TVertex &vertices[],uint &indices[]) + { + if(tessellation<3) + tessellation=3; +//--- prepare arrays + uint count=(tessellation+1)*(tessellation+1); + if(ArrayResize(vertices,count)!=count) + return(false); + count=6*tessellation*tessellation; + if(ArrayResize(indices,count)!=count) + return(false); +//--- + uint v=0,idx=0; + uint stride=tessellation+1; +//--- first we loop around the main ring of the torus. + for(uint i=0; i<=tessellation; i++) + { + DXVector2 tcoord=DXVector2(float(i)/tessellation,0.0f); + //--- create a transform matrix that will align geometry to slice perpendicularly though the current ring position. + DXMatrix rotation,transform; + DXMatrixRotationY(rotation,-1.0f*(i%tessellation)*DX_PI_MUL2/tessellation-DX_PI_DIV2); + DXMatrixTranslation(transform,outer_radius,0.0f,0.0f); + DXMatrixMultiply(transform,transform,rotation); + //--- now we loop along the other axis, around the side of the tube. + for(uint j=0; j<=tessellation; j++) + { + //--- calc normal and position + float angle=(j%tessellation)*DX_PI_MUL2/tessellation+DX_PI; + vertices[v].normal=DXVector4((float)cos(angle),(float)sin(angle),0.0f,0.0f); + vertices[v].position=DXVector4(vertices[v].normal.x*inner_radius,vertices[v].normal.y*inner_radius,0.0f,1.0f); + DXVec4Transform(vertices[v].normal, vertices[v].normal, transform); + DXVec4Transform(vertices[v].position,vertices[v].position,transform); + //--- calc texture coord + tcoord.y=1-float(j)/tessellation; + vertices[v].tcoord=tcoord; + v++; + //--- create indices for two triangles. + if(i +bool DXComputeCylinder(float radius,float height,uint tessellation,TVertex &vertices[],uint &indices[]) + { + return(DXComputeTruncatedCone(radius,radius,height,tessellation,vertices,indices)); + } +//+------------------------------------------------------------------+ +//| Truncated Cone | +//| TVertex must have | +//| DXVector4 position, DXVector4 normal and DXVector2 tcoord members| +//+------------------------------------------------------------------+ +template +bool DXComputeTruncatedCone(float radius_top,float radius_bottom,float height,uint tessellation,TVertex &vertices[],uint &indices[]) + { + if(tessellation<3) + tessellation=3; +//--- prepare arrays + uint count=2*(tessellation+1)+2*tessellation; + if(ArrayResize(vertices,count)!=count) + return(false); + count=6*tessellation+6*(tessellation-1); + if(ArrayResize(indices,count)!=count) + return(false); +//--- prepare normal + DXVector2 normal=DXVector2(height,radius_bottom-radius_top); + DXVec2Normalize(normal,normal); + float dy=height/2.0f; + uint v=0,idx=0; + uint stride=2; +//--- create top and bottom rings of vertices + for(uint i=0; i<=tessellation; i++) + { + float u=1.0f-(float)i/tessellation; + float angle=(i*DX_PI_MUL2/tessellation); + float dx=(float)sin(angle); + float dz=(float)cos(angle); + //--- + vertices[v].normal =DXVector4(dx*normal.x,normal.y,dz*normal.x,0.0f); + vertices[v].position=DXVector4(dx*radius_bottom,-dy,dz*radius_bottom,1.0f); + vertices[v].tcoord =DXVector2(u,1.0f); + v++; + vertices[v].normal =vertices[v-1].normal; + vertices[v].position=DXVector4(dx*radius_top,dy,dz*radius_top,1.0f); + vertices[v].tcoord =DXVector2(u,0.0f); + v++; + //--- creater side surface + if(i0 && i +bool DXComputeCone(float radius,float height,uint tessellation,TVertex &vertices[],uint &indices[]) + { + if(tessellation<3) + tessellation=3; +//--- prepare arrays + uint count=2*(tessellation+1)+tessellation; + if(ArrayResize(vertices,count)!=count) + return(false); + count=3*tessellation+3*(tessellation-1); + if(ArrayResize(indices,count)!=count) + return(false); +//--- prepare normal + DXVector2 normal=DXVector2(height,radius); + DXVec2Normalize(normal,normal); + float dy=height/2.0f; + uint v=0,idx=0; + uint stride=2; +//--- create top and bottom rings of vertices + for(uint i=0; i<=tessellation; i++) + { + float u=1.0f-(float)i/tessellation; + float angle=(i*DX_PI_MUL2/tessellation); + float dx=(float)sin(angle); + float dz=(float)cos(angle); + //--- + vertices[v].normal =DXVector4(dx*normal.x,normal.y,dz*normal.x,0.0f); + vertices[v].position=DXVector4(dx*radius,-dy,dz*radius,1.0f); + vertices[v].tcoord =DXVector2(u,1.0f); + v++; + vertices[v].normal =vertices[v-1].normal; + vertices[v].position=DXVector4(0.0f,dy,0.0f,1.0f); + vertices[v].tcoord =DXVector2(u,0.0f); + v++; + //--- creater side surface + if(i0 && i +bool DXComputeSurface(double &data[],uint data_width,uint data_height,double data_range, + const DXVector3 &from,const DXVector3 &to,DXVector2 &texture_size, + bool two_sided,bool use_normals, + TVertex &vertices[],uint &indices[]) + { +//--- + if(data_width<2 || data_height<2) + return(false); +//--- prepare arrays for vertices and triangles + uint count=data_width*data_height*(two_sided?2:1); + if(!ArrayResize(vertices,count)) + return(false); + count=6*(data_width-1)*(data_height-1)*(two_sided?2:1); + if(!ArrayResize(indices,count)) + return(false); +//--- find min and max value + float min_value=+FLT_MAX; + float max_value=-FLT_MAX; + for(uint j=0; jvalue) + min_value=value; + if(max_value=data_width-1) + DXVec4Subtract(v1,vertices[j*data_width+i-1].position,vertices[j*data_width+i].position); + else + DXVec4Subtract(v1,vertices[j*data_width+i-1].position,vertices[j*data_width+i+1].position); + //--- v2 + if(j<=0) + DXVec4Subtract(v2,vertices[j*data_width+i].position,vertices[(j+1)*data_width+i].position); + else + if(j>=data_height-1) + DXVec4Subtract(v2,vertices[(j-1)*data_width+i].position,vertices[j*data_width+i].position); + else + DXVec4Subtract(v2,vertices[(j-1)*data_width+i].position,vertices[(j+1)*data_width+i].position); + //--- normal + DXVec4Cross(normal,v2,v1,DXVector4(0.0f,0.0f,0.0f,1.0f)); + float inv_len=(float)(1.0/sqrt(normal.x*normal.x+normal.y*normal.y+normal.z*normal.z)); + vertices[j*data_width+i].normal.x=normal.x*inv_len; + vertices[j*data_width+i].normal.y=normal.y*inv_len; + vertices[j*data_width+i].normal.z=normal.z*inv_len; + vertices[j*data_width+i].normal.w=0.0f; + } + } + } + else + { + DXVector4 n=DXVector4(0.0f,0.0f,0.0f,0.0f); + for(int i=0; i blue > light blue > green > yellow > red > dark red | +//+---------------------------------------------------------------------+ +void DXComputeColorJet(const float value,DXColor &cout) + { + float v=value*1.1f-0.05f; + cout.r = fmin(fmax(v<0.75f ? 4*v-1.5f : 4.5f-4*v,0.0f),1.0f); + cout.g = fmin(fmax(v<0.5f ? 4*v-0.5f : 3.5f-4*v,0.0f),1.0f); + cout.b = fmin(fmax(v<0.25f ? 4*v+0.5f : 2.5f-4*v,0.0f),1.0f); + cout.a = 1.0; + } +//+---------------------------------------------------------------------+ +//| Computes hot to cold color scheme colors on [0;1] range | +//| blue > light blue > green > yellow > red | +//+---------------------------------------------------------------------+ +void DXComputeColorColdToHot(const float value,DXColor &cout) + { + float v=2*value-1.0f; + cout.r = fmin(fmax(2*v,0.0f),1.0f); + cout.g = fmin(fmax(2.0f-2*fabs(v),0.0f),1.0f); + cout.b = fmin(fmax(-2*v,0.0f),1.0f); + cout.a = 1.0; + } +//+---------------------------------------------------------------------+ +//| Computes red to green color scheme colors on [0;1] range | +//| red > yellow > dark green | +//+---------------------------------------------------------------------+ +void DXComputeColorRedToGreen(const float value,DXColor &cout) + { + if(value<=0.5) + { + cout.r=1.0f; + cout.g=DXScalarLerp(0.01f,0.95f,fmin(fmax(2*value,0.0f),1.0f)); + } + else + { + cout.r=DXScalarLerp(0.1f,1.0f, fmin(fmax(2.0f-2*value,0.0f),1.0f)); + cout.g=DXScalarLerp(0.6f,0.95f,fmin(fmax(2.0f-2*value,0.0f),1.0f)); + } + cout.b=0.0f; + cout.a=1.0f; + } +//+------------------------------------------------------------------+ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/Shaders/DefaultShaderPixel.hlsl b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/Shaders/DefaultShaderPixel.hlsl new file mode 100644 index 0000000..1201389 --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/Shaders/DefaultShaderPixel.hlsl @@ -0,0 +1,71 @@ +//+------------------------------------------------------------------+ +//| Default Pixel Shader | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +//+------------------------------------------------------------------+ +//| Inputs for whole scene | +//+------------------------------------------------------------------+ +cbuffer InputScene : register(b0) + { + matrix view; + matrix projection; + float4 light_direction; + float4 light_color; + float4 ambient_color; + }; +//+------------------------------------------------------------------+ +//| Inputs for single object | +//+------------------------------------------------------------------+ +cbuffer InputObject : register(b1) + { + matrix transform; + float4 diffuse_color; + float4 emission_color; + float4 specular_color; + float specular_power; + float dummy[3]; + }; +//+------------------------------------------------------------------+ +//| Input texture | +//+------------------------------------------------------------------+ +Texture2D diffuse_tex : register(t0); +//+------------------------------------------------------------------+ +//| Texture sampler | +//+------------------------------------------------------------------+ +SamplerState diffuse_samp + { + Filter =MIN_MAG_MIP_LINEAR; + AddressU=Wrap; + AddressV=Wrap; + }; +//+------------------------------------------------------------------+ +//| Pixel shader input type | +//+------------------------------------------------------------------+ +struct PSInput + { + float4 position : SV_POSITION; + float4 camera : CAMERA; + float4 normal : NORMAL; + float2 tcoord : TEXCOORD; + float4 color : COLOR; + }; +//+------------------------------------------------------------------+ +//| Pixel shader entry point | +//+------------------------------------------------------------------+ +float4 PSMain(PSInput input) : SV_TARGET + { + float3 diffuse =saturate(-dot(light_direction.xyz,input.normal.xyz))*light_color.rgb*light_color.a; + float3 ambient =ambient_color.rgb *ambient_color.a; + float3 light =(diffuse+ambient)*diffuse_color.rgb*diffuse_color.a+emission_color.rgb*emission_color.a; + float4 specular=float4(light_color.rgb*specular_color.rgb,pow(saturate(dot(reflect(normalize(light_direction.xyz),input.normal.xyz),normalize(input.camera.xyz))),specular_power)*light_color.a*specular_color.a); + float4 clr=input.color; + //--- use texture if it exist + uint width,height; + diffuse_tex.GetDimensions(width,height); + if(width*height>0) + clr*=diffuse_tex.Sample(diffuse_samp,frac(input.tcoord)); + //--- combine light with colors + return(lerp(float4(light*clr.rgb,clr.a),float4(specular.rgb,1.0),specular.a)); + } +//+------------------------------------------------------------------+ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/Shaders/DefaultShaderVertex.hlsl b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/Shaders/DefaultShaderVertex.hlsl new file mode 100644 index 0000000..b9155aa --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/DX/Shaders/DefaultShaderVertex.hlsl @@ -0,0 +1,72 @@ +//+------------------------------------------------------------------+ +//| Default Vertex Shader | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| Inputs for whole scene | +//+------------------------------------------------------------------+ +cbuffer InputScene : register(b0) + { + matrix view; + matrix projection; + float4 light_direction; + float4 light_color; + float4 ambient_color; + }; +//+------------------------------------------------------------------+ +//| Inputs for single object | +//+------------------------------------------------------------------+ +cbuffer InputObject : register(b1) + { + matrix transform; + float4 diffuse_color; + float4 emission_color; + float4 specular_color; + float specular_power; + float dummy[3]; + }; +//+------------------------------------------------------------------+ +//| Vertex shader input type | +//+------------------------------------------------------------------+ +struct VSInput + { + float4 position : POSITION; + float4 normal : NORMAL; + float2 tcoord : TEXCOORD; + float4 color : COLOR; + }; +//+------------------------------------------------------------------+ +//| Pixel shader input type | +//+------------------------------------------------------------------+ +struct PSInput + { + float4 position : SV_POSITION; + float4 camera : CAMERA; + float4 normal : NORMAL; + float2 tcoord : TEXCOORD; + float4 color : COLOR; + }; +//+------------------------------------------------------------------+ +//| Vertex shader entry point | +//+------------------------------------------------------------------+ +PSInput VSMain(VSInput input) + { + PSInput output; + //--- posiiton and camera direction + output.position=mul(input .position,transform); + output.position=mul(output.position,view); + output.camera =-output.position; + output.position=mul(output.position,projection); + //--- transform normals + output.normal = mul(input.normal, transform); + output.normal = mul(output.normal, view); + output.normal = normalize(output.normal); + //--- color and texture coordinates + output.tcoord =input.tcoord; + output.color =input.color; +//--- + return(output); + } +//+------------------------------------------------------------------+ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/FlameCanvas.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/FlameCanvas.mqh new file mode 100644 index 0000000..615edf0 --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/Canvas/FlameCanvas.mqh @@ -0,0 +1,751 @@ +//+------------------------------------------------------------------+ +//| FlameCanvas.mqh | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include "Canvas.mqh" +#include +//+------------------------------------------------------------------+ +//| Gradient descriptors | +//+------------------------------------------------------------------+ +struct GRADIENT_COLOR + { + uint clr; // color in ARGB format + uint pos; // position of color in percentage of gradient range + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +struct GRADIENT_SIZE + { + uint size; // width of gradient fill in percentage of base fill + uint pos; // position of color in percentage of gradient length + }; +//+------------------------------------------------------------------+ +//| Class CFlameCanvas | +//| Usage: generates flame | +//+------------------------------------------------------------------+ +class CFlameCanvas : public CCanvas + { +private: + //--- parameters + uint m_bar_gap; + uint m_bar_width; + uint m_chart_scale; + double m_chart_price_min; + double m_chart_price_max; + ENUM_TIMEFRAMES m_timeframe; + string m_symbol; + int m_future_bars; + int m_back_bars; + int m_rates_total; + uint m_palette[256]; // flame palette + uchar m_flame[]; // buffer for calculation of flame + uint m_time_redraw; + uint m_delay; + // bool m_resize_flag; + // int m_tick_cnt; + //--- flame parameters + datetime m_tb1; + double m_pb1; + datetime m_te1; + double m_pe1; + datetime m_tb2; + double m_pb2; + datetime m_te2; + double m_pe2; + //--- equation parameters for flame + int m_cloud_axis[100]; + double m_a1; + double m_b1; + double m_a2; + double m_b2; + int m_xb1; + int m_yb1; + int m_xe1; + int m_ye1; + int m_xb2; + int m_yb2; + int m_xe2; + int m_ye2; + +public: + CFlameCanvas(void); + ~CFlameCanvas(void); + //--- create + bool FlameCreate(const string name,const datetime time,const int future_bars,const int back_bars=0); + void RatesTotal(const int value); + //--- setting + void PaletteSet(uint clr=0xFF0000); + //--- draw + void FlameDraw(const double &prices[],const int width,const int lenght); + void FlameSet(datetime xb1,double yb1,datetime xe1,double ye1,datetime xb2,double yb2,datetime xe2,double ye2); + //--- event handler + void ChartEventHandler(const int id,const long &lparam,const double &dparam,const string &sparam); + +protected: + bool Resize(void); + void ChartScale(void); + void FlameSet(void); + void CloudDraw(const double &prices[],const int width,const int lenght,GRADIENT_SIZE &size[],GRADIENT_COLOR &gradient[],const uchar t_level=255,const bool custom_gradient=true); + void FlameDraw(const int width,const int lenght,GRADIENT_SIZE &size[],GRADIENT_COLOR &gradient[]); + void GradientVertical(const int xb,const int xe,const int yb1,const int ye1,const int yb2,const int ye2,const GRADIENT_COLOR &gradient[]); + void GradientVerticalLine(int x,int y1,int y2,const GRADIENT_COLOR &gradient[]); + void GradientVerticalLineMonochrome(int x,int y1,int y2,uint clr1,uint clr2); + void FlameCreate(void); + void FlameCalculate(void); + void Delay(const uint value); + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CFlameCanvas::CFlameCanvas(void) : m_bar_gap(16), + m_bar_width(8), + m_chart_scale(1), + m_chart_price_min(0.0), + m_chart_price_max(0.0), + m_timeframe(PERIOD_CURRENT), + m_symbol(NULL), + m_future_bars(0), + m_back_bars(0), + m_rates_total(0), + m_time_redraw(0), + m_delay(50), + m_tb1(0), + m_pb1(0), + m_te1(0), + m_pe1(0), + m_tb2(0), + m_pb2(0), + m_te2(0), + m_pe2(0) + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CFlameCanvas::~CFlameCanvas(void) + { + Destroy(); + } +//+------------------------------------------------------------------+ +//| Creates dynamic resource with object | +//+------------------------------------------------------------------+ +bool CFlameCanvas::FlameCreate(const string name,const datetime time,const int future_bars,const int back_bars) + { +//--- get chart parameters + ChartScale(); +//--- create + int width =(int)m_bar_gap*(future_bars+back_bars); + int height=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); + if(!CreateBitmap(0,0,name,time-back_bars*PeriodSeconds(),m_chart_price_max,width,height,COLOR_FORMAT_ARGB_NORMALIZE)) + return(false); + ArrayResize(m_flame,width*height); +//--- save parameters + m_future_bars=future_bars; + m_back_bars =back_bars; +//--- settings + PaletteSet(); + m_timeframe =Period(); + m_symbol =Symbol(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Resize | +//+------------------------------------------------------------------+ +bool CFlameCanvas::Resize(void) + { + int x,y; +//--- get limits + double min=ChartGetDouble(0,CHART_PRICE_MIN); + double max=ChartGetDouble(0,CHART_PRICE_MAX); + if(m_chart_price_max!=max) + { + //--- move object + ObjectSetDouble(0,m_objname,OBJPROP_PRICE,0,max); + } +//--- check + if(m_chart_price_min==min && m_chart_price_max==max) + return(false); + m_chart_price_min=min; + m_chart_price_max=max; +//--- grt size + ChartTimePriceToXY(0,0,m_tb1,min,x,y); + int width =(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)-x; + int height=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); +//--- resize + if(width80) g+=dg; + if(i>160) b+=db; + } + } +//+------------------------------------------------------------------+ +//| Draws the flame | +//+------------------------------------------------------------------+ +void CFlameCanvas::FlameDraw(const double &prices[],const int width,const int lenght) + { + static GRADIENT_SIZE sword[]={{100,0},{150,70},{0,100}}; + static GRADIENT_COLOR flame[]={{0x00,0},{0x7F7F7F,12},{0xCCCCCC,30},{0xFFFFFF,45},{0xFFFFFF,55},{0xCCCCCC,70},{0x7F7F7F,88},{0x00,100}}; +//--- draw + CloudDraw(prices,width,lenght,sword,flame); +//--- copy flame buffer + FlameCalculate(); +//--- start timer + EventChartCustom(CONTROLS_SELF_MESSAGE,1302,0,0,NULL); + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void CFlameCanvas::FlameDraw(const int width,const int lenght,GRADIENT_SIZE &size[],GRADIENT_COLOR &gradient[]) + { +//--- check + int total=ArraySize(m_cloud_axis); + if(total<2) + return; + if(total>lenght) + total=lenght; +//--- draw + int xb,xe; // coordinates of the segment + int ybm,yem; // coordinates of the center line + int yb1,ye1; // coordinates of the first line + int yb2,ye2; // coordinates of the second line +//--- for implementation of variable width + int w_total=ArraySize(size); + if(w_total<2) + return; + int w_i =0; + int w_is=(int)size[w_i].pos*total/100; + int w_ie=(int)size[w_i+1].pos*total/100; + double w =size[w_i].size*width/100; + double dw =(size[w_i+1].size*width/100-w)/(w_ie-w_is); +//--- draw from left to right + xb=0; + ybm=m_cloud_axis[0]; + yb1=ybm-(int)(w/2); + yb2=ybm+(int)(w/2); +//--- draw + for(int i=1;i=m_width) + break; + yb1=ye1; + yb2=ye2; + while(i>=w_ie-1 && i!=total-1) + { + w_i++; + w_is=(int)size[w_i].pos*total/100; + w_ie=(int)size[w_i+1].pos*total/100; + w =size[w_i].size*width/100; + if(w_ie==w_is) + { + //--- for "instant" resize + dw=size[w_i+1].size*width/100-w; + w+=dw; + ye1=yem-(int)(w/2); + ye2=yem+(int)(w/2); + //--- draw the segment of 'cloud' + GradientVertical(xb,xe,yb1,ye1,yb2,ye2,gradient); + yb1=ye1; + yb2=ye2; + } + else + { + dw=(size[w_i+1].size*width/100-w)/(w_ie-w_is); + break; + } + } + } +//--- copy flame buffer + FlameCalculate(); + } +//+------------------------------------------------------------------+ +//| Sets parameters of the flame and starts to draw | +//+------------------------------------------------------------------+ +void CFlameCanvas::FlameSet(void) + { + m_a1=m_bar_gap*((m_ye1-m_yb1)/((double)m_xe1-m_xb1)); + m_a2=m_bar_gap*((m_ye2-m_yb2)/((double)m_xe2-m_xb2)); + } +//+------------------------------------------------------------------+ +//| Sets parameters of the flame and starts to draw | +//+------------------------------------------------------------------+ +void CFlameCanvas::FlameSet(datetime tb1,double pb1, + datetime te1,double pe1, + datetime tb2,double pb2, + datetime te2,double pe2) + { + datetime obj_time =(datetime)ObjectGetInteger(0,m_objname,OBJPROP_TIME); + double obj_price=ObjectGetDouble(0,m_objname,OBJPROP_PRICE); + int dx,dy; +//--- save parameters + m_tb1=tb1; + m_pb1=pb1; + m_te1=te1; + m_pe1=pe1; + m_tb2=tb2; + m_pb2=pb2; + m_te2=te2; + m_pe2=pe2; +//--- resize + Resize(); +//--- convert + if(ChartTimePriceToXY(0,0,obj_time,obj_price,dx,dy)) + { + dy=m_yb1; + if(ChartTimePriceToXY(0,0,tb1,pb1,m_xb1,m_yb1)) + if(ChartTimePriceToXY(0,0,te1,pe1,m_xe1,m_ye1)) + if(ChartTimePriceToXY(0,0,tb2,pb2,m_xb2,m_yb2)) + if(ChartTimePriceToXY(0,0,te2,pe2,m_xe2,m_ye2)) + { + //--- convert to canvas coordinates + m_xb1-=dx; + m_xe1-=dx; + m_xb2-=dx; + m_xe2-=dx; + //--- + FlameSet(); + } + } +//--- start timer + EventChartCustom(CONTROLS_SELF_MESSAGE,1302,0,0,NULL); + } +//+------------------------------------------------------------------+ +//| Generate array that describes the body of flame | +//+------------------------------------------------------------------+ +void CFlameCanvas::FlameCreate(void) + { + static GRADIENT_SIZE sword[]={{100,0},{150,70},{0,100}}; + static GRADIENT_COLOR flame[]={{0x00,0},{0x7F7F7F,12},{0xCCCCCC,30},{0xFFFFFF,45},{0xFFFFFF,55},{0xCCCCCC,70},{0x7F7F7F,88},{0x00,100}}; +//--- + double a=rand(); // parameter of line a*x+b + double b=rand(); // parameter of line a*x+b + double c=rand(); // parameter of sine c*Sin(d*x) + double d=rand(); // parameter of sine c*Sin(d*x) + int w=rand(); // width at the base + int l=rand(); // length +//--- normalize + a=fmod(a,(m_a2-m_a1))+m_a1; + b=(m_yb1+m_yb2)/2; + c=fmod(c,20); + d=fmod(d,3*M_PI)+M_PI; +//--- shape + w%=150; + if(w<10) + w=10; // but no less than 10 + sword[1].size=w; + w=rand(); + l%=50; + sword[1].pos=l+30; + l=rand(); +//--- sizes + w=(m_yb2-m_yb1!=0) ? w%(m_yb2-m_yb1) : 10; // proportional to the starting width + if(w<10) + w=10; // but no less than 10 + l=l%((m_xe1-m_xb1)/(int)m_bar_gap-20)+20; // proportional to length +//--- create + int total=ArraySize(m_cloud_axis); + for(int i=0;ilenght) + total=lenght; +//--- draw + int xb,xe; // coordinates of the segment + int ybm,yem; // coordinates of the center line + int yb1,ye1; // coordinates of the first line + int yb2,ye2; // coordinates of the second line + int xx; +//--- for implementation of variable width + int w_total=ArraySize(size); + if(w_total<2) + return; + int w_i =0; + int w_is=(int)size[w_i].pos*total/100; + int w_ie=(int)size[w_i+1].pos*total/100; + double w =size[w_i].size*width/100; + double dw =(size[w_i+1].size*width/100-w)/(w_ie-w_is); +//--- draw from left to right + xb=0; + ChartTimePriceToXY(0,0,0,prices[0],xx,ybm); + yb1=ybm-(int)(w/2); + yb2=ybm+(int)(w/2); +//--- draw + for(int i=1;i=m_width) + break; + yb1=ye1; + yb2=ye2; + while(i>=w_ie-1 && i!=total-1) + { + w_i++; + w_is=(int)size[w_i].pos*total/100; + w_ie=(int)size[w_i+1].pos*total/100; + w =size[w_i].size*width/100; + if(w_ie==w_is) + { + //--- for "instant" resize + dw=size[w_i+1].size*width/100-w; + w+=dw; + ye1=yem-(int)(w/2); + ye2=yem+(int)(w/2); + //--- draw the segment of 'cloud' + GradientVertical(xb,xe,yb1,ye1,yb2,ye2,gradient); + yb1=ye1; + yb2=ye2; + } + else + { + dw=(size[w_i+1].size*width/100-w)/(w_ie-w_is); + break; + } + } + } + } +//+------------------------------------------------------------------+ +//| Draws area with vertical fill using specified gradient | +//+------------------------------------------------------------------+ +void CFlameCanvas::GradientVertical(const int xb,const int xe,const int yb1,const int ye1,const int yb2,const int ye2,const GRADIENT_COLOR &gradient[]) + { +//--- it is assumed that the colors array has sufficient size and positions are already sorted in ascending order +//--- get length by X and Y + int x1 =xb; + int y1 =yb1; + int x2 =xb; + int y2 =yb2; + int dx =(xe>xb)? xe-xb : xb-xe; + int dy1=(ye1>yb1)? ye1-yb1 : yb1-ye1; + int dy2=(ye2>yb2)? ye2-yb2 : yb2-ye2; +//--- get direction by X and Y + int sx =(xb-dy1) + { + //--- try to change X coordinate of the first line + //--- draw the second line + while(x2!=xe || y2!=ye2) + { + //--- calculate coordinates of next pixel of the second line + if((er2<<1)>-dy2) + { + //--- try to change X coordinate of the second line + //--- gradient fill + GradientVerticalLine(x1,y1,y2,gradient); + er2-=dy2; + if(x2!=xe) + x2+=sx; + } + if((er2<<1)0) + { + dd=dy; + dy=1; + } + else + { + dd=-dy; + dy=-1; + } +//--- increments for the color components + dc=(double)((uchar)clr2-clr)/dd; +//--- draw + for(int i=0;y1!=y2;i++,y1+=dy) + { + int idx=y1*m_width+x; + //--- check range + if(idx<0 || idx>=ArraySize(m_flame)) + continue; + if(x>=0 && x=0 && y1m_time_redraw) + { + //--- add the body of flame + FlameCreate(); + //--- draw frame + FlameCalculate(); + Update(); + //--- calculate time for the next frame + m_time_redraw=GetTickCount()+m_delay; + } + //--- generate next event for custom timer + EventChartCustom(CONTROLS_SELF_MESSAGE,1302,0,0,NULL); + break; + } + } +//+------------------------------------------------------------------+ +//| Delay | +//+------------------------------------------------------------------+ +void CFlameCanvas::Delay(const uint value) + { +//--- too small + if(value<10) + return; +//--- start delay + uint cnt=GetTickCount()+value; +//--- delay + while(cnt>=GetTickCount()); + } +//+------------------------------------------------------------------+ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/ChartObjects/ChartObject.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/ChartObjects/ChartObject.mqh new file mode 100644 index 0000000..a56b2b8 --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/ChartObjects/ChartObject.mqh @@ -0,0 +1,1000 @@ +//+------------------------------------------------------------------+ +//| ChartObject.mqh | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include +//+------------------------------------------------------------------+ +//| Class CChartObject. | +//| Pupose: Base class of chart objects. | +//| Derives from class CObject. | +//+------------------------------------------------------------------+ +class CChartObject : public CObject + { +protected: + long m_chart_id; // identifier of chart the object belongs to + int m_window; // number of subwindow (0 - main window) + string m_name; // unique name object name + int m_num_points; // number of anchor points of object + +public: + CChartObject(void); + ~CChartObject(void); + //--- method of identifying the object + virtual int Type(void) const { return(0x8888); } + //--- methods of access to protected data + long ChartId(void) const { return(m_chart_id); } + int Window(void) const { return(m_window); } + string Name(void) const { return(m_name); } + bool Name(const string name); + int NumPoints(void) const { return(m_num_points); } + //--- methods of filling the object + bool Attach(long chart_id,const string name,const int window,const int points); + bool SetPoint(const int point,const datetime time,const double price) const; + //--- methods of deleting + bool Delete(void); + void Detach(void); + //--- methods of access to properties of the object + datetime Time(const int point) const; + bool Time(const int point,const datetime time) const; + double Price(const int point) const; + bool Price(const int point,const double price) const; + color Color(void) const; + bool Color(const color new_color) const; + ENUM_LINE_STYLE Style(void) const; + bool Style(const ENUM_LINE_STYLE new_style) const; + int Width(void) const; + bool Width(const int new_width) const; + bool Background(void) const; + bool Background(const bool new_back) const; + bool Fill(void) const; + bool Fill(const bool new_fill) const; + long Z_Order(void) const; + bool Z_Order(const long value) const; + bool Selected(void) const; + bool Selected(const bool new_sel) const; + bool Selectable(void) const; + bool Selectable(const bool new_sel) const; + string Description(void) const; + bool Description(const string new_text) const; + string Tooltip(void) const; + bool Tooltip(const string new_text) const; + int Timeframes(void) const; + virtual bool Timeframes(const int timeframes) const; + datetime CreateTime(void) const; + int LevelsCount(void) const; + bool LevelsCount(const int new_count) const; + //--- methods to access the properties of levels of objects + color LevelColor(const int level) const; + bool LevelColor(const int level,const color new_color) const; + ENUM_LINE_STYLE LevelStyle(const int level) const; + bool LevelStyle(const int level,const ENUM_LINE_STYLE new_style) const; + int LevelWidth(const int level) const; + bool LevelWidth(const int level,const int new_width) const; + double LevelValue(const int level) const; + bool LevelValue(const int level,const double new_value) const; + string LevelDescription(const int level) const; + bool LevelDescription(const int level,const string new_text) const; + //--- access methods to the API functions of MQL5 + long GetInteger(const ENUM_OBJECT_PROPERTY_INTEGER prop_id,const int modifier=-1) const; + bool GetInteger(const ENUM_OBJECT_PROPERTY_INTEGER prop_id,const int modifier,long &value) const; + bool SetInteger(const ENUM_OBJECT_PROPERTY_INTEGER prop_id,const int modifier,const long value) const; + bool SetInteger(const ENUM_OBJECT_PROPERTY_INTEGER prop_id,const long value) const; + double GetDouble(const ENUM_OBJECT_PROPERTY_DOUBLE prop_id,const int modifier=-1) const; + bool GetDouble(const ENUM_OBJECT_PROPERTY_DOUBLE prop_id,const int modifier,double &value) const; + bool SetDouble(const ENUM_OBJECT_PROPERTY_DOUBLE prop_id,const int modifier,const double value) const; + bool SetDouble(const ENUM_OBJECT_PROPERTY_DOUBLE prop_id,const double value) const; + string GetString(const ENUM_OBJECT_PROPERTY_STRING prop_id,const int modifier=-1) const; + bool GetString(const ENUM_OBJECT_PROPERTY_STRING prop_id,const int modifier,string &value) const; + bool SetString(const ENUM_OBJECT_PROPERTY_STRING prop_id,const int modifier,const string value) const; + bool SetString(const ENUM_OBJECT_PROPERTY_STRING prop_id,const string value) const; + //--- methods of moving + bool ShiftObject(const datetime d_time,const double d_price) const; + bool ShiftPoint(const int point,const datetime d_time,const double d_price) const; + //--- methods for working with files + virtual bool Save(const int file_handle); + virtual bool Load(const int file_handle); + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CChartObject::CChartObject(void) + { +//--- initialize protected data + Detach(); + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CChartObject::~CChartObject(void) + { + if(m_chart_id!=-1) + ObjectDelete(m_chart_id,m_name); + } +//+------------------------------------------------------------------+ +//| Changing name of the object | +//+------------------------------------------------------------------+ +bool CChartObject::Name(const string name) + { +//--- check + if(m_chart_id==-1) + return(false); +//--- change + if(ObjectSetString(m_chart_id,m_name,OBJPROP_NAME,name)) + { + m_name=name; + return(true); + } +//--- failure + return(false); + }; +//+------------------------------------------------------------------+ +//| Attach object | +//+------------------------------------------------------------------+ +bool CChartObject::Attach(long chart_id,const string name,const int window,const int points) + { +//--- check + if(ObjectFind(chart_id,name)<0) + return(false); +//--- attach + if(chart_id==0) + chart_id=ChartID(); + m_chart_id =chart_id; + m_window =window; + m_name =name; + m_num_points=points; +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Setting new coordinates of anchor point of an object | +//+------------------------------------------------------------------+ +bool CChartObject::SetPoint(const int point,const datetime time,const double price) const + { +//--- check + if(m_chart_id==-1) + return(false); + if(point>=m_num_points) + return(false); +//--- result + return(ObjectMove(m_chart_id,m_name,point,time,price)); + } +//+------------------------------------------------------------------+ +//| Delete an object | +//+------------------------------------------------------------------+ +bool CChartObject::Delete(void) + { +//--- checki + if(m_chart_id==-1) + return(false); +//--- actions + bool result=ObjectDelete(m_chart_id,m_name); + Detach(); +//--- result + return(result); + } +//+------------------------------------------------------------------+ +//| Detach object | +//+------------------------------------------------------------------+ +void CChartObject::Detach(void) + { + m_chart_id =-1; + m_window =-1; + m_name =NULL; + m_num_points=0; + } +//+------------------------------------------------------------------+ +//| Get the time coordinate of the specified anchor point of object | +//+------------------------------------------------------------------+ +datetime CChartObject::Time(const int point) const + { +//--- check + if(m_chart_id==-1) + return(0); + if(point>=m_num_points) + return(0); +//--- result + return((datetime)ObjectGetInteger(m_chart_id,m_name,OBJPROP_TIME,point)); + } +//+------------------------------------------------------------------+ +//| Set the time coordinate of the specified anchor point of object | +//+------------------------------------------------------------------+ +bool CChartObject::Time(const int point,const datetime time) const + { +//--- check + if(m_chart_id==-1) + return(false); + if(point>=m_num_points) + return(false); +//--- result + return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_TIME,point,time)); + } +//+------------------------------------------------------------------+ +//| Get the price coordinate of the specified anchor point of object.| +//+------------------------------------------------------------------+ +double CChartObject::Price(const int point) const + { +//--- check + if(m_chart_id==-1) + return(EMPTY_VALUE); + if(point>=m_num_points) + return(EMPTY_VALUE); +//--- result + return(ObjectGetDouble(m_chart_id,m_name,OBJPROP_PRICE,point)); + } +//+------------------------------------------------------------------+ +//| Set the price coordinate of the specified anchor point of object.| +//+------------------------------------------------------------------+ +bool CChartObject::Price(const int point,const double price) const + { +//--- check + if(m_chart_id==-1) + return(false); + if(point>=m_num_points) + return(false); +//--- result + return(ObjectSetDouble(m_chart_id,m_name,OBJPROP_PRICE,point,price)); + } +//+------------------------------------------------------------------+ +//| Get object color | +//+------------------------------------------------------------------+ +color CChartObject::Color(void) const + { +//--- check + if(m_chart_id==-1) + return(CLR_NONE); +//--- result + return((color)ObjectGetInteger(m_chart_id,m_name,OBJPROP_COLOR)); + } +//+------------------------------------------------------------------+ +//| Set object color | +//+------------------------------------------------------------------+ +bool CChartObject::Color(const color new_color) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_COLOR,new_color)); + } +//+------------------------------------------------------------------+ +//| Get style of line of object | +//+------------------------------------------------------------------+ +ENUM_LINE_STYLE CChartObject::Style(void) const + { +//--- check + if(m_chart_id==-1) + return(WRONG_VALUE); +//--- result + return((ENUM_LINE_STYLE)ObjectGetInteger(m_chart_id,m_name,OBJPROP_STYLE)); + } +//+------------------------------------------------------------------+ +//| Set style of line of object | +//+------------------------------------------------------------------+ +bool CChartObject::Style(const ENUM_LINE_STYLE new_style) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_STYLE,new_style)); + } +//+------------------------------------------------------------------+ +//| Get width of line of object | +//+------------------------------------------------------------------+ +int CChartObject::Width(void) const + { +//--- check + if(m_chart_id==-1) + return(-1); +//--- result + return((int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_WIDTH)); + } +//+------------------------------------------------------------------+ +//| Set width of line of object | +//+------------------------------------------------------------------+ +bool CChartObject::Width(const int new_width) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_WIDTH,new_width)); + } +//+------------------------------------------------------------------+ +//| Get the "Draw object as background" flag | +//+------------------------------------------------------------------+ +bool CChartObject::Background(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ObjectGetInteger(m_chart_id,m_name,OBJPROP_BACK)); + } +//+------------------------------------------------------------------+ +//| Set the "Draw object as background" flag | +//+------------------------------------------------------------------+ +bool CChartObject::Background(const bool new_back) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_BACK,new_back)); + } +//+------------------------------------------------------------------+ +//| Get the "Filling" flag | +//+------------------------------------------------------------------+ +bool CChartObject::Fill(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ObjectGetInteger(m_chart_id,m_name,OBJPROP_FILL)); + } +//+------------------------------------------------------------------+ +//| Set the "Filling" flag | +//+------------------------------------------------------------------+ +bool CChartObject::Fill(const bool new_fill) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_FILL,new_fill)); + } +//+------------------------------------------------------------------+ +//| Get the "Z-order" property | +//+------------------------------------------------------------------+ +long CChartObject::Z_Order(void) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- result + return(ObjectGetInteger(m_chart_id,m_name,OBJPROP_ZORDER)); + } +//+------------------------------------------------------------------+ +//| Set the "Z-order" property | +//+------------------------------------------------------------------+ +bool CChartObject::Z_Order(const long value) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_ZORDER,value)); + } +//+------------------------------------------------------------------+ +//| Get the "selected" flag | +//+------------------------------------------------------------------+ +bool CChartObject::Selected(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ObjectGetInteger(m_chart_id,m_name,OBJPROP_SELECTED)); + } +//+------------------------------------------------------------------+ +//| Set the "selected" flag | +//+------------------------------------------------------------------+ +bool CChartObject::Selected(const bool new_sel) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_SELECTED,new_sel)); + } +//+------------------------------------------------------------------+ +//| Get the "selectable" flag | +//+------------------------------------------------------------------+ +bool CChartObject::Selectable(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ObjectGetInteger(m_chart_id,m_name,OBJPROP_SELECTABLE)); + } +//+------------------------------------------------------------------+ +//| Set flag the "selectable" flag | +//+------------------------------------------------------------------+ +bool CChartObject::Selectable(const bool new_sel) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_SELECTABLE,new_sel)); + } +//+------------------------------------------------------------------+ +//| Get comment of object | +//+------------------------------------------------------------------+ +string CChartObject::Description(void) const + { +//--- check + if(m_chart_id==-1) + return(""); +//--- result + return(ObjectGetString(m_chart_id,m_name,OBJPROP_TEXT)); + } +//+------------------------------------------------------------------+ +//| Set comment of object | +//+------------------------------------------------------------------+ +bool CChartObject::Description(const string new_text) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- tune + if(new_text=="") + return(ObjectSetString(m_chart_id,m_name,OBJPROP_TEXT," ")); +//--- result + return(ObjectSetString(m_chart_id,m_name,OBJPROP_TEXT,new_text)); + } +//+------------------------------------------------------------------+ +//| Get tooltip of object | +//+------------------------------------------------------------------+ +string CChartObject::Tooltip(void) const + { +//--- check + if(m_chart_id==-1) + return(""); +//--- result + return(ObjectGetString(m_chart_id,m_name,OBJPROP_TOOLTIP)); + } +//+------------------------------------------------------------------+ +//| Set tooltip of object | +//+------------------------------------------------------------------+ +bool CChartObject::Tooltip(const string new_text) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- tune + if(new_text=="") + return(ObjectSetString(m_chart_id,m_name,OBJPROP_TOOLTIP," ")); +//--- result + return(ObjectSetString(m_chart_id,m_name,OBJPROP_TOOLTIP,new_text)); + } +//+------------------------------------------------------------------+ +//| Get the "Timeframes" (visibility) flag | +//+------------------------------------------------------------------+ +int CChartObject::Timeframes(void) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- result + return((int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_TIMEFRAMES)); + } +//+------------------------------------------------------------------+ +//| Set the "Timeframes" (visibility) flag | +//+------------------------------------------------------------------+ +bool CChartObject::Timeframes(const int timeframes) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_TIMEFRAMES,timeframes)); + } +//+------------------------------------------------------------------+ +//| Get time of object creation | +//+------------------------------------------------------------------+ +datetime CChartObject::CreateTime(void) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- result + return((datetime)ObjectGetInteger(m_chart_id,m_name,OBJPROP_CREATETIME)); + } +//+------------------------------------------------------------------+ +//| Get number of levels of object | +//+------------------------------------------------------------------+ +int CChartObject::LevelsCount(void) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- result + return((int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_LEVELS)); + } +//+------------------------------------------------------------------+ +//| Set number of levels of object | +//+------------------------------------------------------------------+ +bool CChartObject::LevelsCount(const int new_count) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_LEVELS,new_count)); + } +//+------------------------------------------------------------------+ +//| Get color of the specified level of object | +//+------------------------------------------------------------------+ +color CChartObject::LevelColor(const int level) const + { +//--- check + if(m_chart_id==-1) + return(CLR_NONE); + if(level>=LevelsCount()) + return(CLR_NONE); +//--- result + return((color)ObjectGetInteger(m_chart_id,m_name,OBJPROP_LEVELCOLOR,level)); + } +//+------------------------------------------------------------------+ +//| Set color of the specified level of object | +//+------------------------------------------------------------------+ +bool CChartObject::LevelColor(const int level,const color new_color) const + { +//--- check + if(m_chart_id==-1) + return(false); + if(level>=LevelsCount()) + return(false); +//--- result + return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_LEVELCOLOR,level,new_color)); + } +//+------------------------------------------------------------------+ +//| Get line style of the specified level of object | +//+------------------------------------------------------------------+ +ENUM_LINE_STYLE CChartObject::LevelStyle(const int level) const + { +//--- check + if(m_chart_id==-1) + return(WRONG_VALUE); + if(level>=LevelsCount()) + return(WRONG_VALUE); +//--- result + return((ENUM_LINE_STYLE)ObjectGetInteger(m_chart_id,m_name,OBJPROP_LEVELSTYLE,level)); + } +//+------------------------------------------------------------------+ +//| Set line style of the specified level of object | +//+------------------------------------------------------------------+ +bool CChartObject::LevelStyle(const int level,const ENUM_LINE_STYLE new_style) const + { +//--- check + if(m_chart_id==-1) + return(false); + if(level>=LevelsCount()) + return(false); +//--- result + return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_LEVELSTYLE,level,new_style)); + } +//+------------------------------------------------------------------+ +//| Get line width of the specified level of object | +//+------------------------------------------------------------------+ +int CChartObject::LevelWidth(const int level) const + { +//--- check + if(m_chart_id==-1) + return(-1); + if(level>=LevelsCount()) + return(-1); +//--- result + return((int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_LEVELWIDTH,level)); + } +//+------------------------------------------------------------------+ +//| Set line width of the specified level of object | +//+------------------------------------------------------------------+ +bool CChartObject::LevelWidth(const int level,const int new_width) const + { +//--- check + if(m_chart_id==-1) + return(false); + if(level>=LevelsCount()) + return(false); +//--- result + return(ObjectSetInteger(m_chart_id,m_name,OBJPROP_LEVELWIDTH,level,new_width)); + } +//+------------------------------------------------------------------+ +//| Get value of the specified level of object | +//+------------------------------------------------------------------+ +double CChartObject::LevelValue(const int level) const + { +//--- check + if(m_chart_id==-1) + return(EMPTY_VALUE); + if(level>=LevelsCount()) + return(EMPTY_VALUE); +//--- result + return(ObjectGetDouble(m_chart_id,m_name,OBJPROP_LEVELVALUE,level)); + } +//+------------------------------------------------------------------+ +//| Set value of the specified level of object | +//+------------------------------------------------------------------+ +bool CChartObject::LevelValue(const int level,const double new_value) const + { +//--- check + if(m_chart_id==-1) + return(false); + if(level>=LevelsCount()) + return(false); +//--- result + return(ObjectSetDouble(m_chart_id,m_name,OBJPROP_LEVELVALUE,level,new_value)); + } +//+------------------------------------------------------------------+ +//| Get comment of of the specified level of object | +//+------------------------------------------------------------------+ +string CChartObject::LevelDescription(const int level) const + { +//--- check + if(m_chart_id==-1) + return(""); + if(level>=LevelsCount()) + return(""); +//--- result + return(ObjectGetString(m_chart_id,m_name,OBJPROP_LEVELTEXT,level)); + } +//+------------------------------------------------------------------+ +//| Set comment to the specified level of object | +//+------------------------------------------------------------------+ +bool CChartObject::LevelDescription(const int level,const string new_text) const + { +//--- checking + if(m_chart_id==-1) + return(false); + if(level>=LevelsCount()) + return(false); +//--- result + return(ObjectSetString(m_chart_id,m_name,OBJPROP_LEVELTEXT,level,new_text)); + } +//+------------------------------------------------------------------+ +//| Access function long ObjectGetInteger(...) | +//+------------------------------------------------------------------+ +long CChartObject::GetInteger(const ENUM_OBJECT_PROPERTY_INTEGER prop_id,const int modifier) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- + if(modifier==-1) + return(ObjectGetInteger(m_chart_id,m_name,prop_id)); +//--- result + return(ObjectGetInteger(m_chart_id,m_name,prop_id,modifier)); + } +//+------------------------------------------------------------------+ +//| Access function bool ObjectGetInteger(...) | +//+------------------------------------------------------------------+ +bool CChartObject::GetInteger(const ENUM_OBJECT_PROPERTY_INTEGER prop_id,const int modifier,long &value) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectGetInteger(m_chart_id,m_name,prop_id,modifier,value)); + } +//+------------------------------------------------------------------+ +//| Access function ObjectSetInteger(.,modifier,.) | +//+------------------------------------------------------------------+ +bool CChartObject::SetInteger(const ENUM_OBJECT_PROPERTY_INTEGER prop_id,const int modifier,const long value) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectSetInteger(m_chart_id,m_name,prop_id,modifier,value)); + } +//+------------------------------------------------------------------+ +//| Access function ObjectSetInteger(...) | +//+------------------------------------------------------------------+ +bool CChartObject::SetInteger(const ENUM_OBJECT_PROPERTY_INTEGER prop_id,const long value) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectSetInteger(m_chart_id,m_name,prop_id,value)); + } +//+------------------------------------------------------------------+ +//| Access function double ObjectGetDouble(...) | +//+------------------------------------------------------------------+ +double CChartObject::GetDouble(const ENUM_OBJECT_PROPERTY_DOUBLE prop_id,const int modifier) const + { +//--- check + if(m_chart_id==-1) + return(EMPTY_VALUE); +//--- + if(modifier==-1) + return(ObjectGetDouble(m_chart_id,m_name,prop_id)); +//--- result + return(ObjectGetDouble(m_chart_id,m_name,prop_id,modifier)); + } +//+------------------------------------------------------------------+ +//| Access function bool ObjectGetDouble(...) | +//+------------------------------------------------------------------+ +bool CChartObject::GetDouble(const ENUM_OBJECT_PROPERTY_DOUBLE prop_id,const int modifier,double &value) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectGetDouble(m_chart_id,m_name,prop_id,modifier,value)); + } +//+------------------------------------------------------------------+ +//| Access function ObjectSetDouble(.,modifier,.) | +//+------------------------------------------------------------------+ +bool CChartObject::SetDouble(const ENUM_OBJECT_PROPERTY_DOUBLE prop_id,const int modifier,const double value) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectSetDouble(m_chart_id,m_name,prop_id,modifier,value)); + } +//+------------------------------------------------------------------+ +//| Access function ObjectSetDouble(...) | +//+------------------------------------------------------------------+ +bool CChartObject::SetDouble(const ENUM_OBJECT_PROPERTY_DOUBLE prop_id,const double value) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectSetDouble(m_chart_id,m_name,prop_id,value)); + } +//+------------------------------------------------------------------+ +//| Access function string ObjectGetString (...) | +//+------------------------------------------------------------------+ +string CChartObject::GetString(const ENUM_OBJECT_PROPERTY_STRING prop_id,const int modifier) const + { +//--- check + if(m_chart_id==-1) + return(""); +//--- + if(modifier==-1) + return(ObjectGetString(m_chart_id,m_name,prop_id)); +//--- result + return(ObjectGetString(m_chart_id,m_name,prop_id,modifier)); + } +//+------------------------------------------------------------------+ +//| Access function bool ObjectGetString(...) | +//+------------------------------------------------------------------+ +bool CChartObject::GetString(const ENUM_OBJECT_PROPERTY_STRING prop_id,const int modifier,string &value) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectGetString(m_chart_id,m_name,prop_id,modifier,value)); + } +//+------------------------------------------------------------------+ +//| Access function ObjectSetString(.,modifier,.) | +//+------------------------------------------------------------------+ +bool CChartObject::SetString(const ENUM_OBJECT_PROPERTY_STRING prop_id,const int modifier,const string value) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectSetString(m_chart_id,m_name,prop_id,modifier,value)); + } +//+------------------------------------------------------------------+ +//| Access function ObjectSetString(...) | +//+------------------------------------------------------------------+ +bool CChartObject::SetString(const ENUM_OBJECT_PROPERTY_STRING prop_id,const string value) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ObjectSetString(m_chart_id,m_name,prop_id,value)); + } +//+------------------------------------------------------------------+ +//| Relative movement of object | +//+------------------------------------------------------------------+ +bool CChartObject::ShiftObject(const datetime d_time,const double d_price) const + { + bool result=true; + int i; +//--- check + if(m_chart_id==-1) + return(false); +//--- move + for(i=0;i=m_num_points) + return(false); +//--- move + datetime time=(datetime)ObjectGetInteger(m_chart_id,m_name,OBJPROP_TIME,point); + double price=ObjectGetDouble(m_chart_id,m_name,OBJPROP_PRICE,point); +//--- result + return(ObjectMove(m_chart_id,m_name,point,time+d_time,price+d_price)); + } +//+------------------------------------------------------------------+ +//| Writing object parameters to file | +//+------------------------------------------------------------------+ +bool CChartObject::Save(const int file_handle) + { + int i,len; + int levels; + string str; +//--- check + if(file_handle==INVALID_HANDLE || m_chart_id==-1) + return(false); +//--- write start marker - 0xFFFFFFFFFFFFFFFF + if(FileWriteLong(file_handle,-1)!=sizeof(long)) + return(false); +//--- write object type + if(FileWriteInteger(file_handle,Type(),INT_VALUE)!=INT_VALUE) + return(false); +//--- write object name + str=ObjectGetString(m_chart_id,m_name,OBJPROP_NAME); + len=StringLen(str); + if(FileWriteInteger(file_handle,len,INT_VALUE)!=INT_VALUE) + return(false); + if(len!=0) if(FileWriteString(file_handle,str,len)!=len) + return(false); +//--- write object color + if(FileWriteLong(file_handle,ObjectGetInteger(m_chart_id,m_name,OBJPROP_COLOR))!=sizeof(long)) + return(false); +//--- write object line style + if(FileWriteInteger(file_handle,(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_STYLE))!=sizeof(int)) + return(false); +//--- write object line width + if(FileWriteInteger(file_handle,(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_WIDTH))!=sizeof(int)) + return(false); +//--- write the property value "Background" + if(FileWriteInteger(file_handle,(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_BACK),CHAR_VALUE)!=sizeof(char)) + return(false); +//--- write the property value "Selectable" + if(FileWriteInteger(file_handle,(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_SELECTABLE),CHAR_VALUE)!=sizeof(char)) + return(false); +//--- write the property value "Timeframes" + if(FileWriteInteger(file_handle,(int)ObjectGetInteger(m_chart_id,m_name,OBJPROP_TIMEFRAMES),INT_VALUE)!=sizeof(int)) + return(false); +//--- write comment + str=ObjectGetString(m_chart_id,m_name,OBJPROP_TEXT); + len=StringLen(str); + if(FileWriteInteger(file_handle,len,INT_VALUE)!=INT_VALUE) + return(false); + if(len!=0) if(FileWriteString(file_handle,str,len)!=len) + return(false); +//--- write number of points + if(FileWriteInteger(file_handle,m_num_points,INT_VALUE)!=INT_VALUE) + return(false); +//--- write points + for(i=0;i +#include +#include +//+------------------------------------------------------------------+ +//| Class CChartObjectPanel. | +//| Purpose: Class for grouping objects for managing a chart | +//+------------------------------------------------------------------+ +class CChartObjectPanel : public CChartObjectButton + { +protected: + CArrayObj m_attachment; // array of attached objects + CArrayInt m_dX; // array of dX attached objects + CArrayInt m_dY; // array of dY attached objects + bool m_expanded; // collapsed/expanded flag + +public: + CChartObjectPanel(); + ~CChartObjectPanel(); + //--- method for attaching objects + bool Attach(CChartObjectLabel *chart_object); + bool X_Distance(const int X); + int X_Distance(void) const { return(CChartObjectButton::X_Distance()); } + bool Y_Distance(const int Y); + int Y_Distance(void) const { return(CChartObjectButton::Y_Distance()); } + int X_Size() const; + int X_Size(const int Y) const { return(CChartObjectButton::X_Size()); } + int Y_Size() const; + int Y_Size(const int Y) const { return(CChartObjectButton::Y_Size()); } + + int Timeframes(void) const { return(CChartObjectButton::Timeframes()); } + virtual bool Timeframes(const int timeframes); + bool State(const bool state); + bool State(void) const { return(CChartObjectButton::State()); } + bool CheckState(); + +protected: + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +void CChartObjectPanel::CChartObjectPanel(void) : m_expanded(true) + { + } +//+------------------------------------------------------------------+ +//| Destructor. | +//+------------------------------------------------------------------+ +void CChartObjectPanel::~CChartObjectPanel(void) + { +//--- All objects added by the method Add(), deleted automatically + } +//+------------------------------------------------------------------+ +//| Method Attach | +//+------------------------------------------------------------------+ +bool CChartObjectPanel::Attach(CChartObjectLabel *chart_object) + { + if(m_attachment.Add(chart_object)) + { + int x,y; + x=chart_object.X_Distance(); + m_dX.Add(chart_object.X_Distance()); + x+=X_Distance(); + chart_object.X_Distance(X_Distance()+chart_object.X_Distance()); + y=CChartObjectButton::Y_Size(); + y+=chart_object.Y_Distance(); + m_dY.Add(chart_object.Y_Distance()+CChartObjectButton::Y_Size()+2); + chart_object.Y_Distance(Y_Distance()+chart_object.Y_Distance()+CChartObjectButton::Y_Size()+2); + return(true); + } +//--- + return(false); + } +//+------------------------------------------------------------------+ +//| Method X_Distance | +//+------------------------------------------------------------------+ +bool CChartObjectPanel::X_Distance(const int X) + { + CChartObjectLabel *chart_object; +//--- + for(int i=0;i +//+------------------------------------------------------------------+ +//| Class CChart. | +//| Purpose: Class of the "Chart" object. | +//| Derives from class CObject. | +//+------------------------------------------------------------------+ +class CChart : public CObject + { +protected: + long m_chart_id; // chart identifier +public: + CChart(void); + ~CChart(void); + //--- methods of access to protected data + long ChartId(void) const { return(m_chart_id); } + //--- method of identifying the object + virtual int Type(void) const { return(0x1111); } + //--- methods of access to properties of the chart + //--- common properties + ENUM_CHART_MODE Mode(void) const; + bool Mode(const ENUM_CHART_MODE mode) const; + bool Foreground(void) const; + bool Foreground(const bool foreground) const; + bool Shift(void) const; + bool Shift(const bool shift) const; + double ShiftSize(void) const; + bool ShiftSize(double shift) const; + bool AutoScroll(void) const; + bool AutoScroll(const bool auto_scroll) const; + int Scale(void) const; + bool Scale(int scale) const; + bool ScaleFix(void) const; + bool ScaleFix(const bool scale_fix) const; + bool ScaleFix_11(void) const; + bool ScaleFix_11(const bool scale_fix_11) const; + double FixedMax(void) const; + bool FixedMax(const double fixed_max) const; + double FixedMin(void) const; + bool FixedMin(const double fixed_min) const; + bool ScalePPB(void) const; + bool ScalePPB(const bool scale_ppb) const; + double PointsPerBar(void) const; + bool PointsPerBar(const double points_per_bar) const; + //--- show properties + bool ShowOHLC(void) const; + bool ShowOHLC(const bool show) const; + bool ShowLineBid(void) const; + bool ShowLineBid(const bool show) const; + bool ShowLineAsk(void) const; + bool ShowLineAsk(const bool show) const; + bool ShowLastLine(void) const; + bool ShowLastLine(const bool show) const; + bool ShowPeriodSep(void) const; + bool ShowPeriodSep(const bool show) const; + bool ShowGrid(void) const; + bool ShowGrid(const bool show) const; + ENUM_CHART_VOLUME_MODE ShowVolumes(void) const; + bool ShowVolumes(const ENUM_CHART_VOLUME_MODE show) const; + bool ShowObjectDescr(void) const; + bool ShowObjectDescr(const bool show) const; + bool ShowDateScale(const bool show) const; + bool ShowPriceScale(const bool show) const; + //--- color properties + color ColorBackground(void) const; + bool ColorBackground(const color new_color) const; + color ColorForeground(void) const; + bool ColorForeground(const color new_color) const; + color ColorGrid(void) const; + bool ColorGrid(const color new_color) const; + color ColorBarUp(void) const; + bool ColorBarUp(const color new_color) const; + color ColorBarDown(void) const; + bool ColorBarDown(const color new_color) const; + color ColorCandleBull(void) const; + bool ColorCandleBull(const color new_color) const; + color ColorCandleBear(void) const; + bool ColorCandleBear(const color new_color) const; + color ColorChartLine(void) const; + bool ColorChartLine(const color new_color) const; + color ColorVolumes(void) const; + bool ColorVolumes(const color new_color) const; + color ColorLineBid(void) const; + bool ColorLineBid(const color new_color) const; + color ColorLineAsk(void) const; + bool ColorLineAsk(const color new_color) const; + color ColorLineLast(void) const; + bool ColorLineLast(const color new_color) const; + color ColorStopLevels(void) const; + bool ColorStopLevels(const color new_color) const; + //--- other properties + bool BringToTop(void) const; + bool EventObjectCreate(const bool flag=true) const; + bool EventObjectDelete(const bool flag=true) const; + bool EventMouseMove(const bool flag=true) const; + bool MouseScroll(const bool flag=true) const; + //--- methods of access to READ ONLY properties of the chart + int VisibleBars(void) const; + int WindowsTotal(void) const; + bool WindowIsVisible(const int num) const; + int WindowHandle(void) const; + int FirstVisibleBar(void) const; + int WidthInBars(void) const; + int WidthInPixels(void) const; + int HeightInPixels(const int num) const; + int SubwindowY(const int num) const; + double PriceMin(const int num) const; + double PriceMax(const int num) const; + bool IsObject(void) const; + //--- methods of binding chart + void Attach(void) { m_chart_id=ChartID(); } + void Attach(const long chart) { m_chart_id=chart; } + void FirstChart(void) { m_chart_id=ChartFirst(); } + void NextChart(void) { m_chart_id=ChartNext(m_chart_id); } + long Open(const string symbol_name,const ENUM_TIMEFRAMES timeframe); + void Detach(void) { m_chart_id=-1; } + void Close(void); + //--- navigation method + bool Navigate(const ENUM_CHART_POSITION position,const int shift=0) const; + //--- methods of access to the API functions of MQL5 + string Symbol(void) const { return(ChartSymbol(m_chart_id)); } + ENUM_TIMEFRAMES Period(void) const { return(ChartPeriod(m_chart_id)); } + void Redraw(void) const { ChartRedraw(m_chart_id); } + long GetInteger(const ENUM_CHART_PROPERTY_INTEGER prop_id,const int sub_window=0) const; + bool GetInteger(const ENUM_CHART_PROPERTY_INTEGER prop_id,const int sub_window,long &value) const; + bool SetInteger(const ENUM_CHART_PROPERTY_INTEGER prop_id,const long value) const; + double GetDouble(const ENUM_CHART_PROPERTY_DOUBLE prop_id,const int sub_window=0) const; + bool GetDouble(const ENUM_CHART_PROPERTY_DOUBLE prop_id,const int sub_window,double &value) const; + bool SetDouble(const ENUM_CHART_PROPERTY_DOUBLE prop_id,const double value) const; + string GetString(const ENUM_CHART_PROPERTY_STRING prop_id) const; + bool GetString(const ENUM_CHART_PROPERTY_STRING prop_id,string &value) const; + bool SetString(const ENUM_CHART_PROPERTY_STRING prop_id,const string value) const; + bool SetSymbolPeriod(const string symbol,const ENUM_TIMEFRAMES period) const; + bool ApplyTemplate(const string filename) const; + bool ScreenShot(const string filename,const int width,const int height, + const ENUM_ALIGN_MODE align_mode=ALIGN_RIGHT) const; + int WindowOnDropped(void) const; + double PriceOnDropped(void) const; + datetime TimeOnDropped(void) const; + int XOnDropped(void) const; + int YOnDropped(void) const; + //--- methods for working with indicators + bool IndicatorAdd(const int subwin,const int handle) const; + bool IndicatorDelete(const int subwin,const string name) const; + int IndicatorsTotal(const int subwin) const; + string IndicatorName(const int subwin,const int index) const; + //--- methods for working with files + virtual bool Save(const int file_handle); + virtual bool Load(const int file_handle); + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CChart::CChart(void) : m_chart_id(-1) + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CChart::~CChart(void) + { + if(m_chart_id!=-1) + Close(); + } +//+------------------------------------------------------------------+ +//| Opening chart | +//+------------------------------------------------------------------+ +long CChart::Open(const string symbol_name,const ENUM_TIMEFRAMES timeframe) + { + m_chart_id=ChartOpen(symbol_name,timeframe); + if(m_chart_id==0) + m_chart_id=-1; + return(m_chart_id); + } +//+------------------------------------------------------------------+ +//| Get the type of representation of chart | +//+------------------------------------------------------------------+ +ENUM_CHART_MODE CChart::Mode(void) const + { +//--- check + if(m_chart_id==-1) + return(WRONG_VALUE); +//--- result + return((ENUM_CHART_MODE)ChartGetInteger(m_chart_id,CHART_MODE)); + } +//+------------------------------------------------------------------+ +//| Set the type of representation chart | +//+------------------------------------------------------------------+ +bool CChart::Mode(const ENUM_CHART_MODE mode) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_MODE,mode)); + } +//+------------------------------------------------------------------+ +//| Get value of the "Foreground" property | +//+------------------------------------------------------------------+ +bool CChart::Foreground(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ChartGetInteger(m_chart_id,CHART_FOREGROUND)); + } +//+------------------------------------------------------------------+ +//| Set value of the "Foreground" property | +//+------------------------------------------------------------------+ +bool CChart::Foreground(const bool foreground) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_FOREGROUND,foreground)); + } +//+------------------------------------------------------------------+ +//| Get value of the "Shift" property | +//+------------------------------------------------------------------+ +bool CChart::Shift(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ChartGetInteger(m_chart_id,CHART_SHIFT)); + } +//+------------------------------------------------------------------+ +//| Set value of the "Shift"property | +//+------------------------------------------------------------------+ +bool CChart::Shift(const bool shift) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_SHIFT,shift)); + } +//+------------------------------------------------------------------+ +//| Get value of the "ShiftSize" property | +//+------------------------------------------------------------------+ +double CChart::ShiftSize(void) const + { +//--- check + if(m_chart_id==-1) + return(DBL_MAX); +//--- result + return(ChartGetDouble(m_chart_id,CHART_SHIFT_SIZE)); + } +//+------------------------------------------------------------------+ +//| Set value of the "ShiftSize" property | +//+------------------------------------------------------------------+ +bool CChart::ShiftSize(double shift) const + { +//--- check + if(m_chart_id==-1) + return(false); + if(shift<10) + shift=10; + if(shift>50) + shift=50; +//--- result + return(ChartSetDouble(m_chart_id,CHART_SHIFT_SIZE,shift)); + } +//+------------------------------------------------------------------+ +//| Get value of the "AutoScroll" property | +//+------------------------------------------------------------------+ +bool CChart::AutoScroll(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ChartGetInteger(m_chart_id,CHART_AUTOSCROLL)); + } +//+------------------------------------------------------------------+ +//| Set value of the "AutoScroll" property | +//+------------------------------------------------------------------+ +bool CChart::AutoScroll(const bool auto_scroll) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_AUTOSCROLL,auto_scroll)); + } +//+------------------------------------------------------------------+ +//| Get value of the "Scale" property | +//+------------------------------------------------------------------+ +int CChart::Scale(void) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- result + return((int)ChartGetInteger(m_chart_id,CHART_SCALE)); + } +//+------------------------------------------------------------------+ +//| Set value of the "Scale" property | +//+------------------------------------------------------------------+ +bool CChart::Scale(int shift) const + { +//--- check + if(m_chart_id==-1) + return(false); + if(shift<0) + shift=0; + if(shift>32) + shift=32; +//--- result + return(ChartSetInteger(m_chart_id,CHART_SCALE,shift)); + } +//+------------------------------------------------------------------+ +//| Get value of the "ScaleFix" property | +//+------------------------------------------------------------------+ +bool CChart::ScaleFix(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ChartGetInteger(m_chart_id,CHART_SCALEFIX)); + } +//+------------------------------------------------------------------+ +//| Set value of the "ScaleFix" property | +//+------------------------------------------------------------------+ +bool CChart::ScaleFix(const bool scale_fix) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_SCALEFIX,scale_fix)); + } +//+------------------------------------------------------------------+ +//| Get value of the "ScaleFix_11" property | +//+------------------------------------------------------------------+ +bool CChart::ScaleFix_11(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ChartGetInteger(m_chart_id,CHART_SCALEFIX_11)); + } +//+------------------------------------------------------------------+ +//| Set value of the "ScaleFix_11" property | +//+------------------------------------------------------------------+ +bool CChart::ScaleFix_11(const bool scale_fix_11) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_SCALEFIX_11,scale_fix_11)); + } +//+------------------------------------------------------------------+ +//| Get value of the "FixedMax" property | +//+------------------------------------------------------------------+ +double CChart::FixedMax(void) const + { +//--- check + if(m_chart_id==-1) + return(EMPTY_VALUE); +//--- result + return(ChartGetDouble(m_chart_id,CHART_FIXED_MAX)); + } +//+------------------------------------------------------------------+ +//| Set value of the "FixedMax" property | +//+------------------------------------------------------------------+ +bool CChart::FixedMax(const double fixed_max) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetDouble(m_chart_id,CHART_FIXED_MAX,fixed_max)); + } +//+------------------------------------------------------------------+ +//| Get value of the "FixedMin" property | +//+------------------------------------------------------------------+ +double CChart::FixedMin(void) const + { +//--- check + if(m_chart_id==-1) + return(EMPTY_VALUE); +//--- result + return(ChartGetDouble(m_chart_id,CHART_FIXED_MIN)); + } +//+------------------------------------------------------------------+ +//| Set value of the "FixedMin" property | +//+------------------------------------------------------------------+ +bool CChart::FixedMin(const double fixed_min) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetDouble(m_chart_id,CHART_FIXED_MIN,fixed_min)); + } +//+------------------------------------------------------------------+ +//| Get value of the "ScalePointsPerBar" property | +//+------------------------------------------------------------------+ +bool CChart::ScalePPB(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ChartGetInteger(m_chart_id,CHART_SCALE_PT_PER_BAR)); + } +//+------------------------------------------------------------------+ +//| Set value of the "ScalePointsPerBar" property | +//+------------------------------------------------------------------+ +bool CChart::ScalePPB(const bool scale_ppb) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_SCALE_PT_PER_BAR,scale_ppb)); + } +//+------------------------------------------------------------------+ +//| Get value of the "PointsPerBar" property | +//+------------------------------------------------------------------+ +double CChart::PointsPerBar(void) const + { +//--- check + if(m_chart_id==-1) + return(EMPTY_VALUE); +//--- result + return(ChartGetDouble(m_chart_id,CHART_POINTS_PER_BAR)); + } +//+------------------------------------------------------------------+ +//| Set value of the "PointsPerBar" property | +//+------------------------------------------------------------------+ +bool CChart::PointsPerBar(const double points_per_bar) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetDouble(m_chart_id,CHART_POINTS_PER_BAR,points_per_bar)); + } +//+------------------------------------------------------------------+ +//| Get value of the "ShowOHLC" property | +//+------------------------------------------------------------------+ +bool CChart::ShowOHLC(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ChartGetInteger(m_chart_id,CHART_SHOW_OHLC)); + } +//+------------------------------------------------------------------+ +//| Set value of the "ShowOHLC" property | +//+------------------------------------------------------------------+ +bool CChart::ShowOHLC(const bool show) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_SHOW_OHLC,show)); + } +//+------------------------------------------------------------------+ +//| Get value of the "ShowLineBid" property | +//+------------------------------------------------------------------+ +bool CChart::ShowLineBid(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ChartGetInteger(m_chart_id,CHART_SHOW_BID_LINE)); + } +//+------------------------------------------------------------------+ +//| Set value of the "ShowLineBid" property | +//+------------------------------------------------------------------+ +bool CChart::ShowLineBid(const bool show) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_SHOW_BID_LINE,show)); + } +//+------------------------------------------------------------------+ +//| Get value of the "ShowLineAsk" property | +//+------------------------------------------------------------------+ +bool CChart::ShowLineAsk(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ChartGetInteger(m_chart_id,CHART_SHOW_ASK_LINE)); + } +//+------------------------------------------------------------------+ +//| Set value of the "ShowLineAsk" property | +//+------------------------------------------------------------------+ +bool CChart::ShowLineAsk(const bool show) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_SHOW_ASK_LINE,show)); + } +//+------------------------------------------------------------------+ +//| Get value of the "ShowLastLine" property | +//+------------------------------------------------------------------+ +bool CChart::ShowLastLine(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ChartGetInteger(m_chart_id,CHART_SHOW_LAST_LINE)); + } +//+------------------------------------------------------------------+ +//| Set value of the "ShowLastLine" property | +//+------------------------------------------------------------------+ +bool CChart::ShowLastLine(const bool show) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_SHOW_LAST_LINE,show)); + } +//+------------------------------------------------------------------+ +//| Get value of the "ShowPeriodSep" property | +//+------------------------------------------------------------------+ +bool CChart::ShowPeriodSep(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ChartGetInteger(m_chart_id,CHART_SHOW_PERIOD_SEP)); + } +//+------------------------------------------------------------------+ +//| Set value of the "ShowPeriodSep" property | +//+------------------------------------------------------------------+ +bool CChart::ShowPeriodSep(const bool show) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_SHOW_PERIOD_SEP,show)); + } +//+------------------------------------------------------------------+ +//| Get value of the "ShowGrid" property | +//+------------------------------------------------------------------+ +bool CChart::ShowGrid(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ChartGetInteger(m_chart_id,CHART_SHOW_GRID)); + } +//+------------------------------------------------------------------+ +//| Set value of the "ShowGrid" property | +//+------------------------------------------------------------------+ +bool CChart::ShowGrid(const bool show) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_SHOW_GRID,show)); + } +//+------------------------------------------------------------------+ +//| Get value of the "ShowVolumes" property | +//+------------------------------------------------------------------+ +ENUM_CHART_VOLUME_MODE CChart::ShowVolumes(void) const + { +//--- check + if(m_chart_id==-1) + return(WRONG_VALUE); +//--- result + return((ENUM_CHART_VOLUME_MODE)ChartGetInteger(m_chart_id,CHART_SHOW_VOLUMES)); + } +//+------------------------------------------------------------------+ +//| Set value of the "ShowVolumes" property | +//+------------------------------------------------------------------+ +bool CChart::ShowVolumes(const ENUM_CHART_VOLUME_MODE show) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_SHOW_VOLUMES,show)); + } +//+------------------------------------------------------------------+ +//| Get value of the "ShowObjectDescr" property | +//+------------------------------------------------------------------+ +bool CChart::ShowObjectDescr(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ChartGetInteger(m_chart_id,CHART_SHOW_OBJECT_DESCR)); + } +//+------------------------------------------------------------------+ +//| Set value of the "ShowObjectDescr" property | +//+------------------------------------------------------------------+ +bool CChart::ShowObjectDescr(const bool show) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_SHOW_OBJECT_DESCR,show)); + } +//+------------------------------------------------------------------+ +//| Set value of the "ShowDateScale" property | +//+------------------------------------------------------------------+ +bool CChart::ShowDateScale(const bool show) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_SHOW_DATE_SCALE,show)); + } +//+------------------------------------------------------------------+ +//| Set value of the "ShowPriceScale" property | +//+------------------------------------------------------------------+ +bool CChart::ShowPriceScale(const bool show) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_SHOW_PRICE_SCALE,show)); + } +//+------------------------------------------------------------------+ +//| Get color value of the "Background" property | +//+------------------------------------------------------------------+ +color CChart::ColorBackground(void) const + { +//--- check + if(m_chart_id==-1) + return(CLR_NONE); +//--- result + return((color)ChartGetInteger(m_chart_id,CHART_COLOR_BACKGROUND)); + } +//+------------------------------------------------------------------+ +//| Set color value of the "Background" property | +//+------------------------------------------------------------------+ +bool CChart::ColorBackground(const color new_color) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_COLOR_BACKGROUND,new_color)); + } +//+------------------------------------------------------------------+ +//| Get color value of the "Foreground" property | +//+------------------------------------------------------------------+ +color CChart::ColorForeground(void) const + { +//--- check + if(m_chart_id==-1) + return(CLR_NONE); +//--- result + return((color)ChartGetInteger(m_chart_id,CHART_COLOR_FOREGROUND)); + } +//+------------------------------------------------------------------+ +//| Set color value for the "Foreground" property | +//+------------------------------------------------------------------+ +bool CChart::ColorForeground(const color new_color) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_COLOR_FOREGROUND,new_color)); + } +//+------------------------------------------------------------------+ +//| Get color value of the "Grid" property | +//+------------------------------------------------------------------+ +color CChart::ColorGrid(void) const + { +//--- check + if(m_chart_id==-1) + return(CLR_NONE); +//--- result + return((color)ChartGetInteger(m_chart_id,CHART_COLOR_GRID)); + } +//+------------------------------------------------------------------+ +//| Set color value for the "Grid" property | +//+------------------------------------------------------------------+ +bool CChart::ColorGrid(const color new_color) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_COLOR_GRID,new_color)); + } +//+------------------------------------------------------------------+ +//| Get color value of the "Bar Up" property | +//+------------------------------------------------------------------+ +color CChart::ColorBarUp(void) const + { +//--- check + if(m_chart_id==-1) + return(CLR_NONE); +//--- result + return((color)ChartGetInteger(m_chart_id,CHART_COLOR_CHART_UP)); + } +//+------------------------------------------------------------------+ +//| Set color value of the "Bar Up" property | +//+------------------------------------------------------------------+ +bool CChart::ColorBarUp(const color new_color) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_COLOR_CHART_UP,new_color)); + } +//+------------------------------------------------------------------+ +//| Get color value of the "Bar Down" property | +//+------------------------------------------------------------------+ +color CChart::ColorBarDown(void) const + { +//--- check + if(m_chart_id==-1) + return(CLR_NONE); +//--- result + return((color)ChartGetInteger(m_chart_id,CHART_COLOR_CHART_DOWN)); + } +//+------------------------------------------------------------------+ +//| Set color value of the "Bar Down" property | +//+------------------------------------------------------------------+ +bool CChart::ColorBarDown(const color new_color) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_COLOR_CHART_DOWN,new_color)); + } +//+------------------------------------------------------------------+ +//| Get color value of the "Candle Bull" property | +//+------------------------------------------------------------------+ +color CChart::ColorCandleBull(void) const + { +//--- check + if(m_chart_id==-1) + return(CLR_NONE); +//--- result + return((color)ChartGetInteger(m_chart_id,CHART_COLOR_CANDLE_BULL)); + } +//+------------------------------------------------------------------+ +//| Set color value of the "Candle Bull" property | +//+------------------------------------------------------------------+ +bool CChart::ColorCandleBull(const color new_color) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_COLOR_CANDLE_BULL,new_color)); + } +//+------------------------------------------------------------------+ +//| Get color value of the "Candle Bear" property | +//+------------------------------------------------------------------+ +color CChart::ColorCandleBear(void) const + { +//--- check + if(m_chart_id==-1) + return(CLR_NONE); +//--- result + return((color)ChartGetInteger(m_chart_id,CHART_COLOR_CANDLE_BEAR)); + } +//+------------------------------------------------------------------+ +//| Set color value of the "Candle Bear" property | +//+------------------------------------------------------------------+ +bool CChart::ColorCandleBear(const color new_color) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_COLOR_CANDLE_BEAR,new_color)); + } +//+------------------------------------------------------------------+ +//| Get color value of the "Chart Line" property | +//+------------------------------------------------------------------+ +color CChart::ColorChartLine(void) const + { +//--- check + if(m_chart_id==-1) + return(CLR_NONE); +//--- result + return((color)ChartGetInteger(m_chart_id,CHART_COLOR_CHART_LINE)); + } +//+------------------------------------------------------------------+ +//| Set color value of the "Chart Line" property | +//+------------------------------------------------------------------+ +bool CChart::ColorChartLine(const color new_color) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_COLOR_CHART_LINE,new_color)); + } +//+------------------------------------------------------------------+ +//| Get color value of the "Volumes" property | +//+------------------------------------------------------------------+ +color CChart::ColorVolumes(void) const + { +//--- check + if(m_chart_id==-1) + return(CLR_NONE); +//--- result + return((color)ChartGetInteger(m_chart_id,CHART_COLOR_VOLUME)); + } +//+------------------------------------------------------------------+ +//| Set color value of the "Volumes" property | +//+------------------------------------------------------------------+ +bool CChart::ColorVolumes(const color new_color) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_COLOR_VOLUME,new_color)); + } +//+------------------------------------------------------------------+ +//| Get color value of the "Line Bid" property | +//+------------------------------------------------------------------+ +color CChart::ColorLineBid(void) const + { +//--- check + if(m_chart_id==-1) + return(CLR_NONE); +//--- result + return((color)ChartGetInteger(m_chart_id,CHART_COLOR_BID)); + } +//+------------------------------------------------------------------+ +//| Set color value of the "Line Bid" property | +//+------------------------------------------------------------------+ +bool CChart::ColorLineBid(const color new_color) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_COLOR_BID,new_color)); + } +//+------------------------------------------------------------------+ +//| Get color value of the "Line Ask" property | +//+------------------------------------------------------------------+ +color CChart::ColorLineAsk(void) const + { +//--- check + if(m_chart_id==-1) + return(CLR_NONE); +//--- result + return((color)ChartGetInteger(m_chart_id,CHART_COLOR_ASK)); + } +//+------------------------------------------------------------------+ +//| Set color value of the "Line Ask" property | +//+------------------------------------------------------------------+ +bool CChart::ColorLineAsk(const color new_color) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_COLOR_ASK,new_color)); + } +//+------------------------------------------------------------------+ +//| Get color value of the "Line Last" property | +//+------------------------------------------------------------------+ +color CChart::ColorLineLast(void) const + { +//--- check + if(m_chart_id==-1) + return(CLR_NONE); +//--- result + return((color)ChartGetInteger(m_chart_id,CHART_COLOR_LAST)); + } +//+------------------------------------------------------------------+ +//| Set color value of the "Line Last" property | +//+------------------------------------------------------------------+ +bool CChart::ColorLineLast(const color new_color) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_COLOR_LAST,new_color)); + } +//+------------------------------------------------------------------+ +//| Get color value of the "Stop Levels" property | +//+------------------------------------------------------------------+ +color CChart::ColorStopLevels(void) const + { +//--- check + if(m_chart_id==-1) + return(CLR_NONE); +//--- result + return((color)ChartGetInteger(m_chart_id,CHART_COLOR_STOP_LEVEL)); + } +//+------------------------------------------------------------------+ +//| Set color value of the "Stop Levels" property | +//+------------------------------------------------------------------+ +bool CChart::ColorStopLevels(const color new_color) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_COLOR_STOP_LEVEL,new_color)); + } +//+------------------------------------------------------------------+ +//| Shows chart always on top | +//+------------------------------------------------------------------+ +bool CChart::BringToTop(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_BRING_TO_TOP,true)); + } +//+------------------------------------------------------------------+ +//| Sets flag to generate event of creating objects | +//+------------------------------------------------------------------+ +bool CChart::EventObjectCreate(const bool flag) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_EVENT_OBJECT_CREATE,flag)); + } +//+------------------------------------------------------------------+ +//| Sets flag to generate event of deleting objects | +//+------------------------------------------------------------------+ +bool CChart::EventObjectDelete(const bool flag) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_EVENT_OBJECT_DELETE,flag)); + } +//+------------------------------------------------------------------+ +//| Sets flag to generate event of moving mouse cursor | +//+------------------------------------------------------------------+ +bool CChart::EventMouseMove(const bool flag) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_EVENT_MOUSE_MOVE,flag)); + } +//+------------------------------------------------------------------+ +//| Sets flag to mouse scrolling | +//+------------------------------------------------------------------+ +bool CChart::MouseScroll(const bool flag) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetInteger(m_chart_id,CHART_MOUSE_SCROLL,flag)); + } +//+------------------------------------------------------------------+ +//| Get value of the "VisibleBars" property | +//+------------------------------------------------------------------+ +int CChart::VisibleBars(void) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- result + return((int)ChartGetInteger(m_chart_id,CHART_WIDTH_IN_BARS)); + } +//+------------------------------------------------------------------+ +//| Get value of the "WindowsTotal" property | +//+------------------------------------------------------------------+ +int CChart::WindowsTotal(void) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- result + return((int)ChartGetInteger(m_chart_id,CHART_WINDOWS_TOTAL)); + } +//+------------------------------------------------------------------+ +//| Get value of the "WindowIsVisible" property | +//+------------------------------------------------------------------+ +bool CChart::WindowIsVisible(const int num) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ChartGetInteger(m_chart_id,CHART_WINDOW_IS_VISIBLE,num)); + } +//+------------------------------------------------------------------+ +//| Get value of the "WindowHandle" property | +//+------------------------------------------------------------------+ +int CChart::WindowHandle(void) const + { +//--- check + if(m_chart_id==-1) + return(INVALID_HANDLE); +//--- result + return((int)ChartGetInteger(m_chart_id,CHART_WINDOW_HANDLE)); + } +//+------------------------------------------------------------------+ +//| Get value of the "FirstVisibleBar" property | +//+------------------------------------------------------------------+ +int CChart::FirstVisibleBar(void) const + { +//--- check + if(m_chart_id==-1) + return(-1); +//--- result + return((int)ChartGetInteger(m_chart_id,CHART_FIRST_VISIBLE_BAR)); + } +//+------------------------------------------------------------------+ +//| Get value of the "WidthInBars" property | +//+------------------------------------------------------------------+ +int CChart::WidthInBars(void) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- result + return((int)ChartGetInteger(m_chart_id,CHART_WIDTH_IN_BARS)); + } +//+------------------------------------------------------------------+ +//| Get value of the "WidthInPixels" property | +//+------------------------------------------------------------------+ +int CChart::WidthInPixels(void) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- result + return((int)ChartGetInteger(m_chart_id,CHART_WIDTH_IN_PIXELS)); + } +//+------------------------------------------------------------------+ +//| Get value of the "HeightInPixels" property | +//+------------------------------------------------------------------+ +int CChart::HeightInPixels(const int num) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- result + return((int)ChartGetInteger(m_chart_id,CHART_HEIGHT_IN_PIXELS,num)); + } +//+------------------------------------------------------------------+ +//| Get value of the "WindowYDistance" property | +//+------------------------------------------------------------------+ +int CChart::SubwindowY(const int num) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- result + return((int)ChartGetInteger(m_chart_id,CHART_WINDOW_YDISTANCE,num)); + } +//+------------------------------------------------------------------+ +//| Get value of the "PriceMin" property | +//+------------------------------------------------------------------+ +double CChart::PriceMin(const int num) const + { +//--- check + if(m_chart_id==-1) + return(EMPTY_VALUE); +//--- result + return(ChartGetDouble(m_chart_id,CHART_PRICE_MIN,num)); + } +//+------------------------------------------------------------------+ +//| Get value of the "PriceMax" property | +//+------------------------------------------------------------------+ +double CChart::PriceMax(const int num) const + { +//--- check + if(m_chart_id==-1) + return(EMPTY_VALUE); +//--- result + return(ChartGetDouble(m_chart_id,CHART_PRICE_MAX,num)); + } +//+------------------------------------------------------------------+ +//| Get value of the "IsObject" property | +//+------------------------------------------------------------------+ +bool CChart::IsObject(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return((bool)ChartGetInteger(m_chart_id,CHART_IS_OBJECT)); + } +//+------------------------------------------------------------------+ +//| Chart close | +//+------------------------------------------------------------------+ +void CChart::Close(void) + { + if(m_chart_id!=-1) + { + ChartClose(m_chart_id); + m_chart_id=-1; + } + } +//+------------------------------------------------------------------+ +//| Chart navigation | +//+------------------------------------------------------------------+ +bool CChart::Navigate(const ENUM_CHART_POSITION position,const int shift) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartNavigate(m_chart_id,position,shift)); + } +//+------------------------------------------------------------------+ +//| Access functions long ChartGetInteger(...) | +//+------------------------------------------------------------------+ +long CChart::GetInteger(const ENUM_CHART_PROPERTY_INTEGER prop_id,const int subwindow) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- result + return(ChartGetInteger(m_chart_id,prop_id,subwindow)); + } +//+------------------------------------------------------------------+ +//| Access function bool ChartGetInteger(...) | +//+------------------------------------------------------------------+ +bool CChart::GetInteger(const ENUM_CHART_PROPERTY_INTEGER prop_id,const int subwindow,long &value) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartGetInteger(m_chart_id,prop_id,subwindow,value)); + } +//+------------------------------------------------------------------+ +//| Access function ChartSetInteger(...) | +//+------------------------------------------------------------------+ +bool CChart::SetInteger(const ENUM_CHART_PROPERTY_INTEGER prop_id,const long value) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- + return(ChartSetInteger(m_chart_id,prop_id,value)); + } +//+------------------------------------------------------------------+ +//| Access function double ChartGetDouble(...) | +//+------------------------------------------------------------------+ +double CChart::GetDouble(const ENUM_CHART_PROPERTY_DOUBLE prop_id,const int subwindow) const + { +//--- check + if(m_chart_id==-1) + return(EMPTY_VALUE); +//--- result + return(ChartGetDouble(m_chart_id,prop_id,subwindow)); + } +//+------------------------------------------------------------------+ +//| Access function bool ChartGetDouble(...) | +//+------------------------------------------------------------------+ +bool CChart::GetDouble(const ENUM_CHART_PROPERTY_DOUBLE prop_id,const int subwindow,double &value) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartGetDouble(m_chart_id,prop_id,subwindow,value)); + } +//+------------------------------------------------------------------+ +//| Access function ChartSetDouble(...) | +//+------------------------------------------------------------------+ +bool CChart::SetDouble(const ENUM_CHART_PROPERTY_DOUBLE prop_id,const double value) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetDouble(m_chart_id,prop_id,value)); + } +//+------------------------------------------------------------------+ +//| Access function string ChartGetString(...) | +//+------------------------------------------------------------------+ +string CChart::GetString(const ENUM_CHART_PROPERTY_STRING prop_id) const + { +//--- check + if(m_chart_id==-1) + return(""); +//--- result + return(ChartGetString(m_chart_id,prop_id)); + } +//+------------------------------------------------------------------+ +//| Access functions bool ChartGetString(...) | +//+------------------------------------------------------------------+ +bool CChart::GetString(const ENUM_CHART_PROPERTY_STRING prop_id,string &value) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartGetString(m_chart_id,prop_id,value)); + } +//+------------------------------------------------------------------+ +//| Access function ChartSetString(...) | +//+------------------------------------------------------------------+ +bool CChart::SetString(const ENUM_CHART_PROPERTY_STRING prop_id,const string value) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetString(m_chart_id,prop_id,value)); + } +//+------------------------------------------------------------------+ +//| Access function ChartSetSymbolPeriod(...) | +//+------------------------------------------------------------------+ +bool CChart::SetSymbolPeriod(const string symbol,const ENUM_TIMEFRAMES period) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartSetSymbolPeriod(m_chart_id,symbol,period)); + } +//+------------------------------------------------------------------+ +//| Access function ChartApplyTemplate(...) | +//+------------------------------------------------------------------+ +bool CChart::ApplyTemplate(const string filename) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartApplyTemplate(m_chart_id,filename)); + } +//+------------------------------------------------------------------+ +//| Access function ChartScreenShot(...) | +//+------------------------------------------------------------------+ +bool CChart::ScreenShot(const string filename,const int width,const int height,const ENUM_ALIGN_MODE align_mode) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartScreenShot(m_chart_id,filename,width,height,align_mode)); + } +//+------------------------------------------------------------------+ +//| Access function WindowOnDropped() | +//+------------------------------------------------------------------+ +int CChart::WindowOnDropped(void) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- result + return(ChartWindowOnDropped()); + } +//+------------------------------------------------------------------+ +//| Access function PriceOnDropped() | +//+------------------------------------------------------------------+ +double CChart::PriceOnDropped(void) const + { +//--- check + if(m_chart_id==-1) + return(EMPTY_VALUE); +//--- result + return(ChartPriceOnDropped()); + } +//+------------------------------------------------------------------+ +//| Access function TimeOnDropped() | +//+------------------------------------------------------------------+ +datetime CChart::TimeOnDropped(void) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartTimeOnDropped()); + } +//+------------------------------------------------------------------+ +//| Access functions XOnDropped() | +//+------------------------------------------------------------------+ +int CChart::XOnDropped(void) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- result + return(ChartXOnDropped()); + } +//+------------------------------------------------------------------+ +//| Access functions YOnDropped() | +//+------------------------------------------------------------------+ +int CChart::YOnDropped(void) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- result + return(ChartYOnDropped()); + } +//+------------------------------------------------------------------+ +//| Adds indicator to chart | +//+------------------------------------------------------------------+ +bool CChart::IndicatorAdd(const int subwin,const int handle) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartIndicatorAdd(m_chart_id,subwin,handle)); + } +//+------------------------------------------------------------------+ +//| Deletes indicator from chart | +//+------------------------------------------------------------------+ +bool CChart::IndicatorDelete(const int subwin,const string name) const + { +//--- check + if(m_chart_id==-1) + return(false); +//--- result + return(ChartIndicatorDelete(m_chart_id,subwin,name)); + } +//+------------------------------------------------------------------+ +//| Gets number of indicators in chart subwindow | +//+------------------------------------------------------------------+ +int CChart::IndicatorsTotal(const int subwin) const + { +//--- check + if(m_chart_id==-1) + return(0); +//--- result + return(ChartIndicatorsTotal(m_chart_id,subwin)); + } +//+------------------------------------------------------------------+ +//| Gets short name of indicator | +//+------------------------------------------------------------------+ +string CChart::IndicatorName(const int subwin,const int index) const + { +//--- check + if(m_chart_id==-1) + return(""); +//--- result + return(ChartIndicatorName(m_chart_id,subwin,index)); + } +//+------------------------------------------------------------------+ +//| Writing parameters of chart to file | +//+------------------------------------------------------------------+ +bool CChart::Save(const int file_handle) + { + string work_str; + int work_int; +//--- check + if(file_handle==INVALID_HANDLE || m_chart_id==-1) + return(false); +//--- write start marker - 0xFFFFFFFFFFFFFFFF + if(FileWriteLong(file_handle,-1)!=sizeof(long)) + return(false); +//--- write chart type + if(FileWriteInteger(file_handle,Type(),INT_VALUE)!=INT_VALUE) + return(false); +//--- write chart symbol + work_str=Symbol(); + work_int=StringLen(work_str); + if(FileWriteInteger(file_handle,work_int,INT_VALUE)!=INT_VALUE) + return(false); + if(work_int!=0) if(FileWriteString(file_handle,work_str,work_int)!=work_int) + return(false); +//--- write period of chart + if(FileWriteInteger(file_handle,Period(),INT_VALUE)!=sizeof(int)) + return(false); +//--- write value of the "Mode" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_MODE),INT_VALUE)!=sizeof(int)) + return(false); +//--- write value of the "Foreground" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_FOREGROUND),CHAR_VALUE)!=sizeof(char)) + return(false); +//--- write value of the "Shift" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_SHIFT),CHAR_VALUE)!=sizeof(char)) + return(false); +//--- write value of the "ShiftSize" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_SHIFT),INT_VALUE)!=sizeof(int)) + return(false); +//--- write value of the "AutoScroll" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_AUTOSCROLL),CHAR_VALUE)!=sizeof(char)) + return(false); +//--- write value of the "Scale" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_SCALE),INT_VALUE)!=sizeof(int)) + return(false); +//--- write value of the "ScaleFix" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_SCALEFIX),CHAR_VALUE)!=sizeof(char)) + return(false); +//--- write value of the "ScaleFix_11" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_SCALEFIX_11),CHAR_VALUE)!=sizeof(char)) + return(false); +//--- write value of the "FixedMax" property + if(FileWriteDouble(file_handle,ChartGetDouble(m_chart_id,CHART_FIXED_MAX))!=sizeof(double)) + return(false); +//--- write value of the "FixedMin" property + if(FileWriteDouble(file_handle,ChartGetDouble(m_chart_id,CHART_FIXED_MIN))!=sizeof(double)) + return(false); +//--- write the "ScalePPB" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_SCALE_PT_PER_BAR),CHAR_VALUE)!=sizeof(char)) + return(false); +//--- write value of the "PointsPerBar" property + if(FileWriteDouble(file_handle,ChartGetDouble(m_chart_id,CHART_POINTS_PER_BAR))!=sizeof(double)) + return(false); +//--- write value of the "ShowOHLC" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_SHOW_OHLC),CHAR_VALUE)!=sizeof(char)) + return(false); +//--- write value of the "ShowLineBid" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_SHOW_BID_LINE),CHAR_VALUE)!=sizeof(char)) + return(false); +//--- write value of the "ShowLineAsk" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_SHOW_ASK_LINE),CHAR_VALUE)!=sizeof(char)) + return(false); +//--- write value of the "ShowLastLine" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_SHOW_LAST_LINE),CHAR_VALUE)!=sizeof(char)) + return(false); +//--- write value of the "ShowPeriodSep" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_SHOW_PERIOD_SEP),CHAR_VALUE)!=sizeof(char)) + return(false); +//--- write value of the "ShowGrid" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_SHOW_GRID),CHAR_VALUE)!=sizeof(char)) + return(false); +//--- write value of the "ShowVolumes" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_SHOW_VOLUMES),INT_VALUE)!=sizeof(int)) + return(false); +//--- write value of the "ShowObjectDescr" property + if(FileWriteInteger(file_handle,(int)ChartGetInteger(m_chart_id,CHART_SHOW_OBJECT_DESCR),CHAR_VALUE)!=sizeof(char)) + return(false); +//--- successful + return(true); + } +//+------------------------------------------------------------------+ +//| Reading parameters of chart from file | +//+------------------------------------------------------------------+ +bool CChart::Load(const int file_handle) + { + bool resutl=true; + string work_str; + int work_int; +//--- check + if(file_handle==INVALID_HANDLE || m_chart_id==-1) + return(false); +//--- read and checking start marker - 0xFFFFFFFFFFFFFFFF + if(FileReadLong(file_handle)!=-1) return(false); +//--- read and checking chart type + if(FileReadInteger(file_handle,INT_VALUE)!=Type()) return(false); +//--- read chart symbol + work_int=FileReadInteger(file_handle); + if(work_int!=0) work_str=FileReadString(file_handle,work_int); + else work_str=""; +//--- read chart period + work_int=FileReadInteger(file_handle); + SetSymbolPeriod(work_str,(ENUM_TIMEFRAMES)work_int); +//--- read value of the "Mode" property + if(!ChartSetInteger(m_chart_id,CHART_MODE,FileReadInteger(file_handle,INT_VALUE))) + return(false); +//--- read value of the "Foreground" property + if(!ChartSetInteger(m_chart_id,CHART_FOREGROUND,FileReadInteger(file_handle,CHAR_VALUE))) + return(false); +//--- read value of the "Shift" property + if(!ChartSetInteger(m_chart_id,CHART_SHIFT,FileReadInteger(file_handle,CHAR_VALUE))) + return(false); +//--- read value of the "ShiftSize" property + if(!ChartSetInteger(m_chart_id,CHART_SHIFT,FileReadInteger(file_handle,INT_VALUE))) + return(false); +//--- read value of the "AutoScroll" property + if(!ChartSetInteger(m_chart_id,CHART_AUTOSCROLL,FileReadInteger(file_handle,CHAR_VALUE))) + return(false); +//--- read value of the "Scale" property + if(!ChartSetInteger(m_chart_id,CHART_SCALE,FileReadInteger(file_handle,INT_VALUE))) + return(false); +//--- read value of the "ScaleFix" property + if(!ChartSetInteger(m_chart_id,CHART_SCALEFIX,FileReadInteger(file_handle,CHAR_VALUE))) + return(false); +//--- read value of the "ScaleFix_11" property + if(!ChartSetInteger(m_chart_id,CHART_SCALEFIX_11,FileReadInteger(file_handle,CHAR_VALUE))) + return(false); +//--- read value of the "FixedMax" property + if(!ChartSetDouble(m_chart_id,CHART_FIXED_MAX,FileReadDatetime(file_handle))) + return(false); +//--- read value of the "FixedMin" property + if(!ChartSetDouble(m_chart_id,CHART_FIXED_MIN,FileReadDatetime(file_handle))) + return(false); +//--- read value of the "ScalePPB" property + if(!ChartSetInteger(m_chart_id,CHART_SCALE_PT_PER_BAR,FileReadInteger(file_handle,CHAR_VALUE))) + return(false); +//--- read value of the "PointsPerBar" property + if(!ChartSetDouble(m_chart_id,CHART_POINTS_PER_BAR,FileReadDatetime(file_handle))) + return(false); +//--- read value of the "ShowOHLC" property + if(!ChartSetInteger(m_chart_id,CHART_SHOW_OHLC,FileReadInteger(file_handle,CHAR_VALUE))) + return(false); +//--- read value of the "ShowLineBid" property + if(!ChartSetInteger(m_chart_id,CHART_SHOW_BID_LINE,FileReadInteger(file_handle,CHAR_VALUE))) + return(false); +//--- read value of the "ShowLineAsk" property + if(!ChartSetInteger(m_chart_id,CHART_SHOW_ASK_LINE,FileReadInteger(file_handle,CHAR_VALUE))) + return(false); +//--- read value of the "ShowLastLine" property + if(!ChartSetInteger(m_chart_id,CHART_SHOW_LAST_LINE,FileReadInteger(file_handle,CHAR_VALUE))) + return(false); +//--- read value of the "ShowPeriodSep" property + if(!ChartSetInteger(m_chart_id,CHART_SHOW_PERIOD_SEP,FileReadInteger(file_handle,CHAR_VALUE))) + return(false); +//--- read value of the "ShowGrid" property + if(!ChartSetInteger(m_chart_id,CHART_SHOW_GRID,FileReadInteger(file_handle,CHAR_VALUE))) + return(false); +//--- read value of the "ShowVolumes" property + if(!ChartSetInteger(m_chart_id,CHART_SHOW_VOLUMES,FileReadInteger(file_handle,INT_VALUE))) + return(false); +//--- read value of the "ShowObjectDescr" property + if(!ChartSetInteger(m_chart_id,CHART_SHOW_OBJECT_DESCR,FileReadInteger(file_handle,CHAR_VALUE))) + return(false); +//--- successful + return(resutl); + } +//+------------------------------------------------------------------+ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Controls/BmpButton.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Controls/BmpButton.mqh new file mode 100644 index 0000000..12dcfde --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/Controls/BmpButton.mqh @@ -0,0 +1,268 @@ +//+------------------------------------------------------------------+ +//| BmpButton.mqh | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include "WndObj.mqh" +#include +//+------------------------------------------------------------------+ +//| Class CBmpButton | +//| Usage: control that is displayed by | +//| the CChartObjectBmpLabel object | +//+------------------------------------------------------------------+ +class CBmpButton : public CWndObj + { +private: + CChartObjectBmpLabel m_button; // chart object + //--- parameters of the chart object + int m_border; // border width + string m_bmp_off_name; // name of BMP file for the "OFF" state (default state) + string m_bmp_on_name; // name of BMP file for the "ON" state + string m_bmp_passive_name; + string m_bmp_active_name; + +public: + CBmpButton(void); + ~CBmpButton(void); + //--- create + virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2); + //--- parameters of the chart object + int Border(void) const { return(m_border); } + bool Border(const int value); + bool BmpNames(const string off="",const string on=""); + string BmpOffName(void) const { return(m_bmp_off_name); } + bool BmpOffName(const string name); + string BmpOnName(void) const { return(m_bmp_on_name); } + bool BmpOnName(const string name); + string BmpPassiveName(void) const { return(m_bmp_passive_name); } + bool BmpPassiveName(const string name); + string BmpActiveName(void) const { return(m_bmp_active_name); } + bool BmpActiveName(const string name); + //--- state + bool Pressed(void) const { return(m_button.State()); } + bool Pressed(const bool pressed) { return(m_button.State(pressed)); } + //--- properties + bool Locking(void) const { return(IS_CAN_LOCK); } + void Locking(const bool locking); + +protected: + //--- handlers of object settings + virtual bool OnSetZOrder(void) { return(m_button.Z_Order(m_zorder)); } + //--- internal event handlers + virtual bool OnCreate(void); + virtual bool OnShow(void); + virtual bool OnHide(void); + virtual bool OnMove(void); + virtual bool OnChange(void); + //--- + virtual bool OnActivate(void); + virtual bool OnDeactivate(void); + virtual bool OnMouseDown(void); + virtual bool OnMouseUp(void); + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CBmpButton::CBmpButton(void) : m_border(0), + m_bmp_off_name(NULL), + m_bmp_on_name(NULL), + m_bmp_passive_name(NULL), + m_bmp_active_name(NULL) + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CBmpButton::~CBmpButton(void) + { + } +//+------------------------------------------------------------------+ +//| Create a control | +//+------------------------------------------------------------------+ +bool CBmpButton::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) + { +//--- call method of the parent class + if(!CWndObj::Create(chart,name,subwin,x1,y1,x2,y2)) + return(false); +//--- create the chart object + if(!m_button.Create(chart,name,subwin,x1,y1)) + return(false); +//--- call the settings handler + return(OnChange()); + } +//+------------------------------------------------------------------+ +//| Set border width | +//+------------------------------------------------------------------+ +bool CBmpButton::Border(const int value) + { +//--- save new value of parameter + m_border=value; +//--- set up the chart object + return(m_button.Width(value)); + } +//+------------------------------------------------------------------+ +//| Set two images at once | +//+------------------------------------------------------------------+ +bool CBmpButton::BmpNames(const string off,const string on) + { +//--- save new values of parameters + m_bmp_off_name=off; + m_bmp_on_name =on; +//--- set up the chart object + if(!m_button.BmpFileOff(off)) + return(false); + if(!m_button.BmpFileOn(on)) + return(false); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Set image for the "OFF" state | +//+------------------------------------------------------------------+ +bool CBmpButton::BmpOffName(const string name) + { +//--- save new value of parameter + m_bmp_off_name=name; +//--- set up the chart object + if(!m_button.BmpFileOff(name)) + return(false); +//--- set size by image dimensions + Width(m_button.X_Size()); + Height(m_button.Y_Size()); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Set image for the "ON" state | +//+------------------------------------------------------------------+ +bool CBmpButton::BmpOnName(const string name) + { +//--- save new value of parameter + m_bmp_on_name=name; +//--- set up the chart object + if(!m_button.BmpFileOn(name)) + return(false); +//--- set size by image dimensions + Width(m_button.X_Size()); + Height(m_button.Y_Size()); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Set image for the "OFF" state (passive) | +//+------------------------------------------------------------------+ +bool CBmpButton::BmpPassiveName(const string name) + { +//--- save new value of parameter + m_bmp_passive_name=name; +//--- set up the chart object + if(!IS_ACTIVE) + return(BmpOffName(name)); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Set image for the "OFF" state (active) | +//+------------------------------------------------------------------+ +bool CBmpButton::BmpActiveName(const string name) + { +//--- save new value of parameter + m_bmp_active_name=name; +//--- set up the chart object + if(IS_ACTIVE) + return(BmpOffName(name)); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Locking flag | +//+------------------------------------------------------------------+ +void CBmpButton::Locking(const bool flag) + { + if(flag) + PropFlagsSet(WND_PROP_FLAG_CAN_LOCK); + else + PropFlagsReset(WND_PROP_FLAG_CAN_LOCK); + } +//+------------------------------------------------------------------+ +//| Create object on chart | +//+------------------------------------------------------------------+ +bool CBmpButton::OnCreate(void) + { +//--- create the chart object by previously set parameters + return(m_button.Create(m_chart_id,m_name,m_subwin,m_rect.left,m_rect.top)); + } +//+------------------------------------------------------------------+ +//| Display object on chart | +//+------------------------------------------------------------------+ +bool CBmpButton::OnShow(void) + { + return(m_button.Timeframes(OBJ_ALL_PERIODS)); + } +//+------------------------------------------------------------------+ +//| Hide object from chart | +//+------------------------------------------------------------------+ +bool CBmpButton::OnHide(void) + { + return(m_button.Timeframes(OBJ_NO_PERIODS)); + } +//+------------------------------------------------------------------+ +//| Absolute movement of the chart object | +//+------------------------------------------------------------------+ +bool CBmpButton::OnMove(void) + { +//--- position the chart object + return(m_button.X_Distance(m_rect.left) && m_button.Y_Distance(m_rect.top)); + } +//+------------------------------------------------------------------+ +//| Set up the chart object | +//+------------------------------------------------------------------+ +bool CBmpButton::OnChange(void) + { +//--- set up the chart object + return(m_button.Width(m_border) && m_button.BmpFileOff(m_bmp_off_name) && m_button.BmpFileOn(m_bmp_on_name)); + } +//+------------------------------------------------------------------+ +//| Handler of activating the group of controls | +//+------------------------------------------------------------------+ +bool CBmpButton::OnActivate(void) + { + if(m_bmp_active_name!=NULL) + BmpOffName(m_bmp_active_name); +//--- handled + return(true); + } +//+------------------------------------------------------------------+ +//| Handler of deactivating the group of controls | +//+------------------------------------------------------------------+ +bool CBmpButton::OnDeactivate(void) + { + if(m_bmp_passive_name!=NULL) + BmpOffName(m_bmp_passive_name); + if(!IS_CAN_LOCK) + Pressed(false); +//--- handled + return(true); + } +//+------------------------------------------------------------------+ +//| Handler of click on the left mouse button | +//+------------------------------------------------------------------+ +bool CBmpButton::OnMouseDown(void) + { + if(!IS_CAN_LOCK) + Pressed(!Pressed()); +//--- call of the method of the parent class + return(CWnd::OnMouseDown()); + } +//+------------------------------------------------------------------+ +//| Handler of click on the left mouse button | +//+------------------------------------------------------------------+ +bool CBmpButton::OnMouseUp(void) + { +//--- depress the button if it is not fixed + if(m_button.State() && !IS_CAN_LOCK) + m_button.State(false); +//--- call of the method of the parent class + return(CWnd::OnMouseUp()); + } +//+------------------------------------------------------------------+ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Controls/Button.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Controls/Button.mqh new file mode 100644 index 0000000..d30be91 --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/Controls/Button.mqh @@ -0,0 +1,146 @@ +//+------------------------------------------------------------------+ +//| Button.mqh | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include "WndObj.mqh" +#include +//+------------------------------------------------------------------+ +//| Class CButton | +//| Usage: control that is displayed by | +//| the CChartObjectButton object | +//+------------------------------------------------------------------+ +class CButton : public CWndObj + { +private: + CChartObjectButton m_button; // chart object + +public: + CButton(void); + ~CButton(void); + //--- create + virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2); + //--- state + bool Pressed(void) const { return(m_button.State()); } + bool Pressed(const bool pressed) { return(m_button.State(pressed)); } + //--- properties + bool Locking(void) const { return(IS_CAN_LOCK); } + void Locking(const bool flag); + +protected: + //--- handlers of object settings + virtual bool OnSetText(void) { return(m_button.Description(m_text)); } + virtual bool OnSetColor(void) { return(m_button.Color(m_color)); } + virtual bool OnSetColorBackground(void) { return(m_button.BackColor(m_color_background)); } + virtual bool OnSetColorBorder(void) { return(m_button.BorderColor(m_color_border)); } + virtual bool OnSetFont(void) { return(m_button.Font(m_font)); } + virtual bool OnSetFontSize(void) { return(m_button.FontSize(m_font_size)); } + //--- internal event handlers + virtual bool OnCreate(void); + virtual bool OnShow(void); + virtual bool OnHide(void); + virtual bool OnMove(void); + virtual bool OnResize(void); + //--- + virtual bool OnMouseDown(void); + virtual bool OnMouseUp(void); + }; +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CButton::CButton(void) + { + m_color =CONTROLS_BUTTON_COLOR; + m_color_background=CONTROLS_BUTTON_COLOR_BG; + m_color_border =CONTROLS_BUTTON_COLOR_BORDER; + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CButton::~CButton(void) + { + } +//+------------------------------------------------------------------+ +//| Create a control | +//+------------------------------------------------------------------+ +bool CButton::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) + { +//--- call method of the parent class + if(!CWndObj::Create(chart,name,subwin,x1,y1,x2,y2)) + return(false); +//--- create the chart object + if(!m_button.Create(chart,name,subwin,x1,y1,Width(),Height())) + return(false); +//--- call the settings handler + return(OnChange()); + } +//+------------------------------------------------------------------+ +//| Locking flag | +//+------------------------------------------------------------------+ +void CButton::Locking(const bool flag) + { + if(flag) + PropFlagsSet(WND_PROP_FLAG_CAN_LOCK); + else + PropFlagsReset(WND_PROP_FLAG_CAN_LOCK); + } +//+------------------------------------------------------------------+ +//| Create object on chart | +//+------------------------------------------------------------------+ +bool CButton::OnCreate(void) + { +//--- create the chart object by previously set parameters + return(m_button.Create(m_chart_id,m_name,m_subwin,m_rect.left,m_rect.top,m_rect.Width(),m_rect.Height())); + } +//+------------------------------------------------------------------+ +//| Display object on chart | +//+------------------------------------------------------------------+ +bool CButton::OnShow(void) + { + return(m_button.Timeframes(OBJ_ALL_PERIODS)); + } +//+------------------------------------------------------------------+ +//| Hide object from chart | +//+------------------------------------------------------------------+ +bool CButton::OnHide(void) + { + return(m_button.Timeframes(OBJ_NO_PERIODS)); + } +//+------------------------------------------------------------------+ +//| Absolute movement of the chart object | +//+------------------------------------------------------------------+ +bool CButton::OnMove(void) + { +//--- position the chart object + return(m_button.X_Distance(m_rect.left) && m_button.Y_Distance(m_rect.top)); + } +//+------------------------------------------------------------------+ +//| Resize the chart object | +//+------------------------------------------------------------------+ +bool CButton::OnResize(void) + { +//--- resize the chart object + return(m_button.X_Size(m_rect.Width()) && m_button.Y_Size(m_rect.Height())); + } +//+------------------------------------------------------------------+ +//| Handler of click on the left mouse button | +//+------------------------------------------------------------------+ +bool CButton::OnMouseDown(void) + { + if(!IS_CAN_LOCK) + Pressed(!Pressed()); +//--- call of the method of the parent class + return(CWnd::OnMouseDown()); + } +//+------------------------------------------------------------------+ +//| Handler of click on the left mouse button | +//+------------------------------------------------------------------+ +bool CButton::OnMouseUp(void) + { +//--- depress the button if it is not fixed + if(m_button.State() && !IS_CAN_LOCK) + m_button.State(false); +//--- call of the method of the parent class + return(CWnd::OnMouseUp()); + } +//+------------------------------------------------------------------+ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Controls/CheckBox.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Controls/CheckBox.mqh new file mode 100644 index 0000000..d9caae5 --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/Controls/CheckBox.mqh @@ -0,0 +1,183 @@ +//+------------------------------------------------------------------+ +//| CheckBox.mqh | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include "WndContainer.mqh" +#include "BmpButton.mqh" +#include "Edit.mqh" +//+------------------------------------------------------------------+ +//| Resources | +//+------------------------------------------------------------------+ +#resource "res\\CheckBoxOn.bmp" +#resource "res\\CheckBoxOff.bmp" +//+------------------------------------------------------------------+ +//| Class CCheckBox | +//| Usage: class that implements the "CheckBox" control | +//+------------------------------------------------------------------+ +class CCheckBox : public CWndContainer + { +private: + //--- dependent controls + CBmpButton m_button; // button object + CEdit m_label; // label object + //--- data + int m_value; // value + +public: + CCheckBox(void); + ~CCheckBox(void); + //--- create + virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2); + //--- chart event handler + virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam); + //--- settings + string Text(void) const { return(m_label.Text()); } + bool Text(const string value) { return(m_label.Text(value)); } + color Color(void) const { return(m_label.Color()); } + bool Color(const color value) { return(m_label.Color(value)); } + //--- state + bool Checked(void) const { return(m_button.Pressed()); } + bool Checked(const bool flag) { return(m_button.Pressed(flag)); } + //--- data + int Value(void) const { return(m_value); } + void Value(const int value) { m_value=value; } + //--- methods for working with files + virtual bool Save(const int file_handle); + virtual bool Load(const int file_handle); + +protected: + //--- create dependent controls + virtual bool CreateButton(void); + virtual bool CreateLabel(void); + //--- handlers of the dependent controls events + virtual bool OnClickButton(void); + virtual bool OnClickLabel(void); + }; +//+------------------------------------------------------------------+ +//| Common handler of chart events | +//+------------------------------------------------------------------+ +EVENT_MAP_BEGIN(CCheckBox) + ON_EVENT(ON_CLICK,m_button,OnClickButton) + ON_EVENT(ON_CLICK,m_label,OnClickLabel) +EVENT_MAP_END(CWndContainer) +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CCheckBox::CCheckBox(void) : m_value(0) + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CCheckBox::~CCheckBox(void) + { + } +//+------------------------------------------------------------------+ +//| Create a control | +//+------------------------------------------------------------------+ +bool CCheckBox::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) + { +//--- call method of the parent class + if(!CWndContainer::Create(chart,name,subwin,x1,y1,x2,y2)) + return(false); +//--- create dependent controls + if(!CreateButton()) + return(false); + if(!CreateLabel()) + return(false); +//--- succeeded + return(true); + } +//+------------------------------------------------------------------+ +//| Create button | +//+------------------------------------------------------------------+ +bool CCheckBox::CreateButton(void) + { +//--- calculate coordinates + int x1=CONTROLS_CHECK_BUTTON_X_OFF; + int y1=CONTROLS_CHECK_BUTTON_Y_OFF; + int x2=x1+CONTROLS_BUTTON_SIZE; + int y2=y1+CONTROLS_BUTTON_SIZE-CONTROLS_BORDER_WIDTH; +//--- create + if(!m_button.Create(m_chart_id,m_name+"Button",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_button.BmpNames("::res\\CheckBoxOff.bmp","::res\\CheckBoxOn.bmp")) + return(false); + if(!Add(m_button)) + return(false); + m_button.Locking(true); +//--- succeeded + return(true); + } +//+------------------------------------------------------------------+ +//| Create label | +//+------------------------------------------------------------------+ +bool CCheckBox::CreateLabel(void) + { +//--- calculate coordinates + int x1=CONTROLS_CHECK_LABEL_X_OFF; + int y1=CONTROLS_CHECK_LABEL_Y_OFF; + int x2=Width(); + int y2=Height(); +//--- create + if(!m_label.Create(m_chart_id,m_name+"Label",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_label.Text(m_name)) + return(false); + if(!Add(m_label)) + return(false); + m_label.ReadOnly(true); + m_label.ColorBackground(CONTROLS_CHECKGROUP_COLOR_BG); + m_label.ColorBorder(CONTROLS_CHECKGROUP_COLOR_BG); +//--- succeeded + return(true); + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool CCheckBox::Save(const int file_handle) + { +//--- check + if(file_handle==INVALID_HANDLE) + return(false); +//--- + FileWriteInteger(file_handle,Checked()); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool CCheckBox::Load(const int file_handle) + { +//--- check + if(file_handle==INVALID_HANDLE) + return(false); +//--- + if(!FileIsEnding(file_handle)) + Checked(FileReadInteger(file_handle)); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Handler of click on button | +//+------------------------------------------------------------------+ +bool CCheckBox::OnClickButton(void) + { +//--- send the "changed state" event + EventChartCustom(CONTROLS_SELF_MESSAGE,ON_CHANGE,m_id,0.0,m_name); +//--- handled + return(true); + } +//+------------------------------------------------------------------+ +//| Handler of click on label | +//+------------------------------------------------------------------+ +bool CCheckBox::OnClickLabel(void) + { +//--- change button state + m_button.Pressed(!m_button.Pressed()); +//--- return the result of the button click handler + return(OnClickButton()); + } +//+------------------------------------------------------------------+ diff --git a/server/MQL5/assets/Metatrader5/MQL5/Include/Controls/CheckGroup.mqh b/server/MQL5/assets/Metatrader5/MQL5/Include/Controls/CheckGroup.mqh new file mode 100644 index 0000000..1a3c552 --- /dev/null +++ b/server/MQL5/assets/Metatrader5/MQL5/Include/Controls/CheckGroup.mqh @@ -0,0 +1,377 @@ +//+------------------------------------------------------------------+ +//| CheckGroup.mqh | +//| Copyright 2000-2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include "WndClient.mqh" +#include "CheckBox.mqh" +#include +#include +#include +//+------------------------------------------------------------------+ +//| Class CCheckGroup | +//| Usage: view and edit group of flags | +//+------------------------------------------------------------------+ +class CCheckGroup : public CWndClient + { +private: + //--- dependent controls + CCheckBox m_rows[]; // array of the row objects + //--- set up + int m_offset; // index of first visible row in array of rows + int m_total_view; // number of visible rows + int m_item_height; // height of visible row + //--- data + CArrayString m_strings; // array of rows + CArrayLong m_values; // array of values + CArrayInt m_states; // array of states + long m_value; // current value + int m_current; // index of current row in array of rows + +public: + CCheckGroup(void); + ~CCheckGroup(void); + //--- create + virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2); + virtual void Destroy(const int reason=0); + //--- chart event handler + virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam); + //--- fill + virtual bool AddItem(const string item,const long value=0); + //--- data + long Value(void) const; + bool Value(const long value); + int Check(const int idx) const; + bool Check(const int idx,const int value); + //--- state + virtual bool Show(void); + //--- methods for working with files + virtual bool Save(const int file_handle); + virtual bool Load(const int file_handle); + +protected: + //--- create dependent controls + bool CreateButton(int index); + //--- handlers of the dependent controls events + virtual bool OnVScrollShow(void); + virtual bool OnVScrollHide(void); + virtual bool OnScrollLineDown(void); + virtual bool OnScrollLineUp(void); + virtual bool OnChangeItem(const int row_index); + //--- redraw + bool Redraw(void); + bool RowState(const int index,const bool select); + }; +//+------------------------------------------------------------------+ +//| Common handler of chart events | +//+------------------------------------------------------------------+ +EVENT_MAP_BEGIN(CCheckGroup) + ON_INDEXED_EVENT(ON_CHANGE,m_rows,OnChangeItem) +EVENT_MAP_END(CWndClient) +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CCheckGroup::CCheckGroup(void) : m_offset(0), + m_total_view(0), + m_item_height(CONTROLS_LIST_ITEM_HEIGHT), + m_current(CONTROLS_INVALID_INDEX), + m_value(0) + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CCheckGroup::~CCheckGroup(void) + { + } +//+------------------------------------------------------------------+ +//| Create a control | +//+------------------------------------------------------------------+ +bool CCheckGroup::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) + { +//--- determine the number of visible rows + m_total_view=(y2-y1)/m_item_height; +//--- check the number of visible rows + if(m_total_view<1) + return(false); +//--- call method of the parent class + if(!CWndClient::Create(chart,name,subwin,x1,y1,x2,y2)) + return(false); +//--- set up + if(!m_background.ColorBackground(CONTROLS_CHECKGROUP_COLOR_BG)) + return(false); + if(!m_background.ColorBorder(CONTROLS_CHECKGROUP_COLOR_BORDER)) + return(false); +//--- create dependent controls + ArrayResize(m_rows,m_total_view); + for(int i=0;i=m_values.Total()) + return(0); +//--- + return(m_states[idx]); + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool CCheckGroup::Check(const int idx,const int value) + { +//--- check + if(idx>=m_values.Total()) + return(false); +//--- + bool res=(m_states.Update(idx,value) && Redraw()); +//--- change value + if(res && idx<64) + { + if(m_rows[idx].Checked()) + Value(m_value|m_values.At(idx)); + else + Value(m_value&(~m_values.At(idx))); + } +//--- + return(res); + } +//+------------------------------------------------------------------+ +//| Makes the group visible | +//+------------------------------------------------------------------+ +bool CCheckGroup::Show(void) + { +//--- call of the method of the parent class + if(!CWndClient::Show()) + return(false); +//--- loop by rows + int total=m_values.Total(); + for(int i=total;i=ArraySize(m_rows)) + return(true); +//--- change state + return(m_rows[index].Checked(select)); + } +//+------------------------------------------------------------------+ +//| Handler of the "Show vertical scrollbar" event | +//+------------------------------------------------------------------+ +bool CCheckGroup::OnVScrollShow(void) + { +//--- loop by "rows" + for(int i=0;i