Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
otb
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Julien Cabieces
otb
Commits
5cf64354
Commit
5cf64354
authored
9 years ago
by
Christophe Palmann
Browse files
Options
Downloads
Patches
Plain Diff
ENH: otbSARConvert, float to double pixels
parent
21d2e972
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
Modules/Applications/AppSARConvert/app/otbSARConvert.cxx
+107
-105
107 additions, 105 deletions
Modules/Applications/AppSARConvert/app/otbSARConvert.cxx
with
107 additions
and
105 deletions
Modules/Applications/AppSARConvert/app/otbSARConvert.cxx
+
107
−
105
View file @
5cf64354
...
...
@@ -65,113 +65,113 @@ public:
//Monostatic case
typedef
otb
::
Functor
::
SinclairToReciprocalCoherencyMatrixFunctor
<
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
VectorImageType
::
PixelType
>
RCoherencyFunctorType
;
typedef
otb
::
Functor
::
SinclairToReciprocalCoherencyMatrixFunctor
<
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
VectorImageType
::
PixelType
>
RCoherencyFunctorType
;
typedef
otb
::
Functor
::
SinclairToReciprocalCovarianceMatrixFunctor
<
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
VectorImageType
::
PixelType
>
RCovarianceFunctorType
;
typedef
otb
::
Functor
::
SinclairToReciprocalCovarianceMatrixFunctor
<
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
VectorImageType
::
PixelType
>
RCovarianceFunctorType
;
typedef
otb
::
Functor
::
SinclairToReciprocalCircularCovarianceMatrixFunctor
<
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
VectorImageType
::
PixelType
>
RCircularCovarianceFunctorType
;
typedef
otb
::
Functor
::
SinclairToReciprocalCircularCovarianceMatrixFunctor
<
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
VectorImageType
::
PixelType
>
RCircularCovarianceFunctorType
;
typedef
SinclairReciprocalImageFilter
<
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
VectorImageType
,
typedef
SinclairReciprocalImageFilter
<
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
VectorImageType
,
RCoherencyFunctorType
>
RCohSRFilterType
;
typedef
SinclairReciprocalImageFilter
<
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
VectorImageType
,
typedef
SinclairReciprocalImageFilter
<
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
VectorImageType
,
RCovarianceFunctorType
>
RCovSRFilterType
;
typedef
SinclairReciprocalImageFilter
<
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
VectorImageType
,
typedef
SinclairReciprocalImageFilter
<
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
VectorImageType
,
RCircularCovarianceFunctorType
>
RCCSRFilterType
;
typedef
otb
::
ReciprocalCoherencyToReciprocalMuellerImageFilter
<
Complex
Float
VectorImageType
,
Float
VectorImageType
>
RCRMFilterType
;
typedef
otb
::
ReciprocalCoherencyToReciprocalMuellerImageFilter
<
Complex
Double
VectorImageType
,
Double
VectorImageType
>
RCRMFilterType
;
typedef
otb
::
ReciprocalCovarianceToCoherencyDegreeImageFilter
<
Complex
Float
VectorImageType
,
Complex
Float
VectorImageType
>
RCCDFilterType
;
typedef
otb
::
ReciprocalCovarianceToCoherencyDegreeImageFilter
<
Complex
Double
VectorImageType
,
Complex
Double
VectorImageType
>
RCCDFilterType
;
typedef
otb
::
ReciprocalCovarianceToReciprocalCoherencyImageFilter
<
Complex
Float
VectorImageType
,
Complex
Float
VectorImageType
>
RCRCFilterType
;
typedef
otb
::
ReciprocalCovarianceToReciprocalCoherencyImageFilter
<
Complex
Double
VectorImageType
,
Complex
Double
VectorImageType
>
RCRCFilterType
;
typedef
otb
::
ReciprocalLinearCovarianceToReciprocalCircularCovarianceImageFilter
<
Complex
Float
VectorImageType
,
Complex
Float
VectorImageType
>
RLCRCCFilterType
;
typedef
otb
::
ReciprocalLinearCovarianceToReciprocalCircularCovarianceImageFilter
<
Complex
Double
VectorImageType
,
Complex
Double
VectorImageType
>
RLCRCCFilterType
;
//Bistatic case
typedef
otb
::
Functor
::
SinclairToCoherencyMatrixFunctor
<
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
VectorImageType
::
PixelType
>
CoherencyFunctorType
;
typedef
otb
::
Functor
::
SinclairToCoherencyMatrixFunctor
<
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
VectorImageType
::
PixelType
>
CoherencyFunctorType
;
typedef
otb
::
Functor
::
SinclairToCovarianceMatrixFunctor
<
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
VectorImageType
::
PixelType
>
CovarianceFunctorType
;
typedef
otb
::
Functor
::
SinclairToCovarianceMatrixFunctor
<
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
VectorImageType
::
PixelType
>
CovarianceFunctorType
;
typedef
otb
::
Functor
::
SinclairToCircularCovarianceMatrixFunctor
<
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
VectorImageType
::
PixelType
>
CircularCovarianceFunctorType
;
typedef
otb
::
Functor
::
SinclairToCircularCovarianceMatrixFunctor
<
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
VectorImageType
::
PixelType
>
CircularCovarianceFunctorType
;
typedef
otb
::
Functor
::
SinclairToMuellerMatrixFunctor
<
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Complex
Float
ImageType
::
PixelType
,
Float
VectorImageType
::
PixelType
>
MuellerFunctorType
;
typedef
otb
::
Functor
::
SinclairToMuellerMatrixFunctor
<
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Complex
Double
ImageType
::
PixelType
,
Double
VectorImageType
::
PixelType
>
MuellerFunctorType
;
typedef
SinclairImageFilter
<
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
VectorImageType
,
typedef
SinclairImageFilter
<
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
VectorImageType
,
CoherencyFunctorType
>
CohSRFilterType
;
typedef
SinclairImageFilter
<
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
VectorImageType
,
typedef
SinclairImageFilter
<
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
VectorImageType
,
CovarianceFunctorType
>
CovSRFilterType
;
typedef
SinclairImageFilter
<
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
VectorImageType
,
typedef
SinclairImageFilter
<
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
VectorImageType
,
CircularCovarianceFunctorType
>
CCSRFilterType
;
typedef
SinclairImageFilter
<
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Complex
Float
ImageType
,
Float
VectorImageType
,
typedef
SinclairImageFilter
<
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Complex
Double
ImageType
,
Double
VectorImageType
,
MuellerFunctorType
>
MSRFilterType
;
typedef
otb
::
MuellerToReciprocalCovarianceImageFilter
<
Float
VectorImageType
,
Complex
Float
VectorImageType
>
MRCFilterType
;
typedef
otb
::
MuellerToReciprocalCovarianceImageFilter
<
Double
VectorImageType
,
Complex
Double
VectorImageType
>
MRCFilterType
;
typedef
otb
::
MuellerToPolarisationDegreeAndPowerImageFilter
<
Float
VectorImageType
,
Float
VectorImageType
>
MPDPFilterType
;
typedef
otb
::
MuellerToPolarisationDegreeAndPowerImageFilter
<
Double
VectorImageType
,
Double
VectorImageType
>
MPDPFilterType
;
...
...
@@ -497,12 +497,12 @@ private:
m_RCohSRFilter
=
RCohSRFilterType
::
New
();
if
(
inhv
)
m_RCohSRFilter
->
SetInputHV_VH
(
GetParameterComplex
Float
Image
(
"inhv"
));
m_RCohSRFilter
->
SetInputHV_VH
(
GetParameterComplex
Double
Image
(
"inhv"
));
else
if
(
invh
)
m_RCohSRFilter
->
SetInputHV_VH
(
GetParameterComplex
Float
Image
(
"invh"
));
m_RCohSRFilter
->
SetInputHV_VH
(
GetParameterComplex
Double
Image
(
"invh"
));
m_RCohSRFilter
->
SetInputHH
(
GetParameterComplex
Float
Image
(
"inhh"
));
m_RCohSRFilter
->
SetInputVV
(
GetParameterComplex
Float
Image
(
"invv"
));
m_RCohSRFilter
->
SetInputHH
(
GetParameterComplex
Double
Image
(
"inhh"
));
m_RCohSRFilter
->
SetInputVV
(
GetParameterComplex
Double
Image
(
"invv"
));
SetParameterComplexOutputImage
(
"outc"
,
m_RCohSRFilter
->
GetOutput
()
);
// input : 3 x 1 complex channel | output : 6 complex channels
...
...
@@ -514,12 +514,12 @@ private:
m_RCovSRFilter
=
RCovSRFilterType
::
New
();
if
(
inhv
)
m_RCo
h
SRFilter
->
SetInputHV_VH
(
GetParameterComplex
Float
Image
(
"inhv"
));
m_RCo
v
SRFilter
->
SetInputHV_VH
(
GetParameterComplex
Double
Image
(
"inhv"
));
else
if
(
invh
)
m_RCo
h
SRFilter
->
SetInputHV_VH
(
GetParameterComplex
Float
Image
(
"invh"
));
m_RCo
v
SRFilter
->
SetInputHV_VH
(
GetParameterComplex
Double
Image
(
"invh"
));
m_RCovSRFilter
->
SetInputHH
(
GetParameterComplex
Float
Image
(
"inhh"
));
m_RCovSRFilter
->
SetInputVV
(
GetParameterComplex
Float
Image
(
"invv"
));
m_RCovSRFilter
->
SetInputHH
(
GetParameterComplex
Double
Image
(
"inhh"
));
m_RCovSRFilter
->
SetInputVV
(
GetParameterComplex
Double
Image
(
"invv"
));
SetParameterComplexOutputImage
(
"outc"
,
m_RCovSRFilter
->
GetOutput
()
);
// input : 3 x 1 complex channel | output : 6 complex channels
...
...
@@ -532,12 +532,12 @@ private:
m_RCCSRFilter
=
RCCSRFilterType
::
New
();
if
(
inhv
)
m_RC
oh
SRFilter
->
SetInputHV_VH
(
GetParameterComplex
Float
Image
(
"inhv"
));
m_RC
C
SRFilter
->
SetInputHV_VH
(
GetParameterComplex
Double
Image
(
"inhv"
));
else
if
(
invh
)
m_RC
oh
SRFilter
->
SetInputHV_VH
(
GetParameterComplex
Float
Image
(
"invh"
));
m_RC
C
SRFilter
->
SetInputHV_VH
(
GetParameterComplex
Double
Image
(
"invh"
));
m_RCCSRFilter
->
SetInputHH
(
GetParameterComplex
Float
Image
(
"inhh"
));
m_RCCSRFilter
->
SetInputVV
(
GetParameterComplex
Float
Image
(
"invv"
));
m_RCCSRFilter
->
SetInputHH
(
GetParameterComplex
Double
Image
(
"inhh"
));
m_RCCSRFilter
->
SetInputVV
(
GetParameterComplex
Double
Image
(
"invv"
));
SetParameterComplexOutputImage
(
"outc"
,
m_RCCSRFilter
->
GetOutput
()
);
// input : 3 x 1 complex channel | output : 6 complex channels
...
...
@@ -547,7 +547,7 @@ private:
case
3
:
// ReciprocalCoherencyToReciprocalMuellerImageFilter
m_RCRMFilter
=
RCRMFilterType
::
New
();
m_RCRMFilter
->
SetInput
(
GetParameterComplex
Float
VectorImage
(
"inc"
));
m_RCRMFilter
->
SetInput
(
GetParameterComplex
Double
VectorImage
(
"inc"
));
SetParameterOutputImage
(
"outf"
,
m_RCRMFilter
->
GetOutput
()
);
// input : 6 complex channels | 16 real channels
...
...
@@ -558,7 +558,7 @@ private:
case
4
:
// ReciprocalCovarianceToCoherencyDegreeImageFilter
m_RCCDFilter
=
RCCDFilterType
::
New
();
m_RCCDFilter
->
SetInput
(
GetParameterComplex
Float
VectorImage
(
"inc"
));
m_RCCDFilter
->
SetInput
(
GetParameterComplex
Double
VectorImage
(
"inc"
));
SetParameterComplexOutputImage
(
"outc"
,
m_RCCDFilter
->
GetOutput
()
);
// input : 6 complex channels | 3 complex channels
...
...
@@ -568,7 +568,7 @@ private:
case
5
:
// ReciprocalCovarianceToReciprocalCoherencyImageFilter
m_RCRCFilter
=
RCRCFilterType
::
New
();
m_RCRCFilter
->
SetInput
(
GetParameterComplex
Float
VectorImage
(
"inc"
));
m_RCRCFilter
->
SetInput
(
GetParameterComplex
Double
VectorImage
(
"inc"
));
SetParameterComplexOutputImage
(
"outc"
,
m_RCRCFilter
->
GetOutput
()
);
// input : 6 complex channels | 6 complex channels
...
...
@@ -579,7 +579,7 @@ private:
case
6
:
// ReciprocalLinearCovarianceToReciprocalCircularCovarianceImageFilter
m_RLCRCCFilter
=
RLCRCCFilterType
::
New
();
m_RLCRCCFilter
->
SetInput
(
GetParameterComplex
Float
VectorImage
(
"inc"
));
m_RLCRCCFilter
->
SetInput
(
GetParameterComplex
Double
VectorImage
(
"inc"
));
SetParameterComplexOutputImage
(
"outc"
,
m_RLCRCCFilter
->
GetOutput
()
);
// input : 6 complex channels | output : 6 complex channels
...
...
@@ -590,7 +590,7 @@ private:
m_MRCFilter
=
MRCFilterType
::
New
();
m_MRCFilter
->
SetInput
(
GetParameter
Float
VectorImage
(
"inf"
));
m_MRCFilter
->
SetInput
(
GetParameter
Double
VectorImage
(
"inf"
));
SetParameterComplexOutputImage
(
"outc"
,
m_MRCFilter
->
GetOutput
()
);
// input : 16 real channels | output : 6 complex channels
...
...
@@ -605,10 +605,10 @@ private:
m_CohSRFilter
=
CohSRFilterType
::
New
();
m_CohSRFilter
->
SetInputHH
(
GetParameterComplex
Float
Image
(
"inhh"
));
m_CohSRFilter
->
SetInputHV
(
GetParameterComplex
Float
Image
(
"inhv"
));
m_CohSRFilter
->
SetInputVH
(
GetParameterComplex
Float
Image
(
"invh"
));
m_CohSRFilter
->
SetInputVV
(
GetParameterComplex
Float
Image
(
"invv"
));
m_CohSRFilter
->
SetInputHH
(
GetParameterComplex
Double
Image
(
"inhh"
));
m_CohSRFilter
->
SetInputHV
(
GetParameterComplex
Double
Image
(
"inhv"
));
m_CohSRFilter
->
SetInputVH
(
GetParameterComplex
Double
Image
(
"invh"
));
m_CohSRFilter
->
SetInputVV
(
GetParameterComplex
Double
Image
(
"invv"
));
SetParameterComplexOutputImage
(
"outc"
,
m_CohSRFilter
->
GetOutput
()
);
// input : 4 x 1 complex channel | 10 complex channels
...
...
@@ -620,10 +620,10 @@ private:
m_CovSRFilter
=
CovSRFilterType
::
New
();
m_CovSRFilter
->
SetInputHH
(
GetParameterComplex
Float
Image
(
"inhh"
));
m_CovSRFilter
->
SetInputHV
(
GetParameterComplex
Float
Image
(
"inhv"
));
m_CovSRFilter
->
SetInputVH
(
GetParameterComplex
Float
Image
(
"invh"
));
m_CovSRFilter
->
SetInputVV
(
GetParameterComplex
Float
Image
(
"invv"
));
m_CovSRFilter
->
SetInputHH
(
GetParameterComplex
Double
Image
(
"inhh"
));
m_CovSRFilter
->
SetInputHV
(
GetParameterComplex
Double
Image
(
"inhv"
));
m_CovSRFilter
->
SetInputVH
(
GetParameterComplex
Double
Image
(
"invh"
));
m_CovSRFilter
->
SetInputVV
(
GetParameterComplex
Double
Image
(
"invv"
));
SetParameterComplexOutputImage
(
"outc"
,
m_CovSRFilter
->
GetOutput
()
);
// input : 4 x 1 complex channel | output : 10 complex channels
...
...
@@ -634,10 +634,10 @@ private:
m_CCSRFilter
=
CCSRFilterType
::
New
();
m_CCSRFilter
->
SetInputHH
(
GetParameterComplex
Float
Image
(
"inhh"
));
m_CCSRFilter
->
SetInputHV
(
GetParameterComplex
Float
Image
(
"inhv"
));
m_CCSRFilter
->
SetInputVH
(
GetParameterComplex
Float
Image
(
"invh"
));
m_CCSRFilter
->
SetInputVV
(
GetParameterComplex
Float
Image
(
"invv"
));
m_CCSRFilter
->
SetInputHH
(
GetParameterComplex
Double
Image
(
"inhh"
));
m_CCSRFilter
->
SetInputHV
(
GetParameterComplex
Double
Image
(
"inhv"
));
m_CCSRFilter
->
SetInputVH
(
GetParameterComplex
Double
Image
(
"invh"
));
m_CCSRFilter
->
SetInputVV
(
GetParameterComplex
Double
Image
(
"invv"
));
SetParameterComplexOutputImage
(
"outc"
,
m_CCSRFilter
->
GetOutput
()
);
// input : 4 x 1 complex channel | output : 10 complex channels
...
...
@@ -650,13 +650,13 @@ private:
case
11
:
// SinclairToMueller
std
::
cout
<<
"taloula 1"
<<
std
::
endl
;
m_MSRFilter
=
MSRFilterType
::
New
();
m_MSRFilter
->
SetInputHH
(
GetParameterComplex
Float
Image
(
"inhh"
));
m_MSRFilter
->
SetInputHV
(
GetParameterComplex
Float
Image
(
"inhv"
));
m_MSRFilter
->
SetInputVH
(
GetParameterComplex
Float
Image
(
"invh"
));
m_MSRFilter
->
SetInputVV
(
GetParameterComplex
Float
Image
(
"invv"
));
m_MSRFilter
->
SetInputHH
(
GetParameterComplex
Double
Image
(
"inhh"
));
m_MSRFilter
->
SetInputHV
(
GetParameterComplex
Double
Image
(
"inhv"
));
m_MSRFilter
->
SetInputVH
(
GetParameterComplex
Double
Image
(
"invh"
));
m_MSRFilter
->
SetInputVV
(
GetParameterComplex
Double
Image
(
"invv"
));
SetParameterOutputImage
(
"outf"
,
m_MSRFilter
->
GetOutput
()
);
// input : 4 x 1 complex channel | output : 16 real channels
...
...
@@ -666,7 +666,7 @@ private:
case
12
:
// MuellerToPolarisationDegreeAndPowerImageFilter
m_MPDPFilter
=
MPDPFilterType
::
New
();
m_MPDPFilter
->
SetInput
(
GetParameter
Float
VectorImage
(
"inf"
));
m_MPDPFilter
->
SetInput
(
GetParameter
Double
VectorImage
(
"inf"
));
SetParameterOutputImage
(
"outf"
,
m_MPDPFilter
->
GetOutput
()
);
// input : 16 real channels | output : 4 real channels
...
...
@@ -692,6 +692,8 @@ private:
CovSRFilterType
::
Pointer
m_CovSRFilter
;
CCSRFilterType
::
Pointer
m_CCSRFilter
;
MSRFilterType
::
Pointer
m_MSRFilter
;
//Both cases
MRCFilterType
::
Pointer
m_MRCFilter
;
MPDPFilterType
::
Pointer
m_MPDPFilter
;
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment