From 2211d3fdc21f197c5e4991f096e673bc3f8231d9 Mon Sep 17 00:00:00 2001 From: timlinux Date: Sun, 4 Jan 2004 02:36:18 +0000 Subject: [PATCH] First working version of raster properties dialog. The dialog allows control over band<->color mappings, transparency, histogram inversion and provides some statistics. git-svn-id: http://svn.osgeo.org/qgis/trunk@406 c8812cc2-4d05-0410-92ff-de0c093fc19c --- src/Makefile.am | 1 + src/qgsrasterlayerproperties.cpp | 428 +++++++++- src/qgsrasterlayerproperties.h | 32 +- src/qgsrasterlayerpropertiesbase.ui | 1079 ++++++++++++++++++------- src/qgsrasterlayerpropertiesbase.ui.h | 74 +- 5 files changed, 1303 insertions(+), 311 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index cd10983dd6d..e625d4da12e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -89,6 +89,7 @@ qgis_MOC = qgisappbase.moc.cpp \ qgsattributetable.moc.cpp\ qgsidentifyresultsbase.moc.cpp\ qgslayerpropertiesbase.moc.cpp\ + qgsrasterlayerproperties.moc.cpp\ qgsrasterlayerpropertiesbase.moc.cpp\ qgslegend.moc.cpp\ qgslegenditembase.moc.cpp\ diff --git a/src/qgsrasterlayerproperties.cpp b/src/qgsrasterlayerproperties.cpp index 048d9a14491..1609474d0db 100644 --- a/src/qgsrasterlayerproperties.cpp +++ b/src/qgsrasterlayerproperties.cpp @@ -1,10 +1,9 @@ /*************************************************************************** - qgslayerproperties.cpp - description + qgsrasterlayerproperties.cpp - description ------------------- - begin : Sun Aug 11 2002 - copyright : (C) 2002 by Gary E.Sherman - email : sherman at mrcc dot com - Romans 3:23=>Romans 6:23=>Romans 5:8=>Romans 10:9,10=>Romans 12 + begin : 1/1/2004 + copyright : (C) 2004 Tim Sutton + email : tim@linfiniti.com ***************************************************************************/ /*************************************************************************** @@ -18,12 +17,427 @@ /* $Id$ */ #include "qgsrasterlayerproperties.h" - -QgsRasterLayerProperties::QgsRasterLayerProperties(QgsMapLayer * lyr) +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +QgsRasterLayerProperties::QgsRasterLayerProperties(QgsMapLayer * lyr) : QgsRasterLayerPropertiesBase() { + //downcast the maplayer to rasterlayer + rasterLayer = (QgsRasterLayer *) lyr; + //these properties (layername and label) are provided by the qgsmaplayer superclass + leLayerSource->setText(rasterLayer->source()); + leDisplayName->setText(lyr->name()); + //set the transparency slider + sliderTransparency->setValue(255-rasterLayer->getTransparency()); + //decide whether user can change rgb settings + if (rasterLayer->getBandCount() > 2) + { + rbtnThreeBand->toggle(); + //multiband images can also be rendered as single band (using only one of the bands) + rbtnThreeBand->setEnabled(true); + rbtnSingleBand->setEnabled(true); + txtSymologyNotes->setText(tr("

Multiband Image Notes

This is a multiband image. You can choose to render it as grayscale or color (RGB). For color images, you can associate bands to colors arbitarily. For example, if you have a seven band landsat image, you may choose to render it as:

  • Visible Blue (0.45 to 0.52 microns) - not mapped
  • Visible Green (0.52 to 0.60 microns) - not mapped
  • Visible Red (0.63 to 0.69 microns) - mapped to red in image
  • Near Infrared (0.76 to 0.90 microns) - mapped to green in image
  • Mid Infrared (1.55 to 1.75 microns) - not mapped
  • Thermal Infrared (10.4 to 12.5 microns) - not mapped
  • Mid Infrared (2.08 to 2.35 microns) - mapped to blue in image
" )); + } + else if(rasterLayer->hasBand("Palette")) + { + //paletted images (e.g. tif) can only be rendered as three band rgb images + rbtnThreeBand->toggle(); + rbtnThreeBand->setEnabled(true); + rbtnSingleBand->setEnabled(false); + txtSymologyNotes->setText(tr("

Paletted Image Notes

This image uses a fixed color palette. You can remap these colors in different combinations e.g.

  • Red - blue in image
  • Green - blue in image
  • Blue - green in image

Because the image is paletted, it cannot be rendered as a single band image. To display this layer in grayscale, set all three bands to the same color.

" )); + } + else //only grayscale settings allowed + { + //grayscale images can only be rendered as singleband + rbtnSingleBand->toggle(); + rbtnThreeBand->setEnabled(false); + rbtnSingleBand->setEnabled(true); + txtSymologyNotes->setText(tr("

Grayscale Image Notes

You can remap these grayscale colors to a pseudocolor image using an automatically generated color ramp.

" )); + } + // + // Populate the various controls on the form + // + cboColorMap->insertItem("Grayscale"); + cboColorMap->insertItem("Pseudocolor"); + if (rasterLayer->getShowGrayAsColorFlag()) + { + cboColorMap->setCurrentText(tr("Pseudocolor")); + } + else + { + cboColorMap->setCurrentText(tr("Grayscale")); + } + //set whether the layer histogram should be inverted + if(rasterLayer->getInvertHistogramFlag()) + { + cboxInvertColorMap->setChecked(true); + } + else + { + cboxInvertColorMap->setChecked(false); + } + //set the std deviations to be plotted combo + cboStdDev->insertItem("0"); + cboStdDev->insertItem("0.5"); + cboStdDev->insertItem("0.75"); + cboStdDev->insertItem("1"); + cboStdDev->insertItem("1.25"); + cboStdDev->insertItem("1.5"); + cboStdDev->insertItem("1.75"); + cboStdDev->insertItem("2"); + cboStdDev->insertItem("2.25"); + cboStdDev->insertItem("2.5"); + cboStdDev->insertItem("2.75"); + cboStdDev->insertItem("3"); + double myStdDevsDouble = rasterLayer->getStdDevsToPlot(); + cboStdDev->setCurrentText(QString::number(myStdDevsDouble)); + // + // Populate the statistics table + // + int myRowInt=0; + int myBandCountInt=rasterLayer->getBandCount(); + //allocate 1 row per struct element (11) + tblStats->setNumRows(11 * myBandCountInt); + tblStats->setNumCols(2); + QHeader *myQHeader = tblStats->horizontalHeader(); + myQHeader->setLabel( 0, "Property" ); + myQHeader->setLabel( 1, "Value" ); + //keep a list of band names for later use + QStringList myBandNameQStringList; + for (int myIteratorInt = 1; myIteratorInt <= myBandCountInt;++myIteratorInt) + { + + RasterBandStats myRasterBandStats=rasterLayer->getRasterBandStats(myIteratorInt); + + tblStats->setText(myRowInt,0,"Band"); + tblStats->setText(myRowInt,1,myRasterBandStats.bandName); + //keep a list of band names for later use + myBandNameQStringList.append(myRasterBandStats.bandName); + ++myRowInt; + + tblStats->setText(myRowInt,0,"Band No"); + tblStats->setText(myRowInt,1,QString::number(myRasterBandStats.bandNo)); + ++myRowInt; + tblStats->setText(myRowInt,0,"minValDouble"); + tblStats->setText(myRowInt,1,QString::number(myRasterBandStats.minValDouble)); + ++myRowInt; + tblStats->setText(myRowInt,0,"maxValDouble"); + tblStats->setText(myRowInt,1,QString::number(myRasterBandStats.maxValDouble)); + ++myRowInt; + tblStats->setText(myRowInt,0,"rangeDouble"); + tblStats->setText(myRowInt,1,QString::number(myRasterBandStats.rangeDouble)); + ++myRowInt; + tblStats->setText(myRowInt,0,"meanDouble"); + tblStats->setText(myRowInt,1,QString::number(myRasterBandStats.meanDouble)); + ++myRowInt; + tblStats->setText(myRowInt,0,"sumSqrDevDouble"); //used to calculate stddev + tblStats->setText(myRowInt,1,QString::number(myRasterBandStats.sumSqrDevDouble)); //used to calculate stddev + ++myRowInt; + tblStats->setText(myRowInt,0,"stdDevDouble"); + tblStats->setText(myRowInt,1,QString::number(myRasterBandStats.stdDevDouble)); + ++myRowInt; + tblStats->setText(myRowInt,0,"sumDouble"); + tblStats->setText(myRowInt,1,QString::number(myRasterBandStats.sumDouble)); + ++myRowInt; + tblStats->setText(myRowInt,0,"elementCountInt"); + tblStats->setText(myRowInt,1,QString::number(myRasterBandStats.elementCountInt)); + ++myRowInt; + tblStats->setText(myRowInt,0,"noDataDouble"); + tblStats->setText(myRowInt,1,QString::number(myRasterBandStats.noDataDouble)); + ++myRowInt; + } + // + // Set up the combo boxes that contain band lists using the qstring list generated above + // + if (rasterLayer->hasBand("Palette")) //paletted layers have hard coded color entries + { + for ( QStringList::Iterator myIterator = myBandNameQStringList.begin(); + myIterator != myBandNameQStringList.end(); + ++myIterator ) + { + cboGray->insertItem(*myIterator); + } + cboRed->insertItem("Red"); + cboGreen->insertItem("Red"); + cboBlue->insertItem("Red"); + cboRed->insertItem("Green"); + cboGreen->insertItem("Green"); + cboBlue->insertItem("Green"); + cboRed->insertItem("Blue"); + cboGreen->insertItem("Blue"); + cboBlue->insertItem("Blue"); + //now set the combos to the correct values + cboRed->setCurrentText(rasterLayer->getRedBandName()); + cboGreen->setCurrentText(rasterLayer->getGreenBandName()); + cboBlue->setCurrentText(rasterLayer->getBlueBandName()); + cboGray->setCurrentText(rasterLayer->getGrayBandName()); + } + + else //all other layer types use band name entries only + { + for ( QStringList::Iterator myIterator = myBandNameQStringList.begin(); + myIterator != myBandNameQStringList.end(); + ++myIterator ) + { + cboGray->insertItem(*myIterator); + cboRed->insertItem(*myIterator); + cboGreen->insertItem(*myIterator); + cboBlue->insertItem(*myIterator); + } + } + // + // Set up the colour scaling previews + // + makeScalePreview("red"); + makeScalePreview("green"); + makeScalePreview("blue"); + makeScalePreview("gray"); } QgsRasterLayerProperties::~QgsRasterLayerProperties() { + delete rasterLayer; +} + + +void QgsRasterLayerProperties::apply() +{ + + rasterLayer->slot_setTransparency(static_cast(255-sliderTransparency->value())); + //set the grayscale color table type if the groupbox is enabled + if (grpBoxGrayscale->isEnabled()) + { + if(cboColorMap->currentText()=="Pseudocolor") + { + rasterLayer->setShowGrayAsColorFlag(true); + + } + else + { + rasterLayer->setShowGrayAsColorFlag(false); + } + } + //set the std deviations to be plotted + rasterLayer->setStdDevsToPlot(cboStdDev->currentText().toDouble()); + //set whether the layer histogram should be inverted + if(cboxInvertColorMap->isChecked()) + { + rasterLayer->setInvertHistogramFlag(true); + } + else + { + rasterLayer->setInvertHistogramFlag(false); + } + //now set the color -> band mapping combos to the correct values + rasterLayer->setRedBandName(cboRed->currentText()); + rasterLayer->setGreenBandName(cboGreen->currentText()); + rasterLayer->setBlueBandName(cboBlue->currentText()); + rasterLayer->setGrayBandName(cboGray->currentText()); + + rasterLayer->setlayerName(leDisplayName->text()); + //make sure the layer is redrawn + rasterLayer->triggerRepaint(); +} +void QgsRasterLayerProperties::accept() +{ + apply(); + close(); +} + +void QgsRasterLayerProperties::sliderMaxRed_valueChanged( int ) +{ + //the 255- is used because a vertical qslider has its max value at the bottom and + //we want it to appear to the user that the max value is at the top, so we invert its value + if ((255-sliderMaxRed->value()) < sliderMinRed->value()) + { + sliderMinRed->setValue(255-sliderMaxRed->value()); + } + makeScalePreview("red"); +} + + +void QgsRasterLayerProperties::sliderMinRed_valueChanged( int ) +{ + //the 255- is used because a vertical qslider has its max value at the bottom and + //we want it to appear to the user that the max value is at the top, so we invert its value + if ((255-sliderMaxRed->value()) < sliderMinRed->value()) + { + sliderMaxRed->setValue(255-sliderMinRed->value()); + } + makeScalePreview("red"); +} + + +void QgsRasterLayerProperties::sliderMaxBlue_valueChanged( int ) +{ + //the 255- is used because a vertical qslider has its max value at the bottom and + //we want it to appear to the user that the max value is at the top, so we invert its value + if ((255-sliderMaxBlue->value()) < sliderMinBlue->value()) + { + sliderMinBlue->setValue(255-sliderMaxBlue->value()); + } + makeScalePreview("blue"); +} + + +void QgsRasterLayerProperties::sliderMinBlue_valueChanged( int ) +{ + //the 255- is used because a vertical qslider has its max value at the bottom and + //we want it to appear to the user that the max value is at the top, so we invert its value + if ((255-sliderMaxBlue->value()) < sliderMinBlue->value()) + { + sliderMaxBlue->setValue(255-sliderMinBlue->value()); + } + + makeScalePreview("blue"); +} + + +void QgsRasterLayerProperties::sliderMaxGreen_valueChanged( int ) +{ + //the 255- is used because a vertical qslider has its max value at the bottom and + //we want it to appear to the user that the max value is at the top, so we invert its value + if ((255-sliderMaxGreen->value()) < sliderMinGreen->value()) + { + sliderMinGreen->setValue(255-sliderMaxGreen->value()); + } + + makeScalePreview("green"); +} + + +void QgsRasterLayerProperties::sliderMinGreen_valueChanged( int ) +{ + //the 255- is used because a vertical qslider has its max value at the bottom and + //we want it to appear to the user that the max value is at the top, so we invert its value + + if ((255-sliderMaxGreen->value()) < sliderMinGreen->value()) + { + sliderMaxGreen->setValue(255-sliderMinGreen->value()); + } + makeScalePreview("green"); +} + + +void QgsRasterLayerProperties::sliderMaxGray_valueChanged( int ) +{ + //the 255- is used because a vertical qslider has its max value at the bottom and + //we want it to appear to the user that the max value is at the top, so we invert its value + + if ((255-sliderMaxGray->value()) < sliderMinGray->value()) + { + sliderMinGray->setValue(255-sliderMaxGray->value()); + } + makeScalePreview("gray"); +} + + +void QgsRasterLayerProperties::sliderMinGray_valueChanged( int ) +{ + //the 255- is used because a vertical qslider has its max value at the bottom and + //we want it to appear to the user that the max value is at the top, so we invert its value + if ((255-sliderMaxGray->value()) < sliderMinGray->value()) + { + sliderMaxGray->setValue(255-sliderMinGray->value()); + } + makeScalePreview("gray"); +} + + + +void QgsRasterLayerProperties::makeScalePreview(QString theColor) +{ + double myMinDouble=0; + double myMaxDouble=255; + double myRedDouble = 0; + double myBlueDouble = 0; + double myGreenDouble =0; + unsigned int myTransparencyInt = sliderTransparency->value(); + //the 255- is used because a vertical qslider has its max value at the bottom and + //we want it to appear to the user that the max value is at the top, so we invert its value + if (theColor=="red") + { + myMinDouble=sliderMinRed->value(); + myMaxDouble=255-sliderMaxRed->value(); + myRedDouble=myMaxDouble; + } + else if (theColor=="green") + { + myMinDouble=sliderMinGreen->value(); + myMaxDouble=255-sliderMaxGreen->value(); + } + else if (theColor=="blue") + { + myMinDouble=sliderMinBlue->value(); + myMaxDouble=255-sliderMaxBlue->value(); + } + else if (theColor=="gray") + { + myMinDouble=sliderMinGray->value(); + myMaxDouble=255-sliderMaxGray->value(); + } + QImage myQImage = QImage(100,1,32); //32bpp + double myRangeDouble = myMaxDouble - myMinDouble; + double myDecrementDouble = myRangeDouble/100; + //std::cout << "Decrementing " << theColor << " by : " << myDecrementDouble << std::endl; + if (myDecrementDouble==0) return; + for (double myDouble=99; myDouble >= 0; myDouble=myDouble-myDecrementDouble) + { + if (theColor=="red") + { + myRedDouble-= myDecrementDouble; + } + else if (theColor=="green") + { + myGreenDouble -= myDecrementDouble; + } + else if (theColor=="blue") + { + myBlueDouble -= myDecrementDouble; + } + else if (theColor=="gray") + { + myRedDouble -= myDecrementDouble; + myGreenDouble -= myDecrementDouble; + myBlueDouble -= myDecrementDouble; + } + //std::cout << "R " << myRedDouble << " G " << myGreenDouble << " B " << myBlueDouble << std::endl; + myQImage.setPixel(static_cast(myDouble),0,qRgb((unsigned int)myRedDouble, (unsigned int)myGreenDouble, (unsigned int)myBlueDouble)); + } + QPixmap *myQPixmap = new QPixmap(100,100); + myQPixmap->convertFromImage(myQImage,36); + if (theColor=="red") + { + pixmapScaleRed->setScaledContents(true); + pixmapScaleRed->setPixmap(*myQPixmap); + pixmapScaleRed->repaint(false); + } + else if (theColor=="green") + { + pixmapScaleGreen->setScaledContents(true); + pixmapScaleGreen->setPixmap(*myQPixmap); + pixmapScaleGreen->repaint(false); + } + else if (theColor=="blue") + { + pixmapScaleBlue->setScaledContents(true); + pixmapScaleBlue->setPixmap(*myQPixmap); + pixmapScaleBlue->repaint(false); + } + else if (theColor=="gray") + { + pixmapScaleGray->setScaledContents(true); + pixmapScaleGray->setPixmap(*myQPixmap); + pixmapScaleGray->repaint(false); + } } diff --git a/src/qgsrasterlayerproperties.h b/src/qgsrasterlayerproperties.h index 4d68ed10435..c9d2f93d2f7 100644 --- a/src/qgsrasterlayerproperties.h +++ b/src/qgsrasterlayerproperties.h @@ -19,21 +19,37 @@ #define QGSRASTERLAYERPROPERTIES_H #include "qgsrasterlayerpropertiesbase.h" #include "qgsmaplayer.h" +#include "qgsrasterlayer.h" /**Property sheet for a raster map layer *@author Tim Sutton */ -class QgsRasterLayerProperties : public QgsRasterLayerPropertiesBase { -public: -/*! Constructor -* @param ml Map layer for which properties will be displayed -*/ - QgsRasterLayerProperties(QgsMapLayer *lyr); - ~QgsRasterLayerProperties(); +class QgsRasterLayerProperties : public QgsRasterLayerPropertiesBase +{ + Q_OBJECT + public: + /*! Constructor + * @param ml Map layer for which properties will be displayed + */ + QgsRasterLayerProperties(QgsMapLayer *lyr); + ~QgsRasterLayerProperties(); -private: + void apply(); + void accept(); + void sliderMaxRed_valueChanged( int ); + void sliderMinRed_valueChanged( int ); + void sliderMaxBlue_valueChanged( int ); + void sliderMinBlue_valueChanged( int ); + void sliderMaxGreen_valueChanged( int ); + void sliderMinGreen_valueChanged( int ); + void sliderMaxGray_valueChanged( int ); + void sliderMinGray_valueChanged( int ); + + private: + void makeScalePreview(QString theColor); + QgsRasterLayer * rasterLayer; }; #endif diff --git a/src/qgsrasterlayerpropertiesbase.ui b/src/qgsrasterlayerpropertiesbase.ui index 7fbb4cd9b31..d9cc4d7485e 100644 --- a/src/qgsrasterlayerpropertiesbase.ui +++ b/src/qgsrasterlayerpropertiesbase.ui @@ -8,347 +8,836 @@ 0 0 - 485 - 340 + 455 + 473 Raster Layer Properties - + + true + + - Symbology + unnamed - - - 10 - 10 - 460 - 290 - - - + - tab + buttonHelp + + + &Help + + + F1 + + + true - - General - - - - textLabel1 - - - - 17 - 34 - 90 - 21 - - - - Layer Source: - - - - - textLabel1_2 - - - - 20 - 70 - 90 - 21 - - - - Display Name: - - - - - lineEdit1 - - - - 110 - 30 - 301 - 21 - - - - - - lineEdit1_2 - - - - 110 - 70 - 301 - 21 - - - - + - tab + tabSymbology - - Symbology - - + - unnamed + tab - + + General + + - groupBox1 + unnamed - - RGB - - + - unnamed - - - - textLabel2 - - - Red - - - - - textLabel2_2 - - - Green - - - - - textLabel2_3 - - - Blue - - - - - textLabel2_5 - - - Band - - - - - textLabel2_4 - - - Color - - - - - comboBox1 - - - - - comboBox1_2 - - - - - comboBox1_3 - - - - - - - groupBox1_2 - - - Grayscale - - - - comboBox1_4 - - - - 110 - 19 - 93 - 20 - - - - - - textLabel2_6 - - - - 11 - 19 - 93 - 20 - + lblLayerSource + Layer Source: + + + + + lblDisplayName + + + Display Name: + + + + + leDisplayName + + + + + leLayerSource + + + false + + + + + spacer2 + + + Vertical + + + Expanding + + + + 21 + 91 + + + + + + + + tab + + + Symbology + + + + unnamed + + + + grpBoxRGB + + + RGB + + + + unnamed + + + + textLabel2_5 + + + Band + + + + + textLabel2_2 + + + <b><font color="#00ff00">Green</font></b> + + + + + cboBlue + + + + + cboRed + + + + + cboGreen + + + + + textLabel2 + + + <b><font color="#ff0000">Red</font></b> + + + + + textLabel2_3 + + + <b><font color="#0000ff">Blue</font></b> + + + + + textLabel2_4 + + + Color + + + + + + + grpBoxGrayscale + + + Grayscale + + + + unnamed + + + + textLabel2_6 + + + Gray + + + + + cboGray + + + + + cboStdDev + + + + + textLabel2_6_2 + + + Std Deviations + + + + + cboColorMap + + + + + textLabel2_6_2_2 + + + Color Map + + + + + + + bgrpShowAs + + + Show As + + + + unnamed + + + + rbtnThreeBand + + + Three Band + + + + + rbtnSingleBand + + + Single Band + + + + + cboxInvertColorMap + + + Invert Color Map + + + + + textLabel2_4_2 + + + Transparency: + + + + + sliderTransparency + + + Horizontal + + + + + textLabel3 + + + None + + + + + spacer4 + + + Horizontal + + + Expanding + + + + 100 + 21 + + + + + + textLabel4 + + + <p align="right">Full</p> + + + + + txtSymologyNotes + + + true + + + <h3>Notes</h3> + + + WidgetWidth + + + + + + + + + TabPage + + + Advanced Symbology + + + + unnamed + + + + grpBoxGreen + + + Green + + + + unnamed + + + + sliderMaxGreen + + + 255 + + + 0 + + + Vertical + + + + + pixmapScaleGreen + + + image0 + + + true + + + + + sliderMinGreen + + + 255 + + + Horizontal + + + + + + + grpBoxRed + + + true + + + Red + + + + unnamed + + + + pixmapScaleRed + + + image1 + + + true + + + + + sliderMinRed + + + 255 + + + Horizontal + + + + + sliderMaxRed + + + 255 + + + 0 + + + Vertical + + + NoMarks + + + + + + + grpBoxBlue + + + Blue + + + + unnamed + + + + sliderMaxBlue + + + 255 + + + 0 + + + Vertical + + + + + pixmapScaleBlue + + + image0 + + + true + + + + + sliderMinBlue + + + 255 + + + Horizontal + + + + + + + grpBoxGray + + Gray + + + unnamed + + + + sliderMinGray + + + 255 + + + Horizontal + + + + + sliderMaxGray + + + 255 + + + 0 + + + Vertical + + + + + pixmapScaleGray + + + image0 + + + true + + + - + - checkBox1 - - - - 10 - 80 - 180 - 21 - + textLabel1 - Invert Color Map + <b><font color="#ff0000">Please Note :</font> Advanced Symbology not implemented yet!</b> - - - comboBox1_4_2 - - - - 110 - 50 - 93 - 20 - - - - - - textLabel2_6_2 - - - - 10 - 50 - 93 - 20 - - - - Std Deviations - - - - + + + + + TabPage + + + Statistics + + - buttonGroup1 + unnamed - - Show As - - + - unnamed + tblStats - - - radioButton1 - - - Three Band - - - - - radioButton2 - - - Single Band - - - - - + + GroupBoxPanel + + + Plain + + + 3 + + + 3 + + + true + + + + - + - TabPage + Horizontal Spacing2 + + + Horizontal + + + Expanding + + + + 140 + 20 + + + + + + buttonCancel + + + &Cancel + + + + + + true - - General - - - - - spacer1 - - - Horizontal - - - Expanding - - - - 161 - 21 - - - - - 130 - 300 - 161 - 21 - - - - - - pbnOk - - - - 370 - 300 - 91 - 31 - - - - OK - - + + + buttonOk + + + &OK + + + + + + true + + + true + + + + + buttonApply + + + &Apply + + + Alt+A + + + true + + + true + + + + + + 789cdd9c59532bc97280dfe7574cdc7abbe128230990140e3f88458855123b38fc506b03da00ed72f8bf3bab32b3682d9cc39961ec095f4273f8e8a5322b97caac6edd7ffde7eff7adf3dffff9afbf0d476af46c7e374feafdf77fda71af37ff8ffffcf7fffaed1f85adaddfc367a75cfcbdf88f7ff9ed1f62f6bbf95d6cc5ff45ae26ae045623e6021e9f126fe3f94a26c6f387cc74fe84b842e7d713e3f945663cdf1e25c6e3156283d77b97188f93bc0592dfce89493edd885c49f28e13e3f587cc38be7b4d1c8feb6362965f24c6e337cc74fd41623c3e2026f96d23318e3f61a6f9427d2bac8f7b4f8cf7db63c6fb8b3931e92748bf02c9ab3bc434be89f2c3dd683c7788cce3659a198f9b2762be7f9398ee2f5ac4747f75805c647ff2c4747d5620a6eb5d9c9f4285cf5777c474be9f24467d1d31db4311d3f899095c4ce3e947629e8f2e319d2f32e412cbbb20a6eb4d8998f52d47aef2f9d97362b4e72531fbdb19318f5f23667fa8206fd3fd4cf48f5281cf571d62b6df55621c8f98af174f89f1f83b31c9639f12c7e37ec84cf61e11d3f836c67729c9a74f88797e5462b4cf0533f9f38898e7af9d18e59b12b33d4ce2783c3b42ded9217f88f3bb5de0f9159698e5ad21f3fddd0b31dddfdd2546fdf798515ead9177d81f4f13c7f34d8f99f4a3f1583ef79018e5a7f176aa24ef4b62bc5f1979b740f92ffaebb64afe80f7533b3b24df2b315f3f64a6e3bbc87c3f1ff3eb4e31cdef73629c9f6b66babe8cbc6331bff82973b11acfef20ef1668fc0366bafe8198e4f58f89f1fc4be622eabb4d4cf3e39bc496e62ffad70ee8532ac4fb6f11d3fcaa7d669abf0931cd8fd8652679dac4747f7fce4cd7cf1263be7d61467995462e93be669618cf5f30e3f9d90131fb874d8cf35f61c6ebb368dfdd22cbef4e984b71fe6d8998e47313661ccfd59971bebc4f1cafcf46c82cbf2a25c6fb7599c93e0b6292cfb79849bf2231d9cfdd32d3faa498e9fc2d62f6af18efbbc91eea8599e24b2327798f88391e4e13e3fdfacce8af7ec08cf361b689697eed0533e9df64c6ebc51e31c9a365623cdf30d37cb512e3f84fc8159a5f75cd8ce7fb68ff7229f91333c78f222679b32b663a7e9a18e3ab484cf369f699f1b81d30933d86c82c8ffde028bf9a1193bdfd59623c7e4f4cf395bd30e37cdb98ffca3ad9bbc34ce3f513e3fd0ac83c5fee86198feb6be66df4efe7c42a9e9f11933fd863661ccf48629677ce4cf9a547ccf1fe9618cfc7f9d655922f3b61a6f8db498cf23e31533cc6f8aaa4f9ceee89c9deaec64cf71b3293be6fc49cef9f99f17cd121e67c50488cf2ec2327f9de98513e41f255c9be7ace8cc79d20a6f95327cc747c3731e6ab98ef2bc97e62484cf7cf3266f29773628ebfc4a8bf7d491ced9d8d89d99f7bc855d257bc3353fe7b4056ecdfe7cc34fe7e628cdf1931e7937766b2673931ae8f313eabdb3cbfaa4d4cf29a6762ce1f656445eba92e30d3fc5c32e3fd8560c6fbd90362ce6fd789d17e9619e74fcf8815d92763c6fbf912b1c3f14d9b99c697cc783f3340d645aabf7698295f5c27c6f971cce46fafc4bb74fd5b62cc970d6245ebcb7962cc2775668a9fd80f560dfba3ed10933f18cd4cf16e98297fbc31efc4fed8e07886ed93f599f1faec3631fac70db1227ff4cc34df241fcc2fe6a32e331e37efcc38bf0afdc5c07ce1fc9f31e3f1ec2231fac32131cd67564a8cfed663c6f9ca1acc288fbc63c6f19461a6fcb3c58cf3238e89c93eea3131daafcf8ce3c993c4f1b8bc61267bb513c7f1e598d8e1fd652d315e3f67a6fbef25c6f117cc34df1789513fb29f21ff9583c478ff0e33dd7f9218d7970231cdb7a827c6fae79199ea19b28fa1f9b1d19e2ac5abbf2726fbfb2a33ceb7ce90d91ff42d331ef76362b29fad3353fedc4b8cf9689719afcf3ac4641f5d64a6f584af67fb3c30d3fd7b89d11fd3718a279697ec67af99a99eb189b17e61f9c97e763731e613c98cfe23af12633c1598513ee713a37c8619e5b337c8c91f1689d11f3266f28783c478fc9899e2a99918e5f1cc94fffa89713e493ff6276913e3fd05338daf13e3f143661c5f4f12e37c959869fdba4d8cebcd0e31c5b33c4f8cf71f32d3f84f89d15e67cc34de16338db74fccf17c9618af6f31537ca1be86d72f3f4a1ced27f07e217fa1fcd7cc141f3bcc74bd64267f1c1393bcaacb4cf9b6c74cfeb2454cfee5787c8ed74562940fe327e5177f9218d7933d66b2d74562bcff2333ce9f1a244679b79829fed27824af65a6fc71484cfea57c629c7fc74cf5653b31e6d31d66aa374f12e37cd799291ed3f524ef3133d50f7b8951de743fb2cf2931f99fb96326ff7b4d8cf35963a67c314e8cf15562a6f5bf9f18ed7dc58cf2c9adc4285f1a0fe553bbc4e4cff63631aeb7ac2fe537719718e3a9c24cfe9731533d97aea7f8c4783196fcc72a668abf1a33d927da4ba7f5c0cd9869fefb8951bf6762d25f1f3193be7b89b1fe6e1393bcda25c6f116cc947f2f98e97acbbc8beb570d99e3c39d31d3faa013e3fcdd3293bfdd27c6f5749719f5d39e19c717a45f5abf0b89f1fefbcc140f95c428df9c99fced3e31fadb3533f547e3c4b83e7799c9df46c49c7f1b89519e1933f9ff3431da7fc24cf5e761629c0fd697fc5df17c93bd4d9618e76b9b99ea8b97c4f1b82c13733eef254679f97cf6ffdbc4585f2866ea172e12633ee1f964ffba4c8cf2a7f128ffee2446f9882de55ff19018ebb32d66f2af749ce2b1c94cf5e96962cc17249f257ff187ccb41ec5f5515b5e0ff41933ce9f7944e6fcedb3c4e89f97cc181fba49ccfe3765a6fd8a0766ea0f26cc54dfcd12e3f87366bcbf3922267fd32d66f2ff5262cc3f3c3ef99b1e2546fb0966f2ff46629cbf376692b79938caa76e9849fe0533c9fb4accfed74f8cfed765a6787189f1f82933c93f4e8cf1cbfa93ffa98bc4a81feb4ffea7ef12a3bd87cc943fe97eec8fd2248ef2b447cc24af4a8cf2d699a99f39498cf5e51b33cdf75362ccc797cce46f647fcbf5e651621ccf33933ccf89f1f83633c5ef3133ad276562ca67e28699f63b178971fd8efa991df60fb7cd4cf3fb9e18fb75cd8cf3eb4689f1789b19fd257b4b8cc71531d9dfb512a37dcf99a9df1f2446ff7864a67efd3531eea73498297f0a6694c7dd27c678b4c86cffec3d31cecf3633d9fb8699d6bfcbc4b8be7866caef5b8971fded32537d78c54cf21d11737d78cf4cfef09618fde18299f2513931c6fb3533c95b4c8cfabc30d37a584d8cf990f5e77cd64a8cc769bed9bfe47b62ac5f1d33d54703668a977e62ccff6c0fce4f8fcc34fe9498f28967f9c87f6ccc6726c59bbd4a8cf9a1ca8cf2db1133f9eb7e62f4d753e64a29cacfccf59c498cf63d66a6fcf39418f3eb3633d9fb3931cee70131ef5f3966b24f2131faef2133c97f9318e3e18eb91ce537ac3ff7fb1d66f2971233d5c3cdc4288f66a67c769018e5d961a6fa92e6df71ff3467a6f98afda10df18af2f69079befd6b621dcf17c4bbd5edc8e7c49cff0f98697fe19d99ec5964c6f9c81cb2e3fc5c60a6fc10fdcd3ab6677b24c55ff5916ae9771d3e898db4f4f996b1a22ffd659afce4c39ad8efb9df37d8c5e6e6f757a4b37f3fbb6cd26455caf0ef7749fc97dae5a7da7d7a5e881ff7113ffff776f982369f9fa7be4f93bfc62eed4f62e8475ef8f7b5cb2f6af737b38bf4f1df0c3e4ff219f84576422cd09a92bc4976e1ef1e3ebd787e07f8e9ef6517d99703902e8bbfbf44090568f42adf4033d42283bf67f0fb13fc0d7f7f8e5a64df67fbefb08b7c9743906e00bf0f837d40ab41f49ea0e1488e933d509b60a7899cc26726e7f0f9366dbe2d5e16a4c9b0fd111b0bd02afc5b0b36a30cbc27f7e501fc7b28ebd15eec6d7f0fbbd828f1116812a46ec85aee98260d0ee0df20fd31d8e3449e02cfe2b9e1bab3bfd5ba7f0e129d47efea82e41720f1a96cca966ccb4b7925afe58dbc9577f25e3ec847b9250bf0f7a22cc96d38d7c3753b7fab7aec48eeca3268f2262bb20a923e0a298450420b23ac70c2c71f2732f1249ec58be888aee889be18c0f95df1fa3d9a7cd12e9fad031f6b440fa2f854b6c59b7817433102a9c76222a6f13315b3f4338d7f9b88b958889ad813fb70cd01d811bc906cfc27d69b2fd805ee2e0ee1538fa3510f02197521c0b344431ccb993811a7e24c9c8b0bd18cf2f2cfec939f2969d5126db0dfa5b812d790d71a70bf1bc87d21cf417610b710532fe2eefbec12e64adc8b43f1201ec5166a220a9097de654d1465264a625bec885d511695287d957e366b4147955422f2443495525a1965213b34e400c6780ab1049a68e5a450febbed02dad457fe5e935395a927f5ac5e5487f498c112ff234d3e348dfad0dfa2cf813e5dd59355d5871c17ea8890e561a555fdef8d17b0495d3ca41801cf82d1a66aa05ed59b7a0759c86f92743ffaa9aaa11aa9115967ac849ac4abe76aaa66f24ecdd50256558ec3689b6fb30b7cc4e352b497c126a7aaa6f6d4be3a08f600e90ebfa4c766fb8066aa1e23a8a58e20076ecb431a6b4815d097fad6afad2fe0c3acc9ae34aa212fd4b13a51a71c213ccf9f44fc06af4bbec8ba8ce219419b3375ae2e5413b2cb206ad3fb6a6dfd2beb4bb88b6ac19d4e4193b6ba8c52a367ad47c8cabce733027895402b828fc978f52cdd01b29bba52d7ea469c40dc0c544bdd7e753fe197d67dbc93936d18eb8e34c1084099d6f558e6bca6681d91bb4b2e5fab4b75af1ec4098c1956e16fb44b5c4f82a5fbea116cb2a50ab0864fd3c833caaee42bc906abab095bb1ae8a4bde565fb12766b6962a8537bec49102af8e3578cc9db00a883f6597b09e58c85d355506efba464dc81279eb044d866a98f3960afc54213f6015d3521f111574926433ac053ebc15ff926918582b58917146fbd8f1c1baf627f218081d7a8ca1749085dbe05dec374b7936678da9aa80dc975aab9236e1f9aa32da8b339de927fdac5fc44277a2ec613e5276e6f84934d55ddd534f50e1a8d8ab66ab3de86aec7cc92e35988b819ceabee862c4a7b95fce49510f3d80197dd56ffa5d0fc5a91ae8916ceab19e40955282bab9ada77aa6e77aa16b2a6641bd172cba124dd568bb89aee97d8df51a77dba1a35b8e5ff32b76d18750393a5dd7475a730e0e63ea866ea02630cc31da439fe8537d26aff4b9bed04dd5d72ddd86fa39746883d0db406eea28ab2ff515d8eb1aeae631ddf150dfe4f4497e07f7bbd577d0efec4317578fdabcfe71bbc475bea8efd5ab7e80f52497758226649518affa516fe982bcd4455d82d1bbe0157de82d3f72cf2e64f4d0eb583983b5bda8b7f58edec5d536c5df2c45e10c2c3c13155d866c53967bba02f55ae8ea2e9635f9d0e62bf558a85874d5c8382a65a37cee31218f4d4c78916dcb1899196b1c7fa246bd58cb51078d751dacbe7b50507a9309a94fcc13e7c4941567699ca6799625f312fbd13de84b353d3b58cbd0c92e1b73369d39361dd3555754a72ffb3566e58ae999bec974c50ce2f9af608f7e8cd6f059502d173408fd7d2d6a86ff3e9937f36e863176a6e17e54414f53cd3d352333d69766029ab8d86d7c12fd6497d5156818a3bd2787c12b74cb4cd50b8ef5b122aa711829d84455cdccccd500e64daf8e00a30bd0e4dc2c2017bd44db0ce0538b911c769f7aa6a6a766cfec8336b31833cb15449c2d73600e4ddd1cc5bd9de18aac2bf1b2a932089a480f15441f3aad1dd358ca5e791fab286dc6e6d89c4086e8c51d89e40174af7358bb07a14235a770ceb63933e7e6c234e55e7b645af0b78e1e9bb6b90cd1b856a1c611cd95b93637e6d6bc9a3bd086ef8dbb886b796cb532087b5ce61eb419c9b9da864eab123db9caabe347ef611ecca3ee4327d5e12a70cd363ec41c48d1900766cb144cd194ccb67c902d888146acec3b66c7ec9ab29888d58a0675793215b50536ce4cd5dca627216a392296e285e7318b19b46742773a3027d0fd9673ddc9946ac1b802581053f4c1bb3a6967c9afe5fea13cb20afebe67b535505886bd80965e586b1d68f32eea70ecd87a9bd9a7b8ceced67ea6a26c9f751db4790debff8fd7fda5273f2f1f358f54ba6f5f8255700549311fab11ddb51ddb054d6a6813f048de89cd578247720cf3afc5b6edd93e6882913db603fb6a6eec1b5c730675d6897dd74f54e9ad5574aa628776146be74f73ee46bb84ddeb215674762cde8c8a56c965175ca7e1fe13dbb553aa3c8f40938ffde17cc60cb5ee9e38003bcca01b9ec6baad28a6766e17f2c1bcc9b978806b1b762c1fed0cab9b655d601ea7b666f764d1be81e7c71af1a776415b74a9976bc843b365f743f607ffca57918771aeaeec812cd8c398210c4638ed862fd90572a1009bd4c126cde0a9f6488df48d6dc0ef77f6d89e40dc84d983f1eca9be5567ebba44ef6ed9335593fbd1f3d7626579ddcf791977a57355167d7bbe9c8be1ce500d87fc652f6c53662a64a272f4a450993f51bd1434d8e5d901db3dd856a85762855f4d2b53f0b419acff63d006eea19c6ddbcb64999598012fbbb2d79cc348e64feae46497678ae42e54758f6214a33d5f2be1ef993e839c6fedcd924d794d3eb2b7b107f5525b0f9adc814d3efa938fee07565fb36f0aa2049d77590eedbd7d10595a29f39699d847b3a75b718d59c45538a7d55a3d96ec026786f55be89190f1ceab3d62a8be5eed962e41a5f2bad6b92e64d916e40e66023db6455b12ad581f8ca285a7d493d5491f6fb7ed0ed459700f3d510ffa1572d964d92ad12f321dea31936a8a28ef87b76db4cb0b6813a45376578858c9e6ac42f5790baafa73582fec860ef6c8166c19e207b288f5a60071d2fae8b4a8769ca49c08f5b0add8aacae26c5e3850082abf155de29863279c42bbe4e5fdd42ee1e81e7859f85dcb16ac0613915bbda877827cefb4be905da81ed77a717b2bcb71df7f2e06f2ca99585dcf6c23e79f93b4331872c881b3ce414c05e9821d7bea72a35d26d069d6a387f597ab97cd7689560b2b52b48b6c0bbd5c15475dc25db51eea66a88997aa7afac4ec3c375bcebb0c7ac8d56a946a61fa6f453fdbb67b825513e61c3ae243f7ec5e566b71cc9cae232f21fac92e9fe7b19c5db47c8bbeae21f2cd06bbc0f8ae6b8ceb85f981685c5d4f4255b2e7face438eea7c484535507ea6a76e604b10f9d77a22ebe20eae1bcbbaaa294d764951ea5ea305a76a0bfa986cf3dabfd12ea1bf1ec5dda32b6157e627eaa207ee0dbadf56c827304fdd954ee119eb2e7b1c3471efac49ae332129ddc00d6d1132ff63ac357cdc13d5d0cdbd89e54a06a374aacedc08ecd7fd15bbc0670cbf1fb8716ef78874895254a0c315d0fd1aa8f4ba6b773d962d53803819474d363fbb885d8f9bd8a29bca791b3b681b7bceaef16e162a9d8f0e93bc136a26f9e0e6d12e597c56bdb6bee4f341b44d37ced140c2ca25fc4a36c14aace516b2096b7cf0a6d0699dc7aae708d77859852cdc876a8577c6967631632e9b84dad7d5dc5e88b9b82301be009dda30f636a7f20e32df2c55e5497f75671e0d3e07c2ecbcdeeff3ba129e90f2ef3666e6fb0dbac4cc030df138746aa20e1258da5b1c87277d76eaf65529cac2d5747ee712feeb0ec0bb0e5ddd3e981bb97047d0d7dcc94e7b142bd461f050d780ac9cecf7f103d1550ff92ecaea36edc3e47a405c577cdc59cbc2fcd06ed8b29fc3eaa63d442b548d141f03d170c771bfa60aa3ddb9c15a17925fa18631e24edca9aab9b3980707d1260d771e67f0d414489715cb407c5dc8661b63f960599355bbb4f9494158f74305730ff1b2aecb0c463a13d761e73a3e55083b7061d7e84080bd5c333ee79b58dea5598f95b85e828f75cda3dd95fbd0bf94c1be37411b5913b761eddfac0bccec996bc5484876f9248f717d8bef4e04bb3c88c5265d445367b20423ef867a2bf6ed0d5819b7210bf7316a697f683977adde65ae4aae0d6bd8565c8fc2b3ca302387ee52cf928f2ee9a2417b7d11675cfd64dde7fa38f696a0f7b17a154f1bb2d05455f593bc94b558cd837740a57c6075584f42b5029a0cb15a21ab7cf8d7c75a835559cb75d5ab398b4f5c71b7093281aebb2b957f8e91b4521ddbd31ff5b15dcf636b76e945af99cba9c9dc758ade7c3e9dea67d986f3cee1bc0e48d2813ec7ba1baaea97779797bbc4946343e50bd47413790b5dd83644fe08eb0579e96e63c596aee27d7877e7ee753154953fadc7d82ea1a3d2d08deec9827b58ef59c3f338fda2a7e05947e0eb3df86cc37ad28c36a9af3c8dd9d0f1c66e9b3222fc3e5133f7e8b6c42dcda482b5fd21f6b1abba406d0eb33bc76a7f5593cd76414bc7e86abb42ac26aa987db0868acf1633d3362f71ef6b20bd1d9b628c9321e4db9c8fb38fe99b58c5e57b97a5a70276e18aae147a46b0cd8e1be9eed2d3b62a7d2676e8b6212375373f1bfbe8f757e225ec3dcdcd8ddbb173ec5f683f9c77b0c76e57f7a987ecb8b229058fc12a3a3eedca3d558ecf89676abc94d33e569ce04d635781be25ecb3cc3554f6b45272252a6956e6ae2adbbaf4d9fb19b97e9fdfbdb3f10d9df069e8898fbd183f9548be03e3eb8517a61ef622db2373e155f4b021e91a7d27c505ac8c719f3bffc4752997845e59692fd4c06b75ec0dfbc2872e61f7022439335bdeae545b2b7659d907ecc42737cfa166157d514bbe9b64f050a5e99ab6e0657b71a7aee9bc5e843d165a55ea826c81b9d7c3ff628ffcf1e46b2933867d0cddb10b9fe96df8745387fce163214fd4c469f4b094c3a45bb54baad43fde897c82cf30be7b54f44ff8042b2f43b47ac53ffb17adc23b2baa2f5bf6c477143e3799e6fb1351f15db3eb7b3e54686b7d7c8aaaf844d00ffc2be4904a2ed63e2c37f16ffa52eee3f317894f810fd6ecc2758d263d43e46710d105e811c7fe1d771d929f095e1ffcd08f5c29c40b7c4eacb6af76119f2fe77a46a83a267e2c2f4d661e5d9756c04d2b67787234f3133f8d7ba42bcf4542e673033f5365f548fb63966ab2cfed92d7d3fa396833535ba21dc6413f4b2b7ac86a63bd6b32b0610fbaa899ea43a6f0ae16679fb2a8ba7343bf805a78e16b76d7b5419be6a60e2064f2d84fe457a0a56a1facb2271f7de8084e537cffc82ecbdff0e8f97da8935efd810f7b744917cacb43153cb805d178e20fa1aa1cc8775f373766cf82f791a7c5fe84d6e9b1dcf747bee1266bef94b19f85e7d087394b25abc5a8834ed61ffb1371179f272ffbd1ba5d563b2ace15c7661ea211e293f272f408da515657e65ddf89475867acdc91353d86b8398dfb285e3fbb3d15624e41df6842efe8b6a0d039cbedc1acfbda661f9caa773d93d5b882e7771297dea2ffc2f34a67bbfe3c3eb318b12ee0bf55ae76cd832dfa0b39812af30cb409cf520abe692bbe29ef5c3f66900eac810359860ae55996ec966f7df4ce98f7567e56ed06b6f4e1ddcd03a8607987373cfbccef2e8a2f3daf3c10d7e2cc5fc2dc8cf9d935ed74458f80ec73aa6766471e8aa22d8886ccfc95bff637ce41df1ede41aec59a6d0b2a9db0ebbeed6ffd9d9dd979ea393fff99b266bae6effd439c0dbfbc37f1693db6d92e5d6fc5a92dc59e37d71de6d76dffe8b7ac8f6b0df498ea516eabcc9cc427a561373754f243a840c3ee1ff427ae24de4ca8a8276b3b7a9b350afb62e18db85d3f8f7dd5d29344b9f65cec87da34f4857d866cb6fa066235bd6b3837659bf902d4bb0dec45e23bfb5d88d4f7f0169d0abb7fa04da844e17efbb2a4af207f57637f30da20fd523ef3455ff2db72ece7908d1acbcf777ed12ec69cea96dfb1c3d41fadf415a1de82dcd5869ee61156b38b38d2809e220de3bbcb65d588bdbc894f37842e19ef77fd007a69ccee1b7ed23b4c4d5f865ca843b4873e369f993eef5f3ef95877646e8df1635f497bf52bcf7a69e57676e6abf24e8fe23b2c90d5c571b4d1517a026ee3be5b5f42e59ec94c642a37ff6bd609da643a339995cd907da3f4cf7fce2eb036f4ed75e6321fdf8699e6a4ff88dff09c31d4216759666155834eed34eeebe8f8b6bb8ffd67c84173e84f76f4581d674f7e903d7fb67796fb6f337b81f8f2ba02d7fbf43ecc86b7e2be122fc6ca5751c83a5937eba94eaeffc88ffc914d27c29a83acef176a5bd5b281f1717fa7ae27901d4ab20875b0d0f3ec15d6ac4a7a1a325dd3216f9f8a5e646f50ed5762b534e02a78d5d3bef49ed241f61ef68d613e4536a47713b19ae1774af2711456d0aaba53675a6723fd66857a96f7b62deffd7b0695bd39d05d7c1a13a36294d3e5b33c06f5857ec926aa077971904d69a7cfad7ada97f2d8697cceb2905d7d9fcdb279cca6b3953e78b5bb8a3fe07773d15407f01376da5aa2b2b2a67cfe1e73fe27d40963b0cdc28438c4672f6ee9fdd82faf2f608f12be7394bdebba7a705dec3062df9eafcd57fbacd52a9123ba9a7b97712dda37d66ae1edab8ebb5517592dff7d993fb0beb86c0fdfa032b7baa9ebd9be33fa31de7f90deb85a1e7b99872b726fd2789ab4d96019558976f6d901c4cc6bfee9c8afe5b1f6083aad0bdd0ecf598236d97b7698d5758f9e5d4f37f589184ff93575c5669f572f9ffc1db4811c901d658ddcfefeafaf2f223ec97321031817562c71a455769c9de893e0ff3f79831f3a7f25e83dd11f6b118f66fa932c0d9a40be3f855c18bff7c479ec57ed226ec511d458613d6fd81bd5cace64c86de7d9852e6feead7e32d3cbd1cf3b4dd3b89618fad6c9921e620c76c9dcae2c40fec2f565ededae2fda65ed7964981753cf9aa6609ecde8a7daac6ab0aa4b15bff703755739b3d94bfecd5f11777cc31a0cc75a61e7227d1fe6f3f7fa7e58c5ac69f20cf9a42e8fc54065595b3f982bf344e32ec7ee866a672593d3faaa6b5afa921ed9dd504387fe06bad2f778740e9a4cd53978d771782b7e934c7fc22e8df81c4b43bd7be22e214b6f6797d915e4820aef5ae0bbb1ead0bdaebead8bfbb3f1bd59fe6e5245bdfbb6bfd77d1fbe0de78c77f7fa25be5530c1880fdf56f0055d17b7f83eedea2cff4abc2c6b84d9207e5fef10d6e13d5d513be6460db26bd7146da87c97bb924d5981f75926c2f93d3b83eef7d23fc07dc7e1b981ae88ab6c12b599c4270a5dbb6fbdae433616a2f12319ffc8f7f8e47bdcd7cce27726a1261085f09ebf3fca6e6c2fbb754dfb98befbb6da3ba6efbea9cbec2ebbcf1ee463f6087dfc01f437a1d30a3dfc93aee8be78cbb6b242b009d46e102761e73cd8243ce9fa4cae3ff4fd4acc8a8df80ddc3964ecbbf03c19d69f63b04fcd18b3a79d13e02e1df0f333dd55770e3a157507bf75dc9d7eb54357b57563f4a52a7b0b9eaa4307173a2d7a1b2883fb96608d2f82bea7e625c689a0b759c59f5bf7573ffa30be27abe3bb62e06de6c8dc992af490ddace46b720e5a1d38a5ebf2521dbb917c308fb6ee2ec49979f40b88856df9a8067a6aeaba84ef0680a44ff1b975233e79ed987bf8fd451e7a9d35a226dd581f2fcde41fce63eb5e16f69b7bf13bdf427ab44bd8b732f7e1771a017a1ef0f1133737753bd517d9b6bed0635377536fe9bd7296089f9674639715be431e6ae141d8410c92cb46fc17bfb91ddeb37d5ecf487fdc2e9f64eb8fbfe1db37e96deba559c0b7af37dd6bedadc30d7b761bc7ff53f1f2234dc26791d326bd53b49ad937fb3c6a45fb914b7ffff9ff37c69fb1cb06c9f09b1dcbb6c8a8733ad8f01e3ebf8f897b90b97d6deab4446e8f5be77788377dbebeeeffc02eab7f5ff222f8fd80fbc04d33c07b904b7505755a648fefb3cbc65e212fd5ca9c7de645eb7f470df58fbcef8bbef145bb7cd6f9e4efb4f47ce06b9ae8e4791becb564a31f68f4cb79ecb308ff91f7fd60c40dc7977b9170ee6eeefc4de3a6fbfa79b6f3ad7659cf43cb51faa934f9f397b27aee9e3f98053827db81cae70fd4c93f3befbb3e5f1def7bd6fdbfe7e7affeff85fbdffcfcbfb2cb7fffdb6fff035d4770ec + + + 789cdd5c59532bc9727e9f5f3171ebed86a30cda150e3fb00b04486207871f6aeb463b68170eff77675566965a0be77066187bc297db073e757755ee4b5569fef59fbf3f35af7effe7bffe369ea849dbfc6e5ed5e8f77fda69bfbffc8ffffcf7fffaed1ffb7b7bbffbab98abfc9efbc7bffcf60fb1f8ddfc2ef6c2ff02ae445cf118de27bc8ff7e7840bf47c35627cfe9d313d3f235cc1e7d571c4f8fc3e637cde8e22c6fb25c206df77cd88f17e19f13ed16fbb84893e8df355985e358e18df3f624cf397230ef7f50961a65f468cf75b8cf17df71a31deef1126faed38629c7fc298e445f3477eaa11e3780bc638be5812667d4c0913bd9ae8d9a7f97590278c46f3b936629e2f39638cf78d22cce33708d3f8a24998c6578788736c4f09617a3fed10a6f72dd253e1e7d503617ade1523467e1d61d687204cf327358f73713e7d4f98e5d1264ccf8b14719ee9fd204cef9b1bc2cc6fa03757e5e793ab88519f2dc26c6f75c23cff9c30db43137181c63341bff97d7e5eb509d3f3a61631ce778398df17af11e3fd37c2cc4f29e270dfe51993bebb8469fe24d86f3ef2232c61ba6f9e11f3fcfa9430cbbf1c31eaef9a31d9fb8430cbb71531d23f25ccfa321187fb09d25f2d16499e413e85280fdb274ce3d97dc21c4f9611e3788231d2a725e222dbe745c4e1796319133f0784891eb7c2e1f9d411ae123f9d8871bc07c216c74b82bd1454e4bf1d31ea6fc698f47785b85824fafb8479fc0e63ba8ff250a57dc2398f8b39981fc72f31ce5583fce87e699fc69b30a6f7ef08d3fcc924627cfe8c710ef5734998e491b4095bd247b0a722d097df0fe33f102679aa03c614bf5f0913bfa2c898e8e912e6f1f97992b7ed448cf136658cf42a85b84cfc9a41c4f8fc8c313e9fec1366fb7c8c18e57bce98e41dfca39463fad52b638ad77dc6f9a00fa10933fdf588713cc118e9711dc6284fd78a388ca74e10337f2a1731fa4f9e318e676e09133fb6c7189f4f3a8cf1f9b44b98f4ed168c299f29c6f47c9b30f19384fc528afa328f88995e774998fd4d3126fb3c8b18e5f3cc18eddbbd3046f9981661f69f316392078f4ff4ba51c4a81fa2b74cf4aa4ac4f8fe0363f2878388911e94afaa90fc55c4f47cf08f729ee9710f8ce9be8818f5bb4798ed63ce18efeb2663b40777c7b810e4615f10333d76c298e67311e37c33c2a4ff248d18ef3f1226fa926bc6649f785fb37cd2047185f5ed1893fc2563a27f9f30eb9fdf277a449730c94b1723467a9e1953fce910e678308c189f2f21ae927c922263a2ef346294b7638ce3db508f56a2fcc49830c92ba933c6e7c555c4e1bea930267d2d09333f0f84897e4df7233d03c6347e8f30cdafa78c89de5bc26c5fe78c497f6711a33ef0fdc8bf6a12267a8d264cf69cb408937cc58831c53fc118df7735c48af2539a32a6f92e1913fdc38891be32618e0739c6f87c721031ca3bd4e7d502f3af2b8cc95e0463d247bc5f5061bc1bc2148f531b318e7f8898f9d18f8c71be5430c6e7932161ceaf6f8c299e9d478cf42ac6445f8bb022fb9830267a8a8c89fe056187f49853c6a41fc998f49b22d639ca87578c293e0c22c67ae38931d923f1a34bf4be8918e3e3196145f9e52d62b427cb98f225d26fa2fc468489dfe48831f2ab2d61e2cfb41993fce61187e715f26b807e94c725637c3ea9441c9eb7ef8489bfb41731c6db2263aa670a8c517ef29131e573cd98e69b322e62ff7f4e98e4a59e234679f2fc242f791171b82fef19933f1d461ce6973c9fc3f1e541c4f8fe92318d7f1831cebf604cf5c651c4c81fcd6fc89ee430621cbfcb98c69f458cf224fe0dc95b9c468cf5c83363aaef4f08937c4cc8872afa8f2b441cf4298e10b33da79a31f9df1e637aff2262b4b71bc6a82fd3235c22fe3b8cc9befa8cc91e071187f1cc3d631c2f6910267dea27c694af12c6a4cf67c634be8c18edf78c31d9d73e61d2bfa9478cf23f614cf9bc1131ca77c698e2d975c4181f583e0eed4fde468cfed9644cf43e478cf2c831467af501e2684f1f11a33da58cc99e8e23c6fbe78cc91f1b11233d8231c5b341c428df1261b2476923c6f1f97db247a923c6fb278c297e8f23c67cc6f496289fbd458cf6c9f4503c905711e3f83c1ec783d788515f2c3f45f31d32a6f914618e079711e3fb4c3fe95fa03fc5f8e93463ca272e62d4679930d9bf3e8a18e3f10763d4772a09137d5a478cf359c6e49fef8cc97fce23c67cc8e3113f6ec898ecfb2a6294e70363b2dfa78871fe9431cd5f8d18e383614cfe86fe17e3a1d88b18e73b624cf5703e62a4d73026fbb98818edf38e31d2abfa11633c7a614cfe16df27fdc4f9905e3921ccf65e8b18e95d30267b9b478cf9a1c098eaf98b8831be1e3226f9b622467ae37c644fa388319e4d1913bd645fd13ffa1123bd1dc644ef5bc468df9231c5b33462942fcb87edb11b31c6f75bc648afdc8b18e9d58c89de2261f237f11431fa17eb8bec533c448cfc541853be718ca99e5c468cf43d22b6646f668f31f1ffce98eabde0ff3ae60f5d634cf9ee9a30dbff4dc4985f2346ffd375c4d19e1563ead79e18533df4c898e61b468cf63a274cf6a82f1993ff3c478cf9accd98fce73d62945f9531f547bd88517ef179a44fdd458cf1e58531d1f74a98ed711031ea8fc7677b7411e37d9617d7fba388d11e9b8cc9dfaf22467e968cc97f9288511f4c2fe9d3dd478cf1b84198f3818938d0d79a3026fa55c448ff2963aa0f3f2246ffbf654cfe741d31d2df654cf610df47fa5d05b1e57ae02c629c3f614cf4b523c6fb05c664efe38871fe6bc6543fcf22c6fa86e463b93ebd674ceb5f6f11637f631853bf1fea1b6dd9bedc0963ca8fc388317edc33267d4d2246fbbb635c0af72d63ae17c711a3fccf1953febf8d18edeb8531d9fb20629ccf31267aea11a37e3e18233dba4a98ec25b98f18d703fa8ca91ebb604cf9e12662bcdf604cf6d18c18edfb8d31d58ff179a20fedcbc67878c998ece53d62b4976bc614af8a11637cb8634cf4e62246795619933c4f234679c6fb542fd408737e1d458cf9d532a6fc3a644cfe741531dab3614cf24a22c6f99f0853fc49968ca99e0ffa344596b73d8e18e55d608cf4db24621c7f8f31da831b302eeb407f1d31cbc71622c6789430c6f1553e62f48f3dc638be20fa987fc3e311ff723f62cc573c1ef99799461ceea786318e9fbc478cf1fe8930d713fc3cc94fe418537e3e8e18e9637ac8df121d31ceffca98e8bb8b18e5db27ccf173ce98f48bf3adecff8931cadfed31aee4c3f327886dae12ee2765c29c3f3e1893be2d63d2ef51c438ff0561f6d719637cde04fa6d947f6b22c55f7549b5f6b7f657c4465ababe65ae606b7f19273fb99813fb3de37d835e6c46bebf429dfdfbe96517279b54fadfdf45f15faa979f72f7e973de7fdcca7ffeeff5f2056e3e7f4e7d1f277f8d5e5a9ff8d08facf0efab975fe4ee6fa6179984df295cafb20db823bbde1728a7446b923df83c81ab1f9eef027efd7be9450ee410a84bc3df9d40a1008edee43b70865ca4f0790a7fbfc267f8773b70917e9feebf432f7224c740dd10fe1e7bfd0057c3603d9ec3899c467d20375e4f3339876b2197707d1b37dfe62f1fc4c9b8b5f28d0fe0caff3ef03aa3087c288fe431fc3e91a7415f6c6d7f0fbdd840f11970e2a9aec983cc3d4d1c1cc36f4ffd39e8e342d6012fc2b3febdcbbf55debf028aae8275f580f26ba0b82e1bb2295bf246deca3b792f1fe4a37c92cff245eec97df83c27f3b200cf26f05ef16f558f9dc9922c0327efb222ab40e98b90420825b430c20a2792f0e3442a5e455b744457f4445f0cc4109eef89b7efe1e48b7af92c0fac72441fbcb82e5be25d8cc4584c80eaa9988979b8e662117fe6e1b399588a0f71200ec511bc730c7a042b241dff897cf305bdc0e8e204aed3301bf52010513f045896a88973b91017a22e2ec595b8168d402fff2c3ef99913574dd102fddd885b710771ad06e3dd43ecf371ce478737f0a98e78f83ebd7859894771229ec4b378414ec41ec4a5913c10fb321539911705511425510ed457e86737177cb70a09d4e3996828a194d2ca00f5353984395e832fbd49ad2cccfff1dd7a016e4e373e3f9073e554a252f5aadac4c742547fc8c98a97c00f7d166c0ef8e9a8aeacaa1ec4385f47f8280f9956f5bed75f4027a7e229fa085816cc36577d355043f506b4b0dd543fe521c38d7a57233522ed8c955493f0f6524dd54c3eaab95a4056653f0cbaf936bdc0259ed7bcbd0c3aa9aba5fa5007ead0eb03a83bfa121f3bf5e33953c741164d75022e792a4f68ae3155405fea5bbf965fc08699939234ea4c5eab9a3a5717ec2151cebb3d7e97d55537781985273c377575a9aed435449761e0a6ffd5dafa57f28b1f453560a43a70d254ad40355ad636ad1b72cf4604e50be72a71540d6f2fe20810ddd48dba5577e202fc66a81aeafeabeb09bf94f77124275b30d703718274234ddb7cace32ca70be42a334a265eab967a544fe202e6f459f81bf512f289d7f4403d834e5ed41ee4f0799c7941d1956c25ea60339b9016d5b1dacfd20e9eb2d8e212328fcaa9bc2a400e2b02e5438e9d9005c49fd28bcf271662d7812a8275dd1227a8898c760227efea3d632d25f829437cc02aa6a9ca2bae80872ae90c6b8195b5e227a9aaa8aa3c056e50a203ecf820affd8938067af13dc6583a88c24db02eb69bb5389bd1c65c9580ee16a4d59c165a69ff7f232eb5d54e273a151ffa35d00ef25845e7e83f8ce6baad3b2a810a47855e35ddec41377de74b7a3900590ce55c434d881e1f65bf1e93021fba2752ddd7033dd46fa2aefafa5d36f4488fa14ac943dddc524b3dd1533dd39e63184b078d6e785325700acfe8a5fe08f51a77dbbea35bf75ff32b7ad10750393a7da88fb4e418ece7d4c7fa9838a9ea13d4873ed567ba266ff5b9bed075d5d397d0b1bc870e6de87b1b884d5d7da5af750394d584ba794a231ee956869f687730de8d5a42bf73045ddc69e0e6ed8feb25e4f97d7dab06fa0ef24926eae8e3a895e0affa5e3fe84779a39ff433ccde03ab184035b58a3d2588e8bed7b17201b93da75ff49edec76c1bfd6f11bd70011a5e88b2ce41b429ca439d877acd7775d7eb9cacb8f94a3de62b165dd0c5302be7944cecd1a5c0495957d48ba8cb5457e582afc0513fd472d441635d07d9f7d040a1a76a42ea53a33826c6a8b888f3348c06ebcc857ef410b4ac69ef602b4247bdec8cd9f4e4d4186dd50dd5e9eb768d51b9e477604ca2f3260dcfbf823e06c15bfdf541b59ce7c0f7f7078133fcfdaa6f4ddb7482efccc3785841cf63cd3d375dd3d3d7aa009cb8d06d7ce2fda497cd0c340edede97636f15fad2f4d52bcd1533a21afb99bc4e54d90ccc50f5416e7a7306985d002757e60d625127e86608d741f064bffad437efeaca8ccc18b859049f59af2082b4ccc44ccdccccc3dace7883d60d7fd95519784e640215c4003aad8259ac45afac8d9595323db3341f1021fa6145225a008d7505b97be82b54f874290be6c01c9a23732c0f5b1373029f75f5c89c9ab3e08d9b156a98d1d4ccb9b93075e3e5318863e32ae2561cdbac0cfc1a97b9046e2672a9f2d0699583255762768cbd87b932d71a6253b09e953eb2ba4982cf7580cb63d3304dd33237e6563ecb26f8402d54f65d7367eecd43b0e0f90e5e9479542fa0e3d43c997adc0951eb1eb1e62f2cc73444d0beecf8dfe603badf52a63b99532d18328079362f6200d6d58d2b4bc956ec1fcb33b3079f1f9a7d93839ed8af0534f5cce44d01b8198953b8770e5c164d29e4d9c5d6cf5c944c597b7f79f3f9ffc7797f6de7a7b3aa79a4d25d53f15ac10c127d3ed4f7ba6daae21d3839409d8045f24a6cb6123c935390bf56a71614049ca0674fadb2da5c5803ef5c429d7561a12ea0fa68aba25325eb6c126ae74f63ee4ebdf8d5eb3156743615ef3a5451d9e882791ac67f15efb64d95e71970b25a1fce464c5feb1e8a6393b71de886e7a16edb1773dbb53df9ac6fe5523cc1bb359bca17786216b95945fd1378ba6f0732670d587ea8117faa17d4458f7ab99a3c310d3b0cd1bfba56451e0559ddd83753b0ef214218f4705a0d5fd30bc442a14e451f74e25769aa1678d12d3b86111eecc44ec16fbcf4603e3bb37355dfe6255877d32ea002380a96bfe52beb793f6365dc952e55510cec723d16833ea01af6f1cb8ced874c81d27ee831ce4265fe4af592e7a0c4d201dd3ddb035faf840abf123393b7b40ee4ff11700363286b0fed51d4cc86cf80951ddb138e6144f3277572d44b9b3cb90755dd8b98045eb2b512fe9dea9a99e92a546b599d724e3e03bbf13d68021678039c9c824e625cca743f907dcdd834450e3aefb21ceb0b7b26d29829b39a99d99a19417d674365e4b37086abad7a2cea059ef4bdb6d0ef428691377b445fb3f4a5afbb1610f3373bd70f59b6e7b28891408fec85ad8b66a80f4641c373eac98e899fc45eda2ba8b3600c3d564fba0fb16cb6a1956a909e867accc49a22d0bbb2b69d7ae900379e3a65af8508956c462b549f37a1aa3f97c750736d77b067f6dcfa2ad247911bd3043f69663a2dac1d673126423d6c9bb6a55c90e6b5bd81baee708b173fe7d4deda3bd44b96de4ff5e2ef1e8295f9bfb56c423698894cf6a2de09e2bdbdd717d2afcb6df5e250b394c3baff520ce5ad7d08f97c01bebeb24f1e33f0a50eeda37db2ed409dd7a3842e69975e66aa02396610f4b256bdecd64bd09acf48412fb225f47a551c78f11626f59bc69af8639b9b109d9710039fed0bf49059e9065eb016a67f4b3ab187fa1ab2a682f473264fec9edddfacc53172da9cbc01ef27bd7c1ec7327ad1f23dd8ba06cf373bf4e2334bde166cd1cb475f6ee5135f951cea2be0a4a35f5754510d9495f4dc966c1d3cff4e8fa1b37f80f7a6f2542d9522bd442fb5a1735253f5027d4cba3bf7efd48befaf2761f5e856d80df9045e74cf56a0fbbdf4f104e4d4dbe814da5877d989e7c45699934c674254da9293f60222ff73a83592b0260a714f0fd02e37bc14728fbd97deb27f412f704de1ef63d5cfac1e112f818ab256aa0a7d91814aafb735eab96c02270f3e6ad8ea277b17a1eb71c25e3825972deca06de8397b46381d2a9dd861927542cd249f9d097a49c35ef5567ec9c683a09b5e90d1503aeb5783d6a30956624d67650372bcb726df695d85aae70c73bcac42141650adf0cad8faeabe5fc99cf8dad73997789f0b2b12600bd0a98d436f53978f10f916b12a8ffcab07736d662dec8b8e77f6fb9c57fc0e29ff6d43647edac14b883c4a43ae864e4d9c020596d616a77ea7cfb65daa728116aea6b32b97f0af8368e0daae63cfcc85fc705db03021bbad49a850c7de425d0fa272d4dfeac796a0126a13ad6ed73a4ca607c4bc928495b5d4cb8756c3d6ed1cb29b86ace6ab46f28fa1a88997b05e5385d94e6d69ab0b5979bd5f4b038f737d37504b370c7170187452736f4182100d88970dcd807fbdcb460b7df9789d934dbdb478a7c0e77d5fc13c81bf6cf3b280992ec59d5fb90ebb0a7e05ceaf1a1d8b63a5dd285490b3904fb6fb441ca3ea6dcce6cdb5bd9647d0bf9441bff79e1bd0cd9bcffdbb7901c95eba71f084a8974fe218d7b77876c2ebe5597cece24534b4957998b914ea2ddfb7d7a0123d85282cc86b030f1bb16b7394a5cab909e4b097908ffc5ea597c889bed69368a36bbc40bf74ad2f82c4d54ff23ed7c7a1b704becfd540bcee88427355d60e2ac603efe9c13a2c44e17d9f4f42b552a515595ef15ad9d72aa6617c6bdabc1a9883b0e38aab4d1009f4a19baaf2a6658679db56eaf718bfec761cdbd24b3f58cd52ce4de2567553369ece75225bf0dc153cd7054aba904ff26e4e55fdfaeaf27a97b88ab1d590851b4ec807e8c20a605d13ac17e48dc38a6df516adc3bba5fbd04fbeaafc693dc67af11d95864aeb50eebb83ed9ed5efc7e914faa22e54f6a77e254f164c13fca4899cacedc6ece87843b74d1111fe9ea999bd71875037a12415e4f6bbd0c76ef202b53948d760b5bfc9c96ebda0a68377b574315413158c3e584385bdc5d49cca5c58fb1acac4a6a6e5fd44bd43bccdda38d9986e852aae92d1ccdaae80edb923e7d78c3ba09b0254ad6d91dd6dabd035b3ce9d4044eaedde1b5bf5fb1bfee2d79e96e6c29dda2ef62fb41ece2bd85377a679cdbdeb6ae6c65b0c56d161b72bb3ab1cf689fdda6036a6ad328eb7a6a93b87bec5afb32ca14ebea54cc9bc54e95aea0a48f7f9b3f319997e5fc43ddb5ee8c6b4ace9b1bb08bd18ef4ab0edc0fc7ae6ea66e6d7225b1373e42e8385bd13afc176a25f40660cebdcd91dd7b558e27b65a55c5df5dd95aab96bb685152f7ef50228b9340dd7d8a8b636f4b2b10ed80d3b376d5fb38a813888b61b697040b79e6b25abe0537ea5eed83e6b7fe2608e5905ac7046ba08b1d7b55c2bf4c82ba9ac4546bf8ea15fc1d26ef40b5cedd821af6cccc78903510f161663985fe1ddaec7a85fe13391af708dc3d9a39cbb15f38c44a31f406578e7ee8df46756544f36edd43da832768cd9fe4494dda3b9774feed9f3ba7355823a4d18f1c5ed410c29677c6da5b999db872ee708f75f24ee021f6fe985eb1a4d7c7acf4fc1a3cfa5b1a9cbd1aa03714314427e707957707e345f4b5d407ed1b617f697333d23541d4275a0534e20c7e729036efea0dc4193aee84aa2b4bd2fe2231f8c545645f54ceb63966ab2cff592e5d3ba0a70b3502f2274ac64679cd17d549bea7d55031df6a18b5aa89eb9b0cfce05e95314550f4eba2ad4c21fd09a5cbb0970d3d8d5018448bec0e89259a3594509d04a22e48b6b80bdf4a37fff482febdff0e8270aeaa4b74483753432bc605c7e577eada909def89118a82a8772945873614616f752bca585fe84f2f4541ea9ab0458dd3a53c676e6f7a18f329a8a5a0b5e57b6f924317590da20c631fda95e363b2a8e15e766e8bd11fc93e272b00894d65cdd98b65a8a67c8335616e50144d4a93e0beb28894e5ca28a5e4250d51bdf3bba43ad9354ecaa2576e1d5e773f5a627106934ad27f34ae2da29fa2fec573af19ebc863d8b11f302f65be16ad75c41e795ca19549997c08ddf4b69266d0b977cd4572182746194a12c4385d2967997249d55ef4cd5f4facfa6dec097922ed47fc7b2165778fdde677675517c69bff258dc89cba407b219c7bdeb1007d02254499fe989b9932762df9e8b9a4c937e324886f609faf6b13fef1a6ab617a874fc7a5921794bde6d2764e01f9dfc5b798caffee6c92819076924eb6b139fd663bbf5d2730d51b7f5d0f366bac36cde4e26c9d43442ae811e533dcb8272e623ec94fad55c5fc98fa102f5ab7fd09fb863f16e06e06bb3ad55b0dd1cf975311f2b4bae12faaab59dc4f5bef2277a1190ff2f4c59b4d63a778e30b853ba340fa698ccc0d66ad88b8433fb3df0d4913f45079f953d37be1285f18e645e37207e97437f30da41fd5a3c4be6c92259caa9ab4034aaadefeffca25e8cecebcbe4c3bad81f6df415bede82d8d5829ee605b2d975786748bb48e37076b9acce422f6fc2ee86d0cf46b8aa7bb1258aee3b7ee219a6467200b1507b6ff77d6c36327ddebf7c7259d7855858579de430aed5af471c5e2376b6931c81c7bf87332c10d5c579d0d159dc01b761dd6d20536792e3e42439cdc87f4b3b9e9be42ca925e7b2e1a36fa0befd27f53295037b925c24a3701a669ea17ee5bf78ba65a6ea49dd0ee40b746af5b0aea3c369f724f49f3e062da13f29e891aa2597ee25b9fa6ced2cf36f23b906ff123a0fef27f13ccc8e53715f3a0f53956f622f6924cda4a5da99fe233bf32a9ace843593e4c655555e2d935b83eb3ba710d36efcf909a883eb7aaa1f349e9de5f8b1ed272bfd94f42cb9836a3f1faaa52157c19b96f6a5734ac7c9bd5f37560555b513d58a9ae135c9f5eeca67d0b27a507598f0440fcc8b4ae5933d944f2e973c286526c04533ae318f32bc7c16c7a0bed069f2a8ba101787c913adf4b94d4bfb521cab877d960fd9d3b7c963f21ca2e9ea2cce3a2f14a5f107ec6e291aea107e1ea0ea6c8af2464ea9fc8087d58faf13a6a09b1703164a7b2f6eed7cec97f30bd8f7339e394aeef5a17ab279ec3042df9eadcd37fbaccd2a913dba9239cbb8e5ed3b6b357ffaead52dd415f41899efcbfc81fce29cc11354a6aeebfa30d9b30ffa3e8cdf8b27aed6e75ec3fe6cf5461cdfe69823c8cef5b4b0e707155eb20f3ef396dd1df9b538d69a40a7752de77e9fc57303ba192539dda1bdebf9ae3e91fc299b53d775f679f5f2c9e72a9cc848f24921b3beffebf945849d3c1722c0c2672c71264f6d2129ead360ff3f3ec10f9dbf92744ef4c75c84bbc9d927511a3881785ff22b8c81268a63bfaa17a8d9cfa0c6ba0ed5cc816a8847e9635b39a9e8dceedeea27925ef7fe4ae4d1e7921a7deb648d0f3105bda4ee4cee43fcc2fcb275baeb8b7ad9da8ff4723133c8604da34df7a7dc6c72b0c94b05bff70375d741729e5cabccc95f11567c430e3e48aa7ee5227e1fe6f3737d3fac62b63869433c3995e762a85c2af59da91945f3aefbeeae6aa7bac151c8af7aae2ac942bf5b9fe307bebf51258bb5c5123899aa4ba8c3cffda9f85d34fd09bdd4c23e96867af7425f4394cea72255100b56df81096763d5912d6f9dd6c5f5d96a58efc22aa1acde926e32d25da885a1eb85aaf343a7e154c10c3dde7f5b219969bf4a3ba6bcbf26e55ff297358e281af8efeb9d401e3ed479553017aa9ffa9d97962d6d7425bba202afb3cc844b84ed40f77b93782aa77edf40e70564644ddf385365ddb643d3d0fe1cac10b51fd1f847bec72747615d330ddf99849a40ec8573fe57a9b132b56e646bf1bb6f9bbd63fcee9b6aa52e4dd254bea4afd0c71f437fe33b2ddfc3bfeabcee8af7b49d76bc4ef434f8c95b983b7c8be433bafed0f72b312ad6c2377097c055c7ef2743fe3907fd2c6dc18cb4b6b7aa627360e775dd560fb6644b0aaa49d5764bddb74e5744df16f4b52aba0658aaf61d9cefb4e834500ae3e64136ddd44114ae063f11749a55fcb9bcbf79e983704e5687b362606d662e3be6097ac85eda4ba45c0257c7f60eecfb46d5ecbd7c36d7a2efdec5a5b986feeb43bfc817d5876a64a69ff16c0050fa1af6ad6b61e7b56b2ee1ef8e3c715790197361d5b5bb29c93f1cc7b6adccaf37f7c377befdee79d08b5fb7022a3a7106e879c0c62f9c3133dbd617695f5fe8919939e51a74ae9c29c2dd925ee8b2fc77c87d2d3cf42b889e72590bbff19bdbfe9c6d7b3b22fd71bd7c12ad579fe1e99b78da7a4d0a78fa7ad7585ba70e77acd9ed9cff4ff9cb8f38f1d747869b78a66833b2efb679e48ad623d73efff97f1be3cfe8650765f8cd8e755da4d4391def3887cfe731710d32b3ae4d9d96c8ac71ebec0af1aeebeb79ff077ad9fc7ccd8ae0ef63ee03774980d720d7ea0aeab4481fdfa7979dbd4296aa0d997d6645db9f2387fa47d6f745dbf8a25e3eeb7cb223aded0f7c8d131d2d6f87bed674f4038e7e398e7de6e13fb2be1fccb8e3fe7a2fe29f2d659edf356f1cd755d2c1b7ea653b0ead7be9a7d4649f5f8bea99317f200578261d40e5f307eae49f3df75dd757e7fb9ebcfff7bcfeeaff2edcffe6f5ff4a2ffffd6fbffd0f6ceba30d + + - pbnOk + buttonOk clicked() QgsRasterLayerPropertiesBase - pbnOk_clicked() + accept() + + + buttonCancel + clicked() + QgsRasterLayerPropertiesBase + reject() + + + sliderMaxRed + valueChanged(int) + QgsRasterLayerPropertiesBase + sliderMaxRed_valueChanged(int) + + + sliderMinRed + valueChanged(int) + QgsRasterLayerPropertiesBase + sliderMinRed_valueChanged(int) + + + sliderMaxGreen + valueChanged(int) + QgsRasterLayerPropertiesBase + sliderMaxGreen_valueChanged(int) + + + sliderMinGreen + valueChanged(int) + QgsRasterLayerPropertiesBase + sliderMinGreen_valueChanged(int) + + + sliderMaxBlue + valueChanged(int) + QgsRasterLayerPropertiesBase + sliderMaxBlue_valueChanged(int) + + + sliderMinBlue + valueChanged(int) + QgsRasterLayerPropertiesBase + sliderMinBlue_valueChanged(int) + + + sliderMaxGray + valueChanged(int) + QgsRasterLayerPropertiesBase + sliderMaxGray_valueChanged(int) + + + sliderMinGray + valueChanged(int) + QgsRasterLayerPropertiesBase + sliderMinGray_valueChanged(int) + + + sliderTransparency + valueChanged(int) + QgsRasterLayerPropertiesBase + sliderTransparency_valueChanged(int) + + + rbtnSingleBand + toggled(bool) + QgsRasterLayerPropertiesBase + rbtnSingleBand_toggled(bool) + + + rbtnThreeBand + toggled(bool) + QgsRasterLayerPropertiesBase + rbtnThreeBand_toggled(bool) + + + rbtnSingleBand + toggled(bool) + grpBoxRGB + setDisabled(bool) + + + rbtnSingleBand + toggled(bool) + grpBoxBlue + setDisabled(bool) + + + rbtnSingleBand + toggled(bool) + grpBoxRed + setDisabled(bool) + + + rbtnSingleBand + toggled(bool) + grpBoxGreen + setDisabled(bool) + + + rbtnSingleBand + toggled(bool) + grpBoxGrayscale + setEnabled(bool) + + + grpBoxGray + toggled(bool) + grpBoxGray + setEnabled(bool) + + + rbtnThreeBand + toggled(bool) + grpBoxRGB + setEnabled(bool) + + + rbtnThreeBand + toggled(bool) + grpBoxBlue + setEnabled(bool) + + + rbtnThreeBand + toggled(bool) + grpBoxGreen + setEnabled(bool) + + + rbtnThreeBand + toggled(bool) + grpBoxRed + setEnabled(bool) + + + rbtnThreeBand + toggled(bool) + grpBoxGray + setDisabled(bool) + + + rbtnThreeBand + toggled(bool) + grpBoxGrayscale + setDisabled(bool) + + + buttonApply + clicked() + QgsRasterLayerPropertiesBase + apply() qgsrasterlayerpropertiesbase.ui.h - pbnOk_clicked() + sliderMaxRed_valueChanged( int ) + sliderMinRed_valueChanged( int ) + sliderMaxBlue_valueChanged( int ) + sliderMinBlue_valueChanged( int ) + sliderMaxGreen_valueChanged( int ) + sliderMinGreen_valueChanged( int ) + sliderMaxGray_valueChanged( int ) + sliderMinGray_valueChanged( int ) + sliderTransparency_valueChanged( int ) + rbtnSingleBand_toggled( bool ) + rbtnThreeBand_toggled( bool ) + apply() diff --git a/src/qgsrasterlayerpropertiesbase.ui.h b/src/qgsrasterlayerpropertiesbase.ui.h index ceeb5ab53cf..9f4177a1d76 100644 --- a/src/qgsrasterlayerpropertiesbase.ui.h +++ b/src/qgsrasterlayerpropertiesbase.ui.h @@ -1,3 +1,4 @@ + /**************************************************************************** ** ui.h extension file, included from the uic-generated form implementation. ** @@ -8,7 +9,78 @@ *****************************************************************************/ -void QgsRasterLayerPropertiesBase::pbnOk_clicked() + + + + +void QgsRasterLayerPropertiesBase::sliderMaxRed_valueChanged( int ) +{ + +} + + +void QgsRasterLayerPropertiesBase::sliderMinRed_valueChanged( int ) +{ + +} + + +void QgsRasterLayerPropertiesBase::sliderMaxBlue_valueChanged( int ) +{ + +} + + +void QgsRasterLayerPropertiesBase::sliderMinBlue_valueChanged( int ) +{ + +} + + +void QgsRasterLayerPropertiesBase::sliderMaxGreen_valueChanged( int ) +{ + +} + + +void QgsRasterLayerPropertiesBase::sliderMinGreen_valueChanged( int ) +{ + +} + + +void QgsRasterLayerPropertiesBase::sliderMaxGray_valueChanged( int ) +{ + +} + + +void QgsRasterLayerPropertiesBase::sliderMinGray_valueChanged( int ) +{ + +} + + + +void QgsRasterLayerPropertiesBase::sliderTransparency_valueChanged( int ) +{ + +} + + +void QgsRasterLayerPropertiesBase::rbtnSingleBand_toggled( bool ) +{ + +} + + +void QgsRasterLayerPropertiesBase::rbtnThreeBand_toggled( bool ) +{ + +} + + +void QgsRasterLayerPropertiesBase::apply() { }