From f69c3008c853147a0fca2e8d8643d1960c5e1c61 Mon Sep 17 00:00:00 2001 From: zrg <674148718@qq.com> Date: Tue, 21 Dec 2021 16:16:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BD=8D=E6=9C=BA=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=86=E8=B0=83=E8=AF=95=E6=A8=A1=E5=BC=8F=EF=BC=8C=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E6=98=BE=E7=A4=BA=E5=8E=9F=E5=A7=8B=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E3=80=82=E6=9B=B4=E6=96=B0=E4=BA=86=E7=89=A9?= =?UTF-8?q?=E6=96=99=E6=B8=85=E5=8D=95=E9=87=8C=E9=9D=A2=E7=9A=84=E7=94=B5?= =?UTF-8?q?=E6=9C=BA=E8=B4=AD=E4=B9=B0=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arduino/main/main.ino | 31 +++++--- .../gui/__pycache__/main_ui.cpython-37.pyc | Bin 10326 -> 10542 bytes python_gui/gui/main.py | 70 ++++++++++++++---- python_gui/gui/main_ui.py | 8 ++ python_gui/gui/main_ui.ui | 17 ++++- 物料清单.xlsx | Bin 16319 -> 16381 bytes 6 files changed, 98 insertions(+), 28 deletions(-) diff --git a/arduino/main/main.ino b/arduino/main/main.ino index 8d9684c..b21f457 100644 --- a/arduino/main/main.ino +++ b/arduino/main/main.ino @@ -135,10 +135,14 @@ void setup() { ESP.restart(); } // eeprom 读取 - -float nan = EEPROM.readFloat(0); -if(isnan(nan)) +int k,j; +j = 0; +for(k=0;k<=24;k=k+4) +{ + float nan = EEPROM.readFloat(k); + if(isnan(nan)) { + j = 1; Serial.println("frist write"); EEPROM.writeFloat(0, target_angle); delay(10);EEPROM.commit(); EEPROM.writeFloat(4, swing_up_voltage); delay(10);EEPROM.commit(); @@ -148,8 +152,9 @@ if(isnan(nan)) EEPROM.writeFloat(20, v_p_2); delay(10);EEPROM.commit(); EEPROM.writeFloat(24, v_i_2); delay(10);EEPROM.commit(); } - else - { +} +if(j == 0) +{ target_angle = EEPROM.readFloat(0); swing_up_voltage = EEPROM.readFloat(4); swing_up_angle = EEPROM.readFloat(8); @@ -159,7 +164,7 @@ if(isnan(nan)) v_i_2 = EEPROM.readFloat(24); motor.PID_velocity.P = v_p_1; motor.PID_velocity.I = v_i_1; - } +} //命令设置 comm.add("TA",do_TA); comm.add("START",do_START); @@ -364,12 +369,14 @@ if (abs(pendulum_angle) < swing_up_angle) // if angle small enough stabilize 0.5 Serial.print(pitch);Serial.print("\t"); Serial.print(kalAngleZ);Serial.print("\t"); -// Serial.print(target_voltage);Serial.print("\t"); -//// Serial.print(target_velocity);Serial.print("\t"); -// Serial.print(motor.shaft_velocity);Serial.print("\t"); -// Serial.print(target_angle);Serial.print("\t"); -// Serial.print(pendulum_angle);Serial.print("\t"); -// Serial.print(gyroZrate);Serial.print("\t"); + Serial.print(target_voltage);Serial.print("\t"); +// Serial.print(target_velocity);Serial.print("\t"); + Serial.print(motor.shaft_velocity);Serial.print("\t"); + Serial.print(motor.voltage.q);Serial.print("\t"); + + Serial.print(target_angle);Serial.print("\t"); + Serial.print(pendulum_angle);Serial.print("\t"); + Serial.print(gyroZrate);Serial.print("\t"); Serial.print("\r\n"); #endif // motor.move(target_velocity); diff --git a/python_gui/gui/__pycache__/main_ui.cpython-37.pyc b/python_gui/gui/__pycache__/main_ui.cpython-37.pyc index ee35059224e63fb4f75f03601c58cc8c33547b9f..15fecf559cfe63336dd5bf37d14f3d0233d16c09 100644 GIT binary patch literal 10542 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 diff --git a/python_gui/gui/main.py b/python_gui/gui/main.py index d88aae5..20ba125 100644 --- a/python_gui/gui/main.py +++ b/python_gui/gui/main.py @@ -1,5 +1,6 @@ import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox +from PyQt5.QtGui import QTextCursor from main_ui import * from wifi_udp import * import threading #引入并行 @@ -7,12 +8,13 @@ import numpy as np import pyqtgraph as pg import re from sharedcomponets import GUIToolKit +import copy class MyWindow(QMainWindow, Ui_MainWindow): signalColors = [GUIToolKit.RED_COLOR, GUIToolKit.BLUE_COLOR, GUIToolKit.PURPLE_COLOR, GUIToolKit.YELLOW_COLOR, GUIToolKit.MAROON_COLOR, GUIToolKit.ORANGE_COLOR, GUIToolKit.GREEN_COLOR] signalIcons = ['reddot', 'bluedot', 'purpledot', 'yellowdot', 'maroondot', 'orangedot', 'greendot'] - + textColors = ['FF5C5C','398AD9','5BEC8D','FD42AC','FF33FF','4B8200','DE87B8'] def __init__(self, parent=None): super(MyWindow, self).__init__(parent) self.setupUi(self) @@ -23,8 +25,6 @@ class MyWindow(QMainWindow, Ui_MainWindow): # self.CreateItems() # 设置信号与槽 self.CreateSignalSlot() - - # 设置信号与槽 def CreateSignalSlot(self): self.horizontalSlider_1.valueChanged.connect(self.horizontalSlider_1_valueChanged) @@ -41,6 +41,25 @@ class MyWindow(QMainWindow, Ui_MainWindow): self.VI1_pushButton.clicked.connect(self.VI1_pushButton_clicked) self.VP2_pushButton.clicked.connect(self.VP2_pushButton_clicked) self.VI2_pushButton.clicked.connect(self.VI2_pushButton_clicked) + + self.raw_pushButton.clicked.connect(self.raw_pushButton_clicked) + self.wave_pushButton.clicked.connect(self.wave_pushButton_clicked) + def raw_pushButton_clicked(self): + self.change_state = 1 + self.stackedWidget.setCurrentIndex(1) + # for i in range(self.gridLayout.count()): + # self.gridLayout.removeWidget(self.gridLayout.itemAt(i).widget()) + # self.gridLayout.addWidget(self.raw_line) + + def wave_pushButton_clicked(self): + self.change_state = 0 + self.stackedWidget.setCurrentIndex(0) + # for i in range(self.gridLayout.count()): + # self.gridLayout.removeWidget(self.gridLayout.itemAt(i).widget()) + # + # + # self.gridLayout.addWidget(self.plotWidget) + # 设置实例 def CreateItems(self): # 定时器-绘图刷新 @@ -54,7 +73,9 @@ class MyWindow(QMainWindow, Ui_MainWindow): # wifi变量 self.wifi_recv_flag = 0 self.close_flag = 1 + self.change_state = 0 self.re_item = [] + self.raw_roll = 0 def plot_init(self): # 绘图对象 pg.setConfigOptions(antialias=True) @@ -81,8 +102,16 @@ class MyWindow(QMainWindow, Ui_MainWindow): self.signalPlotFlags.append(True) # add callback checkBox.stateChanged.connect(self.signalPlotFlagUpdate) - self.gridLayout.addWidget(self.plotWidget) + self.stackedWidget = QtWidgets.QStackedWidget() + self.gridLayout.addWidget(self.stackedWidget) + self.raw_line = QtWidgets.QTextEdit() + self.raw_line.setStyleSheet('background: rgb(0, 0, 0)') + self.stackedWidget.addWidget(self.plotWidget) + self.stackedWidget.addWidget(self.raw_line) self.tool_layout.addWidget(self.controlPlotWidget) + + + # checkbox def signalPlotFlagUpdate(self): for i, (checkBox, plotFlag) in enumerate(zip(self.controlPlotWidget.signalCheckBox, self.signalPlotFlags)): @@ -178,24 +207,32 @@ class MyWindow(QMainWindow, Ui_MainWindow): recv_data = recv_data.split(',') """处理接受的信息""" # print(recv_data) + self.re_text = '' for i, data in enumerate(recv_data): if self.signalPlotFlags[i]: - self.re_item.append(''.join(re.split(r'[^A-Za-z]', data))) + # self.re_item.append(''.join(re.split(r'[^A-Za-z]', data))) data = data.replace(self.re_item[i],'') - - self.signalDataArrays[i] = np.roll(self.signalDataArrays[i], -1) - self.signalDataArrays[i][-1] = data - + if self.change_state: + self.re_text += '{0}\t'.format(data,self.textColors[i]) + else: + self.signalDataArrays[i] = np.roll(self.signalDataArrays[i], -1) + self.signalDataArrays[i][-1] = data def update_plot(self): if self.wifi_recv_flag: - for i, plotFlag in enumerate(self.signalPlotFlags): - if plotFlag: - self.signalPlots[i].setData(self.timeArray, self.signalDataArrays[i]) - self.signalPlots[i].updateItems() - self.signalPlots[i].sigPlotChanged.emit(self.signalPlots[i]) + if self.change_state: + self.raw_line.append(self.re_text) + if self.raw_roll: + self.raw_line.moveCursor(QTextCursor.End) + else: + for i, plotFlag in enumerate(self.signalPlotFlags): + if plotFlag: + self.signalPlots[i].setData(self.timeArray, self.signalDataArrays[i]) + self.signalPlots[i].updateItems() + self.signalPlots[i].sigPlotChanged.emit(self.signalPlots[i]) def closeEvent(self, a0: QtGui.QCloseEvent) -> None: print("关闭") + self.udp.send_message('START') self.close_flag = 0 self.udp.udpClientSocket.close() @@ -247,7 +284,10 @@ class ControlPlotPanel(QtWidgets.QWidget): self.signalCheckBox.append(checkBox) self.horizontalLayout1.addWidget(checkBox) def zoomAllPlot(self): - self.controlledPlot.plotWidget.enableAutoRange() + if self.controlledPlot.change_state: + self.controlledPlot.raw_roll = ~self.controlledPlot.raw_roll + else: + self.controlledPlot.plotWidget.enableAutoRange() def wifi_recv_open_pushButton_clicked(self): if self.controlledPlot.wifi_recv_flag == 0: # 打开wifi接收 diff --git a/python_gui/gui/main_ui.py b/python_gui/gui/main_ui.py index 0c92d07..5929b95 100644 --- a/python_gui/gui/main_ui.py +++ b/python_gui/gui/main_ui.py @@ -54,6 +54,12 @@ class Ui_MainWindow(object): self.tool_layout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_6) self.tool_layout_2.setContentsMargins(0, 0, 0, 0) self.tool_layout_2.setObjectName("tool_layout_2") + self.wave_pushButton = QtWidgets.QPushButton(self.horizontalLayoutWidget_6) + self.wave_pushButton.setObjectName("wave_pushButton") + self.tool_layout_2.addWidget(self.wave_pushButton) + self.raw_pushButton = QtWidgets.QPushButton(self.horizontalLayoutWidget_6) + self.raw_pushButton.setObjectName("raw_pushButton") + self.tool_layout_2.addWidget(self.raw_pushButton) self.groupBox_3 = QtWidgets.QGroupBox(self.centralwidget) self.groupBox_3.setGeometry(QtCore.QRect(10, 10, 291, 381)) self.groupBox_3.setObjectName("groupBox_3") @@ -354,6 +360,8 @@ class Ui_MainWindow(object): self.wifi_IP_lineEdit.setText(_translate("MainWindow", "192.168.4.2")) self.wifi_config_pushButton.setText(_translate("MainWindow", "设置")) self.groupBox_2.setTitle(_translate("MainWindow", "可视化图表")) + self.wave_pushButton.setText(_translate("MainWindow", "波形图")) + self.raw_pushButton.setText(_translate("MainWindow", "原始数据")) self.groupBox_3.setTitle(_translate("MainWindow", "command命令")) self.wifi_command_pushButton_1.setText(_translate("MainWindow", "发送")) self.wifi_command_pushButton_2.setText(_translate("MainWindow", "发送")) diff --git a/python_gui/gui/main_ui.ui b/python_gui/gui/main_ui.ui index 11123cc..ed57e99 100644 --- a/python_gui/gui/main_ui.ui +++ b/python_gui/gui/main_ui.ui @@ -99,7 +99,22 @@ 31 - + + + + + 波形图 + + + + + + + 原始数据 + + + + diff --git a/物料清单.xlsx b/物料清单.xlsx index 94c46502f43a69f2f3613b21c04a543870aca33a..fdf5b1a3ae00c88d08778838be1b48d29d7ce64c 100644 GIT binary patch delta 8349 zcmZ9Rbx@o^v#)^w0d|oP+}(pM!JPn$LxQ`zy98c>L-57jg0r|=aQ6fa1a}R=?d05h z>N~e?|1mXF)!kL|o9?NadAflopyoF!itJLcqBCq8l?hOwSb>;rvTa?Yq0ZvY+Pl`{ z;OWKwTufmdOGh7DOX=-h!^f~#dabSNtH$J?TYO^n7n<`s`{S(rM6~&Vc5av3WJzJ4 z)z@;K(^6~VYN@xBRC9SAqY%yCA-k8C{Uqr!ta8~2i3>bDXEt`CLic}ReFB8d3t7KO z5LBD{UK=XRP(UcV4=VbtI~ z0R@}!Ie0|tFNaTBmo(#`W&2MpEDk54=NLY6?Ug0cMn*T8j&X7q)9pZaWxZQ@_ zOt=UkKnf6j!;Fk->G) zUm`0X-=}mV_U#wWa6%RA=mXb9-c0DZxs4b0WhMVDNQFye?1Da)DJB=IC2CG`GuRMh zND=)JSXB(vDzGbvO*Z!UMcrHM-;i=y7KpeV@KK({mgXR70k^2B=()CTc5yB!I3fme z?=b`*ht|KsMe@p{w-JZ0e4+srzO}F(?D?8iq7}1lG^1XAL#S6r`#|!7-Ah~cX9d;B zPxR>_JmA&4HJLl@}Cw+gPWH^Pc6$L74j7yZE%g7}DCz5>KUpN2BQYzsrQ zV*~Y(?+0_t@^wOfjd1>XqV`3ZL=%Gw9GKSv<3&MON`$jbR`*$Kngr27u@pDMTRb+Vd?02kg>tn_Y&{sf2v6Voyr9L<9eXYEPb&3S}0^(bUrKPzK(RG`rl&L}?_bm0_RPogEgBzF&F+crMis(rD5r{|55X5i`1)>-!xct9KY zsX}f$?ULt-JCvSsew`uqyF1|aIz0TW%g6i1(hd`^>WW0R1ZXsoAN{LNR6e&(8=X~q zAH=>b$LfKdVZKh}Ib$9%$X?{Su5)UAtWE2+uKkJ6({jz3V2Vb?LUR?=^P)z6HG`%} z7;CD7Lp_Be=d_U_Sm^UXH@*NX2=lXP^N7qEljN(seFlC+;@AXy=`K4T7w+>g{+!7U zb1BW%T(Mf-82io)+@+p;%{`sCS3eoXmafd#RM;RLZnnYo+5`Tr_rFCI*(vTeMvfm3 zxo7U4Wk32)t5KneZ~Y6q))m@`MLe=Uj`QUs`>hz2gmPUO9vu zvf_rnLC@POCwOY3`Q0s|gn>&mcAw!<9v(&36F)TY;C0zKOFD^A*=#aru2d)aTM}MBV&6W)jWD0L^ssR#MoFQXUMq+I)gyBT4Io$ zg}Rv(-Q3LH%DI)h3~_h7<5oB5ZHaoHato57+Q^E2R6U5b73eK?3fUn{Q%GfRE`Sf8 z?Yk>Y4?0G``+QEYb;j+!;Crf}kYq%Cju=yMk=!>uCEX7X?DTn$&8F8W{`wbER6m{b zQ|m|DEnd;B610RtCuitj)nbqAep?h<3G?+WNA>0|lLQAz^`2EHs*OSy|2ASpp}FdE<;bQA=(`(KM2T{)t|+K&dNzBLE0T5&Es z3!a4uZ3%wq=W%!~Q>P`&x06iP&gz?5HUo$VXJ&z+#JuU7%s*08Qw`oRrU}&C4xazy z8t;uxI|&&^KWd=wKeiPh36hA+n`mO0wj>B<8%ImuFt?5~mU;Ux)kFvX!x%(;(JsQ+ zOdgvn868qtDHHBq@-DwOPzIxeTpo3$maCZOYkrDjh(mimx4AI)hltAXautgEAgNWC zc)BRZIRLKYQTPRdI%EWA8U;0yMbY(H70#TvO!5w<$QWeI#*`q052Q&Jf(C-tTZG-6 z;SfK&Qh3Sr**GOaeG(2F5ko`G9UB<~0YOIq)(s{GxY@lO?6Y7BaVu0fLubkN^djaN`jBoh;YIE{6&e&9MhDR<(Gr zXyo(u+TJ`B7jy$ZVL`Y@+P^u={7U!H+5GiCKl6xL*Ef;}(n9wgq=ojvxWVtv#JNcK z5q*ULn?|+qjahq1AtK`mZ@Cf9$O2(?#lL?QnI=TQt4%?D^}9kSokCJz=q_i#N@S0r zb=2?RPviDpeIa)5sZ8G$IhVYVkKEiDD_#hzqTlt8h769(7%SA25b|w3$1u{j%xE^V zi@SQq-tj(#pHrJZ%C}9tuq$STqF(m`>!d8eoi_C1@2LEm@xg18JN(_;u_U1x^}j|r zRw{A^DvT9^ag0m$jTvmItopliCDz2UF634(2c~Oik0!bJT+^EF#HqjQBEr7jG3ALN zVO?h{bx@KslX*7pAnf^?`f|xo`pVk#tfg2es(gty(--}3*(sv z>ayL%t~OXBl=fR1vW_;omMN;h|amXTZyE;@gjw9T12#D!l&$Pe` zq*d|m*w`&U8QC&cH`#-2JD&cX=l?WnlAeLnFB$M7>tLrW!By3FUR61-wtXWa_!rS{ z()L9s-PJ`htgifmzwVjQhT8RkNp`Q{S2ER1yvpdHX-yKXms!46QueOznNjFyA@YIdDLHY0Ar088|TE{XG8iaQUq)hXUvl z7U_Bla!3BC2UVep2?Zn1>JBeSE&q^YN2Vd*#)Vo^Yaxxi+a~>jN5Bodff7^2K}f$O zvPC7LbgI_HBYr*NT~SUA-0KW)_`WYr^?hGQsJ7a66{7X$==(L_CS%wX8)T$@{xPfj zxF}tFSFKimT93_y&^=RW09SL_4+_fkq$(_`v71^38UK|p{%)Me95^F470;ltnk1O< z5Xg{pSr#{p2l55cAGZRI^<}E2QB?7Grd*uh8qayhz?0qpN_}!-)TZ5^X1d!U;8*c- zei;mjB*m^B7|NOC3%*c5Z7zSD-{AsqG?i`BG!-^sK#QR~*J ziL*N8{8%n0QV%Hw6d@XT%phM{l!7IPrtBo}wf`A);^xxcf}-eR^6C2;5izP9 zwIda?d5^Oy^|6 zXh2y?#nn>1E~oQ7#y;?t3rQnn`uD`pk3ZNE8*YO(Lu07c$Dkz=caq}D-8G?wfn2A& za&sB&^`eS|xLRkG=c?z%18*x2t@BH%iQZ@huBlyVYk31)j4t@Y7}ynkBy`$Nca(18mV z(%cn(h@@{^?QI`VU=qza+@=Duk zp=6m4Zn5M<-0|DWgVsh_(I#^(&VKRO%|qKYrz5}zi^&4s$YR<2xVfhSdcM&pc5RJ) z6X4%w(-2TGTx|w#gKWZ*hy*+h_j$ApapU)frc(OSGwt^iD;-%q#>mwzboB4)dV|0B z-qUM)`C=qdA=3)%5@Ga`nfW97E~4#^K_!?Z(S~RG2(Y#k2UqWIf4q*_WP@+(ZsZ@u z(gRvGEHYG)f01cXMzJs?mrOo?5xS9-{r)xm?(1E&u`qR4G~2Jt2zJdCI;Yc))cRpU zhNtVG)nP~S@%erfUI>~D4v#9%cA*5}uAEK` z5Qx{jOhw_U8p5YQip1BiDHm_c4C4}b34tqP%w;M#apGy2S+xxgPC5}*Mp0MRqRYtNNF(|9{QfsP2(?bP?-Q^eQVeQXu2oHNqSZ?| znb3~Zw#Fo0amBGpYI-kb0oozR|2mNc9F#!PO=g-m`tB@Nt4>(Cr~14`_;U!lW}~pZ z(c9=B-XfoH=Cub?X|Ff8ogC>HMWc}`J`yx4WPezmzr}#c_Fi|m3>r8FkZc1*_3Nxu zhh2?~W*L&`Z%2tvx;d%6%atxnKuzC62A{%`%o zz|5AcxR%TzM%D%^qL1&exw7y6@XrwmC(*dKN36o;ukem~%J-d1Lif)H>4i{xv3a98 zVzI=KD1IfhuwsT>$cyJ-aT8zf#xzU2ItxbeTXgmE37!k&fi$IGdv2o3kf`tCA%lcT zjpAd4^obAHn8wkENdWzB|Af-{m~8K@ldKLB{LYulpIgt(YA=ZO=cKn7=np*W`a&QC zgjLuD11Vwy43m)&U>a5W^KM|49c3A8*KRM>X0hK!K(t)67*-tTL3v&M!Sj#Nv1*b? zs@6eWTPU?oN5`Jel*rBFWar~-qlB2-c4(pDx)otf6ajb68R|(65O1((Q^|5KX^AHg zuyXLaE7hRoG={)X_wFK&Jx)dq)%r=zGoMttZ|B>$gq15)U=oTMmV@miD8cVc;|<16 zk?EUuTP}p}Ne4gUN} zaQf#~lJj<9tYRLheYrQwI&8?&V7sjNgLsii!+}E2b}3oMb~DBI!X^ISnhMeSXD(!c zj1Dipr|XN<3BNLmaA|uY6Bc)-eA>x- zclkT_apUVy+*2 z=H&=GDYmj>cYsMMgq+kRsZHoxTWO9=8C8U9PnvQKb!geTp}c+8+Z0);q0lO{%mA1p zGa)Lwe4Hsy3hXO01j*hK_MMpt=wem3Uto2kGb4v&?b56Jcd(=9>C>wJ5mXz=Y9;EG zf;w^#f-rC+mNhecT$-(u`R3-Nt2m! z8^09hAWA7JX}05U`ZuN(VV{y~d<2QZwoUUZyxFxJVn1Qc1-0DDY)nfsHv-mF?vT@eK& zK=B^A_0uRNzF_Os1q>SiFkf$P&xn;^J;sJE*?3G})08Y|6@HmJ1L_NcTq7Y;oOGPC zOqmoP=2$?9+Ic}=6DC`uFr{R}5L=Z)@irTgtt9R4GLtQ-^ZCi7s-Ob1fv*=@*k|)O zUv5pUIaOKy9<1ENzT6&!V%6@|;o0FG8KaYRern7Pn8NDBy8RC1^A<)N^`pWDxWi&9 z4%!^gcMj`Lr&(BcJU(1|!pTzl9$6nOyM1sUe_NYF$sb7-zNwS2U)$xe>+aaDq({q7k?PEG^|Wu=8c>qA=w}e zI*Qso2NL5^8mkjuU=XB{|~ z8My7{&wkTjc>QZQwrBj<9}Jl^%;hF(?&>K#@yK!!69h7OBLMcokR2xXy(kjYLhr1h zdc%X|K0~1Zb!SO@QbAfj3OB2Qo?u9U)dQD<9nI?(uXpS=dpE2Q&Y6~cwGSR;KPsjP z2evP}vo(&yyh(7;IMM8t2X&BEW{t5YCEu|ZUSQ5Zu2mFvt;3EZSS`)x^!tg#jo>z_ zCF8M=AiyzxZ?NdH!hbNnr)Ih|!G6mv?Z*+($yaYL*S(%C4l(b?yS^>I=E%{di(o#J zp9oPZryanb2O~P;T^c0bBHh|U@a(PmxAhp`*IjQ>Ozww`FoUd#t{<76O#O~;)i~O6 zD609NTeeze`2Y4QPN38GUcQ~}zq)Wf}BpWCc~fs zajYkV^HMtc(x2ajdv#5MZw_5#AL$OhePU1|c5Q1yr8Q>!z6D|IP*I6PM~i1{cyFUp z5rCcU%tz_rij`Tu|Mc0M&85Dv{Z3Kf!=v3anq;M7+}VySANgi#lYMhNys;{S=@lOR|X%~u_;aA zA+9I5IX5k9VVnr(LJ_Z2vX$2f^vh694Z>_=X(cq~NOIHd%-`1TL{Iy)TsK?is1EwH zYr*7|T&zl;DDw?9UtzJ0hOM)%7-}~+?7(Bbt(`K?59>GP8W17l; z@_(Ai`1lGOd+ao@m9lUq;Kn`0YxpaLZ-B=U|2}%y0h*xjNVK?sU!kU3{&TKP&wD1( zT>J848-1v&a7DV_fNCv|H`j#E5OC(;@j6j>vaf<$SfqWzJ7l3!u~ zqC%-Ks!)=M-gilNWV32@iMTeo;}n>JCYl&ZKt`F8W%N$5=SG~GQC&gQz7mYoK*#6= zQt;Jv?NTaDzRDOEKg1s|!#QyK74Rd|wUT#B>D*xg4OA1cMH&5|oc6^JAE2ZNc1}{; z3`djCO~BKbHLP%QNQ-hz-7?h565RZt%mWQV3fLQyS3Bh6;iZGSHR)jL;(HSJJ;`Tj z#Ne&)gcmc@(^{7*jP?@!72k}0sv=MDUAT1m&iE;@#F8fD$4s#sjrg&c z+Zd^K4XZgOHh%7D1Lb02r}4z#>WVA)TVFf>mcS#e?83D#Z+qSq1KHk|$5!ME9z053 zHe()SGGsq^q2WSUj5*frhO9HJyC&@>=9CkkGu&}G`HXd#ej>lUAU8BUwzifH*XeR{ zyx@Q-V)^p3u-r*jYJP8@}uM zwY<-RJ?!adCaX{U9;LMwDDto_V@xvi69QV6+@ZKu&}Pf~9d!jDoC+G8tZ zJsW2P$Y7{T?oS!x)t0WjYI-WO>{J}@eT7FQUA zNoiorP8AP(d?7cxIQIQozWjy?rG@z?L{M@F`&saA`&zo7L%UjyslT$SD(cS@&$nm7 z-7vBNd@cV_>it{S5AMiMBFI(tmE7de-N0i4Vv4rK#V8(~~d|;_eK*^(u z%~ojjHo4$^qwDjWVz06Vd zZGP3|uJ-O5T6p9T4E;o|>*z2d;8jdf5*H-}_P2teV`mklR(_#e|Mz~Wh1hd59=8^h zq>RO{rO@@`OPNgN=ol5vnUz2T?@bzpYm2-Zvo7kc_K3Qzzn&a^c!Pmz5<=VyA`{B= zlhf&^>Lr7WFzb{#|JXHLSJ6_=l+lp5b!RL9mLeyUVmQ1CvM)93Z=S@N0DV2ZmqDg? znR{4EZugX)IxT%=yc#EF&1?-rd^og0-^J1fgRIjj8-J6!cI}5a6;Xvi2*x5l)!y>u zFm~5WTn6dV*ZLY*orlE_2Ht9hu@fUKZHm*~E+R-H(=ymZ3ltrMmMPaIgM|smkOz>Q zb1$Xoj4Wkp-z1$uWYBSO0pSE_lJDP>^*wTFY81kNz(DQY>8X*Oukv#~yqA#SxWxt4 zy-Z6N2A5xY!a_pAZ-!Vmqb0^`B0m3KAcueD2gt3O(3=Aha&-X^=j5TIhV+)zrmX(xnl#xracF-L0|p;A3cq^pVgG|1utG3y;W7^rN);oV z1X}-_mjMwlQ0V(dz0Ocxq(=NRiyy?LR=$kF$nMexb~ zmr?xxPQtkVoJe59A}olWuuBnfFe@zrg10?~o4b#_1?-C`KIwlR%#;WSc>kOI-)s%$ zB+5wopF8I@0>Z!8|Hl+ywW6v>p!cwS9%dMu7|#DK1ek;vJ`#uzrY$Cd7zIlaqeb-- I{_mjw0^TynGynhq delta 8290 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