You can subscribe to this list here.
| 2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(12) |
Sep
(31) |
Oct
(1) |
Nov
(5) |
Dec
(1) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2008 |
Jan
|
Feb
(2) |
Mar
(2) |
Apr
(6) |
May
(10) |
Jun
(7) |
Jul
|
Aug
|
Sep
|
Oct
(2) |
Nov
|
Dec
|
| 2009 |
Jan
(2) |
Feb
(4) |
Mar
(16) |
Apr
(8) |
May
(20) |
Jun
(11) |
Jul
(7) |
Aug
(14) |
Sep
(10) |
Oct
(8) |
Nov
(12) |
Dec
(5) |
| 2010 |
Jan
(1) |
Feb
(15) |
Mar
(14) |
Apr
(14) |
May
(12) |
Jun
(13) |
Jul
(5) |
Aug
(1) |
Sep
(2) |
Oct
(2) |
Nov
|
Dec
|
| 2011 |
Jan
|
Feb
(5) |
Mar
(10) |
Apr
(10) |
May
(8) |
Jun
|
Jul
(1) |
Aug
(6) |
Sep
(6) |
Oct
|
Nov
(1) |
Dec
(2) |
| 2012 |
Jan
(5) |
Feb
(4) |
Mar
(4) |
Apr
(9) |
May
(6) |
Jun
(5) |
Jul
(1) |
Aug
(5) |
Sep
(5) |
Oct
(3) |
Nov
(9) |
Dec
|
| 2013 |
Jan
|
Feb
(1) |
Mar
(2) |
Apr
(2) |
May
(3) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(3) |
Nov
(3) |
Dec
(6) |
| 2014 |
Jan
(4) |
Feb
(1) |
Mar
(6) |
Apr
(1) |
May
(4) |
Jun
(2) |
Jul
(2) |
Aug
(2) |
Sep
|
Oct
|
Nov
(1) |
Dec
(2) |
| 2015 |
Jan
(1) |
Feb
|
Mar
|
Apr
(1) |
May
(4) |
Jun
(3) |
Jul
(1) |
Aug
(1) |
Sep
(1) |
Oct
|
Nov
|
Dec
(3) |
| 2016 |
Jan
|
Feb
(1) |
Mar
(3) |
Apr
(10) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: <cd...@us...> - 2016-04-28 07:56:19
|
Revision: 1455
http://sourceforge.net/p/gamera/code/1455
Author: cdalitz
Date: 2016-04-28 07:56:17 +0000 (Thu, 28 Apr 2016)
Log Message:
-----------
made Point constructor tolerant again with respect to number type
Modified Paths:
--------------
trunk/gamera/include/gameramodule.hpp
Modified: trunk/gamera/include/gameramodule.hpp
===================================================================
--- trunk/gamera/include/gameramodule.hpp 2016-04-25 15:52:16 UTC (rev 1454)
+++ trunk/gamera/include/gameramodule.hpp 2016-04-28 07:56:17 UTC (rev 1455)
@@ -337,11 +337,11 @@
if (PySequence_Check(obj)) {
if (PySequence_Length(obj) == 2) {
py_x0 = PySequence_GetItem(obj, 0);
- if (!PyInt_Check(py_x0)) {
+ if (!PyNumber_Check(py_x0)) {
Py_DECREF(py_x0);
PyErr_Clear();
- PyErr_SetString(PyExc_TypeError, "First list entry in Point is not an int");
- throw std::invalid_argument("First list entry in Point is not an int");
+ PyErr_SetString(PyExc_TypeError, "First list entry in Point is not a number");
+ throw std::invalid_argument("First list entry in Point is not a number");
}
py_x1 = PyNumber_Int(py_x0);
Py_DECREF(py_x0);
@@ -349,11 +349,11 @@
long x = PyInt_AsLong(py_x1);
Py_DECREF(py_x1);
py_y0 = PySequence_GetItem(obj, 1);
- if (!PyInt_Check(py_y0)) {
+ if (!PyNumber_Check(py_y0)) {
Py_DECREF(py_y0);
PyErr_Clear();
- PyErr_SetString(PyExc_TypeError, "Second list entry in Point is not an int");
- throw std::invalid_argument("Second list entry in Point is not an int");
+ PyErr_SetString(PyExc_TypeError, "Second list entry in Point is not a number");
+ throw std::invalid_argument("Second list entry in Point is not a number");
}
py_y1 = PyNumber_Int(py_y0);
Py_DECREF(py_y0);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2016-04-25 15:52:18
|
Revision: 1454
http://sourceforge.net/p/gamera/code/1454
Author: cdalitz
Date: 2016-04-25 15:52:16 +0000 (Mon, 25 Apr 2016)
Log Message:
-----------
speedup of lacal maxima search
Modified Paths:
--------------
trunk/gamera/include/plugins/geometry.hpp
Modified: trunk/gamera/include/plugins/geometry.hpp
===================================================================
--- trunk/gamera/include/plugins/geometry.hpp 2016-04-22 13:57:35 UTC (rev 1453)
+++ trunk/gamera/include/plugins/geometry.hpp 2016-04-25 15:52:16 UTC (rev 1454)
@@ -880,8 +880,10 @@
if(!(min_rho < max_rho && step_rho != 0 && (max_rho - min_rho) / step_rho >= 1)) {
throw std::invalid_argument("Invalid arguments! The following assertion failed: min_rho < max_rho && step_rho != 0 && (max_rho - min_rho) / step_rho >= 1");
}
- int localMaxima = 3;
- bool smooth = true;
+
+ unsigned int window = 2; // step width for local maxima
+ bool smooth = true; // whether cells shall vote for neighbors too
+
if(min_theta < 0) {
min_theta = 0;
}
@@ -932,48 +934,32 @@
}
}
- if(localMaxima >= 3) {
- std::vector<std::vector<double> > houghSpaceLocalMaxima(theta_size, std::vector<double>(rho_size));
-
- for(unsigned int theta = 0; theta < houghSpace.size(); theta++) {
- for(unsigned int rho = 0; rho < houghSpace[0].size(); rho++) {
- double val = houghSpace[theta][rho];
- houghSpaceLocalMaxima[theta][rho] = val;
-
- if(val != 0) {
- for(int kTheta = theta - localMaxima / 2; kTheta <= (int)theta + localMaxima / 2; kTheta++) {
- if(kTheta >= 0 && kTheta < (int)houghSpace.size()) { // in boundaries
- for(int kRho = rho - localMaxima / 2; kRho <= (int)rho + localMaxima / 2; kRho++) {
- if(val == 0) {
- break;
- }
- if(kRho >= 0 && kRho < (int)houghSpace[0].size()) { // in boundaries
- if(val < houghSpace[kTheta][kRho]) {
- houghSpaceLocalMaxima[theta][rho] = 0;
- val = 0;
- }
- }
- }
- }
- }
- }
- }
- }
- houghSpaceLocalMaxima.swap(houghSpace);
- }
-
// vector of Votes
typedef std::vector<std::pair<double, std::pair<double, double> > > VectorType;
VectorType lines;
-
+
+ // find local maxima greater than threshold
+ unsigned int mintheta, minrho, maxtheta, maxrho;
+ if (window > houghSpace.size() || window > houghSpace[0].size())
+ window = std::min(houghSpace.size(), houghSpace[0].size());
for(unsigned int theta = 0; theta < houghSpace.size(); theta++) {
+ if (theta <= window) mintheta = 0; else mintheta = theta - window;
+ if (theta >= houghSpace.size()-window) maxtheta = houghSpace.size()-1; else maxtheta = theta + window;
for(unsigned int rho = 0; rho < houghSpace[0].size(); rho++) {
- double value = houghSpace[theta][rho];
- if(value >= threshold) {
- lines.push_back(std::pair<double, std::pair<double, double> > (value, std::pair<double, double>(theta * step_theta, (rho * step_rho) + (min_rho))));
+ if (rho <= window) minrho = 0; else minrho = rho - window;
+ if (rho >= houghSpace[0].size()-window) maxrho = houghSpace[0].size()-1; else maxrho = rho + window;
+ double val = houghSpace[theta][rho];
+ for(unsigned int dt = mintheta; val > 0.0 && dt <= maxtheta; dt++) {
+ for(unsigned int dr = minrho; val > 0.0 && dr <= maxrho; dr++) {
+ if (val < houghSpace[dt][dr]) val = 0.0;
+ }
}
+ if (val > threshold)
+ lines.push_back(std::pair<double, std::pair<double, double> > (val, std::pair<double, double>(theta * step_theta, (rho * step_rho) + (min_rho))));
}
}
+
+
if(lines.size() == 0) {
return NULL;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2016-04-22 13:57:37
|
Revision: 1453
http://sourceforge.net/p/gamera/code/1453
Author: cdalitz
Date: 2016-04-22 13:57:35 +0000 (Fri, 22 Apr 2016)
Log Message:
-----------
new plugin hough_lines in geometry
Modified Paths:
--------------
trunk/gamera/CHANGES
trunk/gamera/gamera/args_wrappers.py
trunk/gamera/gamera/plugins/geometry.py
trunk/gamera/include/gameramodule.hpp
trunk/gamera/include/plugins/geometry.hpp
Modified: trunk/gamera/CHANGES
===================================================================
--- trunk/gamera/CHANGES 2016-04-20 15:32:13 UTC (rev 1452)
+++ trunk/gamera/CHANGES 2016-04-22 13:57:35 UTC (rev 1453)
@@ -1,6 +1,10 @@
Changes made between Gamera File Releases
=========================================
+ - new plugin hough_lines in category geometry
+
+ - handled errors in arguments of type PointVector more gracefully
+
- fixed crash of progress bar an newer processors by updating it
less frequently
Modified: trunk/gamera/gamera/args_wrappers.py
===================================================================
--- trunk/gamera/gamera/args_wrappers.py 2016-04-20 15:32:13 UTC (rev 1452)
+++ trunk/gamera/gamera/args_wrappers.py 2016-04-22 13:57:35 UTC (rev 1453)
@@ -420,6 +420,7 @@
def from_python(self):
return """
%(symbol)s = PointVector_from_python(%(pysymbol)s);
+ if (%(symbol)s == NULL) return 0;
""" % self
def to_python(self):
Modified: trunk/gamera/gamera/plugins/geometry.py
===================================================================
--- trunk/gamera/gamera/plugins/geometry.py 2016-04-20 15:32:13 UTC (rev 1452)
+++ trunk/gamera/gamera/plugins/geometry.py 2016-04-22 13:57:35 UTC (rev 1453)
@@ -1,7 +1,8 @@
#
-# Copyright (C) 2009-2013 Christoph Dalitz
+# Copyright (C) 2009-2015 Christoph Dalitz
# 2010 Oliver Christen, Tobias Bolten
# 2011 Christian Brandt
+# 2015 Manuel Jeltsch
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -379,7 +380,51 @@
return [rgb]
doc_examples = [__doc_example1__]
+class hough_lines(PluginFunction):
+ """
+ Finds lines in a point set with the Hough transform. Lines are
+ represented by the Hessian normal form, i.e. by the two parameters
+ *theta* and *rho*, where *rho* is the distance of the line to the origin,
+ and *theta* is the angle of normal; a horizontal line therefore
+ has *theta* = 90 degrees.
+ The found lines are returned as a list of tuples
+ [(*votes*, *theta*, *rho*),...],
+ where *votes* is the number of points from the point set belonging to
+ this line. The lines are sorted by *votes* in descending order. Which and
+ how many lines are returned is controlled with *threshold* and *n_lines*.
+ The angles *theta* are given in degrees.
+
+ Arguments:
+
+ *points*:
+ The points from the point cloud.
+
+ *theta_min*, *theta_step*, *theta_max*
+ Theta-quantization of the Hough space, i.e. the range of angles
+ to be tested. Angles are spezified in degrees.
+
+ *rho_min*, *rho_step*, *rho_max*
+ Rho-quantization of the Hough space, i.e. the range of origin-distances
+ to be tested.
+
+ *n_lines*
+ The number of highest votes lines that are returned. When set to
+ zero, all found lines are returned.
+
+ *threshold*
+ Only lines with more votes (points) than *threshold* are returned.
+
+ """
+ author = "Manuel Jeltsch and Christoph Dalitz"
+ return_type = Class("votes_theta_rho")
+ self_type = None
+ args = Args([PointVector("points"),
+ Real("theta_min"), Real("theta_step"), Real("theta_max"),
+ Real("rho_min"), Real("rho_step"), Real("rho_max"),
+ Int("n_lines"), Real("threshold")])
+
+
class GeometryModule(PluginModule):
cpp_headers = ["geometry.hpp"]
category = "Geometry"
@@ -393,7 +438,8 @@
convex_hull_from_points,
convex_hull_as_points,
convex_hull_as_image,
- max_empty_rect]
+ max_empty_rect,
+ hough_lines]
author = "Christoph Dalitz"
url = "http://gamera.sourceforge.net/"
@@ -401,3 +447,4 @@
delaunay_from_points = delaunay_from_points()
convex_hull_from_points = convex_hull_from_points()
+hough_lines = hough_lines()
Modified: trunk/gamera/include/gameramodule.hpp
===================================================================
--- trunk/gamera/include/gameramodule.hpp 2016-04-20 15:32:13 UTC (rev 1452)
+++ trunk/gamera/include/gameramodule.hpp 2016-04-22 13:57:35 UTC (rev 1453)
@@ -337,12 +337,24 @@
if (PySequence_Check(obj)) {
if (PySequence_Length(obj) == 2) {
py_x0 = PySequence_GetItem(obj, 0);
+ if (!PyInt_Check(py_x0)) {
+ Py_DECREF(py_x0);
+ PyErr_Clear();
+ PyErr_SetString(PyExc_TypeError, "First list entry in Point is not an int");
+ throw std::invalid_argument("First list entry in Point is not an int");
+ }
py_x1 = PyNumber_Int(py_x0);
Py_DECREF(py_x0);
if (py_x1 != NULL) {
long x = PyInt_AsLong(py_x1);
Py_DECREF(py_x1);
py_y0 = PySequence_GetItem(obj, 1);
+ if (!PyInt_Check(py_y0)) {
+ Py_DECREF(py_y0);
+ PyErr_Clear();
+ PyErr_SetString(PyExc_TypeError, "Second list entry in Point is not an int");
+ throw std::invalid_argument("Second list entry in Point is not an int");
+ }
py_y1 = PyNumber_Int(py_y0);
Py_DECREF(py_y0);
if (py_y1 != NULL) {
@@ -1252,6 +1264,11 @@
Point p = coerce_Point(point);
cpp->push_back(p);
}
+ } catch (std::invalid_argument e) {
+ delete cpp;
+ Py_DECREF(seq);
+ PyErr_SetString(PyExc_TypeError, e.what());
+ return 0;
} catch (std::exception e) {
delete cpp;
Py_DECREF(seq);
Modified: trunk/gamera/include/plugins/geometry.hpp
===================================================================
--- trunk/gamera/include/plugins/geometry.hpp 2016-04-20 15:32:13 UTC (rev 1452)
+++ trunk/gamera/include/plugins/geometry.hpp 2016-04-22 13:57:35 UTC (rev 1453)
@@ -1,8 +1,9 @@
/*
- * Copyright (C) 2009-2013 Christoph Dalitz
+ * Copyright (C) 2009-2015 Christoph Dalitz
* 2010 Oliver Christen
* 2011 Christian Brandt
* 2012 David Kolanus
+ * 2015 Manuel Jeltsch
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -869,6 +870,132 @@
}
+ PyObject* hough_lines(const PointVector* points,
+ double min_theta, double step_theta, double max_theta,
+ double min_rho, double step_rho, double max_rho,
+ unsigned int n_lines=0, float threshold=1) {
+ if(!(min_theta < max_theta && step_theta != 0 && (max_theta - min_theta) / step_theta >= 1)) {
+ throw std::invalid_argument("Invalid arguments! The following assertion failed: min_theta < max_theta && step_theta != 0 && (max_theta - min_theta) / step_theta >= 1");
+ }
+ if(!(min_rho < max_rho && step_rho != 0 && (max_rho - min_rho) / step_rho >= 1)) {
+ throw std::invalid_argument("Invalid arguments! The following assertion failed: min_rho < max_rho && step_rho != 0 && (max_rho - min_rho) / step_rho >= 1");
+ }
+ int localMaxima = 3;
+ bool smooth = true;
+ if(min_theta < 0) {
+ min_theta = 0;
+ }
+ if(max_theta > M_PI) {
+ max_theta = M_PI;
+ }
+ if(threshold <=0) {
+ threshold = 1;
+ }
+ // compute accumulator / votings in parameter space
+ int theta_size = (max_theta - min_theta) / step_theta;
+ int rho_size = (max_rho - min_rho) / step_rho;
+
+ std::vector<std::vector<double> > houghSpace(theta_size, std::vector<double>(rho_size));
+
+ std::vector<double> sin_theta(houghSpace.size()), cos_theta(houghSpace.size());
+ for(unsigned int theta = 0; theta < houghSpace.size(); theta++) {
+ sin_theta[theta] = sin((min_theta + (theta * step_theta))*M_PI/180.0);
+ cos_theta[theta] = cos((min_theta + (theta * step_theta))*M_PI/180.0);
+ }
+
+ PointVector::const_iterator p;
+ for (p = points->begin(); p != points->end(); p++) {
+ for(unsigned int theta = 0; theta < houghSpace.size(); theta++) { // from index of min_theta to index of max_theta
+ // compute hessesche normalform:
+ // cos(alpha) * x + sin(alpha) * y = d
+ double rho = cos_theta[theta] * p->x() + sin_theta[theta] * p->y();
+
+ double di = (rho - min_rho) / step_rho; // get index
+ di = (di > 0.0) ? floor(di + 0.5) : ceil(di - 0.5); // round
+ if(di >= 0 && di < houghSpace[0].size()) { // if d >= d_min AND d<=d_max
+ houghSpace[theta][di]++;
+ if(smooth) { // compensate quantization error in d by onedirectional smoothing
+ double rho_error = rho - ((di * step_rho) + min_rho); // distance between point and line after quantization, which in a perfect world would be 0
+ if(rho_error > 0) {
+ di++;
+ if(di < houghSpace[0].size()) {
+ houghSpace[theta][di] += abs(rho_error) / (step_rho / 2);
+ }
+ } else if(rho_error < 0) {
+ di--;
+ if(di >= 0) {
+ houghSpace[theta][di] += abs(rho_error) / (step_rho / 2);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if(localMaxima >= 3) {
+ std::vector<std::vector<double> > houghSpaceLocalMaxima(theta_size, std::vector<double>(rho_size));
+
+ for(unsigned int theta = 0; theta < houghSpace.size(); theta++) {
+ for(unsigned int rho = 0; rho < houghSpace[0].size(); rho++) {
+ double val = houghSpace[theta][rho];
+ houghSpaceLocalMaxima[theta][rho] = val;
+
+ if(val != 0) {
+ for(int kTheta = theta - localMaxima / 2; kTheta <= (int)theta + localMaxima / 2; kTheta++) {
+ if(kTheta >= 0 && kTheta < (int)houghSpace.size()) { // in boundaries
+ for(int kRho = rho - localMaxima / 2; kRho <= (int)rho + localMaxima / 2; kRho++) {
+ if(val == 0) {
+ break;
+ }
+ if(kRho >= 0 && kRho < (int)houghSpace[0].size()) { // in boundaries
+ if(val < houghSpace[kTheta][kRho]) {
+ houghSpaceLocalMaxima[theta][rho] = 0;
+ val = 0;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ houghSpaceLocalMaxima.swap(houghSpace);
+ }
+
+ // vector of Votes
+ typedef std::vector<std::pair<double, std::pair<double, double> > > VectorType;
+ VectorType lines;
+
+ for(unsigned int theta = 0; theta < houghSpace.size(); theta++) {
+ for(unsigned int rho = 0; rho < houghSpace[0].size(); rho++) {
+ double value = houghSpace[theta][rho];
+ if(value >= threshold) {
+ lines.push_back(std::pair<double, std::pair<double, double> > (value, std::pair<double, double>(theta * step_theta, (rho * step_rho) + (min_rho))));
+ }
+ }
+ }
+ if(lines.size() == 0) {
+ return NULL;
+ }
+ if(n_lines > 0 && lines.size() > n_lines) {
+ // partition, so that nth line is on correct position
+ std::nth_element(lines.begin(), lines.begin() + lines.size() - n_lines, lines.end()); // backward nth_element
+ // cut off lines with less votes than nth line
+ VectorType(lines.begin() + lines.size() - n_lines, lines.end()).swap(lines); // backwards resize()
+ }
+ // sort remaining lines in descending order
+ std::sort(lines.rbegin(), lines.rend());
+
+ PyObject *retval, *entry;
+ retval = PyList_New(lines.size());
+ for(unsigned int i=0; i<lines.size(); i++) {
+ entry = Py_BuildValue(CHAR_PTR_CAST "fff", lines[i].first, lines[i].second.first * 180 / M_PI, lines[i].second.second);
+ PyList_SetItem(retval, i, entry);
+ }
+ return retval;
+ }
+
+
} // namespace Gamera
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2016-04-20 15:32:15
|
Revision: 1452
http://sourceforge.net/p/gamera/code/1452
Author: cdalitz
Date: 2016-04-20 15:32:13 +0000 (Wed, 20 Apr 2016)
Log Message:
-----------
improved workaround for progress bar crash with wxPython 3.0
Modified Paths:
--------------
trunk/gamera/gamera/gui/gui.py
trunk/gamera/gamera/gui/gui_util.py
Modified: trunk/gamera/gamera/gui/gui.py
===================================================================
--- trunk/gamera/gamera/gui/gui.py 2016-04-20 13:16:54 UTC (rev 1451)
+++ trunk/gamera/gamera/gui/gui.py 2016-04-20 15:32:13 UTC (rev 1452)
@@ -20,6 +20,8 @@
# This stuff must come the very first before any other gui-specific things
# are imported.
+from distutils.version import LooseVersion
+
# wxPython
try:
import wxversion
@@ -209,7 +211,10 @@
key = event.GetKeyCode()
if key in (wx.WXK_UP, wx.WXK_DOWN):
- event.m_controlDown = True
+ if LooseVersion(wx.__version__) < LooseVersion('3.0'):
+ event.m_controlDown = True
+ else:
+ event.SetControlDown(True)
wx.py.shell.Shell.OnKeyDown(self, event)
def GetLocals(self):
Modified: trunk/gamera/gamera/gui/gui_util.py
===================================================================
--- trunk/gamera/gamera/gui/gui_util.py 2016-04-20 13:16:54 UTC (rev 1451)
+++ trunk/gamera/gamera/gui/gui_util.py 2016-04-20 15:32:13 UTC (rev 1452)
@@ -25,7 +25,7 @@
from gamera import util
from gamera.config import config
import sys
-import time
+import datetime
config.add_option(
"", "--default-dir", default=".",
@@ -150,7 +150,7 @@
def __init__(self, message, length=1, numsteps=0):
assert util.is_string_or_unicode(message)
self.progress_box = wx.ProgressDialog(
- "Progress", message, 100,
+ "Progress", message, 100,
style=wx.PD_APP_MODAL|wx.PD_ELAPSED_TIME|wx.PD_REMAINING_TIME|wx.PD_AUTO_HIDE)
self.done = 0
self._num = 0
@@ -160,7 +160,7 @@
self._den = length
self._numsteps = numsteps
self._lastupdate = 0
- self._lasttime = time.time()
+ self._lasttime = datetime.datetime.now()
wx.BeginBusyCursor()
def __del__(self):
@@ -177,22 +177,25 @@
def step(self):
self._num += 1
+ self.update(self._num, self._den)
+
+ def update(self, num, den):
# make sure that the progress bar is not updated too often
# (otherwise it will crash)
- if (time.time() - self._lasttime) > 0.8:
- self.update(self._num, self._den)
-
- def update(self, num, den):
+ td = datetime.datetime.now() - self._lasttime
+ if (td.days*86400 + td.seconds + td.microseconds/100000.0) <= 0.3:
+ return
if not self.done:
if num >= den or num == self._lastupdate:
self.done = True
wx.EndBusyCursor()
- self.progress_box.Destroy()
+ #self.progress_box.Destroy()
+ wx.CallAfter(self.progress_box.Destroy)
elif 0 == self._numsteps or \
(den/(num-self._lastupdate) <= self._numsteps):
self.progress_box.Update(min(100, int((float(num) / float(den)) * 100.0)))
self._lastupdate = num
- self._lasttime = time.time()
+ self._lasttime = datetime.datetime.now()
def kill(self):
self.update(1, 1)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2016-04-20 13:16:56
|
Revision: 1451
http://sourceforge.net/p/gamera/code/1451
Author: cdalitz
Date: 2016-04-20 13:16:54 +0000 (Wed, 20 Apr 2016)
Log Message:
-----------
workaround for PyDeadObject errors on closing gamera_gui for wxPython 3.0
Modified Paths:
--------------
trunk/gamera/CHANGES
trunk/gamera/gamera/gui/classifier_display.py
Modified: trunk/gamera/CHANGES
===================================================================
--- trunk/gamera/CHANGES 2016-04-19 09:50:12 UTC (rev 1450)
+++ trunk/gamera/CHANGES 2016-04-20 13:16:54 UTC (rev 1451)
@@ -4,6 +4,8 @@
- fixed crash of progress bar an newer processors by updating it
less frequently
+ - workaround for GetChildren in wxPython 3.0 returning deleted items
+
- icons in gamera_gui now immediately shown without resize
on OSX with wxpython 3.0
Modified: trunk/gamera/gamera/gui/classifier_display.py
===================================================================
--- trunk/gamera/gamera/gui/classifier_display.py 2016-04-19 09:50:12 UTC (rev 1450)
+++ trunk/gamera/gamera/gui/classifier_display.py 2016-04-20 13:16:54 UTC (rev 1451)
@@ -1755,6 +1755,8 @@
# CALLBACKS
def _OnCloseWindow(self, event):
+ if self._frame is None:
+ return # workaround for function being called more than once in wxPython 3.0
if self.is_dirty:
if not gui_util.are_you_sure_dialog(
"Are you sure you want to quit without saving?"):
@@ -1776,6 +1778,7 @@
self.splitterhl.Destroy()
self.splitterv.Destroy()
del self._frame
+ self._frame = None
def refresh(self):
self.single_iw.id.refresh(1)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2016-04-19 09:50:15
|
Revision: 1450
http://sourceforge.net/p/gamera/code/1450
Author: cdalitz
Date: 2016-04-19 09:50:12 +0000 (Tue, 19 Apr 2016)
Log Message:
-----------
slowed down step increase of progress bar further
Modified Paths:
--------------
trunk/gamera/gamera/gui/gui_util.py
Modified: trunk/gamera/gamera/gui/gui_util.py
===================================================================
--- trunk/gamera/gamera/gui/gui_util.py 2016-04-18 19:54:55 UTC (rev 1449)
+++ trunk/gamera/gamera/gui/gui_util.py 2016-04-19 09:50:12 UTC (rev 1450)
@@ -179,7 +179,7 @@
self._num += 1
# make sure that the progress bar is not updated too often
# (otherwise it will crash)
- if (time.time() - self._lasttime) > 0.5:
+ if (time.time() - self._lasttime) > 0.8:
self.update(self._num, self._den)
def update(self, num, den):
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2016-04-18 19:54:57
|
Revision: 1449
http://sourceforge.net/p/gamera/code/1449
Author: cdalitz
Date: 2016-04-18 19:54:55 +0000 (Mon, 18 Apr 2016)
Log Message:
-----------
fixed crash of progress bar during feature generateion on fast processors
Modified Paths:
--------------
trunk/gamera/CHANGES
trunk/gamera/gamera/gui/gui_util.py
Modified: trunk/gamera/CHANGES
===================================================================
--- trunk/gamera/CHANGES 2016-04-18 16:08:21 UTC (rev 1448)
+++ trunk/gamera/CHANGES 2016-04-18 19:54:55 UTC (rev 1449)
@@ -1,6 +1,9 @@
Changes made between Gamera File Releases
=========================================
+ - fixed crash of progress bar an newer processors by updating it
+ less frequently
+
- icons in gamera_gui now immediately shown without resize
on OSX with wxpython 3.0
Modified: trunk/gamera/gamera/gui/gui_util.py
===================================================================
--- trunk/gamera/gamera/gui/gui_util.py 2016-04-18 16:08:21 UTC (rev 1448)
+++ trunk/gamera/gamera/gui/gui_util.py 2016-04-18 19:54:55 UTC (rev 1449)
@@ -25,6 +25,7 @@
from gamera import util
from gamera.config import config
import sys
+import time
config.add_option(
"", "--default-dir", default=".",
@@ -159,6 +160,7 @@
self._den = length
self._numsteps = numsteps
self._lastupdate = 0
+ self._lasttime = time.time()
wx.BeginBusyCursor()
def __del__(self):
@@ -175,10 +177,10 @@
def step(self):
self._num += 1
- # Note that trying to cut back on the number of calls
- # here is futile. The testing overhead is greater than
- # the call.
- self.update(self._num, self._den)
+ # make sure that the progress bar is not updated too often
+ # (otherwise it will crash)
+ if (time.time() - self._lasttime) > 0.5:
+ self.update(self._num, self._den)
def update(self, num, den):
if not self.done:
@@ -190,6 +192,7 @@
(den/(num-self._lastupdate) <= self._numsteps):
self.progress_box.Update(min(100, int((float(num) / float(den)) * 100.0)))
self._lastupdate = num
+ self._lasttime = time.time()
def kill(self):
self.update(1, 1)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2016-04-18 16:08:25
|
Revision: 1448
http://sourceforge.net/p/gamera/code/1448
Author: cdalitz
Date: 2016-04-18 16:08:21 +0000 (Mon, 18 Apr 2016)
Log Message:
-----------
removed some compilation warnings on OSX
Modified Paths:
--------------
trunk/gamera/include/vigra/edgedetection.hxx
trunk/gamera/src/libtiff/fax3sm_winnt.c
trunk/gamera/src/libtiff/uvcode.h
Modified: trunk/gamera/include/vigra/edgedetection.hxx
===================================================================
--- trunk/gamera/include/vigra/edgedetection.hxx 2016-04-18 15:11:07 UTC (rev 1447)
+++ trunk/gamera/include/vigra/edgedetection.hxx 2016-04-18 16:08:21 UTC (rev 1448)
@@ -2108,8 +2108,8 @@
void cannyEdgelList3x3(SrcIterator ul, SrcIterator lr, SrcAccessor src,
BackInsertable & edgels, double scale)
{
- int w = lr.x - ul.x;
- int h = lr.y - ul.y;
+ //int w = lr.x - ul.x;
+ //int h = lr.y - ul.y;
typedef typename NumericTraits<typename SrcAccessor::value_type>::RealPromote TmpType;
BasicImage<TinyVector<TmpType, 2> > grad(lr-ul);
Modified: trunk/gamera/src/libtiff/fax3sm_winnt.c
===================================================================
--- trunk/gamera/src/libtiff/fax3sm_winnt.c 2016-04-18 15:11:07 UTC (rev 1447)
+++ trunk/gamera/src/libtiff/fax3sm_winnt.c 2016-04-18 16:08:21 UTC (rev 1448)
@@ -2,1045 +2,1259 @@
mkg3states program */
#include "tiff.h"
#include "tif_fax3.h"
- const TIFFFaxTabEnt TIFFFaxMainTable[128] = {
-12,7,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,
-2,3,0,3,1,0,4,3,1,3,1,0,5,6,2,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,
-1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,5,7,3,3,1,0,5,3,1,3,1,0,
-2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,
-4,6,2,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,
-2,3,0,3,1,0,4,3,1,3,1,0,6,7,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,
-1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,5,6,2,3,1,0,5,3,1,3,1,0,
-2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,
-4,7,3,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,
-2,3,0,3,1,0,4,3,1,3,1,0,4,6,2,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,
-1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0
+ const TIFFFaxTabEnt TIFFFaxMainTable[128] = {
+{12,7,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{1,4,0},{3,1,0},
+{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{5,6,2},{3,1,0},{5,3,1},{3,1,0},
+{2,3,0},{3,1,0},{4,3,1},{3,1,0},{1,4,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},
+{4,3,1},{3,1,0},{5,7,3},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},
+{1,4,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{4,6,2},{3,1,0},
+{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{1,4,0},{3,1,0},{5,3,1},{3,1,0},
+{2,3,0},{3,1,0},{4,3,1},{3,1,0},{6,7,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},
+{4,3,1},{3,1,0},{1,4,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},
+{5,6,2},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{1,4,0},{3,1,0},
+{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},{4,7,3},{3,1,0},{5,3,1},{3,1,0},
+{2,3,0},{3,1,0},{4,3,1},{3,1,0},{1,4,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},
+{4,3,1},{3,1,0},{4,6,2},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0},
+{1,4,0},{3,1,0},{5,3,1},{3,1,0},{2,3,0},{3,1,0},{4,3,1},{3,1,0}
};
-const TIFFFaxTabEnt TIFFFaxWhiteTable[4096] = {
-12,11,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
-7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
-7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
-7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
-7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
-9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,11,1792,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
-7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
-7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,
-7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
-7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,
-7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
-7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
-7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,
-7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,
-7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,
-7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
-7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-11,11,1856,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
-7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,
-7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,
-7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,
-7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,
-9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
-7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,
-7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,
-7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,
-7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,
-7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
-7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,11,12,2112,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
-7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,
-7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,
-7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,
-7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
-7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
-7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
-7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
-7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
-7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
-9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,12,2368,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
-7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
-7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,
-7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
-7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,
-7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
-7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
-7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,
-7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,
-7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,
-7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
-7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-11,12,1984,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
-7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,
-7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,
-7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,
-7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,
-9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
-7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,
-7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,
-7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,
-7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,
-7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
-7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,11,11,1920,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
-7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,
-7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,
-7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,
-7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
-7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
-7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
-7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
-7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
-7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
-9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,12,2240,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
-7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
-7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,
-7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
-7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,
-7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
-7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
-7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,
-7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,
-7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,
-7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
-7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-11,12,2496,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
-7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,
-7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,
-7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,
-7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,
-9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,12,11,0,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
-7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,
-7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,
-7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,
-7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,
-7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
-7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,11,11,1792,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
-7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,
-7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,
-7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,
-7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
-7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
-7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
-7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
-7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
-7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
-9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,11,1856,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
-7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
-7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,
-7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
-7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,
-7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
-7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
-7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,
-7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,
-7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,
-7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
-7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-11,12,2176,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
-7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,
-7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,
-7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,
-7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,
-9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
-7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,
-7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,
-7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,
-7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,
-7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
-7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,11,12,2432,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
-7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,
-7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,
-7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,
-7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
-7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
-7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
-7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
-7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
-7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
-9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,12,2048,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
-7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
-7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,
-7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
-7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,
-7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
-7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
-7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,
-7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,
-7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,
-7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
-7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-11,11,1920,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
-7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,
-7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,
-7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,
-7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,
-9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
-7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,
-7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,
-7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,
-7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,
-7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
-7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,11,12,2304,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
-7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,
-7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,
-7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,
-7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
-7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
-7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
-7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
-7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
-7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
-7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
-9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
-7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,12,2560,7,4,3,7,5,11,7,4,5,
-7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
-7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
-7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,
-7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
-7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
-7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,
-7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
-7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
-7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
-7,5,10,7,4,4,7,4,2,7,4,7
+ const TIFFFaxTabEnt TIFFFaxWhiteTable[4096] = {
+{12,11,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},
+{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},
+{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},
+{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},
+{9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},
+{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},
+{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,960},{7,4,6},{7,8,31},{7,5,8},
+{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},
+{7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},
+{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},
+{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,11,1792},{7,4,3},
+{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},
+{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},
+{9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},
+{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1600},{7,4,5},
+{7,8,44},{7,6,17},{9,9,1344},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},
+{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},
+{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1088},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},
+{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},
+{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},
+{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},
+{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},
+{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},
+{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},
+{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},
+{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1536},{7,4,5},{7,8,43},{7,6,17},
+{9,9,1280},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},
+{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},
+{7,8,41},{7,6,16},{9,9,1024},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,768},{7,4,6},
+{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},
+{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,11,1856},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},
+{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},
+{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,896},{7,4,6},{7,7,19},{7,5,8},
+{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},
+{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},
+{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1728},{7,4,5},{7,8,44},{7,6,17},{9,9,1408},{7,4,6},
+{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},
+{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},
+{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},
+{9,9,1152},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},
+{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},
+{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},
+{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},
+{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},
+{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},
+{7,6,13},{7,4,3},{9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6},{7,6,1},{7,5,8},
+{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},
+{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},
+{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,960},{7,4,6},
+{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},
+{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},
+{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},
+{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{11,12,2112},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},
+{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},
+{7,8,40},{7,6,16},{9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},
+{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},
+{9,9,1600},{7,4,5},{7,8,44},{7,6,17},{9,9,1344},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},
+{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},
+{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1088},{7,4,6},{7,8,32},{7,5,8},
+{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},
+{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},
+{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},
+{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},
+{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},
+{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},
+{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},
+{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1536},{7,4,5},
+{7,8,43},{7,6,17},{9,9,1280},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},
+{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},
+{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,1024},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},
+{9,9,768},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},
+{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},
+{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,12,2368},{7,4,3},{7,5,11},{7,4,5},
+{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},
+{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,896},{7,4,6},
+{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},
+{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},
+{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1728},{7,4,5},{7,8,44},{7,6,17},
+{9,9,1408},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},
+{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},
+{7,8,42},{7,6,16},{9,9,1152},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},
+{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},
+{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},
+{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},
+{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},
+{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},
+{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},
+{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6},
+{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},
+{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},
+{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},
+{9,9,960},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128},
+{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},
+{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{11,12,1984},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},
+{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},
+{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},
+{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},
+{7,6,13},{7,4,3},{9,9,1600},{7,4,5},{7,8,44},{7,6,17},{9,9,1344},{7,4,6},{7,6,1},{7,5,8},
+{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},
+{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},
+{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1088},{7,4,6},
+{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},
+{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},
+{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},
+{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},
+{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},
+{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},
+{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},
+{9,9,1536},{7,4,5},{7,8,43},{7,6,17},{9,9,1280},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},
+{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},
+{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,1024},{7,4,6},{7,8,31},{7,5,8},
+{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},
+{7,7,26},{7,5,9},{9,9,768},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},
+{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},
+{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,11,1920},{7,4,3},
+{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},
+{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},
+{9,9,896},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},
+{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1728},{7,4,5},
+{7,8,44},{7,6,17},{9,9,1408},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},
+{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},
+{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1152},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},
+{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},
+{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},
+{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},
+{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},
+{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},
+{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},
+{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},
+{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1472},{7,4,5},{7,8,43},{7,6,17},
+{9,9,1216},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},
+{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},
+{7,8,41},{7,6,16},{9,9,960},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,704},{7,4,6},
+{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},
+{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,12,2240},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},
+{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},
+{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,832},{7,4,6},{7,7,19},{7,5,8},
+{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},
+{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},
+{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1600},{7,4,5},{7,8,44},{7,6,17},{9,9,1344},{7,4,6},
+{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},
+{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},
+{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},
+{9,9,1088},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},
+{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},
+{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},
+{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},
+{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},
+{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},
+{7,6,13},{7,4,3},{9,9,1536},{7,4,5},{7,8,43},{7,6,17},{9,9,1280},{7,4,6},{7,6,1},{7,5,8},
+{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},
+{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},
+{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,1024},{7,4,6},
+{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},
+{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,768},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},
+{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},
+{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{11,12,2496},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},
+{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},
+{7,8,40},{7,6,16},{9,9,896},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},
+{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},
+{9,9,1728},{7,4,5},{7,8,44},{7,6,17},{9,9,1408},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},
+{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},
+{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1152},{7,4,6},{7,8,32},{7,5,8},
+{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},
+{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},
+{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},
+{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{12,11,0},{7,4,3},
+{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},
+{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},
+{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},
+{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1472},{7,4,5},
+{7,8,43},{7,6,17},{9,9,1216},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},
+{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},
+{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,960},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},
+{9,9,704},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},
+{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},
+{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,11,1792},{7,4,3},{7,5,11},{7,4,5},
+{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},
+{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,832},{7,4,6},
+{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},
+{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},
+{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1600},{7,4,5},{7,8,44},{7,6,17},
+{9,9,1344},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},
+{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},
+{7,8,42},{7,6,16},{9,9,1088},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},
+{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},
+{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},
+{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},
+{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},
+{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},
+{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},
+{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1536},{7,4,5},{7,8,43},{7,6,17},{9,9,1280},{7,4,6},
+{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},
+{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},
+{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},
+{9,9,1024},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,768},{7,4,6},{7,8,37},{9,5,128},
+{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},
+{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{11,11,1856},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},
+{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},
+{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,896},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},
+{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},
+{7,6,13},{7,4,3},{9,9,1728},{7,4,5},{7,8,44},{7,6,17},{9,9,1408},{7,4,6},{7,6,1},{7,5,8},
+{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},
+{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},
+{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1152},{7,4,6},
+{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},
+{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},
+{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},
+{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},
+{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},
+{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},
+{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},
+{9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},
+{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},
+{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,960},{7,4,6},{7,8,31},{7,5,8},
+{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},
+{7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},
+{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},
+{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,12,2176},{7,4,3},
+{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},
+{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},
+{9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},
+{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1600},{7,4,5},
+{7,8,44},{7,6,17},{9,9,1344},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{7,8,30},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},
+{7,8,34},{9,5,128},{7,8,50},{7,6,14},{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},
+{7,8,60},{7,4,5},{7,8,42},{7,6,16},{9,9,1088},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},
+{9,8,640},{7,4,6},{7,8,38},{9,5,128},{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},
+{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},
+{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},
+{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},
+{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},
+{7,7,19},{7,5,8},{7,8,55},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},
+{7,5,11},{7,4,5},{7,8,53},{7,5,9},{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},
+{7,8,63},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1536},{7,4,5},{7,8,43},{7,6,17},
+{9,9,1280},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{7,8,29},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},
+{7,8,49},{7,6,14},{7,8,61},{7,4,4},{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},
+{7,8,41},{7,6,16},{9,9,1024},{7,4,6},{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,768},{7,4,6},
+{7,8,37},{9,5,128},{7,7,25},{7,6,15},{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},
+{7,7,18},{7,4,5},{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{11,12,2432},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},
+{9,6,1664},{7,4,6},{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},
+{7,7,23},{7,4,3},{7,7,27},{7,4,5},{7,8,40},{7,6,16},{9,9,896},{7,4,6},{7,7,19},{7,5,8},
+{7,8,56},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},
+{7,8,54},{7,5,9},{9,8,512},{7,4,6},{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},
+{7,4,2},{7,4,7},{7,6,13},{7,4,3},{9,9,1728},{7,4,5},{7,8,44},{7,6,17},{9,9,1408},{7,4,6},
+{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,30},{7,4,3},
+{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,34},{9,5,128},{7,8,50},{7,6,14},
+{7,8,62},{7,4,4},{7,4,2},{7,4,7},{7,8,48},{7,4,3},{7,8,60},{7,4,5},{7,8,42},{7,6,16},
+{9,9,1152},{7,4,6},{7,8,32},{7,5,8},{7,8,58},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{7,7,22},{7,4,3},{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,8,640},{7,4,6},{7,8,38},{9,5,128},
+{7,7,25},{7,6,15},{9,8,384},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},
+{7,7,21},{7,6,17},{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{0,0,0},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},
+{7,7,20},{9,5,128},{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},
+{7,7,27},{7,4,5},{7,8,39},{7,6,16},{9,8,576},{7,4,6},{7,7,19},{7,5,8},{7,8,55},{9,5,64},
+{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,45},{7,4,3},{7,5,11},{7,4,5},{7,8,53},{7,5,9},
+{9,8,448},{7,4,6},{7,8,35},{9,5,128},{7,8,51},{7,6,15},{7,8,63},{7,4,4},{7,4,2},{7,4,7},
+{7,6,13},{7,4,3},{9,9,1472},{7,4,5},{7,8,43},{7,6,17},{9,9,1216},{7,4,6},{7,6,1},{7,5,8},
+{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,8,29},{7,4,3},{7,5,11},{7,4,5},
+{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,8,33},{9,5,128},{7,8,49},{7,6,14},{7,8,61},{7,4,4},
+{7,4,2},{7,4,7},{7,8,47},{7,4,3},{7,8,59},{7,4,5},{7,8,41},{7,6,16},{9,9,960},{7,4,6},
+{7,8,31},{7,5,8},{7,8,57},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},{7,7,22},{7,4,3},
+{7,5,11},{7,4,5},{7,7,26},{7,5,9},{9,9,704},{7,4,6},{7,8,37},{9,5,128},{7,7,25},{7,6,15},
+{9,8,320},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},{7,7,18},{7,4,5},{7,7,21},{7,6,17},
+{9,7,256},{7,4,6},{7,6,1},{7,5,8},{9,6,192},{9,5,64},{7,5,10},{7,4,4},{7,4,2},{7,4,7},
+{11,12,2048},{7,4,3},{7,5,11},{7,4,5},{7,6,12},{7,5,9},{9,6,1664},{7,4,6},{7,7,20},{9,5,128},
+{7,7,24},{7,6,14},{7,7,28},{7,4,4},{7,4,2},{7,4,7},{7,7,23},{7,4,3},{7,7,27},{7,4,5},
+{7,8,40},{7,6,16},{9,9,832},{7,4,6},{7,7,19},{7,5,8},{7,8,56},{9,5,64},{7,5,10},{7,4,4},
+{7,4,2},{7,4,7},{7,8,46},{7,4,3},{7,5,11},{7,4,5},{7,8,54},{7,5,9},{9,8,512},{7,4,6},
+{7,8,36},{9,5,128},{7,8,52},{7,6,15},{7,8,0},{7,4,4},{7,4,2},{7,4,7},{7,6,13},{7,4,3},
+{9,9,1600},{7,4,5},{7,8,44},{7,6,17},{9,9,1344},{7,4,6}...
[truncated message content] |
|
From: <cd...@us...> - 2016-04-18 15:11:09
|
Revision: 1447
http://sourceforge.net/p/gamera/code/1447
Author: cdalitz
Date: 2016-04-18 15:11:07 +0000 (Mon, 18 Apr 2016)
Log Message:
-----------
removed some warnings on OSX
Modified Paths:
--------------
trunk/gamera/gamera/gui/icon_display.py
trunk/gamera/include/plugins/deformations.hpp
trunk/gamera/include/plugins/image_conversion.hpp
trunk/gamera/src/eodev/es/CMAState.h
trunk/gamera/src/graph/graphmodule/wrapper.hpp
Modified: trunk/gamera/gamera/gui/icon_display.py
===================================================================
--- trunk/gamera/gamera/gui/icon_display.py 2016-04-18 10:21:01 UTC (rev 1446)
+++ trunk/gamera/gamera/gui/icon_display.py 2016-04-18 15:11:07 UTC (rev 1447)
@@ -140,6 +140,7 @@
if next >= 0:
self.SetItemState(
next, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED)
+ self.Refresh()
def update_icons(self, locals=None):
if locals != None:
Modified: trunk/gamera/include/plugins/deformations.hpp
===================================================================
--- trunk/gamera/include/plugins/deformations.hpp 2016-04-18 10:21:01 UTC (rev 1446)
+++ trunk/gamera/include/plugins/deformations.hpp 2016-04-18 15:11:07 UTC (rev 1447)
@@ -16,7 +16,7 @@
* You should have received a copy of the GNU General Public License
*/
#ifndef _kwm12032001_deformations
-#define _kwn12032001_deformations
+#define _kwm12032001_deformations
#include "plugins/image_utilities.hpp"
#include "vigra/resizeimage.hxx"
Modified: trunk/gamera/include/plugins/image_conversion.hpp
===================================================================
--- trunk/gamera/include/plugins/image_conversion.hpp 2016-04-18 10:21:01 UTC (rev 1446)
+++ trunk/gamera/include/plugins/image_conversion.hpp 2016-04-18 15:11:07 UTC (rev 1447)
@@ -595,8 +595,7 @@
typename T::const_col_iterator in_col;
typename FloatImageView::row_iterator out_row = view->row_begin();
typename FloatImageView::col_iterator out_col;
- typedef typename choose_accessor<T>::real_accessor Accessor;
- Accessor in_acc = Accessor(in_acc);
+ typename choose_accessor<T>::real_accessor in_acc;
ImageAccessor<FloatPixel> out_acc;
for (; in_row != image.row_end(); ++in_row, ++out_row) {
for (in_col = in_row.begin(), out_col = out_row.begin();
@@ -782,8 +781,7 @@
typename T::const_col_iterator in_col;
typename FloatImageView::row_iterator out_row = view->row_begin();
typename FloatImageView::col_iterator out_col;
- typedef typename choose_accessor<T>::accessor Accessor;
- Accessor in_acc = Accessor(in_acc);
+ typename choose_accessor<T>::accessor in_acc;
ImageAccessor<FloatPixel> out_acc;
for (; in_row != image.row_end(); ++in_row, ++out_row) {
for (in_col = in_row.begin(), out_col = out_row.begin();
@@ -809,8 +807,7 @@
typename T::const_col_iterator in_col;
typename FloatImageView::row_iterator out_row = view->row_begin();
typename FloatImageView::col_iterator out_col;
- typedef typename choose_accessor<T>::accessor Accessor;
- Accessor in_acc = Accessor(in_acc);
+ typename choose_accessor<T>::accessor in_acc;
ImageAccessor<FloatPixel> out_acc;
for (; in_row != image.row_end(); ++in_row, ++out_row) {
for (in_col = in_row.begin(), out_col = out_row.begin();
Modified: trunk/gamera/src/eodev/es/CMAState.h
===================================================================
--- trunk/gamera/src/eodev/es/CMAState.h 2016-04-18 10:21:01 UTC (rev 1446)
+++ trunk/gamera/src/eodev/es/CMAState.h 2016-04-18 15:11:07 UTC (rev 1447)
@@ -18,7 +18,7 @@
namespace eo {
-class CMAStateImpl;
+struct CMAStateImpl;
class CMAParams;
class CMAState {
Modified: trunk/gamera/src/graph/graphmodule/wrapper.hpp
===================================================================
--- trunk/gamera/src/graph/graphmodule/wrapper.hpp 2016-04-18 10:21:01 UTC (rev 1446)
+++ trunk/gamera/src/graph/graphmodule/wrapper.hpp 2016-04-18 15:11:07 UTC (rev 1447)
@@ -39,9 +39,9 @@
#include <iostream>
#endif
using namespace Gamera::GraphApi;
-class GraphObject;
-class EdgeObject;
-class NodeObject;
+struct GraphObject;
+struct EdgeObject;
+struct NodeObject;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2016-04-18 10:21:02
|
Revision: 1446
http://sourceforge.net/p/gamera/code/1446
Author: cdalitz
Date: 2016-04-18 10:21:01 +0000 (Mon, 18 Apr 2016)
Log Message:
-----------
icons in gamera_gui now immediately shown without resize on OSX with wxpython 3.0
Modified Paths:
--------------
trunk/gamera/CHANGES
trunk/gamera/gamera/gui/gamera_display.py
trunk/gamera/gamera/gui/icon_display.py
Modified: trunk/gamera/CHANGES
===================================================================
--- trunk/gamera/CHANGES 2016-03-15 13:13:46 UTC (rev 1445)
+++ trunk/gamera/CHANGES 2016-04-18 10:21:01 UTC (rev 1446)
@@ -1,6 +1,9 @@
Changes made between Gamera File Releases
=========================================
+ - icons in gamera_gui now immediately shown without resize
+ on OSX with wxpython 3.0
+
- photometric tag of TIFF files no longer ignored for onebit TIFFs,
which could lead to color inversion when reading TIFF images
Modified: trunk/gamera/gamera/gui/gamera_display.py
===================================================================
--- trunk/gamera/gamera/gui/gamera_display.py 2016-03-15 13:13:46 UTC (rev 1445)
+++ trunk/gamera/gamera/gui/gamera_display.py 2016-04-18 10:21:01 UTC (rev 1446)
@@ -1833,7 +1833,8 @@
self._iw.id.add_callback(*args)
def remove_callback(self, *args):
- self._iw.id.remove_callback(*args)
+ if hasattr(self, "_iw"):
+ self._iw.id.remove_callback(*args)
def trigger_callback(self, *args):
self._iw.id.trigger_callback(*args)
@@ -1854,9 +1855,11 @@
def _OnCloseWindow(self, event):
if self.owner:
self.owner.set_display(None)
- del self._iw
- self._frame.Destroy()
- del self._frame
+ if hasattr(self, "_iw"):
+ del self._iw
+ if hasattr(self, "_frame"):
+ self._frame.Destroy()
+ del self._frame
def Show(self, flag=1):
self._frame.Show(flag)
Modified: trunk/gamera/gamera/gui/icon_display.py
===================================================================
--- trunk/gamera/gamera/gui/icon_display.py 2016-03-15 13:13:46 UTC (rev 1445)
+++ trunk/gamera/gamera/gui/icon_display.py 2016-04-18 10:21:01 UTC (rev 1446)
@@ -109,6 +109,7 @@
data.index = index
self.data[label] = data
self.InsertImageStringItem(index, label, icon)
+ self.Refresh()
def refresh_icon(self, key, klass, data, icon_num):
icon = self.data[key]
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2016-03-15 13:13:48
|
Revision: 1445
http://sourceforge.net/p/gamera/code/1445
Author: cdalitz
Date: 2016-03-15 13:13:46 +0000 (Tue, 15 Mar 2016)
Log Message:
-----------
take care of photometric tag for onebit TIFF images
Modified Paths:
--------------
trunk/gamera/CHANGES
trunk/gamera/include/plugins/tiff_support.hpp
Modified: trunk/gamera/CHANGES
===================================================================
--- trunk/gamera/CHANGES 2016-03-02 13:09:16 UTC (rev 1444)
+++ trunk/gamera/CHANGES 2016-03-15 13:13:46 UTC (rev 1445)
@@ -1,6 +1,9 @@
Changes made between Gamera File Releases
=========================================
+ - photometric tag of TIFF files no longer ignored for onebit TIFFs,
+ which could lead to color inversion when reading TIFF images
+
- fixed error in reading/writing 16bit greyscale PNG images
- 16bit RGB PNG images now supported via downscaling
Modified: trunk/gamera/include/plugins/tiff_support.hpp
===================================================================
--- trunk/gamera/include/plugins/tiff_support.hpp 2016-03-02 13:09:16 UTC (rev 1444)
+++ trunk/gamera/include/plugins/tiff_support.hpp 2016-03-15 13:13:46 UTC (rev 1445)
@@ -77,7 +77,7 @@
info->ncolors((size_t)tmp);
TIFFGetFieldDefaulted(tif, TIFFTAG_PHOTOMETRIC, &tmp);
info->inverted(tmp == PHOTOMETRIC_MINISWHITE);
-
+
TIFFClose(tif);
} catch (std::exception e) {
TIFFSetErrorHandler(saved_handler);
@@ -110,10 +110,17 @@
bits = data[bit_index];
bit_index++;
}
- if (bits[k])
- tmp = pixel_traits<OneBitPixel>::black();
- else
- tmp = pixel_traits<OneBitPixel>::white();
+ if (info.inverted()) { // MINISWHITE
+ if (bits[k])
+ tmp = pixel_traits<OneBitPixel>::black();
+ else
+ tmp = pixel_traits<OneBitPixel>::white();
+ } else { // MINISBLACK
+ if (bits[k])
+ tmp = pixel_traits<OneBitPixel>::white();
+ else
+ tmp = pixel_traits<OneBitPixel>::black();
+ }
matrix.set(Point(j, i), tmp);
if (k == 0)
k = 8;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2016-03-02 13:09:19
|
Revision: 1444
http://sourceforge.net/p/gamera/code/1444
Author: cdalitz
Date: 2016-03-02 13:09:16 +0000 (Wed, 02 Mar 2016)
Log Message:
-----------
bugfix of bugfix by Markus Schaaf
Modified Paths:
--------------
trunk/gamera/include/plugins/deformations.hpp
Modified: trunk/gamera/include/plugins/deformations.hpp
===================================================================
--- trunk/gamera/include/plugins/deformations.hpp 2016-03-02 08:18:28 UTC (rev 1443)
+++ trunk/gamera/include/plugins/deformations.hpp 2016-03-02 13:09:16 UTC (rev 1444)
@@ -199,7 +199,7 @@
i++;
for(; i<shiftAmount + orig.nrows() - sourceshift; i++) {
- if (i >= (shiftAmount - sourceshift))
+ if (i + sourceshift >= shiftAmount)
filterfunc(p0, p1, oldPixel, orig.get(Point(col, i - shiftAmount + sourceshift)),weight);
if ((i>=0) && (i<height1))
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2016-03-02 08:18:31
|
Revision: 1443
http://sourceforge.net/p/gamera/code/1443
Author: cdalitz
Date: 2016-03-02 08:18:28 +0000 (Wed, 02 Mar 2016)
Log Message:
-----------
fixed minor bugs (thanks to Markus Schaaf)
Modified Paths:
--------------
trunk/gamera/include/plugins/deformations.hpp
trunk/gamera/include/plugins/runlength.hpp
trunk/gamera/src/eodev/es/eoNormalMutation.h
Modified: trunk/gamera/include/plugins/deformations.hpp
===================================================================
--- trunk/gamera/include/plugins/deformations.hpp 2016-02-24 12:36:09 UTC (rev 1442)
+++ trunk/gamera/include/plugins/deformations.hpp 2016-03-02 08:18:28 UTC (rev 1443)
@@ -1,7 +1,7 @@
/*
*
* Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan
- * 2010 Christoph Dalitz
+ * 2010-2016 Christoph Dalitz
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -199,7 +199,7 @@
i++;
for(; i<shiftAmount + orig.nrows() - sourceshift; i++) {
- if ((i-shiftAmount+sourceshift) >= 0)
+ if (i >= (shiftAmount - sourceshift))
filterfunc(p0, p1, oldPixel, orig.get(Point(col, i - shiftAmount + sourceshift)),weight);
if ((i>=0) && (i<height1))
Modified: trunk/gamera/include/plugins/runlength.hpp
===================================================================
--- trunk/gamera/include/plugins/runlength.hpp 2016-02-24 12:36:09 UTC (rev 1442)
+++ trunk/gamera/include/plugins/runlength.hpp 2016-03-02 08:18:28 UTC (rev 1443)
@@ -540,12 +540,12 @@
int count = 0;
size_t i;
if (direction == "top") {
- for (i = p.y()-1; i >= 0; i--, count++)
+ for (i = p.y(); i-- > 0; count++)
if (is_black(image.get(Point(p.x(),i))) == color_tf)
break;
}
else if (direction == "left") {
- for (i = p.x()-1; i >= 0; i--, count++)
+ for (i = p.x()-1; i-- > 0; count++)
if (is_black(image.get(Point(i,p.y()))) == color_tf)
break;
}
Modified: trunk/gamera/src/eodev/es/eoNormalMutation.h
===================================================================
--- trunk/gamera/src/eodev/es/eoNormalMutation.h 2016-02-24 12:36:09 UTC (rev 1442)
+++ trunk/gamera/src/eodev/es/eoNormalMutation.h 2016-03-02 08:18:28 UTC (rev 1443)
@@ -138,7 +138,7 @@
* @param _p_change the probability to change a given coordinate
*/
eoNormalMutation(eoRealVectorBounds & _bounds,
- double _sigma, const double& _p_change = 1.0):
+ double & _sigma, const double& _p_change = 1.0):
sigma(_sigma), bounds(_bounds), p_change(_p_change) {}
/** The class name */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2016-02-24 12:36:10
|
Revision: 1442
http://sourceforge.net/p/gamera/code/1442
Author: cdalitz
Date: 2016-02-24 12:36:09 +0000 (Wed, 24 Feb 2016)
Log Message:
-----------
updated link to divergent colormap
Modified Paths:
--------------
trunk/gamera/gamera/plugins/color.py
Modified: trunk/gamera/gamera/plugins/color.py
===================================================================
--- trunk/gamera/gamera/plugins/color.py 2015-12-08 12:37:53 UTC (rev 1441)
+++ trunk/gamera/gamera/plugins/color.py 2016-02-24 12:36:09 UTC (rev 1442)
@@ -182,7 +182,7 @@
`Diverging Color Maps for Scientific Visualization.`__
5th International Symposium on Visual Computing, 2009
- __ http://www.sandia.gov/~kmorel/documents/ColorMaps/
+ __ http://www.kennethmoreland.com/color-maps/
"""
self_type = ImageType([FLOAT, GREYSCALE])
args = Args([Choice("colormap", ["diverging", "rainbow"], default=0)])
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2015-12-08 12:37:54
|
Revision: 1441
http://sourceforge.net/p/gamera/code/1441
Author: cdalitz
Date: 2015-12-08 12:37:53 +0000 (Tue, 08 Dec 2015)
Log Message:
-----------
fixed broken link in docs
Modified Paths:
--------------
trunk/gamera/doc/src/script.txt
Modified: trunk/gamera/doc/src/script.txt
===================================================================
--- trunk/gamera/doc/src/script.txt 2015-12-02 15:30:10 UTC (rev 1440)
+++ trunk/gamera/doc/src/script.txt 2015-12-08 12:37:53 UTC (rev 1441)
@@ -16,11 +16,10 @@
structure your application. The high-level structure of your
application will largely depend on its size and complexity and your
own programming preferences and style, and is out of the scope of this
-document. Obtaining some level of familiarity with Python through the
-`Python Tutorial`_ or any of the numerous `Python books`__ available is
+document. Obtaining some level of familiarity with Python through
+any of the numerous `Python books and tutorials`__ available is
recommended.
-.. _Python Tutorial: http://docs.python.org/tut/tut.html
.. __: http://www.python.org/cgi-bin/moinmoin/PythonBooks
The examples below demonstrate how to start creating Gamera-based
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2015-12-02 15:30:13
|
Revision: 1440
http://sourceforge.net/p/gamera/code/1440
Author: cdalitz
Date: 2015-12-02 15:30:10 +0000 (Wed, 02 Dec 2015)
Log Message:
-----------
compatibility with older pil versions
Modified Paths:
--------------
trunk/gamera/gamera/plugins/pil_io.py
Modified: trunk/gamera/gamera/plugins/pil_io.py
===================================================================
--- trunk/gamera/gamera/plugins/pil_io.py 2015-12-01 12:35:54 UTC (rev 1439)
+++ trunk/gamera/gamera/plugins/pil_io.py 2015-12-02 15:30:10 UTC (rev 1440)
@@ -1,5 +1,6 @@
#
# Copyright (C) 2005 Alex Cobb
+# 2015 Christoph Dalitz
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -76,11 +77,19 @@
pixel_type = _inverse_modes[typecode]
else:
raise ValueError("Only RGB and 8-bit Greyscale 'L' PIL image modes are supported.")
- return _string_io._from_raw_string(
- offset,
- Dim(image.size[0], image.size[1]),
- pixel_type, DENSE,
- image.tobytes())
+ try:
+ return _string_io._from_raw_string(
+ offset,
+ Dim(image.size[0], image.size[1]),
+ pixel_type, DENSE,
+ image.tobytes())
+ except:
+ # for compatibility with pil 1.1.7 and earlier
+ return _string_io._from_raw_string(
+ offset,
+ Dim(image.size[0], image.size[1]),
+ pixel_type, DENSE,
+ image.tostring())
__call__ = staticmethod(__call__)
class to_pil(PluginFunction):
@@ -101,8 +110,13 @@
else:
raise ValueError("Only RGB and GREYSCALE Images are supported.")
size = (image.ncols, image.nrows)
- return PIL.frombytes(mode, size,
- _string_io._to_raw_string(image))
+ try:
+ return PIL.frombytes(mode, size,
+ _string_io._to_raw_string(image))
+ except:
+ # for compatibility with pil 1.1.7 and earlier
+ return PIL.fromstring(mode, size,
+ _string_io._to_raw_string(image))
__call__ = staticmethod(__call__)
def __doc_example1__(images):
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2015-12-01 12:35:57
|
Revision: 1439
http://sourceforge.net/p/gamera/code/1439
Author: cdalitz
Date: 2015-12-01 12:35:54 +0000 (Tue, 01 Dec 2015)
Log Message:
-----------
pacth by Daniel Stender for PIL 3.0 support
Modified Paths:
--------------
trunk/gamera/gamera/plugins/pil_io.py
Modified: trunk/gamera/gamera/plugins/pil_io.py
===================================================================
--- trunk/gamera/gamera/plugins/pil_io.py 2015-09-17 06:13:41 UTC (rev 1438)
+++ trunk/gamera/gamera/plugins/pil_io.py 2015-12-01 12:35:54 UTC (rev 1439)
@@ -80,7 +80,7 @@
offset,
Dim(image.size[0], image.size[1]),
pixel_type, DENSE,
- image.tostring())
+ image.tobytes())
__call__ = staticmethod(__call__)
class to_pil(PluginFunction):
@@ -101,7 +101,7 @@
else:
raise ValueError("Only RGB and GREYSCALE Images are supported.")
size = (image.ncols, image.nrows)
- return PIL.fromstring(mode, size,
+ return PIL.frombytes(mode, size,
_string_io._to_raw_string(image))
__call__ = staticmethod(__call__)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2015-09-17 06:13:43
|
Revision: 1438
http://sourceforge.net/p/gamera/code/1438
Author: cdalitz
Date: 2015-09-17 06:13:41 +0000 (Thu, 17 Sep 2015)
Log Message:
-----------
fix for gcc on OpenSuse not returning minor version number
Modified Paths:
--------------
trunk/gamera/setup.py
Modified: trunk/gamera/setup.py
===================================================================
--- trunk/gamera/setup.py 2015-08-17 12:24:51 UTC (rev 1437)
+++ trunk/gamera/setup.py 2015-09-17 06:13:41 UTC (rev 1438)
@@ -80,7 +80,7 @@
p = os.popen("gcc -dumpversion","r")
gccv = p.readline().strip().split(".")
p.close()
- if int(gccv[0]) >= 4 and int(gccv[1]) >= 3:
+ if int(gccv[0]) > 4 or (int(gccv[0]) == 4 and int(gccv[1]) >= 3):
has_openmp = True
f = open("gamera/__compiletime_config__.py", "w")
f.write("# automatically generated configuration at compile time\n")
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2015-08-17 12:24:52
|
Revision: 1437
http://sourceforge.net/p/gamera/code/1437
Author: cdalitz
Date: 2015-08-17 12:24:51 +0000 (Mon, 17 Aug 2015)
Log Message:
-----------
useless import of gamera.confidence no longer produces an error
Modified Paths:
--------------
trunk/gamera/gamera/confidence.py
Modified: trunk/gamera/gamera/confidence.py
===================================================================
--- trunk/gamera/gamera/confidence.py 2015-07-01 14:17:15 UTC (rev 1436)
+++ trunk/gamera/gamera/confidence.py 2015-08-17 12:24:51 UTC (rev 1437)
@@ -255,7 +255,7 @@
print num_wrong, num_wrong / float(len(graph[1])) * 100
-test()
+#test()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2015-07-01 14:17:17
|
Revision: 1436
http://sourceforge.net/p/gamera/code/1436
Author: cdalitz
Date: 2015-07-01 14:17:15 +0000 (Wed, 01 Jul 2015)
Log Message:
-----------
corrected minor doc typos
Modified Paths:
--------------
trunk/gamera/gamera/plugins/image_utilities.py
trunk/gamera/gamera/plugins/projections.py
Modified: trunk/gamera/gamera/plugins/image_utilities.py
===================================================================
--- trunk/gamera/gamera/plugins/image_utilities.py 2015-06-05 12:26:55 UTC (rev 1435)
+++ trunk/gamera/gamera/plugins/image_utilities.py 2015-07-01 14:17:15 UTC (rev 1436)
@@ -356,7 +356,7 @@
class min_max_location(PluginFunction):
"""Returns the minimum and maximum pixel value and their location
in an image. When the min/max value occurs at several locations, only the
-location that is closest to the botom right corner is returned.
+location that is closest to the bottom right corner is returned.
Only those pixels are examined that are black in the provided *mask*.
When no *mask* is given, the entire image is examined. The mask can
Modified: trunk/gamera/gamera/plugins/projections.py
===================================================================
--- trunk/gamera/gamera/plugins/projections.py 2015-06-05 12:26:55 UTC (rev 1435)
+++ trunk/gamera/gamera/plugins/projections.py 2015-07-01 14:17:15 UTC (rev 1436)
@@ -93,7 +93,7 @@
regions moved outside the original image size are simply clipped,
which restricts this method to small angles.
- .. _rotate: deformations.html#rotate
+ .. _rotate: transformation.html#rotate
"""
category = "Analysis"
self_type = ImageType([ONEBIT])
@@ -171,7 +171,7 @@
*accuracy*:
Accuracy of the returned angle.
- .. _rotate: deformations.html#rotate
+ .. _rotate: transformation.html#rotate
"""
category = "Analysis"
self_type = ImageType([ONEBIT])
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2015-06-05 12:26:57
|
Revision: 1435
http://sourceforge.net/p/gamera/code/1435
Author: cdalitz
Date: 2015-06-05 12:26:55 +0000 (Fri, 05 Jun 2015)
Log Message:
-----------
fixed linker error "multiple definition of byte_order_little_endian()"
Modified Paths:
--------------
trunk/gamera/include/utility.hpp
Modified: trunk/gamera/include/utility.hpp
===================================================================
--- trunk/gamera/include/utility.hpp 2015-06-01 12:20:04 UTC (rev 1434)
+++ trunk/gamera/include/utility.hpp 2015-06-05 12:26:55 UTC (rev 1435)
@@ -31,7 +31,7 @@
// runtime test for endianness
// (safer and less cumbersome than querying compiler macros)
- bool byte_order_little_endian() {
+ inline bool byte_order_little_endian() {
long numberone = 1;
return (*((char*)(&numberone)));
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2015-06-01 12:20:07
|
Revision: 1434
http://sourceforge.net/p/gamera/code/1434
Author: cdalitz
Date: 2015-06-01 12:20:04 +0000 (Mon, 01 Jun 2015)
Log Message:
-----------
fixed error in writing 16bit greyscale PNG images
Modified Paths:
--------------
trunk/gamera/CHANGES
trunk/gamera/include/plugins/png_support.hpp
Modified: trunk/gamera/CHANGES
===================================================================
--- trunk/gamera/CHANGES 2015-06-01 12:02:40 UTC (rev 1433)
+++ trunk/gamera/CHANGES 2015-06-01 12:20:04 UTC (rev 1434)
@@ -1,7 +1,7 @@
Changes made between Gamera File Releases
=========================================
- - fixed error in reading 16bit greyscale PNG images
+ - fixed error in reading/writing 16bit greyscale PNG images
- 16bit RGB PNG images now supported via downscaling
(fixes Debian bug #785548)
Modified: trunk/gamera/include/plugins/png_support.hpp
===================================================================
--- trunk/gamera/include/plugins/png_support.hpp 2015-06-01 12:02:40 UTC (rev 1433)
+++ trunk/gamera/include/plugins/png_support.hpp 2015-06-01 12:20:04 UTC (rev 1434)
@@ -412,15 +412,18 @@
struct PNG_saver<Grey16Pixel> {
template<class T>
void operator()(T& image, png_structp png_ptr) {
- png_bytep row = new png_byte[image.ncols() * 2];
+ //png_bytep row = new png_byte[image.ncols() * 2];
+ uint16_t* row = new uint16_t[image.ncols()];
+ if (byte_order_little_endian())
+ png_set_swap(png_ptr);
try {
typename T::row_iterator r = image.row_begin();
for (; r != image.row_end(); ++r) {
- typename T::col_iterator c = r.begin();
- unsigned short* from = (unsigned short *)row;
- for (; c != r.end(); ++c, ++from)
- *from = (unsigned short)(*c && 0xffff);
- png_write_row(png_ptr, row);
+ typename T::col_iterator c = r.begin();
+ uint16_t* from = (uint16_t*)row;
+ for (; c != r.end(); ++c, ++from)
+ *from = (uint16_t)(*c);
+ png_write_row(png_ptr, (png_bytep)row);
}
} catch (std::exception e) {
delete[] row;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2015-06-01 12:02:42
|
Revision: 1433
http://sourceforge.net/p/gamera/code/1433
Author: cdalitz
Date: 2015-06-01 12:02:40 +0000 (Mon, 01 Jun 2015)
Log Message:
-----------
fixed error in reading 16bit greyscale PNG images
Modified Paths:
--------------
trunk/gamera/CHANGES
trunk/gamera/include/pixel.hpp
trunk/gamera/include/plugins/png_support.hpp
trunk/gamera/include/plugins/tiff_support.hpp
trunk/gamera/include/utility.hpp
Modified: trunk/gamera/CHANGES
===================================================================
--- trunk/gamera/CHANGES 2015-05-20 20:01:06 UTC (rev 1432)
+++ trunk/gamera/CHANGES 2015-06-01 12:02:40 UTC (rev 1433)
@@ -1,7 +1,9 @@
Changes made between Gamera File Releases
=========================================
- - reading of 16bit RGB PNG images now produces an error message
+ - fixed error in reading 16bit greyscale PNG images
+
+ - 16bit RGB PNG images now supported via downscaling
(fixes Debian bug #785548)
- reading of tiff images more error robust
Modified: trunk/gamera/include/pixel.hpp
===================================================================
--- trunk/gamera/include/pixel.hpp 2015-05-20 20:01:06 UTC (rev 1432)
+++ trunk/gamera/include/pixel.hpp 2015-06-01 12:02:40 UTC (rev 1433)
@@ -46,6 +46,7 @@
#include "vigra/rgbvalue.hxx"
#include "vigra/colorconversions.hxx"
#include <complex>
+//#include <stdint.h>
using namespace vigra;
@@ -78,6 +79,59 @@
* The Gamera::Grey16Pixel type is for 16bit greyscale images.
*/
typedef unsigned int Grey16Pixel;
+ /*
+ // This does not work because OneBit pixel is already of this type:
+ //typedef unsigned short Grey16Pixel;
+ //typedef uint16_t Grey16Pixel;
+ */
+ /*
+ // For some reason, VIGRA does not work with user-defined pixel types:
+ struct Grey16Pixel {
+ short value;
+ Grey16Pixel(int v) {value=short(v);}
+ Grey16Pixel() {value=0;}
+ short operator=(Grey16Pixel n) {return value=n.value;}
+ short operator=(short n) {return value=n;}
+ short operator=(int n) {return value=short(n);}
+ bool operator==(Grey16Pixel n) {return value==n.value;}
+ bool operator==(short n) {return value==n;}
+ bool operator==(int n) {return value==(short)n;}
+ short operator-=(Grey16Pixel n) {return value-=n.value;}
+ short operator-=(short n) {return value-=n;}
+ short operator-=(int n) {return value-=(short)n;}
+ short operator+=(Grey16Pixel n) {return value+=n.value;}
+ short operator+=(short n) {return value+=n;}
+ short operator+=(int n) {return value+=(short)n;}
+ bool operator>(Grey16Pixel n) {return value>n.value;}
+ bool operator>(short n) {return value>n;}
+ bool operator>(int n) {return value>(short)n;}
+ bool operator>=(Grey16Pixel n) {return value>=n.value;}
+ bool operator>=(short n) {return value>=n;}
+ bool operator>=(int n) {return value>=(short)n;}
+ bool operator<(Grey16Pixel n) {return value<n.value;}
+ bool operator<(short n) {return value<n;}
+ bool operator<(int n) {return value<(short)n;}
+ bool operator<=(Grey16Pixel n) {return value<=n.value;}
+ bool operator<=(short n) {return value<=n;}
+ bool operator<=(int n) {return value<=(short)n;}
+ short operator-(short n) {return value-n;}
+ short operator+(short n) {return value+n;}
+ short operator*(short n) {return value*n;}
+ double operator*(double n) {return value*n;}
+ short operator/(short n) {return value*n;}
+ //int operator() {return value;}
+ operator short() {return value;}
+ operator short*() {return &value;}
+ operator int() {return value;}
+ operator long int() {return value;}
+ int operator++() {return value++;}
+ int operator--() {return value--;}
+ //operator&() {return &value;}
+ };
+ int operator*(double x, Grey16Pixel p) {return int(x*p.value);}
+ int operator*(int x, Grey16Pixel p) {return x*p.value;}
+ long int operator*(long int x, Grey16Pixel p) {return x*p.value;}
+ */
/**
* OneBitPixel
Modified: trunk/gamera/include/plugins/png_support.hpp
===================================================================
--- trunk/gamera/include/plugins/png_support.hpp 2015-05-20 20:01:06 UTC (rev 1432)
+++ trunk/gamera/include/plugins/png_support.hpp 2015-06-01 12:02:40 UTC (rev 1433)
@@ -1,7 +1,7 @@
/*
*
- * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom,
- * and Karl MacMillan
+ * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan
+ * 2015 Christoph Dalitz
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -28,6 +28,7 @@
#include "image_utilities.hpp"
#include <png.h>
#include <stdio.h>
+#include <stdint.h>
// TODO: Get/Save resolution information
@@ -145,6 +146,28 @@
}
template<class T>
+void load_PNG_grey16(T& image, png_structp& png_ptr) {
+ uint16_t* row = new uint16_t[image.ncols()];
+ if (byte_order_little_endian())
+ png_set_swap(png_ptr);
+ try {
+ typename T::row_iterator r = image.row_begin();
+ for (; r != image.row_end(); ++r) {
+ png_read_row(png_ptr, (png_bytep)row, NULL);
+ uint16_t* from = row;
+ typename T::col_iterator c = r.begin();
+ for (; c != r.end(); ++c, ++from) {
+ c.set((int)*from);
+ }
+ }
+ } catch (std::exception e) {
+ delete[] row;
+ throw;
+ }
+ delete[] row;
+}
+
+template<class T>
void load_PNG_onebit(T& image, png_structp& png_ptr) {
png_set_invert_mono(png_ptr);
#if PNG_LIBPNG_VER > 10399
@@ -161,10 +184,10 @@
png_bytep from = row;
typename T::col_iterator c = r.begin();
for (; c != r.end(); ++c, ++from) {
- if (*from)
- c.set(pixel_traits<OneBitPixel>::black());
- else
- c.set(pixel_traits<OneBitPixel>::white());
+ if (*from)
+ c.set(pixel_traits<OneBitPixel>::black());
+ else
+ c.set(pixel_traits<OneBitPixel>::white());
}
}
} catch (std::exception e) {
@@ -203,10 +226,16 @@
PNG_close(fp, png_ptr, info_ptr, end_info);
throw std::runtime_error("Pixel type must be OneBit to use RLE data.");
}
- if (bit_depth != 8) {
- PNG_close(fp, png_ptr, info_ptr, end_info);
- throw std::runtime_error("RGB image must have 8bits per channel.");
+ if (bit_depth > 8) {
+#if PNG_LIBPNG_VER >= 10504
+ png_set_scale_16(png_ptr);
+#else
+ png_set_strip_16(png_ptr);
+#endif
}
+ else if (bit_depth < 8) {
+ png_set_expand(png_ptr);
+ }
if (color_type == PNG_COLOR_TYPE_PALETTE)
png_set_palette_to_rgb(png_ptr);
typedef TypeIdImageFactory<RGB, DENSE> fact;
@@ -271,7 +300,7 @@
typedef TypeIdImageFactory<GREY16, DENSE> fact_type;
fact_type::image_type*
image = fact_type::create(Point(0, 0), Dim(width, height));
- load_PNG_simple(*image, png_ptr);
+ load_PNG_grey16(*image, png_ptr);
//Damon
image->resolution(reso);
//Damon: end
Modified: trunk/gamera/include/plugins/tiff_support.hpp
===================================================================
--- trunk/gamera/include/plugins/tiff_support.hpp 2015-05-20 20:01:06 UTC (rev 1432)
+++ trunk/gamera/include/plugins/tiff_support.hpp 2015-06-01 12:02:40 UTC (rev 1433)
@@ -229,13 +229,6 @@
};
- // runtime test for endianness
- // (safer and less cumbersome than querying compiler macros)
- bool byte_order_little_endian() {
- long numberone = 1;
- return (*((char*)(&numberone)));
- }
-
template<>
struct tiff_saver<OneBitPixel> {
template<class T>
Modified: trunk/gamera/include/utility.hpp
===================================================================
--- trunk/gamera/include/utility.hpp 2015-05-20 20:01:06 UTC (rev 1432)
+++ trunk/gamera/include/utility.hpp 2015-06-01 12:02:40 UTC (rev 1433)
@@ -1,6 +1,7 @@
/*
*
- * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan
+ * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan
+ * 2015 Christoph Dalitz
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -28,6 +29,13 @@
namespace Gamera {
+ // runtime test for endianness
+ // (safer and less cumbersome than querying compiler macros)
+ bool byte_order_little_endian() {
+ long numberone = 1;
+ return (*((char*)(&numberone)));
+ }
+
inline void byte_swap32(unsigned char *ptr) {
register unsigned char val;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2015-05-20 20:01:07
|
Revision: 1432
http://sourceforge.net/p/gamera/code/1432
Author: cdalitz
Date: 2015-05-20 20:01:06 +0000 (Wed, 20 May 2015)
Log Message:
-----------
possible fix for Debian bug #785548 when loading PNG 16bit RGB images
Modified Paths:
--------------
trunk/gamera/CHANGES
trunk/gamera/include/plugins/png_support.hpp
Modified: trunk/gamera/CHANGES
===================================================================
--- trunk/gamera/CHANGES 2015-05-12 07:02:28 UTC (rev 1431)
+++ trunk/gamera/CHANGES 2015-05-20 20:01:06 UTC (rev 1432)
@@ -1,6 +1,9 @@
Changes made between Gamera File Releases
=========================================
+ - reading of 16bit RGB PNG images now produces an error message
+ (fixes Debian bug #785548)
+
- reading of tiff images more error robust
(fixes Debian bug #784795)
Modified: trunk/gamera/include/plugins/png_support.hpp
===================================================================
--- trunk/gamera/include/plugins/png_support.hpp 2015-05-12 07:02:28 UTC (rev 1431)
+++ trunk/gamera/include/plugins/png_support.hpp 2015-05-20 20:01:06 UTC (rev 1432)
@@ -52,7 +52,7 @@
throw std::runtime_error("Not a PNG file");
}
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, (png_voidp)NULL,
- NULL, NULL);
+ NULL, NULL);
if (!png_ptr) {
fclose(fp);
throw std::runtime_error("Could not read PNG header");
@@ -125,7 +125,7 @@
info->m_x_resolution = x_resolution;
info->m_y_resolution = y_resolution;
if (color_type == PNG_COLOR_TYPE_PALETTE || color_type == PNG_COLOR_TYPE_RGB ||
- color_type == PNG_COLOR_TYPE_RGB_ALPHA)
+ color_type == PNG_COLOR_TYPE_RGB_ALPHA)
info->m_ncolors = 3;
else if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
info->m_ncolors = 1;
@@ -161,10 +161,10 @@
png_bytep from = row;
typename T::col_iterator c = r.begin();
for (; c != r.end(); ++c, ++from) {
- if (*from)
- c.set(pixel_traits<OneBitPixel>::black());
- else
- c.set(pixel_traits<OneBitPixel>::white());
+ if (*from)
+ c.set(pixel_traits<OneBitPixel>::black());
+ else
+ c.set(pixel_traits<OneBitPixel>::white());
}
}
} catch (std::exception e) {
@@ -203,45 +203,49 @@
PNG_close(fp, png_ptr, info_ptr, end_info);
throw std::runtime_error("Pixel type must be OneBit to use RLE data.");
}
+ if (bit_depth != 8) {
+ PNG_close(fp, png_ptr, info_ptr, end_info);
+ throw std::runtime_error("RGB image must have 8bits per channel.");
+ }
if (color_type == PNG_COLOR_TYPE_PALETTE)
png_set_palette_to_rgb(png_ptr);
typedef TypeIdImageFactory<RGB, DENSE> fact;
fact::image_type* image =
fact::create(Point(0, 0), Dim(width, height));
load_PNG_simple(*image, png_ptr);
- //Damon
- image->resolution(reso);
- //Damon: end
+ //Damon
+ image->resolution(reso);
+ //Damon: end
PNG_close(fp, png_ptr, info_ptr, end_info);
return image;
} else if (color_type == PNG_COLOR_TYPE_GRAY ||
- color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
+ color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
if (bit_depth == 1) {
if (storage == DENSE) {
- typedef TypeIdImageFactory<ONEBIT, DENSE> fact;
- fact::image_type* image =
- fact::create(Point(0, 0), Dim(width, height));
- load_PNG_onebit(*image, png_ptr);
- //Damon
- image->resolution(reso);
- //Damon: end
- PNG_close(fp, png_ptr, info_ptr, end_info);
- return image;
+ typedef TypeIdImageFactory<ONEBIT, DENSE> fact;
+ fact::image_type* image =
+ fact::create(Point(0, 0), Dim(width, height));
+ load_PNG_onebit(*image, png_ptr);
+ //Damon
+ image->resolution(reso);
+ //Damon: end
+ PNG_close(fp, png_ptr, info_ptr, end_info);
+ return image;
} else {
- typedef TypeIdImageFactory<ONEBIT, RLE> fact;
- fact::image_type* image =
- fact::create(Point(0, 0), Dim(width, height));
- load_PNG_onebit(*image, png_ptr);
- //Damon
- image->resolution(reso);
- //Damon: end
- PNG_close(fp, png_ptr, info_ptr, end_info);
- return image;
- }
+ typedef TypeIdImageFactory<ONEBIT, RLE> fact;
+ fact::image_type* image =
+ fact::create(Point(0, 0), Dim(width, height));
+ load_PNG_onebit(*image, png_ptr);
+ //Damon
+ image->resolution(reso);
+ //Damon: end
+ PNG_close(fp, png_ptr, info_ptr, end_info);
+ return image;
+ }
} else if (bit_depth <= 8) {
if (storage == RLE) {
- PNG_close(fp, png_ptr, info_ptr, end_info);
- throw std::runtime_error("Pixel type must be OneBit to use RLE data.");
+ PNG_close(fp, png_ptr, info_ptr, end_info);
+ throw std::runtime_error("Pixel type must be OneBit to use RLE data.");
}
if (bit_depth < 8) {
#if PNG_LIBPNG_VER > 10399
@@ -252,25 +256,25 @@
}
typedef TypeIdImageFactory<GREYSCALE, DENSE> fact_type;
fact_type::image_type*
- image = fact_type::create(Point(0, 0), Dim(width, height));
+ image = fact_type::create(Point(0, 0), Dim(width, height));
load_PNG_simple(*image, png_ptr);
- //Damon
- image->resolution(reso);
- //Damon: end
+ //Damon
+ image->resolution(reso);
+ //Damon: end
PNG_close(fp, png_ptr, info_ptr, end_info);
return image;
} else if (bit_depth == 16) {
if (storage == RLE) {
- PNG_close(fp, png_ptr, info_ptr, end_info);
- throw std::runtime_error("Pixel type must be OneBit to use RLE data.");
+ PNG_close(fp, png_ptr, info_ptr, end_info);
+ throw std::runtime_error("Pixel type must be OneBit to use RLE data.");
}
typedef TypeIdImageFactory<GREY16, DENSE> fact_type;
fact_type::image_type*
- image = fact_type::create(Point(0, 0), Dim(width, height));
+ image = fact_type::create(Point(0, 0), Dim(width, height));
load_PNG_simple(*image, png_ptr);
- //Damon
- image->resolution(reso);
- //Damon: end
+ //Damon
+ image->resolution(reso);
+ //Damon: end
PNG_close(fp, png_ptr, info_ptr, end_info);
return image;
}
@@ -297,15 +301,15 @@
try {
typename T::row_iterator r = image.row_begin();
for (; r != image.row_end(); ++r) {
- png_bytep from = row;
- typename T::col_iterator c = r.begin();
- for (; c != r.end(); ++c, ++from) {
- if (is_black(c.get()))
- *from = 0;
- else
- *from = 255;
- }
- png_write_row(png_ptr, row);
+ png_bytep from = row;
+ typename T::col_iterator c = r.begin();
+ for (; c != r.end(); ++c, ++from) {
+ if (is_black(c.get()))
+ *from = 0;
+ else
+ *from = 255;
+ }
+ png_write_row(png_ptr, row);
}
} catch (std::exception e) {
delete[] row;
@@ -330,12 +334,12 @@
try {
typename T::row_iterator r = image.row_begin();
for (; r != image.row_end(); ++r) {
- png_bytep from = row;
- typename T::col_iterator c = r.begin();
- for (; c != r.end(); ++c, ++from) {
- *from = (png_byte)(*c * max);
- }
- png_write_row(png_ptr, row);
+ png_bytep from = row;
+ typename T::col_iterator c = r.begin();
+ for (; c != r.end(); ++c, ++from) {
+ *from = (png_byte)(*c * max);
+ }
+ png_write_row(png_ptr, row);
}
} catch (std::exception e) {
delete[] row;
@@ -360,12 +364,12 @@
try {
typename T::row_iterator r = image.row_begin();
for (; r != image.row_end(); ++r) {
- png_bytep from = row;
- typename T::col_iterator c = r.begin();
- for (; c != r.end(); ++c, ++from) {
- *from = (png_byte)((*c).real() * max);
- }
- png_write_row(png_ptr, row);
+ png_bytep from = row;
+ typename T::col_iterator c = r.begin();
+ for (; c != r.end(); ++c, ++from) {
+ *from = (png_byte)((*c).real() * max);
+ }
+ png_write_row(png_ptr, row);
}
} catch (std::exception e) {
delete[] row;
@@ -383,11 +387,11 @@
try {
typename T::row_iterator r = image.row_begin();
for (; r != image.row_end(); ++r) {
- typename T::col_iterator c = r.begin();
- unsigned short* from = (unsigned short *)row;
- for (; c != r.end(); ++c, ++from)
- *from = (unsigned short)(*c && 0xffff);
- png_write_row(png_ptr, row);
+ typename T::col_iterator c = r.begin();
+ unsigned short* from = (unsigned short *)row;
+ for (; c != r.end(); ++c, ++from)
+ *from = (unsigned short)(*c && 0xffff);
+ png_write_row(png_ptr, row);
}
} catch (std::exception e) {
delete[] row;
@@ -414,7 +418,7 @@
png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
fclose(fp);
throw std::runtime_error("Couldn't create PNG header");
- }
+ }
if (setjmp(png_jmpbuf(png_ptr))) {
png_destroy_write_struct(&png_ptr, &info_ptr);
@@ -435,8 +439,8 @@
bit_depth = image.depth();
int color_type = (image.ncolors() == 3) ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_GRAY;
png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, color_type,
- PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
- PNG_FILTER_TYPE_DEFAULT);
+ PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
+ PNG_FILTER_TYPE_DEFAULT);
//Damon
png_uint_32 res_x = (png_uint_32)(image.resolution() / METER_PER_INCH);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <cd...@us...> - 2015-05-12 07:02:31
|
Revision: 1431
http://sourceforge.net/p/gamera/code/1431
Author: cdalitz
Date: 2015-05-12 07:02:28 +0000 (Tue, 12 May 2015)
Log Message:
-----------
fixed segfault in cc_and_cluster
Modified Paths:
--------------
trunk/gamera/include/connected_components.hpp
Modified: trunk/gamera/include/connected_components.hpp
===================================================================
--- trunk/gamera/include/connected_components.hpp 2015-05-11 12:39:26 UTC (rev 1430)
+++ trunk/gamera/include/connected_components.hpp 2015-05-12 07:02:28 UTC (rev 1431)
@@ -70,7 +70,6 @@
typedef typename T::difference_type difference_type;
// Gamera specific
typedef T data_type;
- ImageAccessor<value_type> m_accessor;
// Vigra typedefs
typedef value_type PixelType;
@@ -175,8 +174,7 @@
//
value_type get(const Point& p) const {
- //value_type tmp = *(m_const_begin + (p.y() * m_image_data->stride()) + p.x());
- value_type tmp = m_accessor(m_const_begin + (p.y() * m_image_data->stride()) + p.x());
+ value_type tmp = *(m_const_begin + (p.y() * m_image_data->stride()) + p.x());
if (tmp == m_label)
return tmp;
else
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|