From fc1a668dcce25810cdcc957e544a4aca889a7c7c Mon Sep 17 00:00:00 2001 From: passscod <passscoed@gmail.com> Date: Sat, 1 Feb 2020 14:04:58 +0100 Subject: [PATCH] neu --- Implementation/GUI/Picture.cpp | 42 ++++ Implementation/GUI/Picture.h | 3 + Implementation/GUI/imageviewer.cpp | 223 ++---------------- Implementation/GUI/imageviewer.h | 69 ------ .../InteractionTool.o | Bin 4032 -> 4032 bytes .../Makefile | 3 - .../Picture.o | Bin 11584 -> 11952 bytes .../imageviewer.o | Bin 114288 -> 114824 bytes 8 files changed, 65 insertions(+), 275 deletions(-) diff --git a/Implementation/GUI/Picture.cpp b/Implementation/GUI/Picture.cpp index 30e5a2e..a6b2b9e 100644 --- a/Implementation/GUI/Picture.cpp +++ b/Implementation/GUI/Picture.cpp @@ -12,6 +12,12 @@ void Picture::addLayer(layer_t *layer){ if(maxY<layer->qImage->size().height()+layer->yOffset){ maxY=layer->qImage->size().height()+layer->yOffset; } + if(minX>layer->xOffset||minX==-1){ + minX=layer->xOffset; + } + if(minY>layer->yOffset||minY==-1){ + minY=layer->yOffset; + } return; } void Picture::addLayer(QImage *qImage){ @@ -27,6 +33,8 @@ void Picture::addLayer(QImage *qImage){ if(maxY<qImage->size().height()){ maxY=qImage->size().height(); } + minX=0; + minY=0; addLayer(layer); return; } @@ -43,6 +51,8 @@ void Picture::addLayer(int width, int height){ if(maxY<height){ maxY=height; } + minX=0; + minY=0; addLayer(layer); return; } @@ -51,6 +61,10 @@ void Picture::removeLayer(unsigned int index){ currentLayer=nullptr; } layers.erase(layers.begin()+index); + maxX=0; + maxY=0; + minX=-1; + minY=-1; for (int i = 0; i < layers.size(); i++){ if(maxX<layers[i]->qImage->size().width()+layers[i]->xOffset){ maxX=layers[i]->qImage->size().width()+layers[i]->xOffset; @@ -58,6 +72,12 @@ void Picture::removeLayer(unsigned int index){ if(maxY<layers[i]->qImage->size().height()+layers[i]->yOffset){ maxY=layers[i]->qImage->size().height()+layers[i]->yOffset; } + if(minX>layers[i]->xOffset||minX==-1){ + minX=layers[i]->xOffset; + } + if(minY>layers[i]->yOffset||minY==-1){ + minY=layers[i]->yOffset; + } } return; } @@ -141,6 +161,9 @@ bool Picture::isVisible(unsigned int index){ QSize Picture::getMaxSize(){ return QSize(maxX,maxY); } +QSize Picture::getMinOffset(){ + return QSize(minX,minY); +} int Picture::currentXOffset(){ return currentLayer->xOffset; } @@ -156,40 +179,56 @@ int Picture::yOffset(unsigned int index){ void Picture::setCurrentXOffset(int offset){ currentLayer->xOffset+=offset; maxX=0; + minX=-1; for (int i = 0; i < layers.size(); i++){ if(maxX<layers[i]->qImage->size().width()+layers[i]->xOffset){ maxX=layers[i]->qImage->size().width()+layers[i]->xOffset; } + if(minX>layers[i]->xOffset||minX==-1){ + minX=layers[i]->xOffset; + } } return; } void Picture::setCurrentYOffset(int offset){ currentLayer->yOffset+=offset; maxY=0; + minY=-1; for (int i = 0; i < layers.size(); i++){ if(maxY<layers[i]->qImage->size().height()+layers[i]->yOffset){ maxY=layers[i]->qImage->size().height()+layers[i]->yOffset; } + if(minY>layers[i]->yOffset||minY==-1){ + minY=layers[i]->yOffset; + } } return; } void Picture::setXOffset(unsigned int index, int offset){ layers[index]->xOffset+=offset; maxX=0; + minX=-1; for (int i = 0; i < layers.size(); i++){ if(maxX<layers[i]->qImage->size().width()+layers[i]->xOffset){ maxX=layers[i]->qImage->size().width()+layers[i]->xOffset; } + if(minX>layers[i]->xOffset||minX==-1){ + minX=layers[i]->xOffset; + } } return; } void Picture::setYOffset(unsigned int index, int offset){ layers[index]->yOffset+=offset; maxY=0; + minY=-1; for (int i = 0; i < layers.size(); i++){ if(maxY<layers[i]->qImage->size().height()+layers[i]->yOffset){ maxY=layers[i]->qImage->size().height()+layers[i]->yOffset; } + if(minY>layers[i]->yOffset||minY==-1){ + minY=layers[i]->yOffset; + } } return; } @@ -202,9 +241,12 @@ Picture::Picture(std::string name){ layers = std::vector<layer_t*>(); maxX=0; maxY=0; + minX=-1; + minY=-1; } Picture::~Picture(){ for (unsigned int i = 0; i < layers.size(); i++){ delete layers[i]; } } + diff --git a/Implementation/GUI/Picture.h b/Implementation/GUI/Picture.h index 806c0c8..edac3af 100644 --- a/Implementation/GUI/Picture.h +++ b/Implementation/GUI/Picture.h @@ -33,6 +33,7 @@ class Picture{ void makeVisible(unsigned int index, bool visible); bool isVisible(unsigned int index); QSize getMaxSize(); + QSize getMinOffset(); unsigned int getLayerCount(); unsigned int getCurrentLayerIndex(); int currentXOffset(); @@ -54,6 +55,8 @@ class Picture{ layer_t *currentLayer; int maxX; int maxY; + int minX; + int minY; }; #endif /* !PICTURE_H */ diff --git a/Implementation/GUI/imageviewer.cpp b/Implementation/GUI/imageviewer.cpp index 736a831..d528888 100644 --- a/Implementation/GUI/imageviewer.cpp +++ b/Implementation/GUI/imageviewer.cpp @@ -87,52 +87,12 @@ ImageViewer::ImageViewer(QWidget *parent) connect(drawDock,QOverload<para1>::of(&DrawDock::drawShowI),this,&ImageViewer::drawShowI); connect(drawDock,QOverload<para2>::of(&DrawDock::drawShowII),this,&ImageViewer::drawShowII); - /* - for(int i = 0; i <256; i++){ - colorVect.append(QColor(255,255,255,255).rgba()); - colorButtons.push_back(new QToolButton()); - QString str; - str.sprintf("background-color: qlineargradient(stop:0 #%02x%02x%02x);",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i])); - colorButtons[i]->setStyleSheet(str); - colorButtons[i]->setCheckable(true); - - connect(colorButtons[i], SIGNAL(clicked()),this, SLOT(changeColor())); - }*/ - - //newLayerDock->setColorVect(colorVect); - //drawDock->setColorVect(colorVect); - //colorDock->setColorVect(colorVect); transLationDock = new TranslationDock(interactionTool); connect(transLationDock,QOverload<toolParameters_t*>::of(&TranslationDock::getParams),this,&ImageViewer::setTranslationParams); connect(transLationDock,&TranslationDock::update,this,&ImageViewer::updateall); - /* - addColor(QColor(255,255,255,255),0); - addColor(QColor(127,127,127,255),1); - addColor(QColor(0,0,0,255),2); - addColor(QColor(0,255,255,255),3); - addColor(QColor(0,127,127,255),4); - addColor(QColor(127,255,255,255),5); - addColor(QColor(127,0,0,255),6); - addColor(QColor(255,127,127,255),7); - addColor(QColor(255,0,0,255),8); - addColor(QColor(255,0,255,255),9); - addColor(QColor(127,0,127,255),10); - addColor(QColor(255,127,255,255),11); - addColor(QColor(0,127,0,255),12); - addColor(QColor(127,255,127,255),13); - addColor(QColor(0,255,0,255),14); - addColor(QColor(255,255,0,255),15); - addColor(QColor(127,127,0,255),16); - addColor(QColor(255,255,127,255),17); - addColor(QColor(0,0,127,255),18); - addColor(QColor(127,127,255,255),19); - addColor(QColor(0,0,255,255),20); - - addColor(QColor(0,0,0,0),255);*/ - - //createLayerDock(); + colorDock = new ColorDock(interactionTool); connect(colorDock,&ColorDock::updateVisible,this,&ImageViewer::updateVisible); connect(colorDock,QOverload<QVector<QRgb>>::of(&ColorDock::updateColorVect),this,&ImageViewer::updateColorVector); @@ -161,55 +121,6 @@ ImageViewer::ImageViewer(QWidget *parent) resize(QGuiApplication::primaryScreen()->availableSize() * 3 / 5); } -//! [0] -//! [2] -/* -void ImageViewer::createColorDock(){ - colorButtons = std::vector<QToolButton*>(); - //QPixmap px(20, 20); - for(int i = 0; i <256; i++){ - - colorButtons.push_back(new QToolButton()); - //px.fill(colorVect[i]); - //colorButtons[i]->setIcon(px); - colorButtons[i]->setCheckable(true); - QString str; - //str.append(qRed(colorVect[i])); - //str.append(";"); - str.sprintf("background-color: qlineargradient(stop:0 #%02x%02x%02x);",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i])); - //printf("background-color: #%02x%02x%02x;\n",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i])); - colorButtons[i]->setStyleSheet(str); - //if(i==drawColorIndex){ - // colorButton->setStyleSheet(str); - //} - connect(colorButtons[i], SIGNAL(clicked()),this, SLOT(changeColor())); - //connect(colorButtons[i], SIGNAL(clicked()),colorButtons[i], SLOT(toggle())); - } - - colorDock = new QDockWidget(tr("Colortable"), this); - colorDock->setAllowedAreas(Qt::BottomDockWidgetArea); - - colorLayout = new QGridLayout(); - for (int i = 0; i < 64; i++) { - colorLayout->addWidget(colorButtons[4*i],0,i); - colorLayout->addWidget(colorButtons[4*i+1],1,i); - colorLayout->addWidget(colorButtons[4*i+2],2,i); - colorLayout->addWidget(colorButtons[4*i+3],3,i); - } - - colors = new QWidget(colorDock); - colors->setLayout(colorLayout); - ColorScrollArea = new QScrollArea(); - ColorScrollArea->setWidget(colors); - colorDock->setWidget(ColorScrollArea); - - addDockWidget(Qt::BottomDockWidgetArea, colorDock); - colorDock->setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable); - - // - -}*/ - bool ImageViewer::loadFile(const QString &fileName) { @@ -580,113 +491,6 @@ void ImageViewer::mouseReleaseEvent(QMouseEvent *event) updateVisible(); } } -/* -void ImageViewer::updateColors(){ - QPixmap px(20, 20); - colorVect = interactionTool->getPicture()->getCurrentLayerAsQ()->colorTable(); - for(int i = 0; i <256; i++){ - - px.fill(colorVect[i]); - - //colorButtons[i]->setIcon(px); - QString str; - //str.append(qRed(colorVect[i])); - //str.append(";"); - str.sprintf("background-color: qlineargradient(stop:0 #%02x%02x%02x);",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i])); - //printf("background-color: #%02x%02x%02x;\n",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i])); - colorButtons[i]->setStyleSheet(str); - - } - newLayerDock->setColorVect(colorVect); - drawDock->setColorVect(colorVect); - - if(interactionTool->getPicture()->isShaped()){ - addColor(QColor(255,255,255,0),255); - QPainter p(&px); - QPen pen(QColor(255,0,0,255)); - pen.setWidth(2); - p.setPen(pen); - p.drawLine(1,1,19,1); - p.drawLine(19,1,19,19); - p.drawLine(19,19,1,19); - p.drawLine(1,19,1,1); - p.drawLine(1,19,19,1); - p.drawLine(19,19,1,1); - //colorAct[255]->setIcon(px); - //colorAct[255]->setEnabled(false); - colorButtons[255]->setStyleSheet("background-color: #FFFFFF;\n"); - colorButtons[255]->setIcon(px); - colorButtons[255]->setEnabled(false); - } else { - //colorAct[255]->setEnabled(true); - colorButtons[255]->setEnabled(true); - px.fill(QColor(255,255,255,0)); - colorButtons[255]->setIcon(px); - } - //colorButton->setMenu(colorMenu); -} - -void ImageViewer::addColor(QColor col, int pos){ - QPixmap px(20, 20); - colorVect[pos]=col.rgba(); - - px.fill(colorVect[pos]); - //colorButtons[i]->setIcon(px); - QString str; - //str.append(qRed(colorVect[i])); - //str.append(";"); - //str.sprintf("#%02x%02x%02x",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i])); - str.sprintf("background-color: qlineargradient(stop:0.5 #%02x%02x%02x);",qRed(colorVect[pos]),qGreen(colorVect[pos]),qBlue(colorVect[pos])); - //printf("background-color: #%02x%02x%02x;\n",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i])); - colorButtons[pos]->setStyleSheet(str); - - colorButtons[pos]->setChecked(false); - if (hasLayer){ - interactionTool->getPicture()->getCurrentLayerAsQ()->setColor(pos,colorVect[pos]); - //setImage(*interactionTool->getPicture()->getCurrentLayerAsQ()); - //updateLayers(); - layerDock->updateLayers(); - updateVisible(); - - } - newLayerDock->setColorVect(colorVect); - drawDock->setColorVect(colorVect); -} -void ImageViewer::changeColor(){ - for (int i = 0; i < colorButtons.size(); i++) { - if (colorButtons[i]->isChecked()){ - QPixmap px(20, 20); - QString str2; - str2.sprintf("Color %d",i); - colorVect[i]=QColorDialog().getColor(Qt::white,nullptr,str2,QColorDialog::ShowAlphaChannel).rgba(); - newLayerDock->setColorVect(colorVect); - drawDock->setColorVect(colorVect); - px.fill(colorVect[i]); - //colorButtons[i]->setIcon(px); - //colorAct[i]->setIcon(px); - QString str; - //str.append(qRed(colorVect[i])); - //str.append(";"); - //str.sprintf("#%02x%02x%02x",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i])); - str.sprintf("background-color: qlineargradient(stop:0.5 #%02x%02x%02x);",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i])); - //printf("background-color: #%02x%02x%02x;\n",qRed(colorVect[i]),qGreen(colorVect[i]),qBlue(colorVect[i])); - colorButtons[i]->setStyleSheet(str); - //if(i==drawColorIndex){ - // colorButton->setStyleSheet(str); - //} - colorButtons[i]->setChecked(false); - if (hasLayer){ - interactionTool->getPicture()->getCurrentLayerAsQ()->setColor(i,colorVect[i]); - //setImage(*interactionTool->getPicture()->getCurrentLayerAsQ()); - //updateLayers(); - layerDock->updateLayers(); - updateVisible(); - - } - //colorButton->setMenu(colorMenu); - } - } -}*/ void ImageViewer::newLayer(){ //param = new toolParameters_t; @@ -712,18 +516,32 @@ void ImageViewer::updateVisible(){ } void ImageViewer::calculateVisible(){ QPixmap *px = new QPixmap(interactionTool->getPicture()->getMaxSize()); + px->fill(QColor(0,0,0,0)); + QSize ms = interactionTool->getPicture()->getMinOffset(); + int mdx=ms.width()%10; + int mdy=ms.height()%10; + bool c=true; + bool ug=(px->size().height()/10+1-ms.height()/10)%2==1; QPainter *painter= new QPainter(px); QBrush *br1 = new QBrush(QColor(100,100,100)); QBrush *br2 = new QBrush(QColor(200,200,200)); - for (int i = 0; i < px->size().width()/10+1;i++){ - for (int j = 0; j < px->size().height()/10+1;j++){ - if((i+j)&1){ - painter->fillRect(i*10,j*10,10,10,*br1); + //QBrush *br3 = new QBrush(QColor(0,0,0,0)); + for (int i = ms.width()/10; i < px->size().width()/10+1;i++){ + if(!ug&&i>ms.width()/10){ + c=!c; + } + for (int j = ms.height()/10; j < px->size().height()/10+1;j++){ + if(c){ + painter->fillRect(i*10+mdx,j*10+mdy,10,10,*br1); + c=!c; } else { - painter->fillRect(i*10,j*10,10,10,*br2); + painter->fillRect(i*10+mdx,j*10+mdy,10,10,*br2); + c=!c; } } } + //painter->fillRect(0,0,px->size().width(),ms.height(),*br3); + //painter->fillRect(0,0,ms.width(),px->size().height(),*br3); for (int i = 0; i < interactionTool->getPicture()->getLayerCount(); i++) { if (layerDock->isLayerCheckboxChecked(i)){ painter->drawImage(interactionTool->getPicture()->xOffset(i),interactionTool->getPicture()->yOffset(i),*interactionTool->getPicture()->getLayerAsQ(i)); @@ -739,7 +557,6 @@ void ImageViewer::makeShaped(){ //updateColors(); colorDock->updateColors(); } - } bool ImageViewer::getHasLayer(){ diff --git a/Implementation/GUI/imageviewer.h b/Implementation/GUI/imageviewer.h index 445e3bd..aca1c68 100644 --- a/Implementation/GUI/imageviewer.h +++ b/Implementation/GUI/imageviewer.h @@ -121,37 +121,14 @@ private slots: void about(); void draw(); void translate(); - //void calcTranslation(); - //void doTranslation(); void setTranslationParams(toolParameters_t * param); void setMergeParams(toolParameters_t * param); void updateHasLayer(bool b); void updateall(); void updateWithoutLayer(); void updateVisible(); - //void pencil(); - //void startDraw(); - //void lines(); - //void notFilledRect(); - //void filledRect(); - //void existingColor(); - //void newColor(); - //void actualColorVect(); - //void standartColorVect(); - //void smallColorVect(); - //void customColorVect(); - //void setNewColor(); - //void setDrawColor(); - //void changeColor(); - //void changeCurrentLayer(); - //void updateVisible(); void makeShaped(); void newLayer(); - //void addNewLayer(); - //void setWidth(int w); - //void setNewLayerX(int w); - //void setNewLayerY(int w); - //void scrollAreaChanged(); void drawShowI(para1 p); void drawShowII(para2 p); void updateLayerDock(); @@ -159,14 +136,7 @@ private slots: private: void createActions(); - //void createColorDock(); - //void createLayerDock(); - //void createTranslateDock(); - //void createDrawDock(); void createMenus(); - //void createNewLayerDock(); - //void addColor(QColor col, int pos); - void updateActions(); bool saveFile(const QString &fileName); void setImage(QImage newImage); @@ -177,43 +147,11 @@ private: QImage image; QLabel *imageLabel; QScrollArea *scrollArea; - //QScrollArea *ColorScrollArea; - //QScrollArea *layerScrollArea; - //QWidget *colors; - //QWidget *layers; QMenu *viewMenu; //QDockWidget *colorDock; QDockWidget *layerDockW; - //QGridLayout* colorLayout; - //QGridLayout* layerLayout; - //std::vector<QToolButton*> colorButtons; - //std::vector<QPushButton*> layerButtons; - //std::vector<QCheckBox*> layerCheckboxes; QVector<QRgb> colorVect; QVector<QRgb> newColorVect; - //QList<QAction*> colorAct; - //QPushButton *colorButton; - //QSlider *drawSlider; - //QSpinBox *drawSpinbox; - //QSlider *newLayerXSlider; - //QSpinBox *newLayerXSpinbox; - //QSlider *newLayerYSlider; - //QSpinBox *newLayerYSpinbox; - //QPushButton *drawStartButton; - //QMenu *colorMenu; - /*QCheckBox *mirrorCheckbox; - QLineEdit *zoomXInp; - QLineEdit *zoomYInp; - QLineEdit *rotInp; - QLabel *translationLabelA; - QLabel *translationLabelB; - QLabel *translationLabelC; - QLabel *translationLabelD; - QMatrix *transMat;*/ - //QPushButton *newColorButton; - //drawModus_e actDrawModus = drawModus_e::pencil; - //QRgb newLayerColor; - //QGridLayout *newLayerLayout; QPixmap *pixmap; //QCheckBox *ignoreShaped; //QRadioButton *newColormap[4]; @@ -222,13 +160,6 @@ private: bool moveStart = false; //bool isNewLayerColor = false; double scaleFactor = 1.0; - //bool isDraw=false; - //bool isRot; - //int drawWidth=3; - //int newLayerX = 100; - //int newLayerY = 100; - //int drawColorIndex=0; - //bool drawStart=false; bool hasLayer=false; toolParameters_t *param = nullptr; InteractionTool *interactionTool; diff --git a/Implementation/build-imageviewer-Desktop-Release/InteractionTool.o b/Implementation/build-imageviewer-Desktop-Release/InteractionTool.o index e364580c78d6a001231fa652da472586379c2695..9aa47848e458a2bf8e83e9f11bc7a000a3894e02 100644 GIT binary patch delta 18 ZcmX>ge?Wdh2V=m*&R2{9n@bpd_y9>@2LAv6 delta 18 ZcmX>ge?Wdh2cyTt&R2{cn@bpd_y9=Q2JZj> diff --git a/Implementation/build-imageviewer-Desktop-Release/Makefile b/Implementation/build-imageviewer-Desktop-Release/Makefile index d9f0fd6..16b3104 100644 --- a/Implementation/build-imageviewer-Desktop-Release/Makefile +++ b/Implementation/build-imageviewer-Desktop-Release/Makefile @@ -203,7 +203,6 @@ DIST = /usr/lib/qt/mkspecs/features/spec_pre.prf \ /usr/lib/qt/mkspecs/features/qt_config.prf \ /usr/lib/qt/mkspecs/linux-g++/qmake.conf \ /usr/lib/qt/mkspecs/features/spec_post.prf \ - ../GUI/.qmake.stash \ /usr/lib/qt/mkspecs/features/exclusive_builds.prf \ /usr/lib/qt/mkspecs/features/toolchain.prf \ /usr/lib/qt/mkspecs/features/default_pre.prf \ @@ -374,7 +373,6 @@ Makefile: ../GUI/imageviewer.pro /usr/lib/qt/mkspecs/linux-g++/qmake.conf /usr/l /usr/lib/qt/mkspecs/features/qt_config.prf \ /usr/lib/qt/mkspecs/linux-g++/qmake.conf \ /usr/lib/qt/mkspecs/features/spec_post.prf \ - .qmake.stash \ /usr/lib/qt/mkspecs/features/exclusive_builds.prf \ /usr/lib/qt/mkspecs/features/toolchain.prf \ /usr/lib/qt/mkspecs/features/default_pre.prf \ @@ -502,7 +500,6 @@ Makefile: ../GUI/imageviewer.pro /usr/lib/qt/mkspecs/linux-g++/qmake.conf /usr/l /usr/lib/qt/mkspecs/features/qt_config.prf: /usr/lib/qt/mkspecs/linux-g++/qmake.conf: /usr/lib/qt/mkspecs/features/spec_post.prf: -.qmake.stash: /usr/lib/qt/mkspecs/features/exclusive_builds.prf: /usr/lib/qt/mkspecs/features/toolchain.prf: /usr/lib/qt/mkspecs/features/default_pre.prf: diff --git a/Implementation/build-imageviewer-Desktop-Release/Picture.o b/Implementation/build-imageviewer-Desktop-Release/Picture.o index c997aadc9a29edb411e263022258e1b6e35c52ac..e6c591e8c58da66ec5800726c27095eef0f8a328 100644 GIT binary patch delta 4271 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 Gx@rKBfbzru delta 3895 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 RCF|rMJu@Z`)yZ9YY5=E7QB?o{ diff --git a/Implementation/build-imageviewer-Desktop-Release/imageviewer.o b/Implementation/build-imageviewer-Desktop-Release/imageviewer.o index 50816bbdc333f4176728a9b8b89527eba6350719..baa5c16f55566968114e248f2e54f9b67c04f1b0 100644 GIT binary patch delta 10587 zcmezHhpnTLeS!uP$NY_2j5b=Gzdah?bTBY5cy!jNSa@{r-@w4Y;L}^9;*jFe&7!IS zmT^(3Fg!5X-$tU|;lC&YNI~a6&(5PBoyQ?ukKP=W1XsfYh9?a#8GiHVd=C}weCGpa zckc$743mIr^yz%>(RtXT^PtBJpUem8X=!Pl_dE{%RPg9@QIR<KPu`=`M@7N&;2$MN z%`YCAAJgm8($buJS(Z3<-eEl8aqyp#qvjFM&Tk%_=MMgqcj^4((P^Thd8*S#g`<~c zQs*be1Dc0ALsT>%ws!ldaO~$`U|{g<Jm_)ohrQ>)p9(ITA3ZZKf-Lqp_)AIiP_GLY zqhseG$AhorT^KJkKVWq1JnX7@*`+f^#o)gvgB;lJ?>sw?!Tr7~g@J)#ABfnQGWofU z=H!buo=F~=E-DfrQxE=@?>15C4pGqn`R3pcCCwY12RmI<Oh76WKq@+YR3tn=5+6E` zb-Ji1^s;n1_OiG*?qOtLVCZB~>1Em0%i`4OqM`#2%WfYPiOGhxqW+dA_<Oc7FfcUN zs2DJo@N~PVm{=a<pMSv7@JKg{N_UKkPIr!qLh}L6P8Su8*NXh|4WP*L=nhfg@ag>L z)A`-i@ChVrnvXIzAD-M~s~rET#<H75r87pwrPD>lq1#18qtivjqt_W^hL3B@lhQ>X z{Q?mE5LZHscs+MQvx|xZV>62i*Gr}U|No~=@afc1@#xM`u`s;-nvGwcq4_Z5Bs-~) z>7Yc_z4rphgZChsTMm?*@#x-*NFts0;2{hZ_v}0ZQHv?%*m-nvjh$5ezfb&H2Yfoe zf8rN(QE^D)e}CYUBfr*BFxLa3`K9mw|Nr^rT^JaAx<QVMQL*sp{O<!wsjESu15xGE z`Ol;CK8*bz!tm&JQK?ArFoxucQX!AVBcO~E9qSn580#447(bcYUY~KoW-EI+DW)k` zH%CPVFfln@-n=GykpScW$^JRcjNd0GW{YfIp0kS0%*<4tfgzUdA_qgsEk*{0>r8A1 zIT*e&2{JHDV`e+a!LWr{kb&VUGuuuMhRrMonHd;<v9oRD*xXv2$+-DL$qiY?$jOP5 z#3w(P#Lw=<cYu+Zhh_4GDWa2CPv?|0U;{-n149u50|N_$$za03z#uU>c5*r6gvnPY z?`HIwJaNiyrYHQ9{iaGWGEB~#D$VFHxpnGtMv2L~)5IAWCc94S2PvJ_%_uWDak~Fx zfyp+T_e_5y!L%TJ@~RDeOdldATW!>15{TKHwXuztGZJc%;AFx5;*$mTOE5ZvSd8%? zQnFo#fkB8thoQg@;v4}`;$~oASP7E#JOq_(u!qRnGDGN3Q1Js!5WY1NgjUssn8x4= z;e!e(5X))u!u{fgDNtDhsH`+dih+Tl8!8?E755Z^NUQ+qV!RI~KY~f6$%zNV8STMj z0+_4>lk33bbujrIOv+6DctD)d6HG>d$wn|a2TUFWlTX1U`{a!W#Tiw>q$`+A29wQT zaxIv=2PWAj7akI4Q~{IjU@{F%wu8w{VDciE`~oILCmS9XXEXzo{$Mf<Oilok>%in0 zF!=&ZvQ7SYSe#K0Ooo8TA~4wuA|+=SL&6q4l(vFo86SbkuV9jE^2Q_LjJjYl6inuU z$@a;DNA(%6gW0daB=_XPqvDK~VA5-I;ZY|YWAng(%!=H^0+Y1NoE+C6Z?iz>{G9wE zhWIEy^MK6clG377L!<Q665q@`|FpE?)DqXS&Feohac<u6YlS7F`}9N;MsdjiD@Y7# zGB7Z_Wnf_V^B)2drcVS(=OanKN0M%v{t+ZS2}yb}BSQClh~X=cq?aH`i%f4cWfbR& zvPRhbj$wMADWh2Z2P8|{k>nR4X`h57{tij~3MBDNB=yIT#F5Rph$Id*Ck^cT=SULB z2D#cG9IS$5!3retrAXr2k;IYJb58$g&M3}kGku~tqqw1~EyC1~NZyG-690rGo(t9{ zS%D<|8A-YWB0U*N`U{fuVz6}mIwa|@NYb~E#J?elGeAonP&)aJB+i2*-iPFMQ6%x7 zNa}4N;`Iz5gPtQvOoK=;XfZG_yhajV3>62d2i1141iBtc+zH9z-ALl|ki^d;iC<u- zN2Jx;ND{~fJx3CsgJjSTs5qz~EkklBBediNIdnOadM+gKKQQ(6|NsA&K$7?illcGt zzao<OLL`H7ki>5xsV_kiM-I`2NaE^9=B%=3V3@wdl2OEPJCX`bBo#-H#MO|*&rV-x z$tccvYkHw2qqyNuBvsl-s?;11=^5En<LQZ3jN;Q*STXWUKV!wn!{|AEq7|dKWEhfq zWZUAWAGBf=XRMw6(TY*L{wR_vXl4cH)k{d?4oI%J2^B|APkN3B*Eu4ocR~_hh9vF- z5ue^}%_ztiIX%#tQJgVp`bKL;al?Fw6gVksA!(^W5=Zt>D_9%jhv|yejN*wupsGOW zC<iGz4WKnONZcPuJOPLJ1RUZIrwiIJiZi~NUTDK8UjH4c3Y0pLBZb8o5gf>F<wX*g zNAjB#k~p%TEs?~vk<_O_#3A_|+2Ue|1UT@JQ)dm5II_i^NaDyAPeT$%_P~53ad}2= zM1J2p-Ov`4dXeOj(-WHuB0!MS6Yum!J4W&PBqV9%<kO8Lj+}gEK*iBxa{-b#a_nC~ z5=V}GUPy}z5{|2p0$2(n0S?DYNXbP7NgUZhwn*a0>fMpVk<~XMiLYY}MucMrR05R2 z)+0G+EmRzo((I7LcOZ!)2l$EU8|@gyC9mU<emeajDBM3lr9rkKR}YeIkmy1W-)N{f z$Q7HAT#<$(j_iseB=OBi>N_CfkZ|9EBrzQ#0S@=ANaD+o#J3@dZ$%PEHs>&s_;w`q z7m&nvFiyW`&&XwX6G@B-Nv)wfBoIKJ-H9abJpG^pqqt`*lJqVl=@h6qC`@-FiDx5; zuR;=E0WoerlJpg%6!#A*&dI>Q0P1<eYHAJ-gzLDGj1!&y(2-HRUIr=+a>ZUGX-6dS zO-R-xK*d3xMUKI8s5r=+t4Qj%LB-LXbpRqR1dc&ucbx^hEAa+I9xRP)&nG1DeMs*8 z2^9y~zaL3l$`j&!kT`P2vYmd>iBVj#2PzG6-T@?S)20_XF^V%To^I&OC~mk4stRPt zK_pe@k;Ds;#NUApH)Qof*nJHtOkAMi=$86T|LDvpULOsW1_dz>lBr2hagZwxA&Ivm ziKiinFN2DM%s~#qy-;zGIi^VJ|3JjG7|`9t<_+-&$ROmX5}w}Z!YE!Zha`<`j|GzW zVI+I(q2eI>k06OBAc?ypi8n*VLDnOiKMNx61a7omM+)DY5DBn9jv^WK7%C1j2-zPW z!2XbA_JMd4<gQ~#+DxV!x-p7Nwn3#qp@VGdgy|Pu8O0grPIm-RE5M39cS99}tU8Wl z)*+}k$c__8;?I%9k(23vuyK-Jz7VH@>^_O4EoAyZH%4*KM5r{#HslnO0Tl<?b_z+` z3?y-HB=M!wCxVRIgCy;TB>f#Kj_wLZKZxr<)+2{2-}FFtMsY)FB<a&g#_1r5pFoN} z^XZE2jN+bNNYZDJv;{)NL7qB`BwmCheiX^LsbJ#_k0ME*L(=vUDvs{>e_+Qm>P>&> z&L}Qv18NO0Fo2WVX(Yovrwe*8iZjlez7eEqHB=SIEaZ5&J$<1EqqyWts5HpsYml7q z4Qz;{UjX)CjGk`j$tZ4^1eFHqzKEoI5|X$llKA}T7d;ro4YwglBWIHDP;ro3kt2;| z`aw@d@p{2Pgkz2)c~}Wa968c7q2eIdT|#n&0h0J-B=HicILLbBOx+C;hh*v-NERQ1 zNPsgnau&D%6$crF?2o$;e+UIZ`~h;;6(sv*pyD8H$o3mU#X;(ktxtuDgVH{7MUf8` z2bqIxeGNn$(sDsg3pXGV;EL@kl7n1>Ar1u@l!_!Ck0fq^B%X~V?t>)03Q6385vixW z4N1ZmNyAqpabyb^Ll6$ShNRvMNgO$4I3S5%hp7kkv^|j|Zonk||NkEW6$dpQbCF`Y z3P~KfalQsgyc|jWFQ_;u<W!N&*9&D}0MGS+BqkzBq)a#TVH9U<giv!J)D{SJ20}f7 zP=CNwy<`|7D3JU9COE`>aEK>B#X&v>l?AXi+5{Zp2O#404Cop@KqN54e;|n?2c2v< z!UM>I6l<a4AoDAbg7gqn9Fz;5AP?8vM3O-62z-Q!gM#`gl0l*o2#fC^MZrWQ@w-Uk zi;=|P{UcB!+JGd1+yUE(B#vBh9zqhohh)JIB=P%5;?j`_hgu_vYeX`D{LcW+ulh(5 zwn!R~#Uqf!laSQsAc-TVp>7=Fs}SP#49FU`A|x1)<MJ<592A$8NKqgd1@RdqE)hLQ z4J2{osC0meBcc)%{{R2~PeGDEj?2eL;>dCN5lI|53N)f24gy(#90lG;;;)cA5K)gL zfgIGSIK(TE#F3+*2T2?`L|5YwKLr(+1GyAg!&RsRNc=g&^twPsvHAx{aUB?g@Zm!w z@eCw!<e~OLB=JW`>N}9cm660JB8fvswjptJ5=r7Ql7_!X;!lvo*<%q7MYccyN&G32 zdNm~RXGr1(u?g4>3PjTI97#hIlK2ZG@nj_Nmq_9rvD>=>8JBU^yCRMMg66X8pfiQO zXyOx~;-P5bhoIuIXyPlO;;CrjH=*J+kl|KHQ4F&915{!sbZ8Hh?Lgv8?2wT7jx>}6 z5|@ICt3pdknEFPjxGtLb5~#Q-ig-N(15CmeMS_9B2&%yqO?(Sf+!swe3Mw9oCY}xz zk3|zd0urxhU|>i^lei9&U|?X#MH7Do6)!~-{|gnbMH3eQt!!XmU}!}XmxGG;hC_>D zSkO5@4VsFkK?kZ~FH(sJiUKRB_)#?Rbg1}sG;wFB_<e+UJ$L~{98}^iv>bprs0u3n z6is{;RQx-dcr#S|KbrVFsQ3hEZh)D;hXX1xBX+w{9HWvD(@n<dc8rW-({l<KJs59o z-&(*}&&YUhx@i&Pa>jep?-nuYGrpM4Tg)iV_;R~yF{8Fv{R3V|`h=O;1Wm^;k;LU0 z7#JQvr^A0BiG%dOCcqi_5axi?zksT@MiPGnQ356-AmY=XcQOjrCqg*j_6tb!C#dEE zByo^su=(^#Byo`XUr_a*k;IWL6X6Hj2{s=T^K8(RA`20B0!x4l;$wv<)PYEV#X%Os zChSd-#6jxCpz7C8ckE&mufKpK4YEfLYR^q1aga7GsJ0hK;vj2a^ZzUY5NCkIKo~aj zuYe{Fo72{Whzo(;3$nlnYQc%=iQSCio);nVaOrDM=?6&SAbS=-bIwa7agcHMpz6)1 zAM9onPmB;mI1l7aJ7_XYL=p#S`vKKffFusG<^wbXRU(Ol)H6WS-eIsc^-qwbLDtkk zt$B+i4$>wC)%FKT9Au3Ew3cIqu8RPPfz&HO)kh<VBd3-Ii1_sFJ&cNsrrU4!Fq%s< z&54~Zw1Ux$D*`lY$iTqBkup7K1)~|$n)vBmD;VvV*2YghI9+V|gB6S#OdH~-bFE~w zV@gPv?ggR`#82-6(HG*Up90Yp3Ddb&LFGYoLBjMd5Z#b4{S=6vkT9KVHKQHVf`sW_ zAo@VU^ezy6Az}I{5d9!wI@cOTJEnld>0TgOA#r*ah&D)^ehNf8Bu?jA%V@{+A#u7F zh|Wly-UXrylBS;m(G7{yxz>T?lcsxt=oyLAyFm1W<msnC^oGRgT<aO_m;_R$dx7W^ ziPO74^n{e@r$F?B#OYicK=P^6y+HJj#OYli+97rNDG)7?G@WZBqa9O0>U1v<t&udn z3q;ROoqh^LbEQw`+Qewb<d8JoYZId#=Zkzuda|89aTB9ClR??^Qy}St(&=2ALBUiu z-3vrlluqvg(F@9^p90YnN~d#eVYFkKP(IxYM1Lrq-UX&Brk?`Q4Q120wldl=J*b@S z1)_hHP45EH0#(ybfoP5L>0H|w?U)Rzr+b0u9p%%zK=gs?>8C*Si}LAQ+d=wkrh9>C ziHhl6AbLaX^iv@EM#Xfl9iV8ao9+doIVz`jfoOyJ>8C*SgUab#I~nbm-qug|0?|L} zr+0y9gNEs+K(s*Bbgo^Dc1#V;)4f3Sh1%&|Ao@k?^iv>OqHQ|YZbmyMg|_KlP`V3B zpMug{dl>DQBHE^Vf$4_nT_8H4ZTcw?UDO6nk_vknHJB>erhDxLMM=Z-uDy(QoE$SD gLH=R-#l4K?oIj31xCzq*_c59?{pg$SwU1E^0KbKxApigX delta 10175 zcmeBZWdHDoZGr~VhdCRy7;WmC-(+}n)~HB$bnoB5z`)?sTcV<n;?ZrQs=>g(;L%y4 z5@Go5zbFHka~#6huK?z`s3<`AKAqn@JCAyF!lXGE7#LtO?>sw?!(}{rb5tC5r7$os z>;n;wJN`3pF)-`|u{}E9Po8R<mT{a#1!R}2;S+v&2L_+c_Yi|TIuCiw@W?!no|cw& z@Rz*D!5>PR7pz%S_<I&IFfcgwx~Om(zBRnv>7v5&S~YD#cZmv%M|X${N2iO5j!)<R z&Jq<3pH8Shnh!HJADw*APPzV8jYT()ic4pTibAg|XJ?LzO0Nia^CQO6h21_XED*il zd^-Pwj1uVdQPF@n=Jouv3C%1jjE>DmxL#WS|Noy~p26_;Yj%)}n-4R3bmxGAb1x`3 zAsXNTV0nYTZ4oH&y7yjSV9;miya!Rxa-ifmrnb&|aE%_FIVuv9d+eq8I*)pEyMWB! z0WyE`MtiBiZ=d+J4)}Eb|HLooqN0$-|Ng)yeyyWm9@ND!S9)~Es7Uy9zVqq)?$f!t z0V$rod34@~xW%XQ`{crS>&aDm5}T_W<fNFcT-!V=Du9Wp>B{CeF^dEkzfbPZb!PlO zd0~#o=I6Pq*i20H<rx^l*(R|uB(X6t6tXq3F-&0;WMJ6J$kxTia2dq>!pQcEm7$wy zEi(hdK329*tecOQWHN5nE4wAjC^h-*6h$6KK8t2{7rq6I%$J!aKbR^ydG`!Q!6F6* z1{P3yU|?V{0fpP-+$rUZ2PQwAvYWAH^1`XRnM4F8$4!%BG?-jDO`5S_^3-X|89gT3 zP8Vl1m>fF2AEb18H>1zw!WsUP1E#PrEn(UGZN?`Fri8G`uQv8EZHSm$wMmcZLe%C} zo7#9erI;ah2~G|?AU-+ZfP`d#4g-S_gARj%Eks6u5keP%RCsnnWgYAwqP9@|yP@I@ zju3HcCJ6lwDt^Ej!UttB5Q}@V;6ZUiU0sM>AE2_*ASnh0h7hQ@fD1&xQwTyAf^;#i z0F%4G<ZCd=F?r!ZaYjur=>#Ur!Q=ukc>qj41(QOP6Ay_qDuYQcFqsM_yTIf+FnIw? zz5|ndlRq93XVd|cK47v8OfCnL=fUJ#Fexy3<6&_|eJ~jSCab~ZEHJqjOx^>N|G}ih z<iaB$^&m15%q|C$Q^Dj$FnJzKeg~7XlMRoGGg^a59}p>-XbcHG^iZk;$uh16ll#Er zWia^-Ov+9EcvPIx983m)$yzYEU~=Fwea0(bHq+#d$HW<hH$Ob)q_a8d^FIzYNce9K z|FhDP(Q!JX8KbzQmlZ@%lYxQZEdv9?pZ^dLHQf*-orxs<9!a_cBHfH6{Q*gO+4Mv+ zMsdcC5LL&KRAn+E?05=M^#QDkk!^aTIionE?DT_Ri>(pvT8yNp0xVsB0*CZZB=HMK z4q~!F821rLToOtA6Oy<-k~p$CRuJ)e22gl?M$+I9kpPP$YluP;|AM4G4@n$ZeI=6k zS0wdIki@?+)FT4%2$IBiBn=mk#QTr}@FtS@PbBsKki?%OiHAW;5G@7<hSxB0mjD0% zCr@{@U=%mZhsuKj#0klsY9#S_NaFoqZJx7{q>;5PM-rcdq-_UO98@Be!JP5`|Nn#2 zADT0YC!T^zgIw_kN%{to_+KRPhe+ZJk*v{ymWUv8ZXu~RnQmywC|;k4B(095EelCp z9!b0$Nn8_2yah>I4N1HgNgUanSrBnZveQD+uoEHyPIlTz;?I!8kuCm=B#!KXKS<)p z7IWGo@{JbbbUABAE=IBG53Lx*8Re&Mv|<#mw}q+zMNAG-h_yn+K_U4LNqiELxC4@l zXF|nM(%Jw2|KCByLFPCjsb_KkyG#h|^(9CWJkuSm8O0?fA@X2pWS=TcF9b>JBS|9% zsLk|+){Nqet`JolpsGNg^GEW;j_DUchJ3&wtuXzg4Wl??0GN_o2(3*)K0tQKs_7F! zs<uy01W`w(9|Tcn!Gejmkn|us?<bNta(t^ffkOlATjcmQMiNK1+h%&BEu*-hCz3R> zHDO5N$mug4tgXHlDh&!2<T&366$kkgInIwEi6h7PS*SRAoGU?F5+HMs<J=n}t_Aic za-2s%Bp5&rLXM||=?m=`#p@^FkUk3)2ida{DGA*|62F8L?N5-zk*)uWB#x|}9n$iF zWLsnnjt~j3Kh_{w>;V-A1;|<?@m#1l$f0&f;uT2Z$N}DgB)*O@7*ShHN0LC+uoOvr zJ(2|*pyD70!At-D|Nq~dZfMUa&L}-S(1B50Qq2{S`jAaEn%?NZC|>V@B)tjA@NgvY z%}C;DNa9<N#7mLHk<DpF65ooXegZ_?2^`GZkR)b8B*5ZKNa7!n#J3}fGf#i$z$or1 z>xS^=4kT$6s5mH)b|Q&uBZ;p-63+k|S6`1LeFZ6%?SqPQGB7agLeh2uDh^5n+(_bA zk;HkB#P2}GLC)HZB+lp#_J$AxNMaL`#R}6eIx>nUnnUEl(pQnB%b?=u?rMOFqr0mY zNgUZ-Gr-n(ZbFjYgXFxOP;rp!_9BVjLJ~*LOMk(}N&0wzeZ>HB-9993Vbc|z8O0fs zr%!ZZ6lctu-ssFIF4+%N46>sTN%6YrfzFKLhDVX4uOWp1izjwF_@+N}W)%07hDw71 z0@=e#P;roL2as%YM-op%5>K1H5#)+mBxzG5={-<!be|pryF&6ZR2tnC_rRvs|3H#H zh-B)2s5r=xhmgb-ydZuCiMu0-J43}m)*$EkD5y9{{dJ_Un+Xxu0!PqcB!d=1B*2*w zIazO*zR-nH-19J08f4xPByC@y;^_9fc|+U_3LRu?0;U_fGKw?CPFHke6lctsp6JRb z?pY003^L>>lHpBIage3Qki?fGi6f`M{b1uHxqJ|IA4k$AGQH7_QCw0HDh;v?IelnM ze+ZI}fJ%cb^+wX2Iz7;hQQWWwN!kxddOK7c<Y8n>4}vZAJO`CVxAZoW_(>$=-XMve zK#ITbU{`o@`9i!1GVT<THbJO3$nmF<#Ep=|k0KctI(?x#qqt-%lJprQZ5yXMx-*K` z?}JK%Y(oyQcTjPVZD*0R{Xr5xjbt0AAHvnhi8T&M969Y}L&T@EdoT(z&YphIgHhaY zB}5EdEUrSba~o6~<VIw(`KAYYf(ivtdxU`joV<~}pac~MdEq>gaY0Dpo=D>H(>HoD zic6LuNh4>k?O@yNjzFbBjzPBVB9i!Vq=0#ZBz}TndY>nw*z_JxMxOc)PzjLpE+RR@ zBmjFzdPBuQ>Te)f&;}JpPn{E>;vk12hx}ZK`1I$VjDm@mARKUzUqW)k9jG`+GjfoB zhKi#*LNyTLXpke2>jwSlhTe?gj5gB?y%@#oXFyefOudX`8*30mH%L4cNn9RD+yY5l z8%f*;NjwWl99exCL>$se^hMIJ6(RvnI>;IhB8gu?QvVG}966F1f)O6Lilm+sN&Ffk z(wKq-R07nT&P9q$D<pB`c7G0%csY{#T~KjQ$f+V({0>QcB22vg|Ns9gAqbZucfTER zh{xa%FTo++gF}2t2m?bb$ZC*FkuBbXL&HrR;$Lux^Gq-FWfZSh2nAWffYDD0z#-m% zLwo}c@f}Fw$PsiGA`VGn$fG;CVF(9RAjMo0R2-C(o*;?OL=s2t4{U^rgTn7AlKQJi z;<u2KSYSBBVvvU0up|H)RYDR+?n)IPi6eK_Dv`vIYvd**@jEc{K}l=}lEht@#Q*>Q zZzG9YBZ<F264yr(|BFLhA_C#DBqa4Z5e%SVJ4i)<oW#75G$4y-;SeuH5=V~8y-;yb zrmaMZf{RdbEs*`larpuvff(8Q|NlQjB*F*CajAkNehbNGi;={UqjDpXI3x-{;s5{t z{})IS$Wg!@g|PS)k`E-1#F3*w6^FP5k~ne{_|zjwAP03e4)HD=;!}~tk)wbk8sUL^ zNFgK$6`!6F$S6>+0p)>`KJuWsA(Hq5B;6iJ;>t+kfk@&iNaCGH;t!F;_d>)Wg}@^u ziQ^Cna6N-;!38Ao$4Kg*A&Eah690fCj%<!#3?f*bG8!O8BczZdo*@~ej3oY?ak^d* zquBN}!Hjb_>)D{=wxC2V$H2f)2c6U4Lld6>6&FJjKLiz*Lla*K6<0$OzX=t$fsBvV zgG+9Z#UG#&mCyk>n1h(uA%5Ks9TI|xOF_k-LP}z|IgL>9w`k%^pyFRq#OoOtU=n{( zBp4Wspc+`AB`(b3El_b@H1Q~?xG0)<I#gU1P5cN*yq<x9K^0BnI!J<nfk78d{1sH( z6ixguRNNL#TmUrv&cMLniY6`x755DT6<`dI$`cd?4p4(a(KP5lHPk}OH&{qmLB(6q z#M7bT)6vA8q2luq;`Iz5i{qdYbD_lm%z`SY_);|SRZ#KmXyVOK@%?Dx^Pu7Z&};xR ze-8&#A|htHR|2Dw5aadfxkZfej5oHQEn=)^WV|!ow}f#y<DKbWOBnSfk#p2Js7_Fs z^L)E)DWkSn{cB!GQUw|R2*L!D0(@W!o<y6VNnH|2T%Lh};U08`TLVcPWEO1B*$_z_ zr2ZLHeKtgVx_b|!AY;e$huw_g^%EgtU^_u-KS0$kKoSR;4V$rEi6jnE{{yOCnIGYH zWIwqeiG!k$4Vrd*A>xpH4Kj#_6=FaPL;~y}kj1bm@l+&nka`iQ`uj-Y$QCmQK+FS~ z0kT*QYB490xI9BP1A_+CAPFQ1kS5riy9t^&Y_>fBO&m6l9El_ja;O2+{2$X3dl|(& zL5mweE(2KslD-0!77zr9LNXahE&-akB$32H>hD0+r%ylF%P5}Mfg}y`rX4iBO+*q0 zY5NA%wg5>SWX%R>9$Sed4pRRQs{S+BnkW(I5(1DGkTrEsYh;ncLE0psNmd6*9Hi$0 zG^d#&iG$QDuuVVI$Ee3>y!~Szqq#IwOw4qxRg7j_JAOezV?y%utW}I=oH=n2KI3G; znZncetYTDQ%8i@MI8$u0!c3Owe?a_#xamr(8SR)n;-)8o=!UrIi$L^*xap5TbVA&8 zr8SIpj0)2iu4Yu9-m!*Jg2^C$`l2<Ac1#ZO(;tE8fcWW3YZ>jB65^*Pt!1=hY?!XN zno)fEj<t*$OcUa#KLW`uh@Y;sj?s?EB7S-jh<*@1eG!QM5I_CVI!3$c@(UO_rfaNc zv|!qhFg<BKqa9N~{PacZ8SSP&SjWgQJ!3ti!gP)ej1o*4@za$yFxoL~NSvMoq8s9; zFWSIp#~3jE;d(~(=^PswC75Q!PgmN=XvcT~BGv&C+Ymo}5lAdx`oj$%b(<I^m`=n` zSK7pA$8;fidJ>2RISNEGq)dMVqJP9sSK7>I$7GN)J!vze9izbX#MO+#)3<D9)M1KF znf?eQcPe$d(iTQLCXIyYNn050I9KFB!rXfL$}NoMOdm?7KLSa66i-*$%4o-=P&z#c zL?;waUj(L0r#}MG6~)t)wt;+IHa!VM-zc8G2t;ovpZ*9$XOv7=+RkXlw4h>o5{Q0K zGJO$<zECm!(RQ%Y7H(q{o^G;(QHSY6<@BT-Aho5_7lG)8s_BnF^o7#tN;^T~)zgze zG(*|+MIgGMX8NO@jCPC%rZ3zMGGiB`4wFFb^rT&kc1$12rY{21wbLK%VzgsCF@50< zkec0$I-G0kAYSDFC$E~_j4Dh!>ZUK+4boOO{Sk=%Q9fO14=AZLO-};RJF2HI0?{j4 zrauDFH(I7E?PauMdeAaG2}&=5(vP6D(mqBzCW+SRNg&#xZu+8qjCPy~tq`k)z*hg+ z$Ed<&)Cy18Hv1V>m@HbSC+%mnV~VJozGy$A9p{PZ5G@C$zueDg&e;JP-UAJEP1iiY TXwLPZ2eRadOJMq{Rg7`~J1Xo} -- GitLab