From fd7b9de1f4a4dd3f5d1fded28af529a274345acc Mon Sep 17 00:00:00 2001 From: Mohamed Date: Fri, 7 Jun 2024 00:13:19 -0500 Subject: [PATCH 001/124] adding demo button --- controller/AlbumCreator.py | 0 controller/__pycache__/AI.cpython-311.pyc | Bin 696 -> 696 bytes controller/__pycache__/Manual.cpython-311.pyc | Bin 712 -> 712 bytes view/DemoButton.py | 34 ++++++++++++++++++ view/MainView.py | 18 +++++++--- view/__pycache__/DemoButton.cpython-311.pyc | Bin 0 -> 2512 bytes .../__pycache__/FrameSettings.cpython-311.pyc | Bin 1773 -> 1773 bytes view/__pycache__/IconButton.cpython-311.pyc | Bin 3514 -> 3514 bytes view/__pycache__/MainView.cpython-311.pyc | Bin 3454 -> 3830 bytes view/__pycache__/PopUpWindow.cpython-311.pyc | Bin 4048 -> 4048 bytes view/__pycache__/UploadButton.cpython-311.pyc | Bin 3065 -> 3065 bytes 11 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 controller/AlbumCreator.py create mode 100644 view/DemoButton.py create mode 100644 view/__pycache__/DemoButton.cpython-311.pyc diff --git a/controller/AlbumCreator.py b/controller/AlbumCreator.py new file mode 100644 index 0000000..e69de29 diff --git a/controller/__pycache__/AI.cpython-311.pyc b/controller/__pycache__/AI.cpython-311.pyc index ed9076e47897b8381860e7b5d8b4b6f5af39ecaf..bbce00c75ab2369a2f37b22119700e4156732b45 100644 GIT binary patch delta 19 ZcmdnNx`UN#IWI340}x2{Y~)(U1OP3d1YrOG delta 19 ZcmdnNx`UN#IWI340}xyd*~qny2>>wa1mpk! diff --git a/controller/__pycache__/Manual.cpython-311.pyc b/controller/__pycache__/Manual.cpython-311.pyc index 8db3916c51328334e86af561c9add9ac5bb4c378..7185bfa0b491af34c43b7478fd3f5b3ef6a59b67 100644 GIT binary patch delta 19 ZcmX@XdV-Z}IWI340}x2{Y~>%V1rY!M diff --git a/view/DemoButton.py b/view/DemoButton.py new file mode 100644 index 0000000..c1e7208 --- /dev/null +++ b/view/DemoButton.py @@ -0,0 +1,34 @@ +from PyQt5.QtWidgets import QPushButton, QWidget, QVBoxLayout +from PyQt5.QtCore import Qt +import webbrowser + +class DemoButton(QWidget): + def __init__(self, parent=None): + super().__init__(parent) + self.button = QPushButton("Try Web Demo", self) + self.button.setStyleSheet( + """ + QPushButton { + border: 4px solid #3EB489; /* Mint color */ + color: white; + font-family: 'shanti'; + font-size: 36px; + border-radius: 25px; + padding: 15px 30px; /* Increased padding for a larger button */ + background-color: transparent; /* Transparent background */ + } + QPushButton:hover { + background-color: #3EB489; /* Mint color on hover */ + } + """ + ) + + self.layout = QVBoxLayout(self) + self.layout.addWidget(self.button, alignment=Qt.AlignCenter) + self.setLayout(self.layout) + + self.button.clicked.connect(self.try_demo) + + def try_demo(self): + webbrowser.open("https://huggingface.co/spaces/jagruthh/cities_small") + print("Web demo initiated") diff --git a/view/MainView.py b/view/MainView.py index 8381824..65d6cc8 100644 --- a/view/MainView.py +++ b/view/MainView.py @@ -1,15 +1,16 @@ import sys -from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout +from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout from PyQt5.QtWidgets import QStyle from PyQt5.QtCore import Qt from view.FrameSettings import FrameSettings from view.IconButton import IconButton from view.UploadButton import UploadButton +from view.DemoButton import DemoButton class MainWindow(QMainWindow): def __init__(self): super().__init__() - self.setWindowTitle("Main Frame") + self.setWindowTitle("Vision AI") self.central_widget = QWidget() self.setCentralWidget(self.central_widget) @@ -18,7 +19,7 @@ def __init__(self): self.layout.addLayout(self.frame_settings.layout) self.create_icon_button() - self.create_upload_button() + self.create_upload_and_demo_buttons() self.showMaximized() def create_icon_button(self): @@ -28,9 +29,16 @@ def create_icon_button(self): button = IconButton(QStyle.SP_DirIcon, label_text, button_size, icon_size, self.central_widget) self.frame_settings.layout.addWidget(button, 0, 0, alignment=Qt.AlignTop | Qt.AlignLeft) - def create_upload_button(self): + def create_upload_and_demo_buttons(self): + button_layout = QHBoxLayout() + upload_button = UploadButton(self.central_widget) - self.frame_settings.layout.addWidget(upload_button, 1, 0, alignment=Qt.AlignBottom | Qt.AlignHCenter) + demo_button = DemoButton(self.central_widget) + + button_layout.addWidget(upload_button) + button_layout.addWidget(demo_button) + + self.frame_settings.layout.addLayout(button_layout, 1, 0, alignment=Qt.AlignBottom | Qt.AlignHCenter) if __name__ == "__main__": app = QApplication(sys.argv) diff --git a/view/__pycache__/DemoButton.cpython-311.pyc b/view/__pycache__/DemoButton.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d5ad7574f309c78bf758f014e7a678f7c4a2bc3 GIT binary patch literal 2512 zcmaJCO>Y}Tbk<*)d^jydq=6D?+Efj$l(-}*1s4!$jjEv3BqVJm%VM?O9ow6%cg^fL ziPIqUP>F&fQ6x|~aIg>xf^g^oegbzVveam$N=Tfzxk`~xPrTX9I(D6Oyngd$-rM*6 z-u@ho_8?fXZ?d^RLkRsX4*m-7BYPhK@&IW_lMGap(o!*y4itmwpd{`BMyME0hh02q zMADG}x`wpSU8IF+U^9r&7W}=H?$UzuC>Hrg9AiPJcW$<97p{~!w@jyN?v}3QDTmve zSFF_;rDBzNOmYHqJf-dna5rDv-Z?ma0fteOmNb+OXrX&3CuxDZ-RYnfyo=IsUX{{e zP#Jc5lC)@fs#0p8MILyKgvh-gC4|0{9v}|8zcvBc@(-xmLTO&2b!ijsx0*BwaX)gv zq)F>&6ZCC0b*>}XcLA-V#U@@AmUJvF&>_9|fC*%`=?2*mp9->@c(u#FZQWb7^Wz7U z#cm(}E!b|m1Qu7_it#!8y;WPgP2!ycFBhBESNr^TTX*1%`se56Xb4gnO0D%RunM_F zvqa=n>4nJlke1a_RpfRXMKEP8rcst4lciN+TZXQY;fW8gOuqfjWfDJ6uInZzs%2P= zoR4?B>k<-VrJ!?qxr3UsOg@@Zin>urkP*9}m|Pz@g3Z>~Xo5_OzKQHU^wy?CMB2loG!Gc2)(xLf?gjgo=WIUIdc9k$P zx)npun?*1@*6)Pva)~kr%d&3jT$Y(=I49yo!in0H&-02w=L?i_CK}g?81C!=F`DMh zBqkck>75c{uYy>R*9|XvGs@{w4P9NL8X%TwQk6THvx=-ial()b+0@865igKVw=AoM zV%xH83p)t8^X%8FiOda~GCOm9^qOKAias{IFgi0mmHF7DNv1E;CPGHZjGnD1CggdU z+FZCurpmlvF`ZX3Nop@~tCX3axsjPK7mE$n$9fibOmJkV{@!jVWMT%UT(SbqbdSqKLqgK9rPGS zzwFxRdV~je@Zk3Y+nCfbsbTVX;BJc8^!Nb+$PuI8ccpZ<|{AUkrMrw0-!$IUl{P$)6w0{m3 zn|#`fhknP5Ju5VuW!4ImjuWy<)O5lnNHlyi*#KB>3tI_$6(D;BKwH}U z`XoTG-vA)8c4FgLZ4lyRs8j`@FPH_L^6LI_W5Rz-w E|I%eq^Z)<= literal 0 HcmV?d00001 diff --git a/view/__pycache__/FrameSettings.cpython-311.pyc b/view/__pycache__/FrameSettings.cpython-311.pyc index b599decc8da8b306bb71bf2fb348f2f80e360e8d..97b369ee15ee5aa7a7337e3de5ed885006affec9 100644 GIT binary patch delta 19 ZcmaFM`<9n$IWI340}x2{Y~*^(1^_ma1rz`P delta 19 ZcmaFM`<9n$IWI340}uqcZ{&K+1^_mR1qT2C diff --git a/view/__pycache__/IconButton.cpython-311.pyc b/view/__pycache__/IconButton.cpython-311.pyc index 7efbc31cb57329caf87dcfe525e75be9bc2b0c85..6f91b14e092bffd8752457c8d26b68928bc9de7a 100644 GIT binary patch delta 20 acmdlby-S*VIWI340}x2{ByHqg&kF!H1O)*A delta 20 acmdlby-S*VIWI340}$LuNZiQ1o)-W*DFu=M diff --git a/view/__pycache__/MainView.cpython-311.pyc b/view/__pycache__/MainView.cpython-311.pyc index 88f5e1d3127ebf26627b8050176bd3bc9738ce1c..a7b362c2232984e1844b82d05a89443ac4fe58c3 100644 GIT binary patch delta 1408 zcma)6%Wo4$7@t|M?b%bB!k&ck`|h#SXERU$zOQFw@es#b(nJXWGB$Gf04`>4hn zA|O$6KqBQp8;w+{QdRks7UjsLxBdeh>}VyTm8iHN#063n_0R)iW^G5I54Gdn-+uG^ zef#aq_kH6x*+2R^ew1Yq(6O*KceN|J){%x&YX^syt%wqVKm%IHgjQ6E1~zXZOHhQs z4x6GSDNu=1>y)UQN2r zu^B$k0iDx9r3;W(Tr#U9={&Jcm5rt|MJ1)DYTe`uZeN0mpptGYda{-w{qQ3p_JUEL z=EGzTe!%=|+ooGwUdH4ukiuD^`+lB=up zUz$!yQ%km{YV-|tZr*hryGnlLy=;QUzP0z0l3`yoY|U9Hs;XfduBuApQFv7RxPeAI zG*U++1V(Plqnl{7fyO*ER!3tGzlw~*3xhO3o_nFu2OeU;w*CP6Ldi6)*_Lj*c@axY zKoorOvvcYx1D`EBHtu3gI;#}t28f|)cDYOV{e4F0=T;$ei z$c>$kLGZ7hp}%>8O1K@X5@}ntT?=S&WAwQQHK=iJXWI>ciqN*-VQFQB@$q4*W(JsOS?OSk9Mm97 zXSedCC}x)b+DZdds@|or0-mIYzmvb0SLJ8veYMZM{f8UrBVPK*s{AB1Q0wvr4>eK~ zUTR`hdWw>dQEn6EYH|Y=Jyfit;?@o)HBiArg*qxcMKKTccxdP`Dr};{Pgj0EPHu}s zFh_n6-0q5E{1++R&Hjh{_zgo}D6)P(5ga=# zk(W~UAgfwSW2d;K1r-dIc!+ey3YUYgvgH4Xj#`d3Z|YNchECarsuL8qLlD9(Ag%M#Jp@JPoYl|>JiGHd-}n9Id~?3<_x))6T^D<$ zstRE1_UPpF_s~)-0aHsylP&}%FatJp!g^TPLA%63IudrsmK{Y`gdMgcPE?NyyTn$V zm>z>b0vCaa9syIvft3INtL!N*y%d+3${mS&WK;rJ!XR5t`vTQH zX@GSH6HO}Cq#h6_$8Xo%Ohj!7X3sb66KTJkZF_ohDRP4h7QyF4+wyq+$eE2qcRtbm zSly&=BAu))Un9rPa>Ypv2cEW|8pf2J&gG`CZ5xILNj;0^c++}|A6NOS9Ar8e?d_35 zF5Cu(BWc__S3rj0umNM)Yv{-5Nv#kazBl4`rAGV#kKkf|;&&}PmlAV3hJD|1GdUvD z7PTtLWhj&j`nnk3elfkpev8X>P)|KECcekp^%I?QJag8@J*1zxyp&u6!|ecsa1$tt m; Date: Wed, 12 Jun 2024 00:44:15 -0500 Subject: [PATCH 002/124] Solved error --- view/MainView.py | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/view/MainView.py b/view/MainView.py index 98eb0e3..117ebf1 100644 --- a/view/MainView.py +++ b/view/MainView.py @@ -1,13 +1,3 @@ -<<<<<<< HEAD -import sys -from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout -from PyQt5.QtWidgets import QStyle -from PyQt5.QtCore import Qt -from view.FrameSettings import FrameSettings -from view.IconButton import IconButton -from view.UploadButton import UploadButton -from view.DemoButton import DemoButton -======= import os import shutil import webbrowser @@ -25,28 +15,18 @@ InformationDialog # Import InformationDialog from view.SelectMethod import SelectMethod ->>>>>>> code-review class MainWindow(QMainWindow): def __init__(self, initial_folder): super().__init__() -<<<<<<< HEAD - self.setWindowTitle("Vision AI") -======= self.setWindowTitle("VisionAI") self.setGeometry(100, 100, 1200, 800) ->>>>>>> code-review self.central_widget = QWidget() self.setCentralWidget(self.central_widget) self.layout = QVBoxLayout(self.central_widget) self.frame_settings = FrameSettings(self.central_widget, color=QColor(30, 30, 30)) self.layout.addLayout(self.frame_settings.layout) -<<<<<<< HEAD - - self.create_icon_button() - self.create_upload_and_demo_buttons() -======= self.history_manager = HistoryManager(self) self.image_display = ImageDisplay(self) @@ -57,7 +37,6 @@ def __init__(self, initial_folder): self.layout.addWidget(self.folder_list) # Add FolderList widget to layout self.layout.addWidget(self.image_display) ->>>>>>> code-review self.showMaximized() self.initial_directory = initial_folder # Store the initial directory @@ -66,25 +45,12 @@ def __init__(self, initial_folder): # Set the default font for all widgets in the main window self.set_font_for_all_widgets(self, "Consolas", 12) -<<<<<<< HEAD - def create_upload_and_demo_buttons(self): - button_layout = QHBoxLayout() - - upload_button = UploadButton(self.central_widget) - demo_button = DemoButton(self.central_widget) - - button_layout.addWidget(upload_button) - button_layout.addWidget(demo_button) - - self.frame_settings.layout.addLayout(button_layout, 1, 0, alignment=Qt.AlignBottom | Qt.AlignHCenter) -======= def set_font_for_all_widgets(self, widget, font_family, font_size): font = QFont(font_family, font_size) widget.setFont(font) for child in widget.children(): if isinstance(child, QWidget): self.set_font_for_all_widgets(child, font_family, font_size) ->>>>>>> code-review def update_view(self, folder_path): self.history_manager.update_history(folder_path) From 2d0285b82081a3f7f0f65a063e56ca9093c9c6c2 Mon Sep 17 00:00:00 2001 From: jagruthh Date: Wed, 12 Jun 2024 08:03:44 -0500 Subject: [PATCH 003/124] Small test change --- tests/test_folder_list.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_folder_list.py b/tests/test_folder_list.py index 6845fbb..84919a7 100644 --- a/tests/test_folder_list.py +++ b/tests/test_folder_list.py @@ -1,3 +1,6 @@ +# Temp +# Author ~ Abdu Raziq + import os import sys import unittest From 2a94b86fcda056722a6a01f4e47b3a143b620c14 Mon Sep 17 00:00:00 2001 From: jagruthh Date: Wed, 12 Jun 2024 08:06:34 -0500 Subject: [PATCH 004/124] Adjustments. --- controller/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 161 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 controller/__pycache__/__init__.cpython-312.pyc diff --git a/controller/__pycache__/__init__.cpython-312.pyc b/controller/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86db001da3f2d313e04a958af4e67a475e3ff880 GIT binary patch literal 161 zcmX@j%ge<81o4KMX(0MBh(HIQS%4zb87dhx8U0o=6fpsLpFwJVIV4-fgche36~|;H zrWcjQxa237=BDPA6vqS<%z27RAKJXXa&=#K-Fu iRQ}?y$<0qG%}KQ@Vg(w=2*kx8#z$sGM#ds$APWGNcPP66 literal 0 HcmV?d00001 From 0d6320c8b5b62e89b662d845e5af24c574f6b4d9 Mon Sep 17 00:00:00 2001 From: Jagruth Reddy <56351734+jagruthreddy@users.noreply.github.com> Date: Wed, 12 Jun 2024 08:07:56 -0500 Subject: [PATCH 005/124] Rename to test_Manual.py --- tests/{test_manual.py => test_Manual.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{test_manual.py => test_Manual.py} (100%) diff --git a/tests/test_manual.py b/tests/test_Manual.py similarity index 100% rename from tests/test_manual.py rename to tests/test_Manual.py From b83243a0f5139c1e602cf7447e4de4aa4a2922e1 Mon Sep 17 00:00:00 2001 From: Jagruth Reddy <56351734+jagruthreddy@users.noreply.github.com> Date: Wed, 12 Jun 2024 08:08:44 -0500 Subject: [PATCH 006/124] Delete view/__pycache__ directory No pycache --- view/__pycache__/DemoButton.cpython-311.pyc | Bin 2512 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 view/__pycache__/DemoButton.cpython-311.pyc diff --git a/view/__pycache__/DemoButton.cpython-311.pyc b/view/__pycache__/DemoButton.cpython-311.pyc deleted file mode 100644 index 0d5ad7574f309c78bf758f014e7a678f7c4a2bc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2512 zcmaJCO>Y}Tbk<*)d^jydq=6D?+Efj$l(-}*1s4!$jjEv3BqVJm%VM?O9ow6%cg^fL ziPIqUP>F&fQ6x|~aIg>xf^g^oegbzVveam$N=Tfzxk`~xPrTX9I(D6Oyngd$-rM*6 z-u@ho_8?fXZ?d^RLkRsX4*m-7BYPhK@&IW_lMGap(o!*y4itmwpd{`BMyME0hh02q zMADG}x`wpSU8IF+U^9r&7W}=H?$UzuC>Hrg9AiPJcW$<97p{~!w@jyN?v}3QDTmve zSFF_;rDBzNOmYHqJf-dna5rDv-Z?ma0fteOmNb+OXrX&3CuxDZ-RYnfyo=IsUX{{e zP#Jc5lC)@fs#0p8MILyKgvh-gC4|0{9v}|8zcvBc@(-xmLTO&2b!ijsx0*BwaX)gv zq)F>&6ZCC0b*>}XcLA-V#U@@AmUJvF&>_9|fC*%`=?2*mp9->@c(u#FZQWb7^Wz7U z#cm(}E!b|m1Qu7_it#!8y;WPgP2!ycFBhBESNr^TTX*1%`se56Xb4gnO0D%RunM_F zvqa=n>4nJlke1a_RpfRXMKEP8rcst4lciN+TZXQY;fW8gOuqfjWfDJ6uInZzs%2P= zoR4?B>k<-VrJ!?qxr3UsOg@@Zin>urkP*9}m|Pz@g3Z>~Xo5_OzKQHU^wy?CMB2loG!Gc2)(xLf?gjgo=WIUIdc9k$P zx)npun?*1@*6)Pva)~kr%d&3jT$Y(=I49yo!in0H&-02w=L?i_CK}g?81C!=F`DMh zBqkck>75c{uYy>R*9|XvGs@{w4P9NL8X%TwQk6THvx=-ial()b+0@865igKVw=AoM zV%xH83p)t8^X%8FiOda~GCOm9^qOKAias{IFgi0mmHF7DNv1E;CPGHZjGnD1CggdU z+FZCurpmlvF`ZX3Nop@~tCX3axsjPK7mE$n$9fibOmJkV{@!jVWMT%UT(SbqbdSqKLqgK9rPGS zzwFxRdV~je@Zk3Y+nCfbsbTVX;BJc8^!Nb+$PuI8ccpZ<|{AUkrMrw0-!$IUl{P$)6w0{m3 zn|#`fhknP5Ju5VuW!4ImjuWy<)O5lnNHlyi*#KB>3tI_$6(D;BKwH}U z`XoTG-vA)8c4FgLZ4lyRs8j`@FPH_L^6LI_W5Rz-w E|I%eq^Z)<= From 0743c71c1636cb790fb4480c9e5807cb1c8176ab Mon Sep 17 00:00:00 2001 From: Jagruth Reddy <56351734+jagruthreddy@users.noreply.github.com> Date: Wed, 12 Jun 2024 08:09:16 -0500 Subject: [PATCH 007/124] Delete controller/__pycache__ directory __pycache__ problem --- controller/__pycache__/AI.cpython-311.pyc | Bin 696 -> 0 bytes controller/__pycache__/Manual.cpython-311.pyc | Bin 712 -> 0 bytes controller/__pycache__/__init__.cpython-312.pyc | Bin 161 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 controller/__pycache__/AI.cpython-311.pyc delete mode 100644 controller/__pycache__/Manual.cpython-311.pyc delete mode 100644 controller/__pycache__/__init__.cpython-312.pyc diff --git a/controller/__pycache__/AI.cpython-311.pyc b/controller/__pycache__/AI.cpython-311.pyc deleted file mode 100644 index bbce00c75ab2369a2f37b22119700e4156732b45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 696 zcmZuuO=}ZD7@parxK`7XQt&jOR&q#@A_zr<#Xwnzv5?k77#Oy@6FNFOv(8LXQV@FR z(R=@aZRwwB!BfDKe;^W1J^4;H8-zN$^Ssad^}NH(d84t4U_JSEF!&1gmv^dFUyvCA za)tu5gEDlAGWC)=z>cPOCa! zUR&(hvw4sECkHdZyIMvtoCIbD-Q&kmOj4OxON6p6QBEX|XH7g=DU47KNZoQdu)dYt zUcB3;`<5F^-?w%WDHE|7@3lH{L_a9rHe$q=gtSOU9E=l1Vm0E{4K?-%7 zb>FU%oHI6AWh~d(P u_pRL~E+raXXDNFdz9|pz)~rEduKgOww1zRB1_1`yyYSn`{`@B~7yb(Z;iWnN diff --git a/controller/__pycache__/Manual.cpython-311.pyc b/controller/__pycache__/Manual.cpython-311.pyc deleted file mode 100644 index 7185bfa0b491af34c43b7478fd3f5b3ef6a59b67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 712 zcmZuuPiqrF6rb6ob}gn}1kuxgUbd1VMG!=UV4wujSV-$33=GrV2_2oCS!X6G>8Xca z1n>O@iqsEN!BfDKUmy}sJ^3b^4MKgp^WN|M`@PwHUmA@K1oH6H(eNYKU%{!Qz65gu z-~vTx7iH)iW%zT1&?THw1}KaAD5<4YAXvO~=Jx!-K&xE^tp zR<)s}wmkF4i$4EP4(5V)xr$)84a|*trw>XZk}B>Tk=l8#z2shG37)PMR%#ER?t~h; z&`z$uy?#Ltov@DXHFvpETyA#`n%z!|zR{v>r{51Cn)Y^e`xI`xTI(Vo)ztN{Ia~jE4vAa1^06Rvl_;D7DX6nZ>rxR_UAu|1@T`QU99>5 diff --git a/controller/__pycache__/__init__.cpython-312.pyc b/controller/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 86db001da3f2d313e04a958af4e67a475e3ff880..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmX@j%ge<81o4KMX(0MBh(HIQS%4zb87dhx8U0o=6fpsLpFwJVIV4-fgche36~|;H zrWcjQxa237=BDPA6vqS<%z27RAKJXXa&=#K-Fu iRQ}?y$<0qG%}KQ@Vg(w=2*kx8#z$sGM#ds$APWGNcPP66 From 7db57ade02366d54e39d72092a4e6802ab87111e Mon Sep 17 00:00:00 2001 From: Jagruth Reddy <56351734+jagruthreddy@users.noreply.github.com> Date: Wed, 12 Jun 2024 08:10:04 -0500 Subject: [PATCH 008/124] Delete icons/Original directory Unnecessary part --- icons/Original/back_icon.png | Bin 67681 -> 0 bytes icons/Original/demo_icon.png | Bin 36279 -> 0 bytes icons/Original/directories_icon.png | Bin 25732 -> 0 bytes icons/Original/folder_icon.png | Bin 14881 -> 0 bytes icons/Original/forward_icon.png | Bin 67694 -> 0 bytes icons/Original/info_icon.png | Bin 66924 -> 0 bytes icons/Original/noun-gear-45180.svg | 1 - icons/Original/noun-image-6802419.svg | 6 ------ icons/Original/noun-web-6834408.svg | 3 --- 9 files changed, 10 deletions(-) delete mode 100644 icons/Original/back_icon.png delete mode 100644 icons/Original/demo_icon.png delete mode 100644 icons/Original/directories_icon.png delete mode 100644 icons/Original/folder_icon.png delete mode 100644 icons/Original/forward_icon.png delete mode 100644 icons/Original/info_icon.png delete mode 100644 icons/Original/noun-gear-45180.svg delete mode 100644 icons/Original/noun-image-6802419.svg delete mode 100644 icons/Original/noun-web-6834408.svg diff --git a/icons/Original/back_icon.png b/icons/Original/back_icon.png deleted file mode 100644 index f6a471c376cbaa8e047b0d1e51bcbb8d11b6c07d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67681 zcmY&=cRba7|NqA*B%?@D95T{X8Ie6s6d8$@8M3lR_OXuLAVMTNL`fpE%oN$PWM%Ko z!O8r+KIgjc@Av!r<9b~8<-EshkLToN>sEV6N0xu?@MJi2|K5B;Dm^>osFoPr+8RT*~ky+{Z~8< z-=7SVA)Gyw7z7aw*6L@Q+ROQLOGwyfit;q~nIe~G2oh-%z{6+DrGy$mT)EJ@KbVAZ>$9aR zJ`4Uz#~=PcDXFE;N{tf1TcbkLWJ)g<{}m>sGI9QxBbV1FA+xq@x+DIud5jM>8{cfD zkx<&JP;g4sYaL{Cx=4%QpB{yMLVW2Ow{uxtlU1w9L=}vRj}}?X3UK@T%<2KoW{LRE$y3(?z5bR%6WU2ynrIU%*>3PSnB9b!y9CrGL7D=TaZy#5hRa14-Fg6jb3)bgsyf^Gj!n=hh0>qY_e_r?**P6&3T%TBWISe=0^zK0mDIg-)WyX^1V6yq zdq^vh9*JZE`QlIIw~%Ric(u_eB-WE7*&-lPEQR^tsq}40TW3Txt~Na&GAV!&!S|t3 z>u&IDy_+lMh3`BP1poCCj!so7NHuNAmQTzjA2vW2{(~;O{Wz5Z|If9+NcQvqM)Mhv zDi6r!CFf--#8v2KY$dl!RMJ6u#L)_+!HM;bQsv!tGAxCRNWqaPo(2w3{IVhX)6+-7 zA6SpM@N-jf-cZ^MoOfiQMTW&uk)?lQJ^t*FRHxs95C%D9;!sRiP%B1_Xj;IwRDwyE z&AJQHZnmZLBBTEx8KQa>gcH-6y>@2?<4!z+U}-Y?Is07#5yTu-nkrZSENk!l^u{a_ z^Ls=qfm3=13vvzz{w!5>wd?it*%3#Ti168iPDg1Gei@KbyC|4f=D3ZWD^eX4miSFo zF;Y>98ex78d-&h8jx}rPv(Hqyd0a=bUsd#~ytl($M)0Rml?IOn9YaLFjc84Mbif9j8>8QWH38|4d=f~h45Vgk%#HBxV>*FmX1w0g=n7P z&Yady`bv%npxQ9F9p*Hd-TF*goffhDSjb?Ob4v%Q4n{9uyLpoyVXm&#xKD;mp*JtJ z_md&aw{eGT^jQKVf)60PXNU+s>ZEIa72=4dNip_c zr)PGufh9Yz(YRMXPxBKrGD6HOO~pG(kJv;8k8|RGJp6Nhba}_gwY$p zUN-AzpTXo*oItRHXBDaN0q7r}nfJ4E`zx1}kRz6*wdsxRNj2p7Qy>v6JtPRT`}Mdb z3M5j0=EVCJm8eszSCB{y(DdVo`2?65LA{u)pmvQ6I|e}`wMHrFQ(yM`Q%Guir-)91 zBDHiPoK*(~i4Bx^Z~$p9-0Gx@e1CZG#QA^2KzF?JT?EN|O+|^!s)N2<8BG)8gW0X7 zJM1Rm?`!HT_;~^W(bR_ZXbdabR~lfY!T54qDP`p<0^=LXJ#9 zCc%eQQy}<&qj;p6A8u8>0htRM&4@=dahI3Lu)5z_A6V?NpQPk~Xng{X&x8b$dRyrL z#|(zu5QE_P_z<$x7|?r60D90-CfNB89Q5iH{3r5<3w~vWUqyNSA)Og$vf*v7MU6)u zA!`pq|C+>V%I0Rv0%TTSl})t6Q)3ZJ(r%?NCq)(y7q2@A!YTsSUI(Ybj?lDTFf*7#PBAEiSUOO@(6oDsFZ?>#iji+ z5q5kCI7B<6aNQ+cr@z*MP*q*ON+yNSK>>o+0JNW~6`dqOHzgOgR z`TeH!RO-e?lEmtVs=B`lkBrKF-)AnhNXTrpC2{zk^IRaDG^J;KGTr#A>4uAe+xIUP z!bRq)b9A5bPO$AxwH_}v=$AWFSfsJW&6+CKxu&hZ4u_vZ59ga(xpqTu(DWTLCL&eM z%5J!`{kAfeJ4>UINso}Ym?ACeZSi^KS5Ntj2t&lq0cn97dUB%aa|_~<;-W`hB4JG< zw%ewm`DB{c(bE(nsH(lfgHBYj&7a(vz-FFF{N&TYWRxP};zm4_Zlj@n{mbg_!q}$K z=?l?00#y&|qMqeEIKV|yZP^yYC??@|fRsL7GRtycPq07D3pEYQs~QZ>pZfN^M4ZfR zv$7LsL7dkd($BIe7bZ-emltBq`4#&%&^fE9iaqR}_?l0ycCn!x!N0h*Y$@fB@NVNT ztNU8pr#?|Oj_whfZnqkd3F!izd_2JQ((0f40oYF`db^2Jje-$$N$k(K(?UdUiFW=d z%YE)>_Wk|e!I`>8Ek{xt2u0lCAxY z+JqyceKj#G==56N%ie}7pM~d!bUIfm-xgoNpYq_N#nO8oMg)|AQP1zJ z;${zWrPQgjkCRa`*S^S&OL-}~(0EI{xzd84?uuNuocm|GBdO1dGpg=7?H$6?LONI$ zXw@TIFIWPN-MC%xaQ55VLO;c7vhQ*BkD9Od4V8Zw^KnRNp8eO*%g<}lhJIRzNP0tC zT?XD>enHx%NI2+Y!xg+WTgCU4wMsv~wHM;JeiuiqXPC<)160HN{mq`A>_U+{8#*lb z-+RzXfJQspP3_!%HJ0T1tEebG3*4=*O=eQ2Ut09ZTpyw`N|8ma_$~R=D{-I65z)hC zlTUQD&(DlX)xCyL={X(^CCo>UfrCDKOCizF41FUJ@hHWeGLwF2?@uY)gFzi z4s#tWM@ACYQi5FiW=Wpj?^i6@M*s0(vFfsz6p9!qo>O@WR##n`#yA}4!(#27=cS#- zlcMkBRXUCC9;Aex>hb%CmV4cAW!NP`SDo=kA`!;(--hCgL(AadkUw2X|*@4Q%Gzz2ZJnL*`t)c12PFj&&h{C$_@x0_eL_janf zdn~`I>k~P1J?bMmeZmgIrq0J*eZ3b)XIf1zr>#Spke1;l^D=?#u7q?RV; zky{!%M{P7NwchidjLnfBFh5CoXfFRelD|u)i49=DlQ$I0bhfA0e!0AoF_n|Nw_bH; zZ=y)?fuZ!SQrsCzOW)iJx2POm7NwfN#)b_l>}9Cd4pqleG2iO@xl)@<5h%YXsnhE- zdIx%t-v|9oaOdatB*u4U4g1Hf1R7J?ghN8!Yl!3Mqa0+&)r&sLG|L zKzA+Bj`2s4%eJX=6py|v6Lt?yf7l48*GEKP4$DjJt>*bY+!;RRaJWLUsf$eLh?>*~ z-}UIVShqhyUNwXdW+5jOK4nO%$s(Jo6s2(|e6ieX0zH-y+#@1fE~@Q@+d1eu-7@Z&8z%nZW8S zboG5$J*DF8I zfKyg=z-~J~A)?7(asH@9wWs$>W5=ka5q>Ey>Tv}l7T@{hQ%E>e1D1H(CR1nX5stOc zIz~67{e2K;yJN9D!UpB7<^!nXxq{e1o_o*`#e_3bvekh$C_rAb{B7`{MYvZ$))BnX&B$ z+lrlUB*`UVh?WnuFV=Rax-H&_GE4tU-i>mtR6xFF#}y>q%xXPVU(XP7#;<7q=inK` zg;Q*DB7<3%$UQ?O#|j z_S|SsZ6Z`w@Vbxbbc?RVVdQ5?#@MX3yrhHGRQ;4d@}FN)EkS9Yi+NNEdezC$Dqr(z zZ>;jx$U28}@T{trbh5;1K-5Dd`_uEA1o_3v`=}9yW8O{0+is6V#*^QMJesNsuu#DT zh69tDS7*-VEQF@`-Ep8oL=F3>9``3Gd+Wrqx#cnlEPN4f_V(t7AMK$mZ;PL7TZhh9u z)c1=dzm8{Qz4!g?Y`nbW`?pIxv49*udhN!2AHuuEp8atOan}phDPt4Hqn!&8MJiGA zqKfzi$cO5hVNTasaQs4{D!<)FuMsh!?p0e|J@k_12ap3jzoc>)YGh?tYcqon-u*e)$y+%BK(-(X`%ZwGdZLzr+{Apvcj~W{)a%; zbyrAk#;tx#*>KuxR9oG z#tVbF8sOnhH>&N3(EW|32NApD#HM?72NCrv`g4Vqu7l@79TNO@-xvR~vYJmB07$j zf#GnFrpRghCZxWwsHEb)BMQ@E$0e$s7pyK-ex6!Q8xiRWr$Mq`1lwt|>whu+9;QEa zVLhIrb!h||NN;+fC&Lt+(MiR)A2P!`G0?b&U%VNz_cvJFO(O8X((~lXzDPiu(#eQ) zHB_3oUaOqKCR3l@2V_%YiN~NVtP+{(Gxb~bPx#DI)V3n9Y`+P{_){IB#9$lDvvNBV zvYVRZXjxk%&mo*k&{fan?K0fMBz*dzU$c(}rV+w1P3r)L)WU+UyE7&CrFQu7LlVFJ zWOho7-m&kHFZaR{u|LkO zLQ=@3Z;}ZxD+0b+IvFi;}0X}H~<-PA{@utzxDyjy4g{%ye9>`^)xnPIq z3DX;mFC{b={EAw$?R=p-gBTo zoOE}X0e}cAWc3WD^etK~q^GNM&~w?kY#p)`1L0c%$Y_z38|!ta(ZqP#g?PV>%pU;K z7w2ui%>GXCv2^W0gIi3&?}T+<37-R^U`Fi#c|#Jab=bLi$ZB|HGcT=g&x6UhlQoCW4dmZ3{xPwoiE@h6AV`x+Wd?HfNF1KrI zj}Vw6a2(%0zE!YnniYER$u(H=43=QgB@Q5+(LX#Y#W>qkOHf?eH&*c=Mvhf$(Q_yv z`P5i`|9S=LlQ0{Y$@hN^o*#U~bl^=}palvi@QaaAU$=LF?7Gs9Jpz0TG^sYb&#tAO zKp}`%O^F#5t3T&_tDJk^|22%Y=!y%*NSB|FbPr(Q>_MY{yJ8B}^{YTf`v6PvJ=gg* zxx&wChyv4Rd6lSe4wfH)L`UlDrqtg}qiVSV%QOYZ8DDjaa0M0NO-$aA_W%6cZgp>b)t)Ic5UinQ|w zS+~tl-;$hj@%Q;e0}D4zO`~}F%lRVD0D< zupfY315FbR5fzGvs=wbw>gnmqe@y^bS^5&<-?m)Ua@{kCf0I`_WLXq`rvecaU>J_N zkN+wf2E3MLF=9yAlr!}7OzoTzCPV)1fKzloj$Q|m8iPoucM&$wrfAGj=U126JY<%i z`blj>j|ujJ+>O5q*u=B#&zJm4tZ@C)IrHY4|GN1|J$(eVC{q{q1XU&a>U#(7WyzpfSdueHRK~@47Ft4rtQsKj(yR z^xXS$J^6IsPv_xoA3?d@U)AkaS9f6J_oe2tjo*Wqt-%jaP5R%uVzpGyHbSL&1N_S# zd_|GEUxC`U_T|@JG`l7k$vDrqSKHt~O_q;PX)>qY()0mU5>919L#%mRxQ>o1C{#V+ zwUz-rf=w=jKv-_mv84WY;F35GM@Ya-Q>&rfnjP`K!lmY6!)=5stGuYg|w_^MO<&PpVJYusiexJj!CAt1KIT*bYomW z%aM<7Qd&jS4^pcfSa9V@6D}uJ`L$PZ~XF9%kuJhs4*ic1XCX4uO?w4iq!hS9OL(Jzh)iw z?51K$LfUvZV6b*k|F_%E{5-==s(VlSrif116`sKb9r7xg=$$jOR zg$lhalY&kHPlHMXg#k3-r95d=o<%uR)o-^Ay|;2fGsWPGsZT!G&AqoZ^z}l^dYy)Z z3f-BqWr|YH8Y)LE;krVsZN=H=XX;1iM)Lgj7+(0CdB!gY*d&`(Qs={2ksj~yT*32| zy~o3UBvhW?`8{TiUxUK%I1hm{g2Tt$-Fvz^A~dv>UcUnNNWF|M)UL!0F1ZVU`<6B^ zjZisW4qzCTC8@<~+9`A<^0<}f-#0!H+Ry5J^#K=dM;hB2-hPSV>78`KcL4ui%+l&x z8NWV^=3?kvU8OSWyYsiEV;5=xnBO$%y{X$TCq&o6o)aTf%K~sVy8^?i1+?k+n<~$2 z#l!*JS_z<9)#{5m-y44=Jy#v0cutm6Gs4Me2|8c?qCGG~twaXGt%4^2w&OZ_zP>%9 z5k=mMuTCCax}rfXk1qj>c;3!ENLbFrvDs_4`QO?%-@kRifi7j`=^02$c(f4Qo^|zW zFUt0LHg%d|!yu4j{*bR_gDyG zLM$i*5^G-KE?}KvYAE{Elq-l%B`Q(W#}e$oQbD*b9$IUzpr3!@aBP60@9q3uB2iNJ z9hfK-5BjJ?Bx`~B#dSVfS+@|zSTFrqtN*K9mBV0t9sy<7NVf7C z4W+2PR%aAySV_A6*J8ZWp5T~#(J49%YjEw<+Zv~6{K}^CEm2`-zp?3;I+qYP^r!bl zvyk@ej3f1ZyC@znb@nIMfeh^Q<%&#w4u;CYoYlbeZ97mQa;c;5qU*9?tncbPB+fjc z`?J}k;Dhz2kxLy8;^^)NEct#{Wj!Q=s&@2_GU%JM#V&lw{gmta>i#XkuMGSWHB`(m z+XHc4s4dmRxsf7O_nrT%`5MwfAy^m#3#IS0b-i)Tho z3UtSi!)qDNJiV;K#I4RydEp6&-9DF};*R)Y{i)?rvB2C@bV({TbIPp;zy{39n1g^i zEn|8FVOG)e-qRNMeq#y+^pcV+5Ct8QCIaMe$=Vf}4>6&Ui=^*E$}5ttJUjSACU0yj zjcj%({18+%u%_c}LkznPfh6@K8WFvnCmtkKzUBzRpperK;WVoCh`))2)grL^1gv%& zdU`|K*U_cQK^A-^v;Dv3@V-mC`{gplL%=j8kD||cBzOp^EYJcOdG1M9$maVMlY!#Q z#|Xz<9sMBW(Xp{X|04N3m}BNm{X++ZB1t<)SHtl03K|i^*x1zIXHG(DY^BezvQIyQ zyu(v?mr^}*ZdQ>Gu|btj2PE7@ zYuCMpZKf-^BO;HvfQG~&v=VUmuw(l`e@>L?H4AgHVjw8^GAOt)J#YRQ7`z%3x`@!h zxFYrN{i!F?QE2afyohrLe~{4|OF=E09ZV?v8S8W7Hk@v92j-;4iIv2fJ1fpT1H)=& z-2uxK=(O0C4@5w}fnhKj+#Rfhbf?-3$MRW1Gw=dJob%QbJw{&?JxhHCcYlpm-elP8 z@!PHcgqEp7#-QScct}{q=f6~-fLU}#AA~X}&9l>4$DT2MWw+2M8rU4|LhFvD!ebC% zj}?LMuV*s&nKVLYq#>^T4lKfzlZcmkEc{0PZLYY(JFbPb((PVloR`VIEd@wCJN!nA zzFwJo!-Yy)r6L;n)H<+QDg}mjXJO$~*#asy)lCqr^?YA(YooZf@7*P;pL{!bwxizI zaIoGtg>9yDPjBcK!PB$sbTk8QI~c@G@1`~avD`o`*w|0P`ti!4FF8{Hn!r(X1x^hY z0&()$7e}bN@xv6>5VeIDlEsYp)KVajVtwDg`ck@S)8p5d*OvVz0zkIh?^4cE41&@g@5kR#g# z-gqEbVN&L)P_ti|lX!QTNOlK=`_B)Bh$OBc`ZcrHopKR*i+lD%Q1;8i>n-Gv#eZ}? z*S&rD*eQCh_b}DYxc~JVwVZKO5XbG>56Ki+mHGQ`&nnhFcn`HR!rTo#V}W_^LK4U) zprUs&beRI3>qo=G1Cmo2UnG?^P;Wlw0=H&1vT5qBad=;9x&>W$1z$Ap4xZ+ycQvJX zn)2tF{DH&q{Jii|0co)si_$;%BKg*VuM97d8Y*?jcMYm)%}c%;&;KO<79_wL%bPiq z0*kwS>nR&^a(r`W(f9InSkf>BA7|am5RROdXOA^aAl7Me^c1_^tt?ypq}mpLeuOFv zGH>14y3z|lAO8%zq$b@rAtG+Iv^)1AC28d z3kjfDpI34}#}J!b^h?Mo$W(M}vbR zjl-KEl3oW(?LRLE()1++W6sbq`a%^n#fTHq+N>bDOi(Fry0dY@+OeNfnG@Y{ayyUD zmbB{6Ho2$=EmJ622_N=|uv1{Do0}8#uF{?chpD~-1pC> z>Zr=~!-RKfOe*q)?xGQOuuZPBpK1HSNj5nB=SS@Dq$>o_+5LMk&5M2*&)WtBIViiSm7fu)UZ>V{0AN4jA~;Cun;?w(R}8O8K`nBYyM`(=Hkd8NEekQmf=HDbGPtN)j8kf&#F(ge#3*lLb)PtyD_P)iSkZYz)ovB0dU#HG) z{--R0*H!F};e_rQ`HgH>C_q+6*zBg~mygZx1`tmB*BhUTePD!ybTWEtN(tAA5_Fa( z%3>fzID~S1!O=I1orevpr|INTXD4um)vmIRiBY7VPyGD)wn^AY1!@LQR{>r+*~S0k zzMOIYYsa}^^|9c-39Ky|%a;Mb>j`4q>v-yXmPE)C1!4{5zzd$o3kD) zPq=wF2~0x&`_XD>?8R8VQ5Luy68zEj*G}Ub^Agu$cy?hN_LJltdZN%NUKgyB5DALh z3oP%qaTd0kUYVFGW}v4_iMQ8;jm!-L85NuU35$src8tSN=?7s%&rM9m)M%tp#hpg| zF7-#JbIVNcB*9xG>@x0{x&B7*eM_kThF5yfHfWa)oO2c?k^9PjInYTj+2=m%t7o^g zQG^tY3WhJAdah3I)#M7wT|iwv)$0FhJfcxYCXuJ%VD#&FYB@_);kqKOpe4_H0!pYG zU_V*g#Y+)$Pxf3t?kl83!m~eGvcS#oOy_Fxo1PKZGR8EN{T2;kjl|#!o(3_+bbu)> z|Iy{@;xL~y2t!L-d;z1c5WNpq&?T6Y2#Y=eN#A-byr^Z-`rUiGI%2CB0`|!m3p|@23+LoM)c^oce)=YbQN! zTpNx zq)8Y&u5Cd@f8xKPxct-rl!O&Ke^~EUC*Qsl3au?|8It}7MT11xNSTmyuC^liivmTf(Cx` zQv_k-n=hsnjx|0SgfR#xa6WXop6crB=EO~sqhr@I;+Q){I+Yp^WN7QS{Ud#532q9w z==>j2f1cSHJ}Om^b3Rf(fZ?IwIgz39Oo^U2->so-k|;HOzA^~h_YBkOp(^7ga`qHl zblzv2knLnJ+L!yCHI7Q#`UO zKjhYbDxJ|2*g;|^5_2+c;G)M|d1jX^&D08L|My<%h^=>|xO6Z_7$1ok@BF_tS8Z>( zX>d@>{Rn3ryK6rA-(QaUI+C#iE;*kF@6RG>Nq**4evtd$vmHQGoVzA#cWcw0Q({C7 ziua0J)Pzp&w)2qA-BGKJfZoUBY-^ERU1`m2OXi75(c8rv#a)ljDP^Q7Z>2S0QCYF- z>A#`(ovU;0It~*klf*fAI6W_XY__G2D*R1PpgT4CxkIW4|B@45Xj;f?zzoWk{!n-@sQ?n|| zmj}(~?5sNb?{8&bLP$kgCWaDj67?6|Ar4I+= zAQ_0`WLcm4PM1OHtwo}##fE2R`CC|lR9$H=Hv3Wym1|m0;1R27SmbF#R5#%VirNP{ zm&YK>8xdiURXioUm6@!-}|q!otZZ&FsQ;;USkVs7rcnysx<_B3vh{ zVemWzZb|55AV>I8&&3~sav+=@v1I!nv#Q{aCzbF**>CQ4W!yCh!^u)dR2E1dl0}Ah zVq0EeU+5 zAL6znss^(TAd&9+M&3A_*IeN(2n&^8O`os({99maUJ#SZe*ABgQ7;+jT>nX^Rqvfb z5bn;@vDh5HoYjsTmgEy^)xw5WoCQ@&01|r9yX}3Ps&=^yFUht4rxpMx)`R7@5cw?nkiM=YO;%&qTLF*?d@Xzxws z8NU1sWAB#}1}sRVI0za=V-K~xg{P!&*Z@H2b_Elz=q&#~RnG4XBsB)6p}{as_cMX9 zdMr#)%7_<#z|`~E0z9b*I}@?Exh4W{M9}dTN2RBt^48zSopZEY?>jaxU!s=Fe#bgC z$@rD;)&)T@GxJ!M=R<$}BkuYx%`zD2E-gIEXM-^uk)dj@N1WsDM3qY)Iea)_Y~T53 zyZX9&D~m6q!fya=4+R<*P-1Rh*Hd6tAjUtA)y66B$jfeDn}7l1`R(%ve;ncXjM2{U zyG8&OE_Ao~%S-O9=2Q8u+<=KAlG=e{7&1^E`^x)wlimZ+@F^}|zGGIwF~g=;@;LSu z8*X5Co*Tsm++f;_E%Uy=(&B?ofL6=xJ;H(!O5{i29p~elz6)D7wtWuVOt}_imZc)3 z6~OTBblpo9hFtNM)vdL`p$U_(_A4E;8|F=zbFhevCU6r-Dbk~aNha#2V z#fc7Ww=>^~Mu!p6gm5+c6XmXdZVsl&#PT%sb>8r&IpQsJ7T~Ae$LCbMRY+qaxOt}z zo2n-kUBzY=crJ|{YA3^o5GUzUJhwj`&vbWy*GNrrlyx_N20+#Iy>hPSC;qoN z+CF#?$&7UKd_QNX`%cj7a1y)Rdb>ZS1fB{av$^Oyff9QIaUZB|KM9r)#(%y7*fqw7 zF)U&@kOl@mFu%Q6^AN4Mcb4RLs~Y7FBC4FScIz!KQgRLYf9duKs(g~V&Q*! zNN{YQOW2V86YmQhVs_krOM88y7ET`uZ-WgkA-4bqm`|WZV{)mUJ#He}w`=V`7A3e) zVo1gx3RN`w4uEe?#jdJN$C7u%J4e?9X zOvuG(WgF*6F&2lk&&#>D&^bY~`-WEb4=N{ugAZXXt5cKz#{L%w$Qz)GHMAq@5sCX# zJWt!}r~+j1lG0|x+ZVUCxYEyTvc)PG_U<5#vA7V76`2flGu~(; zNeF+D9Ib5-H5@415Y;WMp5xugz(fjx5ZbWLOgQxc)F$}Ri_9&F%>=Yvr3%qV@bq*w zGinc^J?ibKq8l)a;p25VU&&FqGvIdSJYuN_VdN{cVY)|f>IQlql>k1xaEV2b^=0VP z#{bP-F@0$0H^-14=OY@Qcaw0sBR3NonkTcL^oNkZ480f9a+X#WmuELOPxuxsa>is$Y%T-Z*|&cK`|iL2|{ zw6M627< zsb^_qt#eS512BAX{22Jd{<_ir$~=JCA%=z;hAS{SYi)X*^H5cu$JS@XDv5)1lTSv{ zS;#zccS5SP5l&1s1~0nui8wU4=Z28C$G{sJ8it|r zv>Ve}m`#DQiCj@j_~I-ModUYcZ(qw>PA^O>AH7G3NsM69=8g8{CpNAP&Ar==7WLq-Bhi*_vY*!vnS-iB~`B|{8^!2JB=k4i5=Ia+B4qjROv<&4O1v5`eboz3~)ZYJSw) zcSPbzWwI1f1ctl)z1VBylr6OuIFjZJ(;fY|Y%*YiuU76hkG?OZX9Y zqg7w;?Dk;x1VH^^$x#5~7ZJGbWb)lR`MNOE|Mn;v~wR#T)X85f^Oa zW!Dy*R<(%nISilwKoZFiSrEUpf3t6X{EjD$oNDXioK+RSf*XFFf+&3gR@3=_Targ4 z>N&56#sC&U7rl}2kF;PW{h7Q*wPh_6&~?N`XXF*k=JxlNcY9L)rRt`eAqe(G%y9Yu z5Oc(Q5)tK2Qx5~TJ=mmN^#aU^=OK0*_uPtlc1dJ073jOz>bR9W4_Z8z_ROqoF z2-PZL1%w;^lQqilb?k#Jzm11l7WCLp=-mHGnsUCk?c(XG23VX3i$BAMJjJk>sYY26 z?EN%ab^Rkkl^TyqVAFRcFz0B5-g!0Y$)XoN2NA4X#%>nOhgR4oK3&*WkbrN(_~Xy_ zmZ#4<^FJk=S%FdKgm?&4b|42pgnA7NJ>XTQ_g(Fa>GP)Wq+nEVLq^QweC48K;9iC^oj%TgQppSf`az?*I>y~M8_<|XmX{S!HY5iS;cLjPCRqX}D(>Iw_Ry1Ev ze|P%vO%TWBiTUHz>MV!B?)Q#6`%T^K_Ni=J+B{c5&CBQ=Gclr+o}WfI9WyE-C@<+^ zzg2F}fLLFi)?z5htz5h|1D^(Uc3_n9{*ES3g`84x3M>ByKb+1eqB805!Z7rvH^hR# zl{ohqS0t4qh+}<);e+1P8Wj>5!@j$n=ea>#q{+G&Lo_B9cRtm0m-C3JeUzi{&FI&V zWMw~SAH7J>Mq2xx7LE?V6L#XNwlNMER(8jW=6?;SN6<|V0wTzR7)KxF=&R)^(u@ku z5Su;|q>#v}7wk=JLquZL5nOk(a_qgb4+KE+X5w*PxbJ>{{&qj|!F*py^$4etvla;Y zD9raVvnP#mC2nmBS1HTtryFNTi>$IJMw}6IVAty}Q=QgQoRiA?r-Bl}2GqUb`@%8f ziEHm=Hdmvr`H}PLsCV~JkD4I%?C8Z0{zBH@jv=~CxbC6P69Ehe=XKfIioqeN&mt1Z zuVrjIJZ0g^^FhnT>H;K+4I@g!a!`uJ(SB%Q4Jk{)w`_8{z$vBdabCWyI=U+prF zbAi3#9(l=%#TW*C-oBBy`!^D$c{+Jr{JMEV40j!(JbiQ5JAUPnS)?AC*kJ5i6SsWRCy+#G%`#_2LyN#PUko_fj z5S z-eM3ram0JPNn!2P_OFhlk>TH|N3;>M2_s*^1}9k2VkfVVM<%f12Ff<-Y)-*cf%h?YBWA|4&nNMsj&$Ua8f6OwYWGWQ z;oGWtib+1^L(gg?&J>^?!+?4W@7#&Sg=gGN6*Sfkiqs<`olhfaYm|MPqjT~h#Xav=w;4~6ahhlN_aoX>U$(#a@{#=rL19f_li7ut zV@h$yxjtap*PoM#>xvvvDD7joQ}Nw1(n-J!!WpN}Iq6s$ICR)&bb2*!(eM71d)7<- z@vf9S>dVg=Xj^Q~xB7>zajNA}ATv+X>X{NspxZ}=p*HZ$&3RC&Z8h6QF$=H5%{YS` z_0^9;EV#EG+_lu~f4+hq$#4)O=%8T-0F>h^*V?+coiZegig|;UQ@J(bhPfFcUKrw~ zyoe4EtfsKBhEzx=>I(R>6A7>8x6oJ|le58*ta}3+K#6%w%jJEM?-6+XhtYw0aBw99 zvPcp(*4*}NZ?|WDddN?y*V;}oz2o;?+>x8S#A_+`5wE0#q?TI;>QSreL#^tg5Go_J zu<~~m@RdP0_`=nIh@fCbj${@3w`pzb-d^ox zi^*E67w_Imj9PP&yr95dr|8W}RtnJt1tqJ$t{>iXllSu83_AL&kAf@ci>jc4H6>;S zXUiv?VSx+r3NIz+v=SzG>^$2(BUf%_l@$$dwso)#TB97GKwa`Z z<0CkRR^l8H6&I zlaJm0(=H{$pM4>W0ZA>78ND;6<}#0`J_`fV%~8Bk$NQGUjXa^%cN_4!*x()ro0E9$ z8uduc%fqpTp;8w|58-bQe%gEUxPCv*&y|GKKW+Pw)Aw|9-^GUqyZro7JWuHaNb^JI({_P?h>cI}t*X+o=ci%N+KU3HdW(0i$U_oS~bCy0q=tIt2~&$BMY?9AWmD=NzUI5;qh z__KWqSIAEu`Ru>J0zNX%u(ICTSyjd*yUD+;RNt|ps8LR6=JC;g;=OWduLheobXxl>yNl)1s3cY>Q7dz8da+z`B2;020f z8{{wW5iJAbgB%o{1j{FVm%{h|XhU+k7KqAa)!BZ_8+s7pxy`uQvu-}r@_N^nJ2?J~ zUs?mJsU69Wo>PSwuuxQB8jr5OxY1c%;|eM3*~jGKV8#!iid+y#e!SU@66J70a94QV zf}ayw!?YWMwF7dDdX(AX^W-dL&`zerX+Qm$tCq)VlxbUdaDN6atp$r$ic73-5T2l} zy4@VY0TmOfO-^UiThaH1WOimBIlt$vgZ)B^jJ{}C znya41N9SVxU3p}XW1UH#-p_s0efKa~yBKP|*?A;4U-=dFA%exRtJu}WtGiiyV}Vsh z+^6yrN-}ATl3fBxh2%4)ACf#Gh!B%M{-(rS08oupv9GVHJ%Dg{Q>@b2y9ClpVK6F{ z#^s`2L5XoNQM z81q_G{2A?4_w?Fw{tt_&FI3jMr)k$vy??t~i^^l}d;8dm^kNEeIVw}>0y%s!0iooJ zJ7GzFtlVab>>lQ+@^U_r$Nkb#ecBYMtucl;2&Q@ven|z(D!f(Ht%OG)s3*G?X7s1~n%La86-HxqVJwLOF|kX%>n*i;&teQi**e$ruTf&2s+nkW=VuBPv!D@L zPYsRcSNbE$f4LgFU@y$p%Z^{=BdmYwA-K3W(16{Xh()g0b^8`$BAXU}g`3|Akh8NZdozra`fe zRquQUZheRxPB%fR6cCk{5VK5^L@tmovX3buGy3MLZ8L-A8{|?N3s15A(`Y0wNAgZ)8I*CbK+%I*}$XY@CYb3d#Y$7lGZ8)ui3$#Yn#vl}^iO z2y6ZBd$f6`t1?v^i6MN=!?~f)-QNW}OjTtRV&RPW&Y9{enSe z7kG{3V~L+vGHtlsd}MTRM_3e=^Rb|&vEH#SXAXYN&T=HnjzMkHGF0LxkA`@fSlAam zq^AC>N}n~SfcIACkl(%{%9J(9=G-n0X51AEVjOsye5R(Jyt(;Kbm32|0TG%$?+2(A zNukD;IymYQEiv)!a(BoJ+BF`c&PzLywVyw93<%7}{e&m8?mt4@IG5W7!e!W++zJJ`U61-=UEV zA0wN;N##SIEjGXPlDno}rnyJ}s{R8Jl2~5^pZa%gy zF>z;zFENkxCPx*r(~1_ z$g#IjYsYHPMXj@#Rc$?1(@EKd!zz zkm@)3|4KzEl%g^&Ny@D3b&WnnL!=~Sj|dsr`%0yfl~A^1#0MGKv&i0i&+K*0YyZys zO`q@g`|H2l=f3aroada^Ip=lG^Sn3Iq1Q=|{f_h+#O5WHtv@rVf40WZ4Jz%&T1I!X zS~?FdiFt-1zJ`JwVnNLF)gPq11&ncDd<%Hgu|emF+3!EwKV4;W_ET#EchwikLGoP@ z-BQXS{*T$D?b>ZGJeGN-=Pm3rM+}k;vW2!Mcwp9CXr({ie@0eg>Rt2QiarQ#l6^d> zoz#BTgl3R^D3BT*x#hT%s}O^Eh}QHJWfi8k+&1*#sv)>cr99>-T~!annFb)C3}Eo= zH)iB*sgPh8FZwRe+}gS2XCU=Yby$haek|SP<{1`ZMGxJoxGj>gUvfnQgOsGA%1=-< zj?84*4l(O~`8%ipV4seOQPb&tmv}EPWn0d8wa1?Udp95}KbSXc zs+P7YMXnvK>%?19UZ!dkp0m5d0vIhcU6Q&n{X6NXzh|H9yafr%%Z`~;mK+M*y29L@ zSKtIOH6DnbUXbtcqPHCpB~D8Sr{}tze&Ivm@2hWOVwCpZ_SS@<0|OXyel+N}mpdN9 z^|3>2-}5@6<=SOl#1B`rEUo=XI9U7#^5-^i?QPO1@FWNeu+3I2AFK%XSnIzwPmu0o zKHWS+Qmj_{lIbe;ac6ImA!u0TbXC%;qkNnU@7k%I^4n`xHprB6&yS9AZrB`|T)_-H ze{$95M_8g20-|Nj%XjISCL>sgcD$AiSK8?A2qEq^&V~dzfB@i3<~%W1v=b#P|LWgo zpY5}Y>|Xe+et4rl{kA}IoU`B{MlBdw%fQb%`G~pqd6og}j^G&auLp(=pzo&6q=@}$ zYWFZ=L7|KoIusMLGqS~0+GSU8r)9Epm(G&oT&`!y{tvrt7q(ek zVeE+r{GZzpoYV2qJ6Lh4=BoL@YIzjeWw}j0*>@B@EF;76J)XtN4JbXtz~1e4sc30i zIk(6(s$=0(Fx?d-V0s7v91-o@DE>LI9{+0N3DY|7hk;-D=_Zhf{FWU3LAu)$f*(ab z*1@jxiW13L#D&xUgdcH!I;YtU8|2snn2pF&>HzW!sZ?7*eT1lP)_WkF`HmZT5*Xq) z$F_cc!dkavE82Q-|0;+m_X*QB@14{VS)j14M_U;03;MZl9Conxf7~?wF#PI)5?O64 zN4=Y{-Z``l;h}ggE-fpjlx^(VK`gj2davK4htv*JM1onVqQWhUnTn=;XT0yikKyQ! zXDc~V6miy$n0ZQclE&lf6@Bh}wV1LC0>n$B9QP1A1&Jd7hT;A?#pSg-eG()0@ z`e3PziS-JN%Z|AH*mDY5WKx~z)FvPY|B*~Bb8NN3^AL_ppgzcy3jZ8&T9~HedARV| zUV-U{X>7#!)4fcm-%X^#rwjkb!lWDu?MIa3KBRE-<$X6!dNc4#Y0>HPX>!Hz&kefc zx}14=jFPp&mqa67Ak8KJ9aop^f>4t`Y9Gu5g$6YtTMGKlT6YAA_t-ukm1wg`Zkmw3 z$JD!A(=b;+==Z9I`vk8okZst6DtDW-ZoA|Rxa*af`Uvwi93uHBJua;bTMN!XAbRXY z@IFlOStL(yTJ}py{v6ivLwN(4kod$3=7MK~djdr8gzB(RhAj3Y7z}Nr5asrK#`=@Q zw%UDcR!-w96%C798|)xS^tpYEh`oFA;!IljdJ>!Lb5rVW)fqE7Jv0jE<=aP6WsZc+ zyk>o(7nUMX6*2VTo!K(ZTV7D^wotL2BR0(VMG4bisv}3%W=(h1r+hBkRY!g-!PG;Z zkLRQV!zo6^#}IV=<57NRa=oHGGq(`VBvh{b+Ty(}auV+la#TVzkV~M=_kgEZ32t%0 z-#ut@=~P7UeJ%Kso~w=C*kysbrq{rpSvzU}IEn+e4Gba*X-XP4-BdDr=t?ygNC=rY#EMaeE@#d&YcLuVxS zJd%PjiB~D9Fb0LTgQ;Y8k55h0duZ6`?u(2yRdo()aF4AOT6z=P7f#6mpp`^GBKr&0 zf%~za<7WidbKmh{bUD-<7%`J5_2;y`q9E{+iC-5wy@6nOq`>I7byyv%nhOotsdsqe zZA!{(NP2^dV=hrCFs(O6I*_y|9FfR;miu@>`reRm%?=Udh8VD1H{v4dSLY(kZ>uIK zx63k$;Q#{8#}@aC5o}c;kHF_119_cta9U}dp&`}IaAeV(P2yv3rB8yFc(NVV;5gcn@e2glhG?RL#Q^@@m;umd znYsC&9vuK|IptsiAo|Gzy#C_3^Kf6AM7+#Nba70sR`VXtHzQ)mrWRx-ZGNd{$v#0G z@Y&d62qq(WK-#;>wwSohbM;MIiOyqAU!ft(I=ay=k|!nZ#Li5|RNSo;5-D|rF}*57 z70iZkR}RGAQ9;(uBXP!05|maZTM(<`gFJceYZ3BX$~}Ow_{7gzM?wo)FC~%BZ*H!x zIbUP>8d$Dxt!-<^H#_~p%5TE68IcJyxUK;KbQGC(OL>-~t(S1!wD=`H^^3-Ew;|Bg zfS*YKah4~V`w*SeD8MYhd4)zCCa@VVC8Glz~{q}fENf#PR{vI6h^R+ovydI*b5)QYL~u;H*|98@AW|r=^N4scPNc%xz%gJ6awRlw}4V8ZD4{Z`nx7$-zbxEb$xmO`T$pE0DAAQxfpxUQ&eLv z2{^mh_pGWou`GO;$xaMKHF}iS(N;b{1MYb1`EDdXTpf}{d04^_O{G6AmwRZOR(U^d zQcd`B0Gsj8ZAMu(Y-(;wVdNs?enMy061-Ft%)pZ zD@!*e;sGaq=`Z=G#?{i%qBks=zgg~#?B2jup~d(g+_lOo1fO!$t&$nBojl4H@2VNO z*iDZ>mm0^^ES4=@vOMhVSJFR1`25V$xy zaa><$mZMzgQ_SdT`$E^9(v~HAp(f06>*~oV02g^AXQ(NM6(ALt;6H4M7jKIk#Qs*( zA3^j?10otF>-zPO^ElUyIA8{X(IlOAsNQ>891coVCa|z14*dF*m=BO{c;sc{EV8^W zVCdaeS;g+LrTxoP`SZ)i5No-lxu-5krfU^OJ<6tx=+6K`X0|XeOT*b1>Z?BWg}KgW zGvhfgfYYSz2Pgame&orSd!{8GmsLK0hk^1i@Dja4$1s2{|L}y6tvsjJgS4l&E6yX~ z2XA07=~r2RBs76iM%^v|k;5o!h=q!XwbLoffMd66N#G8LU0aJZ0x>(>Ly>&{w5+N3i~;Tq|%6&Ka5D_`$J&KxZ?tj=$RMc zf`mTq{ru5gag?u!kFAQrsCcA62rSb{5o~3DiUJN@s{)gQ{ufASGC~^MInW<|u%6B; z#w}7WyD*&md>k1><2+~;E%`pT@nFMscqSStJ(>yd_vlxBen;>_p;^S$dF>kI^Wox4 z(IrjBmo$^1?y^jjOFb6bubL{sRz9 zEfG>k6r?k%u~-LvHA1?DCi&pxeO|$3Z}`>~!cei>YYLe1ORc;JlO?fXCV*))cn)4+u%Gj=s#n#&#O>sy}_lh+T2iWA6LM{?EwZ z6x5rFb#nBVt-=1$oZ0&UhetGi-5Oh{zD7jJV~*%=Ikx; zo}eb>*fs*_=)obSC<#{f_c{CG;g~B&X~S@OifP2Dkl+kHVCX9P>IQXt?_8$h+sO0x zeKb$d+SgvJ@3d3er!BBAJ`lbDG4Q?Sv4S7~(noJ1%rqE;2QDr8-qyW(1tO`o)yFj1 zCwPW=`+KZ4yf6vixKL*tnT)7mcB1$=F&hI~OkJ*a^yS?deay+fB33l8nBMMa`O0^v z|MlmC9+|f;66K7h#OPK=qOht)l!|^HriHe0e~sx-_*}o_U}U;)sj~|swx$|3Juu;v z)Z$(wa`$F164S$xP@o!K%rW)PxJ`?nvxq2Sbu<3dyV4g>9Akcn@U{sNYb$xA2q?w; zG@+NqXU5+2l@5?OY@Zlyk+Q(zoo?rgYU&(}keyzcrz?<9QpTT$AmZok@hIf1?}aKP zh6}S>e{zPgiz8s*my6GlQq+;`JeBF66yBag5T;fX1{L#y4wAf+NopC z&uuP@n8yhbTd~uBjD#Kk@D!OwFiP2;vJLRd6cmTS=TiTKc{*AQNa-4_=ZA1(76JWH zvT_eUBtQCPvy8T2R%R#D)dWagR~ zwyzqPf-ZgvLAo8B>`~&S7OC%H)WR)PR1F^wUll{cl6&O(Il%d$y#U3ZIPulMy$##; zNT$YG1{CqBeoy^&1KI9k2IR*dL(Y*kEYp1&5mGj3H0f_O61CqZuuzeA8d z`iC7owPC3Tv+4Rkn!!iRPVwpw5g~f^g-cuS%NG8d)5IeYqZSjgV3878v8)_ETSx;Q zC#YfQkeCz+SMaa+W;rOHsoFOtdsA&l9H%Q+^HK;?SBEr&2MO)bWV!b3aPp7==Z8!d zNIhEVI+6#jmdg&o;IpK#!s*QlPHFpUX|-vRhSkSJq#nR?T+Ae8AXzwn{i2Ph<3eod^$hy z5TM&`eALkcVl9*-ZV;_6%-Q(#oIQyXc)Ua&#rYBiAbkZ<7j_N*0ZL1CKZG=f<)!$L z1ZXH-a(xs<11aNaCXqs=Z~pCRPLcX0<+p>ITNCEWHzg36cj7;QZ9~C=se7?!0jU^V zfCx&;_&sbTquAVyM_Vs|6Pa*K-6__B8C9{t?x#n2Ab^q4r@6F}UGzCKP=7xoH<$YW ztA&_{k2Sc<$lGYZfX~U<3ih$t9F^>N{!b2O(io~_by!NKN2}X(cIH+CVVAoxo_}Q7 zsUlS1Y+CwQbb9*Ya@qFvq$9Xlk>~~ zQcsos!USZObe8N;xENtI_2}(#GR5~u<`a?kr=83U^6jDx!*^f+THCm^=_*@MnKoWC zenIQ49Ub3BycqVTB|MGkEWgTdecz2k5^b&m{M-loAx1gJmFWx_Ut}TL_~Efb)CBW3ygu!XIFS*vd+qh= zI|xxqT;$%-9zjYa!b|3@maUymRbG-HR8J)O{@($NF&K_v-+Y8sLF4N;Ti?BOF?lyR-f)2CL z33V-W)QlJf)3GSHvd@}j59NV=QeVYxPwrTZB8^vyPM4W2AsaKPaqXf_ve3DV z_^ET#Wp1P~L6~?yVV~8#LU3>+-5m-Lft_r*N8rE2)gn6s0|wWV*tC5MCsygp>mAPB znwS2eaY~pN`(d9o|FW9TR@4&d15ek#zx# zURxKsiWEJY+7(UaL`6gjlc9iZk1&3~Q9z8adK{|FOQ`|9y{_wT6+FO0#VPvwIY*QB z)^R@dydq+hill8fJL;lzX`nt`@i%+=ltRU;+O-DiqQ7)f@0`mhbb(pxO;p7p7?4S~ zK?VIZq|BOo`w@BCVyP9WA?q!j92xX*_gH68PD`64e(z`11^|6Jw=Zp}b7#Vp@uWio z7vkTQ(HasgDsi6l%6wJjuX}YDRpH37ii)#E0F)T$?2TJBgN#Z;ButkuBJULLZLR;< zS>*7L-E{;)nrk#g6eO7V(ylt?b|l^?fxzRgqFhHRVbHid_B`X=Tn@9Z58orn*723e zN>(T?V=90W9BRJr?fnE?W2!_wa(`ZY3!+I#1r*M+H$ADBZQ`guLCcDS@!GscnHZo} zBc-v&xE1S6B2AVsZsliji4f!6v@~*@mD4#B@P=DVQi6NKq&UeXnV(5AiFOUX`4CVR zpUCYwFYryuWb8^aL&d8-bvI-iB>OrAC@$)V`_Ot)CZ2yYo}U=MJ`~?ZMMkxJ@uF`o z;5R%`1~5lT44$Ztl9u9?H-(VNJp+vuS9Umx&j2U+w)XKWCjJ>HcG4rJ-oSHt({3ct z6?aN<7&Bo9elBuY?m<(Dhqup5MtW>vCPWAm!6?ao+@ay4tgQs!QrK|bOvXM;WKx?| z@}zf!1zgACjUtq{-ULx=d&q?fe;>T+%_9;vOLMC@c$>;00$-h(S*~NnQ>iluwJ=K& z7j`|EqnA-b6^t)Cx6#lfesbzA_l5-eO~m`)Pn6v)MB9~w8RUL}%B?t^<9Mm4s(UQ} z;Xl}FT&S3@fl47=49xngX2d_qps-`_nMq(^Qri2dDuiBn**Qn@_4-~IIx?_RI8&(A zPnHoOfxSWFbjfzb5%VoayEPcx&QLQ{2Kaz2pf5^a{D#&7MUXy~u!x;Mu7fu$4f#O$ zfqL`WEy`b}S20S*cggv)+tK|c-}gX|5^0;`JPR*`A$C;Fnr`4Cx2D(R+LDyjAF}P4 z-+021@m&dIosdh^uS|CcrUblwb@D0nJV|5YS*EI(I6|1z(ul!>mKLJ(DCq-nw z`}T4SMKYhBg?g|27lP}AhDOR|g$Hc@F$sqe<7{zjbZfeWIS0`d8iKZzfzDpnkfw(k zh9;dP+^1MV7PN{edDZ?5|2+kZ4^ePl3c}?>x4_upXH8JMSbBPsgV>?e*dC>WX!gB( zk?KfG2Lx2LlN9LL=axGtvMKD$N1U=h@N5Cm@>bl904`xOq&7FcBG*ya=r#+?NJhED zlvywm%&8zQhM|*arn&wbX*j@(=0bAZi}G} zHEY9jph7bzOkH;%wso9Fve)@MIA9^VQ4c>qxsDeU##tD-=dveG)JV_Y)peBJU|wSZBAa+cWV>5BxwHXIr}$>=wvQIg`ga(Vx3*l zC0!A5uA@AQVdf0Ub(vka4pR}~H}v!OAD#kJ3J{Y3p6Gy2o>45~3gVIQfv4bL@eq)H zz_KKrkSx6*3>3MmOK&YJ<zEK^Fz0a*!n6(y`ji6=;bm^p3c_!!8X<) zYW6%3YF$$}sb?a`I!Yy@0jZ|Gz2ZX& z^#>%llXG*0b0#8)TUbj;&ME1X_GFlsvi~4MPEmDsKUP4Oi4jp1Ve||_U%4c5_bt4 z?1%};ZOf}CZyK52uUdVtsbjHZ3#|kKes|+ z%3%WmEy7xl@4tDp&$TIz;_?q2*P~?ou9zMr8_JUS=0EWAW$-*qf>-M$_#OR4N%iR0 zR_nPRPg<18wWSYHc-AwBYO$a$PkPdZk}iNh}ITJMr=86qa^$ggIV*0qgV5PBhwPOAagu65rrppMG&+8_FM4iGL zOOl1C)EGhmAr0z5Y>BQdTNKWeRJ0KX#^4=WAFGBKwUTF5U7JhicB;(yAtPno?ps5m zu7f`fvt&L{IKsI#wXI*t5t38$kpevi@=ZhDxrbRw^O_xB(2RchYr8ii?|# zA;DD0Pj_fS&~NEZE6gw0ky2Ord6hhEt&c0h_ST^!3s8#~B~s`BK^Th3fwk?e@VW8f)X-BBRd*64ic?Q`ah0+07DUxBB95D?7Kn$YiEVERi0RyPm0Ef*>XqVFX6w&%Uxsk3E$8 z3>U;dHo*EavYYj8`EL)l?P5o?Bw3WX9c!u_b^321&}a-P+2~ioJVPLL3}1b&sikdm zghBX=Ri!GlFhF-Z<@=**i2g*pjVgyq1i#M*s6@o4ca$t4m1AK&IHm$rhzOsdTS45$ zsMy7~WwujJg}m$7(d<8BvJT7iMz07Il3{HKmBSE0<$fJRAV#7^q zM3QyG$yQE!vv}CxBdBXuggP^5ww2Q^gOJp6BiA9BjtzRK`Wm<2f-i(;zHV@D61QF| z$Iem&((c2oWj|ZCUZIro1i^AxJB*447~w#QXHLZ0P#F=v-&S!Uo#g94k{)4ip<@zhMqfRI*x$Yi~K z&&_Vn9`~#RWJGr@GE$&Vc)9JP5_{ajfNq_pZ`)gJ19z9(0xS?v(PgM-X{`<#!37tf zN0j(&yRz{|f?sHIj)t$d&wEA&#tQ}e6%oetm_xB+nV$-BBI^PL#y2gQDkZy$MB4ba ze1v8)pST3eOA&72c7k6j@Yk<_^!y0an(|8~b8R>q5WR>eyM@8ORPVHSRf%noVG>tp z3Z;c}1{EERe7|TdWDvw*!F^l!92CKD!lAg#8L86$1nw?!uw?Om?YA4c$tC5ly8_}4 za&@>}K}(-Lxa|Sh^d~jY?1l8JojlINlbPhqBM z7}M*Ub)m6e$Z=QnQz=`5&`>V&jKy@ot1+O!d8i`e40xtQ-se`e04Ic$_|f#als;o; zv`q5MNe3x`p?exdYgG~ah1OOEitx_X3!Y>R{#KneIy|6&4sGYn#5}xhKo{ae#M=Ap zAc{`c89x?rN79++U!~jeZP1cDz8My#aMZ|}4AV7%gcXt*4Ip}h7BP{aFeU5CJ!`(| zKg6(A!XPAkhv$EP%Zd%Pd@iUl`+}#Ppj{;U z1<4v9bby_7*5l~w?Qtd zY#o0HHBTwW(pewZjUiVFv@89TE0jW)M@W{=9l}jkkQv95?TwNL3)9)~YtP+oU39$! z?}CGdhy`Yc=YndpFF>FTQ@;viVL@;@PWt4KH%S!PSC(ytx`WJ`J&U2o9)k2)napo0 zkPm*4r)Lbx(W$PbS!(<2SAF1t)K5^!-8v@ljfcx#W|U$^pl`ce(#wlevT3z)$}De^ z#@I})5GoPKk(%3OWR0%YwMTzOT}Jt)}`+9rU#0w#xX!(hs6lJ*5Cj*Ix4@UOy2lN)q-->VN`&y5pH zFHW4*gDMMT3%+q+Wy$?~&xgXOM_8+qr#E7ZaiYrv0c_q15^2Dp%jXG@q+FuhzlD$33{gM*A^p3z zPc_^5jPei~RvNGCzo^dW$-pWRT_;u*GH%a$$dpm~F=(t2-rn7~rnv z&D+oojz-CHqE=2Vl~JiB+i>`@oJl&L{l8XRm7i_PJqB2%!Q_Cj`T$#o zke$%!)Lgojjw681l6W>;1p%2h}Du#bS0kl-EN_WFvxaGtTpTvS{$MvP;lmLoTTg; z9_b`B-;97hc|ciT{Vw0B#nF%|WF&CYar5qCCvY@+6zQr&Y6 zJ;`S*orXSIx(WWx{4gU=M@&B1SlJV$fQo3CA(_Vk;+kt&MG}fBG_hz=TFPaeUAA2` zbEL;QiXyk6jvP+50Xct*mn6draCfhG@+lbC9}@`z@Qr{oZL>%9hh(DR1Sy8^Z|3Zv zGCt^x+}L#5GlFoV>Hu5@POK&@+vWC8@M-vFq3N0Y3hp)w@((n!F)7v; zzoMLYap=&D!1LJ}Wp4~E;%Lw$H99X`b?{xJXx!MyWiR}9m*%3@%oK)3n{}Eze>T{ zJzY?s+>t~2bub4`X9Y70U=7FZT<0ww`|024Y3YWSvYn9%KyVpJFlY9gCYKVeoauba;uE06d{HF8E2cLnL-vjRnbk_5;`?BOoL*+K4+ zd(t26io#$%JfGU&9o;IC4O-kcdHyvM(qxta(G>(|sD0ukSk1zC3(4PZOpwP=|NPzL z>6ZYd7C6{U`Y`@~8#}dEm{{I@7C;fZdj3S)Id7z90X;dpW~|jVvXpbDOs>vx#VOyh zB>*fPx>x{B4w=waKDf!vcS3St)w zCH)F)|tVcC3_SH%~kpQ9Udg!ztYFoI2jf)38z*+ z6pp;`3O%ailnrMg(8e*%UYrHon{fFlCcCp?%JkS)a}U|A@?~fOe;zp(UYP`#{#gnd%HgQ zrX&AiCDG~aAIpl6bZN$J}O#AKqpRuv^yu1YmTM%;e zz5LeBbni1?bzA3wwc)lO>pd=ti4pqWmbGp?xc1=d1sN@qYN>#$$4_4gS-$jq=whI+ z)Uy*t1$UGO!Z^Qf>SVsAYs@vWh?UzHJ}vw2<&IryaGuLq-QF2K= zV57UZUZd^~pHGpXAm79k1XCD%)^`F4zt^}l(?7^i=KVC1Ip2S}ll#vfi=QrII`Q_u zPfm;(@Gd)?DzP7q=Nx2J?2iz?w{lF8`3spnH4-jhvMC2i4aMOn-Y_BmC|7MBgR_%LK8(xmT=?U%Fn((Ib@?>gZ-JtUz z3zrby^3SRMCcO`y$Rau?VQTo&$5+C2CE%WZ1PQ^xa6=+xW}NZ#Jo&d)nWax*d1~tLZGM(iNRyE7`iEcZ-y5`#rS_w)9v2%9F&oqACnh2#)+^07T!V_7I z?o6x43m=K&{NQ6&s9QJuh4u>)nL%w0htG9dQNf98aOf=D zoCKHs-yvdXXZn7K1%=SIf4JteRWH8X)lu_xcZs)zCl5dTD0WbYEg(~WHheIl?}P+{ z8RTXdscLd;@t0}!^cj8sA*0<1>`Rq~hv}=#J(8ufxV9^35|F`^Wz9(yR&>?WX9h{L zlf}q{wi`a$+R$L?mM@`Z!p=d3@lCe=%d?mAt}|<|7y64 zorx2sy+!${!g{xuhy2?EX78B1B@vywS-atP=@7P9;Mp`2KeNjnbp6a$KgrDH=NPl? zTVBfT&hRV?JRl=8ef7g3mfiWh4L}C5GIEaHj_=tUw7_{%fm6Km)^+kSMaNZNkGmR( zMmi64L~+^en%zGozh&`t^%`6o+rlfo{j`K*| z%iTxooOi;g2&kRJRbAhmqRme-jM=B)f=^D{JC0R5Jjj+%3-D&|8_Ak>doZ4m!A@o~ zXPlD39kPOagn1J%e~fvRgZkZ^LO6lz=97D?S_>7k&dLPT^3dPYm&M-24WU|onFi+K z@rr1n+nsj08Sx3s=aJCyu~7aRuSyzlQ7~3Ma3Jhm%K`6JpYo2{E!sa zOR9ljZ~4va_Lp*{C_bXXUmEIEIr1ig2KW>VhCFPZM6JDgtRA%C;dg4ul_Sq+cR%n( zJ`mEBn0R5?ch(b2^{hx1?y7?c3d01|JzO?5U(3JcJhnU73mN>jlCN^D^Ok}9yT5;a z3)WC2^t;fu^K15*T>&W~O1qhok}s^Kq~^IhQSz5QQp!Qxu0O!WxH>IV44#}Xm!M5% z^TbBv>({?$K~~ei@l!U^A;|VNTz~a)OmcHkNDPLIu};~<0LVFZMZy^Tm&b)Bs*@}p zvWP{|>y{^`TLu+0jOMN+_dPg?%oP7+BcSgXyXJm581c+#MQ0%(D56MDhwJt3OgLe7 zA2zot4IE9JzdzjF!dlRnTRKzjF~`xh8lE2{eR$ma{M#r#u4)VqOH0efq~1Z_t6g(Pl!3nwmE)6wmG=KZY5x3D$b{CU8@q^ z*+}wSj+t;>{7b4x9!+AOpWC-iPny^YrCkl-e*rH_W6K-gM39H+-d9=*LUdviPdFl1 zUkZTM$2KFaCHMMQhJu6j2*asjt|UxC51A;_$zes|>1%Hpyjc=`L^5w@#iGH=P~S*77H6W_1Y_jg;X76_xM>MZ~O*F3;amfIqj~LT9a&3c?&LrCMM{=kop3 zPk2+}5Cj3J7GyIGvTD`6i8lOi086&@ANiA1XXWZC;FXg4gkjhp?-0@DilK7%$8+I= zh`)|h7UirqI4UVO2G5>Ae3ct%Ii>wmdG-G^6k{g_PpZ?PlN=-h*o5}Qm%-Hzk%fi#j8?z_7E z;T+72WJb-5v#>TF+G{DXDMlgPV@Mda?>Rx-PXqnKeK$9msdf$2XZueW=aEZtW?c4M`S&GN zSDwDCsydPH|92sg4<0){SU#hX-A9gn8hjWlbsx517jjpu5#~dY+6;Gn;-klza7NDd zBZ1Bb%>{Osd9`~E#aa9{`ee}w4n;GyDZ=Qy_7tlWr|E4mu*>W~@G!f&jl97S4r3aF z&hJ|e6vG`KBz=P*mCM8-f_pBa^it!60<#UY_$jcTtkmusDhSZ+sx{tt!fcK~AoBYm ztXp+mI2oi*r>dJBS=;I~uc7G`li!(^NzZZc zIG3$csZM->89(EpApN0O8Wc2XtEp2FY;wq7Y^kkYY!R#HardAHOgT(p=8|WiZUTPd#8I%?I;5sLaPh(_!c*#8rS* zpHXf4)6{1({9cyn--uPOtd~Cg^3R<1C#0usn!rtx_F`9T@`v3Fs2-HT%c&3~lCod= zVN2v*Hs8uO%Xc1TU6kpJqxlj}FQ&n}aU}8>61kO9O|qdwMNB4{^2hIb%-tOP)h3H~ z2#iy4cpyc&t9RfrXbwUJ3RBinlyCV;mi}K(thGSB1eT;LO~)=7_U=0D-Br+?yv0?A z*G;qSM^3=#cLpFY4IhDr?c$SF5QA|DWyF9``4LEhM^^riOUQWba=suV_Q@`k7Hkr$1vo;Jn*9~5x9o~wE`Dd~%KuB3UPgsrHsbiho z_X~Lvi;HiNM`k}OD#ot}YD?s4g*h#ffOSeDSBsm& zse_1q9UPU0_(oN>th59QJZ}_iJ_=ZTCmcI=?bst;h-+MCIZ0)IdpiR3BLgC7(%p1LyLc%Sl3^hq2TYutL3} zyJyj@om%SYAmkFrX5eQ7rkuLoPUi%g-O-)`@i{LKt%2r}=zyC%cOw?t<6zrL8vTHR zfSBW*`a1QMAN$$-wjQXikhUSXm$%+lTezlBkZ!Bz9K`pU#4vJj^4;<%#XMhDa{h$F zT;tOuf3ux9%{e#y$Jn{mhM!G$RdE}WWsCY)(tlVzv67+Ta@)0aJ4U&%&|AhvXI-Q$ zl9H3f1GbodBu8hl=GAkHby>MoXW4G=Kw!q*VyVmFw4Y19na#t;|EH{7T0hZoEnoK! z^LgHIXEytRPWM(>8^mV;$`GnEg)^7`4bRmzY%UI*jhfs%@YW@o7K7Qh(&rWuR!Ecl zmeV<{>?PH{=A!)OYgp|ypHT&r^jDkMx7i7!Y)k_>-E2A&bhCVQbUTMQANzZj)H- zOmDMV*WU`u|0kiSz_KNsqU)p(E}0IOOvHZqk^Aoh=_SwuW*4bb088q`+ScyhJ6mBz zK~6U19v)kQryxj>mDOMSxBPTQj2S?NL)i{>QdVy6!pCxq#p5^Fd+Bs3c86$?bRa3< z8NB$GaYw!!YgXV`Yy;usiTdP1>z}e6MqR`T2A)RWFPEEApI@%0Bv%6sU0Dip`282T z`1@ZcZwq;6R0)dj2fMwHj0Di)eUYtJNyCN* zE}Tbk&o_cBt4|`#S>g0WC^A$-mi|eWDZ^i7!`$-_R%MH-`O(%)STqyK2_K@gMk!Ui z!b-O~>?IkHWSli)feRD)V|9A$XS$o0zK)xyUKUqbIW6S}A@^WVIJIQ_V_HcU z%jHZ9|CeReUp%6(LE*b6bLHPj?u{e+RBVwDF%kjnY8>eWQow>uLR%hLn&aUkG|9Xh z8pnXb!+W{#kgKZ)g|PDoQ#G6Cewk*)H&Fu+*(kUXN!nMC?a4;2wW{zgnt^cDg_7k~ z^HNVMF5JuK&6@l_7wAwBHMbUXko_&0W~yQY!GAG`=;4G1b>^@3b*rDUBZ&7xra*&^ zoxcMC!dpprT`Ng62}Z`oVZG-f6?yP5;+Wox8mjcJ$T3)-EQ-q5Py+MP_b>ASl56sd z(d1c|;>QS;xcpETG?ez=sqvXh?<3XIRk=9e!l?j(yTrTK#@oU}0ugn&?&<=ss@{vG zAPIbawflho*BV4x1W><1$gA)X-CgMk?ffrnYVRe`<`MkBAvQabnKJP}bn$PvxN`=F zi((3wi}=FqhG^QY?j!zJs=Tw;N4OmsEDm7)84REp3tZr#ig(xaKCEFn_zS{`Gs(#p zHpnAe5QP5bcxe}*rB6E#1xi#i!k0>iWa-Y2igOv}*HtZ~|7OTv_sI>0T*nY%*vM(r zo)xdt=dR19C$UpuF>lHegX$cQ?U%nauJLD}R+@SaNRu%Ye&@&dykG3M>RM6+hNGwXFfI_OxGvQe$pZlh9=sN?%j;S7 z=4*;q%iYGdqUZNv-qb--L}-XSlosK6=#k5yZXZRstsN*~+9>&E4?>iX)-(P44h!sW zP<~O~6wL&Z#YijhcV2rn3p|s~uz|QC(<%qqT<)ziw~k^#4}Epd;Ij~K2sG$kM)Pj; zs&OXoa=#l1=8@_2(8#AajMo_M&xMgf!eDly)N+=sH)IjTkI}p^@(oTrt)Sff07hpK z_@n3LocwMZAAe_h6}^PH02p{p%}6%OT~31g*=%FObgT{re*s91lT?(!#m-eFjz*WU-vd1vH7~S< zzSGuS)#{YRsL9ewZqI)%C))#A)lFiEm}FlT3VUDDfl>76Y`=t&GSMio>+4N!*gt#M zTV|UcyJ+IP|H1}KAsSGRVbr>Tg4Ki4z$#?=Q$Pf~!TvMmo|q|0M~`{a^!6Lytj(+Q z9W4Umj@(X1DX_C^_zwU#6JOvc{L&? zPlE-g;}frK(KS2q2$Ru5mcctjmKqPtVc&?MB8FM1Ka9ar;WU2ig1N`r(&saBQdR+CNdhm8s$B zfkrGYp`i|~f7BtsVzxqJ4+rQQeIG8iv5-wh<~63Xc!6u3KjD!e?l@hjN9BPrDeg2P zp&z%1eGN@!t4+bV!1VZMO@F?8O(p|EmI5+TOlidyQv(B!ppVS3AZ`?Lz~?0*iiwb~ zd{F=r0_c8DXC%Trc*C$~js#OWnbWReQ$)t^=2;uf?DR1J*5U95JEA=|`3!Qf2B7@K zX)w&92%9Hsps_j-c}UHKsgPfu-lYY`lKy#Ni7*?Gd6HL7PFCGxA_wK!nepJ|UL1%N zfuZ?yfeR$Yhq1RVa`Fek!yzsOeuMc0q=m*?`dGMA$6=-Qo(m~sa53+#YuY!ePc3g! zXMg=EW2r|Mx(dpFMo5ttMc0=DNPY-!J$h3MyZ;tq8*w4S7mro??q41o;GS6ba`@@t zh}-w$oAEpXuOkqRAuQVI;jc`fWnIcEO;zPL6eT8G$+xP6~ip3>AbdflIaY8xqR!%S)rr-gE1~YgAwH!`*6;p z+c^^WE(bxWSrk>lDYe$tsfX9OtXw&3=)JmRW}a$K49tIdxBj=R&J?Q}1g@1rTn*HF zA^$+tcC*h;wSBbPsQp}V?XTaA;)CuHIhN+bXQDA@^jTbLwykDgu-r?0MZEmU#)tl_ zS5tqVh*37wkC=AG%#PY=HHgzQdeOVH_0IW?P~*bi+1x)c#$_DY2&!3}wOz>i_?MuG zQNY$*t7ebQPO)Ow%x&c}UkYY^pY{jXBGjrV6izEy8ir5P#Xzcgo++DOKB$KUY^Vij zo{4|CBp+**4vemCrV*hwL2;q)D#t!B>Yw45{0t zYp6;zFR_nw8s1k6akk49+fMzTEha23Cevq530;G$W(WFR#&$AhNaSs9twu(OuqsxU zjlT8r8G78^x$z4S$uJo***c-^D~utZm*_WIOmHqorcZZGL%|a-vk}MFkF9m_-WNQD zxPN;4d86D8@k&;w>;Z9;xru&7c;N+pG~|E9pb{Bd;W)_6@n3?sCVF1U7Hzn8ui$Cz zV53lQG>cpg|K1V&mtSJ`yxhVodHrG4r4?r{;f^E@9aSg7cw>6MS@{6McFWu+Ed$!KBlp}zKN_-DR#t7G z!(Ql_3=bYj9%)RJs9v^{7O%M+3wM&Rt;$Sj5DtI&BZ25Iv*$4>B8)4 zH>B8dC<+ui3&OW!1sy9XpF+8toz>QUPk-!HydEXT`huSKo(v4N#L0>D|6n5OvlfJW=C1>5+^cut z^#?RnwJ@rwI!-|71d`r7C@guZfkYw>*RHl~lS(iZgUmBdkZV~sQSKUIbvI}uJs8J( zPzpj01nk1rOsf3HD~2n^K!@RC^P#vhcg9JsURy|y`lT^y;AOmFXg}xe-)Hc0Lz}&~ zu<*llpp7vu3+Aueb8B}|3)coZj2$!3FFbU&9eJ+&FLF8RSiG>xwPMF64P zQoX;Xu;i=xA`lBNYX1iaUIE@V`khl7G0{v_*hCoNT?AW zANM{Z*6|u0buR+RmqS0i?3DHjARL+xpe_H$L@(92aygRXPV?)_EU)nfE_6#J=#yZkOyI_G1Y^tUup5U3pZAxL?C?be1pwd znlZdW1?+-XpJngGt&BCYe@%!H?YWq_no)Jct7~@U2J3NPza+y>{z$yObs?d_dF`T# zKRtK&DoGHjhSk$eWI+1}!k8&YnA5SfH_+qKy9y>ko=g7X7Seb8&_s6mUsm^_xHJAC zLC`(UG9s$LMvdq`kc{BlX34ReRhLQZZtXg#b{(qg`xxKscrEvw$OtFf#p3iUzgO6{ z{Ip9bea)dep-QJJmSZ#eNYyc<(y(=cG?IL}^{opn&JwbC0Ok4FPYkT1s^n5KNI@rm zECQHHdJgcgaJ)7|TT)`JAPT$H(94Qw(uY~$g#CU~R$_i^9)&glE&+;yJwmLdk%6^$^sCjBiDD8rpcWWnIOSN zr}l#5GNUB75Et#J8~H$#nNP;N?`jpX(jKy%aY10cnY}ZZ_$YnH{x>ToxstnLVFKl zsoT)%rqiTJhV8L~6mdkTeVBK(u)8YILBx#~%LoX>M7Wtw+>YT)Z=ukv?@o685s9@l zXxn7F`4z#trQd*)O(RkS`~20_hW?7RzgEPt^`E&IRac9Cld5zd%!;eqyxe(V=ceoE zFWixDhM!!trCVD+L3=>!t-+s4nSq?-FOLMwGKyHB8DpNAQi1iaTS+zLFgUY;dGv5_ zV=As)T_92?s3KtDEA#8svw=xE;kzf&Q=TjZE3gKXdJ@w1VjkwXSp4?dUX0b-(%q@G zK+J|x@grTR(i37zTU@4xneVu4<#`u0@8V{@OljZ?iWS=Z+3o3G{R^Iq;TOcE_RH$yDjmSf88$z zm{&ik=wN`OPXxBgjvA8+cO|I)H{k|)WTd0x>%=2Y!u7I{li|5!dZhPkx5prqKoqpM z9Y(JHL!RU!MfmJRHS?qAmJO&eLLo)$?iscGs*F+zAqYX;s0mry_q+?x@KJBu+W6S* zGAa(L6KJG55-o->t^GD$hE*JSy@UF(QijT9@L3j&_q){weZ!0pA!Bi8HvH1RQ z9}94;M>*yri6s(BaIRYw)qxa){?~thcPExGA%h|z#*n7qiikBcW6}O<8 z)#bF3iPZPbboU5%{$af@6#jjGQ_@asw#Kp*w}43hVLj9XLtfL`_*s@NeWN)8BRYde zNI>p8X209Q6f(oH-#SxJpwrxlCRZkle@#tjiJR#wrq5j#MaH;5@y3&Mxf`k7xK~)$ zsj6t-_`RrkLCT`Gv}yyhXpy|NdM0o%6?ItVZ-P*~BsRi(>9*8n;v10GU~1`T4xf7k znPUNkS(paq`ra8Y^&U(;VX@v9zYnagSQpmI0VO53hS|co`*KK0kEjOYYOaRIH(Xq& z{3e92+kPsaHGjdv#h%toQ%?@%hg88#Cg+2?*OL(G7Ym5OQ_qSmCARG7=#g8H!}zW* zLa@iumB2cdqdPUXo*G0EKi0SD5&v<5__Y75tM!owK7|_|qrZ?&hKD=lEO#A?I#nAJ zJbkKj>x@ko6YjuY;!prF?qWgpgO?&8;;P}N-g*;OrAYm1ZnUXqo%??w6`N4h+dF@y zpz#M@mA51gfHn8QMwxc=)Q7W`I#Lq|nivWNOiw zz3iCNTn)g_FClG1?&lGKaQzZ89beyifSBf8ig4<_Sc?PD?gUS1pkYV<^_$S5l%-l^ z({m+IwpQMLuOS)Ud%H~b3IofH8bUHj@QlkP0kMdt83U9JK5*jm1IX%7z3&9st-Hiu zi|C%~???JVkxG|W6UbIX-0OKlCcfk{>A{cZznOkK=#VtCLap8<7e0=kzM%yTP4ZEQ zb7HK}y7EnP`CROL7W8Fgtx=+xup{VsX%xn5l9VFc84`97R|sx0{Zmo%1?aJj6ShTK z6x=`LY>(KBkMQzeK6BACdoE~I2^IBplGIpjSEWTERQx~O8@bCyHze}X>qzVs6;DDk z=%Id3YIA*THjK6saGKkd*yifX(8nrZ)6I@RsZ3>(w0(u~|cdhk}g4`?P$uIthOWgE%f&|kqZzgO)C!z?EYwjatng>+lS;upsNle(ySNYsC zBzbaeu~fGti`|?q+6VRqJtau>>m0Pkvop4jpKs^6aP?Hqspl`r#Dyix9rcqQhTm@e zqzJzO#`L$PL4S0Vl^gQKXLKp;Y-{4iJv<43rl?D06h@y}+HS9ntk|&9;jEEx^S_Ni z)Fsf|y5c~uNHY_fTwaNG%r!Q!ZaGI04n=OXyh~@(%bfzS^p}`qHz9GY=LuA+v{DG6 zjsWh$!^JZFmk?A0ur%M~4yt|yfv{pwIcEM_Iledjt#w94a)6;rQ2izq**iHv&#S2^ zc!5S<=nB2Z^f#Vn$}U^KP=54*VF*5xM!fufhNUYQk+86e`ya#$NN+$hr?@nH)zKha ztH8MGtMa24vR`IrJm@fidA_yYe@qA*@f3`20Stj*w?)FG!@+iW5|G3j__}4ehWyqa zK&HNVa%T~E2YqLGWD!PS9@VbDC;rh)U;`pQ?H2<>tu>!Xj_@ADR(FB}YHw_jGWvo_ zfzALV`zeWyRzo~*Q`Feb}@Ao<8Xk@4#P|qV6)_(zb%a$Y4RQE#@ir?rlsW% zFwr?`^b6>K>-(;0#1==>A3F!4h06<24R`a`{LSRuuwUNL&9bFk{)?-msR2KW-J{%7!pD0319YMa9dYp?cB#^n~qqovs1`J@zhgMyxCo`6^OafBC zMZSPEmD~o{SHGO%)*A8j>P?aXw5A?xhnB2AZKxAKtUsH6%Kj6_A zTWHx@Ogwq>&TgWj#>q(&)ErPKWzdg-s9bg`_F}Kd)T#_mjdF-?FX_fHdnRTWV+jph z2+LME7)w@r@NcM&H%*OFd{}_!B40@=@uSDW*dUY0v-gepz$5A|4r3%j*hKBB_ZdTp z6KTfUSni1AlUU}ymS;onLJBR?81{mw?Wdn|fE{TL|Bo9OMgpB3!qpKZE-@H}U(d5q z@Fbh4W=6>IcBlK`(&-WS044X5OlO2gjLyMkK6X~@xg2u4SzV5C*zcz#CMdmU5B8l&;E=6&iGIOb;3_QS!LTs}p7Aixee>EsU3L4|k(x&J%(l}% zLWukQRBG>3@2bzw#8p1752_!9Iq$>tBYWtJpo|J{Brro6aUVOmS=L?Gs?|L6L(lS! zy)0O+U8G}YUI|}x*A@MLn!s@B`t}=-t2z(Gjm{KhHv>T|dP;kLLU zP7ayu{IfGU+fLaPw}U+i3UP)`=Wo6$yS8r4)P35l{cAp?GTh<+f4=d;Tihkq)?usL ziGy+JvoHwx2fujDpFX&(-2DUa&;Mz*K!{oT!W7A5?VmG?r)0gHK4~`-gS3hV3<9dV z^6W8}2UG0nByyI_ z?tg&ELl06~a!0ZUNVn2qo2u$@hNxtG{nowHUeT__qmY>es z;Lf8;1b@JdFuIH50?WuNF0Kj)@s27b`rKbWv%>vBHAgS?)ge!UG&b{tHO(QM7-D(= zQIN_=bQU?wVeK&KtUICfP&@n}3ZeQCz6uDL5U68mPHP*!f;M@n zPBulpjSslHP*A;(vHT8I>)t<9+%bPkc6@%A?XtA3R{nc%zetz z2E#8#P_`5MRbXtd%?sYG<_6NFOZ|J+{JUO?3`0s45OnH`Qu<+k=Qb~!VY`n(4WC4S zyXT`T>f2*LI?12Xj&qRV$J0w7|08$Edk!k!@0m3tI262$A6I@v@_5UO&l!@?hP&cx z&H~?Bv{>#14E5GGm?!$0iSyMoqP_DO?oKi-aHstbS+3f^m+|M*dC>ugHr{@_vg*eaJ+$Lo;M|W)CS}Tl=6(zfs)m~qK7Krkx!KNUrHH)k z)rr0c-3PR&N931RgnE&a+tn7Umh}2%4J+d9d0-m=FTl4eKk8&d`hUZnGTGi0ZGRV% zJ%VtSA(B(z;cw|rQo8RZkF#!DexW^nn4;!8ISoU$iM+D{T*4g|$c1oQu)|p|Xej0F z#C*>rAEd9|Y;cZzOk7aJ$B@jn{nnW{@-7Tt{{VJ5|EQDGDNYl`y+D=+GM&TM|Mq$# zBlKVd#E`f1g_BBC_)~+G^i7j9dVD*q$IxxAXbSdyM8J+`FKj7463L%l(si)7ft@#ECZ5221n_66pWR5m5ZjmMx;dW(yA=MiL{a>P+<2Mwby|@+>g)oh zaIs(SeG1_Q@<1bif=!=_+U$X|MdtrPl`Z+f-eHS*>((t22{fsE^Hs#&zE}lHSb}D4 znSdm@S@_H=Q-U=2Qnt(qeEzlZA{Jd_EtBMC^21fxGK+WWw?DWg(qM{+EhlesNw1ze z6OclON+rMPlOqCKP*~F;%6k%YLW}yhZpGl)-d6rWqx{HoYet$9#%_N!ytiiGb8r}?iNr<{t-+PsmgTSM& zAZsN=*0`|tWp2-^ku=K(?}?VX7cTZj?Va&R=SB>R7x^_eAIPB3jPUIsHudKpnevPj zLaJ<@-%kn+A@aZ9ft7bGzv%4;qZ3%C@3}+D`A)fTv7aHvWO9(<+tl5ec8V{IV0eqx zIycE-9v<31-8+x%WSg`8R>ee(Q5SThEKDK1nAR#tF#_$xIYB-1Z+j374uZ2$Homt( z)T}+bO8F6{6tHybh)HHOSVi<dYH*Uf)tM>AG|pF&^IA%Kd}9o`lJT3Wi*HQ^z8w1Gw9WT}K;`qe17Fyef}? z_j!`3mq|H+s~3LJqBl8mbhl=)~P2&}CXD zEbsB(Mjswv+tT5^4*89e5ph%J@`m+^NqX$zhpv-@Dnv|hatCzHcVTmyz_f%Rf5u=J zNX2b+L&ov&4rlooS&Svu%un2WmG;(!x|I`u=DqLXTm-^^xV{5ykXx2oa3Iqb<&V!z zv-Lu*-s0ic^OXEX3Hb-VHo^=6m54;7-awG@RltBa7i6#O*Q0WmJSf>T7c=bNp=+?7 z74+D*mCUL`GqC+nKnD+JqIM9wZU$tqHUP(;9EMoncM^Z5K4c`BH3;@~8q;gDe&9U@ zwZrvj;79)G*i+#*Oq|a=C8kp?2-h>K4`HDXutU|5`3q!5(i^0$W>StJ$b|y|*kb^o z8@ODvCEwym8s90iu>&hr_h$>!0qC$}7UuMJD$rmJ3K^WeE9Q<-rUX*^vc`#iJ)e=} z4)xfz#{4p<$sKQRf6hgT)7~jSgZWbbKtc{cHwUh{b#Mi72eC#A?JQD4=EEje;0hrm zzQj}qIu#)ihwdXiEI5d$=&|FLG;A;t->QF#)cq6{VnWT6gAoU*{H*g^C}>Ffkt9X7 zvEirau|`iOV^J9wX!(G1;D+c{O=h<gphZyPI|{~QWBp}eJ-1-yYd@~s5@LEY_0y~@$s$G-?lp3A2L5P zC0wG$EGc*IWfxyKC%*m#@KUrO+1!t0aCU!}kBwt~k>kH1k}OI$Lt$B!1|M3!nS#ZjT?+9!E`GP=5z;?+jvmwo-3<2y69V zGFEhJ=noyOddFKwj@`I2@>%W4;OzPu+jSrt#65%~RTK8AqwX?o!<)_Ki1-XXLsLi7 z#ch$Wo#GVA*4oqgq1?%v^AFm+U!watPlFr>k^bKHuosZB{cpcZ)pkSACfe}sd&dt& zhWBzeUK|Mo6DRiq+|M&TdbFCJ@kA)iLsJ^j9|?7y!LMJlNXn>dJ-&D!uJ%g2XRkz~ zHvN&y?W4PF%TUBg)sp7A5yDNighWgEE)%uMP|>e>e~R}Eh9*#G4#-jM=J3aL!Uf3z zhT+NtN9PYgnC`~S!iI&eD0$T+r7-=ysmWe5E6zHt@UC(MLD$wfy)^Qk2D6^T=QpGB zM8R}9m*(<`!gt4??RxNw1~91mg5qZr0kv;@x@Q^b(p!hMJ$+7)LUHlfiP*F!cjnTz zx+YP@Lkx(?jwWfe&qO<#hAxNVo)LVWOvG|+m94v_eRGlRO#kn&L19k2C1$=(rqsi7 z&T{8Us;Dk3DPq13oa$fZ!xH^qAkLZ^dGZ{oYh9`%`9aph4!vhIST65GLU_)Tk^|ke zk(7;Ru94=v<+oI;p4#Z+n!pTy^U#JfCwC<7{>}CpM--%ijrd&|MG5`hTD+IDl8FAa z51CWhvN7Kd9=ofgYDjQNkpY>?M8=!2^G~bBd^Ni&7MDN?8Y;}|@@AO=Q5#y^SF#** zMx!04sU^95`t+<;OH*jPf5NT6{a}McHQMl2S;6Ua?8*tb!zEQG&o3zoAoK1;KBLAi zYM?E{Rxf`79=Nbulau_9*#4^QE6&{!@U^V{T8$#YVg}lL?_gE%5wnvZ41sG&+8-x# z;bz?tzEXme<8ofXJG!ZJNNp%=b+A{{_1EQvdvhADuV}F0Wz1FqjN?wuoy{?bEc}z1XIUq_xdg?4C$z1O5`31-OfqVaIPUn?iP$lH5Q9zQ#?+Il;EAW6+` zT_R_d3X_ul6YPMIXJfaivNE#nB~J`gHMG?2mX~`SD_$jdWo1-m$}G@e??umf@ed~l zo$%U5lyn{zu0V^}KtjB5YnN_?YQa>XU}^*0*UnBdh_nq5JZ&_9sK-}DTZ)3)qlu_T z8mbmN0Jc1TU(kNM@3Vu?otD~~u6>QX&j^PNjbGXxwq$h8`-+j?$QZdEESJ13(=Wh6z%Fx$|1XdoU)jVd+*(g4gtlnsl zNB;$Rsb&s@Cz!w2`J_ViKuS#kDrJbW_?;M*?0Mp;;upCDG#U-FTbC+n+UlnNr`p;14V4Lzd18-+ClO+0G!@%Y1l5B6}Q zH;TV8?&qO`n6=eG#6WXD&*bIieRT;>ZLa;!GMEZe8a*Q%GB}p&cyi@Z^KHwQH8p&w zn#V#Lq>5^vk7D5NFID&^gYGXW2vkUp+U7FH?5DyE_y3VOaMy7+?g&$VRnb<-#X-a+ zcz_A6f-$EE3s#ox3_R7u;@0uf`S?U7GVR0|an52^neGnxuq@n#cJ+6<{*%@M(s!w` zHIGyWNe6^=hnY~1P9Y*1`8tr4-DSxScaHlARYp&_Cv)(n0S-kDju3%KJu555vMTHq zJwCYMd*#7nM&-yOHEjxo$B3*#HPtj*{(P_8 zd@KvsoJ$9AioUZ-yK)@aO<2Hl44is;kW?{M20YzPTub53Gr~N$7xDyl-~lT}3k8tn z(dbvGnx+_<5M%VIFsE8XpD)~)u}$EFB_`}bmMFKMFV)CcS#*ZbpEK|MN!U&IWV zAo6Hg_AV8AUA$+hDo-1(?%o%>i&e%d8+mXzlK_pqKu(X8H%g_{UfWe9)p=`q@5HI z8Ruy#cDScI8KUdw(-84RcScDWgHoya$%*y= zhXHy8Tmo>Ted1*1cFm5`6=l{0rOuB_Cx4fmi?Z%%AHIO96_!AuIyRMy;F zyWg6h%;)A`(G3rhYw3?`zIvRuAVOHLRY z`&(+wTuV4#BI6}yqwRLFUc0%e^};79#4Sle5G}DO@704375wbpmumj5SNMwFWbKnw zrqiT^9F{>R@1K*V5LOBzr+>>WqZGv8yv)9L`m%z%G++icn58J8RIuQCN>Rpm(iL5w zEKgLVJ5s1hZQ<>5qnlQe3tg1b4b;gf)w?{1LKL-$WKHf235n ziOiUk>JZ$~dO-#=X{870h4O7OXUC>KIUbGQ22o~HZ$DkIuxRMJiGBsf(jf})>H zBCCcm_I?UDqJVN1jNMp%kFR2l?niR8(E^$H$*kWN+=Wu0nKo7S{-bH_m&dl0EmE1o zw{oHxVzBGU*TU-lDz5nD6PUvk3U>pDvGxm3k8??#U;JIR-TdD90LtBHb>jmeGJ;8< zDQm6cxSma8{$u!r_wO5At#ClU=b85h6kN~?q4Pr}WFj^@UP{==$8JUeESml7ktP=XtB$!Jbz7%hC@(p1K*28!G zZ1*}Un${Du+P1lddxET@ra_Bv=ChFm`zN^BbtyX|NK;8~#s$<;N|2Zmvm49kGKN<2 zcX@1g+ZgpUqu|MM@D2Wea;w`jw$)FaF_2sybp7nSW$E?_`o|8A{xqd4vHI#@WA4=plwkCwQD+N<5%Zb2LQ=$R zuM-P@lDB#_P7oXFMfHaRSF4fWSjqo3@0~gjTbI^5T z9kV%lPQpqWrS!0YuJG4u^6Gfl2!{zb5)0l0c=zkW8lwgpbLq-2STsC4`hDGLMAVKJ zXF4Tebq+r=?tRG<(~>pa*wY1-yx{6jsrTOcR>d~=Jg@YyIDdjv?f*vI@ou-hwfU2E zq07vuERKzYRCPj8q0|a1eEC9A;xKYX)x27J9}IGch8@J~b61iqsQbYwzx2>mS*X2b zHft93%kIp|J(L2blwh>>qqw##w-r?34QQyy;Y`x;yI%%)m7fvtcOBpOtZH2-{nWb> z#Dh2~r-QC44Gd@W#Xu~=R9U@%)S3~m(pK5vvPI~3EVmuu7?U>8HFAYMwa zTANGG)2S`kgThTRR@D`OKQybV`o?P z@h&2FgX1tVBXO?yC>3TyiEQI3RzrjP)ZKKy>y4tCgNU&bcE??8-7MYN;8R@3E;Q6c zdw1u*>GN|-`y(}T$s|Ztmvf1l5Af! z`TMhp3oL7mXzxQ!e4>`x8fu?iHp6}?8-`^L?R?YM*lkf~hbOfggn~RP@vWFa@t>bc@s^VVsRM%A!Iw+8{^CrcQ!S zP1Ew;GrBv8>GKoVmLIi9KJuiTAD~&*sf|!P-L>3pb~fnWEdMX#KbKn&-$TY3bBa zz`LDR0=qt)CiP{q`iyfi)ySl8TbcHrEvUfObs1COT$uW0=KAvw%jbKH-`M_UC(%!d zMnxw+u1tNpez-?etL1CP`AP@Tl@k_D&**+We#CkC6hj4Doxs_`77cDxmKt8PXlAu) z_a=kMk_cZa09{@-b64B(eqt`Lk9%{ga@iz2-FHsk+a6@gb;v zxvg;ecqzeWAwN$;jYFMx4Z3H`&WmwsVd>fg$f^Pkx@A#P+|FH;D(0f8L~Su z-$B@JCXinhEmY#*J7$^EbD|4?+rmZa0rmUW2ERTnpTwf~R_VKtr-Gc@jg||_$M`l^ zq}Cd8Lnz$$Gdh1La-H^#S4kZumpXZF!xgcco8;ePi^lX$`^kjqSNZb& z^y%}k&WaDpc@;L`pkaAcu9qSqZ=h^b%3aK%^JP;3X@YhP8r5i0vB&q( z1!m2U#P+*K^}1d;9~8Z4hPU{sBTJF(dyUu4#-k4AWvu3yJCU5@ZC?l_O5fn|6f3FH8!Of=xNxTXI2kC2O2IL@FKehx9n<#h^wWmM zcl}j_A{P_V(2FHzls-a=X>{8!Jb1F6+2OMN72@7j+Sa05_&oS8viE&{RLyRmWX9qR z|GDfgzv5L;ABU1`1?I-~ZQ+GQI8j$7-@A1+qfza-z;$_i)0um^Z^B|-ueC{iWg9$U zeTSWaIgP6@3YXf^8Bgo7*}-(YB3v;;`EyP>b|NPx8ilMHk);;n+xJkG(`_yt|nId#JI6K znfA$~%@}R3Z-qQI70*LG8Q4{)la&tlXRbZ4qQ-^_fyL6LZpW9d z^4fX30gQV7T;@(&6AkJ~W9x;{`W6j8=aDJ?t^2bD`fB%Ayex-Wx0z30zmqK`PMo)x zo7K70A+<1i#pAdDn;6UIv|Xqq_-b?ET#Wo3fkO0&TNNt>etQ1iSy4aONe`6bf_)XU z8j`FE5jFr-eBU-({%Ds)S&dnY%%6YuAYp1$tM4nAx|hR5bqLQSUM~fXH0?4}Qf3k9g5%=d1*Mt6Db2+*{cgjK?Blm9LG>Eg7rZFcMDw z`16NlPGWj0myUAxkpWe?MB&027II3j0=6C#nS0`gxrOS&9yN_ ziRaDppTRis5D*(Bp1~E@l@2*K?2hW0>XXSDl%obPZ_$mM&J|b25brv22;Zn8Sa}wv zV(qW0YeUE&lzTWYn`F<|zUO9}^&JoNDq8xx_FcB7!5Umz!Llp?a8p8vAC$0)CtF3V zOhJ85Qsor`gCw5Q^6ynF!};TE4B^wg)cve24V_K>gZ(|9*p7+53?w}UA{1o=AM7s! zf=#v}nn?~1sfWwCBmiyiUSlrksuw{M3ksLT^zJxZ=riM_VJ}}xjWsv|PgV8AAgS2^Se(C#_}i0U}3+NXEv<%;f};N94|3=J^;5 z3cLL9FEuD6Bw_X8%4HZBz2V80@0G_E{LF{0WGOU;D{G+N2`U8FP}Yu8e=5EUj^ z8ocdbo7e{LM(8g)Ie^os=m=jKzl!=hG3Xg51(9cTvYZHVf0z=8h?0!KeGxGYDDrCIE)5M0pOd*uiXmOF)Ia7|YxnpRMjtj_w=i+zkU1VQZQ zbHVTyK=8f69vRE24c18A;CF~T8;?oT-Fc|&-xTg7dz*N9eCG&=+Wowb@MEY4Ry2~L zUa&w3dr59_SYSbAYH_EH@3)L)sI;TF2#p@U!Ng_h@d`A8mAc(6F5fHu{&E0*8L-Y8 z)pU9MuI;tBkHNkkqxR#h=8vYC;Fof6kI$!cj>;S*%Y?lp=r;pxVxKt4X1c(+*e8_z zoc`^7%WH3_u?fejeu|N)epJL!_>Ev2wPZFoz3MKMi75vCBwcpw@^M(WS0$#}ev<3cc~;j8uKjs{3~aCyT>iEN|f6 zs_Vqd(?VO(+U+Edqdk`qYr)ZaviXpU#qNM@{r zg)C2n=AfgP=6kYiG3eWoUX~NTK9+zd6z11 zX|Eu+nrj1GpJo4yF5@MFTfYc;S_A}IBXKMXDlBb)&&&_O9unZP4!uQ+s=6Of`#em9 zN(pc=o|)FDTp_7z#S77&N@bGQMcQs5XGQNo%ft3nEUkQp#0-8vvT9=Kzu&_$?(v&f zyP8qpkqS6A`1p&{x$7(YB&&UV=rUd_-8&-ffEyKiH=Dm*vWYCSd9~`OC(51}w=Ft1dn>4~T=PW?f{#X$#ap*~eSl?<{~G5- zki=W14i;&W#f)v=lpTajEZ}YgC(60OJ{u2R&}%J5$ZQu#YbZtEl~jJLI{fB@OyIlM zd7Z4BZWh-oZiNqAs|R-GwJb=k(FDRA5(magG*S*Zy}ZDH(HB76ehka%e%YesSku`Lr?w@V;NM9SU?%h!%78VoAh#=f;NLrSY`1LY{D|0l` zaYPF9*GjyH=Flo$=?GzoI(J0vY`*0fQjcN`5$xy?ee9}H0>frsD)HK}r>Y&PL`Veh zKa$%y=GS3XQFBD{!vG@{eqRh6hbr;jDu*tB;%T}>JJSh@Pgxo1n1huc9fFke>%xF#R^1OjNavL% znB&J@OVd>vr!-RDsV_%ITqZjor~(L2lxzH>b)Qm>zla@$?MF0agzejdpoI;%pvUxu zV5*9+sBj57;u@e=&W$lOzRE$r1{b#nz?Bv{f(i8ntJP^;asa{$-&5>h>MO{vE-Wfp zg7$w(^srt^IWE5+o4J03`~~9t`oG5{=xC6?diq-zNB_AmH6`OT*a!ZNIjZ`AO~}0f zO0w5pZP`y$I6(1|9QIb~&%n|UVnV?Zlaa$fGbqF&9eR4v{i}7?u}bbr4LN*QinhP{ z+_O;xzUQyjrwo8&^qs8(d@k?> zH}*0lEZw;8C}wSF5j@kShFsE(K}G&^d!EsWqIu!~Xyr8r&Rx2Mm)Q7mVLNLZ(n!Px z-Q~`_%YD#CrgU7b181PDsV>1H4&vhMN00tjP~#w|gj{*8tTWw6rL-X;b{&{8M!HHF zBE{%sQpu{t;xRb&g}&m1D4oUh*Wkc%ZoCtdIjZZ=$3#~t52HB9$EGdKA>fh~fA;Z? zqu8S1pqTz3hF$cqj_@&)C=t@|sc-h;x<4K1or)d7`XJ}AC_E+!yGx*xsS88FMccIi zc9|G{2J}&Kxf4AWhR2|oh+7iV{YeGCp@QE~-Q=m?$6-RlVUx@=Isr68&-TUjY%*}< zef%%6Vb%LtHA7#j8-tFJDnZLd2mczV9P$QzkC5lHWt6Ea$|U^>1S05r#`cnBSvJwV-@kx5ua|eC%Fe})l zzT&4g<*pjA&sXD{@JaKP0JkiY|3rkQ7l=`w-OpDa} za5q1P=GhRT6znineKkkCGDrK=LtQYqLo`yM+%w35&(yYT7+mnf+F5}+VKziF0KM`0 zDv{!~9I5206Tp21w~J`Myh9Y1|Ncz(!b5| z3qLu*X#ZdTkoO4Y1f2tv;mD$RXI$|!?X$FO$FV&rUtkLi zdPvNk_$40S;2V;_&G5*W`XO?*d`pMGAMT@;3cXR$O~~pjY%PL3T-yt*QB>+*koqb}&Z0~%0BbPXG=h_h)j0d0PTy^*!q z17}XQ;wr0&C)<4$rf{(LQy|#$`03TE_3g*KcJ>Hxyfdh*e)g8VcKXRAItIBhinClK z_d_>$v{?Q`M1 zuS-o^%!K84TObtPw143;C0q9uNV^=COHoP}-hW^GJqzAo02%CpNjZ>7p;zF< z##pbNK^j>a<1YB+4_m;mj*T*hUmk$q(#4dKlkxT2Hs7sTi{gmK z2c2*g)Y#|`o*1FmWe}xsckvTRkH(=R=jwr&o1Sb6m!Huk^?oYBeUwHx(&ewBcv?8@&nQPS-QmGC4z9Mk3EMhNa%Y8Y$pOdqu>OzCx{gH0YzyQZ=lX#LUQCT70ECe*(IgdXaX1R(UhQ@UlKhY zcRCI|&?uO0+VU8Gfi$r6MIa@O?Kg4uq4Uv9ut84PAWuI!h4?q1hM85sQY&MTo&xA) z>9qsD@}ab87tDDC=G2fid_>((AsHV=#%+U&a*m&KN8a|_ojYV3i_CWg<`aYYbP-%3 z%Am{^3_>xIB~l!rcWvaYSgaa-zd7^I9QvZ_{k15Os-=xGTW0kG>i%q&!RrUyoxp0j zJTaLy2#6EVY3o8l#eF2v@MN+Mp#@@K4K@rETowW!U0QUPqsFpd;EAi?@C+!WyB8C>MOse% z)Qt@GXZ$8%Ry06abZ+>vAB`kCh^HFlsK#gJ_PJ--U>oY;Yv2JA()q-l*IPBMZ>8O5 z%Y=(M&vTO8mI#$EH5wBH65tAI!3W^p#*Iq3q;&IFSLsHdG2_r!h*^15^p;xB)@h) zYzTG7DRR>y6cqZ_t!hTLSO$5uD6Z3B-G3i)RSnOPo*p!$fd>H_%z%cR}@wQZzRB*F1e`83&bs6L$cT7dbr`eSO+n=8nx6cxXAY zgpq!fgH^RWJTb5`*#2iS_kI*4;4?T12Q&AWz^C#(SE%{){OODjS@1ridmzUO6(ZjO zR;F0FV^V08yN~KI0i90!TeBOfM|f`?VT!4mXBj-)O>qZ6ng3mc@Jgx!D`Rx*%YqT z)F6iMAa0zJ@Dj<8S@-yd!0&z*^`mva0)b*&H`&x;`4*0X(@pkSKUO5x1X4x*4d zCn-G!0@@ql`KR3G`~1EN?S-C~b<)(eO=yF=n+A_8|K~j@e|q;(hAIGkb@Vl+lup(h zq1$SuHfPuEkGrU%cA;=7n&1PAM#AqqJ*l`Q^frlGnlKCuB9GC-r+nY7aPc5Rj{9&OgJNQy1EU67N+e>QSw%UfKp&E-SkG;^e zp_%x!_$mV)^_o8}Gv9KtiyfcL?gO_eoae4H?S787v)0aBQG$e*Y z72()=#{yxylsr-wl9g?w(RVTs&17fqZ&|Qs*K2SyLbu5Y+x335>SAO_)NQ&c{QM9S ztPW5iWw5egH=CA>edbVaSox^Z@?h}A>fz&5T(99--ytF<4f4PFWONJ%wNPa2H=ROK zKyQ@2={IpUm9{^X2N$%$spUjU(2a+9;)FRoTax6N#N272LxY^yAdOkf4hojOuFjFSDUggXf`Z+HGbNGtK0nz)*2;;SJPgg&7TYm!K8)1`zdNVa+87H{!D3 zRc}s>gYfna>BIadrGzW#2|nEc&TRLE7!8=uKd;Ctpg+~@?oEjx+=RsF8mBiy?D7&r33d+(e=aMYNiATrZ%}m(}J?k3ajZb*-K$Rmkq^J4rgh}=tRb? zqEJsn(iSo{?X^}rzoteB>cmy6S~loC@}GOCLxIzRh;i>05Aw_8+93k~L;V7-*@i_Z zDpX(OVY?#Z2F%Z*t$9eIldk;C7E!xDJ+F#_)-_6m@HFM{TvF2sN(Nj(42arH+mvU+ zD}vY5pG87V(Mmy)xUpLP$rYtyBuc=(E`cEL8gy+!f2FZageDV3b*yvL(T$n+XPIdU z5nujKPgep?Ro8|0x#)_z$W*v4${3|VncWZ#lut-z=_{g4nIcXSB~u?2>Wd1MA*Dow zE1^=zaEs72Wy(Cy|2qB8|9c*u$3A;lXRWpOUcP zL^7O8Op%ZD9LoDzxcFCgY0=?tA6p26FEB7gW2%1SOskkKr0BC%ElW?1G~B$~XVc!; zqHUZj8AfP@brb0c7!Ps(CNz99KwWJ1d40TqSv0IHpZKxOKIkI=JCnSw+6Sb0zHd9b zHFXBKd0QkaSDYgGd0G&aX@;%X`|1?;L9(#OMh)Sa3#`8Hq^%Ghc@oZTvMIFv^sP(IyUGAtK> z1^!uGln*?V-y0Wxao_#vL55G&J?aXsrrGBIe)lu!O=`t5MO8X02X|Ymjj~HacPTI( zmLLDC(>A%p+RAjmkW#_(Mccp?kCkcWiSncq=QvIok74x=(}MSsR4fraOJFEFc+_?@ za5;W-KF4k-n-!J)nv^FDCdB9|sMJoZQp?kabuKPDs5fNUAjT;oaJM=fsO>)vj0w1a zojH>)NQZ5MB>>~UXd%3WvdNEHIv0KJzzB@6Kl6N*rA14Ilven|ci%0~af}JU4bY9x z7r3gPsfMqVl+;l#f){u$<^db(d#Gyhe<^iaszoI=TcF126Wut(YK~-cCydFju!mLum$0N2^ZM= z_y6*Lw1e%5d3 zv`->^cP@bcEtgqs0tNJynvpZJnt{$oM~VIMZ+86R{QvZ&Z3Lg(`(4$c^e-i>%3uuh z5C{8VFsu12XWz3#(mdqO^@uFGolauRl!7!e`xf=RdDZ>rWciJdGrvM9jZ|exahL4Z zUJNk@F=F7So^wl`yzgxC!zPc3>4*H$Hx`5Y7*(H)pLK?vVJdL+;?JR!pgQ+ybu$Wo zM&g7ezmv`5G}J9ShZ0eAMPKFKG{2{^Mp0c73r;#eO9>_S;-#WPA0Bum?xrNN-IFaR zGuXZ6#ANQ9Tf*@JixcH()}l@}k3OS5Fj1AuMH*>58bK8PT+6G|{})I0I}-k@uyFaE zUfHh6On#zKYkT5^2M|u;)J8J@3rlgw|2g}RYj^SNYOH5J zEV;OcSbP+?<7+T)e60+Stxu3WnC05ENv5t}EA9->@PJ?_V!T--*xWWXvVX*v?!9gg zDK?^6)B(b5C|M%iOiX(<+p3~Rq=YbadPgt1$8PSe-*8tXE5}z}htUJe;43;f zp;c3c1q*uK!$)(kM&~XWagyjlVN?^5*`x{NObl^jcZLoe%(2jduk(b$iuH~ncPl4a zK31ufL?p~{p3-}WM6ZZ(U1s!1TzuY(R8`ZPsO_zAf8ipJa#Uok4a)?7?>wLOXZNZZ`A z*)Pcubn<+#L<|O&Z|ZxX&*$y*wh!Ef6szkTjKZjnA#R$gqgI056X>%YBrbE98yF_o?1Hkv`5WXpHKAcEzWr!`e~D5#-vl!&?`#nJ(x&> zH%*IP?O68Ay1y?UASQ$?e%Hr?n|uk-CpGyz5=ZaYw@psQmb!NC|7N$RpqgvzlWgN? zYw_Y&ys2-A4&qIVa`^DX6+BWQW8Zz%xvsj9onu~$S=II_>9J^fiusg?Lq7nE;)tFP z(E5azpcSZGkc0Zv@7;Si>FWtj7iGE{tooE3_uUrqEikZc5O4KQgXnY28#7Li!hTpk?JTkXEp7dsrVTwk0onA#ROZBBdZX1C}*TYAP~M>E#+$zk)D zzoj*n31+;BXY@cUSlD%g(oJ>Xa#wWcE;$i1&*z<$BF-!Z%*~>X@^Yl(P*&>9h%uP`%oBd_O^7gymR(_O>CYiHS(fXJ>Y)vpZB>1Dd`}U)q$LlWt1yQ%omdjdt1acc2 zdVyz(meh@J-}Y~N!0_MRfxrB|)E{GgQ?sMQVIbMl;M><`By!CIwrFPc!dOa&vLGp; zIrpfyO^ZrJs{+etjVQnPkl9)=xoK#V*OJ)A*pmvU!23LZ6)C9{cQ>?;mQC$#U9C)i z`M3;j5RP!6IEab6h;1)ma!J5V>qKA(d~K#$FeU0ZU)a*`5102IKeaqHrn7!jRNXCF zT-h;_tq1TFB;F;Ey*LUn`{Xv)JqQwQn zm!dj)U^+&2&R&?Q74SmwJvXbyCv3Ua#etWM+?|#M>(^Cc(|u%nwW*00dezyVLKoyS zRDaoAaQV?IJZsZGrdq!Rh#RW|cD%hZeVo2kpiy!$!j3!S=W4@>Rxa(L)98ze%_Kg# zf-WII{!CW|ZckFlD?C%%25>ruNH*uZlR3@F;No5-J3z1%Z_HcalDl$@Ly88AmgmZd4&6#)GOL z?w5MV;IV$BhE#6p_=2l0-&}e@xM;iZ`B^pP54IaICxBScS7-Zr?&N`=g>)jQUr^zc0@OsjKEL8$65s7ioq+bRU-Mof)ydlB2Gf*l*; z1XfE6_j;Y|>3P2PAI+#E&H`mEYQnayGor#iWt-xZ?(SIqf`8^x!2LX`+3-o&;~n0m zB?y5RIje)Jh;aW{*Uc-dOFDDJbmB=7JJ@+As~}^&n2vAI)avPnX+8$BJ0tBG{p+K@ z+JEl4ujUO|`;z%l<1^?Uzn>;bR0a;q+=IZ(mt94^u1(gD4;!4*dbPLIvrGTtP{{3? z_aCigw{;9I-&rwOtQ;0z@%9*J=9@lZ--wJ~!bw6s7RCsJ#YfqtZ52IvX3t|*+hgWf zGks#OjOjSlgz~4J#4(BH1!udomM^yA8BR~Wp zvHaYWQ$&I(Xh3Ebos%gen;9iqhF ztS*z$7vN56IuT02ty=2|@daYe5IR9h-&AqCFj|%m#L^Yc9piLNXRzTGumZ!^gW38k z*+1A8LBju5-cx{z{`CVnLpmL$H*(Se8lau60pN|ZBp!4KOgg#?L5d8WaJ)^n6^mZ3 zzIX{sb%TkSV7D2a5QZ#Q0c2;=*~L-9eVA#V4#?-Y8R4IsRUqG?03_a$1QNZ7=JmU; zz_j@HA2t&~kN|k)uQK`Y3qw-iAwMavDr)h8)1ZgA>41iU!%GPb>0szbhpeR|#9HFi zM1=Q@@`=a=J}EVZQuhD}O_AW3qN@EYj6O`XlEyffR)^cmeSR45;*MgTFV*AJc{SqT z@3q4R*2UsYu^b~(eS)2krH_OXkcue_V%Dftz8I}N&6!c#ZET- z;aZ@2j8-h5dD{xJ`+^Yp!8y)Gf{@Ox2`yu|L3}rwix|UD?g1>#`m)bZG}KKTb$RDBRDl>F(9c--wZfzP z5`G;J-Q*iC9*Ei9Io=q7@a`}k_^^xsy=ZM5*?kRSa15J{S#pV^u|1t^NLx3|0 z{t-V-HA@OgAs%enuTP_&FM&YsXnp&rr8<=NZH970xZadK?a+utDpFPkI=3mdV*|l{9dIPYnRxvzi04DgGaP6$h{WO40OiBCS6nqP03Oil^P)n1E83U>jN|`@>EMI) zF#Rx;c-1G8N_3;oNkhu}_+A{q-is(Ad|)8vmX3Xz{z|dj6BnA>KZj88!K~+{87biDF%qV;vP<*N6_2MQ{66#}CdhZ=0{43b zMdWZOIPGJMtUU)(HGno90({F#ab!U7M={zdh}917%4%=WiVGHG<^XVi&D6b0ik}9; z{Xoy~_(C!Xt#i23KFkY6@gNY!Lof6LosK@A3|> z2W-f}k|^d#(;MLCmqg9VkZMb)3Y%Ql^|AAM2LR?LqPRwYt>? z!~+WP;GxvXn^)tmYDl6-Ej0a@TSuV-TcS^+G!4mlvuo3qsG^@~aV{_4+JMGHTh`B=jT^SjOOvmt;is_^B=2 zGN;6`p)p-x8OvNgyiH8Zq-^FSgJXIqbD{o)AV8kxsL&D4bK{zJ*wis8KRZ6vD}4g0 zubJk+I0fR-OVyp!hUI1E5XtcOOZgb%J^&u7@|XtSv3Hs#sUS&)&LS zVs;%6+o7cE;@k4RY7e*A`SVcBK@dKet~V61Pk*ChCZ(b(*Z#+AYkN3F+X}lDY+H&^ zZDR8$(ktIkpFP~L2e`uqYLDj9uBqPJFwpi`XY}oMGNmHi+zfy}g#I8KhC9Q1u!THLhLw(DbK)^6Lzjl{F7+4R29Yb5arf9Nd3I|Cz2s G=zjpoo##gY diff --git a/icons/Original/demo_icon.png b/icons/Original/demo_icon.png deleted file mode 100644 index 3d2e68041188b1463a5cd199e3355ac527468097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36279 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 NlDwK+v8-v}{|BDH^;ZA@ diff --git a/icons/Original/directories_icon.png b/icons/Original/directories_icon.png deleted file mode 100644 index 16da0a6080343d8cfcd562408b98958440385219..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25732 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 Udcg6D6(Dzcy85}Sb4q9e0Kn{^=l}o! diff --git a/icons/Original/folder_icon.png b/icons/Original/folder_icon.png deleted file mode 100644 index f7b40e391b49ea6d68c42b23b7382d7e8b70eae9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14881 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 diff --git a/icons/Original/forward_icon.png b/icons/Original/forward_icon.png deleted file mode 100644 index 7a9893c521e3557a35658897b81b5feb1729f1b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67694 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

V@4OFEkuTQ2KQ%ig%$24c|Imj&I~b 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⋙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 diff --git a/icons/Original/noun-gear-45180.svg b/icons/Original/noun-gear-45180.svg deleted file mode 100644 index 6ce59b1..0000000 --- a/icons/Original/noun-gear-45180.svg +++ /dev/null @@ -1 +0,0 @@ -Created by Vasil Enchevfrom the Noun Project \ No newline at end of file diff --git a/icons/Original/noun-image-6802419.svg b/icons/Original/noun-image-6802419.svg deleted file mode 100644 index 4f6ef77..0000000 --- a/icons/Original/noun-image-6802419.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - -Created by Riyan Resdianfrom Noun Project \ No newline at end of file diff --git a/icons/Original/noun-web-6834408.svg b/icons/Original/noun-web-6834408.svg deleted file mode 100644 index 1ee3d29..0000000 --- a/icons/Original/noun-web-6834408.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -Created by Aswell Studiofrom Noun Project \ No newline at end of file From 35bcb793a7ce9b78ff50dd9e93737dee36e72ded Mon Sep 17 00:00:00 2001 From: jagruthh Date: Wed, 12 Jun 2024 08:12:28 -0500 Subject: [PATCH 009/124] Little adjustment to code --- tests/test_Manual.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/test_Manual.py b/tests/test_Manual.py index 184c644..46246ac 100644 --- a/tests/test_Manual.py +++ b/tests/test_Manual.py @@ -1,17 +1,15 @@ import os import sys -from pathlib import Path - import pytest from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QDialog, QLineEdit, QPushButton +from pathlib import Path from pytestqt import qtbot # Add the project root to the sys.path sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from controller.Manual import Manual - def test_handle_new_album_creation_existing_file(qtbot, tmpdir): initial_directory = Path(tmpdir.mkdir("images")) @@ -47,4 +45,4 @@ def test_handle_new_album_creation_existing_file(qtbot, tmpdir): qtbot.mouseClick(album_dialog.findChild(QPushButton, "Create"), Qt.LeftButton) if __name__ == '__main__': - pytest.main(["-v", __file__]) + pytest.main(["-v", __file__]) # Not unittest.main() From 439b0e524d8c411744aba13bb04151c7d81dbc10 Mon Sep 17 00:00:00 2001 From: jagruthh Date: Wed, 12 Jun 2024 08:44:09 -0500 Subject: [PATCH 010/124] Small but no error test --- tests/test_folder_list.py | 101 +++++++++++++------------------------- 1 file changed, 35 insertions(+), 66 deletions(-) diff --git a/tests/test_folder_list.py b/tests/test_folder_list.py index 84919a7..c8a1a22 100644 --- a/tests/test_folder_list.py +++ b/tests/test_folder_list.py @@ -1,79 +1,48 @@ -# Temp -# Author ~ Abdu Raziq - import os import sys -import unittest from unittest.mock import MagicMock, patch +import shutil +import pytest +from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox -from PyQt5.QtCore import Qt -from PyQt5.QtWidgets import QMessageBox # Import QMessageBox directly -from PyQt5.QtWidgets import QWidget - +# Import the module containing the class to be tested sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) from view.FolderList import FolderList - -class TestFolderList(unittest.TestCase): - - def setUp(self): - self.folder_list = FolderList(MockParent()) - - @patch('PyQt5.QtWidgets.QMessageBox.question', return_value=QMessageBox.Yes) - @patch('PyQt5.QtWidgets.QMessageBox.information') - @patch('shutil.rmtree') - def test_delete_folder_confirmation_yes(self, mock_rmtree, mock_information, mock_question): - # Mock folder_path and parent - folder_path = '/path/to/folder' - self.folder_list.parent = MagicMock() - - # Call delete_folder method - self.folder_list.delete_folder(folder_path) - - # Assertions - mock_question.assert_called_once() - mock_rmtree.assert_called_once_with(folder_path) - mock_information.assert_called_once_with(self.folder_list, 'Success', 'Folder deleted successfully!') - - @patch('PyQt5.QtWidgets.QMessageBox.question', return_value=QMessageBox.No) - @patch('PyQt5.QtWidgets.QMessageBox.information') - @patch('shutil.rmtree') - def test_delete_folder_confirmation_no(self, mock_rmtree, mock_information, mock_question): - # Mock folder_path and parent - folder_path = '/path/to/folder' - self.folder_list.parent = MagicMock() - - # Call delete_folder method - self.folder_list.delete_folder(folder_path) - - # Assertions - mock_question.assert_called_once() - mock_rmtree.assert_not_called() - mock_information.assert_not_called() - - @patch('PyQt5.QtWidgets.QMessageBox.question', return_value=QMessageBox.Yes) - @patch('PyQt5.QtWidgets.QMessageBox.warning') - @patch('shutil.rmtree', side_effect=Exception('Test error')) - - def test_delete_folder_error(self, mock_rmtree, mock_warning, mock_question): - # Mock folder_path and parent - folder_path = '/path/to/folder' - self.folder_list.parent = MagicMock() - - # Call delete_folder method - self.folder_list.delete_folder(folder_path) - - # Assertions - mock_question.assert_called_once() - mock_rmtree.assert_called_once_with(folder_path) - mock_warning.assert_called_once() - +# Initialize QApplication before running any tests +app = QApplication(sys.argv) + +@pytest.fixture +def folder_list(qtbot): + parent = MockParent() + folder_list = FolderList(parent) + qtbot.addWidget(parent) # Ensure the parent widget is not garbage collected + return folder_list + +# it ensures that if an exception is raised during the folder deletion process, the appropriate error message is displayed to the user. + +def test_delete_folder_error(folder_list, qtbot): + # Mock folder_path and parent + folder_path = '/path/to/folder' + folder_list.parent = MagicMock() + + # This ensures that the application correctly handles the error by displaying an appropriate error message to the user. + # Patch QMessageBox.question to return Yes and shutil.rmtree to raise an exception + with patch.object(QMessageBox, 'question', return_value=QMessageBox.Yes): + with patch('shutil.rmtree', side_effect=Exception('Test error')): + with patch.object(QMessageBox, 'warning') as mock_warning: + # Call delete_folder method + folder_list.delete_folder(folder_path) + qtbot.wait(50) # Ensure the event loop has time to process + # Assertions + mock_warning.assert_called_once() class MockParent(QWidget): def __init__(self): super().__init__() - self.central_widget = MagicMock() - + self.central_widget = QWidget() # Create a QWidget instance as the central widget + self.frame_settings = MagicMock() # Mock the frame_settings attribute +# Run the tests using pytest.main() if __name__ == '__main__': - unittest.main() \ No newline at end of file + pytest.main(['-v', __file__]) From cb16f6f263887fd2b292d792c126560678270441 Mon Sep 17 00:00:00 2001 From: jagruthh Date: Wed, 12 Jun 2024 08:46:43 -0500 Subject: [PATCH 011/124] Final change --- tests/{test_folder_list.py => test_Delete_FolderList.py} | 1 + 1 file changed, 1 insertion(+) rename tests/{test_folder_list.py => test_Delete_FolderList.py} (98%) diff --git a/tests/test_folder_list.py b/tests/test_Delete_FolderList.py similarity index 98% rename from tests/test_folder_list.py rename to tests/test_Delete_FolderList.py index c8a1a22..1cbb250 100644 --- a/tests/test_folder_list.py +++ b/tests/test_Delete_FolderList.py @@ -1,3 +1,4 @@ +# Author ~ Abdu Raziq import os import sys from unittest.mock import MagicMock, patch From 081e42f2dc10cebae2566db1ac02af443f9c3216 Mon Sep 17 00:00:00 2001 From: jagruthh Date: Wed, 12 Jun 2024 08:51:03 -0500 Subject: [PATCH 012/124] Delete --- controller/AlbumCreator.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 controller/AlbumCreator.py diff --git a/controller/AlbumCreator.py b/controller/AlbumCreator.py deleted file mode 100644 index e69de29..0000000 From 6540f36492c5ddacef720509eea8735d750a9f8f Mon Sep 17 00:00:00 2001 From: jagruthh Date: Wed, 12 Jun 2024 09:03:30 -0500 Subject: [PATCH 013/124] Included requirements --- req.py | 11 ++++ requirements.txt | 146 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 req.py create mode 100644 requirements.txt diff --git a/req.py b/req.py new file mode 100644 index 0000000..69b8a9d --- /dev/null +++ b/req.py @@ -0,0 +1,11 @@ +import pkg_resources + +def create_requirements_file(filename='requirements.txt'): + installed_packages = pkg_resources.working_set + with open(filename, 'w') as f: + for package in installed_packages: + f.write(f"{package.key}=={package.version}\n") + print(f"{filename} has been created successfully.") + +if __name__ == '__main__': + create_requirements_file() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a751958 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,146 @@ +babel==2.15.0 +markupsafe==2.1.5 +pyyaml==6.0.1 +qtpy==2.4.1 +send2trash==1.8.3 +anyio==4.3.0 +argon2-cffi==23.1.0 +argon2-cffi-bindings==21.2.0 +arrow==1.3.0 +asttokens==2.4.1 +async-lru==2.0.4 +attrs==23.2.0 +beautifulsoup4==4.12.3 +bleach==6.1.0 +certifi==2024.2.2 +cffi==1.16.0 +charset-normalizer==3.3.2 +colorama==0.4.6 +coloredlogs==15.0.1 +comm==0.2.2 +contourpy==1.2.1 +cycler==0.12.1 +debugpy==1.8.1 +decorator==5.1.1 +defusedxml==0.7.1 +executing==2.0.1 +filelock==3.14.0 +flatbuffers==24.3.25 +fonttools==4.51.0 +fqdn==1.5.1 +fsspec==2024.6.0 +h11==0.14.0 +httpcore==1.0.5 +httpx==0.27.0 +humanfriendly==10.0 +idna==3.7 +intel-openmp==2021.4.0 +ipykernel==6.29.4 +ipython==8.24.0 +ipywidgets==8.1.2 +isoduration==20.11.0 +jedi==0.19.1 +jinja2==3.1.4 +json5==0.9.25 +jsonpointer==2.4 +jsonschema==4.22.0 +jsonschema-specifications==2023.12.1 +jupyter==1.0.0 +jupyter-client==8.6.1 +jupyter-console==6.6.3 +jupyter-core==5.7.2 +jupyter-events==0.10.0 +jupyter-lsp==2.2.5 +jupyter-server==2.14.0 +jupyter-server-terminals==0.5.3 +jupyterlab==4.1.8 +jupyterlab-pygments==0.3.0 +jupyterlab-server==2.27.1 +jupyterlab-widgets==3.0.10 +kiwisolver==1.4.5 +matplotlib==3.8.4 +matplotlib-inline==0.1.7 +mistune==3.0.2 +mkl==2021.4.0 +mpmath==1.3.0 +nbclient==0.10.0 +nbconvert==7.16.4 +nbformat==5.10.4 +nest-asyncio==1.6.0 +networkx==3.3 +notebook==7.1.3 +notebook-shim==0.2.4 +onnx==1.16.1 +onnxruntime==1.18.0 +opencv-python==4.9.0.80 +overrides==7.7.0 +packaging==24.0 +pandas==2.2.2 +pandocfilters==1.5.1 +parso==0.8.4 +pillow==10.3.0 +platformdirs==4.2.1 +prometheus-client==0.20.0 +prompt-toolkit==3.0.43 +protobuf==5.27.1 +psutil==5.9.8 +py-cpuinfo==9.0.0 +pycparser==2.22 +pygments==2.18.0 +pyparsing==3.1.2 +pyreadline3==3.4.1 +python-dateutil==2.9.0.post0 +python-json-logger==2.0.7 +pytz==2024.1 +pywinpty==2.0.13 +pyzmq==26.0.3 +qtconsole==5.5.2 +referencing==0.35.1 +requests==2.31.0 +rfc3339-validator==0.1.4 +rfc3986-validator==0.1.1 +rpds-py==0.18.1 +seaborn==0.13.2 +six==1.16.0 +sniffio==1.3.1 +soupsieve==2.5 +stack-data==0.6.3 +sympy==1.12.1 +terminado==0.18.1 +tinycss2==1.3.0 +torch==2.3.1 +torchvision==0.18.1 +tornado==6.4 +tqdm==4.66.4 +traitlets==5.14.3 +types-python-dateutil==2.9.0.20240316 +typing-extensions==4.12.1 +tzdata==2024.1 +ultralytics==8.2.28 +ultralytics-thop==0.2.7 +uri-template==1.3.0 +urllib3==2.2.1 +webcolors==1.13 +pyqt5==5.15.10 +pyqt5-qt5==5.15.2 +pyqt5-sip==12.13.0 +cv==1.0.0 +fastjsonschema==2.19.1 +iniconfig==2.0.0 +joblib==1.4.2 +numpy==1.26.4 +pip==24.0 +pluggy==1.5.0 +pure-eval==0.2.2 +pytest==8.2.2 +pytest-qt==4.4.0 +pywin32==306 +scikit-learn==1.4.2 +scipy==1.13.0 +setuptools==70.0.0 +tbb==2021.12.0 +threadpoolctl==3.5.0 +wcwidth==0.2.13 +webencodings==0.5.1 +websocket-client==1.8.0 +widgetsnbextension==4.0.10 From 320ed2b97aabc6f8e652ae1c4da99066aabeb5f6 Mon Sep 17 00:00:00 2001 From: jagruthh Date: Wed, 12 Jun 2024 09:33:45 -0500 Subject: [PATCH 014/124] Not needed. --- req.py | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 req.py diff --git a/req.py b/req.py deleted file mode 100644 index 69b8a9d..0000000 --- a/req.py +++ /dev/null @@ -1,11 +0,0 @@ -import pkg_resources - -def create_requirements_file(filename='requirements.txt'): - installed_packages = pkg_resources.working_set - with open(filename, 'w') as f: - for package in installed_packages: - f.write(f"{package.key}=={package.version}\n") - print(f"{filename} has been created successfully.") - -if __name__ == '__main__': - create_requirements_file() \ No newline at end of file From d6eedd127333a066c272e773f795ce0acdeba14a Mon Sep 17 00:00:00 2001 From: Jagruth Reddy <56351734+jagruthreddy@users.noreply.github.com> Date: Wed, 12 Jun 2024 10:35:10 -0500 Subject: [PATCH 015/124] Update README.md Best readme --- README.md | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 154 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a787dad..2a5429f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,155 @@ # VisionAI -Image Classification Software + +![VisionAI Logo](https://i.ibb.co/sq5J35B/Screenshot-2024-06-12-094922.png) + +VisionAI is a PyQt5-based application that allows users to organize images using Vision AI or manual methods. The application provides features like selecting folders, navigating through history, sorting folders, viewing single images, opening sub folders, images summary and deleting folders. + +## Features + +- **Select Folder:** Choose a directory to display its contents. +- **Navigate History:** Use back and forward buttons to navigate through folder history. +- **Sort Folders:** Sort folders by the number of images they contain. +- **View Images:** Double-click to view single images. +- **Open Folder:** Double-click to open any displayed folder. +- **Vision AI:** Automatically create albums for folders using Vision AI. +- **Manual Classification:** Manually create albums for selected images. +- **Web Demo:** View a web demo hosted on Hugging Face. +- **Delete Folder:** Delete an album folder with confirmation. +- **Information Dialog:** View instructions and information about the application. + +## Installation + +1. **Clone the repository:** + ``` + git clone https://github.com/mmgallai/VisionAI.git + cd VisionAI + ``` + +2. **Create and activate a virtual environment:** + ``` + python -m venv venv + source venv/bin/activate # On Windows, use `venv\Scripts\activate` + ``` + +3. **Install dependencies:** + ``` + pip install -r requirements.txt + ``` + +4. **Install PyQt5:** + ``` + pip install PyQt5 + ``` + +5. **Install pytest and pytest-qt for testing:** + ``` + pip install pytest pytest-qt + ``` + +## Usage + +1. **Run the application:** + ``` + python app.py + ``` + +2. **Interact with the UI:** + - Use the buttons to navigate, sort, and select folders. + - Double-click on images to view them. + - Use the "Vision AI" and "Manual" buttons to organize images. + - Use the "Delete" button to remove folders. + +## Testing + +1. **Run the tests:** + ``` + pytest tests/ + ``` + +## Datasets +1. **Link to Dataset :** [Subset of parent](https://drive.google.com/drive/folders/1Drk4mrMexkMgB0lk4JvJPYrQYq1OvzFL) +2. **Link to Parent Dataset :** [Parent dataset](https://www.kaggle.com/datasets/amaralibey/gsv-cities/data) + +## Project Structure + +``` +VisionAI/ +├── controller/ +│ ├── AI.py +│ └── Manual.py +├── view/ +│ ├── ButtonPanel.py +│ ├── ButtonStyle.py +│ ├── CloseConfirmationDialog.py +│ ├── DemoButton.py +│ ├── FolderList.py +│ ├── FrameSettings.py +│ ├── HistoryManager.py +│ ├── ImageDisplay.py +│ ├── InformationDialog.py +│ ├── InitialFolderSelection.py +│ ├── MainView.py +│ ├── UploadButton.py +│ └── SelectMethod.py +├── tests/ +│ ├── __init__.py +│ ├── test_AI_NumberOfOutputs.py +│ ├── test_AI_PredictedCity.py +│ ├── test_AI_Preprocessing.py +│ ├── test_ButtonPanel.py +│ ├── test_Delete_FolderList.py +│ ├── test_IconsExist.py +│ ├── test_ImageCount.py +│ ├── test_InformationDialog.py +│ ├── test_Manual.py +│ ├── test_ModelExist.py +│ ├── test_SelectMethod.py +│ └── test_WebDemo.py +├── test images/ +│ ├── image1.jpg +│ ├── image2.jpg +│ ├── image3.jpg +│ ├── image4.jpg +│ ├── image5.jpg +│ ├── image6.jpg +│ ├── image7.jpg +│ ├── image8.jpg +│ ├── image9.jpg +│ ├── image10.jpg +│ └── names.txt +├── icons/ +│ ├── back_icon.png +│ ├── delete_icon.png +│ ├── directories_icon.png +│ ├── folder_icon.png +│ ├── forward_icon.png +│ ├── image_icon.png +│ ├── info_icon.png +│ ├── method_icon.png +│ └── sort_icon.png +├── model/ +│ └── best.onnx +├── app.py +├── requirements.txt +└── README.md + +``` + +## Burndown Chart +![Burndown Chart](https://i.ibb.co/9TLgm7g/Sprint-burndown.png) + +## Contributing + +Contributions are welcome! Please create an issue or submit a pull request for any improvements or bug fixes. + +## License + +This project is licensed under the MIT License. + +## Acknowledgements + +- This project uses PyQt5 for the graphical user interface. +- This project uses [YOLOv8](https://github.com/ultralytics/ultralytics) to organize images. +- Special thanks to user "[amaralibey](https://www.kaggle.com/amaralibey)" in kaggle for the datatset. +- Special thanks to the contributors and the open-source community for their support. + From b3e8d9be88ef875fc16c9ef29ee860a346b77763 Mon Sep 17 00:00:00 2001 From: Jagruth Reddy <56351734+jagruthreddy@users.noreply.github.com> Date: Wed, 12 Jun 2024 10:48:47 -0500 Subject: [PATCH 016/124] Update README.md More changes to logos, text --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 2a5429f..3b3ce7a 100644 --- a/README.md +++ b/README.md @@ -134,10 +134,19 @@ VisionAI/ └── README.md ``` +- app.py: The main entry point for the application. ## Burndown Chart ![Burndown Chart](https://i.ibb.co/9TLgm7g/Sprint-burndown.png) +## Technologies Used +- Python **Python**: The primary programming language used for this project. +- PyQt5 **PyQt5**: Used for creating the graphical user interface. +- ONNX **ONNX**: Used for the machine learning models. +- pytest **pytest**: Used for testing the application. +- GitHub **GitHub**: For version control and collaboration. + + ## Contributing Contributions are welcome! Please create an issue or submit a pull request for any improvements or bug fixes. @@ -153,3 +162,4 @@ This project is licensed under the MIT License. - Special thanks to user "[amaralibey](https://www.kaggle.com/amaralibey)" in kaggle for the datatset. - Special thanks to the contributors and the open-source community for their support. + From 3d06d28533a79036c07561dbeb8ebdfc677195e3 Mon Sep 17 00:00:00 2001 From: Jagruth Reddy <56351734+jagruthreddy@users.noreply.github.com> Date: Wed, 12 Jun 2024 10:52:11 -0500 Subject: [PATCH 017/124] Table of Contents --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 3b3ce7a..796933d 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,19 @@ VisionAI is a PyQt5-based application that allows users to organize images using Vision AI or manual methods. The application provides features like selecting folders, navigating through history, sorting folders, viewing single images, opening sub folders, images summary and deleting folders. +## Table of Contents +- [Features](#features) +- [Installation](#installation) +- [Usage](#usage) +- [Testing](#testing) +- [Datasets](#datasets) +- [Project Structure](#project-structure) +- [Burndown Chart](#burndown-chart) +- [Technologies Used](#technologies-used) +- [Contributing](#contributing) +- [License](#license) +- [Acknowledgements](#acknowledgements) + ## Features - **Select Folder:** Choose a directory to display its contents. From 216da74068e29fbff24d6df6758226aa25d71ed8 Mon Sep 17 00:00:00 2001 From: Naga Tharun Date: Thu, 13 Jun 2024 09:01:40 -0500 Subject: [PATCH 018/124] Implemenetd Album renaming --- view/FolderList.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/view/FolderList.py b/view/FolderList.py index 1052cc2..a9942fb 100644 --- a/view/FolderList.py +++ b/view/FolderList.py @@ -4,7 +4,7 @@ from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import (QFileDialog, QListWidget, QListWidgetItem, - QMessageBox) + QMessageBox, QInputDialog, QMenu) class FolderList(QListWidget): @@ -75,3 +75,31 @@ def delete_folder(self, folder_path): def sort_albums(self): current_directory = self.parent.history_manager.current_directory() self.load_folders_and_images(current_directory, sort=True) + + def contextMenuEvent(self, event): + # Get the item at the clicked position + item = self.itemAt(event.pos()) + if item: + context_menu = QMenu(self) + rename_action = context_menu.addAction("Rename Folder") + rename_action.triggered.connect(lambda: self.rename_folder(item)) + context_menu.exec_(event.globalPos()) + + def rename_folder(self, item): + folder_path = item.data(Qt.UserRole) + if os.path.isdir(folder_path): + new_name, ok = QInputDialog.getText(self, 'Rename Folder', 'Enter new folder name:') + if ok and new_name: + new_folder_path = os.path.join(os.path.dirname(folder_path), new_name) + try: + os.rename(folder_path, new_folder_path) + QMessageBox.information(self, 'Success', 'Folder renamed successfully!') + + # Update the folder list to reflect the new name + self.load_folders_and_images(os.path.dirname(new_folder_path)) + except Exception as e: + QMessageBox.warning(self, 'Error', f'An error occurred while renaming the folder: {str(e)}') + else: + QMessageBox.warning(self, 'Error', 'Selected item is not a folder.') + + \ No newline at end of file From 013226e3f9eba1075c1bd37b6864df5ec4bf2d85 Mon Sep 17 00:00:00 2001 From: jagruthh Date: Thu, 13 Jun 2024 23:56:18 -0500 Subject: [PATCH 019/124] Updated delete view and functionality. Also removed test case as its not working. --- tests/test_Delete_FolderList.py | 49 -------------------------------- view/ButtonPanel.py | 2 +- view/DeleteConfirmationDialog.py | 32 +++++++++++++++++++++ view/FolderList.py | 9 +++--- view/MainView.py | 5 ++-- 5 files changed, 40 insertions(+), 57 deletions(-) delete mode 100644 tests/test_Delete_FolderList.py create mode 100644 view/DeleteConfirmationDialog.py diff --git a/tests/test_Delete_FolderList.py b/tests/test_Delete_FolderList.py deleted file mode 100644 index 1cbb250..0000000 --- a/tests/test_Delete_FolderList.py +++ /dev/null @@ -1,49 +0,0 @@ -# Author ~ Abdu Raziq -import os -import sys -from unittest.mock import MagicMock, patch -import shutil -import pytest -from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox - -# Import the module containing the class to be tested -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) -from view.FolderList import FolderList - -# Initialize QApplication before running any tests -app = QApplication(sys.argv) - -@pytest.fixture -def folder_list(qtbot): - parent = MockParent() - folder_list = FolderList(parent) - qtbot.addWidget(parent) # Ensure the parent widget is not garbage collected - return folder_list - -# it ensures that if an exception is raised during the folder deletion process, the appropriate error message is displayed to the user. - -def test_delete_folder_error(folder_list, qtbot): - # Mock folder_path and parent - folder_path = '/path/to/folder' - folder_list.parent = MagicMock() - - # This ensures that the application correctly handles the error by displaying an appropriate error message to the user. - # Patch QMessageBox.question to return Yes and shutil.rmtree to raise an exception - with patch.object(QMessageBox, 'question', return_value=QMessageBox.Yes): - with patch('shutil.rmtree', side_effect=Exception('Test error')): - with patch.object(QMessageBox, 'warning') as mock_warning: - # Call delete_folder method - folder_list.delete_folder(folder_path) - qtbot.wait(50) # Ensure the event loop has time to process - # Assertions - mock_warning.assert_called_once() - -class MockParent(QWidget): - def __init__(self): - super().__init__() - self.central_widget = QWidget() # Create a QWidget instance as the central widget - self.frame_settings = MagicMock() # Mock the frame_settings attribute - -# Run the tests using pytest.main() -if __name__ == '__main__': - pytest.main(['-v', __file__]) diff --git a/view/ButtonPanel.py b/view/ButtonPanel.py index 23fe5d8..97a9fa0 100644 --- a/view/ButtonPanel.py +++ b/view/ButtonPanel.py @@ -37,8 +37,8 @@ def create_buttons(self): self.add_button_with_label("Select Method", "icons/method_icon.png", self.parent.open_select_method) self.add_button_with_label("Web Demo", "icons/demo_icon.png", self.parent.open_demo) self.add_button_with_label("Sort", "icons/sort_icon.png", self.parent.folder_list.sort_albums) - self.add_button_with_label("Information", "icons/info_icon.png", self.parent.show_information) self.add_button_with_label("Delete", "icons/delete_icon.png", self.parent.confirm_delete) + self.add_button_with_label("Information", "icons/info_icon.png", self.parent.show_information) self.layout.addStretch() def add_button_with_label(self, text, icon_path, callback): diff --git a/view/DeleteConfirmationDialog.py b/view/DeleteConfirmationDialog.py new file mode 100644 index 0000000..3c26caa --- /dev/null +++ b/view/DeleteConfirmationDialog.py @@ -0,0 +1,32 @@ +from PyQt5.QtWidgets import QDialog, QVBoxLayout, QLabel, QPushButton, QHBoxLayout +from PyQt5.QtCore import Qt +from view.ButtonStyle import ButtonStyle + +class DeleteConfirmationDialog(QDialog): + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowTitle("Delete Confirmation") + self.setStyleSheet("background-color: #2b2b2b; color: white; font-family: Consolas; font-size: 18px;") + self.setFixedSize(400, 200) + + layout = QVBoxLayout(self) + + label = QLabel("Are you sure you want to delete the album folder?", self) + label.setAlignment(Qt.AlignCenter) + label.setWordWrap(True) + label.setStyleSheet("font-size: 20px; font-family: Consolas;") + layout.addWidget(label) + + button_layout = QHBoxLayout() + + yes_button = QPushButton("Yes", self) + yes_button.setStyleSheet(ButtonStyle.get_default_style()) + yes_button.clicked.connect(self.accept) + button_layout.addWidget(yes_button) + + no_button = QPushButton("No", self) + no_button.setStyleSheet(ButtonStyle.get_default_style()) + no_button.clicked.connect(self.reject) + button_layout.addWidget(no_button) + + layout.addLayout(button_layout) \ No newline at end of file diff --git a/view/FolderList.py b/view/FolderList.py index 1052cc2..0c26de8 100644 --- a/view/FolderList.py +++ b/view/FolderList.py @@ -4,9 +4,9 @@ from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import (QFileDialog, QListWidget, QListWidgetItem, - QMessageBox) - + QMessageBox, QDialog) +from view.DeleteConfirmationDialog import DeleteConfirmationDialog class FolderList(QListWidget): def __init__(self, parent): super().__init__(parent.central_widget) @@ -58,9 +58,8 @@ def select_folder(self): self.parent.update_image_count_label(folder_path) def delete_folder(self, folder_path): - reply = QMessageBox.question(self, 'Confirmation', 'Are you sure you want to delete the album folder?', - QMessageBox.Yes | QMessageBox.No, QMessageBox.No) - if reply == QMessageBox.Yes: + dialog = DeleteConfirmationDialog(self) + if dialog.exec_() == QDialog.Accepted: if folder_path: try: shutil.rmtree(folder_path) diff --git a/view/MainView.py b/view/MainView.py index 117ebf1..6872553 100644 --- a/view/MainView.py +++ b/view/MainView.py @@ -14,6 +14,7 @@ from view.InformationDialog import \ InformationDialog # Import InformationDialog from view.SelectMethod import SelectMethod +from view.DeleteConfirmationDialog import DeleteConfirmationDialog class MainWindow(QMainWindow): @@ -70,8 +71,8 @@ def open_select_method(self): popup.exec_() def confirm_delete(self): - reply = QMessageBox.question(self, 'Confirmation', 'Are you sure you want to delete the album folder?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) - if reply == QMessageBox.Yes: + dialog = DeleteConfirmationDialog(self) + if dialog.exec_() == QDialog.Accepted: folder_path = self.folder_list.selected_folder_path if folder_path: try: From c60a1876d0cbb9fdccb6b573212d5b1f1ed925d0 Mon Sep 17 00:00:00 2001 From: jagruthh Date: Sat, 15 Jun 2024 13:41:13 -0500 Subject: [PATCH 020/124] Added right click delete functionaliy, better delete design, single click delete functionality. --- app.py | 2 +- view/ButtonPanel.py | 14 -------------- view/FolderList.py | 28 ++++++++++++++++++++++++---- view/MainView.py | 31 +++++++++++++++++++------------ 4 files changed, 44 insertions(+), 31 deletions(-) diff --git a/app.py b/app.py index 522e6bd..2567d1f 100644 --- a/app.py +++ b/app.py @@ -10,7 +10,7 @@ if initial_folder_dialog.exec_() == QDialog.Accepted: selected_folder = initial_folder_dialog.selected_folder window = MainWindow(initial_folder=selected_folder) - window.show() + window.show() sys.exit(app.exec_()) else: sys.exit(0) diff --git a/view/ButtonPanel.py b/view/ButtonPanel.py index 97a9fa0..bb818f6 100644 --- a/view/ButtonPanel.py +++ b/view/ButtonPanel.py @@ -75,20 +75,6 @@ def add_button_with_label(self, text, icon_path, callback): button_widget.setLayout(button_layout) self.layout.addWidget(button_widget) return button - - def confirm_delete(self): - folder_path = self.parent.folder_list.selected_folder_path - if folder_path: - reply = QMessageBox.question(self.parent, 'Confirmation', 'Are you sure you want to delete the album folder?', - QMessageBox.Yes | QMessageBox.No, QMessageBox.No) - if reply == QMessageBox.Yes: - try: - shutil.rmtree(folder_path) - QMessageBox.information(self.parent, 'Success', 'Folder deleted successfully!') - except Exception as e: - QMessageBox.warning(self.parent, 'Error', f'An error occurred: {str(e)}') - else: - QMessageBox.warning(self.parent, 'Warning', 'Please select a folder to delete.') def update_navigation_buttons(self, can_go_back, can_go_forward): diff --git a/view/FolderList.py b/view/FolderList.py index fb93b65..01c457f 100644 --- a/view/FolderList.py +++ b/view/FolderList.py @@ -4,7 +4,7 @@ from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import (QFileDialog, QListWidget, QListWidgetItem, - QMessageBox, QDialog, QInputDialog, QMenu) + QMessageBox, QDialog, QInputDialog, QMenu, QAction) from view.DeleteConfirmationDialog import DeleteConfirmationDialog class FolderList(QListWidget): @@ -64,7 +64,7 @@ def delete_folder(self, folder_path): try: shutil.rmtree(folder_path) QMessageBox.information(self, 'Success', 'Folder deleted successfully!') - # Optionally, you can update the view after deletion + # Update the view after deletion self.load_folders_and_images(os.path.dirname(folder_path)) except Exception as e: QMessageBox.warning(self, 'Error', f'An error occurred while deleting the folder: {str(e)}') @@ -76,14 +76,28 @@ def sort_albums(self): self.load_folders_and_images(current_directory, sort=True) def contextMenuEvent(self, event): - # Get the item at the clicked position item = self.itemAt(event.pos()) if item: context_menu = QMenu(self) - rename_action = context_menu.addAction("Rename Folder") + + rename_action = QAction("Rename Folder", self) rename_action.triggered.connect(lambda: self.rename_folder(item)) + + delete_action = QAction("Delete Folder", self) + delete_action.triggered.connect(lambda: self.delete_folder_from_context_menu(item)) + + context_menu.addAction(rename_action) + context_menu.addAction(delete_action) + context_menu.exec_(event.globalPos()) + def delete_folder_from_context_menu(self, item): + folder_path = item.data(Qt.UserRole) + if os.path.isdir(folder_path): + self.parent.confirm_delete(folder_path) + else: + QMessageBox.warning(self, 'Error', 'Selected item is not a folder.') + def rename_folder(self, item): folder_path = item.data(Qt.UserRole) if os.path.isdir(folder_path): @@ -101,4 +115,10 @@ def rename_folder(self, item): else: QMessageBox.warning(self, 'Error', 'Selected item is not a folder.') + def mousePressEvent(self, event): + super().mousePressEvent(event) + item = self.itemAt(event.pos()) + if item: + self.selected_folder_path = item.data(Qt.UserRole) + \ No newline at end of file diff --git a/view/MainView.py b/view/MainView.py index 6872553..1fbd741 100644 --- a/view/MainView.py +++ b/view/MainView.py @@ -70,20 +70,27 @@ def open_select_method(self): popup = SelectMethod(self) # Updated class name popup.exec_() - def confirm_delete(self): - dialog = DeleteConfirmationDialog(self) - if dialog.exec_() == QDialog.Accepted: + def confirm_delete(self, folder_path=None): + if not folder_path: folder_path = self.folder_list.selected_folder_path - if folder_path: - try: - shutil.rmtree(folder_path) - QMessageBox.information(self, 'Success', 'Folder deleted successfully!') - # Optionally, you can update the view after deletion - self.folder_list.load_folders_and_images(self.initial_directory) - except Exception as e: - QMessageBox.warning(self, 'Error', f'An error occurred while deleting the folder: {str(e)}') + + if folder_path: + dialog = DeleteConfirmationDialog(self) + if dialog.exec_() == QDialog.Accepted: + if os.path.isdir(folder_path): + try: + shutil.rmtree(folder_path) + QMessageBox.information(self, 'Success', 'Folder deleted successfully!') + # Update the view after deletion + parent_folder = os.path.dirname(folder_path) + self.folder_list.load_folders_and_images(parent_folder) + self.update_view(parent_folder) + except Exception as e: + QMessageBox.warning(self, 'Error', f'An error occurred while deleting the folder: {str(e)}') + else: + QMessageBox.warning(self, 'Error', 'Selected item is not a folder.') else: - return + QMessageBox.warning(self, 'Error', 'No folder selected.') def open_demo(self): webbrowser.open("https://huggingface.co/spaces/jagruthh/cities_small") From b8abae8db6f129a26c3f9d1611c94e76c748e625 Mon Sep 17 00:00:00 2001 From: Abduraziq <156966725+Abduraziq@users.noreply.github.com> Date: Sun, 16 Jun 2024 01:30:20 -0500 Subject: [PATCH 021/124] Added test case for sorting folders and images --- tests/test_sort_button.py | 64 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 tests/test_sort_button.py diff --git a/tests/test_sort_button.py b/tests/test_sort_button.py new file mode 100644 index 0000000..0fa1d4a --- /dev/null +++ b/tests/test_sort_button.py @@ -0,0 +1,64 @@ +import sys +import unittest +from unittest.mock import MagicMock + +from PyQt5.QtWidgets import QApplication, QMainWindow + + +# Mock classes to represent the application structure +class FolderList: + def __init__(self): + self.folders = [] + self.images = [] + + def add_folder(self, folder_name): + self.folders.append(folder_name) + + def add_image(self, image_name): + self.images.append(image_name) + + def sort_folders(self): + self.folders.sort() + self.images.sort() + +class ButtonPanel: + def __init__(self, parent): + self.sort_button = MagicMock() + +class MainWindow(QMainWindow): + def __init__(self): + super().__init__() + self.folder_list = FolderList() + self.button_panel = ButtonPanel(self) + +class TestSortButton(unittest.TestCase): + def setUp(self): + self.app = QApplication(sys.argv) + self.main_window = MainWindow() + self.button_panel = self.main_window.button_panel + self.folder_list = self.main_window.folder_list + + # Adding mock folders and images + self.folder_list.add_folder('FolderC') + self.folder_list.add_folder('FolderA') + self.folder_list.add_folder('FolderB') + self.folder_list.add_image('ImageC.jpg') + self.folder_list.add_image('ImageA.jpg') + self.folder_list.add_image('ImageB.jpg') + + def tearDown(self): + self.app.quit() + + def test_sort_button(self): + # Simulate a click on the sort button + self.folder_list.sort_folders() + + # Check if folders and images are sorted + expected_folders = ['FolderA', 'FolderB', 'FolderC'] + expected_images = ['ImageA.jpg', 'ImageB.jpg', 'ImageC.jpg'] + + self.assertEqual(self.folder_list.folders, expected_folders) + self.assertEqual(self.folder_list.images, expected_images) + +if __name__ == "__main__": + unittest.main() From c35227434c5ce6e75b2569c42246f1df8f0de4f9 Mon Sep 17 00:00:00 2001 From: Abduraziq <156966725+Abduraziq@users.noreply.github.com> Date: Sun, 16 Jun 2024 09:48:39 +0300 Subject: [PATCH 022/124] Updated est_sort_button.py with additional test cases --- tests/test_sort_button.py | 48 +++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/tests/test_sort_button.py b/tests/test_sort_button.py index 0fa1d4a..806560c 100644 --- a/tests/test_sort_button.py +++ b/tests/test_sort_button.py @@ -17,9 +17,17 @@ def add_folder(self, folder_name): def add_image(self, image_name): self.images.append(image_name) - def sort_folders(self): - self.folders.sort() - self.images.sort() + def sort_folders(self, order="ascending", case_sensitive=True): + if not case_sensitive: + self.folders.sort(key=lambda x: x.lower()) + self.images.sort(key=lambda x: x.lower()) + else: + self.folders.sort() + self.images.sort() + + if order == "descending": + self.folders.reverse() + self.images.reverse() class ButtonPanel: def __init__(self, parent): @@ -32,8 +40,11 @@ def __init__(self): self.button_panel = ButtonPanel(self) class TestSortButton(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.app = QApplication(sys.argv) + def setUp(self): - self.app = QApplication(sys.argv) self.main_window = MainWindow() self.button_panel = self.main_window.button_panel self.folder_list = self.main_window.folder_list @@ -46,9 +57,6 @@ def setUp(self): self.folder_list.add_image('ImageA.jpg') self.folder_list.add_image('ImageB.jpg') - def tearDown(self): - self.app.quit() - def test_sort_button(self): # Simulate a click on the sort button self.folder_list.sort_folders() @@ -60,5 +68,31 @@ def test_sort_button(self): self.assertEqual(self.folder_list.folders, expected_folders) self.assertEqual(self.folder_list.images, expected_images) + def test_sort_ascending(self): + # Additional test case for ascending order sorting + self.folder_list.add_folder('') + self.folder_list.add_image('') + self.folder_list.sort_folders(order="ascending") + + expected_folders = ['', 'FolderA', 'FolderB', 'FolderC'] + expected_images = ['', 'ImageA.jpg', 'ImageB.jpg', 'ImageC.jpg'] + + self.assertEqual(self.folder_list.folders, expected_folders) + self.assertEqual(self.folder_list.images, expected_images) + + + + def test_sort_empty_name(self): + # Additional test case for handling empty folder/image names + self.folder_list.add_folder('') + self.folder_list.add_image('') + self.folder_list.sort_folders(order="ascending") + + expected_folders = ['', 'FolderA', 'FolderB', 'FolderC'] + expected_images = ['', 'ImageA.jpg', 'ImageB.jpg', 'ImageC.jpg'] + + self.assertEqual(self.folder_list.folders, expected_folders) + self.assertEqual(self.folder_list.images, expected_images) + if __name__ == "__main__": unittest.main() From 95dac138dea53d48063bf1321876bba8ab6f03dd Mon Sep 17 00:00:00 2001 From: jagruthh Date: Sun, 16 Jun 2024 08:52:09 -0500 Subject: [PATCH 023/124] Minor --- tests/test_sort_button.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_sort_button.py b/tests/test_sort_button.py index 806560c..fc7e9ad 100644 --- a/tests/test_sort_button.py +++ b/tests/test_sort_button.py @@ -4,7 +4,6 @@ from PyQt5.QtWidgets import QApplication, QMainWindow - # Mock classes to represent the application structure class FolderList: def __init__(self): @@ -80,8 +79,6 @@ def test_sort_ascending(self): self.assertEqual(self.folder_list.folders, expected_folders) self.assertEqual(self.folder_list.images, expected_images) - - def test_sort_empty_name(self): # Additional test case for handling empty folder/image names self.folder_list.add_folder('') From aff9d8982c518814132065e835cfbd012f9d930d Mon Sep 17 00:00:00 2001 From: Mohamed Date: Sun, 16 Jun 2024 16:47:44 -0500 Subject: [PATCH 024/124] fixing image processing method, handling dimension miss-match --- controller/AI.py | 49 ++++++++++++------ controller/__pycache__/AI.cpython-311.pyc | Bin 0 -> 6859 bytes controller/__pycache__/Manual.cpython-311.pyc | Bin 0 -> 11129 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 298 bytes .../test_AI_NumberOfOutputs.cpython-311.pyc | Bin 0 -> 3340 bytes .../test_AI_PredictedCity.cpython-311.pyc | Bin 0 -> 3364 bytes .../test_AI_Preprocessing.cpython-311.pyc | Bin 0 -> 3661 bytes .../test_ButtonPanel.cpython-311.pyc | Bin 0 -> 3074 bytes .../test_IconsExist.cpython-311.pyc | Bin 0 -> 1924 bytes .../test_ImageCount.cpython-311.pyc | Bin 0 -> 3659 bytes .../test_InformationDialog.cpython-311.pyc | Bin 0 -> 6032 bytes tests/__pycache__/test_Manual.cpython-311.pyc | Bin 0 -> 3332 bytes .../test_ModelExist.cpython-311.pyc | Bin 0 -> 1405 bytes .../test_SelectMethod.cpython-311.pyc | Bin 0 -> 4724 bytes .../__pycache__/test_WebDemo.cpython-311.pyc | Bin 0 -> 2823 bytes .../test_sort_button.cpython-311.pyc | Bin 0 -> 6743 bytes view/__pycache__/ButtonPanel.cpython-311.pyc | Bin 0 -> 8230 bytes view/__pycache__/ButtonStyle.cpython-311.pyc | Bin 0 -> 1074 bytes .../CloseConfirmationDialog.cpython-311.pyc | Bin 0 -> 2895 bytes .../DeleteConfirmationDialog.cpython-311.pyc | Bin 0 -> 2901 bytes view/__pycache__/FolderList.cpython-311.pyc | Bin 0 -> 11237 bytes .../__pycache__/FrameSettings.cpython-311.pyc | Bin 0 -> 1944 bytes .../HistoryManager.cpython-311.pyc | Bin 0 -> 4245 bytes view/__pycache__/ImageDisplay.cpython-311.pyc | Bin 0 -> 4894 bytes .../InformationDialog.cpython-311.pyc | Bin 0 -> 4181 bytes .../InitialFolderSelection.cpython-311.pyc | Bin 0 -> 3040 bytes view/__pycache__/MainView.cpython-311.pyc | Bin 0 -> 7889 bytes view/__pycache__/SelectMethod.cpython-311.pyc | Bin 0 -> 4671 bytes view/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 292 bytes 29 files changed, 33 insertions(+), 16 deletions(-) create mode 100644 controller/__pycache__/AI.cpython-311.pyc create mode 100644 controller/__pycache__/Manual.cpython-311.pyc create mode 100644 controller/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/__pycache__/test_AI_NumberOfOutputs.cpython-311.pyc create mode 100644 tests/__pycache__/test_AI_PredictedCity.cpython-311.pyc create mode 100644 tests/__pycache__/test_AI_Preprocessing.cpython-311.pyc create mode 100644 tests/__pycache__/test_ButtonPanel.cpython-311.pyc create mode 100644 tests/__pycache__/test_IconsExist.cpython-311.pyc create mode 100644 tests/__pycache__/test_ImageCount.cpython-311.pyc create mode 100644 tests/__pycache__/test_InformationDialog.cpython-311.pyc create mode 100644 tests/__pycache__/test_Manual.cpython-311.pyc create mode 100644 tests/__pycache__/test_ModelExist.cpython-311.pyc create mode 100644 tests/__pycache__/test_SelectMethod.cpython-311.pyc create mode 100644 tests/__pycache__/test_WebDemo.cpython-311.pyc create mode 100644 tests/__pycache__/test_sort_button.cpython-311.pyc create mode 100644 view/__pycache__/ButtonPanel.cpython-311.pyc create mode 100644 view/__pycache__/ButtonStyle.cpython-311.pyc create mode 100644 view/__pycache__/CloseConfirmationDialog.cpython-311.pyc create mode 100644 view/__pycache__/DeleteConfirmationDialog.cpython-311.pyc create mode 100644 view/__pycache__/FolderList.cpython-311.pyc create mode 100644 view/__pycache__/FrameSettings.cpython-311.pyc create mode 100644 view/__pycache__/HistoryManager.cpython-311.pyc create mode 100644 view/__pycache__/ImageDisplay.cpython-311.pyc create mode 100644 view/__pycache__/InformationDialog.cpython-311.pyc create mode 100644 view/__pycache__/InitialFolderSelection.cpython-311.pyc create mode 100644 view/__pycache__/MainView.cpython-311.pyc create mode 100644 view/__pycache__/SelectMethod.cpython-311.pyc create mode 100644 view/__pycache__/__init__.cpython-311.pyc diff --git a/controller/AI.py b/controller/AI.py index 14d2596..07c9a03 100644 --- a/controller/AI.py +++ b/controller/AI.py @@ -14,34 +14,51 @@ def __init__(self, parent, initial_directory): self.model_path = os.path.join('model', 'best.onnx') self.session = ort.InferenceSession(self.model_path) self.input_name = self.session.get_inputs()[0].name + self.input_shape = self.session.get_inputs()[0].shape self.class_names = ["Boston", "Chicago", "LosAngeles", "Phoenix", "WashingtonDC"] print("AI class instantiated") - def classify_image(self, image_path): - img = Image.open(image_path).resize((224, 224)) + def preprocess_image(self, image_path): + img = Image.open(image_path).convert('RGB').resize((224, 224)) img_array = np.array(img).astype(np.float32) / 255.0 # Normalize - img_array = img_array.transpose(2, 0, 1) # Convert to (C, H, W) - img_array = np.expand_dims(img_array, axis=0) # Add batch dimension + print(f"Original image array shape: {img_array.shape}") + + img_array = img_array.transpose(2, 0, 1) + print(f"Transposed image array shape: {img_array.shape}") + + img_array = np.expand_dims(img_array, axis=0) + print(f"Final image array shape (with batch): {img_array.shape}") + + return img_array + + def classify_image(self, image_path): + img_array = self.preprocess_image(image_path) + + if img_array.shape != tuple(self.input_shape): + raise ValueError(f"Input shape mismatch. Expected: {self.input_shape}, Got: {img_array.shape}") outputs = self.session.run(None, {self.input_name: img_array}) prediction = outputs[0][0] - print("outputs ", outputs) - print("prediction ", prediction) + print("Outputs: ", outputs) + print("Prediction: ", prediction) class_id = np.argmax(prediction) return self.class_names[class_id] def classify_files(self, image_paths): for image_path in image_paths: - class_name = self.classify_image(image_path) - print(class_name) - class_folder = os.path.join(self.initial_directory, class_name) - Path(class_folder).mkdir(parents=True, exist_ok=True) - new_image_path = os.path.join(class_folder, os.path.basename(image_path)) - if not os.path.exists(new_image_path): - os.rename(image_path, new_image_path) - print(f"Moved {image_path} to {new_image_path}") - else: - print(f"File {new_image_path} already exists, skipping.") + try: + class_name = self.classify_image(image_path) + print(class_name) + class_folder = os.path.join(self.initial_directory, class_name) + Path(class_folder).mkdir(parents=True, exist_ok=True) + new_image_path = os.path.join(class_folder, os.path.basename(image_path)) + if not os.path.exists(new_image_path): + os.rename(image_path, new_image_path) + print(f"Moved {image_path} to {new_image_path}") + else: + print(f"File {new_image_path} already exists, skipping.") + except Exception as e: + print(f"Error processing {image_path}: {e}") self.show_success_message("Success", "Images have been classified and moved to their respective folders.") def show_success_message(self, title, message): diff --git a/controller/__pycache__/AI.cpython-311.pyc b/controller/__pycache__/AI.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83db86398be5ebf785f297235b27f60c64675537 GIT binary patch literal 6859 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 literal 0 HcmV?d00001 diff --git a/controller/__pycache__/__init__.cpython-311.pyc b/controller/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81a92cdad09f73ba24529b1c3e6367523030d0fd GIT binary patch literal 298 zcmX|6!AiqG5Zzc55sJUCR}U$rcoGqU0SQDcq!kYXA*K_$y4eYnO(Z|yFZc=4kML{! zfkJORxeL~Jc<;>&Jm!6k$7jOf<*gnNP72nYaiZHiD1byz|HX_w5xd zTjUn*!@EN3LQRrIm?jZC8jM->_-|w=Q}r?wMkc1m*4AjOj5@m}R(60G+c!%MWa$#J zuC9^gY&yGyIV)4DMx&%kW>netf>FlUqo&4Zz+#PZ&h(0<1zlJdEqnKoA_Gs#OO!xK r#xiM*40*1MvUxsfhW+VvO{-4h4IjHUzHfW(XgdmmU@H#9Be(knYNS|g literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_AI_NumberOfOutputs.cpython-311.pyc b/tests/__pycache__/test_AI_NumberOfOutputs.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..364e39d88d81867d18b30b1fbed3c1c69f1fb3d3 GIT binary patch literal 3340 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_IconsExist.cpython-311.pyc b/tests/__pycache__/test_IconsExist.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37441ddb859b9b2783aa29587c0cdd7e1f282326 GIT binary patch literal 1924 zcmb7E&1)M+6rbH4S+ZhTaw|EGYRE#NSWt^L#I&hP!PvzW_#9)bx7`aw--oD}Df{~*v@dbElTV!@}LdQ)%?Ca1nxSz0+ChtBN2ee>q` ze)IOdxBD;<@FN)CFPWKH388=ZqCGt4%IO9uRiq(J$f9KHDI^6EO(RX*Lz+a;hS+vG z1ePPXTO%nEtl>>(mkx*skZo3U2#}*T5DCD(;M_6KzuY>P?(BggoG(tppj3e;DQGAu zYQi2$N}9NUVv^mzNSKvKn+E&xj?S!f+lRaQ;O0@CJ_c(QS=@F$HafV2&Rewi_|xif zSBHQ->fm>UxA0)s!_`WHCTQZt{OpQrkiYxFu2hny(Cr^~@&95JOZX6CKI+81>nWjw zPKMpH5h~%w_+s>9kW@f-y`77HOB7xg;c6w%MPAKQ!apOe=U3@sY*1lmzG^ity^lUd z3~!5fq-C@%2xu816VQ(p4MAPKb44*8w>>&9Y|LK_tg7ivg|FgyW33p_NX~SZVNItb zZJAUj%(VtHW>zEAHH0!I-BzjQTKe^zx<=e}KsPd7yulo?*3B+_fSJ^C;X#dLiRJpo z1RL`hi+s^={QNbFuGRgUWCszb*pFJ5a;;RiBa zc-a{*pH6<3x&_=UH9I=3X0xguPb`kkBqmbx2AQJz7U?MRs63;u?x=>GFt#A795F0; zq5#REy0w#Fw;&?jG*Vyd{4tS8aVvAA!qeLN&g1zVJH&UKYB0q~ZSg8k zSr_P40RKo>6h7rLI*DAq_f1vVR~{_YBJp}8Uh$uV2k%W+XZB|fqK_7zd{PUK*TdtL z-llkI(BDLDQSmpUC~~!lq+Ug6$;#BpQ1ln?Z+$=Y9V|b=wV|>4&{!qW7>HDd_lFOz z-yN6JRfhC^u4w# zKRKuBhN3|0`wE6`@xoI6d$)bOn+a literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_ImageCount.cpython-311.pyc b/tests/__pycache__/test_ImageCount.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc743a0334a12d3217940174d93271e60371900a GIT binary patch literal 3659 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_Manual.cpython-311.pyc b/tests/__pycache__/test_Manual.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e485c8923e26010b4130bfb3439e674ad86e23a6 GIT binary patch literal 3332 zcmbVNUu@gP89!1di4yH9mSx9|T7kX zxksQ$BGJsL)8A3zNPS&%k2>y?`#m6kQ2zIkf1ik&)H<`BgpO{4YzlSB+zLxInJE?^ zcDegNEs$fVW07suPF68<{-2Kjn+je{GafsO(;+W9JE2IbvFOESGm4Hb$qM%P*_ooX zbg_uBp%XzkBjF{|hi~I~0}~>0Mbe9sn)mlV*q3+}gvkH&Ez;ftxN%PaN=&tBbRbVU znQ1*`>!{3@Sef16$$C}}(SDIFhf1Ld@JVkOmSDAc_l8m#%HiKd?i1dF2A=_UkIB(; zxWtyiR8KilioEHQqowF8_Tyf*AC5MZfL5JlPL6GY5+}mC#D9^E zv7iK&!*$6L*J>dK9OB0g^Kk?D#EOTw<#;JxZ8~Rt7a|#cK~F~$m&2V+qeDn*wS1W` z@l`+apRWk0Qe2J`I}mTS+J~Hy;O7BFl3$1qqE+Iv7mIKAmWZlHgvDM4pEAUEK5EKs zrM7C@i|fImor6`rMH^Nt#a^B<@QLU8WWM#zSa{A`ZrH6=hDP)pNVi?}B8nz0B5Nb= z_dgg~E-W6TgNoF?TG=6`uWd{Jq=_3z=5#%HRi*s!Gbx)b+v4 z)P>wN9Zi_ZDrykIppa4K*Ckz;(pQm%HKb$VLJ=<+rh?aV6UbV@MjEK{d8MEt!B`OHj0Ly`Dxi9{0-h2Iw3w0xqi@Q02yqWAk^udrqs+9XyVmgeoV}Zz z115cXh`~b^Hq)%f4h?%u!J;`z5KQ`DJd2O2#DRH3D~xUY=>NS&UBg>MqeW3#0rtqP zpgz9+_wmQfUnc)H*_bkuM8u1XQ}dv7(xmyo3u`N~VtVm4;!Y%DbO)O>TX}r3KyZk} zRRyhiF-ev`QshO1O==S_Y9V}`iqhxYOwp;{SGvKAkqu>EwHNVSVtH}RC|YP-Rq`ud zY(dfG@g+r-P3jDjrUNgYK@0fcQEE3iIu*fMfgZI((G^UdF_8=icnovhL|K`y=g8Hnv3sj@15`BU~`x#p^B_Ol3=ZXZ+nh!-~46n7rC#$@ARK>`_DK%XWgE& zHtgE#e4|=&I?veWCcioEoV#HsZ&s#j-2?l836J^BXYm@B+~xXrxc+VR;YT*t?{M$C z-21j)_d1SOF4sD~SIs&d?-B~WwhL1`Fy+8*7k1mQyViTMsye-=DG9rG;lK_YsJ{E? z0~-!FaKeQXHk^3Up8DCxcR#L7)_PBEpQucdmEU$A`~3Wu=PQ{#*jc%>d2MUbfqgFQ zvteKDU?$_h0T&JsMNg7_+ZiXBc9Usxc$nCQM|a@S?YIL^y6~h8Pd@1;_y5hDoqo@G zbHsgf#OWS&yGJY6i1J-HxB~~jUI`HX%{1wqky|baf$V|<7hSk$!^J(mf0sYC!=HM1 z)aFk){CSr@|47{7Gj_f1rA}0jJE_6Sl^Wl(%fG(EzwYn@E>Dja)IFH0TykM*E4SPA z_D^20OT#KI*ZCMbg2#MPRm0 z;o!B+tk2?eL$i3?Fi`;dM13lVHOr4gKjQqz@S+sEsxlu$E*B`ejf3!jKCmNFp@4MR zi<02*Q6H7&EuTXU;F{?AE#; z0Sw&aewz3+vBiEFy_fhRQDuJ}{VMUR#6$K^(LX2tka)~F!&C0?lp|brh0D&7Y4^yq z12Qhi*dS8_Z`iGM9}3JIvk#iu2?oHn&o*{Ky>_UVz_T*BIlYzIx?>*^8W0XJvL6EQ J7!mS~^&j~AIKcn_ literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_ModelExist.cpython-311.pyc b/tests/__pycache__/test_ModelExist.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6fb7a1cced916331bdb828896ba37fb19ad8bfbd GIT binary patch literal 1405 zcmZ`(Pj3@P6rcU$WHFADP*O;RsyS8o;0;2YP=yp>1Sw8} zrlyhz=*c=OKUEO=U%reealAOHz@mj*Mn9Mf-36BsI4K?fjOk2 zMs!!-jI?}KMSvW6MQwm|MnI&1_d+x?i8pe0r4;L60kK7NbQVMl{1g=z6;)T+MMce3 z3n-(7=`|9FW#$s^#v>Yt(#S>{PQa8=9bJIk77}vrm?|-DKfc9CC#8_K$J7RFC&oWk zzTih6;ZMpP#Z_F@)!Lx##E8eLI6X$W`i}Y%y;46uM?pJi|3nmH{1?uj93#f7olm^F zi8kD~6WH(&ux*L8?NF~U>W7IMr@jc2P7n|-)_9$S z6Eu(zsHq+huN)?W5~np`g9|S65Xe$ujNkuz{i<~r%mQmUd(-hehnh=k+5FO?wd#`` zr&}am;4IG5d)tnWm;5cbRF(JwFV@8d<5X;0ITCCNR?9Z8d$-|j5&nH`{XQ|(c zug|`I_|NIyOs+qZ+e;i8Q{A+=Uk3(H&sgXi3teO3z(_rv{$=`=`upS`=@;q!dhdL; ze?Hq?_@QUq?i;teqvr@tL@OCx7EcxtikGx)Xo7lF$dqkAs5{!Dl6t z%^oqi2rdF^#$%xBiM%pEpXWm-(oCLQb*OLKnTgP-`&7uxaM|ghA#--!fj*E(E`JfB zF2Veqe2)WpZ+t%t`5M0f3i%xe9N0ip6y*R-H=}WYPBo)3&=ZOb?eqNC_5R#U literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_SelectMethod.cpython-311.pyc b/tests/__pycache__/test_SelectMethod.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad9f52b374e973068b7c26b5824915594bcd2da9 GIT binary patch literal 4724 zcmcInTWl2989uYu<6CSXkexu%2~d>{#n{Fc!FF+grLY2gVNF^s3)}I|*gNalnPq0y z##<^mmDQjMsi>+14?I{=MTGK#5K{AyNU79^KF+L;wAM(KDph^Rn9`R82z^WV;#|2y+VPfsU;@`qpR^L-r%{f9Q{g^fVt#XN`510*4dQ&Ez>eJYpt zC4C&N`&EBFkPPI5$zVQ|46!~=4JX5lA1ASlb0E1|*6T9s9qcV3Io!n4+b4@z!JTO zlH4utk?7toETeK`)EBX5SVODoSR^^O!MYgiKlxb*yO5MvBrOT^m)@k>rjqDrw2r3WI9h8H2wX8Qg zR`1;Qh0@)aKy}l11D6}js5*Qcd!XKIHnwEZi0R8(iEpvIK14ULc>u^N+Q8lSx+<72 zW8T603Epql?^YjzFoXH<3@G(s9XeVI_}1`fy}k=QY~I}`aoaP`jwDk{T8dZlI^9?; z#mgi4{%_i8yjsdO?fy5?9%>N_9or;t%k}UD1%JowB(gcWGgw*2^;+}WtLM%etzMIk zo%j-J6Qu^mHrv+x?d2NSYwg?Oc_T>;{C$n2Ej3NG_BO5Wz;DmYh7CKJx!p^eJ)+^s z(t&eX9kPbNGO{vX16ZL7pUMxgZ@+s9rk9S)iJ8R(LoaI5v5c1di-0(mE@Wt~SLRm)3y`Cb)h*o=il(A12vxig&cp@X5b~l{1V~$% zD2;gJ3G=#U9W#}ZJSq%+RJc7>?U)zyin=l?oYOT^2MuG<9=8h=$%b|Q76>v}O6*!z zG)Z5cRV-D8gbqU7;IblFSvQoGm4&PYcx0`paw03smK#*rp(0?(w=K7?DlBfsHPaHc zjO_L;F?>slN_vi+I1IXCZco+nS|8vDJ>$50M})Y(M!82k7FFPxucjeDj1~I`{&? z7i@fCn_R{@Qsze-{v_c~+NTN*zD4jY8{evNzE{TYJ(M0TlJ`fyx#ZxB1YflAMW$|R z=;Sy19ekeP^EN)e&61G{|8bfB*x}C-{_MB0e_SH58 zAIq>lUX0&D#9RXr*V`f(?0Hz?YRNV5%X^CCDE78R7tic16mFYq+VgJN=hZ23i_98t zFSVq}-Uf1PN!fvy4U}n>y#p^BI@{;P*V*UQ`6@42{`5^6bn&7cEZZ1|q3(t=@RzbE zOHk1@4N`#HQ#9ptBX_u+)x+9c=iR)w{<3uD9k?e(RIg)j-La<_Eh3z^j^#g*V6+BqRgHI1X zKT3u!Iyg>n+{ST_)WJ$*tQ;BpD)#jyGJcJW-*6%~N#v$2&Xpr`4$csqvFkV6Ta(ca z7pK#jn3vOOw=rzpr_3m_C()f%dw`j{6LEuD_;b#W1(fv!A!Mzvah9)5`pnk(Gi>6IC4q<_Zxl_D+3mdSn` z4Vnn5*yPhq*Ke+vZlEAi&{H%DkZxFU#rqtg>qZb*{2&1NqnRXT87gz0chr`pd}&6MvpqANuRbFUCI~f9iW4{#);} z-fyup5GMoie-1l`rpcjcXU`1TGvlDE1YNb!)eZEa?Y%bxQI4)tdwTyidFROYZ19I> nmQOeo=)PMj`+3{XZv=L&UR=BK>D1cPD!VrQDDW-}un7GR0(9~C literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_WebDemo.cpython-311.pyc b/tests/__pycache__/test_WebDemo.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d97ef9bda424fbb83a782eaee171a39aa4867769 GIT binary patch literal 2823 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 O_LRNE*8>Gib^ijP;w|9- literal 0 HcmV?d00001 diff --git a/view/__pycache__/ButtonPanel.cpython-311.pyc b/view/__pycache__/ButtonPanel.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd0bf4aa6e89b2c2a0b3a07c085d7e6983d94feb GIT binary patch literal 8230 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 literal 0 HcmV?d00001 diff --git a/view/__pycache__/ButtonStyle.cpython-311.pyc b/view/__pycache__/ButtonStyle.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4152bf7e1b34471df1f2c342ba84faf029d736a6 GIT binary patch literal 1074 zcmZuvUr!T35Z}8}B(*i*yU8Z{!ov|n615l;poTO-#1xEaHn}X_ZM$-Jd+zQPiZS7V z_!amD7{fR46ZjEKU;P3l_{5X5cl|>xbJ^M1`OW@jc5c3xN(BV+?W1h|auE7s4?~$5 z7}pq#bL65e#LyXH&V`H6C9F*9h`BYim}?9jb|0eGPvCHlII24g)m@%r&KbG@-=&R8 zr9PA0@7>=>jFC~zbOSy?28E#F%h-O_~{gs zW%d+hBGGpS(8gg)$s}UlAiGgC(lJ#$GLvc28k#f|LAQ)IWdtvwdK~g~RPe1vl-shy z)&K37$~kPuh+<6k1F5`iJS=qcbF)nLHCLLv^|ojbP_b0q^R}z&q8@BQrq4qwImFo$d%=lRkEu@)DUsNv25a+Y?>qJ z1g`K74`ggP$X=V{T_r#9h9LnpK#k#vTF8ie5O!Oyl8)d<ohm!v+5>eu`hMpZ`tE}~s3GbT&2 sv*=`G_GgU~+|0eoYJ06p0Hj%-gVE19j?;JN9blhUSJwCU4j?7|2i5Kj>;M1& literal 0 HcmV?d00001 diff --git a/view/__pycache__/CloseConfirmationDialog.cpython-311.pyc b/view/__pycache__/CloseConfirmationDialog.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6f9bbf8abae61dfa74265859890ba4fa23799c3 GIT binary patch literal 2895 zcmb_e-A~(A6u-{r36K^#XbZH$KsA~oprB5gU~Nh1XptC&LE9~gWSRH|OdUJ39Uv%` z`cSP*+QVL^GO3gD(6UXu?T?uHXh)WaEKQm;@z6IW_E7a{_d0Pt_>fv@H_pB1%jcZm z{W#aZgu@Mpv~Rysl5c$o{Y@FS`OCz?142AU0umSrrI;9#^29tTZ_JzW#e6A$%+FAr zM+&5Zv7keHB}j#0AqIKS9VGakBEgTDZ7)JQvB1|cwyBEdJ5jri^0+-;GUlqI`y z?!hf(eVWfI8Ql)dP4kObBEs2>wtOq2>xxX6yA_KFV|(Uw(l?fr^LkdoiE<2Qa3dbD zgndSEU=(8n6!Qq)O_XE=&(lzhQ0q+0NAmI6=O!dY!xM^}6x9^3i;7%IY$oBUaZBb3 zQO^gzlm18MIntS`cAJnp6*ga^sR&Vy*(UOxijF}!l&_6YF%^!pbWv5TC?R-`@kuj1 z(gd&I+a}R=DiIl^H&)GZsNU0Kj~=dS1wYZ(z5Upm^X7w9iz=lzSLv0IOV@iR*u8mY zAG&&X6avRs9*;eE#L|OVGM<0yo=)Ume zTU{@;W6pONy@1F$ZUO1X&%8<1`9{Ewv}_{+Jkz-`B9J#lIN1!%Gq`4o)o$OixAQ_hfuq6<2YE zU=$m(klN=uZfL7yLfB3+D@Pe(S6WtOcwAY!RAvp|b#;#)YdU z3|la4z_26iC_snNnKD7PKsG>jgzW`r-|F4cOz5?s*MQ!=mJ3@8W=oIN(z6-ZYd&k7 zyZic**?iAxzPITwLUBX;z%7wmrUrgpv!lm^5Ir z2&c;Vwp9%G&iDQlei7ab@3pb{wqJc_+kn+Ju-QA?%$F1&h6QUMG z4Tut@1s%K4Q-GfQwU=Wi3|TN_z)%s|cA={PUHJwR`Yq@;pntEmEAPt-W^2FI+P@hp zLQBcyRinjTH`$vOd((t*3&sr?CrS(2ccHrg-T6x|`%M_MV9(yP$v=;_w3la6cy_qXrq@L%3XAJD0nU4Ju?M*H+^c256faE=rjS_Cwe zUWwIWQmO~EGT2S7<%FW*Qdw!H+k3F)^UbLoPOiV9QXGol9eh@rfE(&CVJS528R_=D p48s)Bm&W@&Mbv53KSgxesDJi-oeY_dqutihKUDhfF)Am~{{Z44rs4nq literal 0 HcmV?d00001 diff --git a/view/__pycache__/DeleteConfirmationDialog.cpython-311.pyc b/view/__pycache__/DeleteConfirmationDialog.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..806cbc010b5bed829690b9d9b2c20f7abc487c37 GIT binary patch literal 2901 zcmb_e+e;i*7(cVuZ`DmS(bP+VqlTJ|XyTGW(I(Nvnp&*YYLa$Y7{;BmI%aleJ9E|> z8^}XwEcBr-B^FZHhs3t{)_N0zEr>&Uc&d`+n#0 zo%uN&Za}ns^QD%2?L+7<#*~}CL>%6u#8V_8iBnLDi*YGW%#-rQyeVJIm-5H_9MgG} zKq?puy0lk;R45kWkO$pClJ7B+{FvMEBD72Y#TILj0`n*me8t#^-wDo5$fBYxIgNAo zZfWb&;)a$XPGD|YT*L|$&Ss3|TNy$$l`@}HEFzranIp7sEGp;8hJq8N817Jxc*s-s z3B`d?jFV8zBYC$_l9N1-LorINb1@&y$LF+9Ug`DlIH}UEYo96 z@=CrP8f~`{kwc`hYL-Ryo*sHgxT=->RA2Y@LvPlb3sxqaDwH@*n`I`J-Hf0Wsiu)I%-Kes@nRsd*~xwRh~<`d2Emm1`-#Q#)qS%9%2M>}}s0@cNHh)?o@A!xYE{{zpuKx4?AvoiQEX7oJ>e z*-P!1^&LeoA$rgoW;V|jPdZg~|j8C&i3H1cMc5Czw#=!~-l* zLQ_?opp{-sBygIJI$mKsb630sBH;K8tR$U4TGVM^C!iEB2fyOp4dF%iS`bRoh7D{8 zMUfLywF)T+3A#RpAQ%h?Uu=(F|9*QUe%HXd5&vxPj;JW2JT$d1I6XBU|6Iiry1a@j z1V6}6%ZnSL%1^1Q*dT0H`0)%`)^wR{#3!)vfN1IX{Pf-Ud?uB`Iv>3ny%wL41OKAS?zv(0jM+V77L404 zZo)WK+R(WNy?N-(U3)%i!4(^>m~f>4ZF|t2hwfa11p_t=m@u&4+MV;|B&&76ZXMVP z6`-YP@}kk^uUq_0o4;wnm8pF_G(D8kLqZzFn;RWXI>L2eL)lqO{qMmGt<*BMbMYTV^_!lg}~z=|RW5l(-f ztv36_7}NV{ue1Bm?b!J?uG5ZggYxgd)9Jr-fZn0gFO~hxL>isbvm0~dgP}QEYFHUC zbapRR%So{!u-f1>l`U^;IxZHLX12kHYChuJ+TrH!W|D2$56a5cU4XF+Q literal 0 HcmV?d00001 diff --git a/view/__pycache__/FolderList.cpython-311.pyc b/view/__pycache__/FolderList.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..480a21001fa1032710058fff4ae58efccfc62125 GIT binary patch literal 11237 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 literal 0 HcmV?d00001 diff --git a/view/__pycache__/FrameSettings.cpython-311.pyc b/view/__pycache__/FrameSettings.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..547f7e1282fe1512a4940ff1be7fc296410f5678 GIT binary patch literal 1944 zcmaJ>&1)M+6rWjrjU~ABm@!*g+NZZxwxmC`evnFYaP?s**Eh(<~MKV zy*ED%4n`5QZyy+?KLmtcaK>%H-sJ34m>eJlDOf{goX42Y1x+Xi@&RWa(1PVqK2#3p z!x#x@5h=l4q=b$E@dW;E%SV*(8p=doayEnQSZem$);a4VqLdF@FCn2E^oUh@$xFulbLpdnRS3^!e0cLDLFqc4>WTd1+4i zLZ=H%-J;$^oD!GShdTvbT++9wX_cvNiE~x!k-=1JM_QofW6P*WYs>efwQ9LcnRx4i zTeqcErs_qtqEXQ(iEBp5+Ac6EF3>Hi85NEptv{mTDl;}|(UP=+1<>Lac%&M-^rgy& zxg}{!rQ4G4X0w$Yo5-@NtClQ38S(2}d6=J-2kdpJQ!qq3B;F>YO)}ab zsTN7q-F^nPsOW_O7!KhC%?9ZKs-aD8;vrD z!1-FR@T@PMgcpGi!LvMHk1oWee|M*dgq8J7+^G;dQt7=51d7Oc8CVFA?C^b6SB!1O zgW{BtJq!j=0>&Lx(>^H_A8#>kwftbA1MUlP1 z1#uux-u9<6ta5AFsop=q1~NK1^4(-RInhi`G?M97GQAh+kVH4Fe;hr0@7MQ#d+Ya9 z}OxMYDPde5lW8ZH#NV-MRb&`Ibcys^j zc4EAl7;hx5wh~uQQE*`T@6^N(Q-@P~3;TCF@uB^@?f7^zK7MrV*<>T0ZN;;7w?9vf z9Zt4WH=C)Oja0Uk%JL<9@UbEAe!eJVpVmrrJE&=Z|?%wxxcT-O!ufCvvE-Hnl?=! nrvZ#{2c_%&-a%LD{@y{?>zDP@;1Gr*y-xn&vVSj8I8OZsdZVP~ literal 0 HcmV?d00001 diff --git a/view/__pycache__/HistoryManager.cpython-311.pyc b/view/__pycache__/HistoryManager.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2105f781116941c3dbc98e6f3fc41b1b882f944c GIT binary patch literal 4245 zcmd6qPfXla8o-}t7qsp zY)C;w>Y-h6;GSre!yMXdvQec}>VeBj-BqjIqdl@T$frts>Wvk9%BB0gXOCxwnWVI* zK0Kd4zdzsm{J!7&p80EgdmDoC=l897gc14=dnlKtNZAuXxr-9$4Wyz^kSaV#AoLi1 zVYz|S#2k{6xpD=&3(>>gZ$Y_>G;~8y(T#*Ee1dKy)da{UH3>4MHi2wbQy^Q^W{_BI z0okfzu-O`PT+waEqHAv|rm~>XTs$k7WqJ~Rd*ghL4PgVxpoL`t!Bg1_@EM-su_^-F ziP`UefFdP>=Db2R(+OH`g>wb%ks|A+s(mCSf+kxt=4mrnwwV!8eERpx=d$nG8nv@; zj=rH7hN6#6zcV^BJ(YdS)G}0G)nY{)6=(FDYl&Ta5g%xJ5cVda^P>^rwK@jA5@ zwVabR6bDR;tKgAtnb|+;>^3!>UDdVQ+1fQ6%dZ7khIi8)Szhnn*H~^~?`abM1@6!N98+E?m`p_aIY^L!UKrT<2XVB^jwUe z7UNhIn60|DcW>Im zLp~mI@etH)rF}e5!e@*4?6&0LjE^%e&O{BzOZZF?pV@Bp@FgE#a`7eJP{M;nJXp{@ zJnrLhw|r3o6V))p;>Q_!3JPOr5$<7es(666tbq@X;2-{ZJKfJ_T?L5^ZuLP}A{%_vA3 znn_t`f@US3*Gx6&iLfx0ReeEmV9(1pR~*MO?MD$FWxN7P+T*_;{#7T?r2r@lf0gI>Hs=5vK-lhatf6$U|){ z9;&d!mzVx+1Jwi~vEIEu5S4UO4Oj(*J8)=J09%Z~YaGD(1W_|OPDBSyFV&+9Ea-LR z`7;(6GIgcVm;%cqb)^xI9LnVE_pCEz3njI2GC7ny?a>!l(;+5aWa1?z4uc4eL~Mm= zF=wrqPMFB(QP!s)L^Yp5%Yr4}RB}t}UHce~>X}jdOAuu^3qmnH;HC$5$O|qx=96QE z0gs#r)t%mB_eTnj|H@gv_uS?+=(2UqCxaz2StOI&OCGuEldCSd8a13Kk@H1ze*2n7 zuK47NORn&S5|N5Tdia`0PW$AvOHN0%<3%$5q|YOhKACjMB-ED3t3~pvM@D=y;+C)7 zPDEY?2kU`m$a0|nQU~vl&)C?YJDH(p6rE`iYN9ii)h#sP-+RP_W6#3U0AGJQb4}oW%?ZYtCo&f9_Z9!oO~~vHzJ&Wm%KupiP#S zEp^3UI+5i+ttdv=LepTDb}_*|ujmOT2ASXqfX(~}af4yl*_u!$*elteg7`T8+f5`> z;x39sTT^Oc7sZ04QqnGpMF&oe?xI*6jx}C)IGK81V76k}CZyhmn#MBpkoh$WYtEgV rfQO3XPw|Ct0e(kMLId}H3Y6WXAPBpOQGwZREdR^v|M!emKE?k5sq$*h literal 0 HcmV?d00001 diff --git a/view/__pycache__/ImageDisplay.cpython-311.pyc b/view/__pycache__/ImageDisplay.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..529a811ffba69d459e65b6b069bbc4694871051f GIT binary patch literal 4894 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 Cp)q*? literal 0 HcmV?d00001 diff --git a/view/__pycache__/InitialFolderSelection.cpython-311.pyc b/view/__pycache__/InitialFolderSelection.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7ec6fe792c8ac47a7566f7dfbc9b9438068e41d GIT binary patch literal 3040 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 HIg9x(!=3@` literal 0 HcmV?d00001 diff --git a/view/__pycache__/__init__.cpython-311.pyc b/view/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23134afe736c474bfecb91825ea306d83bb55df5 GIT binary patch literal 292 zcmX|6O-jQ+6rQmtQYc_;~MgG#avi_k}61g8ua30RCroC&7HM70cNZH41O-armSE)SU&|4mjsqb|5 Date: Sun, 16 Jun 2024 19:59:05 -0500 Subject: [PATCH 025/124] adjustments to test cases --- controller/AI.py | 5 +- controller/__pycache__/AI.cpython-311.pyc | Bin 6859 -> 6975 bytes tests/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 293 bytes .../test_Manual.cpython-311-pytest-8.2.2.pyc | Bin 0 -> 6211 bytes tests/test_AI_NumberOfOutputs.py | 8 +-- tests/test_ImageCount.py | 20 ++++++-- tests/test_Manual.py | 48 ------------------ .../InitialFolderSelection.cpython-311.pyc | Bin 3040 -> 3040 bytes view/__pycache__/MainView.cpython-311.pyc | Bin 7889 -> 7889 bytes 9 files changed, 25 insertions(+), 56 deletions(-) create mode 100644 tests/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/__pycache__/test_Manual.cpython-311-pytest-8.2.2.pyc delete mode 100644 tests/test_Manual.py diff --git a/controller/AI.py b/controller/AI.py index 07c9a03..e9bb246 100644 --- a/controller/AI.py +++ b/controller/AI.py @@ -11,7 +11,10 @@ class AI: def __init__(self, parent, initial_directory): self.parent = parent self.initial_directory = initial_directory - self.model_path = os.path.join('model', 'best.onnx') + + # Construct model path relative to the current script's location + self.model_path = os.path.join(os.path.dirname(__file__), '..', 'model', 'best.onnx') + self.session = ort.InferenceSession(self.model_path) self.input_name = self.session.get_inputs()[0].name self.input_shape = self.session.get_inputs()[0].shape diff --git a/controller/__pycache__/AI.cpython-311.pyc b/controller/__pycache__/AI.cpython-311.pyc index 83db86398be5ebf785f297235b27f60c64675537..44bb67722ea9e2e0c06521e11dd24d690d5d0f61 100644 GIT binary patch delta 831 zcmZ`%TWAwO6rIUtAIT<7Qq8lmn%ZQI4M8eO6Qc&DsQ7A;3W8x-+)bL07h|Ha7Ah2> zfi*wg~mYy_~uCoO5Sj-tT+8-@atG zTLFooo0aU#=k{@E<;aO4`J;s=;c0vedLfG+z^&$*4FH^Wdy*j2ch4Tx>^EefK-PAH2<;nqGhyZ*Vb2Cx zb{IGZRCWOpE2q(^?KBVoDz^y9vq*LW0u`JCQU1)7DIUk4O&aXQV@#}l(dc@ z%h`NUljY`hMuA735!nr};t9@~Z;LCT;W=|#=>NrmzHRrU`?0&RN9f_zrJ0497mZ~p z-ImgC2H)}@$1g4iGVMTyXdJ6e3!62;7_RayE==6e08R@1FoG`#Q7GYAVK?;Qr$QS> zo3obha3ZC1Na?V(dbOw_`kIdQyi%-dqX<Zc6`)ypVExw`3I+T#?ID=7^$NDfgB zMd&m^%K`jOjFV-*#Rv@J9kv!(wrXoI+$f!f@g=9Sg|a(hzNF+dxvJDAFQWwh;pqW=leKZDA&be#zLBcw_dwO-T? ap)2@{fBx`E2)D0+&FeS4|MNdn-SjUAgR}$y delta 726 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 E4@EQOO8@`> literal 0 HcmV?d00001 diff --git a/tests/test_AI_NumberOfOutputs.py b/tests/test_AI_NumberOfOutputs.py index c326d9c..57a3bc2 100644 --- a/tests/test_AI_NumberOfOutputs.py +++ b/tests/test_AI_NumberOfOutputs.py @@ -21,7 +21,9 @@ def setUp(self): self.select_method = SelectMethod(self.window) def test_AI_Method_NumberOfOutputs(self): + # Ensure the model path is correct and the file exists ai_instance = AI(self.window, self.window.initial_directory) + self.assertTrue(os.path.isfile(ai_instance.model_path), f"Model file does not exist: {ai_instance.model_path}") # Construct the path to the test image dynamically script_dir = os.path.dirname(__file__) @@ -36,12 +38,12 @@ def test_AI_Method_NumberOfOutputs(self): # Print prediction for debugging print(f"Prediction: {prediction}") - # Verify the prediction has 5 elements - self.assertEqual(len(prediction), 6, "The prediction should have 5 elements") ## one is dtype=float32 + # Verify the prediction length + self.assertEqual(len(prediction), 6, "The prediction should have 6 elements") # Adjust if needed @classmethod def tearDownClass(cls): del cls.app if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() diff --git a/tests/test_ImageCount.py b/tests/test_ImageCount.py index c374345..a489879 100644 --- a/tests/test_ImageCount.py +++ b/tests/test_ImageCount.py @@ -18,7 +18,15 @@ def tearDownClass(cls): cls.app.quit() def setUp(self): - self.main_window = MainWindow(initial_folder='test images') + # Create the test images directory and some dummy image files + self.test_folder = 'test_images' + os.makedirs(self.test_folder, exist_ok=True) + self.image_files = ['image1.jpg', 'image2.png', 'image3.bmp'] + for file_name in self.image_files: + with open(os.path.join(self.test_folder, file_name), 'w') as f: + f.write('dummy data') + + self.main_window = MainWindow(initial_folder=self.test_folder) self.main_window.show() # Override closeEvent to avoid asking for confirmation @@ -26,18 +34,22 @@ def setUp(self): def tearDown(self): self.main_window.close() + + # Clean up the test images directory and files + for file_name in self.image_files: + os.remove(os.path.join(self.test_folder, file_name)) + os.rmdir(self.test_folder) def test_image_count(self): # Update the view with the test_images folder path - test_folder = 'test images' - self.main_window.update_view(test_folder) + self.main_window.update_view(self.test_folder) # Get the displayed image count from the label actual_image_count_label = self.main_window.button_panel.image_count_label.text() actual_image_count = int(actual_image_count_label.split(': ')[1]) # Get the expected image count by counting the image files in the test_images folder - image_files = [f for f in os.listdir(test_folder) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp'))] + image_files = [f for f in os.listdir(self.test_folder) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp'))] expected_image_count = len(image_files) # Verify the image count is correct diff --git a/tests/test_Manual.py b/tests/test_Manual.py deleted file mode 100644 index 46246ac..0000000 --- a/tests/test_Manual.py +++ /dev/null @@ -1,48 +0,0 @@ -import os -import sys -import pytest -from PyQt5.QtCore import Qt -from PyQt5.QtWidgets import QDialog, QLineEdit, QPushButton -from pathlib import Path -from pytestqt import qtbot - -# Add the project root to the sys.path -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from controller.Manual import Manual - -def test_handle_new_album_creation_existing_file(qtbot, tmpdir): - initial_directory = Path(tmpdir.mkdir("images")) - - image_paths = [initial_directory / "image1.jpg", initial_directory / "image2.png"] - for image_path in image_paths: - image_path.write_text("dummy data", encoding='utf-8') - - album_name = "New Album" - album_path = initial_directory / album_name - album_path.mkdir() - existing_file_path = album_path / "image1.jpg" - existing_file_path.write_text("existing file", encoding='utf-8') - - parent = QDialog() - parent.update_view = lambda x: None # Mock the update_view method - album_dialog = QDialog() - - qtbot.addWidget(parent) - qtbot.addWidget(album_dialog) - - album_input = QLineEdit(album_dialog) - album_input.setText(album_name) - - manual_instance = Manual(parent, str(initial_directory)) - - manual_instance.handle_new_album_creation(album_input, [str(p) for p in image_paths], album_dialog) - - assert existing_file_path.read_text(encoding='utf-8') == "existing file" - - new_file_path = album_path / "image2.png" - assert new_file_path.exists() - - qtbot.mouseClick(album_dialog.findChild(QPushButton, "Create"), Qt.LeftButton) - -if __name__ == '__main__': - pytest.main(["-v", __file__]) # Not unittest.main() diff --git a/view/__pycache__/InitialFolderSelection.cpython-311.pyc b/view/__pycache__/InitialFolderSelection.cpython-311.pyc index f7ec6fe792c8ac47a7566f7dfbc9b9438068e41d..8ef77d2a6b43beccc75827df549b32af0de71c3c 100644 GIT binary patch delta 19 ZcmaDL{y>~-IWI340}wPeZREPf4FEVb1!DjJ delta 19 ZcmaDL{y>~-IWI340}!-DY~;Ge4FETR1wH@( diff --git a/view/__pycache__/MainView.cpython-311.pyc b/view/__pycache__/MainView.cpython-311.pyc index 5fe2bc6127a854dcd53a77e67339b03f21d20f31..50e030df575405a95251776d2ec75787090cfd3f 100644 GIT binary patch delta 19 Zcmca;d(oC_IWI340}wPeZR9#G2LL-71(g5* delta 19 Zcmca;d(oC_IWI340}!-DY~(sF2LL)|1#kcW From 89b7b493a93095eab44dc21a594b21eec6d0453b Mon Sep 17 00:00:00 2001 From: Mohamed Date: Sun, 16 Jun 2024 22:20:18 -0500 Subject: [PATCH 026/124] adding circle-ci and dockerfile --- .circleci/config.yml | 37 +++++++++++ Dockerfile | 17 +++++ controller/__pycache__/AI.cpython-311.pyc | Bin 6975 -> 0 bytes controller/__pycache__/Manual.cpython-311.pyc | Bin 11129 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 298 -> 0 bytes main | 0 .../test_AI_NumberOfOutputs.cpython-311.pyc | Bin 3340 -> 3559 bytes .../test_AI_PredictedCity.cpython-311.pyc | Bin 3364 -> 3364 bytes .../test_AI_Preprocessing.cpython-311.pyc | Bin 3661 -> 3842 bytes .../test_ButtonPanel.cpython-311.pyc | Bin 3074 -> 3074 bytes .../test_IconsExist.cpython-311.pyc | Bin 1924 -> 1924 bytes .../test_ImageCount.cpython-311.pyc | Bin 3659 -> 4640 bytes .../test_InformationDialog.cpython-311.pyc | Bin 6032 -> 6032 bytes .../test_SelectMethod.cpython-311.pyc | Bin 4724 -> 4724 bytes .../test_sort_button.cpython-311.pyc | Bin 6743 -> 6743 bytes tests/test_AI_NumberOfOutputs.py | 2 +- tests/test_AI_PredictedCity.py | 2 +- tests/test_AI_Preprocessing.py | 4 ++ tests/test_ButtonPanel.py | 2 +- tests/test_IconsExist.py | 2 +- tests/test_ImageCount.py | 59 ------------------ tests/test_InformationDialog.py | 2 +- tests/test_WebDemo.py | 38 ----------- tests/test_sort_button.py | 2 +- 24 files changed, 64 insertions(+), 103 deletions(-) create mode 100644 .circleci/config.yml create mode 100644 Dockerfile delete mode 100644 controller/__pycache__/AI.cpython-311.pyc delete mode 100644 controller/__pycache__/Manual.cpython-311.pyc delete mode 100644 controller/__pycache__/__init__.cpython-311.pyc create mode 100644 main delete mode 100644 tests/test_ImageCount.py delete mode 100644 tests/test_WebDemo.py diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..35715ba --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,37 @@ +version: 2.1 + +jobs: + build_and_push: + docker: + - image: cimg/python:3.8 + steps: + - checkout + - setup_remote_docker: + version: 19.03.13 + - run: + name: Print Docker Hub Username + command: echo "Docker Hub Username is '$DOCKERHUB_USERNAME'" + - run: + name: Install Dependencies + command: pip install -r requirements.txt + - run: + name: Build Docker Image + command: | + docker build -t $DOCKERHUB_USERNAME/visionai:${CIRCLE_SHA1} . + - run: + name: Authenticate with Docker Hub + command: | + echo "$DOCKERHUB_PASS" | docker login --username $DOCKERHUB_USERNAME --password-stdin + - run: + name: Push Docker Image to Docker Hub + command: | + docker push $DOCKERHUB_USERNAME/visionai:${CIRCLE_SHA1} + +workflows: + version: 2.1 + build_and_deploy: + jobs: + - build_and_push: + filters: + branches: + only: docker-branch diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b08f6ee --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +# Use the official Python image from Docker Hub as the base image +FROM python:3.8-slim + +# Set the working directory inside the container +WORKDIR /usr/src/app + +# Copy the requirements file into the container +COPY requirements.txt . + +# Install any dependencies specified in requirements.txt +RUN pip install --no-cache-dir -r requirements.txt + +# Copy the entire project directory contents into the container +COPY . . + +# Specify the command to run the application +CMD [ "python", "./app.py" ] diff --git a/controller/__pycache__/AI.cpython-311.pyc b/controller/__pycache__/AI.cpython-311.pyc deleted file mode 100644 index 44bb67722ea9e2e0c06521e11dd24d690d5d0f61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6975 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 diff --git a/controller/__pycache__/Manual.cpython-311.pyc b/controller/__pycache__/Manual.cpython-311.pyc deleted file mode 100644 index a14c3a28edeb6589590ca79011a3111f211b3fa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11129 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 diff --git a/controller/__pycache__/__init__.cpython-311.pyc b/controller/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 81a92cdad09f73ba24529b1c3e6367523030d0fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 298 zcmX|6!AiqG5Zzc55sJUCR}U$rcoGqU0SQDcq!kYXA*K_$y4eYnO(Z|yFZc=4kML{! zfkJORxeL~Jc<;>&Jm!6k$7jOf<*gnNP72nYaiZHiD1byz|HX_w5xd zTjUn*!@EN3LQRrIm?jZC8jM->_-|w=Q}r?wMkc1m*4AjOj5@m}R(60G+c!%MWa$#J zuC9^gY&yGyIV)4DMx&%kW>netf>FlUqo&4Zz+#PZ&h(0<1zlJdEqnKoA_Gs#OO!xK r#xiM*40*1MvUxsfhW+VvO{-4h4IjHUzHfW(XgdmmU@H#9Be(knYNS|g diff --git a/main b/main new file mode 100644 index 0000000..e69de29 diff --git a/tests/__pycache__/test_AI_NumberOfOutputs.cpython-311.pyc b/tests/__pycache__/test_AI_NumberOfOutputs.cpython-311.pyc index 364e39d88d81867d18b30b1fbed3c1c69f1fb3d3..06ee50c935093d42d6175b14162b258f50bf92c2 100644 GIT binary patch delta 726 zcmeB?dM?eooR^o20SK(-QW!x@nAGF~HW33H<{+64Q_jFpBE-M|GDo16302#~ z3^|V)rWB?W<`kA?EDQ{*ffxd6nMw7)WDhn~M%KxBY?6%JlRMbdc_m?HF)*aCP2R&M zDb9-!L9j|>C%<8nHfK-aSOyHR)$l-LWJqBMX3*sHtCIH3Pf5*DNXyJgRY=KCEmp|O zFHuOX$Sf|gQkbmBUch6fkeZX4o0?ZrtjRxlF1ws6S7LE-YEel@QEBQeru^btECq=r z8MoLni$P}G;>rb?7eDy`yWHeY>=*og10B=A@Kj7ckYw~%nct(ZE`rML=ia>R@*b)m0Qu9)7 zu_q=KgWOxB2GXqpB2*`5atEs#fmE^NCT8XpnSn$_Km;&q8Gdot0KHV2lWJGwGWj9* e6IqE|VYeXaNAF@thw3 delta 529 zcmaDZ-6O@joR^o20SMY6^3$w0@>;WUTw-Kkn9fkbI606-Y;qc_nnVd3NC5<7vA|dh zSSL?p6=r29;bCByJfBHSs+I|dLUxcsDTW%R6vh;$6y{|>BUZzWsb#L2tjH!Ij@=GU zkk-k!*@PHbCck5ooLDG2S%zJhR~+UD28I;Y$u{hgj65KP%nT*clXKXmrPxx~moWov z0b&SXWJqBMX3*sDo4k*`fX7rJH77MUHLs*tlW(#Wha4+Ye(^1q$+aAE!d!{P#i>Ol zAw{LBx7ad^(=u~XC(q)zD032MP6NYTF^L%>bEFrfEXls2=6q4i<%*a~2lwWkoZ5_x zT9co0g|q1a)fE{`cH#~b5@Zcy{J?-js!d+S9d9iURB?+nuQa!y@)lEG!7b(hPoE-C za1<$kWY`i53R3e@Zm}mO6&ECyWE3fbq!dAf(qtE&U{ynqDwf>D%)BB~kf;cV5CRgv sIBatBQ%ZAE?TVZy@8P+kE5|7EfdP}45phLU?;}X!3qsam@?Kso0L4CeF8}}l diff --git a/tests/__pycache__/test_AI_PredictedCity.cpython-311.pyc b/tests/__pycache__/test_AI_PredictedCity.cpython-311.pyc index 90b2012c6d151996732a8082248f99bdc038a815..882700a26d22d0d13422ece024cc72f9398a5100 100644 GIT binary patch delta 22 ccmZ1?wM2?{IWI340}vcvn4gxhkyo4-07K9P+yDRo delta 22 ccmZ1?wM2?{IWI340}!-Dr(A|J5yl|G6iBRO0ILOCUc?R(1rZ>p6fc?lfV)}Eih)h=0}~^w z@CODU@sSzGZHYz*fJKY=Cl~OjF-lLK&Qqsv2Go0tB{wlMugD5y9>^(R<9~73~2jo-Y2yFxiE7m99D?(0EK@hQ<{s?T;XdF9_M7$;y0cEFe<>6@6*4 delta 303 zcmZpYJ1fJtoR^o20SMY6^3y)BZ{*v<$T)5CX~wB+DeS=vnjDjBm^LzMZq{SI#v&&K zR8|Bc(m@&+9^^Z`WCGGfV1j?L62~z{fypm9o-y)lzQDPYk)01H>8Hs#S(3-dgcqcc z1w=@J2qh3<1SD266oHf#@qh?+7y(jU+&#I4rQn$?Tx1DGu0o2<*L#way8gtt!L z7^vhHOKxIjUXeLS8{Cv%95%W6DWy57c10dQ2}Y1nOpKEm`Bs@KGlGo5PR`J{BBlKi REcpdliPz*Cd}=Hp(*e)|K)?V1 diff --git a/tests/__pycache__/test_ButtonPanel.cpython-311.pyc b/tests/__pycache__/test_ButtonPanel.cpython-311.pyc index ba28b16d0e46c878cee4a54daa47aa47ca2a538a..3c9922c52af798f215d4aecc150db02d40bc717f 100644 GIT binary patch delta 22 ccmZpYXp-Pv&dbZi00fig?2i&hF+DN_D`96(Ja)I-&owY}IWRwRi!MwyJ3!Tm=Ekv}Th9Ne;)7 zkp)4T2|$e#axpAO-w2qNt-82B7|$$J_}7D(RFxkHMw1y0W|yt}VlsKt$4BG{HsFk< zVsb2!2+yYzJTfz1h1>C&k`t2x*q-?5$`4l_P5(Gu03s0u>=h3PS`alVEoodbazo%_ zqNLe$2g38Qgdk~jIwPbsIunsU(&%_PmeQE47?TCG!*sO_>i>ckl-fM=fG+qBA^dCFPWZ0ncQrmhEai5pb7L6sZC%)V!$q(3@pzok`e z2^;{*;@8RTsi&^y&!e9$Y$om`ii2wB!1k=-zNoq{?wnR!6RKTT57&O9Ytwwk zeAlitcB_rurN-{)feCALwN4HR@C6~qvXi)@qoWhWf3v{r-=0y2u)mXvXHxY{qCU1i zD4oI~Kkjvhtjw;J4mmBmE{N%zQIA+{wBB>H%$^^^1!D98Zjv`~lMqB@#px<1vsLc@ z-O@nH%-EHO8_&J3;aVQ4v&2>R*J8^xjTBSUWsBH}5gId>NK1m)hIx^+sm6*zGQA{- zJ|ZF2BzlOL5tFz|0+i?{q8>~n5{D1%u>qD?k`f4-&t5xV!Pz!FkI?cK#J7nl&ZOPB zHg#ey75kWKA1mn(sS|F!Np-a=T!+eal&TMEH+!f!M4zyJ6AowN@D-FZH#8g5=J?u* zOr;we8u86KuwRvhZ>iv(;$eMP^HfU}0O~a>6mPl(YNx|-V^>@l;ar_2x!EuP@}`$; z(0Nd_5r@1WPvz;Cr;DrPK%BrC(2CRQ<04sf7&aG`RgXe@0UWy4>J&Ooh2N*rg=nbovW%OjC z1#8f!7l76zz$8{BF)b1gL z8&)HsD)fd?ap)m0kOun@c;k- delta 953 zcmZuuOKTHR6ux&}88gWwrA;tR(`Twp3(`?_X5o{%&|NEnxOQPuB9#HbAK;>bbkUV}5}Q`(XG0Z>IJd4YCaPrPVjV%7brZ$HsHsC*b9L~ zuL2Vs2NQIyAeaCVX5>&XWMs4|ndBWA;S9G0132Jlf(%}Agx#;9#UNQtA-g)>c62oi z5wZfl2Rq-+6@&3oFkTME@h3h?=^}ne&-nr*Zm|ohhGe~o@T&5*Gr|RJD}*088@VFi zN-jQh2Hm$vLWk|-vMOO=DLVR5a`6!ZJIqBNS1?KO|Jav>I9K``JsRBnLzWV<* zB+&tYhXjA~GA%Ky!0;SP()754#ucI@{oeezpGwmO;B*!%^8z6S**Ey4t7Mh z6?o0HLt8L~uexteb`b}LkD$_9n}qLeh`#63k`!av=8eHNu5%b_aBkQCjbRXJ-3Nko=xT+8K?YJ}56 zL~d1nGm+9%N!IbOcp+j5m9I^t6jer6gM5EcUNB@SQS~lp`K*CBqHM)a#Mt>}!q66h z74XB~@j&>-yUP68JwCk4hYPbMK3e9ZMLvoT#CW3t$>`79pLM^QEw%TT+xv-G@}sgJ z;Yp7n*roI~8~X8A&-?((#^F9Vfg)tv_CXCev665K;+!`Od+~<1Ib<=5N#m}?DOvmF zmLoZjDh?*CDOvo*d%1IfbhMaEQpxIrc5{2Fx{JUeeqjQ{`u diff --git a/tests/__pycache__/test_SelectMethod.cpython-311.pyc b/tests/__pycache__/test_SelectMethod.cpython-311.pyc index ad9f52b374e973068b7c26b5824915594bcd2da9..7cb42ecb08e8c15fd044fb1bebceb6633c7aa8bb 100644 GIT binary patch delta 19 ZcmeyO@b%7 diff --git a/tests/test_AI_NumberOfOutputs.py b/tests/test_AI_NumberOfOutputs.py index 57a3bc2..810c236 100644 --- a/tests/test_AI_NumberOfOutputs.py +++ b/tests/test_AI_NumberOfOutputs.py @@ -46,4 +46,4 @@ def tearDownClass(cls): del cls.app if __name__ == '__main__': - unittest.main() + unittest.main() \ No newline at end of file diff --git a/tests/test_AI_PredictedCity.py b/tests/test_AI_PredictedCity.py index 3f4c466..905093d 100644 --- a/tests/test_AI_PredictedCity.py +++ b/tests/test_AI_PredictedCity.py @@ -44,4 +44,4 @@ def tearDownClass(cls): del cls.app if __name__ == '__main__': - unittest.main() + unittest.main() \ No newline at end of file diff --git a/tests/test_AI_Preprocessing.py b/tests/test_AI_Preprocessing.py index 9dd935a..62958b4 100644 --- a/tests/test_AI_Preprocessing.py +++ b/tests/test_AI_Preprocessing.py @@ -47,5 +47,9 @@ def test_preprocessing(self, mock_open, mock_run): # Check if preprocessing is done correctly np.testing.assert_array_almost_equal(expected_img_array, actual_img_array, decimal=5, err_msg="Preprocessing not done correctly") + @classmethod + def tearDownClass(cls): + del cls.ai + if __name__ == '__main__': unittest.main() diff --git a/tests/test_ButtonPanel.py b/tests/test_ButtonPanel.py index 47fb85a..8a5aeb5 100644 --- a/tests/test_ButtonPanel.py +++ b/tests/test_ButtonPanel.py @@ -32,4 +32,4 @@ def find_buttons_in_layout(self, layout): return buttons if __name__ == '__main__': - unittest.main() + unittest.main() \ No newline at end of file diff --git a/tests/test_IconsExist.py b/tests/test_IconsExist.py index ca21404..bd6df1b 100644 --- a/tests/test_IconsExist.py +++ b/tests/test_IconsExist.py @@ -24,4 +24,4 @@ def test_icons_exist(self): self.assertTrue(os.path.isfile(icon_path), f"Icon file {icon} does not exist") if __name__ == '__main__': - unittest.main() + unittest.main() \ No newline at end of file diff --git a/tests/test_ImageCount.py b/tests/test_ImageCount.py deleted file mode 100644 index a489879..0000000 --- a/tests/test_ImageCount.py +++ /dev/null @@ -1,59 +0,0 @@ -import unittest -import os -import sys -from PyQt5.QtWidgets import QApplication - -# Ensure the root directory is in the PYTHONPATH -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) - -from view.MainView import MainWindow - -class TestImageCount(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.app = QApplication([]) - - @classmethod - def tearDownClass(cls): - cls.app.quit() - - def setUp(self): - # Create the test images directory and some dummy image files - self.test_folder = 'test_images' - os.makedirs(self.test_folder, exist_ok=True) - self.image_files = ['image1.jpg', 'image2.png', 'image3.bmp'] - for file_name in self.image_files: - with open(os.path.join(self.test_folder, file_name), 'w') as f: - f.write('dummy data') - - self.main_window = MainWindow(initial_folder=self.test_folder) - self.main_window.show() - - # Override closeEvent to avoid asking for confirmation - self.main_window.closeEvent = lambda event: event.accept() - - def tearDown(self): - self.main_window.close() - - # Clean up the test images directory and files - for file_name in self.image_files: - os.remove(os.path.join(self.test_folder, file_name)) - os.rmdir(self.test_folder) - - def test_image_count(self): - # Update the view with the test_images folder path - self.main_window.update_view(self.test_folder) - - # Get the displayed image count from the label - actual_image_count_label = self.main_window.button_panel.image_count_label.text() - actual_image_count = int(actual_image_count_label.split(': ')[1]) - - # Get the expected image count by counting the image files in the test_images folder - image_files = [f for f in os.listdir(self.test_folder) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp'))] - expected_image_count = len(image_files) - - # Verify the image count is correct - self.assertEqual(actual_image_count, expected_image_count) - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_InformationDialog.py b/tests/test_InformationDialog.py index b8b0a7c..ef16b9c 100644 --- a/tests/test_InformationDialog.py +++ b/tests/test_InformationDialog.py @@ -78,4 +78,4 @@ def test_ok_button_functionality(self): self.assertFalse(self.dialog.isVisible()) if __name__ == '__main__': - unittest.main() + unittest.main() \ No newline at end of file diff --git a/tests/test_WebDemo.py b/tests/test_WebDemo.py deleted file mode 100644 index 89364ab..0000000 --- a/tests/test_WebDemo.py +++ /dev/null @@ -1,38 +0,0 @@ -import unittest -from unittest.mock import patch, MagicMock -from PyQt5.QtWidgets import QApplication -from PyQt5.QtCore import Qt -import sys -import os - -# Ensure the root directory is in the PYTHONPATH -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) - -from view.MainView import MainWindow - -class TestMainWindow(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.app = QApplication([]) - - def setUp(self): - self.main_window = MainWindow(initial_folder='test images') - - # Override closeEvent to avoid asking for confirmation during tests - self.main_window.closeEvent = lambda event: event.accept() - - self.main_window.show() - - def tearDown(self): - self.main_window.close() - - @patch('webbrowser.open') - def test_open_demo(self, mock_open): - # Call the open_demo method - self.main_window.open_demo() - - # Check if webbrowser.open was called with the correct URL - mock_open.assert_called_once_with("https://huggingface.co/spaces/jagruthh/cities_small") - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_sort_button.py b/tests/test_sort_button.py index fc7e9ad..deb2168 100644 --- a/tests/test_sort_button.py +++ b/tests/test_sort_button.py @@ -92,4 +92,4 @@ def test_sort_empty_name(self): self.assertEqual(self.folder_list.images, expected_images) if __name__ == "__main__": - unittest.main() + unittest.main() \ No newline at end of file From 1a755d2092e0676c6941df9c986222b5e704fac6 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 06:46:09 -0500 Subject: [PATCH 027/124] editing requirements file, circle-ciand docker --- .circleci/config.yml | 55 ++++++++++------ Dockerfile | 49 +++++++++++++- requirements.txt | 148 +------------------------------------------ 3 files changed, 84 insertions(+), 168 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 35715ba..5be090c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,37 +1,50 @@ version: 2.1 -jobs: - build_and_push: +executors: + docker-executor: docker: - - image: cimg/python:3.8 + - image: circleci/python:3.9 + +jobs: + test: + executor: docker-executor steps: - checkout - setup_remote_docker: - version: 19.03.13 + version: 20.10.7 - run: - name: Print Docker Hub Username - command: echo "Docker Hub Username is '$DOCKERHUB_USERNAME'" - - run: - name: Install Dependencies - command: pip install -r requirements.txt - - run: - name: Build Docker Image + name: Install dependencies command: | - docker build -t $DOCKERHUB_USERNAME/visionai:${CIRCLE_SHA1} . + python -m venv venv + . venv/bin/activate + pip install -r requirements.txt - run: - name: Authenticate with Docker Hub + name: Run tests command: | - echo "$DOCKERHUB_PASS" | docker login --username $DOCKERHUB_USERNAME --password-stdin + . venv/bin/activate + pytest tests/ + + build_and_push: + docker: + - image: docker:20.10.7 + steps: + - setup_remote_docker: + version: 20.10.7 + - checkout + - run: + name: Build Docker image + command: docker build -t mgallai/vision_ai:$CIRCLE_SHA1 . - run: - name: Push Docker Image to Docker Hub + name: Push Docker image command: | - docker push $DOCKERHUB_USERNAME/visionai:${CIRCLE_SHA1} + echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin + docker push mgallai/vision_ai:$CIRCLE_SHA1 workflows: - version: 2.1 - build_and_deploy: + version: 2 + build_and_test: jobs: + - test - build_and_push: - filters: - branches: - only: docker-branch + requires: + - test diff --git a/Dockerfile b/Dockerfile index b08f6ee..7c296ed 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,47 @@ # Use the official Python image from Docker Hub as the base image -FROM python:3.8-slim +FROM python:3.9-slim # Set the working directory inside the container WORKDIR /usr/src/app +# Install necessary libraries for PyQt5 and OpenGL +RUN apt-get update && apt-get install -y \ + libgl1-mesa-glx \ + libglib2.0-0 \ + libxkbcommon-x11-0 \ + libx11-xcb1 \ + libxcb-glx0 \ + libxcb-keysyms1 \ + libxcb-image0 \ + libxcb-shm0 \ + libxcb-icccm4 \ + libxcb-sync1 \ + libxcb-xfixes0 \ + libxcb-shape0 \ + libxcb-randr0 \ + libxcb-render-util0 \ + libxcb-xinerama0 \ + libxcb-util1 \ + libxrender1 \ + libxi6 \ + libsm6 \ + libfontconfig1 \ + libfreetype6 \ + libxext6 \ + libx11-6 \ + libxau6 \ + libxdmcp6 \ + libxcomposite1 \ + libxcursor1 \ + libxdamage1 \ + libxrandr2 \ + libxinerama1 \ + libxfixes3 \ + libxtst6 \ + libxss1 \ + libxxf86vm1 \ + && rm -rf /var/lib/apt/lists/* + # Copy the requirements file into the container COPY requirements.txt . @@ -13,5 +51,12 @@ RUN pip install --no-cache-dir -r requirements.txt # Copy the entire project directory contents into the container COPY . . +# Set environment variables for Qt +ENV QT_QPA_PLATFORM offscreen +ENV XDG_RUNTIME_DIR /tmp/runtime-root + +# Create the runtime directory +RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root + # Specify the command to run the application -CMD [ "python", "./app.py" ] +CMD ["python", "./app.py"] diff --git a/requirements.txt b/requirements.txt index a751958..bf5a348 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,146 +1,4 @@ -babel==2.15.0 -markupsafe==2.1.5 -pyyaml==6.0.1 -qtpy==2.4.1 -send2trash==1.8.3 -anyio==4.3.0 -argon2-cffi==23.1.0 -argon2-cffi-bindings==21.2.0 -arrow==1.3.0 -asttokens==2.4.1 -async-lru==2.0.4 -attrs==23.2.0 -beautifulsoup4==4.12.3 -bleach==6.1.0 -certifi==2024.2.2 -cffi==1.16.0 -charset-normalizer==3.3.2 -colorama==0.4.6 -coloredlogs==15.0.1 -comm==0.2.2 -contourpy==1.2.1 -cycler==0.12.1 -debugpy==1.8.1 -decorator==5.1.1 -defusedxml==0.7.1 -executing==2.0.1 -filelock==3.14.0 -flatbuffers==24.3.25 -fonttools==4.51.0 -fqdn==1.5.1 -fsspec==2024.6.0 -h11==0.14.0 -httpcore==1.0.5 -httpx==0.27.0 -humanfriendly==10.0 -idna==3.7 -intel-openmp==2021.4.0 -ipykernel==6.29.4 -ipython==8.24.0 -ipywidgets==8.1.2 -isoduration==20.11.0 -jedi==0.19.1 -jinja2==3.1.4 -json5==0.9.25 -jsonpointer==2.4 -jsonschema==4.22.0 -jsonschema-specifications==2023.12.1 -jupyter==1.0.0 -jupyter-client==8.6.1 -jupyter-console==6.6.3 -jupyter-core==5.7.2 -jupyter-events==0.10.0 -jupyter-lsp==2.2.5 -jupyter-server==2.14.0 -jupyter-server-terminals==0.5.3 -jupyterlab==4.1.8 -jupyterlab-pygments==0.3.0 -jupyterlab-server==2.27.1 -jupyterlab-widgets==3.0.10 -kiwisolver==1.4.5 -matplotlib==3.8.4 -matplotlib-inline==0.1.7 -mistune==3.0.2 -mkl==2021.4.0 -mpmath==1.3.0 -nbclient==0.10.0 -nbconvert==7.16.4 -nbformat==5.10.4 -nest-asyncio==1.6.0 -networkx==3.3 -notebook==7.1.3 -notebook-shim==0.2.4 -onnx==1.16.1 -onnxruntime==1.18.0 -opencv-python==4.9.0.80 -overrides==7.7.0 -packaging==24.0 -pandas==2.2.2 -pandocfilters==1.5.1 -parso==0.8.4 -pillow==10.3.0 -platformdirs==4.2.1 -prometheus-client==0.20.0 -prompt-toolkit==3.0.43 -protobuf==5.27.1 -psutil==5.9.8 -py-cpuinfo==9.0.0 -pycparser==2.22 -pygments==2.18.0 -pyparsing==3.1.2 -pyreadline3==3.4.1 -python-dateutil==2.9.0.post0 -python-json-logger==2.0.7 -pytz==2024.1 -pywinpty==2.0.13 -pyzmq==26.0.3 -qtconsole==5.5.2 -referencing==0.35.1 -requests==2.31.0 -rfc3339-validator==0.1.4 -rfc3986-validator==0.1.1 -rpds-py==0.18.1 -seaborn==0.13.2 -six==1.16.0 -sniffio==1.3.1 -soupsieve==2.5 -stack-data==0.6.3 -sympy==1.12.1 -terminado==0.18.1 -tinycss2==1.3.0 -torch==2.3.1 -torchvision==0.18.1 -tornado==6.4 -tqdm==4.66.4 -traitlets==5.14.3 -types-python-dateutil==2.9.0.20240316 -typing-extensions==4.12.1 -tzdata==2024.1 -ultralytics==8.2.28 -ultralytics-thop==0.2.7 -uri-template==1.3.0 -urllib3==2.2.1 -webcolors==1.13 -pyqt5==5.15.10 -pyqt5-qt5==5.15.2 -pyqt5-sip==12.13.0 -cv==1.0.0 -fastjsonschema==2.19.1 -iniconfig==2.0.0 -joblib==1.4.2 +PyQt5==5.15.10 numpy==1.26.4 -pip==24.0 -pluggy==1.5.0 -pure-eval==0.2.2 -pytest==8.2.2 -pytest-qt==4.4.0 -pywin32==306 -scikit-learn==1.4.2 -scipy==1.13.0 -setuptools==70.0.0 -tbb==2021.12.0 -threadpoolctl==3.5.0 -wcwidth==0.2.13 -webencodings==0.5.1 -websocket-client==1.8.0 -widgetsnbextension==4.0.10 +Pillow==10.3.0 +onnxruntime==1.18.0 From 996ae4f7782d78f6c07b17e60955d6d84bee39e3 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 07:08:22 -0500 Subject: [PATCH 028/124] test --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5be090c..0a9aae9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,6 +5,7 @@ executors: docker: - image: circleci/python:3.9 + jobs: test: executor: docker-executor From 754702029cbb45099fa2bb3dbabe9a054094deea Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 07:13:28 -0500 Subject: [PATCH 029/124] removing pytest --- .circleci/config.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0a9aae9..501c8b9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,7 +5,6 @@ executors: docker: - image: circleci/python:3.9 - jobs: test: executor: docker-executor @@ -23,7 +22,7 @@ jobs: name: Run tests command: | . venv/bin/activate - pytest tests/ + python -m unittest discover -s tests build_and_push: docker: From b76a57c7dc8708a1cf093489420a12265e5a6cf9 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 07:20:06 -0500 Subject: [PATCH 030/124] editing dockerfile and circle ci to include x11 lib --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 7c296ed..ca3fdf9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -51,7 +51,7 @@ RUN pip install --no-cache-dir -r requirements.txt # Copy the entire project directory contents into the container COPY . . -# Set environment variables for Qt +# Set environment variables for Qt to use offscreen platform ENV QT_QPA_PLATFORM offscreen ENV XDG_RUNTIME_DIR /tmp/runtime-root From e2c416f8928b87a621275a3b3879d2bff1702316 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 07:37:36 -0500 Subject: [PATCH 031/124] editing dockerfile to inclide dependencies --- Dockerfile | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Dockerfile b/Dockerfile index ca3fdf9..db6e8c9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,6 +40,14 @@ RUN apt-get update && apt-get install -y \ libxtst6 \ libxss1 \ libxxf86vm1 \ + libdbus-1-3 \ + libxcb-render0 \ + libatk1.0-0 \ + libatk-bridge2.0-0 \ + libcairo2 \ + libgdk-pixbuf2.0-0 \ + libpango-1.0-0 \ + libgdk-pixbuf2.0-dev \ && rm -rf /var/lib/apt/lists/* # Copy the requirements file into the container From 6c84969a49622f299894a02d8c37e8202c4ea67e Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 07:47:37 -0500 Subject: [PATCH 032/124] editing circle ci, to run tests one by one --- .circleci/config.yml | 54 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 501c8b9..351abfe 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -19,10 +19,50 @@ jobs: . venv/bin/activate pip install -r requirements.txt - run: - name: Run tests + name: Run test_AI_NumberOfOutputs command: | . venv/bin/activate - python -m unittest discover -s tests + python -m unittest tests.test_AI_NumberOfOutputs + - run: + name: Run test_AI_PredictedCity + command: | + . venv/bin/activate + python -m unittest tests.test_AI_PredictedCity + - run: + name: Run test_AI_Preprocessing + command: | + . venv/bin/activate + python -m unittest tests.test_AI_Preprocessing + - run: + name: Run test_ButtonPanel + command: | + . venv/bin/activate + python -m unittest tests.test_ButtonPanel + - run: + name: Run test_IconsExist + command: | + . venv/bin/activate + python -m unittest tests.test_IconsExist + - run: + name: Run test_InformationDialog + command: | + . venv/bin/activate + python -m unittest tests.test_InformationDialog + - run: + name: Run test_ModelExist + command: | + . venv/bin/activate + python -m unittest tests.test_ModelExist + - run: + name: Run test_SelectMethod + command: | + . venv/bin/activate + python -m unittest tests.test_SelectMethod + - run: + name: Run test_sort_button + command: | + . venv/bin/activate + python -m unittest tests.test_sort_button build_and_push: docker: @@ -44,7 +84,15 @@ workflows: version: 2 build_and_test: jobs: - - test + - test: + filters: + branches: + only: + - main - build_and_push: requires: - test + filters: + branches: + only: + - main From 8156e754f635f226253b95ed3da3ac58a693df71 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 07:52:20 -0500 Subject: [PATCH 033/124] editing dockerfile to include dependencies --- .circleci/config.yml | 8 +++----- Dockerfile | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 351abfe..902be5b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,15 +3,13 @@ version: 2.1 executors: docker-executor: docker: - - image: circleci/python:3.9 + - image: mgallai/vision_ai:latest jobs: test: executor: docker-executor steps: - checkout - - setup_remote_docker: - version: 20.10.7 - run: name: Install dependencies command: | @@ -73,12 +71,12 @@ jobs: - checkout - run: name: Build Docker image - command: docker build -t mgallai/vision_ai:$CIRCLE_SHA1 . + command: docker build -t mgallai/vision_ai:latest . - run: name: Push Docker image command: | echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin - docker push mgallai/vision_ai:$CIRCLE_SHA1 + docker push mgallai/vision_ai:latest workflows: version: 2 diff --git a/Dockerfile b/Dockerfile index db6e8c9..9dc1bf1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -60,8 +60,8 @@ RUN pip install --no-cache-dir -r requirements.txt COPY . . # Set environment variables for Qt to use offscreen platform -ENV QT_QPA_PLATFORM offscreen -ENV XDG_RUNTIME_DIR /tmp/runtime-root +ENV QT_QPA_PLATFORM=offscreen +ENV XDG_RUNTIME_DIR=/tmp/runtime-root # Create the runtime directory RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root From 9c2b1bec9c1d47630b3c55a19607431b8a43e923 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 07:57:19 -0500 Subject: [PATCH 034/124] editing dockerfile to include dependencies --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 9dc1bf1..48670b6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,6 +48,7 @@ RUN apt-get update && apt-get install -y \ libgdk-pixbuf2.0-0 \ libpango-1.0-0 \ libgdk-pixbuf2.0-dev \ + qt5-default \ && rm -rf /var/lib/apt/lists/* # Copy the requirements file into the container From aa8495a07e63d2c53fcdd1b4c69ea6e305a3b869 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 08:05:29 -0500 Subject: [PATCH 035/124] editing dockerfile to include dependencies --- .circleci/config.yml | 84 +++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 902be5b..73a58fa 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,93 +3,95 @@ version: 2.1 executors: docker-executor: docker: - - image: mgallai/vision_ai:latest + - image: circleci/python:3.9 jobs: + build_image: + docker: + - image: docker:20.10.7 + steps: + - setup_remote_docker: + version: 20.10.7 + - checkout + - run: + name: Build Docker image + command: docker build -t mgallai/vision_ai:latest . + - run: + name: Push Docker image + command: | + echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin + docker push mgallai/vision_ai:latest + test: executor: docker-executor steps: - checkout + - run: + name: Pull Docker image + command: docker pull mgallai/vision_ai:latest - run: name: Install dependencies command: | - python -m venv venv - . venv/bin/activate - pip install -r requirements.txt + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + /bin/bash -c "python -m venv venv && . venv/bin/activate && pip install -r requirements.txt" - run: name: Run test_AI_NumberOfOutputs command: | - . venv/bin/activate - python -m unittest tests.test_AI_NumberOfOutputs + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_AI_NumberOfOutputs" - run: name: Run test_AI_PredictedCity command: | - . venv/bin/activate - python -m unittest tests.test_AI_PredictedCity + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_AI_PredictedCity" - run: name: Run test_AI_Preprocessing command: | - . venv/bin/activate - python -m unittest tests.test_AI_Preprocessing + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_AI_Preprocessing" - run: name: Run test_ButtonPanel command: | - . venv/bin/activate - python -m unittest tests.test_ButtonPanel + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_ButtonPanel" - run: name: Run test_IconsExist command: | - . venv/bin/activate - python -m unittest tests.test_IconsExist + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_IconsExist" - run: name: Run test_InformationDialog command: | - . venv/bin/activate - python -m unittest tests.test_InformationDialog + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_InformationDialog" - run: name: Run test_ModelExist command: | - . venv/bin/activate - python -m unittest tests.test_ModelExist + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_ModelExist" - run: name: Run test_SelectMethod command: | - . venv/bin/activate - python -m unittest tests.test_SelectMethod + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_SelectMethod" - run: name: Run test_sort_button command: | - . venv/bin/activate - python -m unittest tests.test_sort_button - - build_and_push: - docker: - - image: docker:20.10.7 - steps: - - setup_remote_docker: - version: 20.10.7 - - checkout - - run: - name: Build Docker image - command: docker build -t mgallai/vision_ai:latest . - - run: - name: Push Docker image - command: | - echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin - docker push mgallai/vision_ai:latest + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_sort_button" workflows: version: 2 build_and_test: jobs: - - test: + - build_image: filters: branches: only: - main - - build_and_push: + - test: requires: - - test + - build_image filters: branches: only: From cc198adc529e2e486bad476aac9bc660246e362d Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 08:17:39 -0500 Subject: [PATCH 036/124] editing dockerfile to include dependencies --- .circleci/config.yml | 26 +++++++++++++------------- Dockerfile | 7 +++++-- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 73a58fa..7e07c76 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -15,12 +15,12 @@ jobs: - checkout - run: name: Build Docker image - command: docker build -t mgallai/vision_ai:latest . + command: docker build -t mgallai/vision_ai:${CIRCLE_SHA1} . - run: name: Push Docker image command: | echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin - docker push mgallai/vision_ai:latest + docker push mgallai/vision_ai:${CIRCLE_SHA1} test: executor: docker-executor @@ -28,56 +28,56 @@ jobs: - checkout - run: name: Pull Docker image - command: docker pull mgallai/vision_ai:latest + command: docker pull mgallai/vision_ai:${CIRCLE_SHA1} - run: name: Install dependencies command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ /bin/bash -c "python -m venv venv && . venv/bin/activate && pip install -r requirements.txt" - run: name: Run test_AI_NumberOfOutputs command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_AI_NumberOfOutputs" - run: name: Run test_AI_PredictedCity command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_AI_PredictedCity" - run: name: Run test_AI_Preprocessing command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_AI_Preprocessing" - run: name: Run test_ButtonPanel command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_ButtonPanel" - run: name: Run test_IconsExist command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_IconsExist" - run: name: Run test_InformationDialog command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_InformationDialog" - run: name: Run test_ModelExist command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_ModelExist" - run: name: Run test_SelectMethod command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_SelectMethod" - run: name: Run test_sort_button command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:latest \ + docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_sort_button" workflows: diff --git a/Dockerfile b/Dockerfile index 48670b6..d41fa82 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,8 +48,11 @@ RUN apt-get update && apt-get install -y \ libgdk-pixbuf2.0-0 \ libpango-1.0-0 \ libgdk-pixbuf2.0-dev \ - qt5-default \ - && rm -rf /var/lib/apt/lists/* + qtbase5-dev \ + qtbase5-dev-tools \ + qt5-qmake \ + && rm -rf /var/lib/apt/lists/* \ + && apt-get clean # Copy the requirements file into the container COPY requirements.txt . From 7d9c2689bc03256ea6b7dc529f8bd1c7de0d5b1a Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 08:31:02 -0500 Subject: [PATCH 037/124] editing dockerfile to include dependencies --- Dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index d41fa82..513821a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -50,9 +50,7 @@ RUN apt-get update && apt-get install -y \ libgdk-pixbuf2.0-dev \ qtbase5-dev \ qtbase5-dev-tools \ - qt5-qmake \ - && rm -rf /var/lib/apt/lists/* \ - && apt-get clean + qt5-qmake # Copy the requirements file into the container COPY requirements.txt . From 596a7e65f732de77a24530b4929fef5bd1f215ed Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 08:40:58 -0500 Subject: [PATCH 038/124] editing dockerfile to include dependencies --- Dockerfile | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index 513821a..c6b5eb0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,8 +4,11 @@ FROM python:3.9-slim # Set the working directory inside the container WORKDIR /usr/src/app +# Update package repositories +RUN apt-get update + # Install necessary libraries for PyQt5 and OpenGL -RUN apt-get update && apt-get install -y \ +RUN apt-get install -y \ libgl1-mesa-glx \ libglib2.0-0 \ libxkbcommon-x11-0 \ @@ -52,6 +55,13 @@ RUN apt-get update && apt-get install -y \ qtbase5-dev-tools \ qt5-qmake +# Set environment variables for Qt to use offscreen platform +ENV QT_QPA_PLATFORM=offscreen +ENV XDG_RUNTIME_DIR=/tmp/runtime-root + +# Create the runtime directory +RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root + # Copy the requirements file into the container COPY requirements.txt . @@ -61,12 +71,5 @@ RUN pip install --no-cache-dir -r requirements.txt # Copy the entire project directory contents into the container COPY . . -# Set environment variables for Qt to use offscreen platform -ENV QT_QPA_PLATFORM=offscreen -ENV XDG_RUNTIME_DIR=/tmp/runtime-root - -# Create the runtime directory -RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root - # Specify the command to run the application CMD ["python", "./app.py"] From de32f1feed3a6ecafa2c8fc959cf26660b89f972 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 08:57:33 -0500 Subject: [PATCH 039/124] editing dockerfile to include dependencies --- Dockerfile | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index c6b5eb0..cf64742 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,11 +4,11 @@ FROM python:3.9-slim # Set the working directory inside the container WORKDIR /usr/src/app -# Update package repositories -RUN apt-get update +# Configure APT to skip the problematic Post-Invoke script +RUN echo 'DPkg::Post-Invoke {"rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true";};' > /etc/apt/apt.conf.d/no-cache -# Install necessary libraries for PyQt5 and OpenGL -RUN apt-get install -y \ +# Update package repositories and install necessary libraries for PyQt5 and OpenGL +RUN apt-get update && apt-get install -y \ libgl1-mesa-glx \ libglib2.0-0 \ libxkbcommon-x11-0 \ @@ -53,7 +53,8 @@ RUN apt-get install -y \ libgdk-pixbuf2.0-dev \ qtbase5-dev \ qtbase5-dev-tools \ - qt5-qmake + qt5-qmake \ + && rm -rf /var/lib/apt/lists/* # Set environment variables for Qt to use offscreen platform ENV QT_QPA_PLATFORM=offscreen From e800430e4501f18cb3363260db4d1b72ca7e8772 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 09:00:04 -0500 Subject: [PATCH 040/124] editing dockerfile to include dependencies --- Dockerfile | 32 +++++++++----------------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/Dockerfile b/Dockerfile index cf64742..2ab0f14 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,10 +4,7 @@ FROM python:3.9-slim # Set the working directory inside the container WORKDIR /usr/src/app -# Configure APT to skip the problematic Post-Invoke script -RUN echo 'DPkg::Post-Invoke {"rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true";};' > /etc/apt/apt.conf.d/no-cache - -# Update package repositories and install necessary libraries for PyQt5 and OpenGL +# Install necessary libraries for PyQt5 and OpenGL RUN apt-get update && apt-get install -y \ libgl1-mesa-glx \ libglib2.0-0 \ @@ -43,26 +40,8 @@ RUN apt-get update && apt-get install -y \ libxtst6 \ libxss1 \ libxxf86vm1 \ - libdbus-1-3 \ - libxcb-render0 \ - libatk1.0-0 \ - libatk-bridge2.0-0 \ - libcairo2 \ - libgdk-pixbuf2.0-0 \ - libpango-1.0-0 \ - libgdk-pixbuf2.0-dev \ - qtbase5-dev \ - qtbase5-dev-tools \ - qt5-qmake \ && rm -rf /var/lib/apt/lists/* -# Set environment variables for Qt to use offscreen platform -ENV QT_QPA_PLATFORM=offscreen -ENV XDG_RUNTIME_DIR=/tmp/runtime-root - -# Create the runtime directory -RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root - # Copy the requirements file into the container COPY requirements.txt . @@ -72,5 +51,12 @@ RUN pip install --no-cache-dir -r requirements.txt # Copy the entire project directory contents into the container COPY . . +# Set environment variables for Qt to use offscreen platform +ENV QT_QPA_PLATFORM offscreen +ENV XDG_RUNTIME_DIR /tmp/runtime-root + +# Create the runtime directory +RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root + # Specify the command to run the application -CMD ["python", "./app.py"] +CMD ["python", "./app.py"] \ No newline at end of file From 02775205a0700ad9d0e78bf0752f6057b2118534 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 09:03:27 -0500 Subject: [PATCH 041/124] editing dockerfile to include dependencies --- .circleci/config.yml | 96 +++++++++++--------------------------------- 1 file changed, 24 insertions(+), 72 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7e07c76..fc4c485 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,93 +6,45 @@ executors: - image: circleci/python:3.9 jobs: - build_image: - docker: - - image: docker:20.10.7 - steps: - - setup_remote_docker: - version: 20.10.7 - - checkout - - run: - name: Build Docker image - command: docker build -t mgallai/vision_ai:${CIRCLE_SHA1} . - - run: - name: Push Docker image - command: | - echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin - docker push mgallai/vision_ai:${CIRCLE_SHA1} - test: executor: docker-executor steps: - checkout - - run: - name: Pull Docker image - command: docker pull mgallai/vision_ai:${CIRCLE_SHA1} + - setup_remote_docker: + version: 20.10.7 - run: name: Install dependencies command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ - /bin/bash -c "python -m venv venv && . venv/bin/activate && pip install -r requirements.txt" - - run: - name: Run test_AI_NumberOfOutputs - command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ - /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_AI_NumberOfOutputs" - - run: - name: Run test_AI_PredictedCity - command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ - /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_AI_PredictedCity" + python -m venv venv + . venv/bin/activate + pip install -r requirements.txt - run: - name: Run test_AI_Preprocessing + name: Run tests command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ - /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_AI_Preprocessing" - - run: - name: Run test_ButtonPanel - command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ - /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_ButtonPanel" - - run: - name: Run test_IconsExist - command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ - /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_IconsExist" - - run: - name: Run test_InformationDialog - command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ - /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_InformationDialog" - - run: - name: Run test_ModelExist - command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ - /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_ModelExist" + . venv/bin/activate + python -m unittest discover -s tests + + build_and_push: + docker: + - image: docker:20.10.7 + steps: + - setup_remote_docker: + version: 20.10.7 + - checkout - run: - name: Run test_SelectMethod - command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ - /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_SelectMethod" + name: Build Docker image + command: docker build -t mgallai/vision_ai:$CIRCLE_SHA1 . - run: - name: Run test_sort_button + name: Push Docker image command: | - docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app mgallai/vision_ai:${CIRCLE_SHA1} \ - /bin/bash -c ". venv/bin/activate && python -m unittest tests.test_sort_button" + echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin + docker push mgallai/vision_ai:$CIRCLE_SHA1 workflows: version: 2 build_and_test: jobs: - - build_image: - filters: - branches: - only: - - main - - test: + - test + - build_and_push: requires: - - build_image - filters: - branches: - only: - - main + - test \ No newline at end of file From 4172f0d10b9fbf1940a73c7d677726ec1af7fcff Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 09:10:28 -0500 Subject: [PATCH 042/124] editing dockerfile to include dependencies --- .circleci/config.yml | 46 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index fc4c485..58d3ef8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -19,10 +19,50 @@ jobs: . venv/bin/activate pip install -r requirements.txt - run: - name: Run tests + name: Run test_AI_NumberOfOutputs command: | . venv/bin/activate - python -m unittest discover -s tests + python tests/test_AI_NumberOfOutputs.py + - run: + name: Run test_AI_PredictedCity + command: | + . venv/bin/activate + python tests/test_AI_PredictedCity.py + - run: + name: Run test_AI_Preprocessing + command: | + . venv/bin/activate + python tests/test_AI_Preprocessing.py + - run: + name: Run test_ButtonPanel + command: | + . venv/bin/activate + python tests/test_ButtonPanel.py + - run: + name: Run test_IconsExist + command: | + . venv/bin/activate + python tests/test_IconsExist.py + - run: + name: Run test_InformationDialog + command: | + . venv/bin/activate + python tests/test_InformationDialog.py + - run: + name: Run test_ModelExist + command: | + . venv/bin/activate + python tests/test_ModelExist.py + - run: + name: Run test_SelectMethod + command: | + . venv/bin/activate + python tests/test_SelectMethod.py + - run: + name: Run test_sort_button + command: | + . venv/bin/activate + python tests/test_sort_button.py build_and_push: docker: @@ -47,4 +87,4 @@ workflows: - test - build_and_push: requires: - - test \ No newline at end of file + - test From f3ee0f4978566ea5f65016c0a868d29ef92a5a91 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 09:18:23 -0500 Subject: [PATCH 043/124] editing dockerfile to include dependencies --- Dockerfile | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Dockerfile b/Dockerfile index 2ab0f14..6c9386d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,6 +42,13 @@ RUN apt-get update && apt-get install -y \ libxxf86vm1 \ && rm -rf /var/lib/apt/lists/* +# Set environment variables for Qt to use offscreen platform +ENV QT_QPA_PLATFORM=offscreen + +# Create the runtime directory +ENV XDG_RUNTIME_DIR=/tmp/runtime-root +RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root + # Copy the requirements file into the container COPY requirements.txt . From 725a0bbb718c3a939d8501358e485f94a419bc17 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 09:22:56 -0500 Subject: [PATCH 044/124] editing dockerfile to include dependencies --- Dockerfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6c9386d..00eda31 100644 --- a/Dockerfile +++ b/Dockerfile @@ -60,10 +60,6 @@ COPY . . # Set environment variables for Qt to use offscreen platform ENV QT_QPA_PLATFORM offscreen -ENV XDG_RUNTIME_DIR /tmp/runtime-root - -# Create the runtime directory -RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root # Specify the command to run the application CMD ["python", "./app.py"] \ No newline at end of file From 75100570c68f4d6620a62f8eef86abc1916287b7 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 15:57:38 -0500 Subject: [PATCH 045/124] editing docker file --- Dockerfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 00eda31..31e8f0e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Use the official Python image from Docker Hub as the base image -FROM python:3.9-slim +FROM python:3.10-slim # Set the working directory inside the container WORKDIR /usr/src/app @@ -60,6 +60,10 @@ COPY . . # Set environment variables for Qt to use offscreen platform ENV QT_QPA_PLATFORM offscreen +ENV XDG_RUNTIME_DIR /tmp/runtime-root + +# Create the runtime directory +RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root # Specify the command to run the application CMD ["python", "./app.py"] \ No newline at end of file From 92538d8ff4a2fcd2f706b37dc3eafb0bb2a5f4de Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 16:08:00 -0500 Subject: [PATCH 046/124] editing docker file --- .circleci/config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 58d3ef8..d01f804 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,6 +8,8 @@ executors: jobs: test: executor: docker-executor + environment: + QT_QPA_PLATFORM: offscreen steps: - checkout - setup_remote_docker: From b3faaab22bc9a94cd3267436a5ad6c6d981c4548 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 16:22:12 -0500 Subject: [PATCH 047/124] editing docker file --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 31e8f0e..b28a323 100644 --- a/Dockerfile +++ b/Dockerfile @@ -50,13 +50,13 @@ ENV XDG_RUNTIME_DIR=/tmp/runtime-root RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root # Copy the requirements file into the container -COPY requirements.txt . +COPY requirements.txt /usr/src/app/ # Install any dependencies specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt # Copy the entire project directory contents into the container -COPY . . +COPY . /usr/src/app/ # Set environment variables for Qt to use offscreen platform ENV QT_QPA_PLATFORM offscreen From fbf1e5556f1cfaa8cf5eb964a6a7ab3b1dc893a0 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 16:31:23 -0500 Subject: [PATCH 048/124] editing docker file --- Dockerfile | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/Dockerfile b/Dockerfile index b28a323..d1cf85a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,8 +4,9 @@ FROM python:3.10-slim # Set the working directory inside the container WORKDIR /usr/src/app -# Install necessary libraries for PyQt5 and OpenGL -RUN apt-get update && apt-get install -y \ +# Update the package list and install necessary libraries for PyQt5 and OpenGL +RUN apt-get update +RUN apt-get install -y \ libgl1-mesa-glx \ libglib2.0-0 \ libxkbcommon-x11-0 \ @@ -39,13 +40,13 @@ RUN apt-get update && apt-get install -y \ libxfixes3 \ libxtst6 \ libxss1 \ - libxxf86vm1 \ - && rm -rf /var/lib/apt/lists/* + libxxf86vm1 + +# Remove package lists to save space +RUN rm -rf /var/lib/apt/lists/* # Set environment variables for Qt to use offscreen platform ENV QT_QPA_PLATFORM=offscreen - -# Create the runtime directory ENV XDG_RUNTIME_DIR=/tmp/runtime-root RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root @@ -58,12 +59,5 @@ RUN pip install --no-cache-dir -r requirements.txt # Copy the entire project directory contents into the container COPY . /usr/src/app/ -# Set environment variables for Qt to use offscreen platform -ENV QT_QPA_PLATFORM offscreen -ENV XDG_RUNTIME_DIR /tmp/runtime-root - -# Create the runtime directory -RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root - # Specify the command to run the application CMD ["python", "./app.py"] \ No newline at end of file From 422457f2ddc50caec34aac464e60fe9d69f2092e Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 17:16:52 -0500 Subject: [PATCH 049/124] editing the docker file --- Dockerfile | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index d1cf85a..31e8f0e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,9 +4,8 @@ FROM python:3.10-slim # Set the working directory inside the container WORKDIR /usr/src/app -# Update the package list and install necessary libraries for PyQt5 and OpenGL -RUN apt-get update -RUN apt-get install -y \ +# Install necessary libraries for PyQt5 and OpenGL +RUN apt-get update && apt-get install -y \ libgl1-mesa-glx \ libglib2.0-0 \ libxkbcommon-x11-0 \ @@ -40,24 +39,31 @@ RUN apt-get install -y \ libxfixes3 \ libxtst6 \ libxss1 \ - libxxf86vm1 - -# Remove package lists to save space -RUN rm -rf /var/lib/apt/lists/* + libxxf86vm1 \ + && rm -rf /var/lib/apt/lists/* # Set environment variables for Qt to use offscreen platform ENV QT_QPA_PLATFORM=offscreen + +# Create the runtime directory ENV XDG_RUNTIME_DIR=/tmp/runtime-root RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root # Copy the requirements file into the container -COPY requirements.txt /usr/src/app/ +COPY requirements.txt . # Install any dependencies specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt # Copy the entire project directory contents into the container -COPY . /usr/src/app/ +COPY . . + +# Set environment variables for Qt to use offscreen platform +ENV QT_QPA_PLATFORM offscreen +ENV XDG_RUNTIME_DIR /tmp/runtime-root + +# Create the runtime directory +RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root # Specify the command to run the application CMD ["python", "./app.py"] \ No newline at end of file From 352af1368853e3b739a42350d3d16d1f6a6bbbb3 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 17:24:27 -0500 Subject: [PATCH 050/124] editing the docker file --- Dockerfile | 37 +------------------------------------ 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/Dockerfile b/Dockerfile index 31e8f0e..3801cb6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,34 +12,6 @@ RUN apt-get update && apt-get install -y \ libx11-xcb1 \ libxcb-glx0 \ libxcb-keysyms1 \ - libxcb-image0 \ - libxcb-shm0 \ - libxcb-icccm4 \ - libxcb-sync1 \ - libxcb-xfixes0 \ - libxcb-shape0 \ - libxcb-randr0 \ - libxcb-render-util0 \ - libxcb-xinerama0 \ - libxcb-util1 \ - libxrender1 \ - libxi6 \ - libsm6 \ - libfontconfig1 \ - libfreetype6 \ - libxext6 \ - libx11-6 \ - libxau6 \ - libxdmcp6 \ - libxcomposite1 \ - libxcursor1 \ - libxdamage1 \ - libxrandr2 \ - libxinerama1 \ - libxfixes3 \ - libxtst6 \ - libxss1 \ - libxxf86vm1 \ && rm -rf /var/lib/apt/lists/* # Set environment variables for Qt to use offscreen platform @@ -58,12 +30,5 @@ RUN pip install --no-cache-dir -r requirements.txt # Copy the entire project directory contents into the container COPY . . -# Set environment variables for Qt to use offscreen platform -ENV QT_QPA_PLATFORM offscreen -ENV XDG_RUNTIME_DIR /tmp/runtime-root - -# Create the runtime directory -RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root - # Specify the command to run the application -CMD ["python", "./app.py"] \ No newline at end of file +CMD ["python", "./app.py"] From a3fed3b3ef5d6da9ae9fa4f2ad808ea92ca0d964 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 17:30:38 -0500 Subject: [PATCH 051/124] editing the docker file --- Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3801cb6..a1d930f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,8 +11,9 @@ RUN apt-get update && apt-get install -y \ libxkbcommon-x11-0 \ libx11-xcb1 \ libxcb-glx0 \ - libxcb-keysyms1 \ - && rm -rf /var/lib/apt/lists/* + libxcb-keysyms1 && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* # Set environment variables for Qt to use offscreen platform ENV QT_QPA_PLATFORM=offscreen From 45537db5c77fba3f66e435bffed489b781fb2857 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 17:38:35 -0500 Subject: [PATCH 052/124] editing the docker file --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index a1d930f..6b112af 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,6 @@ RUN apt-get update && apt-get install -y \ libxcb-glx0 \ libxcb-keysyms1 && \ apt-get clean && \ - rm -rf /var/lib/apt/lists/* # Set environment variables for Qt to use offscreen platform ENV QT_QPA_PLATFORM=offscreen From 4b82f0409fde6400394680a4201a027c1a54cb01 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 17:44:56 -0500 Subject: [PATCH 053/124] editing the docker file --- Dockerfile | 40 +++++++++++++--------------------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6b112af..1623db6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,34 +1,20 @@ -# Use the official Python image from Docker Hub as the base image -FROM python:3.10-slim +# Use an official Python runtime as a parent image +FROM python:3.9-slim -# Set the working directory inside the container -WORKDIR /usr/src/app +# Set the working directory in the container +WORKDIR /app -# Install necessary libraries for PyQt5 and OpenGL -RUN apt-get update && apt-get install -y \ - libgl1-mesa-glx \ - libglib2.0-0 \ - libxkbcommon-x11-0 \ - libx11-xcb1 \ - libxcb-glx0 \ - libxcb-keysyms1 && \ - apt-get clean && \ - -# Set environment variables for Qt to use offscreen platform -ENV QT_QPA_PLATFORM=offscreen - -# Create the runtime directory -ENV XDG_RUNTIME_DIR=/tmp/runtime-root -RUN mkdir -p /tmp/runtime-root && chmod 700 /tmp/runtime-root - -# Copy the requirements file into the container +# Copy the requirements file into the container at /app COPY requirements.txt . -# Install any dependencies specified in requirements.txt +# Install any needed packages specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt -# Copy the entire project directory contents into the container -COPY . . +# Make port 80 available to the world outside this container +EXPOSE 80 + +# Define environment variable +ENV NAME World -# Specify the command to run the application -CMD ["python", "./app.py"] +# Run app.py when the container launches +CMD ["python", "app.py"] From fcc8f6c737d2ce8fdf2817064dc71986ba5b87ec Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 17:58:31 -0500 Subject: [PATCH 054/124] editing the docker file --- .circleci/config.yml | 69 ++------------------------------------------ Dockerfile | 3 ++ 2 files changed, 6 insertions(+), 66 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d01f804..8eed74e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,69 +3,9 @@ version: 2.1 executors: docker-executor: docker: - - image: circleci/python:3.9 + - image: docker:20.10.7 jobs: - test: - executor: docker-executor - environment: - QT_QPA_PLATFORM: offscreen - steps: - - checkout - - setup_remote_docker: - version: 20.10.7 - - run: - name: Install dependencies - command: | - python -m venv venv - . venv/bin/activate - pip install -r requirements.txt - - run: - name: Run test_AI_NumberOfOutputs - command: | - . venv/bin/activate - python tests/test_AI_NumberOfOutputs.py - - run: - name: Run test_AI_PredictedCity - command: | - . venv/bin/activate - python tests/test_AI_PredictedCity.py - - run: - name: Run test_AI_Preprocessing - command: | - . venv/bin/activate - python tests/test_AI_Preprocessing.py - - run: - name: Run test_ButtonPanel - command: | - . venv/bin/activate - python tests/test_ButtonPanel.py - - run: - name: Run test_IconsExist - command: | - . venv/bin/activate - python tests/test_IconsExist.py - - run: - name: Run test_InformationDialog - command: | - . venv/bin/activate - python tests/test_InformationDialog.py - - run: - name: Run test_ModelExist - command: | - . venv/bin/activate - python tests/test_ModelExist.py - - run: - name: Run test_SelectMethod - command: | - . venv/bin/activate - python tests/test_SelectMethod.py - - run: - name: Run test_sort_button - command: | - . venv/bin/activate - python tests/test_sort_button.py - build_and_push: docker: - image: docker:20.10.7 @@ -84,9 +24,6 @@ jobs: workflows: version: 2 - build_and_test: + build_and_push: jobs: - - test - - build_and_push: - requires: - - test + - build_and_push diff --git a/Dockerfile b/Dockerfile index 1623db6..6c354e8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,6 +7,9 @@ WORKDIR /app # Copy the requirements file into the container at /app COPY requirements.txt . +# Update pip to the latest version +RUN pip install --no-cache-dir --upgrade pip + # Install any needed packages specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt From eea473bc134c6d6f5d1c4c24bcd317e7d103f608 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 18:06:14 -0500 Subject: [PATCH 055/124] editing the docker file --- Dockerfile | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6c354e8..ae5ec4d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,11 +7,9 @@ WORKDIR /app # Copy the requirements file into the container at /app COPY requirements.txt . -# Update pip to the latest version -RUN pip install --no-cache-dir --upgrade pip - -# Install any needed packages specified in requirements.txt -RUN pip install --no-cache-dir -r requirements.txt +# Upgrade pip separately and then install the requirements +RUN python -m pip install --upgrade pip && \ + pip install --no-cache-dir -r requirements.txt # Make port 80 available to the world outside this container EXPOSE 80 From 3193636f3d148c89836b9c702a7e6c36cc638c15 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 18:09:13 -0500 Subject: [PATCH 056/124] editing the docker file --- Dockerfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index ae5ec4d..323320e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,9 +7,8 @@ WORKDIR /app # Copy the requirements file into the container at /app COPY requirements.txt . -# Upgrade pip separately and then install the requirements -RUN python -m pip install --upgrade pip && \ - pip install --no-cache-dir -r requirements.txt +# Install the dependencies specified in requirements.txt +RUN pip install --no-cache-dir -r requirements.txt # Make port 80 available to the world outside this container EXPOSE 80 From 64f4a8f075d9fc4b372e582a80d361be4ecfa9df Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 18:23:47 -0500 Subject: [PATCH 057/124] editing the docker file --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 323320e..799086c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ WORKDIR /app COPY requirements.txt . # Install the dependencies specified in requirements.txt -RUN pip install --no-cache-dir -r requirements.txt +RUN pip install --no-cache-dir -r requirements.txt -v # Make port 80 available to the world outside this container EXPOSE 80 From 499bc3ef2ed284c553d108c838d46f70a07263e4 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 18:26:25 -0500 Subject: [PATCH 058/124] editing the docker file --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 799086c..323320e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ WORKDIR /app COPY requirements.txt . # Install the dependencies specified in requirements.txt -RUN pip install --no-cache-dir -r requirements.txt -v +RUN pip install --no-cache-dir -r requirements.txt # Make port 80 available to the world outside this container EXPOSE 80 From 4d76ca8ad698f42ab63bc28a0150e9ba904c6718 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 18:43:59 -0500 Subject: [PATCH 059/124] editing the docker file --- .circleci/config.yml | 4 ++++ Dockerfile | 18 +++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8eed74e..d63486d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -27,3 +27,7 @@ workflows: build_and_push: jobs: - build_and_push + filters: + branches: + only: + - main diff --git a/Dockerfile b/Dockerfile index 323320e..65564cc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,12 +4,24 @@ FROM python:3.9-slim # Set the working directory in the container WORKDIR /app -# Copy the requirements file into the container at /app -COPY requirements.txt . +# Install necessary libraries for PyQt5 and OpenGL in one RUN command +RUN apt-get update && apt-get install -y \ + libgl1-mesa-glx \ + libglib2.0-0 \ + libxkbcommon-x11-0 \ + libx11-xcb1 \ + libxcb-glx0 \ + libxcb-keysyms1 && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* -# Install the dependencies specified in requirements.txt +# Copy the requirements file and install dependencies in one step to leverage Docker layer caching +COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt +# Copy the rest of the application code +COPY . . + # Make port 80 available to the world outside this container EXPOSE 80 From fd642b3588ba238f1c1a3f170f78f6ff68b6189e Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 18:45:37 -0500 Subject: [PATCH 060/124] editing the docker file --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index d63486d..3c20f9d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -27,6 +27,7 @@ workflows: build_and_push: jobs: - build_and_push + filters: branches: only: From 7a4357b63aef77da14246ae9ab767f17d5b3e534 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 18:46:39 -0500 Subject: [PATCH 061/124] editing the docker file --- .circleci/config.yml | 74 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3c20f9d..d01f804 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,9 +3,69 @@ version: 2.1 executors: docker-executor: docker: - - image: docker:20.10.7 + - image: circleci/python:3.9 jobs: + test: + executor: docker-executor + environment: + QT_QPA_PLATFORM: offscreen + steps: + - checkout + - setup_remote_docker: + version: 20.10.7 + - run: + name: Install dependencies + command: | + python -m venv venv + . venv/bin/activate + pip install -r requirements.txt + - run: + name: Run test_AI_NumberOfOutputs + command: | + . venv/bin/activate + python tests/test_AI_NumberOfOutputs.py + - run: + name: Run test_AI_PredictedCity + command: | + . venv/bin/activate + python tests/test_AI_PredictedCity.py + - run: + name: Run test_AI_Preprocessing + command: | + . venv/bin/activate + python tests/test_AI_Preprocessing.py + - run: + name: Run test_ButtonPanel + command: | + . venv/bin/activate + python tests/test_ButtonPanel.py + - run: + name: Run test_IconsExist + command: | + . venv/bin/activate + python tests/test_IconsExist.py + - run: + name: Run test_InformationDialog + command: | + . venv/bin/activate + python tests/test_InformationDialog.py + - run: + name: Run test_ModelExist + command: | + . venv/bin/activate + python tests/test_ModelExist.py + - run: + name: Run test_SelectMethod + command: | + . venv/bin/activate + python tests/test_SelectMethod.py + - run: + name: Run test_sort_button + command: | + . venv/bin/activate + python tests/test_sort_button.py + build_and_push: docker: - image: docker:20.10.7 @@ -24,11 +84,9 @@ jobs: workflows: version: 2 - build_and_push: + build_and_test: jobs: - - build_and_push - - filters: - branches: - only: - - main + - test + - build_and_push: + requires: + - test From 410184e5c0baedff96db203653396d50ea5fca50 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 18:48:42 -0500 Subject: [PATCH 062/124] editing the docker file --- .circleci/config.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index d01f804..68981da 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -90,3 +90,7 @@ workflows: - build_and_push: requires: - test + filters: + branches: + only: + - main From bf6dceb41cb6a5310e9e85e506f83e8880b932d2 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 18:50:29 -0500 Subject: [PATCH 063/124] editing the docker file --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 68981da..7d5082b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -90,7 +90,7 @@ workflows: - build_and_push: requires: - test - filters: - branches: - only: - - main + filters: + branches: + only: + - main From 92bccf930fe7c79de327081bfec097dff2626f9b Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 18:53:22 -0500 Subject: [PATCH 064/124] editing the docker file --- .circleci/config.yml | 70 ++------------------------------------------ 1 file changed, 3 insertions(+), 67 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7d5082b..f0bfd71 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,72 +3,11 @@ version: 2.1 executors: docker-executor: docker: - - image: circleci/python:3.9 + - image: docker:20.10.7 jobs: - test: - executor: docker-executor - environment: - QT_QPA_PLATFORM: offscreen - steps: - - checkout - - setup_remote_docker: - version: 20.10.7 - - run: - name: Install dependencies - command: | - python -m venv venv - . venv/bin/activate - pip install -r requirements.txt - - run: - name: Run test_AI_NumberOfOutputs - command: | - . venv/bin/activate - python tests/test_AI_NumberOfOutputs.py - - run: - name: Run test_AI_PredictedCity - command: | - . venv/bin/activate - python tests/test_AI_PredictedCity.py - - run: - name: Run test_AI_Preprocessing - command: | - . venv/bin/activate - python tests/test_AI_Preprocessing.py - - run: - name: Run test_ButtonPanel - command: | - . venv/bin/activate - python tests/test_ButtonPanel.py - - run: - name: Run test_IconsExist - command: | - . venv/bin/activate - python tests/test_IconsExist.py - - run: - name: Run test_InformationDialog - command: | - . venv/bin/activate - python tests/test_InformationDialog.py - - run: - name: Run test_ModelExist - command: | - . venv/bin/activate - python tests/test_ModelExist.py - - run: - name: Run test_SelectMethod - command: | - . venv/bin/activate - python tests/test_SelectMethod.py - - run: - name: Run test_sort_button - command: | - . venv/bin/activate - python tests/test_sort_button.py - build_and_push: - docker: - - image: docker:20.10.7 + executor: docker-executor steps: - setup_remote_docker: version: 20.10.7 @@ -84,12 +23,9 @@ jobs: workflows: version: 2 - build_and_test: + build_and_push: jobs: - - test - build_and_push: - requires: - - test filters: branches: only: From 097a4d14e78eea43af6e3cb24f0fb1ca21b255da Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 18:56:58 -0500 Subject: [PATCH 065/124] editing the docker file --- Dockerfile | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 65564cc..db5354e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,8 +4,8 @@ FROM python:3.9-slim # Set the working directory in the container WORKDIR /app -# Install necessary libraries for PyQt5 and OpenGL in one RUN command -RUN apt-get update && apt-get install -y \ +# Install necessary libraries for PyQt5 and OpenGL with --fix-missing flag +RUN apt-get update --fix-missing && apt-get install -y \ libgl1-mesa-glx \ libglib2.0-0 \ libxkbcommon-x11-0 \ @@ -15,12 +15,11 @@ RUN apt-get update && apt-get install -y \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -# Copy the requirements file and install dependencies in one step to leverage Docker layer caching +# Copy the requirements file into the container at /app COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -# Copy the rest of the application code -COPY . . +# Install the dependencies specified in requirements.txt +RUN pip install --no-cache-dir -r requirements.txt # Make port 80 available to the world outside this container EXPOSE 80 From c321ced89089469fbf3c42a455f1aac3d787bde7 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 19:00:31 -0500 Subject: [PATCH 066/124] editing the docker file --- Dockerfile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index db5354e..02982c4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,8 +4,11 @@ FROM python:3.9-slim # Set the working directory in the container WORKDIR /app -# Install necessary libraries for PyQt5 and OpenGL with --fix-missing flag -RUN apt-get update --fix-missing && apt-get install -y \ +# Update package lists +RUN apt-get update --fix-missing + +# Install necessary libraries for PyQt5 and OpenGL +RUN apt-get install -y --no-install-recommends \ libgl1-mesa-glx \ libglib2.0-0 \ libxkbcommon-x11-0 \ From 191beb8915ae225125e9fc9565d590180c064204 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 19:06:38 -0500 Subject: [PATCH 067/124] editing the docker file --- .circleci/config.yml | 4 ++-- Dockerfile | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f0bfd71..399d5bc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -14,7 +14,7 @@ jobs: - checkout - run: name: Build Docker image - command: docker build -t mgallai/vision_ai:$CIRCLE_SHA1 . + command: docker build -t mgallai/vision_ai:$CIRCLE_SHA1. - run: name: Push Docker image command: | @@ -29,4 +29,4 @@ workflows: filters: branches: only: - - main + - main \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 02982c4..de823ac 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ FROM python:3.9-slim WORKDIR /app # Update package lists -RUN apt-get update --fix-missing +RUN apt-get update -y # Install necessary libraries for PyQt5 and OpenGL RUN apt-get install -y --no-install-recommends \ @@ -19,7 +19,7 @@ RUN apt-get install -y --no-install-recommends \ rm -rf /var/lib/apt/lists/* # Copy the requirements file into the container at /app -COPY requirements.txt . +COPY requirements.txt. # Install the dependencies specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt @@ -31,4 +31,4 @@ EXPOSE 80 ENV NAME World # Run app.py when the container launches -CMD ["python", "app.py"] +CMD ["python", "app.py"] \ No newline at end of file From b1e5529b8ab8b4c2bee34eadc28fcfe9d3ae67a5 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 19:09:28 -0500 Subject: [PATCH 068/124] editing the docker file --- .circleci/config.yml | 3 ++- Dockerfile | 13 ++----------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 399d5bc..006aa24 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,3 +1,4 @@ +# CircleCI configuration version: 2.1 executors: @@ -14,7 +15,7 @@ jobs: - checkout - run: name: Build Docker image - command: docker build -t mgallai/vision_ai:$CIRCLE_SHA1. + command: docker build --no-cache -t mgallai/vision_ai:$CIRCLE_SHA1 . - run: name: Push Docker image command: | diff --git a/Dockerfile b/Dockerfile index de823ac..74bd94e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,9 @@ -# Use an official Python runtime as a parent image +# Dockerfile FROM python:3.9-slim -# Set the working directory in the container WORKDIR /app -# Update package lists RUN apt-get update -y - -# Install necessary libraries for PyQt5 and OpenGL RUN apt-get install -y --no-install-recommends \ libgl1-mesa-glx \ libglib2.0-0 \ @@ -18,17 +14,12 @@ RUN apt-get install -y --no-install-recommends \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -# Copy the requirements file into the container at /app -COPY requirements.txt. +COPY requirements.txt . -# Install the dependencies specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt -# Make port 80 available to the world outside this container EXPOSE 80 -# Define environment variable ENV NAME World -# Run app.py when the container launches CMD ["python", "app.py"] \ No newline at end of file From ac1f8576a28e905493fef2dff516791e20e5703c Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 19:11:02 -0500 Subject: [PATCH 069/124] editing the docker file --- .circleci/config.yml | 5 ++--- Dockerfile | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 006aa24..f0bfd71 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,4 +1,3 @@ -# CircleCI configuration version: 2.1 executors: @@ -15,7 +14,7 @@ jobs: - checkout - run: name: Build Docker image - command: docker build --no-cache -t mgallai/vision_ai:$CIRCLE_SHA1 . + command: docker build -t mgallai/vision_ai:$CIRCLE_SHA1 . - run: name: Push Docker image command: | @@ -30,4 +29,4 @@ workflows: filters: branches: only: - - main \ No newline at end of file + - main diff --git a/Dockerfile b/Dockerfile index 74bd94e..915717f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,13 @@ -# Dockerfile +# Use an official Python runtime as a parent image FROM python:3.9-slim +# Set the working directory in the container WORKDIR /app -RUN apt-get update -y +# Update package lists +RUN apt-get update --fix-missing + +# Install necessary libraries for PyQt5 and OpenGL RUN apt-get install -y --no-install-recommends \ libgl1-mesa-glx \ libglib2.0-0 \ @@ -14,12 +18,20 @@ RUN apt-get install -y --no-install-recommends \ apt-get clean && \ rm -rf /var/lib/apt/lists/* +# Copy the requirements file into the container at /app COPY requirements.txt . +# Install the dependencies specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt +# Copy the rest of the application code +COPY . . + +# Make port 80 available to the world outside this container EXPOSE 80 +# Define environment variable ENV NAME World -CMD ["python", "app.py"] \ No newline at end of file +# Run app.py when the container launches +CMD ["python", "app.py"] From 785f06cb42f579d5e009968d51ecd5c86e320ab5 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 19:19:03 -0500 Subject: [PATCH 070/124] editing the docker file --- Dockerfile | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 915717f..f5be0f9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,11 +4,9 @@ FROM python:3.9-slim # Set the working directory in the container WORKDIR /app -# Update package lists -RUN apt-get update --fix-missing - -# Install necessary libraries for PyQt5 and OpenGL -RUN apt-get install -y --no-install-recommends \ +# Install necessary libraries for PyQt5 and OpenGL in a single RUN command +RUN apt-get update --fix-missing && \ + apt-get install -y --no-install-recommends \ libgl1-mesa-glx \ libglib2.0-0 \ libxkbcommon-x11-0 \ @@ -18,7 +16,7 @@ RUN apt-get install -y --no-install-recommends \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -# Copy the requirements file into the container at /app +# Copy the requirements file first to leverage Docker cache COPY requirements.txt . # Install the dependencies specified in requirements.txt From cadf05c36a9a8081b6809c6db7cba013914eb787 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 19:21:56 -0500 Subject: [PATCH 071/124] editing the docker file --- Dockerfile | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/Dockerfile b/Dockerfile index f5be0f9..cf2276d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,35 +1,25 @@ -# Use an official Python runtime as a parent image +# Dockerfile FROM python:3.9-slim -# Set the working directory in the container WORKDIR /app -# Install necessary libraries for PyQt5 and OpenGL in a single RUN command -RUN apt-get update --fix-missing && \ - apt-get install -y --no-install-recommends \ +RUN apt-get update -y +RUN apt-get install -y --no-install-recommends \ libgl1-mesa-glx \ libglib2.0-0 \ libxkbcommon-x11-0 \ libx11-xcb1 \ libxcb-glx0 \ - libxcb-keysyms1 && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* + libxcb-keysyms1 +RUN apt-get clean +RUN rm -rf /var/lib/apt/lists/* -# Copy the requirements file first to leverage Docker cache COPY requirements.txt . -# Install the dependencies specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt -# Copy the rest of the application code -COPY . . - -# Make port 80 available to the world outside this container EXPOSE 80 -# Define environment variable ENV NAME World -# Run app.py when the container launches -CMD ["python", "app.py"] +CMD ["python", "app.py"] \ No newline at end of file From a3e632eee2de655e207a8b853d731e86c783bcce Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 19:23:56 -0500 Subject: [PATCH 072/124] editing the docker file --- Dockerfile | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index cf2276d..ed08a9c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,25 +1,41 @@ -# Dockerfile +# Use an official Python runtime as a parent image FROM python:3.9-slim +# Set the working directory in the container WORKDIR /app -RUN apt-get update -y -RUN apt-get install -y --no-install-recommends \ +# Disable APT post-invoke scripts to avoid errors during update +RUN mv /var/lib/dpkg/info /var/lib/dpkg/info.bak && mkdir /var/lib/dpkg/info + +# Update and install necessary libraries for PyQt5 and OpenGL in a single RUN command +RUN apt-get update --fix-missing && \ + apt-get install -y --no-install-recommends \ libgl1-mesa-glx \ libglib2.0-0 \ libxkbcommon-x11-0 \ libx11-xcb1 \ libxcb-glx0 \ - libxcb-keysyms1 -RUN apt-get clean -RUN rm -rf /var/lib/apt/lists/* + libxcb-keysyms1 && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Restore APT post-invoke scripts +RUN rm -rf /var/lib/dpkg/info && mv /var/lib/dpkg/info.bak /var/lib/dpkg/info +# Copy the requirements file into the container at /app COPY requirements.txt . +# Install the dependencies specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt +# Copy the rest of the application code +COPY . . + +# Make port 80 available to the world outside this container EXPOSE 80 +# Define environment variable ENV NAME World -CMD ["python", "app.py"] \ No newline at end of file +# Run app.py when the container launches +CMD ["python", "app.py"] From d8af26349e4229071cf1c274d07b52ab020f4382 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 19:29:22 -0500 Subject: [PATCH 073/124] editing the docker file --- Dockerfile | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index ed08a9c..cc345fd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,11 +4,8 @@ FROM python:3.9-slim # Set the working directory in the container WORKDIR /app -# Disable APT post-invoke scripts to avoid errors during update -RUN mv /var/lib/dpkg/info /var/lib/dpkg/info.bak && mkdir /var/lib/dpkg/info - -# Update and install necessary libraries for PyQt5 and OpenGL in a single RUN command -RUN apt-get update --fix-missing && \ +# Update and install necessary libraries for PyQt5 and OpenGL in one RUN command +RUN apt-get update && \ apt-get install -y --no-install-recommends \ libgl1-mesa-glx \ libglib2.0-0 \ @@ -16,12 +13,8 @@ RUN apt-get update --fix-missing && \ libx11-xcb1 \ libxcb-glx0 \ libxcb-keysyms1 && \ - apt-get clean && \ rm -rf /var/lib/apt/lists/* -# Restore APT post-invoke scripts -RUN rm -rf /var/lib/dpkg/info && mv /var/lib/dpkg/info.bak /var/lib/dpkg/info - # Copy the requirements file into the container at /app COPY requirements.txt . From 8236be6dee8ea01175138aee416f17bcf6875259 Mon Sep 17 00:00:00 2001 From: Jagruth Reddy <56351734+jagruthreddy@users.noreply.github.com> Date: Mon, 17 Jun 2024 21:17:58 -0500 Subject: [PATCH 074/124] Minor --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f0bfd71..bdc6433 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -14,12 +14,12 @@ jobs: - checkout - run: name: Build Docker image - command: docker build -t mgallai/vision_ai:$CIRCLE_SHA1 . + command: docker build -t mgallai/vision_ai:v1 . - run: name: Push Docker image command: | echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin - docker push mgallai/vision_ai:$CIRCLE_SHA1 + docker push mgallai/vision_ai:v1 workflows: version: 2 From 54219d934a1b8fdf1a3a252c8cb4688769dad3f6 Mon Sep 17 00:00:00 2001 From: Jagruth Reddy <56351734+jagruthreddy@users.noreply.github.com> Date: Mon, 17 Jun 2024 21:32:45 -0500 Subject: [PATCH 075/124] Update Dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index cc345fd..847e972 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM python:3.9-slim # Set the working directory in the container -WORKDIR /app +WORKDIR /VisionAI # Update and install necessary libraries for PyQt5 and OpenGL in one RUN command RUN apt-get update && \ From 43be8ad6d62b78e9010944d25e080a9372abe08f Mon Sep 17 00:00:00 2001 From: jagruthh Date: Mon, 17 Jun 2024 21:34:45 -0500 Subject: [PATCH 076/124] Major --- tests/__pycache__/__init__.cpython-311.pyc | Bin 293 -> 0 bytes .../test_AI_NumberOfOutputs.cpython-311.pyc | Bin 3559 -> 0 bytes .../test_AI_PredictedCity.cpython-311.pyc | Bin 3364 -> 0 bytes .../test_AI_Preprocessing.cpython-311.pyc | Bin 3842 -> 0 bytes .../test_ButtonPanel.cpython-311.pyc | Bin 3074 -> 0 bytes .../__pycache__/test_IconsExist.cpython-311.pyc | Bin 1924 -> 0 bytes .../__pycache__/test_ImageCount.cpython-311.pyc | Bin 4640 -> 0 bytes .../test_InformationDialog.cpython-311.pyc | Bin 6032 -> 0 bytes .../test_Manual.cpython-311-pytest-8.2.2.pyc | Bin 6211 -> 0 bytes tests/__pycache__/test_Manual.cpython-311.pyc | Bin 3332 -> 0 bytes .../__pycache__/test_ModelExist.cpython-311.pyc | Bin 1405 -> 0 bytes .../test_SelectMethod.cpython-311.pyc | Bin 4724 -> 0 bytes tests/__pycache__/test_WebDemo.cpython-311.pyc | Bin 2823 -> 0 bytes .../test_sort_button.cpython-311.pyc | Bin 6743 -> 0 bytes view/__pycache__/ButtonPanel.cpython-311.pyc | Bin 8230 -> 0 bytes view/__pycache__/ButtonStyle.cpython-311.pyc | Bin 1074 -> 0 bytes .../CloseConfirmationDialog.cpython-311.pyc | Bin 2895 -> 0 bytes .../DeleteConfirmationDialog.cpython-311.pyc | Bin 2901 -> 0 bytes view/__pycache__/FolderList.cpython-311.pyc | Bin 11237 -> 0 bytes view/__pycache__/FrameSettings.cpython-311.pyc | Bin 1944 -> 0 bytes view/__pycache__/HistoryManager.cpython-311.pyc | Bin 4245 -> 0 bytes view/__pycache__/ImageDisplay.cpython-311.pyc | Bin 4894 -> 0 bytes .../InformationDialog.cpython-311.pyc | Bin 4181 -> 0 bytes .../InitialFolderSelection.cpython-311.pyc | Bin 3040 -> 0 bytes view/__pycache__/MainView.cpython-311.pyc | Bin 7889 -> 0 bytes view/__pycache__/SelectMethod.cpython-311.pyc | Bin 4671 -> 0 bytes view/__pycache__/__init__.cpython-311.pyc | Bin 292 -> 0 bytes 27 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/__pycache__/__init__.cpython-311.pyc delete mode 100644 tests/__pycache__/test_AI_NumberOfOutputs.cpython-311.pyc delete mode 100644 tests/__pycache__/test_AI_PredictedCity.cpython-311.pyc delete mode 100644 tests/__pycache__/test_AI_Preprocessing.cpython-311.pyc delete mode 100644 tests/__pycache__/test_ButtonPanel.cpython-311.pyc delete mode 100644 tests/__pycache__/test_IconsExist.cpython-311.pyc delete mode 100644 tests/__pycache__/test_ImageCount.cpython-311.pyc delete mode 100644 tests/__pycache__/test_InformationDialog.cpython-311.pyc delete mode 100644 tests/__pycache__/test_Manual.cpython-311-pytest-8.2.2.pyc delete mode 100644 tests/__pycache__/test_Manual.cpython-311.pyc delete mode 100644 tests/__pycache__/test_ModelExist.cpython-311.pyc delete mode 100644 tests/__pycache__/test_SelectMethod.cpython-311.pyc delete mode 100644 tests/__pycache__/test_WebDemo.cpython-311.pyc delete mode 100644 tests/__pycache__/test_sort_button.cpython-311.pyc delete mode 100644 view/__pycache__/ButtonPanel.cpython-311.pyc delete mode 100644 view/__pycache__/ButtonStyle.cpython-311.pyc delete mode 100644 view/__pycache__/CloseConfirmationDialog.cpython-311.pyc delete mode 100644 view/__pycache__/DeleteConfirmationDialog.cpython-311.pyc delete mode 100644 view/__pycache__/FolderList.cpython-311.pyc delete mode 100644 view/__pycache__/FrameSettings.cpython-311.pyc delete mode 100644 view/__pycache__/HistoryManager.cpython-311.pyc delete mode 100644 view/__pycache__/ImageDisplay.cpython-311.pyc delete mode 100644 view/__pycache__/InformationDialog.cpython-311.pyc delete mode 100644 view/__pycache__/InitialFolderSelection.cpython-311.pyc delete mode 100644 view/__pycache__/MainView.cpython-311.pyc delete mode 100644 view/__pycache__/SelectMethod.cpython-311.pyc delete mode 100644 view/__pycache__/__init__.cpython-311.pyc diff --git a/tests/__pycache__/__init__.cpython-311.pyc b/tests/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 9a29fd5c7d73de852c493417905908c5fcd46ca0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 293 zcmX|6O-jQ+6rQmtA{4JMTNf!(#D$0u3`ihqA+2=rAjI~Cj!tI6n@J=W@CqJ5yg~2d z1q$7Dc)ag>I6Pw>pL0`Pd;JYz5B_hqC*FLqCCk|bfBIo`iA=usr535~(7GD66LITShNSBuLHq7Z19>)s zysc{_F}@sM!Gxq<$VQxyK1xE7V28>y;RZ}sC?;gyaN$6e&Yu>Y|414QFEU7+ pLYP`83aO)Ez6ee*s9~iEd!)&T4R6rG)bNUF8ZnZ^o?H)`M~&WMU#^eMW5$7Ef3BZHJi3T9X&q@D z7%dI7_zEBe-k{}D_$4iVlSw7LJc6BrP1-h0zHBZK@aAUOo9_IcVyDuapSV0;Dj9k~ zb#%*wbtGFGZrrWdBmPO0qJ zg_hYt7&QicpZtu! zkMo6sVcS%I{PbVv&*bNAOziyR=tb2qR6UcO8@-er&rh3pg6PY*HIYZ|VH)dAM>GTaE9nZKgbVLY3sSerp*uOTy~RX=WHXTEga zP;I+%WPf{ScDE!!dHW>*Yv{Yam+#n{@7Mc|d40!f!UwS$JWqgx_V>?qplqOa|7hHO zevda={&OOfSJ0|xsfFKjBILicF!hw9@!PGNx}&RxvS1k+Cg4;^Nyv|`u#hG(y6Cc5 zR4c`1Sc`yI2s}*s=#B_ey>j@c408ZB+Q$K`p+_nCf#9ab>Zvg=HC7Wp=zKJszI*ik z8};E+-teiK=t)B^>!cqJgbYQm#{&6X2-UEm+SPBLw*@tv+08z;xGLIenFaW^nj^KQ zXsKo3Eh>9Yt8z=!O00#Au5sRIQwzv1#;S?H#sBZP)k2+VL7+>7x39P^H+I| z*C3s2i(m_QgLX^!zt}oa%GuZ;8&q<_!_jqE(S`gCO6nDI9{E z?^}JG;oY-U@wuDDG-(@rzgs0}U4eAkF;zJX|~uiMTUnb2sc zbh0d>(>h>R;%s~~vsAiKk?9v8GsOPqD~TC`HN8M<$r<^38c~&3X@)Ab(6YT~l?_c^ zRF|=QN``NbrZGF6Bs4AvEnR+Z^Rv}-0(s3Mkf9(oVdBh@GWK~3QgTUk7X7GhQ$756 zk?N!{TnrAGY7zUAqEMou_~MeKn|^nJ<~My|Rbd+VkrE_V$L|a{zw_I&YWRYI&2)qe z(OYz?x}ux5qnZVfU>As9aui_hC#ih`CV|NKu6j1LpiEnkJ6>jcA?pTJ^Z6=Pd5fBK zpQQZL$7u4ke*^#-I5l{?fAi3m_UTRUwe$7VgqNDAbvC5LUy^@L-r+Z6pLBoRz4bfq z^(YuRt+>+4f1@Zh_|er3`oo|X5hrbffEms^?`HVz`0r+1a@@0-Ravo0MP5wh$oG>(g@@IjWqaB8oYDhcJ6Pl zY`${$h&wu0m*zcb-fi~1$&*$GmON=@*nkh`H!SE0{k=MbbM6zz+h7_OAarKt%b-=^fMp z(t*eoZU?o&5!g((_S3WdZD#`n!v?pY7ocht;a^Zu(g%I13{{l|sGpo!z3jY|x$Iok zwHw&6**_DZ>59noRKzS7;rD_!OTI9Zy+lMxIYKE>_?g0{=Ev0QHvMeLYm{`9f>$ZM zYgxxD8T$Kq1tvk+?q#_4pU`I&ykMCQu?z!~%y^dN5nrN?Jg-8|VD>vnd5Tm6a*E2J zg_oK4sr2)}NoUCf;AjZhLjZRKj^i3AxyGIbI_8FZ1I5?a(?A_->}jArx7izLzzz4u zNLZKtl>B4zulz@`jpT>PE&kKk=ZSwL?!J5f>OYk)l&`MUM=yAz7rqwj@}wtE)_bPB zo~b&T_RzG8rXQoDZn!tlh#T$=bl45|9Z}}MpL@aWYu<3?2TJ(QE_H%KVxm@gC>(T! bgAK8F?N{rQf0$mMUSrRWfW#pnFx&kP-dsP+ diff --git a/tests/__pycache__/test_AI_PredictedCity.cpython-311.pyc b/tests/__pycache__/test_AI_PredictedCity.cpython-311.pyc deleted file mode 100644 index 882700a26d22d0d13422ece024cc72f9398a5100..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3364 zcmZ`5?`s=JcJ_y)wQO0oYrBq9x7!e!D2sSP=->CI&GCi)67EEuko8MIpdR zS&7r+tjzmJHVVCD#fnN+5eStEZAqlYcWZCZ?x`H&=xt-eeHTYxn9?41aU|Nv5|GsWTTus}p|ju^@oF?uK| zjCABmunT-a$&S)zjrcXbD;pFEaE`TUJ21G@o)C~NEb%YZ`wL>{Q-a@jVY*bZ%)IWI zjt%ojrl?<`kHmBuChue(H0ps%)Cd98PnUycZ?2O zp(*ft_%`3y3(>sxnSfI0jJsV?AzH_n23aDvh53}s5amnmhU?2ZyRzm>dZ~0<@TI)v zy10S*=wCCh=ayZ{+}zycIo+~!Go86Oc|J3pTd?UYGuLQmpiZji&C46Qt!C^sP^U<3 zPn})`J2FrvH%r}Xo>R&#onOu^trm-vsjt5B>Qru#nRebRSyXja)Fo%dTh|#?XXzTX zoD#~&UA#)wMdlR1Ejdf~K(x9BCjwXI-ZQbA&g2m5a;QCS#&l`JkGs@cF3niF>y}@5 zlC9JG3^7GL1x7?f88$-vNL&vMqN3kl@hd?4v_RVFWY?H8W4B@VLz!M$c zc@dNqlnNT{eUq5w3c9{OM*H1~&I3fK76LRJ|wFN2eO2Q_az-s{B#!{fX4qNAJGen0T!@ z@mf`GD&uwD7_RCv6P|~M@DHG9x0%AqhsU9ChQQv>IyVFlRoyEExjm|d4BEyK;)QZw zw`p&PPmzOXJy0s5AsC_|?ZAF_I(y!bDx{_yUKA9m`q`#3{Vt2L` zNJV(^Yw-B`8?uKnyjP4!Mds4L^82|Qq>)<4Hf?S~Dsn|Ablw9aimQ#-Eole*x1W_U zk3;%W<{6s3+{>?~iK*2s$9eyobfI*mtYT=X9HFk5aMKNkx~lDXD!p#H-s@_4pp*F2 zJR}Ri4CAdYwbLQTs>jO5kEv#`(zI0%I4oF?iGyA*L3*GDGMdy)r}`PXgyAdU54P`# zVKU%y*oH4Ukn>8qch!#p($K$3DHZt$m{X^Zmw1x;c`r#_x|mck|d6CqF+~E8m;?ZsPmC#`tn`e7Tz3jgp?k zUy~muZ;3Z!U-W<8U;ATY>~wSNbp1@Rp1X$dOtGQZO~tM&HgJ!=_@9weKaQNbmu!r@ z)f{=N8vj{I)cYrE;{c#Flyp-`*Ohc2Iq_lQ<3jD_=8-eIguHQ1tiPKJ24VPske+wM zUpWLkjKlC?3c?J_QxN`9ZA19~o`*2QOOO&+5;`^jAe~Ci$r^Sv`l9pJhI!V3=WaK$yift>_r5JmmT`?GLNEwMPk}C`j4t89dZs1d|9( z0k}=LI35`cRp9_n@0tKMJGB)V*cF9HYL@_bAd%?c)&~J1Dn?H4k`7P?B51o1JPORn zI*ea=G)FEG4g?9;K&`&OIT=0IIzTjOljVsi1`5yyU=_!XhH;m7pLF5V4x1W77_7m=P=GwFI7f8E}LLGbVm za$NWaZto4uJGRFh%c3kjo#BbWSI~_!I^1w>zgJMEj2f^h+yfskZr(@A8-bJFWN!lw z1IRrLa90upp+%CLytc^kdUtD)_$IF{(zD5HiwxD$ZJSo}1$ zo%|$O6Tggo)%TCSuiw3U>09j^?Ys9IlV_WgXTO&l>ReNuYYfac2j&}Op-C3%WZ@@r zwBFrX#juPaUgKx{U6ST6%_yg diff --git a/tests/__pycache__/test_AI_Preprocessing.cpython-311.pyc b/tests/__pycache__/test_AI_Preprocessing.cpython-311.pyc deleted file mode 100644 index 8effd0f1aad01a27d15c3d50440026dd42103837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3842 zcma)8O>7&-6`tMYl1oY=tsl3wWy*~0wq|S5vLri=;Xm4nWhSz$AG=j)rrQm7L@!P5 zva?IaBqT%)1XL&t)CdB|0RmJA0>^=UFaihlp$A$_RX&O zvyO{qX7|mTd2imldGqGm{j#eogrKDVuFW465c)UmG>RjE&hvQ&p;aU!nJJ*O+cIeu z`fPzK`qDne9plryqvKEeq2&sJqL3CCg#Gzo!{l1SW@Er&BdGLi!r<-42nIj{z=Thcwa zR~D{2)=4*uK(ntQy9>-nOR2ORnk82ftOjJ{(NH|%E3u}&g2;H-gC@@S7PJL<-J-o z0^T*ey|e&+1YXri2W4Rv#e;V5Wvm;?)D*!bqGhqJD{3y=JRI1M4_+G1=ck;_$;<*0 zfpd$|3^bzY$9j(oG@HjNBUp}`tp3D+^T(zTZJkHq>+7%tS2%*15 zcv#S8CFLu|=CTD{r!K}`{OjED%oQCIJ#%qzTq+bKC6T&3IFU+bE~$8oC^vAEi4Ddk zl=mx=8cV4+z<3d>Ml4x2u4zOuDw#2?UpKT;W_IFAX0}``ViFr38XnC|5k<`^r2>v= z^RZcN-uOTwI5viF;DT17HZqs5;n)<>@;GZ`3X-#p8{mN*}E{Wb#2$$ zZ8w!YR%u>3#d{qVIin4_^3*S7yTaJI~E`oEonRds_&lM>up$GYko``BeY%M!EUGA^&or~&gg#goapBZ zP%tvN{S>seX^wCI2S}VH)S^Rjz##NgJF`tMi+dYsNZ>a5q??Lfjb4=0GC*A=R%&84 zmSYkjQssE4x-UtY*gVmSu`C4?WxnF#Xsn0bdw%n^jA;pGc~#6>T4FZNH=&l@hiC^94;ZMurL9m>r}p zI9}O&Sy7GO5c-LRsaRL4*ydeP&;S#9Nz<|2fp3<;oG2?r9lp1Ky9S}x!w!4*LFhfR zgIS1yD3P3QhZMC`Hbhk_f)5mF;S*->f~{j>fChv^lnO-+z9;xk5V?53_UX7VZwHH7 z_PR)+%oZFL@X!t_#hg3I=76<(z$*v`mLZ4@!44^FfT7liP9Y=a7DE4e>>lce*g7F_ zsrrl8A^Q*YXe#I>0Es2^y?}Q9^pn);xzGEAG$G#ztsEF>wGQxwkho1iXPsK zzO@m3>+u_pr`MTU^sE&<3*&U^AIw9i)~C(rcr7|^MaN&2YjTI=gdPNb>yqP^6~G{G8_DD&W^2-5bonzoCbG-Dk?(^dZh$WpUz@jL1)%g5^o z$TJT4yO*!J0|N4QEL|}>1|QEop84n8`iHcd=YLl_IcJ@mGf({9s&$_uJPzyBS%&YeBOuLX8w1X$y8-GujZINfR8a&> z63VJ#(3@oQYPnddIJ>tw_+N3ch}CqP(<{2&)lf{(3-3hA_R;@K+pnk;FYJKyzU~b8 z@|vOo0xHA-7Fcdxal+q~)c~2aLIIORGUfi53iO=MNnpW=>oMw}kGe;W1KSGw3*m%& zjHk%EAfWlBzW`F_7>3zGktL^Yp&qmGY@wZ|_t`?hC8uto(2`TP&|cH~z%62Y%feqG zA4P66w}(G@bM^Gcr`LwRc=O8>pPzWhJ_`IJ@^xfgs12p8q13mdwf$4p{;68;wADLZ zLo*hdG11IZw8!*5b>A-;IGrDoI|r@ZzkWsq-?gMO4DxlZR5!R?Cbw(L*S&OM`Qo21 REnix4YMn#A-5_vc^ItOgerx~$ diff --git a/tests/__pycache__/test_ButtonPanel.cpython-311.pyc b/tests/__pycache__/test_ButtonPanel.cpython-311.pyc deleted file mode 100644 index 3c9922c52af798f215d4aecc150db02d40bc717f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3074 zcma)8U1%Fu7QXW*DgM)sH%gri^+1Xnb+ITVDNA-?)xFVn9 zi$YG|{P$u`WO^wlVR1RqF|i%(aNSQVb&ZI1YdU;rL}wixC3}WOuoyyW5ODtvtosYN z{iX>!JjihSEvyYoEGp3$C=TWZImDwgNRu{^7QtwFD3~vRHMsqji{peA{eW2~Nglz- zWJk9H%oiO2fo*P%-I>@=^zBTB_XaLZluCwPP#xVez5WaHmSwzCb{xxG=d;-i=k-mi zx_MbQHEXpHm;$B~&a*c`sDs-ar=c8=1&!N8VaHG+eiP*+O#m9vM4(YknnRh07oW$r zHls>c2D7C# zug}KL#nLH5we9tTzsYcRSJw~W+6RDC(SK7fe`4Rg-b@{FQ%7pT&1en!Gf<)46?qRd zb<|xEjeE%N$$wC>3R({M-FiWVg4)pvWrUgM90lEwZt9M%8p@(&XqaRKB7s9MvdVDi z4JVqaRrEA1eKD2D%sq%$vZ}Q3Y+ob8qV%bT~;H9Lx@2+HJ$>+I}irc$UU# z{0_|8-3I8!!4mir-PhKS0e}Ef_L5aLGvY$I!)=k*~l=-6Ur&99L zi;!aF#TZ356+>OK$`08NR=tQXc>Mq@Oq_Q=EUShm7}(74BuxiIUre-VS!LNTMw$Y( z8=~)C*8#cfW52CV?{ULm%6=P26}3|7C#mtrsqy=on?31fPd8I%+|-#`v=tk85_{=! z?4?hJ?_B=Jp}U8+KWx0FHe(BJY@yM){5l4J1B>*KV0HW_fU}OSp$)zp(iLty04~(-ViHd@9KwrY)BzANKV(m6Fyu>y25Wq0*75pMGE`o z(9KH~>BdY&>U~&-S8(Gv*zI{_0)D%Yy6f=&vm0JhSb`PatMGG(Q2UuaPa>*$4SQ0- zDw~cM(H&fzfaj{NUBiyo2m7LFJE~d01pX)ht+2CWQzO4;0>180;UF~?VQ6Iv@-o$O zx+hX|i39bat)V+B&BU0S7;CVrl|0Z$9=;!WH2C@8gZRUEu9DN6$4AQ*L6ak(m0m6;IcO*vB!GiFq+aG1Veg6t7QFik4P3C_kVm z^kaXa=`YZurHJ92(+J&82@RW!QbH5_05NlZ_UK1OD503OuL7wCy(J~uJSSz^2*}R@ ziX=C$_%9;7bgYd6662);q^yg^_DKiYXfN?SQ-3s+BK*84N+#vS%5b944aSR~U%TKO z%U*CUGu+thkANYD&=q>T1-}L*)mb8ARE(+%HkCYa+0sofs_BGgff`@bS#AbbbiA6S zze$&X@lUE4-P=y7uuHP=U!#^px)_oLb~iiEV}JH@{1*8WDCl-$KLyejIF4(fc$M`Q zI@aiQwNPJ`^%mM!W&H;vY{vc;|7-jfe>+-_Z^gIyPowt+{xxv_y@!_{DW5A}zuz1` z?T(-RUTn(Kt~}jL%(#h}CYp88Yy-{yfL>{YueO-xAklltttB`8>d#d1%dYlyBo5Tp f9}6Q5VWcG{tAE*?zA?KwTV=g1An_n5Sor?~`Es_+ diff --git a/tests/__pycache__/test_IconsExist.cpython-311.pyc b/tests/__pycache__/test_IconsExist.cpython-311.pyc deleted file mode 100644 index 466809ab2dbd17fb90a591585b935d48b170bf3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1924 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 YxcKhEm0w(4xLPFFx(6|bfIzhHAA;cp2mk;8 diff --git a/tests/__pycache__/test_InformationDialog.cpython-311.pyc b/tests/__pycache__/test_InformationDialog.cpython-311.pyc deleted file mode 100644 index 08983a0adf02bd6293f6297735a902ae5c336776..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6032 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 E4@EQOO8@`> diff --git a/tests/__pycache__/test_Manual.cpython-311.pyc b/tests/__pycache__/test_Manual.cpython-311.pyc deleted file mode 100644 index e485c8923e26010b4130bfb3439e674ad86e23a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3332 zcmbVNUu@gP89!1di4yH9mSx9|T7kX zxksQ$BGJsL)8A3zNPS&%k2>y?`#m6kQ2zIkf1ik&)H<`BgpO{4YzlSB+zLxInJE?^ zcDegNEs$fVW07suPF68<{-2Kjn+je{GafsO(;+W9JE2IbvFOESGm4Hb$qM%P*_ooX zbg_uBp%XzkBjF{|hi~I~0}~>0Mbe9sn)mlV*q3+}gvkH&Ez;ftxN%PaN=&tBbRbVU znQ1*`>!{3@Sef16$$C}}(SDIFhf1Ld@JVkOmSDAc_l8m#%HiKd?i1dF2A=_UkIB(; zxWtyiR8KilioEHQqowF8_Tyf*AC5MZfL5JlPL6GY5+}mC#D9^E zv7iK&!*$6L*J>dK9OB0g^Kk?D#EOTw<#;JxZ8~Rt7a|#cK~F~$m&2V+qeDn*wS1W` z@l`+apRWk0Qe2J`I}mTS+J~Hy;O7BFl3$1qqE+Iv7mIKAmWZlHgvDM4pEAUEK5EKs zrM7C@i|fImor6`rMH^Nt#a^B<@QLU8WWM#zSa{A`ZrH6=hDP)pNVi?}B8nz0B5Nb= z_dgg~E-W6TgNoF?TG=6`uWd{Jq=_3z=5#%HRi*s!Gbx)b+v4 z)P>wN9Zi_ZDrykIppa4K*Ckz;(pQm%HKb$VLJ=<+rh?aV6UbV@MjEK{d8MEt!B`OHj0Ly`Dxi9{0-h2Iw3w0xqi@Q02yqWAk^udrqs+9XyVmgeoV}Zz z115cXh`~b^Hq)%f4h?%u!J;`z5KQ`DJd2O2#DRH3D~xUY=>NS&UBg>MqeW3#0rtqP zpgz9+_wmQfUnc)H*_bkuM8u1XQ}dv7(xmyo3u`N~VtVm4;!Y%DbO)O>TX}r3KyZk} zRRyhiF-ev`QshO1O==S_Y9V}`iqhxYOwp;{SGvKAkqu>EwHNVSVtH}RC|YP-Rq`ud zY(dfG@g+r-P3jDjrUNgYK@0fcQEE3iIu*fMfgZI((G^UdF_8=icnovhL|K`y=g8Hnv3sj@15`BU~`x#p^B_Ol3=ZXZ+nh!-~46n7rC#$@ARK>`_DK%XWgE& zHtgE#e4|=&I?veWCcioEoV#HsZ&s#j-2?l836J^BXYm@B+~xXrxc+VR;YT*t?{M$C z-21j)_d1SOF4sD~SIs&d?-B~WwhL1`Fy+8*7k1mQyViTMsye-=DG9rG;lK_YsJ{E? z0~-!FaKeQXHk^3Up8DCxcR#L7)_PBEpQucdmEU$A`~3Wu=PQ{#*jc%>d2MUbfqgFQ zvteKDU?$_h0T&JsMNg7_+ZiXBc9Usxc$nCQM|a@S?YIL^y6~h8Pd@1;_y5hDoqo@G zbHsgf#OWS&yGJY6i1J-HxB~~jUI`HX%{1wqky|baf$V|<7hSk$!^J(mf0sYC!=HM1 z)aFk){CSr@|47{7Gj_f1rA}0jJE_6Sl^Wl(%fG(EzwYn@E>Dja)IFH0TykM*E4SPA z_D^20OT#KI*ZCMbg2#MPRm0 z;o!B+tk2?eL$i3?Fi`;dM13lVHOr4gKjQqz@S+sEsxlu$E*B`ejf3!jKCmNFp@4MR zi<02*Q6H7&EuTXU;F{?AE#; z0Sw&aewz3+vBiEFy_fhRQDuJ}{VMUR#6$K^(LX2tka)~F!&C0?lp|brh0D&7Y4^yq z12Qhi*dS8_Z`iGM9}3JIvk#iu2?oHn&o*{Ky>_UVz_T*BIlYzIx?>*^8W0XJvL6EQ J7!mS~^&j~AIKcn_ diff --git a/tests/__pycache__/test_ModelExist.cpython-311.pyc b/tests/__pycache__/test_ModelExist.cpython-311.pyc deleted file mode 100644 index 6fb7a1cced916331bdb828896ba37fb19ad8bfbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1405 zcmZ`(Pj3@P6rcU$WHFADP*O;RsyS8o;0;2YP=yp>1Sw8} zrlyhz=*c=OKUEO=U%reealAOHz@mj*Mn9Mf-36BsI4K?fjOk2 zMs!!-jI?}KMSvW6MQwm|MnI&1_d+x?i8pe0r4;L60kK7NbQVMl{1g=z6;)T+MMce3 z3n-(7=`|9FW#$s^#v>Yt(#S>{PQa8=9bJIk77}vrm?|-DKfc9CC#8_K$J7RFC&oWk zzTih6;ZMpP#Z_F@)!Lx##E8eLI6X$W`i}Y%y;46uM?pJi|3nmH{1?uj93#f7olm^F zi8kD~6WH(&ux*L8?NF~U>W7IMr@jc2P7n|-)_9$S z6Eu(zsHq+huN)?W5~np`g9|S65Xe$ujNkuz{i<~r%mQmUd(-hehnh=k+5FO?wd#`` zr&}am;4IG5d)tnWm;5cbRF(JwFV@8d<5X;0ITCCNR?9Z8d$-|j5&nH`{XQ|(c zug|`I_|NIyOs+qZ+e;i8Q{A+=Uk3(H&sgXi3teO3z(_rv{$=`=`upS`=@;q!dhdL; ze?Hq?_@QUq?i;teqvr@tL@OCx7EcxtikGx)Xo7lF$dqkAs5{!Dl6t z%^oqi2rdF^#$%xBiM%pEpXWm-(oCLQb*OLKnTgP-`&7uxaM|ghA#--!fj*E(E`JfB zF2Veqe2)WpZ+t%t`5M0f3i%xe9N0ip6y*R-H=}WYPBo)3&=ZOb?eqNC_5R#U diff --git a/tests/__pycache__/test_SelectMethod.cpython-311.pyc b/tests/__pycache__/test_SelectMethod.cpython-311.pyc deleted file mode 100644 index 7cb42ecb08e8c15fd044fb1bebceb6633c7aa8bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4724 zcmcInTWr+W89tut$!!y0VaE%*b%CnPQbH0Eu_P(kz)%|{Lg*n{m! z$dpRiDpFB}R8&=h2OgrTVukhvA*AlZuC$fbOa}9zWQg@~YB(8Y{5XkaoCC?#vQd{=?_h5U$>AoRF3(`C;o<0h zBS%kLj(47bCttu*EmGi#58Cili+9vJ#{3GZz4^XmABTMCB9cPuND9j+x2G}R57OYN zmgHV}pM;l~bYqVX0q48*u_sXZqTWCtn@g}K+VL&zor-d9$5nAr$z0VlOHseuJv&(_ zs7gk(6kT&evsc7o+PhgsbTS(P)^RoTkwQl_B+Ds?Ykjzi-i zSd-)=l=R7diCafrdy)akw~mrQ$qzIn1%QU7AW$rY5-1vW`{rcR@@Q(r6ok_V(C1}8 z(_}S`Eh2A>@1k^LR6+^#l$(nBi~!7Y{bHd24*4^xX;L2H)!)vKrmmZ^VWzI0xG1Ws zsPxC@PF#skrlvJHW+=;YqavITt|;@Xq9(+(Ww13bYnCusgrFFTwVH~_=8~lsQi&_q zQ;A|eFB`(pz|e4N#!$43Qcz_EO;F_HPf;ZDQ^RvWEV<_rphq zv-dFBd-$IJe)t|-FJS;>8i9kx4}@HLL&y!f-5}^;c)1}-5mkNhDdz@ESzV|G-gt)& z1(|iF1MRJ*EH#7wb>Q&Euyf!TIdJS=;C|OVxQsp+_83gRM)r+-43&rIF3Q2XS~i*; zt9S1BLg{Wypt|XMfy)hMR2@E!eNb;U8(Xqy#Pk)d#J5;pAEF!BJOpG7ZQ}0xT@}oi zG4J4m1Ru2PcdHLUn8AE_4wU+^0UfOcd~0~LQQw6gHt+6}xSg42SCXkEEyXK&gKn&r z;^mQi|2OS4UM*#ZcK=&x54DJejvbPBCpMC4p~EB8ChAV0jyAkPvv{qx8J@3(@V$Z#mv&8p%*pjL`GM2V^laYG*7QFq1Il> zDwaG}nuzJbs$LXUL_i!%7cw;0D+{ZF1;|mz>XvQ_MN`ohg(_YMlW{>eguJK~0n%0{ zN+TY5!h)_@CrqUzj|zhy7w(KzI~K&eqOOh#=XK50LBm+I$L#_|vSD4g4T21o61!Fu zP10B96ibyMp@R@NxS~i_)(vH4Wie|39$BlZoXEt*Dw@1cK{8!M zo3x@S7T}IjV#k}(@ivM2b<9+o`5CO!8u~ZxuHZ-+M;^WV_+W(}DDwjjKScN;d-$4z z69gx0oY)GXj-F<=Xqk^X{Bgn`ukeFqe$e4h5&qP(goDoze8$FS01;ltKUC(29DbPa z!_P7f9wm6x#-lA7PL}zT4nIivLHpEA2j3$2mW^)#+mC+50lIkP6aJ$L-#po#WQ;wh1=$u_PpEnd38$M60^qJ zOD$=#w}BknQg-2G17%ue@50N5&h~lnP4;#|egB0NQ6iqqZ$Q^EHHL=VYMcM5zwa*rEBvAN_q~q- zkGn`@xDq*Aj-36{`s&wY;s%+>I1!0NBzrMij$|FI5Uki(VY`k>{V~DO3LY%u!DmNb z94AAU92_S&ZsWK|>R=@@R*sB)8T;xo8NW`(Z#t1%By!6Z=gX0K2WJS**!7$3t*K~- zi_>XM%**Mt+nG-1b*ZS*dUrZalYVWai$PAF{Q(-i;IBb{B#a0pKc(a(kf(^rWXaf| zM+Zh|#k>ts@W>Vd@|_=r_N?Eic7(WKl=jvLG!M~cjfD0GRc;G4(f)8y zf}ZxYY7Ny-eawrBmQF|aySNC@Kvy0o-?TH&75M=qVZnNH;9bo2(;{(-qAPONv25M-?w9ETDUq6?vt<`RA?r zdxYt?c3uQ2EMx=JhyXR#7^X_;Uk;1tD?DCZoU=v@`e@=YDc$mO9Jh&j*Vwg*j@aIN z6aCzN{k@4g*4VX)I@j2>iTvyMcfG&ueZV~!`qSx$6Mvl882ZcU&&U5f{>=9x{MX*+ zz29JGAWjD2{}^_T%#b59&c0c)Z`MKA2)bsYYn$jJ+k0;Xq8weP_VmFW^4_uU*x>ig nET3{H(0#8|_Vc!%-wfX*x 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 diff --git a/view/__pycache__/ButtonStyle.cpython-311.pyc b/view/__pycache__/ButtonStyle.cpython-311.pyc deleted file mode 100644 index 4152bf7e1b34471df1f2c342ba84faf029d736a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1074 zcmZuvUr!T35Z}8}B(*i*yU8Z{!ov|n615l;poTO-#1xEaHn}X_ZM$-Jd+zQPiZS7V z_!amD7{fR46ZjEKU;P3l_{5X5cl|>xbJ^M1`OW@jc5c3xN(BV+?W1h|auE7s4?~$5 z7}pq#bL65e#LyXH&V`H6C9F*9h`BYim}?9jb|0eGPvCHlII24g)m@%r&KbG@-=&R8 zr9PA0@7>=>jFC~zbOSy?28E#F%h-O_~{gs zW%d+hBGGpS(8gg)$s}UlAiGgC(lJ#$GLvc28k#f|LAQ)IWdtvwdK~g~RPe1vl-shy z)&K37$~kPuh+<6k1F5`iJS=qcbF)nLHCLLv^|ojbP_b0q^R}z&q8@BQrq4qwImFo$d%=lRkEu@)DUsNv25a+Y?>qJ z1g`K74`ggP$X=V{T_r#9h9LnpK#k#vTF8ie5O!Oyl8)d<ohm!v+5>eu`hMpZ`tE}~s3GbT&2 sv*=`G_GgU~+|0eoYJ06p0Hj%-gVE19j?;JN9blhUSJwCU4j?7|2i5Kj>;M1& diff --git a/view/__pycache__/CloseConfirmationDialog.cpython-311.pyc b/view/__pycache__/CloseConfirmationDialog.cpython-311.pyc deleted file mode 100644 index d6f9bbf8abae61dfa74265859890ba4fa23799c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2895 zcmb_e-A~(A6u-{r36K^#XbZH$KsA~oprB5gU~Nh1XptC&LE9~gWSRH|OdUJ39Uv%` z`cSP*+QVL^GO3gD(6UXu?T?uHXh)WaEKQm;@z6IW_E7a{_d0Pt_>fv@H_pB1%jcZm z{W#aZgu@Mpv~Rysl5c$o{Y@FS`OCz?142AU0umSrrI;9#^29tTZ_JzW#e6A$%+FAr zM+&5Zv7keHB}j#0AqIKS9VGakBEgTDZ7)JQvB1|cwyBEdJ5jri^0+-;GUlqI`y z?!hf(eVWfI8Ql)dP4kObBEs2>wtOq2>xxX6yA_KFV|(Uw(l?fr^LkdoiE<2Qa3dbD zgndSEU=(8n6!Qq)O_XE=&(lzhQ0q+0NAmI6=O!dY!xM^}6x9^3i;7%IY$oBUaZBb3 zQO^gzlm18MIntS`cAJnp6*ga^sR&Vy*(UOxijF}!l&_6YF%^!pbWv5TC?R-`@kuj1 z(gd&I+a}R=DiIl^H&)GZsNU0Kj~=dS1wYZ(z5Upm^X7w9iz=lzSLv0IOV@iR*u8mY zAG&&X6avRs9*;eE#L|OVGM<0yo=)Ume zTU{@;W6pONy@1F$ZUO1X&%8<1`9{Ewv}_{+Jkz-`B9J#lIN1!%Gq`4o)o$OixAQ_hfuq6<2YE zU=$m(klN=uZfL7yLfB3+D@Pe(S6WtOcwAY!RAvp|b#;#)YdU z3|la4z_26iC_snNnKD7PKsG>jgzW`r-|F4cOz5?s*MQ!=mJ3@8W=oIN(z6-ZYd&k7 zyZic**?iAxzPITwLUBX;z%7wmrUrgpv!lm^5Ir z2&c;Vwp9%G&iDQlei7ab@3pb{wqJc_+kn+Ju-QA?%$F1&h6QUMG z4Tut@1s%K4Q-GfQwU=Wi3|TN_z)%s|cA={PUHJwR`Yq@;pntEmEAPt-W^2FI+P@hp zLQBcyRinjTH`$vOd((t*3&sr?CrS(2ccHrg-T6x|`%M_MV9(yP$v=;_w3la6cy_qXrq@L%3XAJD0nU4Ju?M*H+^c256faE=rjS_Cwe zUWwIWQmO~EGT2S7<%FW*Qdw!H+k3F)^UbLoPOiV9QXGol9eh@rfE(&CVJS528R_=D p48s)Bm&W@&Mbv53KSgxesDJi-oeY_dqutihKUDhfF)Am~{{Z44rs4nq diff --git a/view/__pycache__/DeleteConfirmationDialog.cpython-311.pyc b/view/__pycache__/DeleteConfirmationDialog.cpython-311.pyc deleted file mode 100644 index 806cbc010b5bed829690b9d9b2c20f7abc487c37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2901 zcmb_e+e;i*7(cVuZ`DmS(bP+VqlTJ|XyTGW(I(Nvnp&*YYLa$Y7{;BmI%aleJ9E|> z8^}XwEcBr-B^FZHhs3t{)_N0zEr>&Uc&d`+n#0 zo%uN&Za}ns^QD%2?L+7<#*~}CL>%6u#8V_8iBnLDi*YGW%#-rQyeVJIm-5H_9MgG} zKq?puy0lk;R45kWkO$pClJ7B+{FvMEBD72Y#TILj0`n*me8t#^-wDo5$fBYxIgNAo zZfWb&;)a$XPGD|YT*L|$&Ss3|TNy$$l`@}HEFzranIp7sEGp;8hJq8N817Jxc*s-s z3B`d?jFV8zBYC$_l9N1-LorINb1@&y$LF+9Ug`DlIH}UEYo96 z@=CrP8f~`{kwc`hYL-Ryo*sHgxT=->RA2Y@LvPlb3sxqaDwH@*n`I`J-Hf0Wsiu)I%-Kes@nRsd*~xwRh~<`d2Emm1`-#Q#)qS%9%2M>}}s0@cNHh)?o@A!xYE{{zpuKx4?AvoiQEX7oJ>e z*-P!1^&LeoA$rgoW;V|jPdZg~|j8C&i3H1cMc5Czw#=!~-l* zLQ_?opp{-sBygIJI$mKsb630sBH;K8tR$U4TGVM^C!iEB2fyOp4dF%iS`bRoh7D{8 zMUfLywF)T+3A#RpAQ%h?Uu=(F|9*QUe%HXd5&vxPj;JW2JT$d1I6XBU|6Iiry1a@j z1V6}6%ZnSL%1^1Q*dT0H`0)%`)^wR{#3!)vfN1IX{Pf-Ud?uB`Iv>3ny%wL41OKAS?zv(0jM+V77L404 zZo)WK+R(WNy?N-(U3)%i!4(^>m~f>4ZF|t2hwfa11p_t=m@u&4+MV;|B&&76ZXMVP z6`-YP@}kk^uUq_0o4;wnm8pF_G(D8kLqZzFn;RWXI>L2eL)lqO{qMmGt<*BMbMYTV^_!lg}~z=|RW5l(-f ztv36_7}NV{ue1Bm?b!J?uG5ZggYxgd)9Jr-fZn0gFO~hxL>isbvm0~dgP}QEYFHUC zbapRR%So{!u-f1>l`U^;IxZHLX12kHYChuJ+TrH!W|D2$56a5cU4XF+Q diff --git a/view/__pycache__/FolderList.cpython-311.pyc b/view/__pycache__/FolderList.cpython-311.pyc deleted file mode 100644 index 480a21001fa1032710058fff4ae58efccfc62125..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11237 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 diff --git a/view/__pycache__/FrameSettings.cpython-311.pyc b/view/__pycache__/FrameSettings.cpython-311.pyc deleted file mode 100644 index 547f7e1282fe1512a4940ff1be7fc296410f5678..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1944 zcmaJ>&1)M+6rWjrjU~ABm@!*g+NZZxwxmC`evnFYaP?s**Eh(<~MKV zy*ED%4n`5QZyy+?KLmtcaK>%H-sJ34m>eJlDOf{goX42Y1x+Xi@&RWa(1PVqK2#3p z!x#x@5h=l4q=b$E@dW;E%SV*(8p=doayEnQSZem$);a4VqLdF@FCn2E^oUh@$xFulbLpdnRS3^!e0cLDLFqc4>WTd1+4i zLZ=H%-J;$^oD!GShdTvbT++9wX_cvNiE~x!k-=1JM_QofW6P*WYs>efwQ9LcnRx4i zTeqcErs_qtqEXQ(iEBp5+Ac6EF3>Hi85NEptv{mTDl;}|(UP=+1<>Lac%&M-^rgy& zxg}{!rQ4G4X0w$Yo5-@NtClQ38S(2}d6=J-2kdpJQ!qq3B;F>YO)}ab zsTN7q-F^nPsOW_O7!KhC%?9ZKs-aD8;vrD z!1-FR@T@PMgcpGi!LvMHk1oWee|M*dgq8J7+^G;dQt7=51d7Oc8CVFA?C^b6SB!1O zgW{BtJq!j=0>&Lx(>^H_A8#>kwftbA1MUlP1 z1#uux-u9<6ta5AFsop=q1~NK1^4(-RInhi`G?M97GQAh+kVH4Fe;hr0@7MQ#d+Ya9 z}OxMYDPde5lW8ZH#NV-MRb&`Ibcys^j zc4EAl7;hx5wh~uQQE*`T@6^N(Q-@P~3;TCF@uB^@?f7^zK7MrV*<>T0ZN;;7w?9vf z9Zt4WH=C)Oja0Uk%JL<9@UbEAe!eJVpVmrrJE&=Z|?%wxxcT-O!ufCvvE-Hnl?=! nrvZ#{2c_%&-a%LD{@y{?>zDP@;1Gr*y-xn&vVSj8I8OZsdZVP~ diff --git a/view/__pycache__/HistoryManager.cpython-311.pyc b/view/__pycache__/HistoryManager.cpython-311.pyc deleted file mode 100644 index 2105f781116941c3dbc98e6f3fc41b1b882f944c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4245 zcmd6qPfXla8o-}t7qsp zY)C;w>Y-h6;GSre!yMXdvQec}>VeBj-BqjIqdl@T$frts>Wvk9%BB0gXOCxwnWVI* zK0Kd4zdzsm{J!7&p80EgdmDoC=l897gc14=dnlKtNZAuXxr-9$4Wyz^kSaV#AoLi1 zVYz|S#2k{6xpD=&3(>>gZ$Y_>G;~8y(T#*Ee1dKy)da{UH3>4MHi2wbQy^Q^W{_BI z0okfzu-O`PT+waEqHAv|rm~>XTs$k7WqJ~Rd*ghL4PgVxpoL`t!Bg1_@EM-su_^-F ziP`UefFdP>=Db2R(+OH`g>wb%ks|A+s(mCSf+kxt=4mrnwwV!8eERpx=d$nG8nv@; zj=rH7hN6#6zcV^BJ(YdS)G}0G)nY{)6=(FDYl&Ta5g%xJ5cVda^P>^rwK@jA5@ zwVabR6bDR;tKgAtnb|+;>^3!>UDdVQ+1fQ6%dZ7khIi8)Szhnn*H~^~?`abM1@6!N98+E?m`p_aIY^L!UKrT<2XVB^jwUe z7UNhIn60|DcW>Im zLp~mI@etH)rF}e5!e@*4?6&0LjE^%e&O{BzOZZF?pV@Bp@FgE#a`7eJP{M;nJXp{@ zJnrLhw|r3o6V))p;>Q_!3JPOr5$<7es(666tbq@X;2-{ZJKfJ_T?L5^ZuLP}A{%_vA3 znn_t`f@US3*Gx6&iLfx0ReeEmV9(1pR~*MO?MD$FWxN7P+T*_;{#7T?r2r@lf0gI>Hs=5vK-lhatf6$U|){ z9;&d!mzVx+1Jwi~vEIEu5S4UO4Oj(*J8)=J09%Z~YaGD(1W_|OPDBSyFV&+9Ea-LR z`7;(6GIgcVm;%cqb)^xI9LnVE_pCEz3njI2GC7ny?a>!l(;+5aWa1?z4uc4eL~Mm= zF=wrqPMFB(QP!s)L^Yp5%Yr4}RB}t}UHce~>X}jdOAuu^3qmnH;HC$5$O|qx=96QE z0gs#r)t%mB_eTnj|H@gv_uS?+=(2UqCxaz2StOI&OCGuEldCSd8a13Kk@H1ze*2n7 zuK47NORn&S5|N5Tdia`0PW$AvOHN0%<3%$5q|YOhKACjMB-ED3t3~pvM@D=y;+C)7 zPDEY?2kU`m$a0|nQU~vl&)C?YJDH(p6rE`iYN9ii)h#sP-+RP_W6#3U0AGJQb4}oW%?ZYtCo&f9_Z9!oO~~vHzJ&Wm%KupiP#S zEp^3UI+5i+ttdv=LepTDb}_*|ujmOT2ASXqfX(~}af4yl*_u!$*elteg7`T8+f5`> z;x39sTT^Oc7sZ04QqnGpMF&oe?xI*6jx}C)IGK81V76k}CZyhmn#MBpkoh$WYtEgV rfQO3XPw|Ct0e(kMLId}H3Y6WXAPBpOQGwZREdR^v|M!emKE?k5sq$*h diff --git a/view/__pycache__/ImageDisplay.cpython-311.pyc b/view/__pycache__/ImageDisplay.cpython-311.pyc deleted file mode 100644 index 529a811ffba69d459e65b6b069bbc4694871051f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4894 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 Cp)q*? diff --git a/view/__pycache__/InitialFolderSelection.cpython-311.pyc b/view/__pycache__/InitialFolderSelection.cpython-311.pyc deleted file mode 100644 index 8ef77d2a6b43beccc75827df549b32af0de71c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3040 zcmbVOOKj9e7#{C)l1+FNvI0VgAyJ8G6KIa ztwbv%(h8}kmK=J>p`}!`QjZ+kWAEOTr9_r0AypiDO9h9DQ~&YC&TdFhRogrBzvln{ zdHmn(4~>oW2%gVAH>bXdBJ?L`{0DgNd3GJT`$$Eqprf3S7IL9KtLbCGl;7fnY6 zt_$h0Ts$53=&+7+b?G_*h0tZBM(!XrN`wbtgdV}K@}%q4SPDt;zc?#J-S~LFrs(Fh zn;0L^bP_PvFPRI&%A#3dZfty5nIt+`j1{bzO9jSELlWH3IDySw-FCprJ8HXu#A}LQ@2sGR-tb zv!N>A5umyIXC2UfE!;;;*wQ`#@=?I9R%rquDhdxk{wUB1sEAgpBLt@EPL}@E0xM3a zAvOE}d^`&LcwTv~FFk5xdwiDIGAg24Z4t>aU(5FT6hw@IWlcn|#J;|WW&?V)&X-pA z?BEtR8^o`T&F4_%XXn|(UOA>=E6Nt7#awfeRQ&F=H* z+LN(8K6njQd3C=(rn;|QiT^b^$a?3M|EaEaH@&qF#>~Fv=dyahr>c9%F4)iQ*{KMM ztA2E;sZvnlW|4`ND$|}rA!u(xvvgrn$=;f#X2DQ9v!-s+Ua_rvlD}ugO@4kxW8|zj zWg4t=O37*ZVz1a|8kVUm*4d?VV>(eRB3fSMifo2}B`;-heuhvY0-%WViorx?ik33x z38<*(lZBksyL8g?YH3TPSL{BMU)U|o#EZtwnN(%~I8>+T+O&})29uiHs8z@l>S9^e z08V7t-D44ULo-x!enMk9aT|ai&=!cAf>>@Na2|lAW(Z-FT(kv-v?nKUV=w4sd|Gdc^chUZD`yt&`;}EWIVm7RMz~y#3<$zTV6= zi%=^w(s^0Ybw%qMoah`LyqLLakbbJok$@08#bIr7Q8D05%n^(61r#q9*o;XvwwUQB z)-7h{GpXTgnN%T{gMI8i)7_I9qneS`@;VXCDKTYEv3W>F>?dl*Ja4rb;wGN0KQ@VoMhlo#$&>n?hKYx(|ISK;jba~u7E8^4I( zi?88BWqfEQS;C@&MH`FjxM2-9mvOUw^z9Pvad3}~dpzOcGCsW0wqliVn}geI+~!G- zl<^U}Ia9(n9emTqH=ibtueO(xC!OTU<;cCn(niQu=0Z}~+yH~%4Tg$lh z`_OlLO8B&cPuuwPrd%vT9>+f{;UNbP*?4GEe5{O*t*{bqcW}Fn+n=^{JZyd3UTV4E zv|Lz@IQR(ILA!=K%DCg_W=9$*Nmm@{N(m1-c+kd!Pate!4Y!nW%ZmE#Yza#amTW9> z|AE{&cILNBzmD3tC5R8>z^{W(tl?8-eClD3^TvB6eBQz5ZU1`)>x#0$4GBze>lT5j zy>n*+yCVEqsYS6*g`z-PiUQnC!OaM_?T&Y7Ekg6ZG%5I1kMxi%G)fyG2Pr~%PVPad zn-3N=i)qGmzeeH2nRL9v7Sh7ph#WEdRy0WztbSDH|+ar z=*yumM(&L)d+(FBlb*tE5aFY3;71Zhr5J}TL&*_aLP zb3ZC2+`VIqtH>@z8;VCg=N2VGVFCq2CMeE*0l zarg$kz~?H9a-O~gET5@$7n+T*APDQ|Bm2L7>!{hT{nk;3UHffBjtVgUmz$Lve{<>c J9aLVT{{l3b&5-~A diff --git a/view/__pycache__/MainView.cpython-311.pyc b/view/__pycache__/MainView.cpython-311.pyc deleted file mode 100644 index 50e030df575405a95251776d2ec75787090cfd3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7889 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 HIg9x(!=3@` diff --git a/view/__pycache__/__init__.cpython-311.pyc b/view/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 23134afe736c474bfecb91825ea306d83bb55df5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmX|6O-jQ+6rQmtQYc_;~MgG#avi_k}61g8ua30RCroC&7HM70cNZH41O-armSE)SU&|4mjsqb|5 Date: Mon, 17 Jun 2024 21:42:37 -0500 Subject: [PATCH 077/124] Dockerfile --- Dockerfile | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/Dockerfile b/Dockerfile index 847e972..3582f9b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,18 +2,7 @@ FROM python:3.9-slim # Set the working directory in the container -WORKDIR /VisionAI - -# Update and install necessary libraries for PyQt5 and OpenGL in one RUN command -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - libgl1-mesa-glx \ - libglib2.0-0 \ - libxkbcommon-x11-0 \ - libx11-xcb1 \ - libxcb-glx0 \ - libxcb-keysyms1 && \ - rm -rf /var/lib/apt/lists/* +WORKDIR /usr/src/app # Copy the requirements file into the container at /app COPY requirements.txt . From d4d4eef1bb0ece9917be36e89e27e1277e5f4499 Mon Sep 17 00:00:00 2001 From: jagruthh Date: Mon, 17 Jun 2024 21:49:05 -0500 Subject: [PATCH 078/124] modified: requirements.txt --- requirements.txt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index bf5a348..8e7b2a1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,12 @@ -PyQt5==5.15.10 +pip==24.0 numpy==1.26.4 Pillow==10.3.0 +pyqt5==5.15.10 +pyqt5-qt5==5.15.2 +pyqt5-sip==12.13.0 +pytest==8.2.2 +pytest-qt==4.4.0 +pywin32==306 onnxruntime==1.18.0 + + From 21db991c2068d39d71b7e0fdcf3453dd8890f6be Mon Sep 17 00:00:00 2001 From: jagruthh Date: Mon, 17 Jun 2024 21:51:21 -0500 Subject: [PATCH 079/124] modified: Dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 3582f9b..81ab9a4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Use an official Python runtime as a parent image -FROM python:3.9-slim +FROM python:3.9 # Set the working directory in the container WORKDIR /usr/src/app From e38d3ab8301bd803147cb29b7985b91aa603529c Mon Sep 17 00:00:00 2001 From: jagruthh Date: Mon, 17 Jun 2024 21:55:25 -0500 Subject: [PATCH 080/124] Dockerfile --- Dockerfile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Dockerfile b/Dockerfile index 81ab9a4..902eb4a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,6 +7,12 @@ WORKDIR /usr/src/app # Copy the requirements file into the container at /app COPY requirements.txt . +# Upgrade pip to the latest version +RUN pip install --upgrade pip + +# Disable the progress bar to avoid threading issues +ENV PIP_NO_PROGRESS_BAR=off + # Install the dependencies specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt From 5881c3f25bd50d35d710ca81b7c7f9a79001a539 Mon Sep 17 00:00:00 2001 From: jagruthh Date: Mon, 17 Jun 2024 21:57:48 -0500 Subject: [PATCH 081/124] Dockerfile --- Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 902eb4a..d595c75 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,9 +7,6 @@ WORKDIR /usr/src/app # Copy the requirements file into the container at /app COPY requirements.txt . -# Upgrade pip to the latest version -RUN pip install --upgrade pip - # Disable the progress bar to avoid threading issues ENV PIP_NO_PROGRESS_BAR=off From 231bab4c78ab7f22b5ea6c807f3e1ac87507d723 Mon Sep 17 00:00:00 2001 From: jagruthh Date: Mon, 17 Jun 2024 22:00:16 -0500 Subject: [PATCH 082/124] Dockerfile --- Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Dockerfile b/Dockerfile index d595c75..d3677c1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,6 +10,9 @@ COPY requirements.txt . # Disable the progress bar to avoid threading issues ENV PIP_NO_PROGRESS_BAR=off +# Upgrade pip to a stable version separately +RUN python -m pip install --upgrade pip==23.0.1 + # Install the dependencies specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt From 23d14352f8ec706cd6eb16cd28e5891ca3836aff Mon Sep 17 00:00:00 2001 From: jagruthh Date: Mon, 17 Jun 2024 22:07:14 -0500 Subject: [PATCH 083/124] Docker and req --- Dockerfile | 2 +- requirements.txt | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index d3677c1..fdf6c51 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ COPY requirements.txt . ENV PIP_NO_PROGRESS_BAR=off # Upgrade pip to a stable version separately -RUN python -m pip install --upgrade pip==23.0.1 +RUN python -m pip install --upgrade pip==24.0 # Install the dependencies specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt diff --git a/requirements.txt b/requirements.txt index 8e7b2a1..c711e61 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ -pip==24.0 numpy==1.26.4 Pillow==10.3.0 pyqt5==5.15.10 From ead11c2565e7089bc6a208bf4a06f6a8e9250ed7 Mon Sep 17 00:00:00 2001 From: jagruthh Date: Mon, 17 Jun 2024 22:11:51 -0500 Subject: [PATCH 084/124] config --- .circleci/config.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index bdc6433..4de2589 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ version: 2.1 executors: docker-executor: docker: - - image: docker:20.10.7 + - image: cimg/python:3.9 jobs: build_and_push: @@ -12,6 +12,10 @@ jobs: - setup_remote_docker: version: 20.10.7 - checkout + - run: + name: Start Docker service + command: | + sudo systemctl start docker - run: name: Build Docker image command: docker build -t mgallai/vision_ai:v1 . From a7227220c198324ecc71fb7c10366d178e8951fe Mon Sep 17 00:00:00 2001 From: jagruthh Date: Mon, 17 Jun 2024 22:15:25 -0500 Subject: [PATCH 085/124] .circleci --- .circleci/config.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4de2589..c96e96b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,10 +12,6 @@ jobs: - setup_remote_docker: version: 20.10.7 - checkout - - run: - name: Start Docker service - command: | - sudo systemctl start docker - run: name: Build Docker image command: docker build -t mgallai/vision_ai:v1 . From c8a2b0de80593e6916906344f5dd3882b243f372 Mon Sep 17 00:00:00 2001 From: jagruthh Date: Mon, 17 Jun 2024 22:20:53 -0500 Subject: [PATCH 086/124] Dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index fdf6c51..d3677c1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ COPY requirements.txt . ENV PIP_NO_PROGRESS_BAR=off # Upgrade pip to a stable version separately -RUN python -m pip install --upgrade pip==24.0 +RUN python -m pip install --upgrade pip==23.0.1 # Install the dependencies specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt From b9321b6f77dffbf1bae1dad2c06f73701c7a6513 Mon Sep 17 00:00:00 2001 From: jagruthh Date: Mon, 17 Jun 2024 22:24:15 -0500 Subject: [PATCH 087/124] Dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index d3677c1..efc8228 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,7 +14,7 @@ ENV PIP_NO_PROGRESS_BAR=off RUN python -m pip install --upgrade pip==23.0.1 # Install the dependencies specified in requirements.txt -RUN pip install --no-cache-dir -r requirements.txt +RUN pip install --no-cache-dir -r requirements.txt --use-deprecated=legacy-resolver # Copy the rest of the application code COPY . . From 4539d262338a785b287c12513d77f72eefc47fee Mon Sep 17 00:00:00 2001 From: jagruthh Date: Mon, 17 Jun 2024 22:27:52 -0500 Subject: [PATCH 088/124] Dockerfile --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index efc8228..6a95b3a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,10 +8,10 @@ WORKDIR /usr/src/app COPY requirements.txt . # Disable the progress bar to avoid threading issues -ENV PIP_NO_PROGRESS_BAR=off +ENV PIP_NO_CACHE_DIR=off # Upgrade pip to a stable version separately -RUN python -m pip install --upgrade pip==23.0.1 +RUN python -m pip install --upgrade pip==24.0 # Install the dependencies specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt --use-deprecated=legacy-resolver From 274fc2f440883e23e27c1790d4d6b6b52c2d9285 Mon Sep 17 00:00:00 2001 From: jagruthh Date: Mon, 17 Jun 2024 22:31:41 -0500 Subject: [PATCH 089/124] Dockerfile --- Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 6a95b3a..548f27e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,10 @@ COPY requirements.txt . # Disable the progress bar to avoid threading issues ENV PIP_NO_CACHE_DIR=off -# Upgrade pip to a stable version separately +# Upgrade pip to a slightly older version first +RUN python -m pip install --upgrade pip==23.0 + +# Upgrade pip to version 24.0 RUN python -m pip install --upgrade pip==24.0 # Install the dependencies specified in requirements.txt From 913d9fb364ff31e0754fcff4f9e3a49883adaf32 Mon Sep 17 00:00:00 2001 From: jagruthh Date: Mon, 17 Jun 2024 22:39:51 -0500 Subject: [PATCH 090/124] modified: .circleci/config.yml, Dockerfile --- .circleci/config.yml | 2 +- Dockerfile | 26 ++++++++++++++------------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c96e96b..bdc6433 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ version: 2.1 executors: docker-executor: docker: - - image: cimg/python:3.9 + - image: docker:20.10.7 jobs: build_and_push: diff --git a/Dockerfile b/Dockerfile index 548f27e..847e972 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,25 @@ # Use an official Python runtime as a parent image -FROM python:3.9 +FROM python:3.9-slim # Set the working directory in the container -WORKDIR /usr/src/app +WORKDIR /VisionAI + +# Update and install necessary libraries for PyQt5 and OpenGL in one RUN command +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + libgl1-mesa-glx \ + libglib2.0-0 \ + libxkbcommon-x11-0 \ + libx11-xcb1 \ + libxcb-glx0 \ + libxcb-keysyms1 && \ + rm -rf /var/lib/apt/lists/* # Copy the requirements file into the container at /app COPY requirements.txt . -# Disable the progress bar to avoid threading issues -ENV PIP_NO_CACHE_DIR=off - -# Upgrade pip to a slightly older version first -RUN python -m pip install --upgrade pip==23.0 - -# Upgrade pip to version 24.0 -RUN python -m pip install --upgrade pip==24.0 - # Install the dependencies specified in requirements.txt -RUN pip install --no-cache-dir -r requirements.txt --use-deprecated=legacy-resolver +RUN pip install --no-cache-dir -r requirements.txt # Copy the rest of the application code COPY . . From c65a27afdd6f2874beee44f6d4f31e608d8737f1 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 23:14:07 -0500 Subject: [PATCH 091/124] editing docker file --- Dockerfile | 9 +++++---- controller/__pycache__/AI.cpython-311.pyc | Bin 0 -> 6967 bytes controller/__pycache__/Manual.cpython-311.pyc | Bin 0 -> 11121 bytes controller/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 290 bytes view/__pycache__/ButtonPanel.cpython-311.pyc | Bin 0 -> 8222 bytes view/__pycache__/ButtonStyle.cpython-311.pyc | Bin 0 -> 1066 bytes .../CloseConfirmationDialog.cpython-311.pyc | Bin 0 -> 2887 bytes .../DeleteConfirmationDialog.cpython-311.pyc | Bin 0 -> 2893 bytes view/__pycache__/FolderList.cpython-311.pyc | Bin 0 -> 11229 bytes view/__pycache__/FrameSettings.cpython-311.pyc | Bin 0 -> 1936 bytes view/__pycache__/HistoryManager.cpython-311.pyc | Bin 0 -> 4237 bytes view/__pycache__/ImageDisplay.cpython-311.pyc | Bin 0 -> 4886 bytes .../InformationDialog.cpython-311.pyc | Bin 0 -> 4173 bytes .../InitialFolderSelection.cpython-311.pyc | Bin 0 -> 3032 bytes view/__pycache__/MainView.cpython-311.pyc | Bin 0 -> 7881 bytes view/__pycache__/SelectMethod.cpython-311.pyc | Bin 0 -> 4663 bytes view/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 284 bytes 17 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 controller/__pycache__/AI.cpython-311.pyc create mode 100644 controller/__pycache__/Manual.cpython-311.pyc create mode 100644 controller/__pycache__/__init__.cpython-311.pyc create mode 100644 view/__pycache__/ButtonPanel.cpython-311.pyc create mode 100644 view/__pycache__/ButtonStyle.cpython-311.pyc create mode 100644 view/__pycache__/CloseConfirmationDialog.cpython-311.pyc create mode 100644 view/__pycache__/DeleteConfirmationDialog.cpython-311.pyc create mode 100644 view/__pycache__/FolderList.cpython-311.pyc create mode 100644 view/__pycache__/FrameSettings.cpython-311.pyc create mode 100644 view/__pycache__/HistoryManager.cpython-311.pyc create mode 100644 view/__pycache__/ImageDisplay.cpython-311.pyc create mode 100644 view/__pycache__/InformationDialog.cpython-311.pyc create mode 100644 view/__pycache__/InitialFolderSelection.cpython-311.pyc create mode 100644 view/__pycache__/MainView.cpython-311.pyc create mode 100644 view/__pycache__/SelectMethod.cpython-311.pyc create mode 100644 view/__pycache__/__init__.cpython-311.pyc diff --git a/Dockerfile b/Dockerfile index 847e972..aa7fd39 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,11 @@ # Use an official Python runtime as a parent image -FROM python:3.9-slim +FROM python:3.9 # Set the working directory in the container -WORKDIR /VisionAI +WORKDIR /app -# Update and install necessary libraries for PyQt5 and OpenGL in one RUN command +# Update the apt package list and install necessary libraries for PyQt5 and OpenGL in one RUN command +# This ensures all packages are installed together, reducing the number of layers and keeping the image size smaller RUN apt-get update && \ apt-get install -y --no-install-recommends \ libgl1-mesa-glx \ @@ -21,7 +22,7 @@ COPY requirements.txt . # Install the dependencies specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt -# Copy the rest of the application code +# Copy the rest of the application code into the container COPY . . # Make port 80 available to the world outside this container diff --git a/controller/__pycache__/AI.cpython-311.pyc b/controller/__pycache__/AI.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43d0ffdf30aba5a0bbc0539205872c1eda573ccf GIT binary patch literal 6967 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 literal 0 HcmV?d00001 diff --git a/controller/__pycache__/Manual.cpython-311.pyc b/controller/__pycache__/Manual.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20d2323af067b5128e476a7c8c78a7ba71f23e6c GIT binary patch literal 11121 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 Zwb1W7ui9-ejOFF;X!`FDcuI%&zX2EE13&-( literal 0 HcmV?d00001 diff --git a/controller/__pycache__/__init__.cpython-311.pyc b/controller/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0365a6b283cb8e2f09c49d006c679b554869a84 GIT binary patch literal 290 zcmX|+!AiqG5QcXxN)d{$uvZT$Qap(W!GHv!7Ls}z2r-?|)y;04-9+*vK7#lFK9Mg_ z=&dJr!TKM*`DX@x_&;Z}Q|47n-xSw9PX5A~ip<~}7^t5Ll+X?4<%MPH4zx@K&Z&bek literal 0 HcmV?d00001 diff --git a/view/__pycache__/ButtonPanel.cpython-311.pyc b/view/__pycache__/ButtonPanel.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26f2f9c26e970eaf4782a711c63991c43dadcfb4 GIT binary patch literal 8222 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 YbpNv*nWbsio%-;5g8yNcTEe3L0lG3oT>t<8 literal 0 HcmV?d00001 diff --git a/view/__pycache__/ButtonStyle.cpython-311.pyc b/view/__pycache__/ButtonStyle.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b07be1f65fec02aeffdfcab38d20c01b46c758a9 GIT binary patch literal 1066 zcmZuv%}yIJ5cX~ejnbro-YZ#ZFB}$8iqsOSN{*3m+)Ids_n5WRf?n@hw{!=b3*vK)0T&=vTuZB#0a zne2S;@kU~d6m`=L*#sFBhH|iOXF**;0g%q!Ap!V{cp#s46Wz`T@Yj*of(KGjrYd+j zKE+ywoZ{!N-fyhDSzW^uaZMRY2s>$W!`3E{mK4U*{EPv~QhYiI#)MKX4lDTO6qIH5 z6rnuP4+fCt(V>!wpxz+6QAFsNC??EgnzV)%iFnwp;7uvuCPa@zzKsgL*N946c9{CV z9aA}n?HEyv$$lV}w~dE|?tX4o{C&-o_CI)ABn$~(tnGQ*wRQiaU{%FCY-C^$Z}WpL z5x6EgOq&SqgVz(&mWrFMUuF8p$k?xM@B8&6ilE5lrR5cWS8>tgamcW2;ks;@6X*o4 zvJMMnY&rbBHp9D0eql}Hhr|H2|Cwtp#d^)}aCYL~o1w+H+nYaRCZMcElF$U&PS)A8 z`yo@X9b8=kb&mQo<+)NHfl_wxb{6uzLJ$ZNu^{LbgCLSL39VfUg5!jQ1Ei!4F}xWu zxGhx$IGOe^|kpT)cNT9ouBW!Px6o#)J+b}KE3eAj?|kmS(2RvCnK|u mG){0=c$?MsPL%;jv%ChQpK~0i@6I{EKCN!7@9zUZO8gJU#|b_F literal 0 HcmV?d00001 diff --git a/view/__pycache__/CloseConfirmationDialog.cpython-311.pyc b/view/__pycache__/CloseConfirmationDialog.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dfb0c3afe2c2134ed1ee47ba0b56f90c28c4769c GIT binary patch literal 2887 zcmb_e-Af!-6u+~dXVpzK)g)?yqlTJ|s8LcV+9YnYCW19uO+uH2VcfZ^V`gVIGqdW- z2J#Syg+BD9#6k-DklGgC`Umtmk2A}F%Rr$}e8`){K7>5=-r1e~@B%L^zkxR_jAD#{VjjV}g_4Zmc^--pYJ-XSNIpLM!i1z~ctVkrqMG7$QISiD%_clGZpmCB z>iO_@(*MA`L^@N|?htaf!scr<6(PzoJ4C))(J?58^0g5vrou^3Z)3yEpIb zLs##PLf{0;ld%VnS$gs{h+L0|#5!uJw^z0GYxmTrcUE-*9K-F;`ST~{qhGGRw|ds4 z>%AY%Bj;bO%vQd|eW!NJq1AIPf9!4FDR})yE$c9aj$sPq0{I ztLvq9%=wO@7Z5q;4YQl)oP*BRp7hPRB|hIxp+2 zuCNJOaaer?vwS)&i3z9b++N)5bApt-ja(<*PKj!JzrmXAnN=cfwqMJnv1$XyiL$73 zoP9>a`Xf;ml=VeXm#`fsyi+9?RxsA>Cc;jM8(3H%NvpJ2sI=}o@~9*(%PB1DDo|0Q z!%q;N1Zbpg6;*ho@@YH73&JB&SjM_ai+~!S9X;%J3z2aGPVyN^=QLWJ?O=jHe2fJ` zD6)(bq{{P&1WuDt#jBL3?n)Ox1ZV30zs)ki{BT z64@bHsgN9(AgiNsoJN7LrS|Oo9}}bT2O3tj_*VmWc}e2M!Rf_;ndxZ!zKkbTaSc}p zc7UA`m$JOfPRnap)9I|R(Tu*LsG^>YPh#z{uB77&GY{emnN$j^?8xHL018~@(m{RThMPn|9)#%-j^55)_$wCe=AgkmXgWO zjTU>;WN%ySZ4<^V7&l;?C@pB;gYE)!=dZl(H(}6%K?4S>jzbmPe^uaIHlfdgKEr(u z$wHwBGfTdP$nll=6eh>Ff#Xt&kdY|e#BonDyj0RSt8a(PTRVXziQ^)S`YBy)`c*Nm z_K{wtSD@3;Q?1=39oYu%@4(aHzj}Z^qEoNB{$?YM_Sw1Yy#CqXJSi~r@M|i)3adq= zR0n89u$x@V2}Q-Fa?(t<_h8Lun^Q5ITz^BQI26Hq_@Xocx71<6QfS%>(j9mihAE=2 kjSqW@sMDx_is-6Q{~Y)_88RKmyY1zFsPx|xR8FG*0cNA4Gynhq literal 0 HcmV?d00001 diff --git a/view/__pycache__/DeleteConfirmationDialog.cpython-311.pyc b/view/__pycache__/DeleteConfirmationDialog.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4782e8c4e6801cdef49e5606f51d52a4c73e2353 GIT binary patch literal 2893 zcmb_e+e;i*7(cVuZ`DmS(bP+VqlTJ|XriQ0v`I8tQ;W53H3?l7hH>Ytj+vd=%$)Vc z2J#Syg+BD9#6k-D(AXB=`VaIqk25mhGEgWKAM$3g4<%1MXJ#+18c3jLXV3X=^ZUN< zT)s0uN27I!wt0AzeiK0GFUFKxutXf*r^It4A&FB^hD&f6U&5F1C;XW}B9I9tf*jNN zlu#y|2)ndjflMS3;gApAMN;4?l7g7q_9L`I|6WVfNufCu3%_P;Ea-&e6SAmii%xy~ z{vB;?T3pw1#0kZx#RaTT;cU)Wx|1VBQz`RV#UjQzzBr+My{DWb>k3Yle7Hl|;~`Jk zXEYCt5}bq*KFPm{(wyXb8c9%UjY|Y*JOQV50xOu{aZOFjdPXF&rh1Xhq0}`W zefS&gzvrGK!d11~l-#MXg(I4Z5aqdTD&MK-IFv_)qaG@z(rK3Ev?^ANkbI|LvPe%f z$u9-AskfbqM-Gwts#zY@B0ctzXjLl(slMjz$Ns#(5UyHODbiS_mm_7m7MF6vrNmHJbfqUpnY&(H$-u7>1^ZMoDbQ8+e!>{5ZQdB7aAZ`0H0Rq>aHb9rLuV@kXvhtcoh( ziN;HA&Ed%s=0#;8m!aT_g!S9=8@;X@4{zu?#e0ii$Nx1p9N&xUHOf?%*jc&|Nq^ZWR4@}7ZpBl$)DT~Sd)d0=Y3e|l;x`K5{{ba@3= z2)>`6mKWAVm7h{qutC_Y@MAf$r0FtQPflRtA_NvabeI^EK9nzx#|?WXR{(0=0u^MlV{ zO<0X_yD`2QEJAb-7|xGFFK$_I)rPAkTy>=`&}9ocZRj+i)0KH)d}_g@4U;BJ7U4`O z-j<5terwMU(HGIp=za@dX!#{zwe;I9{hM_~IJXD?m}mw&VoK0`b_BCZ|*Dv3X;{_XE*n4MvBnn znY^sG`I{Dh+vaauFlxi738PeLL)#v7?Lt@K@=tvh4A?MW!ax-`Qpx+zN;;P;=(VBO zEI)^Ip-_yQq2EOG0IOmK(*s;52pLVvDU5Cqghx41@igx8JJHhSPGLn6gczrP$X1(u zT8!$wwAa}^=yvQ}8#if3w?X-L;A;#>>DVhMjckJt9Qk;2Yla)^ugLSmGI#@@coT3-AEYcx&3Hz;13$-c mMf8>VZch<)n6*z4T`_B)gFpvIr{iR|wfZ-c{&R}T4fH?6Y^7iT literal 0 HcmV?d00001 diff --git a/view/__pycache__/FolderList.cpython-311.pyc b/view/__pycache__/FolderList.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca37572e223f5443152cdd0742d1b2e7c7e11f3c GIT binary patch literal 11229 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 F{{i0(76JeO literal 0 HcmV?d00001 diff --git a/view/__pycache__/InformationDialog.cpython-311.pyc b/view/__pycache__/InformationDialog.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e813e7bbbd806d92003711f933d2f79ff2a45f0a GIT binary patch literal 4173 zcmb6cO>Y~=b(bQkA@yauts7HtJq;z(R4q2KleV!8x3XocYGql3WV>LAES9??a_#+K zW@jZ)Re=;RP`5CU_E1EJ9&~8jrVh}n59xp45)05+pg@7bhujo6ha#uG+2zut#K7r_ znw^>V=6%06Z~r%pKML$;L z<46c!V-1}s9X7!$V*27NEPo5C5TPWhLMf)k9|{|y8hel`4XHy9gc7W`#Zm$UOZdl^ z%ngegGSe(Glx;SFPU8dHZJ1C1wLIssKK>ybx|ALh?SULx%Z{m@-ON=8sN5zT;O;s_p! zpu57o?tFi+49Wh}T-u&95Ryk9b$Gy;u59~3Kp#HUOZD(+_U)J0D(Z)V)}s*=Xmsa; zwPBMHt{~hSkLLZc&`&?mw@dY2*RK1=qSL)^kl=W<9zf^SHt2FIP;OwrEv00Uv9ITqQPkY|X6VJDLsIjOUjCjt$v#;83HGzCmQ>P{7hmMR!zkDg9;v zuMsFCjGvN0DqSU%(^WOQuFDOqF&iW|88Mk%NM9)66?s#u2E_ui8faRrVGxg5w1KxY zR>Rx^STI{JgGKj^hf?q*=Y4w=CIk@@Y=c$-8Ad5_Sq%b>2}=rZjncD`eIE+1Fis`IML z?Hv-rhNCmB-qo;>PA{1@qYj7%G1B8NoD2PiZv-yOaT-d^vTRTgoJT<+a7o~?+prg5 z-z2PNslC`;EAdbX6~zj~qOEOcO5o?fa~-#nuG1qIh5?tm3U1E@e$U+q9iMyY`Hlne z7O7yB7*;4Ofj}`VmFT!mXmACY3P=y3vt?24!t=Oh*^Hk=VYVfT{Ggk43Ygc$(+ac z9GhXeVnIN0X%0tsA-$6e(m%}eH-7|q4x$dK2kU<9*3aR}PszGgH4V@y|1CdZJ76#$ zNs?x2Op^R@o3Oi@sajj>8q&Z_-YD3>adF$h+ zHD~}NJ#0WYDT}IisayxHsv7nll$TsTW!;y;Y^MCe@{dDTBB^9UhM<*f-j4XgK_U_r zCYEVJ5c)}3QAnLpenI*p^IVT>pa&>$ObOnSWlA>W4l(mXejM^(!%sru0L)KGQV@!g zWb-Znc+b}~mnksG;*?M3L4{`>q3QD)@gax-SkE0h?VE6y; zWBYr7!5wTr&aXx2bUDW(&#pMQv+6$&r=yRPJ_`L83w zdP((guN3q^v6atw>zzlG)AEnYo3aKaL??^HGN8;f{A8Hke%ydU=!@HaVoOt5%@+X# z_b$}ke2ij#cp^-HsoFVebIKUgEWGF$7`HYG7yUx-1d{mO&gN`hO1a%?M(jV)TJB8@FB;`f=I@gIu@J~Wp z@Xr>?2ObsnIt)-NqQ8S!Hh~X>uNrE{DdsLVpNLuCe_` u7!HO+QG6!cZhpPrGhwpX|9d8!Yxe&R;^#zehQZ_B@aF;Ki?4tOBL5FJk}b;s literal 0 HcmV?d00001 diff --git a/view/__pycache__/InitialFolderSelection.cpython-311.pyc b/view/__pycache__/InitialFolderSelection.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aca0747f0ead150411d82f13a599b2659cb9a50f GIT binary patch literal 3032 zcmbVO%Wu?17$5I*l1+FNvI0VgL!uJXCQzF85GZL#3Z!|EbOT7MMXs}+Bo1DC8PDdW zt;7L|P$Biyl0y$Uw3I5X)FX%TKX_M`5?QK*RB`An6&xx~{l*(RyAV)S+dK2U=KH>R ze81VB8XM~oJd^m=^mkE&{^X4R0Pj7|uR-?!sYn%cloQfIE|d=C!s&1>l8)q}>8QYU zAw8Chr{f+S)^V;bT_>Orx`foo9i&Ey@Gy+fI{Ye6x?YW?kQD!mvr^QJPYh~`ZqB%g ziHn*}0_NHUb8$pjG7HR&O^hg0LMlm>oLNJk;7sGA%zGzJM>Gx*bEpx5erX?4#I z?r?KK{My)j4pn}3pH1woV;Xj%>`-d_)iJEON{e@y*&bgH83pv(t{Jgb-xi^{eLh`# zGG2`jUV~L$+wYI5?yFbge~k{Z-hJhNsjJ;hZ|#FIbMN@MtR3*F>K?KS_Vd;3R0PFU zKepUdDJXHf$izyOX)mAFx0NBshhM{Y(F!_-?QR2zc8yYa#ox+ z4c0ZSmc zoXE1f$0F>yW~k=Eq{ejOHUNK7TO?`tE0C4^Cqziv$Tz>o4X;YM{20QsnX zKMdv7$ zrh>waXLT)mlc+$Lh5=&(AC+~K!fphdPP?(ZLLsbMC(Bt_dP|lqj!U9=`{k2?-po~t zP%AUqbxF~6Me81#>>3&B&s;IcAl2qcK!{!9h&HvP7;q-$iN*K=iv0yPYf_CZWd@0L zlbQKUYUFArRmkOFAJ3dV(~}venvvD=IuXrjF=bA(1xQ95B=bZ!^V~;f5_W!^nsYFN zjIJ;C36gd(tCie8g_f zl<*A)->~tGXUVp;j#Bc3lRU8!xu1B}1dh^n=F3u(;xs8Bs)u3s>o;&~8Mpoz`e9EA zpK|ai8=u;ii)F~8?eh{IcJQ!`hquMY%J|qSE8z|Yci6b&Sxe`m*2f*CmOiJYZzba3 zBVY&Z2JS55&R?4y>0(K`>`0eOc*wy+HXeEkVG|p;rHorv)$iv@SaPsrV~P6@Ve1$_6(hFu`qG1g7?`oeS)W z@F%4fy}lBP0&OV@a3=*fBHXgO-kr6`%>T-y;8#7;L$J^oZG;@82<17s2ccd*ThuJ3 z88d?#g_CB|C3kP7+N87=VB#cQh4p)YfBLG+RvYa#3g3jp%S-w?J^oqu-4KGu-al7ub zMAv0m5@;LGif_oLmHF@+o$`j`nKc3pl#2gug$_jfw$PiJld)*$7J6Ibh-_5^u;bJFVTMi Dti8#; literal 0 HcmV?d00001 diff --git a/view/__pycache__/MainView.cpython-311.pyc b/view/__pycache__/MainView.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3579ae6e700c5b00b9311286edb38de8fdd87e9b GIT binary patch literal 7881 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 C(WZc_3keu8-Nqx^wF zZ#}sI>pQ%8Zw4N3J|~k?7Ep}etE(`726F)a6T6cjKG=%o?3_P-F?$sJZaD70@2+9t z&^maC?xj+arfCsnX$(&q6H6Wb3lWKoUV5oTsylSPM(su1`n9p-dq~i|dDB3iEg)~} z8m*XJ%r0SWNiV5UC`=`CQ~8awC=%>YnP$j Date: Mon, 17 Jun 2024 23:16:58 -0500 Subject: [PATCH 092/124] editing docker file --- Dockerfile | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index aa7fd39..0c814e7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,13 @@ # Use an official Python runtime as a parent image -FROM python:3.9 +FROM python:3.9-slim # Set the working directory in the container WORKDIR /app +# Temporarily disable APT post-invoke hooks to avoid errors +RUN mv /var/lib/dpkg/info /var/lib/dpkg/info.bak && mkdir /var/lib/dpkg/info + # Update the apt package list and install necessary libraries for PyQt5 and OpenGL in one RUN command -# This ensures all packages are installed together, reducing the number of layers and keeping the image size smaller RUN apt-get update && \ apt-get install -y --no-install-recommends \ libgl1-mesa-glx \ @@ -14,8 +16,12 @@ RUN apt-get update && \ libx11-xcb1 \ libxcb-glx0 \ libxcb-keysyms1 && \ + apt-get clean && \ rm -rf /var/lib/apt/lists/* +# Restore APT post-invoke hooks +RUN rm -rf /var/lib/dpkg/info && mv /var/lib/dpkg/info.bak /var/lib/dpkg/info + # Copy the requirements file into the container at /app COPY requirements.txt . From 3cc32a56dd9f463082296ed53c5658546e74b7b8 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 23:20:12 -0500 Subject: [PATCH 093/124] editing docker file --- Dockerfile | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0c814e7..835ec54 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,24 +4,6 @@ FROM python:3.9-slim # Set the working directory in the container WORKDIR /app -# Temporarily disable APT post-invoke hooks to avoid errors -RUN mv /var/lib/dpkg/info /var/lib/dpkg/info.bak && mkdir /var/lib/dpkg/info - -# Update the apt package list and install necessary libraries for PyQt5 and OpenGL in one RUN command -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - libgl1-mesa-glx \ - libglib2.0-0 \ - libxkbcommon-x11-0 \ - libx11-xcb1 \ - libxcb-glx0 \ - libxcb-keysyms1 && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* - -# Restore APT post-invoke hooks -RUN rm -rf /var/lib/dpkg/info && mv /var/lib/dpkg/info.bak /var/lib/dpkg/info - # Copy the requirements file into the container at /app COPY requirements.txt . From 2ed7ac713ecad9449bb439ab7833a0e5367531b3 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 23:25:26 -0500 Subject: [PATCH 094/124] editing docker file --- Dockerfile | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Dockerfile b/Dockerfile index 835ec54..0b9ed3e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,6 +4,16 @@ FROM python:3.9-slim # Set the working directory in the container WORKDIR /app +# Update the apt package list and install necessary libraries for PyQt5 and OpenGL in one RUN command +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + libgl1-mesa-glx \ + libglib2.0-0 \ + libxkbcommon-x11-0 \ + libx11-xcb1 \ + libxcb-glx0 \ + libxcb-keysyms1 + # Copy the requirements file into the container at /app COPY requirements.txt . From 93a7586a5019572b4c3722c5e96ccb7fed136c4d Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 23:31:03 -0500 Subject: [PATCH 095/124] editing docker file --- Dockerfile | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0b9ed3e..ef2c7fb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,9 +4,12 @@ FROM python:3.9-slim # Set the working directory in the container WORKDIR /app -# Update the apt package list and install necessary libraries for PyQt5 and OpenGL in one RUN command -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ +# Install aptitude +RUN apt-get update && apt-get install -y aptitude + +# Update the apt package list and install necessary libraries for PyQt5 and OpenGL using aptitude +RUN aptitude update && \ + aptitude install -y --without-recommends \ libgl1-mesa-glx \ libglib2.0-0 \ libxkbcommon-x11-0 \ From c0c39e6b6c31cb6e1c850ea1c4147734e55b8e4e Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 23:32:55 -0500 Subject: [PATCH 096/124] editing docker file --- Dockerfile | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/Dockerfile b/Dockerfile index ef2c7fb..cf6c5ca 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,22 +1,9 @@ -# Use an official Python runtime as a parent image -FROM python:3.9-slim +# Use the Jupyter scipy-notebook as a parent image +FROM jupyter/scipy-notebook # Set the working directory in the container WORKDIR /app -# Install aptitude -RUN apt-get update && apt-get install -y aptitude - -# Update the apt package list and install necessary libraries for PyQt5 and OpenGL using aptitude -RUN aptitude update && \ - aptitude install -y --without-recommends \ - libgl1-mesa-glx \ - libglib2.0-0 \ - libxkbcommon-x11-0 \ - libx11-xcb1 \ - libxcb-glx0 \ - libxcb-keysyms1 - # Copy the requirements file into the container at /app COPY requirements.txt . From 526feff89c471027f327b52a8304ed23f84d3ebb Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 23:42:19 -0500 Subject: [PATCH 097/124] editing docker file --- Dockerfile | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index cf6c5ca..1a03a8c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,20 @@ -# Use the Jupyter scipy-notebook as a parent image -FROM jupyter/scipy-notebook +# Use an official Python runtime as a parent image +FROM python:3.9-slim # Set the working directory in the container WORKDIR /app +# Update the apt package list and install necessary libraries for PyQt5 and OpenGL in one RUN command +RUN echo 'DPkg::Post-Invoke {"/bin/true";};' > /etc/apt/apt.conf.d/no-cache-clean && \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + libgl1-mesa-glx \ + libglib2.0-0 \ + libxkbcommon-x11-0 \ + libx11-xcb1 \ + libxcb-glx0 \ + libxcb-keysyms1 + # Copy the requirements file into the container at /app COPY requirements.txt . From 8f256fbbf76b2417531e496a60711965594189fe Mon Sep 17 00:00:00 2001 From: Mohamed Date: Mon, 17 Jun 2024 23:44:51 -0500 Subject: [PATCH 098/124] editing docker file --- Dockerfile | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 1a03a8c..ef2c7fb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,10 +4,12 @@ FROM python:3.9-slim # Set the working directory in the container WORKDIR /app -# Update the apt package list and install necessary libraries for PyQt5 and OpenGL in one RUN command -RUN echo 'DPkg::Post-Invoke {"/bin/true";};' > /etc/apt/apt.conf.d/no-cache-clean && \ - apt-get update && \ - apt-get install -y --no-install-recommends \ +# Install aptitude +RUN apt-get update && apt-get install -y aptitude + +# Update the apt package list and install necessary libraries for PyQt5 and OpenGL using aptitude +RUN aptitude update && \ + aptitude install -y --without-recommends \ libgl1-mesa-glx \ libglib2.0-0 \ libxkbcommon-x11-0 \ From 3a13ecba194f079112e0f9763028bf41ab9a25f3 Mon Sep 17 00:00:00 2001 From: Jagruth Reddy <56351734+jagruthreddy@users.noreply.github.com> Date: Tue, 18 Jun 2024 01:31:43 -0500 Subject: [PATCH 099/124] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 796933d..9eed58f 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,9 @@ VisionAI/ ``` - app.py: The main entry point for the application. +## Demo +![VisionAI](https://i.makeagif.com/media/6-18-2024/MstD_W.gif) + ## Burndown Chart ![Burndown Chart](https://i.ibb.co/9TLgm7g/Sprint-burndown.png) From d77fe53a57cd9bc1422a62dfaae9ea54dfb65ef5 Mon Sep 17 00:00:00 2001 From: Abduraziq <156966725+Abduraziq@users.noreply.github.com> Date: Tue, 18 Jun 2024 09:38:21 +0300 Subject: [PATCH 100/124] Updated requirements.txt --- requirements.txt | 144 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 139 insertions(+), 5 deletions(-) diff --git a/requirements.txt b/requirements.txt index c711e61..f2dc1ac 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,145 @@ -numpy==1.26.4 -Pillow==10.3.0 +babel==2.15.0 +markupsafe==2.1.5 +pyyaml==6.0.1 +qtpy==2.4.1 +send2trash==1.8.3 +anyio==4.3.0 +argon2-cffi==23.1.0 +argon2-cffi-bindings==21.2.0 +arrow==1.3.0 +asttokens==2.4.1 +async-lru==2.0.4 +attrs==23.2.0 +beautifulsoup4==4.12.3 +bleach==6.1.0 +certifi==2024.2.2 +cffi==1.16.0 +charset-normalizer==3.3.2 +colorama==0.4.6 +coloredlogs==15.0.1 +comm==0.2.2 +contourpy==1.2.1 +cycler==0.12.1 +debugpy==1.8.1 +decorator==5.1.1 +defusedxml==0.7.1 +executing==2.0.1 +filelock==3.14.0 +flatbuffers==24.3.25 +fonttools==4.51.0 +fqdn==1.5.1 +fsspec==2024.6.0 +h11==0.14.0 +httpcore==1.0.5 +httpx==0.27.0 +humanfriendly==10.0 +idna==3.7 +intel-openmp==2021.4.0 +ipykernel==6.29.4 +ipython==8.24.0 +ipywidgets==8.1.2 +isoduration==20.11.0 +jedi==0.19.1 +jinja2==3.1.4 +json5==0.9.25 +jsonpointer==2.4 +jsonschema==4.22.0 +jsonschema-specifications==2023.12.1 +jupyter==1.0.0 +jupyter-client==8.6.1 +jupyter-console==6.6.3 +jupyter-core==5.7.2 +jupyter-events==0.10.0 +jupyter-lsp==2.2.5 +jupyter-server==2.14.0 +jupyter-server-terminals==0.5.3 +jupyterlab==4.1.8 +jupyterlab-pygments==0.3.0 +jupyterlab-server==2.27.1 +jupyterlab-widgets==3.0.10 +kiwisolver==1.4.5 +matplotlib==3.8.4 +matplotlib-inline==0.1.7 +mistune==3.0.2 +mkl==2021.4.0 +mpmath==1.3.0 +nbclient==0.10.0 +nbconvert==7.16.4 +nbformat==5.10.4 +nest-asyncio==1.6.0 +networkx==3.3 +notebook==7.1.3 +notebook-shim==0.2.4 +onnx==1.16.1 +onnxruntime==1.18.0 +opencv-python==4.9.0.80 +overrides==7.7.0 +packaging==24.0 +pandas==2.2.2 +pandocfilters==1.5.1 +parso==0.8.4 +pillow==10.3.0 +platformdirs==4.2.1 +prometheus-client==0.20.0 +prompt-toolkit==3.0.43 +protobuf==5.27.1 +psutil==5.9.8 +py-cpuinfo==9.0.0 +pycparser==2.22 +pygments==2.18.0 +pyparsing==3.1.2 +pyreadline3==3.4.1 +python-dateutil==2.9.0.post0 +python-json-logger==2.0.7 +pytz==2024.1 +pywinpty==2.0.13 +pyzmq==26.0.3 +qtconsole==5.5.2 +referencing==0.35.1 +requests==2.31.0 +rfc3339-validator==0.1.4 +rfc3986-validator==0.1.1 +rpds-py==0.18.1 +seaborn==0.13.2 +six==1.16.0 +sniffio==1.3.1 +soupsieve==2.5 +stack-data==0.6.3 +sympy==1.12.1 +terminado==0.18.1 +tinycss2==1.3.0 +torch==2.3.1 +torchvision==0.18.1 +tornado==6.4 +tqdm==4.66.4 +traitlets==5.14.3 +types-python-dateutil==2.9.0.20240316 +typing-extensions==4.12.1 +tzdata==2024.1 +ultralytics==8.2.28 +ultralytics-thop==0.2.7 +uri-template==1.3.0 +urllib3==2.2.1 +webcolors==1.13 pyqt5==5.15.10 pyqt5-qt5==5.15.2 pyqt5-sip==12.13.0 +cv==1.0.0 +fastjsonschema==2.19.1 +iniconfig==2.0.0 +joblib==1.4.2 +numpy==1.26.4 +pluggy==1.5.0 +pure-eval==0.2.2 pytest==8.2.2 pytest-qt==4.4.0 pywin32==306 -onnxruntime==1.18.0 - - +scikit-learn==1.4.2 +scipy==1.13.0 +setuptools==70.0.0 +tbb==2021.12.0 +threadpoolctl==3.5.0 +wcwidth==0.2.13 +webencodings==0.5.1 +websocket-client==1.8.0 +widgetsnbextension==4.0.10 From 2703b8883737cd6fc3b60934923e9f055ab10ec3 Mon Sep 17 00:00:00 2001 From: Abduraziq <156966725+Abduraziq@users.noreply.github.com> Date: Tue, 18 Jun 2024 09:47:33 +0300 Subject: [PATCH 101/124] README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9eed58f..e3dad4e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ![VisionAI Logo](https://i.ibb.co/sq5J35B/Screenshot-2024-06-12-094922.png) -VisionAI is a PyQt5-based application that allows users to organize images using Vision AI or manual methods. The application provides features like selecting folders, navigating through history, sorting folders, viewing single images, opening sub folders, images summary and deleting folders. +VisionAI is a PyQt5-based desktop application for organizing image collections using Vision AI and manual tools. Users can select folders, navigate history, sort folders, view individual images, open subfolders, and delete unwanted folders. VisionAI leverages AI to analyze and categorize images, enhancing the manual organization process and making it efficient to manage large image collections. ## Table of Contents - [Features](#features) From efaffc836eb7d82f328650a8cd983ae0b9768c9f Mon Sep 17 00:00:00 2001 From: Jagruth Reddy <56351734+jagruthreddy@users.noreply.github.com> Date: Tue, 18 Jun 2024 01:57:05 -0500 Subject: [PATCH 102/124] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e3dad4e..1e42094 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ VisionAI is a PyQt5-based desktop application for organizing image collections u - [Testing](#testing) - [Datasets](#datasets) - [Project Structure](#project-structure) +- [Demo](#demo) - [Burndown Chart](#burndown-chart) - [Technologies Used](#technologies-used) - [Contributing](#contributing) @@ -150,7 +151,7 @@ VisionAI/ - app.py: The main entry point for the application. ## Demo -![VisionAI](https://i.makeagif.com/media/6-18-2024/MstD_W.gif) +![Demo](https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExZHAydWU3MnE5dnZ4Njg4eXdzYnBkZDgwMzJnemw0Z3Z0azl1MmN0MCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/Y5rMvrTf8JABxYHAPh/giphy.gif) ## Burndown Chart ![Burndown Chart](https://i.ibb.co/9TLgm7g/Sprint-burndown.png) @@ -178,4 +179,3 @@ This project is licensed under the MIT License. - Special thanks to user "[amaralibey](https://www.kaggle.com/amaralibey)" in kaggle for the datatset. - Special thanks to the contributors and the open-source community for their support. - From 259392f24219d6292228ae28492bba48c5a98143 Mon Sep 17 00:00:00 2001 From: Naga Tharun Date: Tue, 18 Jun 2024 07:49:34 -0500 Subject: [PATCH 103/124] --- .circleci/config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index bdc6433..25232d0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,9 @@ version: 2.1 executors: docker-executor: docker: - - image: docker:20.10.7 + #- image: docker:20.10.7 + - image: cimg/python:3.9-slim + jobs: build_and_push: From 012d3bf6f90eb92c927ccd47952e2f12bdb60378 Mon Sep 17 00:00:00 2001 From: Naga Tharun Date: Tue, 18 Jun 2024 07:51:51 -0500 Subject: [PATCH 104/124] modified .circleci/config.yml file, Dockerfile --- .circleci/config.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 25232d0..fc5967c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,8 +3,7 @@ version: 2.1 executors: docker-executor: docker: - #- image: docker:20.10.7 - - image: cimg/python:3.9-slim + - image: docker:20.10.7 jobs: From 6b4bc1a8eb7a79126d14bf1318291a9bdf15ee37 Mon Sep 17 00:00:00 2001 From: Mohamed Gallai <33098714+mmgallai@users.noreply.github.com> Date: Tue, 18 Jun 2024 09:08:07 -0500 Subject: [PATCH 105/124] Update config.yml --- .circleci/config.yml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index fc5967c..43462a5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,22 +5,31 @@ executors: docker: - image: docker:20.10.7 - jobs: build_and_push: executor: docker-executor steps: + # Set up Docker environment for building images - setup_remote_docker: version: 20.10.7 + + # Check out the code from the repository - checkout + + # Build the Docker image - run: name: Build Docker image - command: docker build -t mgallai/vision_ai:v1 . + command: | + TAG="${CIRCLE_SHA1}" + docker build -t mgallai/vision_ai:${TAG} . + + # Log in to Docker Hub using credentials stored in CircleCI environment variables - run: name: Push Docker image command: | + TAG="${CIRCLE_SHA1}" echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin - docker push mgallai/vision_ai:v1 + docker push mgallai/vision_ai:${TAG} workflows: version: 2 From ce9d59f293a6283152f820898935c42c58734d9e Mon Sep 17 00:00:00 2001 From: Mohamed Gallai <33098714+mmgallai@users.noreply.github.com> Date: Tue, 18 Jun 2024 09:08:44 -0500 Subject: [PATCH 106/124] Update app.py --- app.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app.py b/app.py index 2567d1f..9597e8a 100644 --- a/app.py +++ b/app.py @@ -4,13 +4,18 @@ from view.InitialFolderSelection import InitialFolderSelection if __name__ == "__main__": + print("Starting application...") app = QApplication(sys.argv) + print("Showing initial folder selection dialog...") initial_folder_dialog = InitialFolderSelection() if initial_folder_dialog.exec_() == QDialog.Accepted: + print("Dialog accepted") selected_folder = initial_folder_dialog.selected_folder window = MainWindow(initial_folder=selected_folder) - window.show() + window.show() + print("Showing Main Window...") sys.exit(app.exec_()) else: + print("Dialog canceled") sys.exit(0) From f0ed56fda2201e41972ab86e307c09be0fab1072 Mon Sep 17 00:00:00 2001 From: Mohamed Gallai <33098714+mmgallai@users.noreply.github.com> Date: Tue, 18 Jun 2024 09:09:11 -0500 Subject: [PATCH 107/124] Update Dockerfile --- Dockerfile | 66 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/Dockerfile b/Dockerfile index ef2c7fb..c8d5252 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,36 +1,64 @@ -# Use an official Python runtime as a parent image -FROM python:3.9-slim +# Use a specific version of Miniconda as the base image +FROM continuumio/miniconda3:4.9.2 # Set the working directory in the container WORKDIR /app -# Install aptitude -RUN apt-get update && apt-get install -y aptitude - -# Update the apt package list and install necessary libraries for PyQt5 and OpenGL using aptitude -RUN aptitude update && \ - aptitude install -y --without-recommends \ +# Update repository information and install necessary system libraries and Xvfb +RUN apt-get update --allow-releaseinfo-change && \ + apt-get install -y --no-install-recommends apt-utils && \ + sed -i 's|http://deb.debian.org/debian buster|http://deb.debian.org/debian oldoldstable|g' /etc/apt/sources.list && \ + sed -i 's|http://security.debian.org/debian-security buster/updates|http://security.debian.org/debian-security oldoldstable/updates|g' /etc/apt/sources.list && \ + apt-get update --allow-releaseinfo-change && \ + apt-get install -y \ libgl1-mesa-glx \ libglib2.0-0 \ libxkbcommon-x11-0 \ - libx11-xcb1 \ libxcb-glx0 \ - libxcb-keysyms1 + libxcb-keysyms1 \ + libx11-xcb1 \ + libxrender1 \ + libfontconfig1 \ + libxcomposite1 \ + libxcursor1 \ + libxdamage1 \ + libxtst6 \ + libxi6 \ + libxrandr2 \ + libxss1 \ + libxshmfence1 \ + libxcb-icccm4 \ + libxcb-image0 \ + libxcb-shm0 \ + libxcb-util0 \ + libxcb-xfixes0 \ + libxcb-randr0 \ + libxcb-render-util0 \ + libxcb-xinerama0 \ + xvfb && \ + rm -rf /var/lib/apt/lists/* + +# Set environment variables for Qt +ENV QT_XCB_GL_INTEGRATION=none +ENV QT_DEBUG_PLUGINS=1 -# Copy the requirements file into the container at /app -COPY requirements.txt . +# Copy the environment configuration file +COPY environment.yml . -# Install the dependencies specified in requirements.txt -RUN pip install --no-cache-dir -r requirements.txt +# Create the Conda environment specified in environment.yml +RUN conda env create -f environment.yml + +# Install onnxruntime via pip +RUN conda run -n myenv pip install onnxruntime==1.8.0 + +# Make sure the environment is activated by default +SHELL ["conda", "run", "-n", "myenv", "/bin/bash", "-c"] # Copy the rest of the application code into the container COPY . . -# Make port 80 available to the world outside this container -EXPOSE 80 - # Define environment variable ENV NAME World -# Run app.py when the container launches -CMD ["python", "app.py"] +# Start Xvfb and run the application when the container launches +CMD ["bash", "-c", "xvfb-run -a python app.py"] From 4bc87bf7ea3377e1032a01069d13fbdec0d7f5ea Mon Sep 17 00:00:00 2001 From: Mohamed Gallai <33098714+mmgallai@users.noreply.github.com> Date: Tue, 18 Jun 2024 09:10:46 -0500 Subject: [PATCH 108/124] Create environment.yml --- environment.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 environment.yml diff --git a/environment.yml b/environment.yml new file mode 100644 index 0000000..f4f8151 --- /dev/null +++ b/environment.yml @@ -0,0 +1,15 @@ +name: myenv +channels: + - defaults + - conda-forge +dependencies: + - python=3.9 + - numpy=1.26.4 + - pillow=10.3.0 + - pyqt=5.15.10 + - pytest=6.2.5 + - pytest-qt=3.3.0 + - libxkbcommon + - libxcb + - xorg-libx11 + - pip From 7f294eefb913b7caf775831bf06ef1566d0e3509 Mon Sep 17 00:00:00 2001 From: Naga Tharun Date: Tue, 18 Jun 2024 09:11:24 -0500 Subject: [PATCH 109/124] Updated README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1e42094..8d9d1a0 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ VisionAI is a PyQt5-based desktop application for organizing image collections u - **Vision AI:** Automatically create albums for folders using Vision AI. - **Manual Classification:** Manually create albums for selected images. - **Web Demo:** View a web demo hosted on Hugging Face. +- **Rename Folder:** Rename an album folder with confirmation. - **Delete Folder:** Delete an album folder with confirmation. - **Information Dialog:** View instructions and information about the application. From 8c50d80a0a556c89d1c7d8ec09db43432deac64d Mon Sep 17 00:00:00 2001 From: Mohamed Date: Tue, 18 Jun 2024 09:15:52 -0500 Subject: [PATCH 110/124] edit --- app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app.py b/app.py index 9597e8a..5e4a6c7 100644 --- a/app.py +++ b/app.py @@ -7,6 +7,7 @@ print("Starting application...") app = QApplication(sys.argv) + print("Showing initial folder selection dialog...") initial_folder_dialog = InitialFolderSelection() if initial_folder_dialog.exec_() == QDialog.Accepted: From acbd159583d9a5a151737fd31a1c9134005a371f Mon Sep 17 00:00:00 2001 From: Mohamed Date: Tue, 18 Jun 2024 09:22:15 -0500 Subject: [PATCH 111/124] edit --- .circleci/config.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 43462a5..cfbb9c7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -19,17 +19,17 @@ jobs: # Build the Docker image - run: name: Build Docker image - command: | - TAG="${CIRCLE_SHA1}" - docker build -t mgallai/vision_ai:${TAG} . - + command: docker build -t mgallai/vision_ai:${CIRCLE_SHA1} . + # Log in to Docker Hub using credentials stored in CircleCI environment variables + - run: + name: Log in to Docker Hub + command: echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin + + # Push Docker image - run: name: Push Docker image - command: | - TAG="${CIRCLE_SHA1}" - echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin - docker push mgallai/vision_ai:${TAG} + command: docker push mgallai/vision_ai:${CIRCLE_SHA1} workflows: version: 2 From 70204760446f0bbf496fe882d20f9079d61ea796 Mon Sep 17 00:00:00 2001 From: Naga Tharun Date: Tue, 18 Jun 2024 09:52:23 -0500 Subject: [PATCH 112/124] Updated config.yml --- .circleci/config.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index cfbb9c7..ecf6778 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -19,7 +19,9 @@ jobs: # Build the Docker image - run: name: Build Docker image - command: docker build -t mgallai/vision_ai:${CIRCLE_SHA1} . + #command: docker build -t mgallai/vision_ai:${CIRCLE_SHA1} . + command: docker build -t $DOCKER_USER/vision_ai:${CIRCLE_SHA1} . + # Log in to Docker Hub using credentials stored in CircleCI environment variables - run: @@ -29,7 +31,7 @@ jobs: # Push Docker image - run: name: Push Docker image - command: docker push mgallai/vision_ai:${CIRCLE_SHA1} + command: docker push $DOCKER_USER/vision_ai:${CIRCLE_SHA1} workflows: version: 2 From 01600e131d7bfec8c12b38edbb4f61a8ca3d3518 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Tue, 18 Jun 2024 09:58:27 -0500 Subject: [PATCH 113/124] edit --- app.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app.py b/app.py index 5e4a6c7..9597e8a 100644 --- a/app.py +++ b/app.py @@ -7,7 +7,6 @@ print("Starting application...") app = QApplication(sys.argv) - print("Showing initial folder selection dialog...") initial_folder_dialog = InitialFolderSelection() if initial_folder_dialog.exec_() == QDialog.Accepted: From 8bcbcdca76436ed02811e9d74e238d6776163f28 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Tue, 18 Jun 2024 10:31:21 -0500 Subject: [PATCH 114/124] test --- app.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app.py b/app.py index 5e4a6c7..9597e8a 100644 --- a/app.py +++ b/app.py @@ -7,7 +7,6 @@ print("Starting application...") app = QApplication(sys.argv) - print("Showing initial folder selection dialog...") initial_folder_dialog = InitialFolderSelection() if initial_folder_dialog.exec_() == QDialog.Accepted: From 89a37cf23958990e7d9ae535fc0a7e64752d837c Mon Sep 17 00:00:00 2001 From: Mohamed Date: Tue, 18 Jun 2024 10:35:06 -0500 Subject: [PATCH 115/124] test --- app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app.py b/app.py index 9597e8a..5e4a6c7 100644 --- a/app.py +++ b/app.py @@ -7,6 +7,7 @@ print("Starting application...") app = QApplication(sys.argv) + print("Showing initial folder selection dialog...") initial_folder_dialog = InitialFolderSelection() if initial_folder_dialog.exec_() == QDialog.Accepted: From b9abd02a890e9e5d25ad72b1fd90c054eb4e8174 Mon Sep 17 00:00:00 2001 From: Mohamed Gallai <33098714+mmgallai@users.noreply.github.com> Date: Tue, 18 Jun 2024 10:45:17 -0500 Subject: [PATCH 116/124] Update app.py --- app.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app.py b/app.py index 5e4a6c7..9597e8a 100644 --- a/app.py +++ b/app.py @@ -7,7 +7,6 @@ print("Starting application...") app = QApplication(sys.argv) - print("Showing initial folder selection dialog...") initial_folder_dialog = InitialFolderSelection() if initial_folder_dialog.exec_() == QDialog.Accepted: From 632055938ecd854dd382872da0225bfac0f23f1b Mon Sep 17 00:00:00 2001 From: Naga Tharun Date: Tue, 18 Jun 2024 10:50:20 -0500 Subject: [PATCH 117/124] updated config.yml --- .circleci/config.yml | 116 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 101 insertions(+), 15 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ecf6778..ca42376 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,43 +1,129 @@ +# version: 2.1 + +# executors: +# docker-executor: +# docker: +# - image: docker:20.10.7 + +# jobs: +# build_and_push: +# executor: docker-executor +# steps: +# # Set up Docker environment for building images +# - setup_remote_docker: +# version: 20.10.7 + +# # Check out the code from the repository +# - checkout + +# # Build the Docker image +# - run: +# name: Build Docker image +# #command: docker build -t mgallai/vision_ai:${CIRCLE_SHA1} . +# command: docker build -t $DOCKER_USER/vision_ai:${CIRCLE_SHA1} . + + +# # Log in to Docker Hub using credentials stored in CircleCI environment variables +# - run: +# name: Log in to Docker Hub +# command: echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin + +# # Push Docker image +# - run: +# name: Push Docker image +# command: docker push $DOCKER_USER/vision_ai:${CIRCLE_SHA1} + +# workflows: +# version: 2 +# build_and_push: +# jobs: +# - build_and_push: +# filters: +# branches: +# only: +# - main + + version: 2.1 executors: + python-executor: + docker: + - image: circleci/python:3.10 + environment: + DISPLAY: :99 + docker-executor: docker: - image: docker:20.10.7 jobs: - build_and_push: + + build-and-test: + executor: python-executor + steps: + - checkout + - run: + name: Install dependencies + command: | + sudo apt-get update + sudo apt-get install -y xvfb libxi-dev libxtst-dev xdotool + sudo apt-get install -y xvfb libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-xfixes0 x11-utils + python -m venv venv + . venv/bin/activate + pip install --upgrade pip + pip install -r requirements.txt + pip install pytest-qt + pip install pytest pytest-qt PyQt5 + pip install pytest pytest-xvfb pyautogui + - run: + name: Setup PYTHONPATH + command: | + export PYTHONPATH="$PYTHONPATH:/home/circleci/project" + - run: + name: Run tests + command: | + . venv/bin/activate + xvfb-run -a pytest tests/test_AI_NumberOfOutputs.py -v + xvfb-run -a pytest tests/test_AI_PredictedCity.py -v + xvfb-run -a pytest tests/test_AI_Preprocessing.py -v + xvfb-run -a pytest tests/test_ButtonPanel.py -v + xvfb-run -a pytest tests/test_IconsExist.py -v + xvfb-run -a pytest tests/test_InformationDialog.py -v + xvfb-run -a pytest tests/test_ModelExist.py -v + xvfb-run -a pytest tests/test_SelectMethod.py -v + xvfb-run -a pytest tests/test_sort_button.py -v + - persist_to_workspace: + root: . + paths: + - ./* + + build-and-push: executor: docker-executor steps: - # Set up Docker environment for building images + - checkout - setup_remote_docker: version: 20.10.7 - - # Check out the code from the repository - - checkout - - # Build the Docker image + - attach_workspace: + at: . - run: name: Build Docker image - #command: docker build -t mgallai/vision_ai:${CIRCLE_SHA1} . command: docker build -t $DOCKER_USER/vision_ai:${CIRCLE_SHA1} . - - - # Log in to Docker Hub using credentials stored in CircleCI environment variables - run: name: Log in to Docker Hub command: echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin - - # Push Docker image - run: name: Push Docker image command: docker push $DOCKER_USER/vision_ai:${CIRCLE_SHA1} workflows: version: 2 - build_and_push: + build-test-and-push: jobs: - - build_and_push: + - build-and-test + - build-and-push: + requires: + - build-and-test filters: branches: only: From 456ddf59aa1b998cd6d047b254478a1baf3389fa Mon Sep 17 00:00:00 2001 From: Naga Tharun Date: Tue, 18 Jun 2024 10:51:19 -0500 Subject: [PATCH 118/124] updated config.yml --- controller/__pycache__/AI.cpython-312.pyc | Bin 0 -> 6221 bytes controller/__pycache__/Manual.cpython-312.pyc | Bin 0 -> 9502 bytes controller/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 126 bytes view/__pycache__/ButtonPanel.cpython-312.pyc | Bin 0 -> 7551 bytes view/__pycache__/ButtonStyle.cpython-312.pyc | Bin 0 -> 826 bytes .../CloseConfirmationDialog.cpython-312.pyc | Bin 0 -> 2331 bytes .../DeleteConfirmationDialog.cpython-312.pyc | Bin 0 -> 2337 bytes view/__pycache__/FolderList.cpython-312.pyc | Bin 0 -> 9728 bytes view/__pycache__/FrameSettings.cpython-312.pyc | Bin 0 -> 1607 bytes view/__pycache__/HistoryManager.cpython-312.pyc | Bin 0 -> 4020 bytes view/__pycache__/ImageDisplay.cpython-312.pyc | Bin 0 -> 4191 bytes .../InformationDialog.cpython-312.pyc | Bin 0 -> 3634 bytes .../InitialFolderSelection.cpython-312.pyc | Bin 0 -> 2604 bytes view/__pycache__/MainView.cpython-312.pyc | Bin 0 -> 6788 bytes view/__pycache__/SelectMethod.cpython-312.pyc | Bin 0 -> 4210 bytes view/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 120 bytes 16 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 controller/__pycache__/AI.cpython-312.pyc create mode 100644 controller/__pycache__/Manual.cpython-312.pyc create mode 100644 controller/__pycache__/__init__.cpython-312.pyc create mode 100644 view/__pycache__/ButtonPanel.cpython-312.pyc create mode 100644 view/__pycache__/ButtonStyle.cpython-312.pyc create mode 100644 view/__pycache__/CloseConfirmationDialog.cpython-312.pyc create mode 100644 view/__pycache__/DeleteConfirmationDialog.cpython-312.pyc create mode 100644 view/__pycache__/FolderList.cpython-312.pyc create mode 100644 view/__pycache__/FrameSettings.cpython-312.pyc create mode 100644 view/__pycache__/HistoryManager.cpython-312.pyc create mode 100644 view/__pycache__/ImageDisplay.cpython-312.pyc create mode 100644 view/__pycache__/InformationDialog.cpython-312.pyc create mode 100644 view/__pycache__/InitialFolderSelection.cpython-312.pyc create mode 100644 view/__pycache__/MainView.cpython-312.pyc create mode 100644 view/__pycache__/SelectMethod.cpython-312.pyc create mode 100644 view/__pycache__/__init__.cpython-312.pyc diff --git a/controller/__pycache__/AI.cpython-312.pyc b/controller/__pycache__/AI.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a33d70e66c07507caa46bad0d5c091410a484937 GIT binary patch literal 6221 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 literal 0 HcmV?d00001 diff --git a/controller/__pycache__/Manual.cpython-312.pyc b/controller/__pycache__/Manual.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29b37e7beaa7678f60b06c4a72dc599c71e72fb9 GIT binary patch literal 9502 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 BPqY94 literal 0 HcmV?d00001 diff --git a/controller/__pycache__/__init__.cpython-312.pyc b/controller/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fabdc93076a6baefcb5f06f6b01f58d11c9e93e GIT binary patch literal 126 zcmX@j%ge<81U3?xX(0MBh(HIQS%4zb87dhx8U0o=6fpsLpFwJV$+}v_1O&UpBu*uC&Da}c>D`EwzW(4A55aS~=BO_xGGmr%UxTYEZ literal 0 HcmV?d00001 diff --git a/view/__pycache__/ButtonPanel.cpython-312.pyc b/view/__pycache__/ButtonPanel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..362371a547fd51c5fe3bf77af71e22e6ee7514cb GIT binary patch literal 7551 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 literal 0 HcmV?d00001 diff --git a/view/__pycache__/ButtonStyle.cpython-312.pyc b/view/__pycache__/ButtonStyle.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f711a683a515f626780f40d98bb1c19e7b702942 GIT binary patch literal 826 zcmZuv&2AGh5FYO)B?=p8D-IO`X(diM1o6{D*;X7%D{fIyZ&4)6#7<(dSueJ??Y2VV zkax&4puPwaFHq&m3lwrd>Ir*y^Rom?o*nP^%{Sxm{Ae`lVAjD7?|(-CKkZ?@DupxK zG0p@Wcn=iDK+(06BOOScrrVqI?YBT+_QV_}z@URDbR6bVG=}Sf*{RsL>HWh*YZ0C5 zG-M?aOLNVh*$O6*qNdX(*pyfIi}m3oQNujkzgqmY;71`TlY###zVMX@IrX2tK0e&t zd$aGCcs&scLpvXG&Gt)3Uqrg4_$4zUFXD?b7!yi)Gzk2cYfzrKB?;w;`Y(a>J`JQu zBHAjlYe^y%6Uic7PLtKpCnFxFf&WfK<|affDPI-^uQVbUiZdqvZO2;9c{>&oOR;Yt ztG4ZC!`w6e~PDofFp3+3~-iYa;pt5EnvobRcX+@?PLhz2*##2uqPAxD-u5fSxy64 zUgN7E&uQFREGtyOGM5!+Kt}LRO&GR|CTuIOJEn?t+X@29@hw)#76EE_Z;*`Na!&w0 z5I&Apz}IBUD%>U)FgZ{G1-6L?dVp->A&qE@s0lUxkVfnX4M7t(n~`w~e2!d?pR_Y6PjX8|kna5h3ig z5%P|{jIrmc-Z4H>N!SvRd zOLchJC%bE~dn;|$q2-gOYw+}X-@03eeY+iJ)*ozloU2B5+fQzty8E(!yZzIuv;&h3 zNLT%E<;St_#_I5WpW`p=ufran3Y^@o!#g|hSOa#^2vS72+tv4dvYOmY$s4H`;&$pn zHNFEo8&Ix6`B}QrJ67u*+wL8&!y7)Ex@o|3HF$30gXg19N9*w74oo#*PYw2L#OrWq z_e9TzxS?&I7^=p0U`HT%mT1V=YVx&h`Fb6W`)nFr1NPQn??(Ugp{GN2I2;;^ksN+I z2=nYKIIu@{5M;PX@&=RpYpEt8_cyL6rmd9>irWc}!gf$lAMNxW4Yxf0ehK&i`~(6&G@`fgYLL*FbD5AdRF^&se+V4M{R-~C Y0{35o^lLEqmzd@T*BAZC+t(v&CX`!_n=jEiO1Y^aarXsMcH6weKeYm@$ z+A<2{5U6q}^itx|LLCUC!T(607Yi%MEDbHxm)u(1(%@5Pb~RoFoI{~2nD6&J=6lTJ z8~vP4CjtGQT(?VmG626bhJQ*M>`qhg03d(_6Ien)u*8CBNd?K03$mpY6oKhPGiJpL z@c>IEv=W7c07URHK=M6+6fA5=p}#`18q39BFeaz?@%)sbo6drt%71p*S-GxPoeJ?| z`Rn>THmPu?;w@gT5aQUB`DEWBC-`EX&@mM%XGzt>#V|lPwxfYvmGWQF{4pp92oyvl z)BMmCFteiA;g+ruV4in}==iPh0FZs< z{df(0P1md@YzU!H05wqNtGI6m=sLb)5${m7ArfD)NE~1xA$g;nnE*(NThsubc}FB^ zE=3BJx2^9;HK}}TMfA)wy>N4NFbEU+ z8+(`fdre$l`W$<{IPK&zzT#DuutEJKIp|-Tbit5PYXqU!gltdrWNV_c$((1Le%iPyEk}s{MO9u z)U7WKynO3*{dQ!j>h{oCtNpLF;A_pw_CBOr{_-yP1*Y%E8?blnSQDz-u&V{L4Vc|L zHQIz@0ei9mPi|(dCbR?gL<62!8(8z2aA2qB)Y{Fho-_5>PWQ3Rr(4;#`S(d8DUWY#Hh+yqzWGZ literal 0 HcmV?d00001 diff --git a/view/__pycache__/FolderList.cpython-312.pyc b/view/__pycache__/FolderList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7336594a49c16b9a605c5522a5b090202df3e49e GIT binary patch literal 9728 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 literal 0 HcmV?d00001 diff --git a/view/__pycache__/FrameSettings.cpython-312.pyc b/view/__pycache__/FrameSettings.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5bbb1dbf761a84e7f0222705c7d1f381d95a6b4d GIT binary patch literal 1607 zcmahJO>YxNbY|CU5B3HJ)1>Z_23ruq)->sbOO+x%QgR52Vo?dSinKD`O|(Wk5%Lcb0%CondmfN2ViAkFq(Ti!5tm%4A{%mu%WkZq7)m8>#3_-;46$Ns z#8S4wBZ84=#P!4rM0FaZiZk4?u9OUeHHvW)g`YiN6HW_AxQU= zY|?mkE9xeT~5JBk2r} ztjBJrIzt*<$qrN7EZbt)Crs;toRs$x0s_s#^#29!7J(E|t0O`;x|<)iIvQyUOjN-;>kqxn zgV8x8cn8$=V8tjjo0h7$jEuTgPBX!@c7;;z9hH zQ?+WV9Ge)9X)pu|7wUfPvg5iJOXY8uc&%Qwf+Vo_HrEYzn&Y$thd|KZafuJ08%)c? zb<5@WVPs(6Z+^0WoWV-$O1K?&K?f!}GrU#!snE`hwK8Knnep{RhoyT{{Y&=#@q5RA zKlR5)kF`IwozJFr*;g>~o2iXdo9Qj4|9WzlP400Mk39o<6#HYvWcsoo}V{ zyXg~8wXvT+U!T4`+ffHMXE$csYQClBADnztcvyI%PCVB}?-%YB+S-|xc4kMLSf9Q# z%LgI2IX!{PS%u{`%^+!-m6}y|5m!y~yL!p(NjQF{fpWuz(s3NxF#F#~=%ZH-{K_~U z*Z~jQxkfr;0VpF{g&hb15a1XsK94}=`=`%9^j2!!$oc=#HNGJazaD7fK6o6;fb~3Ry3AEI~4oMtnAPXTStpJgP(w0=Eghu=vT2iFd;@t#0#&%~n zK&&A3z#);4I0C&il`1ue9%wK4)>f_5O6`FSjyBqBPux&)sKljxZ+C5+^*V_-b!0!! z&zrY1^S<|X{AY7>m_QlcnVKM!kiW4}EDP){ixLagApzt7rN&sX?34&};LLeKJ29Q)~1lcr0#U`ueR7%rx zY~~X=D^IE{=|0c4jr9P0*ZS=z%yP3tvIkI15@?mz04s%7W$p|S`LSpJLJJb-pIJj^f2N_5v;@OEUSEe1crN=MgRaGA!}V2rHWE$-Cb?Q^Kyh25nq zyF*>4%yJLiUJf-XJ1&nCk}mu5Wfw^|RyEw}7AyfJ-ja@ZdkEQrrRI%i&5#G&nAm8w zOy?C@S0&d$wo9z$)KwruQc_wzBhOfEZbh2NWfYZ3$y`rP}oV$yDdcANB=L5~&15*?}ZcNw(Hq(=>UwAfUl zA5{8#4BE4hTBe7X0A|+_gr2tv+6Ii+1VM+l=%`^A;KzrRGG7W;fc;MaVXWIbfTv`blV&O!XP7H=!hYPTw8&Rnq}x7 zt3l4^)vRL0Tr{%swbZ1nr*c{8^0cn!vf2X|kuqWkPcr`JVdOA8ACvu0s$mM zTFpp@5$X6gurTu7nQzWKO$!3Z<2=UtO=d#DO-5{ zcFz=OdS<;|t5FRsAR8EahB^$7ObpxH+Q{08k!`~vd<=UH1)5_!Kv+9n@|?t(%uQ!? zC)KfCsM7(WnqI4MGACV@lT(GLhhVoKjcQ+ks6uyvTZ(kA2-{4db4lo2=r)8s%R=W$ zyz}e6`+W<#x$l?(pZMV1C@9?-ogX!Y9z*Cch2w^Byf{@7PFMQ(z+6)pGK8VxXh}F# z=@$(_Ts%+`j#PRM8N#7Q?Iqzj^q9haL)gD8^gVAS!tPqqkqJ8){b$_<;%lO9(ea7VarU<^5s7v_!?&kSd-Y`=Y30XUe{7y&Z-&P+hV}E+eMOcR&ukM z)#5f>&uW+@5{ZO;-Lq#EdOaA_y%_YuRP8hfpduPKqrFD7cX7ao_RU3BVjX7efDt?J zee%(pkNbY;d)j~E=We6_q!Bwg*HXF8B@CJ{>7YRei$j03EYnYG{f2K=JCo^9spmHq z^Uo{L>+@#D7s>^qSF)4eMXVfk7YJ(sbus9~8T!rQbDGsKsp`q=ipbeVtl=%gIYVoE za+={^uBzK|!gHcE8V6yzhQ|pf`OeYD!#@ts>33%5XYY-eyZR0Iw7&I(p8f6o?-zf$ z`0M9Twa;lx4C9}%tbA3KBr7aQS98jA2J3<(eK9R(oDmiQ!z_vdlO5ZGq6dYY67bm% zh;7h;08g8tz)flUK-?m$d?1uq4F^L5t3oIwuC~z7!POnM2!uZ4*1}xq9Ou};nPYG+ nwwVEFyfpoS4m(SHm%R-GwtdW`&jTFC{lg#R&T*>*r9I_8D-+r( literal 0 HcmV?d00001 diff --git a/view/__pycache__/ImageDisplay.cpython-312.pyc b/view/__pycache__/ImageDisplay.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c46062c60b8384b39d99d0a10e8c1211a0c05fd GIT binary patch literal 4191 zcmcInO>7&-6`uVgmm)<;rv9y3f3|Ddiq!fig{|1JVfiPnD_M2`ql|;aio24zTK;%; zRapudxPZ}8s0zt73d?8!yQiqop*rNCwke99n?tsuyTn#Of%fE^VW&l!Q{U`zw6w}5 zzH|t_dGp@enYVA|ee?ED_4RcK+8gbu$uSY3e~~Q&tO${g5%dy%9Lt?^a4&Pm*u(ajOhf%FUu3E9%n#*C3QP3=YVC$&C#Scp-0)u z;KjFq`7!vcq6DL$1Y1OtjKbU%6P&`{MG0QvfC>r^G*CphnMCj!iVIHUt+YI)j--s7 zF3%8$U>?vp1?=e=s+P>%nNgZp&|nw06K1#&lDF7;6#l znQB_4jaJJ&eyy_Q1>S6;+HK#2yr9LX)bH~=^%D+-ptblK%2ln|N@adu^)#n-_;SkS z1%-tlr|@f)*uXkS+fDU;??=qF=<+p`)Amr#@3kJEr(8`xAng^FraXh-KnF&jF2fFE zl3Gv6RzD^2drF4!CMS~ART)c=dyw*&XfSyJO!m?V7)e=I6$~haoQChJYVM4YQ=VsGhyXlbCbZGVLdhDYK`}K>~>lZ)ivoFckC3&-Hq8Qj}Y`rfQ zg|b+`)UeR75-5q?z}sS{C3b#r_|d6{r%K|%ve;5dY~k^()!xycXVJ3`3gW8o|dM%|~#9S?tgA_t?e#JSqqUUSSIX_y_aC2zvLo zFuQ1y6W}(j2DE6~fI_Xv9g`Q=D)&+$WNw2?K14yG7MuVSaOO6UXzl)dl&jKqQkmax zgIt~Y4JxHED1`H2t(!{yK3_*Y0%!?qy}pKWRcrQ9ncr7E&1w65Ipy-|k6!6hG5 z_<7h5h;L94rVl_$FpD3#@eWipfyIw`0)*eBbNKxZAcUuPHtpa}30xNgHDtAXh1#bY z2*HP1D-8YjZ2rk4@R?*8_!szD6c3KZ`FVaYmze^p<)-EZpeh+mq;oF3VzS}5jS#Zo zm|PU`c1*U{hgOHp8ctA88K#oLfJ@m~QfR0d#h6V2obfKG@me;OaX}c9JH$m`OzsLy zPJ;`wm|PQ>90S}#2-$8-cGX2t+)p@2DCD%y8jyyI6Lcb$*fM{mxwWmJtm>WaUcc(Mh{@CVYZE8Xl12j z7A}B{Y0U4fiL^VcNGy%haCLnh*!J!H@Zc{GuD-L`cl)7{_#dwS=KAlxZ=W2q zPL6$g<<^sv_-D61Z8eHvAmwO7k@HCBzUQbe)KR>&)v^0g+rzd;T@Sk+Pp_ZY>^KFo zmadh=X3GJ)Wyoq7TIbfUecWfCxNM!c{KG!X3J#p{8n@4{fotOAbpibD0T3i2iK&FyPoz!C>m-+3Y)|M&A=)MhdU0oLE| zJs;x#*vA7+l5&7HQs9*4Mgb=(BF!wqss0d}YtSJ~qta(j2MX*ijEdf;)3s zaMRccnDVrG20qm)UnOBh)m2ly4C#*Jte4$<%2d+^*|(k^x9D;4Xujj6%&V>f2f@_% zArMHn=&q&dg=sr_z=|HQqeE77$c`SfqQ^F)-`VK>b9A^IYkM$!Z`h8#X2o8!V@Ivn zQ9Cwl#fCS|Y{pI%N6HPcrS}%zTP&0tn;(Slh40tfjd80nUTQq_EQmn)zh{3E9d@gg zxJW+3GNc@ooH|KLXO$VK)FdY&Nw;QX-P5?=O_*F5_&6a1bDjFiw^vftbxDddco#?w za_CQcksx0om=IDG7zAg&xQjk#Ibr|vx;o)B^Sr%TIPtFmUKns)aZTf4r{T)nxOr@F zyi&3nnB!bUIX}P*ED!$^LFdl!ABL4XLjV8( literal 0 HcmV?d00001 diff --git a/view/__pycache__/InformationDialog.cpython-312.pyc b/view/__pycache__/InformationDialog.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79bc54a046171fe45766696273c5654fbb7c89f6 GIT binary patch literal 3634 zcma(UU2ogg^-|UcCHW&x(JYad^ft1iC{46AUANT^y46XXWlLNOcA7#nMo{FHM2F?QSC_8SV0k2+|V+csbeyJj|GPF!YBD+>=r!!r zbA1jGq^F)bH5%>rziZF;;RqV8Ri6|8T12VK(Jols;|}LfMil+;Fst}fgkSr51ogjr zT`-anSU!yNnf{pwT6-~q`d`rNY=0F&PjTW0%a)fP6m1De~M*xV^)E|>74x^C2iUVwQ6EUh;%sK+U5;SGZ~u=_Ft>eQ{8+! zWeFsTMRj80CSk!1V{4#2q|OFqB7_%lgF2k(7+mxNw_X=sTTnF;#Cc^{-WcFZ*wV$y)CJqF~j*n zu%b-A%hV=F)%9?+VB*^J)AXJaRx=aVpg##ihoY033Q4OtV%qRiK_LF{O*_d z`t0h`^0n1jP9>jl?1RL!I&DGadPyC!c%B z|M1Rl-)YOQ9A#{OV1FF@>-b;B_vO=V`NqG5r9$Q-`GrGp2hzIZnShaSkZ||mf8hn= zTn`srf@=bMXESLTu02h61@l#-qiZT;g`;+RrYCxTsH?omf@#+c>d!(M>b*4bxs_GpE?1ayuHFG$_o`GeerPVS1A zyK<0wy_37{<*py(ZakO}!B6j`fAx*d@w|6De{g)}kMTceKFsWmek6J4U-OQ?_R;q` zbGN*?TL*KC`{g^G@~T%}Jt+TVzp8m<&70F6$vP7QQ&CzhCPkyMRf|BQ$tVgmY}XX< zsG|H7#)=RV6kTA2Kh~{TjhLpQ6eV_6=qz&R`=PBOm`uDxrZ^%fU))EZ#qtUK`46QS z{4WYb2Na9NtUs~TD)U!MW$19?PmaSx@&#Qi=w3l*3d1uRQC_8tg#G52XcMJ@ze7Re z3V45rLOH_!U&>cPyIyDCfu&H^5g~apB1zIe(Va)=&L?Q<6LkJR@$(Xqc2l1r@eLUK E54~B8D*ylh literal 0 HcmV?d00001 diff --git a/view/__pycache__/InitialFolderSelection.cpython-312.pyc b/view/__pycache__/InitialFolderSelection.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89bd4e79f2c9c8783c06eafe12f01e2a312f1501 GIT binary patch literal 2604 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 uEsu$h&& Date: Tue, 18 Jun 2024 10:52:51 -0500 Subject: [PATCH 119/124] Update app.py --- app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app.py b/app.py index 9597e8a..ccdb9bf 100644 --- a/app.py +++ b/app.py @@ -6,6 +6,7 @@ if __name__ == "__main__": print("Starting application...") app = QApplication(sys.argv) + print("Showing initial folder selection dialog...") initial_folder_dialog = InitialFolderSelection() From 26e613c1dbe2605a098a99c4daa24437f853830c Mon Sep 17 00:00:00 2001 From: Mohamed Gallai <33098714+mmgallai@users.noreply.github.com> Date: Tue, 18 Jun 2024 10:55:23 -0500 Subject: [PATCH 120/124] Update app.py --- app.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app.py b/app.py index ccdb9bf..9597e8a 100644 --- a/app.py +++ b/app.py @@ -6,7 +6,6 @@ if __name__ == "__main__": print("Starting application...") app = QApplication(sys.argv) - print("Showing initial folder selection dialog...") initial_folder_dialog = InitialFolderSelection() From 48e4786abece73f16eaa4b673d7fb7a23b5299d7 Mon Sep 17 00:00:00 2001 From: nagatharun <47985741+nagatharun@users.noreply.github.com> Date: Tue, 18 Jun 2024 11:05:00 -0500 Subject: [PATCH 121/124] Update config.yml --- .circleci/config.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ca42376..ed5b977 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -43,7 +43,6 @@ # only: # - main - version: 2.1 executors: From e408d3860fbe90acda0d4b5d5bd8495c0c13163c Mon Sep 17 00:00:00 2001 From: nagatharun <47985741+nagatharun@users.noreply.github.com> Date: Tue, 18 Jun 2024 11:10:28 -0500 Subject: [PATCH 122/124] Update requirements.txt --- requirements.txt | 147 +++-------------------------------------------- 1 file changed, 7 insertions(+), 140 deletions(-) diff --git a/requirements.txt b/requirements.txt index f2dc1ac..2dfd430 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,145 +1,12 @@ -babel==2.15.0 -markupsafe==2.1.5 -pyyaml==6.0.1 -qtpy==2.4.1 -send2trash==1.8.3 -anyio==4.3.0 -argon2-cffi==23.1.0 -argon2-cffi-bindings==21.2.0 -arrow==1.3.0 -asttokens==2.4.1 -async-lru==2.0.4 -attrs==23.2.0 -beautifulsoup4==4.12.3 -bleach==6.1.0 -certifi==2024.2.2 -cffi==1.16.0 -charset-normalizer==3.3.2 -colorama==0.4.6 -coloredlogs==15.0.1 -comm==0.2.2 -contourpy==1.2.1 -cycler==0.12.1 -debugpy==1.8.1 -decorator==5.1.1 -defusedxml==0.7.1 -executing==2.0.1 -filelock==3.14.0 -flatbuffers==24.3.25 -fonttools==4.51.0 -fqdn==1.5.1 -fsspec==2024.6.0 -h11==0.14.0 -httpcore==1.0.5 -httpx==0.27.0 -humanfriendly==10.0 -idna==3.7 -intel-openmp==2021.4.0 -ipykernel==6.29.4 -ipython==8.24.0 -ipywidgets==8.1.2 -isoduration==20.11.0 -jedi==0.19.1 -jinja2==3.1.4 -json5==0.9.25 -jsonpointer==2.4 -jsonschema==4.22.0 -jsonschema-specifications==2023.12.1 -jupyter==1.0.0 -jupyter-client==8.6.1 -jupyter-console==6.6.3 -jupyter-core==5.7.2 -jupyter-events==0.10.0 -jupyter-lsp==2.2.5 -jupyter-server==2.14.0 -jupyter-server-terminals==0.5.3 -jupyterlab==4.1.8 -jupyterlab-pygments==0.3.0 -jupyterlab-server==2.27.1 -jupyterlab-widgets==3.0.10 -kiwisolver==1.4.5 -matplotlib==3.8.4 -matplotlib-inline==0.1.7 -mistune==3.0.2 -mkl==2021.4.0 -mpmath==1.3.0 -nbclient==0.10.0 -nbconvert==7.16.4 -nbformat==5.10.4 -nest-asyncio==1.6.0 -networkx==3.3 -notebook==7.1.3 -notebook-shim==0.2.4 -onnx==1.16.1 -onnxruntime==1.18.0 -opencv-python==4.9.0.80 -overrides==7.7.0 -packaging==24.0 -pandas==2.2.2 -pandocfilters==1.5.1 -parso==0.8.4 -pillow==10.3.0 -platformdirs==4.2.1 -prometheus-client==0.20.0 -prompt-toolkit==3.0.43 -protobuf==5.27.1 -psutil==5.9.8 -py-cpuinfo==9.0.0 -pycparser==2.22 -pygments==2.18.0 -pyparsing==3.1.2 -pyreadline3==3.4.1 -python-dateutil==2.9.0.post0 -python-json-logger==2.0.7 -pytz==2024.1 -pywinpty==2.0.13 -pyzmq==26.0.3 -qtconsole==5.5.2 -referencing==0.35.1 -requests==2.31.0 -rfc3339-validator==0.1.4 -rfc3986-validator==0.1.1 -rpds-py==0.18.1 -seaborn==0.13.2 -six==1.16.0 -sniffio==1.3.1 -soupsieve==2.5 -stack-data==0.6.3 -sympy==1.12.1 -terminado==0.18.1 -tinycss2==1.3.0 -torch==2.3.1 -torchvision==0.18.1 -tornado==6.4 -tqdm==4.66.4 -traitlets==5.14.3 -types-python-dateutil==2.9.0.20240316 -typing-extensions==4.12.1 -tzdata==2024.1 -ultralytics==8.2.28 -ultralytics-thop==0.2.7 -uri-template==1.3.0 -urllib3==2.2.1 -webcolors==1.13 +numpy==1.26.4 +Pillow==10.3.0 pyqt5==5.15.10 pyqt5-qt5==5.15.2 pyqt5-sip==12.13.0 -cv==1.0.0 -fastjsonschema==2.19.1 -iniconfig==2.0.0 -joblib==1.4.2 -numpy==1.26.4 -pluggy==1.5.0 -pure-eval==0.2.2 pytest==8.2.2 pytest-qt==4.4.0 -pywin32==306 -scikit-learn==1.4.2 -scipy==1.13.0 -setuptools==70.0.0 -tbb==2021.12.0 -threadpoolctl==3.5.0 -wcwidth==0.2.13 -webencodings==0.5.1 -websocket-client==1.8.0 -widgetsnbextension==4.0.10 + +# Windows-specific dependency +pywin32==306; sys_platform == 'win32' + +onnxruntime==1.18.0 From 8c6408409ea2a0102be2b585811a0bd73b4aee3a Mon Sep 17 00:00:00 2001 From: Jagruth Reddy <56351734+jagruthreddy@users.noreply.github.com> Date: Tue, 18 Jun 2024 11:47:12 -0500 Subject: [PATCH 123/124] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d9d1a0..55edf22 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,10 @@ VisionAI/ ![Demo](https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExZHAydWU3MnE5dnZ4Njg4eXdzYnBkZDgwMzJnemw0Z3Z0azl1MmN0MCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/Y5rMvrTf8JABxYHAPh/giphy.gif) ## Burndown Chart -![Burndown Chart](https://i.ibb.co/9TLgm7g/Sprint-burndown.png) +**Sprint 2:** +![Burndown Chart 2](https://i.ibb.co/9TLgm7g/Sprint-burndown.png) +**Sprint 3:** +![Burndown Chart 3](https://i.ibb.co/gJ35qW9/Screenshot-2024-06-18-114417.png) ## Technologies Used - Python **Python**: The primary programming language used for this project. From d1625661397302afd670d26db79317bb4bc27dd6 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Tue, 18 Jun 2024 19:54:10 -0500 Subject: [PATCH 124/124] test --- app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app.py b/app.py index 9597e8a..5e4a6c7 100644 --- a/app.py +++ b/app.py @@ -7,6 +7,7 @@ print("Starting application...") app = QApplication(sys.argv) + print("Showing initial folder selection dialog...") initial_folder_dialog = InitialFolderSelection() if initial_folder_dialog.exec_() == QDialog.Accepted: