diff options
Diffstat (limited to 'Source/DirectFB/src/misc')
-rwxr-xr-x | Source/DirectFB/src/misc/Makefile.am | 29 | ||||
-rwxr-xr-x | Source/DirectFB/src/misc/Makefile.in | 564 | ||||
-rwxr-xr-x | Source/DirectFB/src/misc/conf.c | 1947 | ||||
-rwxr-xr-x | Source/DirectFB/src/misc/conf.h | 287 | ||||
-rwxr-xr-x | Source/DirectFB/src/misc/dither565.h | 211 | ||||
-rwxr-xr-x | Source/DirectFB/src/misc/gfx_util.c | 964 | ||||
-rwxr-xr-x | Source/DirectFB/src/misc/gfx_util.h | 48 | ||||
-rwxr-xr-x | Source/DirectFB/src/misc/util.c | 471 | ||||
-rwxr-xr-x | Source/DirectFB/src/misc/util.h | 34 |
9 files changed, 4555 insertions, 0 deletions
diff --git a/Source/DirectFB/src/misc/Makefile.am b/Source/DirectFB/src/misc/Makefile.am new file mode 100755 index 0000000..d1e77b7 --- /dev/null +++ b/Source/DirectFB/src/misc/Makefile.am @@ -0,0 +1,29 @@ +## Makefile.am for DirectFB/src/misc + +INCLUDES = \ + -I$(top_builddir)/lib \ + -I$(top_builddir)/include \ + -I$(top_srcdir)/include \ + -I$(top_srcdir)/lib \ + -I$(top_srcdir)/src + +AM_CPPFLAGS = \ + -DMODULEDIR=\"@MODULEDIR@\" \ + -DSOPATH=\"@SOPATH@\" \ + -DSYSCONFDIR=\"@sysconfdir@\" + +internalincludedir = $(INTERNALINCLUDEDIR)/misc + +internalinclude_HEADERS = \ + conf.h \ + gfx_util.h \ + util.h + + +noinst_LTLIBRARIES = libdirectfb_misc.la + +libdirectfb_misc_la_SOURCES = \ + conf.c \ + dither565.h \ + gfx_util.c \ + util.c diff --git a/Source/DirectFB/src/misc/Makefile.in b/Source/DirectFB/src/misc/Makefile.in new file mode 100755 index 0000000..ce04ff7 --- /dev/null +++ b/Source/DirectFB/src/misc/Makefile.in @@ -0,0 +1,564 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/misc +DIST_COMMON = $(internalinclude_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/as-ac-expand.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdirectfb_misc_la_LIBADD = +am_libdirectfb_misc_la_OBJECTS = conf.lo gfx_util.lo util.lo +libdirectfb_misc_la_OBJECTS = $(am_libdirectfb_misc_la_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libdirectfb_misc_la_SOURCES) +DIST_SOURCES = $(libdirectfb_misc_la_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(internalincludedir)" +internalincludeHEADERS_INSTALL = $(INSTALL_HEADER) +HEADERS = $(internalinclude_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +ASFLAGS = @ASFLAGS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIR = @DATADIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DFB_CFLAGS_OMIT_FRAME_POINTER = @DFB_CFLAGS_OMIT_FRAME_POINTER@ +DFB_INTERNAL_CFLAGS = @DFB_INTERNAL_CFLAGS@ +DFB_LDFLAGS = @DFB_LDFLAGS@ +DFB_SMOOTH_SCALING = @DFB_SMOOTH_SCALING@ +DIRECTFB_BINARY_AGE = @DIRECTFB_BINARY_AGE@ +DIRECTFB_CSOURCE = @DIRECTFB_CSOURCE@ +DIRECTFB_INTERFACE_AGE = @DIRECTFB_INTERFACE_AGE@ +DIRECTFB_MAJOR_VERSION = @DIRECTFB_MAJOR_VERSION@ +DIRECTFB_MICRO_VERSION = @DIRECTFB_MICRO_VERSION@ +DIRECTFB_MINOR_VERSION = @DIRECTFB_MINOR_VERSION@ +DIRECTFB_VERSION = @DIRECTFB_VERSION@ +DIRECT_BUILD_DEBUG = @DIRECT_BUILD_DEBUG@ +DIRECT_BUILD_DEBUGS = @DIRECT_BUILD_DEBUGS@ +DIRECT_BUILD_GETTID = @DIRECT_BUILD_GETTID@ +DIRECT_BUILD_NETWORK = @DIRECT_BUILD_NETWORK@ +DIRECT_BUILD_STDBOOL = @DIRECT_BUILD_STDBOOL@ +DIRECT_BUILD_TEXT = @DIRECT_BUILD_TEXT@ +DIRECT_BUILD_TRACE = @DIRECT_BUILD_TRACE@ +DSYMUTIL = @DSYMUTIL@ +DYNLIB = @DYNLIB@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +FREETYPE_PROVIDER = @FREETYPE_PROVIDER@ +FUSION_BUILD_KERNEL = @FUSION_BUILD_KERNEL@ +FUSION_BUILD_MULTI = @FUSION_BUILD_MULTI@ +FUSION_MESSAGE_SIZE = @FUSION_MESSAGE_SIZE@ +GIF_PROVIDER = @GIF_PROVIDER@ +GREP = @GREP@ +HAVE_LINUX = @HAVE_LINUX@ +INCLUDEDIR = @INCLUDEDIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTERNALINCLUDEDIR = @INTERNALINCLUDEDIR@ +JPEG_PROVIDER = @JPEG_PROVIDER@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBJPEG = @LIBJPEG@ +LIBOBJS = @LIBOBJS@ +LIBPNG = @LIBPNG@ +LIBPNG_CONFIG = @LIBPNG_CONFIG@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_AGE = @LT_AGE@ +LT_BINARY = @LT_BINARY@ +LT_CURRENT = @LT_CURRENT@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MAN2HTML = @MAN2HTML@ +MKDIR_P = @MKDIR_P@ +MODULEDIR = @MODULEDIR@ +MODULEDIRNAME = @MODULEDIRNAME@ +NMEDIT = @NMEDIT@ +OBJEXT = @OBJEXT@ +OSX_LIBS = @OSX_LIBS@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PNG_PROVIDER = @PNG_PROVIDER@ +RANLIB = @RANLIB@ +RUNTIME_SYSROOT = @RUNTIME_SYSROOT@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SOPATH = @SOPATH@ +STRIP = @STRIP@ +SYSCONFDIR = @SYSCONFDIR@ +SYSFS_LIBS = @SYSFS_LIBS@ +THREADFLAGS = @THREADFLAGS@ +THREADLIB = @THREADLIB@ +TSLIB_CFLAGS = @TSLIB_CFLAGS@ +TSLIB_LIBS = @TSLIB_LIBS@ +VERSION = @VERSION@ +VNC_CFLAGS = @VNC_CFLAGS@ +VNC_CONFIG = @VNC_CONFIG@ +VNC_LIBS = @VNC_LIBS@ +X11_CFLAGS = @X11_CFLAGS@ +X11_LIBS = @X11_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +INCLUDES = \ + -I$(top_builddir)/lib \ + -I$(top_builddir)/include \ + -I$(top_srcdir)/include \ + -I$(top_srcdir)/lib \ + -I$(top_srcdir)/src + +AM_CPPFLAGS = \ + -DMODULEDIR=\"@MODULEDIR@\" \ + -DSOPATH=\"@SOPATH@\" \ + -DSYSCONFDIR=\"@sysconfdir@\" + +internalincludedir = $(INTERNALINCLUDEDIR)/misc +internalinclude_HEADERS = \ + conf.h \ + gfx_util.h \ + util.h + +noinst_LTLIBRARIES = libdirectfb_misc.la +libdirectfb_misc_la_SOURCES = \ + conf.c \ + dither565.h \ + gfx_util.c \ + util.c + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/misc/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/misc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libdirectfb_misc.la: $(libdirectfb_misc_la_OBJECTS) $(libdirectfb_misc_la_DEPENDENCIES) + $(LINK) $(libdirectfb_misc_la_OBJECTS) $(libdirectfb_misc_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfx_util.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-internalincludeHEADERS: $(internalinclude_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(internalincludedir)" || $(MKDIR_P) "$(DESTDIR)$(internalincludedir)" + @list='$(internalinclude_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(internalincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(internalincludedir)/$$f'"; \ + $(internalincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(internalincludedir)/$$f"; \ + done + +uninstall-internalincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(internalinclude_HEADERS)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(internalincludedir)/$$f'"; \ + rm -f "$(DESTDIR)$(internalincludedir)/$$f"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(internalincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-internalincludeHEADERS + +install-dvi: install-dvi-am + +install-exec-am: + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: install-ps-am + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-internalincludeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am \ + install-internalincludeHEADERS install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-internalincludeHEADERS + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Source/DirectFB/src/misc/conf.c b/Source/DirectFB/src/misc/conf.c new file mode 100755 index 0000000..5772ba9 --- /dev/null +++ b/Source/DirectFB/src/misc/conf.c @@ -0,0 +1,1947 @@ +/* + (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) + (c) Copyright 2000-2004 Convergence (integrated media) GmbH + + All rights reserved. + + Written by Denis Oliver Kropp <dok@directfb.org>, + Andreas Hundt <andi@fischlustig.de>, + Sven Neumann <neo@directfb.org>, + Ville Syrjälä <syrjala@sci.fi> and + Claudio Ciccani <klan@users.sf.net>. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <config.h> + +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include <directfb.h> +#include <directfb_util.h> + +#include <direct/conf.h> +#include <direct/log.h> +#include <direct/mem.h> +#include <direct/memcpy.h> +#include <direct/messages.h> +#include <direct/util.h> + +#include <fusion/conf.h> +#include <fusion/vector.h> + +#include <voodoo/conf.h>
+ +#include <core/coretypes.h> +#include <core/surface.h> +#include <core/layers.h> + +#include <gfx/convert.h> + +#include <misc/conf.h> + +D_DEBUG_DOMAIN( DirectFB_Config, "DirectFB/Config", "Runtime configuration options for DirectFB" ); + +DFBConfig *dfb_config = NULL; + +static const char *config_usage = + "DirectFB version " DIRECTFB_VERSION "\n" + "\n" + " --dfb-help Output DirectFB usage information and exit\n" + " --dfb:<option>[,<option>]... Pass options to DirectFB (see below)\n" + "\n" + "DirectFB options:\n" + "\n" + " system=<system> Specify the system (FBDev, SDL, etc.)\n" + " fbdev=<device> Open <device> instead of /dev/fb0\n" + " busid=<id> Specify the bus location of the graphics card (default 1:0:0)\n" + " mode=<width>x<height> Set the default resolution\n" + " scaled=<width>x<height> Scale the window to this size for 'force-windowed' apps\n" + " depth=<pixeldepth> Set the default pixel depth\n" + " pixelformat=<pixelformat> Set the default pixel format\n" + " surface-shmpool-size=<kb> Set the size of the shared memory pool used\n" + " for shared system memory surfaces.\n" + " session=<num> Select multi app world (zero based, -1 = new)\n" + " remote=<host>[:<session>] Select remote session to connect to\n" + " primary-layer=<id> Select an alternative primary layer\n" + " primary-only Tell application only about the primary layer\n" + " [no-]banner Show DirectFB Banner on startup\n" + " [no-]surface-sentinel Enable surface sentinels at the end of chunks in video memory\n" + " force-windowed Primary surface always is a window\n" + " force-desktop Primary surface is the desktop background\n" + " [no-]hardware Enable/disable hardware acceleration\n" + " [no-]software Enable/disable software fallbacks\n" + " [no-]software-warn Show warnings when doing/dropping software operations\n" + " [no-]software-trace Show every stage of the software rendering pipeline\n" + " [no-]dma Enable DMA acceleration\n" + " [no-]sync Do `sync()' (default=no)\n" +#ifdef USE_MMX + " [no-]mmx Enable mmx support\n" +#endif + " [no-]agp[=<mode>] Enable AGP support\n" + " [no-]thrifty-surface-buffers Free sysmem instance on xfer to video memory\n" + " font-format=<pixelformat> Set the preferred font format\n" + " [no-]font-premult Enable/disable premultiplied glyph images in ARGB format\n" + " [no-]deinit-check Enable deinit check at exit\n" + " block-all-signals Block all signals\n" + " [no-]vt-switch Allocate/switch to a new VT\n" + " vt-num=<num> Use given VT instead of current/new one\n" + " [no-]vt-switching Allow Ctrl+Alt+<F?> (EXPERIMENTAL)\n" + " [no-]graphics-vt Put terminal into graphics mode\n" + " [no-]vt Use VT handling code at all?\n" + " mouse-source=<device> Mouse device for serial mouse\n" + " [no-]mouse-gpm-source Enable mouse input repeated by GPM\n" + " [no-]motion-compression Mouse motion event compression\n" + " mouse-protocol=<protocol> Mouse protocol\n" + " [no-]lefty Swap left and right mouse buttons\n" + " [no-]capslock-meta Map the CapsLock key to Meta\n" + " linux-input-ir-only Ignore all non-IR Linux Input devices\n" + " [no-]linux-input-grab Grab Linux Input devices?\n" + " [no-]cursor Never create a cursor or handle it\n" + " [no-]cursor-updates Never show a cursor, but still handle it\n" + " wm=<wm> Window manager module ('default' or 'unique')\n" + " init-layer=<id> Initialize layer with ID (following layer- options apply)\n" + " layer-size=<width>x<height> Set the pixel resolution\n" + " layer-format=<pixelformat> Set the pixel format\n" + " layer-depth=<pixeldepth> Set the pixel depth\n" + " layer-buffer-mode=(auto|triple|backvideo|backsystem|frontonly|windows)\n" + " layer-bg-none Disable background clear\n" + " layer-bg-color=AARRGGBB Use background color (hex)\n" + " layer-bg-color-index=<index> Use background color index (decimal)\n" + " layer-bg-image=<filename> Use background image\n" + " layer-bg-tile=<filename> Use tiled background image\n" + " layer-src-key=AARRGGBB Enable color keying (hex)\n" + " layer-palette-<index>=AARRGGBB Set palette entry at index (hex)\n" + " layer-rotate=<degree> Set the layer rotation for double buffer mode (0,90,180,270)\n" + " [no-]smooth-upscale Enable/disable smooth upscaling per default\n" + " [no-]smooth-downscale Enable/disable smooth downscaling per default\n" + " [no-]translucent-windows Allow translucent windows\n" + " [no-]decorations Enable window decorations (if supported by wm)\n" + " [no-]startstop Issue StartDrawing/StopDrawing to driver\n" + " [no-]autoflip-window Auto flip non-flipping windowed primary surfaces\n" + " [no-]discard-repeat-events Discard repeat events (option per application)\n" + " videoram-limit=<amount> Limit amount of Video RAM in kb\n" + " agpmem-limit=<amount> Limit amount of AGP memory in kb\n" + " screenshot-dir=<directory> Dump screen content on <Print> key presses\n" + " video-phys=<hexaddress> Physical start of video memory (devmem system)\n" + " video-length=<bytes> Length of video memory (devmem system)\n" + " mmio-phys=<hexaddress> Physical start of MMIO area (devmem system)\n" + " mmio-length=<bytes> Length of MMIO area (devmem system)\n" + " accelerator=<id> Accelerator ID selecting graphics driver (devmem system)\n" + "\n" + " [no-]matrox-sgram Use Matrox SGRAM features\n" + " [no-]matrox-crtc2 Experimental Matrox CRTC2 support\n" + " matrox-tv-standard=(pal|ntsc|pal-60)\n" + " Matrox TV standard (default=pal)\n" + " matrox-cable-type=(composite|scart-rgb|scart-composite)\n" + " Matrox cable type (default=composite)\n" + " h3600-device=<device> Use this device for the H3600 TS driver\n" + " mut-device=<device> Use this device for the MuTouch driver\n" + " zytronic-device=<device> Use this device for the Zytronic driver\n" + " elo-device=<device> Use this device for the Elo driver\n" + " penmount-device=<device> Use this device for the PenMount driver\n" + " linux-input-devices=<device>[[,<device>]...]\n" + " Use these devices for the Linux Input driver\n" + " tslib-devices=<device>[[,<device>]...]\n" + " Use these devices for the tslib driver\n" + " unichrome-revision=<rev> Override unichrome hardware revision\n" + " i8xx_overlay_pipe_b Redirect videolayer to pixelpipe B\n" + " include=<config file> Include the specified file, relative to the current file\n" + " flip-notify-max-latency=<ms> Set maximum FlipNotify latency (ms from Flip til Notify)\n" + "\n" + " Window surface swapping policy:\n" + " window-surface-policy=(auto|videohigh|videolow|systemonly|videoonly)\n" + " auto: DirectFB decides depending on hardware.\n" + " videohigh: Swapping system/video with high priority.\n" + " videolow: Swapping system/video with low priority.\n" + " systemonly: Window surface is always stored in system memory.\n" + " videoonly: Window surface is always stored in video memory.\n" + "\n" + " Desktop buffer mode:\n" + " desktop-buffer-mode=(auto|triple|backvideo|backsystem|frontonly|windows)\n" + " auto: DirectFB decides depending on hardware.\n" + " triple: Triple buffering (video only).\n" + " backvideo: Front and back buffer are video only.\n" + " backsystem: Back buffer is system only.\n" + " frontonly: There is no back buffer.\n" + " windows: Special mode with window buffers directly displayed.\n" + "\n" + " Force synchronization of vertical retrace:\n" + " vsync-after: Wait for the vertical retrace after flipping.\n" + " vsync-none: disable polling for vertical retrace.\n" + "\n"; + +/**********************************************************************************************************************/ + +/* serial mouse device names */ +#define DEV_NAME "/dev/mouse" +#define DEV_NAME_GPM "/dev/gpmdata" + +/**********************************************************************************************************************/ + +DFBSurfacePixelFormat +dfb_config_parse_pixelformat( const char *format ) +{ + int i; + size_t length = strlen(format); + + for (i=0; dfb_pixelformat_names[i].format != DSPF_UNKNOWN; i++) { + if (!strcasecmp( format, dfb_pixelformat_names[i].name )) + return dfb_pixelformat_names[i].format; + } + + for (i=0; dfb_pixelformat_names[i].format != DSPF_UNKNOWN; i++) { + if (!strncasecmp( format, dfb_pixelformat_names[i].name, length )) + return dfb_pixelformat_names[i].format; + } + + return DSPF_UNKNOWN; +} + +/**********************************************************************************************************************/ + +static void +print_config_usage( void ) +{ + fprintf( stderr, "%s%s%s", config_usage, fusion_config_usage, direct_config_usage ); +} + +static DFBResult +parse_args( const char *args ) +{ + char *buf = alloca( strlen(args) + 1 ); + + strcpy( buf, args ); + + while (buf && buf[0]) { + DFBResult ret; + char *value; + char *next; + + if ((next = strchr( buf, ',' )) != NULL) + *next++ = '\0'; + + if (strcmp (buf, "help") == 0) { + print_config_usage(); + exit(1); + } + + if (strcmp (buf, "memcpy=help") == 0) { + direct_print_memcpy_routines(); + exit(1); + } + + if ((value = strchr( buf, '=' )) != NULL) + *value++ = '\0'; + + ret = dfb_config_set( buf, value ); + switch (ret) { + case DFB_OK: + break; + case DFB_UNSUPPORTED: + D_ERROR( "DirectFB/Config: Unknown option '%s'!\n", buf ); + break; + default: + return ret; + } + + buf = next; + } + + return DFB_OK; +} + +static void config_values_parse( FusionVector *vector, const char *arg ) +{ + char *values = D_STRDUP( arg ); + char *s = values; + char *r, *p = NULL; + + if (!values) { + D_OOM(); + return; + } + + while ((r = strtok_r( s, ",", &p ))) { + direct_trim( &r ); + + r = D_STRDUP( r ); + if (!r) + D_OOM(); + else + fusion_vector_add( vector, r ); + + s = NULL; + } + + D_FREE( values ); +} + +static void config_values_free( FusionVector *vector ) +{ + char *value; + int i; + + fusion_vector_foreach (value, i, *vector) + D_FREE( value ); + + fusion_vector_destroy( vector ); + fusion_vector_init( vector, 2, NULL ); +} + +static int config_read_cmdline( char *cmdbuf, int size, FILE *f ) +{ + int ret = 0; + int len = 0; + + ret = fread( cmdbuf, 1, 1, f ); + + /* empty dividing 0 */ + if( ret==1 && *cmdbuf==0 ) { + ret = fread( cmdbuf, 1, 1, f ); + } + + while(ret==1 && len<(size-1)) { + len++; + ret = fread( ++cmdbuf, 1, 1, f ); + if( *cmdbuf == 0 ) + break; + } + + if( len ) { + cmdbuf[len]=0; + } + + return len != 0; +} + +/* + * The following function isn't used because the configuration should + * only go away if the application is completely terminated. In that case + * the memory is freed anyway. + */ + +#if 0 +static void config_cleanup( void ) +{ + if (!dfb_config) { + D_BUG("config_cleanup() called with no config allocated!"); + return; + } + + if (dfb_config->fb_device) + D_FREE( dfb_config->fb_device ); + + if (dfb_config->layer_bg_filename) + D_FREE( dfb_config->layer_bg_filename ); + + D_FREE( dfb_config ); + dfb_config = NULL; +} +#endif + +/* + * allocates config and fills it with defaults + */ +static void config_allocate( void ) +{ + int i; + + if (dfb_config) + return; + + dfb_config = (DFBConfig*) calloc( 1, sizeof(DFBConfig) ); + + for (i=0; i<D_ARRAY_SIZE(dfb_config->layers); i++) { + dfb_config->layers[i].src_key_index = -1; + + dfb_config->layers[i].background.color.a = 0; + dfb_config->layers[i].background.color.r = 0; + dfb_config->layers[i].background.color.g = 0; + dfb_config->layers[i].background.color.b = 0; + dfb_config->layers[i].background.color_index = -1; + dfb_config->layers[i].background.mode = DLBM_COLOR; + } + + dfb_config->layers[0].init = true; + dfb_config->layers[0].background.color.a = 0xff; + dfb_config->layers[0].background.color.r = 0xc0; + dfb_config->layers[0].background.color.g = 0xb0; + dfb_config->layers[0].background.color.b = 0x90; + dfb_config->layers[0].stacking = (1 << DWSC_UPPER) | + (1 << DWSC_MIDDLE) | + (1 << DWSC_LOWER); + + + dfb_config->pci.bus = 1; + dfb_config->pci.dev = 0; + dfb_config->pci.func = 0; + + dfb_config->banner = true; + dfb_config->deinit_check = true; + dfb_config->mmx = true; + dfb_config->vt = true; + dfb_config->vt_switch = true; + dfb_config->vt_num = -1; + dfb_config->vt_switching = true; + dfb_config->kd_graphics = true; + dfb_config->translucent_windows = true; + dfb_config->font_premult = true; + dfb_config->mouse_motion_compression = false; + dfb_config->mouse_gpm_source = false; + dfb_config->mouse_source = D_STRDUP( DEV_NAME ); + dfb_config->linux_input_grab = false; + dfb_config->window_policy = -1; + dfb_config->buffer_mode = -1; + dfb_config->wm = D_STRDUP( "default" ); + dfb_config->decorations = true; + dfb_config->unichrome_revision = -1; + dfb_config->dma = false; + dfb_config->agp = 0; + dfb_config->matrox_tv_std = DSETV_PAL; + dfb_config->i8xx_overlay_pipe_b = false; + dfb_config->surface_shmpool_size = 64 * 1024 * 1024; + dfb_config->keep_accumulators = 1024; + dfb_config->font_format = DSPF_A8; + dfb_config->flip_notify_max_latency = 0; + + /* default to fbdev */ + dfb_config->system = D_STRDUP( "FBDev" ); + + /* default to no-vt-switch if we don't have root privileges */ + if (geteuid()) + dfb_config->vt_switch = false; + + fusion_vector_init( &dfb_config->linux_input_devices, 2, NULL ); + fusion_vector_init( &dfb_config->tslib_devices, 2, NULL ); +} + +const char *dfb_config_usage( void ) +{ + return config_usage; +} + +DFBResult dfb_config_set( const char *name, const char *value ) +{ + if (strcmp (name, "system" ) == 0) { + if (value) { + if (dfb_config->system) + D_FREE( dfb_config->system ); + dfb_config->system = D_STRDUP( value ); + } + else { + D_ERROR("DirectFB/Config 'system': No system specified!\n"); + return DFB_INVARG; + } + } else + if (strcmp (name, "wm" ) == 0) { + if (value) { + if (dfb_config->wm) + D_FREE( dfb_config->wm ); + dfb_config->wm = D_STRDUP( value ); + } + else { + D_ERROR("DirectFB/Config 'wm': No window manager specified!\n"); + return DFB_INVARG; + } + } else + if (strcmp (name, "fbdev" ) == 0) { + if (value) { + if (dfb_config->fb_device) + D_FREE( dfb_config->fb_device ); + dfb_config->fb_device = D_STRDUP( value ); + } + else { + D_ERROR("DirectFB/Config 'fbdev': No device name specified!\n"); + return DFB_INVARG; + } + } else + if (strcmp (name, "busid") == 0 || strcmp (name, "pci-id") == 0) { + if (value) { + int bus, dev, func; + + if (sscanf( value, "%d:%d:%d", &bus, &dev, &func ) != 3) { + D_ERROR( "DirectFB/Config 'busid': Could not parse busid!\n"); + return DFB_INVARG; + } + + dfb_config->pci.bus = bus; + dfb_config->pci.dev = dev; + dfb_config->pci.func = func; + } + } else + if (strcmp (name, "screenshot-dir" ) == 0) { + if (value) { + if (dfb_config->screenshot_dir) + D_FREE( dfb_config->screenshot_dir ); + dfb_config->screenshot_dir = D_STRDUP( value ); + } + else { + D_ERROR("DirectFB/Config 'screenshot-dir': No directory name specified!\n"); + return DFB_INVARG; + } + } else + if (strcmp (name, "scaled" ) == 0) { + if (value) { + int width, height; + + if (sscanf( value, "%dx%d", &width, &height ) < 2) { + D_ERROR("DirectFB/Config 'scaled': Could not parse size!\n"); + return DFB_INVARG; + } + + dfb_config->scaled.width = width; + dfb_config->scaled.height = height; + } + else { + D_ERROR("DirectFB/Config 'scaled': No size specified!\n"); + return DFB_INVARG; + } + } else + if (strcmp (name, "primary-layer" ) == 0) { + if (value) { + int id; + + if (sscanf( value, "%d", &id ) < 1) { + D_ERROR("DirectFB/Config 'primary-layer': Could not parse id!\n"); + return DFB_INVARG; + } + + dfb_config->primary_layer = id; + } + else { + D_ERROR("DirectFB/Config 'primary-layer': No id specified!\n"); + return DFB_INVARG; + } + } else + if (strcmp (name, "primary-only" ) == 0) { + dfb_config->primary_only = true; + } else + if (strcmp (name, "font-format" ) == 0) { + if (value) { + DFBSurfacePixelFormat format; + + format = dfb_config_parse_pixelformat( value ); + if (format == DSPF_UNKNOWN) { + D_ERROR("DirectFB/Config 'font-format': Could not parse format!\n"); + return DFB_INVARG; + } + + dfb_config->font_format = format; + } + else { + D_ERROR("DirectFB/Config 'font-format': No format specified!\n"); + return DFB_INVARG; + } + } else + if (strcmp (name, "font-premult" ) == 0) { + dfb_config->font_premult = true; + } else + if (strcmp (name, "no-font-premult" ) == 0) { + dfb_config->font_premult = false; + } else + if (!strcmp( name, "surface-shmpool-size" )) { + if (value) { + int size_kb; + + if (sscanf( value, "%d", &size_kb ) < 1) { + D_ERROR( "DirectFB/Config '%s': Could not parse value!\n", name); + return DFB_INVARG; + } + + dfb_config->surface_shmpool_size = size_kb * 1024; + } + else { + D_ERROR( "DirectFB/Config '%s': No value specified!\n", name ); + return DFB_INVARG; + } + } else + if (strcmp (name, "session" ) == 0) { + if (value) { + int session; + + if (sscanf( value, "%d", &session ) < 1) { + D_ERROR("DirectFB/Config 'session': Could not parse value!\n"); + return DFB_INVARG; + } + + dfb_config->session = session; + } + else { + D_ERROR("DirectFB/Config 'session': No value specified!\n"); + return DFB_INVARG; + } + } else + if (strcmp (name, "remote" ) == 0) { + if (value) { + char *colon; + + colon = strchr( value, ':' ); + if (colon) { + int len = (long) colon - (long) value; + int port = 0; + + if (direct_sscanf( colon + 1, "%d", &port ) < 1) { + D_ERROR("DirectFB/Config 'remote': " + "Could not parse value (format is <host>[:<port>])!\n"); + return DFB_INVARG; + } + + if (dfb_config->remote.host) + D_FREE( dfb_config->remote.host ); + + dfb_config->remote.host = D_MALLOC( len+1 ); + dfb_config->remote.session = port; + + direct_snputs( dfb_config->remote.host, value, len+1 ); + } + else { + if (dfb_config->remote.host) + D_FREE( dfb_config->remote.host ); + + dfb_config->remote.host = D_STRDUP( value ); + dfb_config->remote.session = 0; + } + } + else { + if (dfb_config->remote.host) + D_FREE( dfb_config->remote.host ); + + dfb_config->remote.host = D_STRDUP( "" ); + dfb_config->remote.session = 0; + } + } else + if (strcmp (name, "videoram-limit" ) == 0) { + if (value) { + int limit; + + if (sscanf( value, "%d", &limit ) < 1) { + D_ERROR("DirectFB/Config 'videoram-limit': Could not parse value!\n"); + return DFB_INVARG; + } + + if (limit < 0) + limit = 0; + + dfb_config->videoram_limit = limit << 10; + } + else { + D_ERROR("DirectFB/Config 'videoram-limit': No value specified!\n"); + return DFB_INVARG; + } + } else + if (strcmp (name, "keep-accumulators" ) == 0) { + if (value) { + int limit; + + if (sscanf( value, "%d", &limit ) < 1) { + D_ERROR("DirectFB/Config '%s': Could not parse value!\n", name); + return DFB_INVARG; + } + + dfb_config->keep_accumulators = limit; + } + else { + D_ERROR("DirectFB/Config '%s': No value specified!\n", name); + return DFB_INVARG; + } + } else + if (strcmp (name, "banner" ) == 0) { + dfb_config->banner = true; + } else + if (strcmp (name, "no-banner" ) == 0) { + dfb_config->banner = false; + } else + if (strcmp (name, "surface-sentinel" ) == 0) { + dfb_config->surface_sentinel = true; + } else + if (strcmp (name, "no-surface-sentinel" ) == 0) { + dfb_config->surface_sentinel = false; + } else + if (strcmp (name, "force-windowed" ) == 0) { + dfb_config->force_windowed = true; + } else + if (strcmp (name, "force-desktop" ) == 0) { + dfb_config->force_desktop = true; + } else + if (strcmp (name, "hardware" ) == 0) { + dfb_config->software_only = false; + } else + if (strcmp (name, "no-hardware" ) == 0) { + dfb_config->software_only = true; + } else + if (strcmp (name, "software" ) == 0) { + dfb_config->hardware_only = false; + } else + if (strcmp (name, "no-software" ) == 0) { + dfb_config->hardware_only = true; + } else + if (strcmp (name, "software-warn" ) == 0) { + dfb_config->software_warn = true; + } else + if (strcmp (name, "no-software-warn" ) == 0) { + dfb_config->software_warn = false; + } else + if (strcmp (name, "software-trace" ) == 0) { + dfb_config->software_trace = true; + } else + if (strcmp (name, "no-software-trace" ) == 0) { + dfb_config->software_trace = false; + } else + if (strcmp (name, "warn" ) == 0 || strcmp (name, "no-warn" ) == 0) { + /* Enable/disable all at once by default. */ + DFBConfigWarnFlags flags = DMT_ALL; + + /* Find out the specific message type being configured. */ + if (value) { + char *opt = strchr( value, ':' ); + + if (opt) + opt++; + + if (!strncmp( value, "create-surface", 14 )) { + flags = DCWF_CREATE_SURFACE; + + if (opt) + sscanf( opt, "%dx%d", + &dfb_config->warn.create_surface.min_size.w, + &dfb_config->warn.create_surface.min_size.h ); + } else + if (!strncmp( value, "create-window", 13 )) { + flags = DCWF_CREATE_WINDOW; + } else + if (!strncmp( value, "allocate-buffer", 15 )) { + flags = DCWF_ALLOCATE_BUFFER; + + if (opt) + sscanf( opt, "%dx%d", + &dfb_config->warn.allocate_buffer.min_size.w, + &dfb_config->warn.allocate_buffer.min_size.h ); + } + else { + D_ERROR( "DirectFB/Config '%s': Unknown warning type '%s'!\n", name, value ); + return DFB_INVARG; + } + } + + /* Set/clear the corresponding flag in the configuration. */ + if (name[0] == 'w') + dfb_config->warn.flags |= flags; + else + dfb_config->warn.flags &= ~flags; + } else + if (strcmp (name, "dma" ) == 0) { + dfb_config->dma = true; + } else + if (strcmp (name, "no-dma" ) == 0) { + dfb_config->dma = false; + } else + if (strcmp (name, "mmx" ) == 0) { + dfb_config->mmx = true; + } else + if (strcmp (name, "no-mmx" ) == 0) { + dfb_config->mmx = false; + } else + if (strcmp (name, "agp" ) == 0) { + if (value) { + int mode; + + if (sscanf( value, "%d", &mode ) < 1 || mode < 0 || mode > 8) { + D_ERROR( "DirectFB/Config 'agp': " + "invalid agp mode '%s'!\n", value ); + return DFB_INVARG; + } + + dfb_config->agp = mode; + } + else { + dfb_config->agp = 8; /* maximum possible */ + } + } else + if (strcmp (name, "thrifty-surface-buffers" ) == 0) { + dfb_config->thrifty_surface_buffers = true; + } else + if (strcmp (name, "no-thrifty-surface-buffers" ) == 0) { + dfb_config->thrifty_surface_buffers = false; + } else + if (strcmp (name, "no-agp" ) == 0) { + dfb_config->agp = 0; + } else + if (strcmp (name, "agpmem-limit" ) == 0) { + if (value) { + int limit; + + if (sscanf( value, "%d", &limit ) < 1) { + D_ERROR( "DirectFB/Config 'agpmem-limit': " + "Could not parse value!\n" ); + return DFB_INVARG; + } + + if (limit < 0) + limit = 0; + + dfb_config->agpmem_limit = limit << 10; + } + else { + D_ERROR("DirectFB/Config 'agpmem-limit': No value specified!\n"); + return DFB_INVARG; + } + } else + if (strcmp (name, "vt" ) == 0) { + dfb_config->vt = true; + } else + if (strcmp (name, "no-vt" ) == 0) { + dfb_config->vt = false; + } else + if (strcmp (name, "block-all-signals" ) == 0) { + dfb_config->block_all_signals = true; + } else + if (strcmp (name, "deinit-check" ) == 0) { + dfb_config->deinit_check = true; + } else + if (strcmp (name, "no-deinit-check" ) == 0) { + dfb_config->deinit_check = false; + } else + if (strcmp (name, "cursor" ) == 0) { + dfb_config->no_cursor = false; + } else + if (strcmp (name, "no-cursor" ) == 0) { + dfb_config->no_cursor = true; + } else + if (strcmp (name, "cursor-updates" ) == 0) { + dfb_config->no_cursor_updates = false; + } else + if (strcmp (name, "no-cursor-updates" ) == 0) { + dfb_config->no_cursor_updates = true; + } else + if (strcmp (name, "linux-input-ir-only" ) == 0) { + dfb_config->linux_input_ir_only = true; + } else + if (strcmp (name, "linux-input-grab" ) == 0) { + dfb_config->linux_input_grab = true; + } else + if (strcmp (name, "no-linux-input-grab" ) == 0) { + dfb_config->linux_input_grab = false; + } else + if (strcmp (name, "motion-compression" ) == 0) { + dfb_config->mouse_motion_compression = true; + } else + if (strcmp (name, "no-motion-compression" ) == 0) { + dfb_config->mouse_motion_compression = false; + } else + if (strcmp (name, "mouse-protocol" ) == 0) { + if (value) { + dfb_config->mouse_protocol = D_STRDUP( value ); + } + else { + D_ERROR( "DirectFB/Config: No mouse protocol specified!\n" ); + return DFB_INVARG; + } + } else + if (strcmp (name, "mouse-source" ) == 0) { + if (value) { + D_FREE( dfb_config->mouse_source ); + dfb_config->mouse_source = D_STRDUP( value ); + } + else { + D_ERROR( "DirectFB/Config: No mouse source specified!\n" ); + return DFB_INVARG; + } + } else + if (strcmp (name, "mouse-gpm-source" ) == 0) { + dfb_config->mouse_gpm_source = true; + D_FREE( dfb_config->mouse_source ); + dfb_config->mouse_source = D_STRDUP( DEV_NAME_GPM ); + } else + if (strcmp (name, "no-mouse-gpm-source" ) == 0) { + dfb_config->mouse_gpm_source = false; + D_FREE( dfb_config->mouse_source ); + dfb_config->mouse_source = D_STRDUP( DEV_NAME ); + } else + if (strcmp (name, "smooth-upscale" ) == 0) { + dfb_config->render_options |= DSRO_SMOOTH_UPSCALE; + } else + if (strcmp (name, "no-smooth-upscale" ) == 0) { + dfb_config->render_options &= ~DSRO_SMOOTH_UPSCALE; + } else + if (strcmp (name, "smooth-downscale" ) == 0) { + dfb_config->render_options |= DSRO_SMOOTH_DOWNSCALE; + } else + if (strcmp (name, "no-smooth-downscale" ) == 0) { + dfb_config->render_options &= ~DSRO_SMOOTH_DOWNSCALE; + } else + if (strcmp (name, "translucent-windows" ) == 0) { + dfb_config->translucent_windows = true; + } else + if (strcmp (name, "no-translucent-windows" ) == 0) { + dfb_config->translucent_windows = false; + } else + if (strcmp (name, "decorations" ) == 0) { + dfb_config->decorations = true; + } else + if (strcmp (name, "no-decorations" ) == 0) { + dfb_config->decorations = false; + } else + if (strcmp (name, "startstop" ) == 0) { + dfb_config->startstop = true; + } else + if (strcmp (name, "no-startstop" ) == 0) { + dfb_config->startstop = false; + } else + if (strcmp (name, "autoflip-window" ) == 0) { + dfb_config->autoflip_window = true; + } else + if (strcmp (name, "no-autoflip-window" ) == 0) { + dfb_config->autoflip_window = false; + } else + if (strcmp (name, "discard-repeat-events" ) == 0) { + dfb_config->discard_repeat_events = true; + } else + if (strcmp (name, "no-discard-repeat-events" ) == 0) { + dfb_config->discard_repeat_events = false; + } else + if (strcmp (name, "vsync-none" ) == 0) { + dfb_config->pollvsync_none = true; + } else + if (strcmp (name, "vsync-after" ) == 0) { + dfb_config->pollvsync_after = true; + } else + if (strcmp (name, "vt-switch" ) == 0) { + dfb_config->vt_switch = true; + } else + if (strcmp (name, "no-vt-switch" ) == 0) { + dfb_config->vt_switch = false; + } else + if (strcmp (name, "vt-num" ) == 0) { + if (value) { + int vt_num; + + if (sscanf( value, "%d", &vt_num ) < 1) { + D_ERROR("DirectFB/Config 'vt-num': Could not parse value!\n"); + return DFB_INVARG; + } + + dfb_config->vt_num = vt_num; + } + else { + D_ERROR("DirectFB/Config 'vt-num': No value specified!\n"); + return DFB_INVARG; + } + } else + if (strcmp (name, "vt-switching" ) == 0) { + dfb_config->vt_switching = true; + } else + if (strcmp (name, "no-vt-switching" ) == 0) { + dfb_config->vt_switching = false; + } else + if (strcmp (name, "graphics-vt" ) == 0) { + dfb_config->kd_graphics = true; + } else + if (strcmp (name, "no-graphics-vt" ) == 0) { + dfb_config->kd_graphics = false; + } else + if (strcmp (name, "window-surface-policy" ) == 0) { + if (value) { + if (strcmp( value, "auto" ) == 0) { + dfb_config->window_policy = -1; + } else + if (strcmp( value, "videohigh" ) == 0) { + dfb_config->window_policy = CSP_VIDEOHIGH; + } else + if (strcmp( value, "videolow" ) == 0) { + dfb_config->window_policy = CSP_VIDEOLOW; + } else + if (strcmp( value, "systemonly" ) == 0) { + dfb_config->window_policy = CSP_SYSTEMONLY; + } else + if (strcmp( value, "videoonly" ) == 0) { + dfb_config->window_policy = CSP_VIDEOONLY; + } + else { + D_ERROR( "DirectFB/Config: " + "Unknown window surface policy `%s'!\n", value ); + return DFB_INVARG; + } + } + else { + D_ERROR( "DirectFB/Config: " + "No window surface policy specified!\n" ); + return DFB_INVARG; + } + } else + if (strcmp (name, "init-layer" ) == 0) { + if (value) { + int id; + + if (sscanf( value, "%d", &id ) < 1) { + D_ERROR("DirectFB/Config '%s': Could not parse id!\n", name); + return DFB_INVARG; + } + + if (id < 0 || id > D_ARRAY_SIZE(dfb_config->layers)) { + D_ERROR("DirectFB/Config '%s': ID %d out of bounds!\n", name, id); + return DFB_INVARG; + } + + dfb_config->layers[id].init = true; + + dfb_config->config_layer = &dfb_config->layers[id]; + } + else { + D_ERROR("DirectFB/Config '%s': No id specified!\n", name); + return DFB_INVARG; + } + } else + if (strcmp (name, "no-init-layer" ) == 0) { + if (value) { + int id; + + if (sscanf( value, "%d", &id ) < 1) { + D_ERROR("DirectFB/Config '%s': Could not parse id!\n", name); + return DFB_INVARG; + } + + if (id < 0 || id > D_ARRAY_SIZE(dfb_config->layers)) { + D_ERROR("DirectFB/Config '%s': ID %d out of bounds!\n", name, id); + return DFB_INVARG; + } + + dfb_config->layers[id].init = false; + + dfb_config->config_layer = &dfb_config->layers[id]; + } + else + dfb_config->layers[0].init = false; + } else + if (strcmp (name, "mode" ) == 0 || strcmp (name, "layer-size" ) == 0) { + DFBConfigLayer *conf = dfb_config->config_layer; + + if (value) { + int width, height; + + if (sscanf( value, "%dx%d", &width, &height ) < 2) { + D_ERROR("DirectFB/Config '%s': Could not parse width and height!\n", name); + return DFB_INVARG; + } + + if (conf == &dfb_config->layers[0]) { + dfb_config->mode.width = width; + dfb_config->mode.height = height; + } + + conf->config.width = width; + conf->config.height = height; + + conf->config.flags |= DLCONF_WIDTH | DLCONF_HEIGHT; + } + else { + D_ERROR("DirectFB/Config '%s': No width and height specified!\n", name); + return DFB_INVARG; + } + } else + if (strcmp (name, "depth" ) == 0 || strcmp (name, "layer-depth" ) == 0) { + DFBConfigLayer *conf = dfb_config->config_layer; + + if (value) { + int depth; + + if (sscanf( value, "%d", &depth ) < 1) { + D_ERROR("DirectFB/Config '%s': Could not parse value!\n", name); + return DFB_INVARG; + } + + if (conf == &dfb_config->layers[0]) { + dfb_config->mode.depth = depth; + } + + conf->config.pixelformat = dfb_pixelformat_for_depth( depth ); + conf->config.flags |= DLCONF_PIXELFORMAT; + } + else { + D_ERROR("DirectFB/Config '%s': No value specified!\n", name); + return DFB_INVARG; + } + } else + if (strcmp (name, "pixelformat" ) == 0 || strcmp (name, "layer-format" ) == 0) { + DFBConfigLayer *conf = dfb_config->config_layer; + + if (value) { + DFBSurfacePixelFormat format; + + format = dfb_config_parse_pixelformat( value ); + if (format == DSPF_UNKNOWN) { + D_ERROR("DirectFB/Config '%s': Could not parse format!\n", name); + return DFB_INVARG; + } + + if (conf == &dfb_config->layers[0]) + dfb_config->mode.format = format; + + conf->config.pixelformat = format; + conf->config.flags |= DLCONF_PIXELFORMAT; + } + else { + D_ERROR("DirectFB/Config '%s': No format specified!\n", name); + return DFB_INVARG; + } + } else + if (strcmp (name, "desktop-buffer-mode" ) == 0 || strcmp (name, "layer-buffer-mode" ) == 0) { + DFBConfigLayer *conf = dfb_config->config_layer; + + if (value) { + if (strcmp( value, "auto" ) == 0) { + conf->config.flags &= ~DLCONF_BUFFERMODE; + } else + if (strcmp( value, "triple" ) == 0) { + conf->config.buffermode = DLBM_TRIPLE; + conf->config.flags |= DLCONF_BUFFERMODE; + } else + if (strcmp( value, "backvideo" ) == 0) { + conf->config.buffermode = DLBM_BACKVIDEO; + conf->config.flags |= DLCONF_BUFFERMODE; + } else + if (strcmp( value, "backsystem" ) == 0) { + conf->config.buffermode = DLBM_BACKSYSTEM; + conf->config.flags |= DLCONF_BUFFERMODE; + } else + if (strcmp( value, "frontonly" ) == 0) { + conf->config.buffermode = DLBM_FRONTONLY; + conf->config.flags |= DLCONF_BUFFERMODE; + } else + if (strcmp( value, "windows" ) == 0) { + conf->config.buffermode = DLBM_WINDOWS; + conf->config.flags |= DLCONF_BUFFERMODE; + } else { + D_ERROR( "DirectFB/Config '%s': Unknown mode '%s'!\n", name, value ); + return DFB_INVARG; + } + } + else { + D_ERROR( "DirectFB/Config '%s': No buffer mode specified!\n", name ); + return DFB_INVARG; + } + } else + if (strcmp (name, "layer-src-key" ) == 0) { + DFBConfigLayer *conf = dfb_config->config_layer; + + if (value) { + char *error; + u32 argb; + + argb = strtoul( value, &error, 16 ); + + if (*error) { + D_ERROR( "DirectFB/Config '%s': Error in color '%s'!\n", name, error ); + return DFB_INVARG; + } + + conf->src_key.b = argb & 0xFF; + argb >>= 8; + conf->src_key.g = argb & 0xFF; + argb >>= 8; + conf->src_key.r = argb & 0xFF; + argb >>= 8; + conf->src_key.a = argb & 0xFF; + + conf->config.options |= DLOP_SRC_COLORKEY; + conf->config.flags |= DLCONF_OPTIONS; + } + else { + D_ERROR( "DirectFB/Config '%s': No color specified!\n", name ); + return DFB_INVARG; + } + } else + if (strcmp (name, "layer-src-key-index" ) == 0) { + DFBConfigLayer *conf = dfb_config->config_layer; + + if (value) { + char *error; + u32 index; + + index = strtoul( value, &error, 10 ); + + if (*error) { + D_ERROR( "DirectFB/Config '%s': Error in index '%s'!\n", name, error ); + return DFB_INVARG; + } + + conf->src_key_index = index; + conf->config.options |= DLOP_SRC_COLORKEY; + conf->config.flags |= DLCONF_OPTIONS; + } + else { + D_ERROR( "DirectFB/Config '%s': No index specified!\n", name ); + return DFB_INVARG; + } + } else + if (strcmp (name, "bg-none" ) == 0 || strcmp (name, "layer-bg-none" ) == 0) { + DFBConfigLayer *conf = dfb_config->config_layer; + + conf->background.mode = DLBM_DONTCARE; + } else + if (strcmp (name, "bg-image" ) == 0 || strcmp (name, "bg-tile" ) == 0 || + strcmp (name, "layer-bg-image" ) == 0 || strcmp (name, "layer-bg-tile" ) == 0) + { + DFBConfigLayer *conf = dfb_config->config_layer; + + if (value) { + if (conf->background.filename) + D_FREE( conf->background.filename ); + + conf->background.filename = D_STRDUP( value ); + conf->background.mode = strcmp (name, "bg-tile" ) ? DLBM_IMAGE : DLBM_TILE; + } + else { + D_ERROR( "DirectFB/Config '%s': No filename specified!\n", name ); + return DFB_INVARG; + } + } else + if (strcmp (name, "bg-color" ) == 0 || strcmp (name, "layer-bg-color" ) == 0) { + DFBConfigLayer *conf = dfb_config->config_layer; + + if (value) { + char *error; + u32 argb; + + argb = strtoul( value, &error, 16 ); + + if (*error) { + D_ERROR( "DirectFB/Config '%s': Error in color '%s'!\n", name, error ); + return DFB_INVARG; + } + + conf->background.color.b = argb & 0xFF; + argb >>= 8; + conf->background.color.g = argb & 0xFF; + argb >>= 8; + conf->background.color.r = argb & 0xFF; + argb >>= 8; + conf->background.color.a = argb & 0xFF; + + conf->background.color_index = -1; + conf->background.mode = DLBM_COLOR; + } + else { + D_ERROR( "DirectFB/Config '%s': No color specified!\n", name ); + return DFB_INVARG; + } + } else + if (strcmp (name, "layer-bg-color-index" ) == 0) { + DFBConfigLayer *conf = dfb_config->config_layer; + + if (value) { + char *error; + u32 index; + + index = strtoul( value, &error, 10 ); + + if (*error) { + D_ERROR( "DirectFB/Config '%s': Error in index '%s'!\n", name, error ); + return DFB_INVARG; + } + + conf->background.color_index = index; + conf->background.mode = DLBM_COLOR; + } + else { + D_ERROR( "DirectFB/Config '%s': No index specified!\n", name ); + return DFB_INVARG; + } + } else + if (strcmp (name, "layer-stacking" ) == 0) { + DFBConfigLayer *conf = dfb_config->config_layer; + + if (value) { + char *stackings = D_STRDUP( value ); + char *p = NULL, *r, *s = stackings; + + conf->stacking = 0; + + while ((r = strtok_r( s, ",", &p ))) { + direct_trim( &r ); + + if (!strcmp( r, "lower" )) + conf->stacking |= (1 << DWSC_LOWER); + else if (!strcmp( r, "middle" )) + conf->stacking |= (1 << DWSC_MIDDLE); + else if (!strcmp( r, "upper" )) + conf->stacking |= (1 << DWSC_UPPER); + else { + D_ERROR( "DirectFB/Config '%s': Unknown class '%s'!\n", name, r ); + D_FREE( stackings ); + return DFB_INVARG; + } + + s = NULL; + } + + D_FREE( stackings ); + } + else { + D_ERROR( "DirectFB/Config '%s': Missing value!\n", name ); + return DFB_INVARG; + } + } else + if (strncmp (name, "layer-palette-", 14 ) == 0) { + int index; + char *error; + DFBConfigLayer *conf = dfb_config->config_layer; + + index = strtoul( name + 14, &error, 10 ); + + if (*error) { + D_ERROR( "DirectFB/Config '%s': Error in index '%s'!\n", name, error ); + return DFB_INVARG; + } + + if (index < 0 || index > 255) { + D_ERROR("DirectFB/Config '%s': Index %d out of bounds!\n", name, index); + return DFB_INVARG; + } + + if (value) { + char *error; + u32 argb; + + argb = strtoul( value, &error, 16 ); + + if (*error) { + D_ERROR( "DirectFB/Config '%s': Error in color '%s'!\n", name, error ); + return DFB_INVARG; + } + + if (!conf->palette) { + conf->palette = D_CALLOC( 256, sizeof(DFBColor) ); + if (!conf->palette) + return D_OOM(); + } + + conf->palette[index].a = (argb & 0xFF000000) >> 24; + conf->palette[index].r = (argb & 0xFF0000) >> 16; + conf->palette[index].g = (argb & 0xFF00) >> 8; + conf->palette[index].b = (argb & 0xFF); + + conf->palette_set = true; + } + else { + D_ERROR( "DirectFB/Config '%s': No color specified!\n", name ); + return DFB_INVARG; + } + } else + if (strcmp (name, "layer-rotate" ) == 0) { + DFBConfigLayer *conf = dfb_config->config_layer; + + if (value) { + int rotate; + + if (sscanf( value, "%d", &rotate ) < 1) { + D_ERROR("DirectFB/Config '%s': Could not parse value!\n", name); + return DFB_INVARG; + } + + if (rotate != 0 && rotate != 90 && rotate != 180 && rotate != 270) { + D_ERROR("DirectFB/Config '%s': Only 0, 90, 180 or 270 supported!\n", name); + return DFB_UNSUPPORTED; + } + + conf->rotate = rotate; + } + else { + D_ERROR("DirectFB/Config '%s': No value specified!\n", name); + return DFB_INVARG; + } + } else + if (strcmp (name, "video-phys" ) == 0) { + if (value) { + char *error; + unsigned long phys; + + phys = strtoul( value, &error, 16 ); + + if (*error) { + D_ERROR( "DirectFB/Config '%s': Error in hex value '%s'!\n", name, error ); + return DFB_INVARG; + } + + dfb_config->video_phys = phys; + } + else { + D_ERROR( "DirectFB/Config '%s': No value specified!\n", name ); + return DFB_INVARG; + } + } else + if (strcmp (name, "video-length" ) == 0) { + if (value) { + char *error; + unsigned long length; + + length = strtoul( value, &error, 10 ); + + if (*error) { + D_ERROR( "DirectFB/Config '%s': Error in value '%s'!\n", name, error ); + return DFB_INVARG; + } + + dfb_config->video_length = length; + } + else { + D_ERROR( "DirectFB/Config '%s': No value specified!\n", name ); + return DFB_INVARG; + } + } else + if (strcmp (name, "mmio-phys" ) == 0) { + if (value) { + char *error; + unsigned long phys; + + phys = strtoul( value, &error, 16 ); + + if (*error) { + D_ERROR( "DirectFB/Config '%s': Error in hex value '%s'!\n", name, error ); + return DFB_INVARG; + } + + dfb_config->mmio_phys = phys; + } + else { + D_ERROR( "DirectFB/Config '%s': No value specified!\n", name ); + return DFB_INVARG; + } + } else + if (strcmp (name, "mmio-length" ) == 0) { + if (value) { + char *error; + unsigned long length; + + length = strtoul( value, &error, 10 ); + + if (*error) { + D_ERROR( "DirectFB/Config '%s': Error in value '%s'!\n", name, error ); + return DFB_INVARG; + } + + dfb_config->mmio_length = length; + } + else { + D_ERROR( "DirectFB/Config '%s': No value specified!\n", name ); + return DFB_INVARG; + } + } else + if (strcmp (name, "accelerator" ) == 0) { + if (value) { + char *error; + unsigned long accel; + + accel = strtoul( value, &error, 10 ); + + if (*error) { + D_ERROR( "DirectFB/Config '%s': Error in value '%s'!\n", name, error ); + return DFB_INVARG; + } + + dfb_config->accelerator = accel; + } + else { + D_ERROR( "DirectFB/Config '%s': No value specified!\n", name ); + return DFB_INVARG; + } + } else + if (strcmp (name, "matrox-tv-standard" ) == 0) { + if (value) { + if (strcmp( value, "pal-60" ) == 0) { + dfb_config->matrox_tv_std = DSETV_PAL_60; + } else + if (strcmp( value, "pal" ) == 0) { + dfb_config->matrox_tv_std = DSETV_PAL; + } else + if (strcmp( value, "ntsc" ) == 0) { + dfb_config->matrox_tv_std = DSETV_NTSC; + } else { + D_ERROR( "DirectFB/Config: Unknown TV standard " + "'%s'!\n", value ); + return DFB_INVARG; + } + } + else { + D_ERROR( "DirectFB/Config: " + "No TV standard specified!\n" ); + return DFB_INVARG; + } + } else + if (strcmp (name, "matrox-cable-type" ) == 0) { + if (value) { + if (strcmp( value, "composite" ) == 0) { + dfb_config->matrox_cable = 0; + } else + if (strcmp( value, "scart-rgb" ) == 0) { + dfb_config->matrox_cable = 1; + } else + if (strcmp( value, "scart-composite" ) == 0) { + dfb_config->matrox_cable = 2; + } else { + D_ERROR( "DirectFB/Config: Unknown cable type " + "'%s'!\n", value ); + return DFB_INVARG; + } + } + else { + D_ERROR( "DirectFB/Config: " + "No cable type specified!\n" ); + return DFB_INVARG; + } + } else + if (strcmp (name, "matrox-sgram" ) == 0) { + dfb_config->matrox_sgram = true; + } else + if (strcmp (name, "matrox-crtc2" ) == 0) { + dfb_config->matrox_crtc2 = true; + } else + if (strcmp (name, "no-matrox-sgram" ) == 0) { + dfb_config->matrox_sgram = false; + } else + if (strcmp (name, "sync" ) == 0) { + dfb_config->sync = true; + } else + if (strcmp (name, "no-sync" ) == 0) { + dfb_config->sync = false; + } else + if (strcmp (name, "lefty" ) == 0) { + dfb_config->lefty = true; + } else + if (strcmp (name, "no-lefty" ) == 0) { + dfb_config->lefty = false; + } else + if (strcmp (name, "capslock-meta" ) == 0) { + dfb_config->capslock_meta = true; + } else + if (strcmp (name, "no-capslock-meta" ) == 0) { + dfb_config->capslock_meta = false; + } else + if (strcmp (name, "h3600-device" ) == 0) { + if (value) { + if (dfb_config->h3600_device) + D_FREE( dfb_config->h3600_device ); + + dfb_config->h3600_device = D_STRDUP( value ); + } + else { + D_ERROR( "DirectFB/Config: No H3600 TS device specified!\n" ); + return DFB_INVARG; + } + } else + if (strcmp (name, "mut-device" ) == 0) { + if (value) { + if (dfb_config->mut_device) + D_FREE( dfb_config->mut_device ); + + dfb_config->mut_device = D_STRDUP( value ); + } + else { + D_ERROR( "DirectFB/Config: No MuTouch device specified!\n" ); + return DFB_INVARG; + } + } else + if (strcmp (name, "zytronic-device" ) == 0) { + if (value) { + if (dfb_config->zytronic_device) + D_FREE( dfb_config->zytronic_device ); + + dfb_config->zytronic_device = D_STRDUP( value ); + } + else { + D_ERROR( "DirectFB/Config: No Zytronic device specified!\n" ); + return DFB_INVARG; + } + } else + if (strcmp (name, "elo-device" ) == 0) { + if (value) { + if (dfb_config->elo_device) + D_FREE( dfb_config->elo_device ); + + dfb_config->elo_device = D_STRDUP( value ); + } + else { + D_ERROR( "DirectFB/Config: No Elo device specified!\n" ); + return DFB_INVARG; + } + } else + if (strcmp (name, "penmount-device" ) == 0) { + if (value) { + if (dfb_config->penmount_device) + D_FREE( dfb_config->penmount_device ); + + dfb_config->penmount_device = D_STRDUP( value ); + } + else { + D_ERROR( "DirectFB/Config: No PenMount device specified!\n" ); + return DFB_INVARG; + } + } else + if (strcmp (name, "linux-input-devices" ) == 0) { + if (value) { + config_values_free( &dfb_config->linux_input_devices ); + config_values_parse( &dfb_config->linux_input_devices, value ); + } + else { + D_ERROR( "DirectFB/Config: Missing value for linux-input-devices!\n" ); + return DFB_INVARG; + } + } else + if (strcmp (name, "tslib-devices" ) == 0) { + if (value) { + config_values_free( &dfb_config->tslib_devices ); + config_values_parse( &dfb_config->tslib_devices, value ); + } + else { + D_ERROR( "DirectFB/Config: Missing value for tslib-devices!\n" ); + return DFB_INVARG; + } + } else + if (strcmp (name, "unichrome-revision" ) == 0) { + if (value) { + int rev; + + if (sscanf( value, "%d", &rev ) < 1) { + D_ERROR("DirectFB/Config 'unichrome-revision': Could not parse revision!\n"); + return DFB_INVARG; + } + + dfb_config->unichrome_revision = rev; + } + else { + D_ERROR("DirectFB/Config 'unichrome-revision': No revision specified!\n"); + return DFB_INVARG; + } + } else + if (strcmp (name, "i8xx_overlay_pipe_b") == 0) { + dfb_config->i8xx_overlay_pipe_b = true; + } else + if (strcmp (name, "window-cursor-invisible") == 0) { + dfb_config->default_cursor_flags = DWCF_INVISIBLE; + } else + if (strcmp (name, "max-axis-rate" ) == 0) {
+ if (value) {
+ unsigned int rate;
+
+ if (sscanf( value, "%u", &rate ) < 1) {
+ D_ERROR("DirectFB/Config '%s': Could not parse value!\n", name);
+ return DFB_INVARG;
+ }
+
+ dfb_config->max_axis_rate = rate;
+ }
+ else {
+ D_ERROR("DirectFB/Config '%s': No value specified!\n", name);
+ return DFB_INVARG;
+ }
+ } else
+ if (strcmp (name, "include") == 0) { + if( value ) { + DFBResult ret; + ret = dfb_config_read( value ); + if( ret ) + return ret; + } + else { + D_ERROR("DirectFB/Config 'include': No include file specified!\n"); + return DFB_INVARG; + } + } else + if (strcmp (name, "flip-notify-max-latency" ) == 0) { + if (value) { + char *error; + unsigned long latency; + + latency = strtoul( value, &error, 10 ); + + if (*error) { + D_ERROR( "DirectFB/Config '%s': Error in value '%s'!\n", name, error ); + return DFB_INVARG; + } + + dfb_config->flip_notify_max_latency = latency; + } + else { + D_ERROR( "DirectFB/Config '%s': No value specified!\n", name ); + return DFB_INVARG; + } + } else + if (voodoo_config_set( name, value ) && fusion_config_set( name, value ) && direct_config_set( name, value ))
+ return DFB_UNSUPPORTED; + + return DFB_OK; +} + +DFBResult dfb_config_init( int *argc, char *(*argv[]) ) +{ + DFBResult ret; + int i; + char *home = getenv( "HOME" ); + char *prog = NULL; + char *session; + char *dfbargs; + char cmdbuf[1024]; + + if (dfb_config) + return DFB_OK; + + config_allocate(); + + /* Read system settings. */ + ret = dfb_config_read( SYSCONFDIR"/directfbrc" ); + if (ret && ret != DFB_IO) + return ret; + + /* Read user settings. */ + if (home) { + int len = strlen(home) + strlen("/.directfbrc") + 1; + char buf[len]; + + snprintf( buf, len, "%s/.directfbrc", home ); + + ret = dfb_config_read( buf ); + if (ret && ret != DFB_IO) + return ret; + } + + /* Get application name. */ + if (argc && *argc && argv && *argv) { + prog = strrchr( (*argv)[0], '/' ); + + if (prog) + prog++; + else + prog = (*argv)[0]; + } + else { + /* if we didn't receive argc/argv we try the proc system */ + FILE *f; + int len; + + f = fopen( "/proc/self/cmdline", "r" ); + if (f) { + len = fread( cmdbuf, 1, 1023, f ); + if (len) { + cmdbuf[len] = 0; /* in case of no arguments, or long program name */ + prog = strrchr( cmdbuf, '/' ); + if (prog) + prog++; + else + prog = cmdbuf; + } + fprintf(stderr,"commandline read: %s\n", prog ); + fclose( f ); + } + } + + /* Strip lt- prefix. */ + if (prog) { + if (prog[0] == 'l' && prog[1] == 't' && prog[2] == '-') + prog += 3; + } + + /* Read global application settings. */ + if (prog && prog[0]) { + int len = strlen( SYSCONFDIR"/directfbrc." ) + strlen(prog) + 1; + char buf[len]; + + snprintf( buf, len, SYSCONFDIR"/directfbrc.%s", prog ); + + ret = dfb_config_read( buf ); + if (ret && ret != DFB_IO) + return ret; + } + + /* Read user application settings. */ + if (home && prog && prog[0]) { + int len = strlen(home) + strlen("/.directfbrc.") + strlen(prog) + 1; + char buf[len]; + + snprintf( buf, len, "%s/.directfbrc.%s", home, prog ); + + ret = dfb_config_read( buf ); + if (ret && ret != DFB_IO) + return ret; + } + + /* Read settings from environment variable. */ + dfbargs = getenv( "DFBARGS" ); + if (dfbargs) { + ret = parse_args( dfbargs ); + if (ret) + return ret; + } + + /* Active session is used if present, only command line can override. */ + session = getenv( "DIRECTFB_SESSION" ); + if (session) + dfb_config_set( "session", session ); + + /* Read settings from command line. */ + if (argc && argv) { + for (i = 1; i < *argc; i++) { + + if (strcmp ((*argv)[i], "--dfb-help") == 0) { + print_config_usage(); + exit(1); + } + + if (strncmp ((*argv)[i], "--dfb:", 6) == 0) { + ret = parse_args( (*argv)[i] + 6 ); + if (ret) + return ret; + + (*argv)[i] = NULL; + } + } + + for (i = 1; i < *argc; i++) { + int k; + + for (k = i; k < *argc; k++) + if ((*argv)[k] != NULL) + break; + + if (k > i) { + int j; + + k -= i; + + for (j = i + k; j < *argc; j++) + (*argv)[j-k] = (*argv)[j]; + + *argc -= k; + } + } + } + else if (prog) { + /* we have prog, so we try again the proc filesystem */ + FILE *f; + int len; + + len = strlen( cmdbuf ); + f = fopen( "/proc/self/cmdline", "r" ); + if (f) { + len = fread( cmdbuf, 1, len, f ); /* skip arg 0 */ + while( config_read_cmdline( cmdbuf, 1024, f ) ) { + fprintf(stderr,"commandline read: %s\n", cmdbuf ); + if (strcmp (cmdbuf, "--dfb-help") == 0) { + print_config_usage(); + exit(1); + } + + if (strncmp (cmdbuf, "--dfb:", 6) == 0) { + ret = parse_args( cmdbuf + 6 ); + if (ret) { + fclose( f ); + return ret; + } + } + } + fclose( f ); + } + } + + if (!dfb_config->vt_switch) + dfb_config->kd_graphics = true; + + return DFB_OK; +} + +DFBResult dfb_config_read( const char *filename ) +{ + DFBResult ret = DFB_OK; + char line[400]; + FILE *f; + + char *slash = 0; + char *cwd = 0; + + config_allocate(); + + dfb_config->config_layer = &dfb_config->layers[0]; + + f = fopen( filename, "r" ); + if (!f) { + D_DEBUG_AT( DirectFB_Config, "Unable to open config file `%s'!\n", filename ); + return DFB_IO; + } else { + D_DEBUG_AT( DirectFB_Config, "Parsing config file '%s'.\n", filename ); + } + + /* store/restore the cwd (needed for the "include" command */ + slash = strrchr( filename, '/' ); + if( slash ) { + cwd = getcwd(0,0); + if( !cwd ) + return D_OOM(); + + /* must copy filename for path, due to const'ness */ + char nwd[strlen(filename)]; + strcpy( nwd, filename ); + nwd[slash-filename] = 0; + chdir( nwd ); + + D_DEBUG_AT( DirectFB_Config, "changing configuration lookup directory to '%s'.\n", nwd ); + } + + while (fgets( line, 400, f )) { + char *name = line; + char *comment = strchr( line, '#'); + char *value; + + if (comment) { + *comment = 0; + } + + value = strchr( line, '=' ); + + if (value) { + *value++ = 0; + direct_trim( &value ); + } + + direct_trim( &name ); + + if (!*name || *name == '#') + continue; + + ret = dfb_config_set( name, value ); + if (ret) { + if (ret == DFB_UNSUPPORTED) { + D_ERROR( "DirectFB/Config: *********** In config file `%s': " + "Invalid option `%s'! ***********\n", filename, name ); + ret = DFB_OK; + continue; + } + break; + } + } + + fclose( f ); + + /* restore original cwd */ + if( cwd ) { + chdir( cwd ); + free( cwd ); + } + + return ret; +} + diff --git a/Source/DirectFB/src/misc/conf.h b/Source/DirectFB/src/misc/conf.h new file mode 100755 index 0000000..49b5e9a --- /dev/null +++ b/Source/DirectFB/src/misc/conf.h @@ -0,0 +1,287 @@ +/* + (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) + (c) Copyright 2000-2004 Convergence (integrated media) GmbH + + All rights reserved. + + Written by Denis Oliver Kropp <dok@directfb.org>, + Andreas Hundt <andi@fischlustig.de>, + Sven Neumann <neo@directfb.org>, + Ville Syrjälä <syrjala@sci.fi> and + Claudio Ciccani <klan@users.sf.net>. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef __CONF_H__ +#define __CONF_H__ + +#include <signal.h> + +#include <directfb.h> +#include <fusion/types.h> +#include <fusion/vector.h> + +#include <core/coredefs.h> + + +typedef struct { + bool init; + + DFBDisplayLayerConfig config; + DFBColor src_key; + int src_key_index; + + struct { + DFBDisplayLayerBackgroundMode mode; + DFBColor color; + int color_index; + char *filename; + } background; + + DFBWindowStackingClass stacking; + + DFBColor *palette; + bool palette_set; + + int rotate; +} DFBConfigLayer; + +typedef enum { + DCWF_NONE = 0x00000000, + + DCWF_CREATE_SURFACE = 0x00000001, + DCWF_CREATE_WINDOW = 0x00000002, + + DCWF_ALLOCATE_BUFFER = 0x00000010, + + DCWF_ALL = 0x00000013, +} DFBConfigWarnFlags; + +typedef struct +{ + bool mouse_motion_compression; /* use motion compression? */ + char *mouse_protocol; /* mouse protocol */ + char *mouse_source; /* mouse source device name */ + bool mouse_gpm_source; /* mouse source is gpm? */ + + int window_policy; /* swapping policy for the + surface of a window */ + int buffer_mode; /* default buffer mode for + primary layer */ + + bool pollvsync_after; + bool pollvsync_none; + + bool software_only; /* disable hardware acceleration */ + bool hardware_only; /* disable software fallbacks */ + + bool mmx; /* mmx support */ + + bool banner; /* startup banner */ + + bool force_windowed; /* prohibit exclusive modes */ + + bool deinit_check; + + bool vt_switch; /* allocate a new VT */ + int vt_num; /* number of TTY to use or -1 + if the default */ + bool kd_graphics; /* put terminal into graphics + mode */ + + DFBScreenEncoderTVStandards matrox_tv_std; /* Matrox TV standard */ + int matrox_cable; /* Matrox cable type */ + bool matrox_sgram; /* Use Matrox SGRAM features */ + bool matrox_crtc2; /* Experimental CRTC2 stuff */ + + bool sync; /* Do sync() in core_init() */ + bool vt_switching; /* Allow VT switching by + pressing Ctrl+Alt+<F?> */ + + char *fb_device; /* Used framebuffer device, + e.g. "/dev/fb0" */ + + struct { + int bus; /* PCI Bus */ + int dev; /* PCI Device */ + int func; /* PCI Function */ + } pci; + + bool lefty; /* Left handed mouse, swaps + left/right mouse buttons */ + bool no_cursor; /* Never create a cursor */ + bool translucent_windows; /* Allow translucent + windows */ + + struct { + int width; /* primary layer width */ + int height; /* primary layer height */ + int depth; /* primary layer depth */ + DFBSurfacePixelFormat format; /* primary layer format */ + } mode; + + struct { + int width; /* scaled window width */ + int height; /* scaled window height */ + } scaled; + + int videoram_limit; /* limit amount of video + memory used by DirectFB */ + + char *screenshot_dir; /* dump screen content into + this directory */ + + char *system; /* FBDev, SDL, etc. */ + + bool capslock_meta; /* map CapsLock -> Meta */ + + bool block_all_signals; /* block all signals */ + + int session; /* select multi app world */ + + int primary_layer; /* select alternative primary + display layer */ + + bool force_desktop; /* Desktop background is + the primary surface. */ + + bool linux_input_ir_only; /* Ignore non-IR devices. */ + + struct { + char *host; /* Remote host to connect to. */ + int session; /* Remote session number. */ + } remote; + + char *wm; /* Window manager to use. */ + + bool vt; /* Use VT stuff at all? */ + + bool decorations; /* Enable window decorations. */ + + DFBSurfacePixelFormat font_format; /* Preferred font format. */ + + char *h3600_device; /* H3600 Touchscreen Device */ + + char *mut_device; /* MuTouch Device */ + + char *penmount_device; /* PenMount Device */ + + char *zytronic_device; /* Zytronic Device */ + + char *elo_device; /* elo Device */ + + int unichrome_revision; /* Unichrome hardware + revision number override */ + + bool dma; /* Enable DMA */ + + int agp; /* AGP mode */ + int agpmem_limit; /* Limit of AGP memory + used by DirectFB */ + bool i8xx_overlay_pipe_b; /* video overlay output via pixel pipe B */ + bool primary_only; /* tell application only about primary layer */ + + bool thrifty_surface_buffers; /* don't keep system instance while video instance is alive */ + bool surface_sentinel; + + DFBConfigLayer layers[MAX_LAYERS]; + DFBConfigLayer *config_layer; + + DFBSurfaceRenderOptions render_options; /* default render options */ + + bool startstop; /* Issue StartDrawing/StopDrawing to driver */ + + unsigned long video_phys; /* Physical base address of video memory */ + unsigned int video_length; /* Size of video memory */ + unsigned long mmio_phys; /* Physical base address of MMIO area */ + unsigned int mmio_length; /* Size of MMIO area */ + int accelerator; /* Accelerator ID */ + + bool font_premult; /* Use premultiplied data in case of ARGB glyph images */ + + FusionVector linux_input_devices; + FusionVector tslib_devices; + + bool thread_block_signals; /* Call direct_signals_block_all() in direct_thread_main() startup. */ + + bool linux_input_grab; /* Grab input devices. */ + + bool autoflip_window; /* If primary surface is non-flipping, but windowed, flip automatically. */ + bool software_warn; /* Show warnings when doing/dropping software operations. */ + + int surface_shmpool_size; /* Set the size of the shared memory pool used for + shared system memory surfaces. */ + + bool no_cursor_updates; /* Never show the cursor etc. */ + + struct { + DFBConfigWarnFlags flags; /* Warn on various actions as window/surface creation. */ + + struct { + DFBDimension min_size; + } create_surface; + + struct { + DFBDimension min_size; + } allocate_buffer; + } warn; + + int keep_accumulators; /* Free accumulators above this limit */ + + bool software_trace; +
+ unsigned int max_axis_rate; + + unsigned int flip_notify_max_latency; + + DFBWindowCursorFlags default_cursor_flags; + + bool discard_repeat_events; +} DFBConfig; + +extern DFBConfig *dfb_config; + +/* + * Allocate Config struct, fill with defaults and parse command line options + * for overrides. Options identified as DirectFB options are stripped out + * of the array. + */ +DFBResult dfb_config_init( int *argc, char *(*argv[]) ); + +/* + * Read configuration options from file. Called by config_init(). + * + * Returns DFB_IO if config file could not be opened. + * Returns DFB_UNSUPPORTED if file contains an invalid option. + * Returns DFB_INVARG if an invalid option assignment is done, + * e.g. "--desktop-buffer-mode=somethingwrong". + */ +DFBResult dfb_config_read( const char *filename ); + + +/* + * Set indiviual option. Used by config_init(), config_read() and + * DirectFBSetOption() + */ +DFBResult dfb_config_set( const char *name, const char *value ); + +const char *dfb_config_usage( void ); + +DFBSurfacePixelFormat dfb_config_parse_pixelformat( const char *format ); + +#endif + diff --git a/Source/DirectFB/src/misc/dither565.h b/Source/DirectFB/src/misc/dither565.h new file mode 100755 index 0000000..5231aee --- /dev/null +++ b/Source/DirectFB/src/misc/dither565.h @@ -0,0 +1,211 @@ +/* + (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) + (c) Copyright 2000-2004 Convergence (integrated media) GmbH + + All rights reserved. + + Written by Denis Oliver Kropp <dok@directfb.org>, + Andreas Hundt <andi@fischlustig.de>, + Sven Neumann <neo@directfb.org>, + Ville Syrjälä <syrjala@sci.fi> and + Claudio Ciccani <klan@users.sf.net>. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef __DITHER565_H__ +#define __DITHER565_H__ + + +#ifndef DIRECTFB_VERSION +#error config.h must be included prior to dither565.h +#endif + + +/* Dither matrices + * --------------- + * + * Preprocessed matrices for 5-6-5 RGB displays, taken from GdkRGB. + */ + + +#if (DFB_DITHER565 == DFB_DITHER_ADVANCED) + +/* This dither table was generated by Raph Levien using patented + * technology (US Patent 5,276,535). The dither table itself is in the + * public domain. + */ + +#define DM_WIDTH 128 +#define DM_HEIGHT 128 +#define DM_WIDTH_SHIFT 7 + +static const u32 DM_565[DM_WIDTH * DM_HEIGHT] = +{ + 3072, 5243909, 2099202, 3072, 2099202, 4195332, 3072, 1051649, 7340039, 2099202, 5243909, 6291462, 3147779, 5243909, 1051649, 4195332, 6291462, 3147779, 7340039, 3147779, 3072, 7340039, 3147779, 6291462, 4195332, 3072, 5243909, 7340039, 2099202, 4195332, 1051649, 5243909, 3147779, 7340039, 5243909, 4195332, 2099202, 5243909, 4195332, 1051649, 4195332, 3147779, 6291462, 1051649, 7340039, 3072, 5243909, 1051649, 4195332, 1051649, 7340039, 2099202, 3072, 5243909, 1051649, 4195332, 3072, 7340039, 1051649, 5243909, 3072, 6291462, 4195332, 2099202, 4195332, 7340039, 1051649, 6291462, 4195332, 7340039, 1051649, 3147779, 2099202, 1051649, 7340039, 2099202, 5243909, 6291462, 3072, 2099202, 6291462, 1051649, 2099202, 6291462, 4195332, 2099202, 2099202, 4195332, 1051649, 6291462, 2099202, 7340039, 3147779, 1051649, 4195332, 3147779, 6291462, 1051649, 2099202, 5243909, 2099202, 3147779, 3072, 2099202, 6291462, 3147779, 6291462, 2099202, 3072, 4195332, 7340039, 5243909, 3147779, 4195332, 1051649, 6291462, 2099202, 5243909, 3072, 6291462, 1051649, 5243909, 4195332, 6291462, 2099202, 5243909, 1051649, 7340039, + 3147779, 7340039, 4195332, 6291462, 5243909, 4195332, 6291462, 3147779, 5243909, 3072, 3147779, 3072, 2099202, 4195332, 7340039, 1051649, 5243909, 3072, 2099202, 6291462, 4195332, 2099202, 5243909, 1051649, 3147779, 5243909, 1051649, 4195332, 3072, 6291462, 3147779, 7340039, 1051649, 3147779, 3072, 2099202, 6291462, 1051649, 7340039, 3147779, 5243909, 3072, 4195332, 3147779, 5243909, 2099202, 5243909, 3147779, 7340039, 4195332, 1051649, 4195332, 6291462, 2099202, 7340039, 3147779, 6291462, 2099202, 4195332, 3147779, 6291462, 2099202, 3072, 6291462, 2099202, 1051649, 3147779, 5243909, 3072, 4195332, 5243909, 2099202, 6291462, 5243909, 4195332, 2099202, 3147779, 1051649, 5243909, 3147779, 4195332, 7340039, 3072, 4195332, 1051649, 5243909, 7340039, 3147779, 7340039, 1051649, 5243909, 1051649, 5243909, 3072, 7340039, 3072, 2099202, 6291462, 7340039, 1051649, 6291462, 1051649, 5243909, 7340039, 1051649, 3147779, 3072, 6291462, 5243909, 3147779, 1051649, 6291462, 2099202, 7340039, 5243909, 3072, 4195332, 7340039, 4195332, 2099202, 7340039, 3147779, 2099202, 3072, 7340039, 4195332, 3147779, 4195332, + 2099202, 1051649, 2099202, 4195332, 3072, 3147779, 1051649, 7340039, 2099202, 5243909, 7340039, 4195332, 6291462, 2099202, 3072, 5243909, 2099202, 4195332, 7340039, 3072, 6291462, 1051649, 7340039, 3072, 7340039, 2099202, 6291462, 3147779, 5243909, 2099202, 3072, 6291462, 1051649, 6291462, 5243909, 6291462, 3147779, 4195332, 3072, 6291462, 2099202, 7340039, 1051649, 6291462, 3072, 4195332, 1051649, 6291462, 2099202, 3147779, 6291462, 1051649, 3147779, 6291462, 3072, 4195332, 1051649, 5243909, 3072, 6291462, 1051649, 4195332, 7340039, 3147779, 7340039, 4195332, 6291462, 1051649, 7340039, 2099202, 3072, 7340039, 3072, 3147779, 3072, 6291462, 7340039, 4195332, 1051649, 7340039, 3072, 3147779, 5243909, 3147779, 6291462, 1051649, 3072, 5243909, 3072, 4195332, 4195332, 6291462, 3147779, 6291462, 4195332, 5243909, 7340039, 3072, 3147779, 4195332, 2099202, 7340039, 3072, 4195332, 5243909, 7340039, 4195332, 2099202, 7340039, 3072, 6291462, 3147779, 3072, 4195332, 2099202, 6291462, 3147779, 1051649, 5243909, 6291462, 1051649, 3072, 7340039, 4195332, 2099202, 6291462, 3072, 5243909, + 6291462, 6291462, 5243909, 1051649, 5243909, 7340039, 3147779, 4195332, 1051649, 4195332, 2099202, 3072, 3147779, 5243909, 3147779, 7340039, 3072, 6291462, 1051649, 4195332, 3147779, 2099202, 4195332, 4195332, 2099202, 5243909, 3072, 6291462, 1051649, 7340039, 3147779, 4195332, 2099202, 4195332, 2099202, 2099202, 3072, 5243909, 4195332, 2099202, 1051649, 5243909, 3147779, 3147779, 7340039, 2099202, 7340039, 3072, 5243909, 3072, 5243909, 7340039, 3072, 3147779, 5243909, 2099202, 7340039, 3147779, 7340039, 2099202, 4195332, 5243909, 1051649, 5243909, 3072, 4195332, 3072, 4195332, 1051649, 5243909, 6291462, 4195332, 2099202, 6291462, 5243909, 1051649, 2099202, 3072, 6291462, 2099202, 6291462, 5243909, 1051649, 7340039, 2099202, 6291462, 3147779, 6291462, 2099202, 7340039, 1051649, 3072, 7340039, 2099202, 1051649, 2099202, 4195332, 4195332, 2099202, 5243909, 3072, 6291462, 3147779, 4195332, 2099202, 3072, 6291462, 1051649, 3147779, 5243909, 4195332, 2099202, 7340039, 1051649, 5243909, 1051649, 6291462, 2099202, 3072, 4195332, 3147779, 5243909, 3147779, 3072, 6291462, 1051649, 7340039, 3072, + 2099202, 3147779, 3072, 7340039, 2099202, 1051649, 6291462, 3072, 5243909, 6291462, 1051649, 7340039, 1051649, 6291462, 1051649, 4195332, 2099202, 3147779, 5243909, 1051649, 6291462, 3147779, 5243909, 3072, 6291462, 1051649, 7340039, 1051649, 4195332, 1051649, 6291462, 1051649, 7340039, 3072, 7340039, 5243909, 7340039, 1051649, 6291462, 3147779, 7340039, 4195332, 1051649, 6291462, 3072, 5243909, 3147779, 4195332, 6291462, 2099202, 4195332, 1051649, 6291462, 4195332, 1051649, 6291462, 3072, 2099202, 1051649, 5243909, 3072, 7340039, 1051649, 2099202, 6291462, 2099202, 6291462, 3147779, 7340039, 2099202, 3147779, 1051649, 5243909, 1051649, 3147779, 7340039, 5243909, 4195332, 3147779, 4195332, 1051649, 3147779, 2099202, 4195332, 3072, 5243909, 4195332, 1051649, 6291462, 4195332, 2099202, 5243909, 3147779, 5243909, 3147779, 6291462, 3072, 5243909, 6291462, 1051649, 7340039, 3147779, 1051649, 6291462, 2099202, 5243909, 4195332, 2099202, 4195332, 3072, 6291462, 1051649, 5243909, 4195332, 3072, 7340039, 3147779, 5243909, 7340039, 2099202, 1051649, 7340039, 4195332, 5243909, 1051649, 4195332, 3147779, 4195332, + 6291462, 4195332, 7340039, 3147779, 4195332, 5243909, 2099202, 7340039, 3072, 4195332, 5243909, 3147779, 5243909, 4195332, 3072, 6291462, 6291462, 1051649, 7340039, 2099202, 5243909, 3072, 7340039, 3147779, 2099202, 5243909, 4195332, 3147779, 7340039, 5243909, 2099202, 4195332, 4195332, 3147779, 5243909, 1051649, 3147779, 2099202, 3072, 5243909, 1051649, 6291462, 3072, 4195332, 2099202, 6291462, 1051649, 2099202, 3072, 7340039, 2099202, 3147779, 6291462, 2099202, 7340039, 3147779, 5243909, 4195332, 7340039, 1051649, 6291462, 4195332, 3147779, 5243909, 2099202, 7340039, 3147779, 1051649, 5243909, 3072, 4195332, 7340039, 1051649, 7340039, 3147779, 3072, 6291462, 1051649, 7340039, 3072, 5243909, 7340039, 3072, 7340039, 3147779, 2099202, 3072, 7340039, 3147779, 1051649, 7340039, 2099202, 5243909, 3072, 7340039, 4195332, 3147779, 1051649, 3147779, 4195332, 1051649, 5243909, 6291462, 3072, 6291462, 1051649, 7340039, 3072, 7340039, 1051649, 3147779, 7340039, 2099202, 6291462, 4195332, 2099202, 4195332, 1051649, 3147779, 6291462, 5243909, 2099202, 3072, 3147779, 7340039, 2099202, 6291462, 1051649, + 3147779, 3072, 3147779, 1051649, 6291462, 3072, 4195332, 3147779, 2099202, 6291462, 2099202, 7340039, 3072, 7340039, 3147779, 2099202, 3072, 4195332, 3147779, 3072, 6291462, 4195332, 1051649, 6291462, 3147779, 6291462, 2099202, 5243909, 3072, 3147779, 7340039, 3072, 6291462, 1051649, 3147779, 3072, 6291462, 5243909, 7340039, 3147779, 4195332, 1051649, 7340039, 2099202, 5243909, 1051649, 7340039, 4195332, 5243909, 3147779, 5243909, 5243909, 3072, 4195332, 1051649, 5243909, 2099202, 3072, 5243909, 3147779, 3147779, 2099202, 7340039, 3072, 4195332, 3072, 5243909, 4195332, 3147779, 6291462, 2099202, 3147779, 6291462, 3072, 4195332, 7340039, 2099202, 4195332, 2099202, 6291462, 1051649, 5243909, 3147779, 4195332, 1051649, 6291462, 5243909, 3147779, 2099202, 5243909, 4195332, 3072, 6291462, 2099202, 1051649, 1051649, 6291462, 7340039, 3072, 7340039, 5243909, 2099202, 1051649, 3147779, 7340039, 3147779, 3147779, 5243909, 3147779, 6291462, 4195332, 2099202, 5243909, 3072, 3147779, 6291462, 3072, 7340039, 3072, 4195332, 3072, 7340039, 6291462, 5243909, 1051649, 5243909, 3072, 5243909, + 2099202, 7340039, 5243909, 3072, 7340039, 3147779, 7340039, 1051649, 6291462, 1051649, 4195332, 1051649, 3147779, 5243909, 2099202, 5243909, 7340039, 3147779, 6291462, 4195332, 1051649, 7340039, 2099202, 4195332, 3072, 5243909, 3072, 7340039, 4195332, 2099202, 5243909, 1051649, 5243909, 2099202, 7340039, 5243909, 2099202, 1051649, 4195332, 2099202, 6291462, 4195332, 2099202, 7340039, 3147779, 6291462, 3147779, 3072, 2099202, 6291462, 3072, 7340039, 2099202, 7340039, 3147779, 3072, 7340039, 4195332, 2099202, 7340039, 3072, 6291462, 3072, 5243909, 3147779, 7340039, 1051649, 6291462, 1051649, 7340039, 3072, 2099202, 4195332, 2099202, 5243909, 1051649, 5243909, 3072, 5243909, 3147779, 4195332, 2099202, 6291462, 2099202, 6291462, 5243909, 1051649, 7340039, 3072, 6291462, 1051649, 6291462, 3147779, 4195332, 7340039, 2099202, 5243909, 2099202, 4195332, 3147779, 3072, 6291462, 4195332, 4195332, 3072, 5243909, 1051649, 5243909, 1051649, 2099202, 3072, 6291462, 1051649, 4195332, 7340039, 1051649, 5243909, 2099202, 6291462, 3147779, 5243909, 2099202, 3147779, 1051649, 7340039, 2099202, 4195332, 7340039, + 6291462, 4195332, 1051649, 5243909, 3147779, 2099202, 5243909, 3072, 4195332, 7340039, 3147779, 5243909, 6291462, 3072, 7340039, 1051649, 5243909, 2099202, 3072, 7340039, 2099202, 1051649, 5243909, 1051649, 7340039, 4195332, 1051649, 3147779, 3072, 6291462, 2099202, 7340039, 4195332, 6291462, 3072, 4195332, 6291462, 3147779, 7340039, 3072, 5243909, 3072, 5243909, 3072, 5243909, 3072, 6291462, 4195332, 7340039, 1051649, 4195332, 1051649, 5243909, 1051649, 4195332, 6291462, 3147779, 6291462, 1051649, 5243909, 2099202, 4195332, 7340039, 1051649, 2099202, 6291462, 4195332, 3072, 5243909, 3147779, 5243909, 6291462, 3072, 6291462, 1051649, 7340039, 3147779, 6291462, 1051649, 7340039, 3072, 6291462, 3072, 7340039, 3072, 4195332, 2099202, 4195332, 5243909, 3147779, 3147779, 7340039, 3072, 1051649, 5243909, 4195332, 3072, 6291462, 1051649, 7340039, 2099202, 5243909, 1051649, 7340039, 2099202, 7340039, 3072, 6291462, 3147779, 7340039, 5243909, 3147779, 6291462, 2099202, 5243909, 3147779, 7340039, 4195332, 2099202, 5243909, 1051649, 4195332, 3072, 6291462, 4195332, 6291462, 2099202, 1051649, + 3072, 2099202, 5243909, 2099202, 6291462, 1051649, 4195332, 6291462, 2099202, 5243909, 3072, 2099202, 3147779, 4195332, 4195332, 2099202, 3147779, 7340039, 1051649, 4195332, 5243909, 3147779, 7340039, 5243909, 3147779, 2099202, 7340039, 6291462, 5243909, 3147779, 3072, 4195332, 3072, 3147779, 2099202, 7340039, 3072, 1051649, 5243909, 3147779, 6291462, 2099202, 3147779, 6291462, 1051649, 4195332, 2099202, 1051649, 5243909, 3147779, 2099202, 6291462, 3147779, 5243909, 6291462, 1051649, 4195332, 3072, 6291462, 3147779, 6291462, 1051649, 4195332, 3147779, 5243909, 1051649, 2099202, 3147779, 7340039, 1051649, 4195332, 6291462, 2099202, 4195332, 3147779, 3072, 5243909, 2099202, 4195332, 2099202, 3147779, 5243909, 3147779, 4195332, 2099202, 6291462, 3147779, 3072, 7340039, 1051649, 5243909, 2099202, 3147779, 6291462, 2099202, 7340039, 3147779, 4195332, 5243909, 2099202, 6291462, 3147779, 3147779, 1051649, 5243909, 2099202, 4195332, 2099202, 4195332, 3072, 4195332, 1051649, 1051649, 7340039, 3072, 2099202, 1051649, 3072, 7340039, 1051649, 6291462, 3147779, 5243909, 3147779, 1051649, 3072, 3147779, 6291462, + 5243909, 3147779, 7340039, 3072, 4195332, 7340039, 3147779, 1051649, 7340039, 1051649, 6291462, 7340039, 1051649, 6291462, 1051649, 6291462, 3072, 5243909, 3147779, 6291462, 3072, 4195332, 2099202, 3072, 6291462, 4195332, 3072, 2099202, 1051649, 7340039, 6291462, 1051649, 6291462, 6291462, 5243909, 3147779, 4195332, 7340039, 1051649, 4195332, 1051649, 7340039, 4195332, 1051649, 7340039, 3147779, 7340039, 5243909, 1051649, 6291462, 5243909, 3072, 4195332, 2099202, 3072, 2099202, 7340039, 3147779, 1051649, 5243909, 3072, 6291462, 5243909, 3072, 6291462, 4195332, 6291462, 7340039, 3072, 5243909, 2099202, 3072, 7340039, 3147779, 6291462, 4195332, 7340039, 1051649, 7340039, 3147779, 5243909, 1051649, 7340039, 3072, 5243909, 1051649, 7340039, 5243909, 3147779, 4195332, 3072, 7340039, 5243909, 1051649, 4195332, 3072, 6291462, 1051649, 7340039, 3072, 4195332, 1051649, 5243909, 6291462, 3072, 6291462, 3147779, 3072, 7340039, 6291462, 3147779, 7340039, 5243909, 3147779, 4195332, 5243909, 6291462, 3147779, 5243909, 4195332, 2099202, 7340039, 3072, 7340039, 5243909, 4195332, 7340039, 2099202, + 3072, 6291462, 1051649, 6291462, 2099202, 5243909, 3072, 5243909, 3147779, 2099202, 5243909, 4195332, 3072, 5243909, 2099202, 3147779, 7340039, 1051649, 4195332, 2099202, 5243909, 6291462, 3147779, 7340039, 1051649, 6291462, 3147779, 5243909, 4195332, 2099202, 2099202, 4195332, 3147779, 1051649, 2099202, 3072, 6291462, 2099202, 4195332, 2099202, 6291462, 3072, 3147779, 5243909, 2099202, 4195332, 3072, 3147779, 4195332, 3072, 7340039, 1051649, 7340039, 4195332, 7340039, 3147779, 5243909, 2099202, 4195332, 7340039, 3147779, 2099202, 1051649, 7340039, 2099202, 3072, 2099202, 2099202, 4195332, 1051649, 7340039, 3147779, 5243909, 1051649, 1051649, 5243909, 2099202, 4195332, 3072, 6291462, 3072, 4195332, 1051649, 6291462, 3147779, 4195332, 2099202, 3072, 6291462, 1051649, 6291462, 4195332, 3147779, 3072, 7340039, 5243909, 1051649, 4195332, 2099202, 6291462, 2099202, 7340039, 3072, 4195332, 4195332, 1051649, 7340039, 5243909, 2099202, 1051649, 5243909, 3072, 4195332, 3072, 6291462, 1051649, 2099202, 6291462, 1051649, 5243909, 3072, 4195332, 2099202, 4195332, 3072, 3147779, 1051649, 4195332, + 6291462, 4195332, 3147779, 1051649, 6291462, 1051649, 4195332, 6291462, 3072, 7340039, 3072, 2099202, 6291462, 4195332, 7340039, 1051649, 5243909, 3147779, 7340039, 1051649, 6291462, 3072, 3147779, 4195332, 2099202, 5243909, 3072, 7340039, 3072, 4195332, 7340039, 3072, 5243909, 7340039, 4195332, 5243909, 3147779, 5243909, 3072, 7340039, 2099202, 5243909, 6291462, 3072, 4195332, 7340039, 6291462, 2099202, 7340039, 2099202, 5243909, 3147779, 4195332, 3072, 2099202, 5243909, 3072, 6291462, 2099202, 3072, 5243909, 4195332, 6291462, 3147779, 4195332, 7340039, 5243909, 3147779, 6291462, 4195332, 3072, 6291462, 3147779, 5243909, 7340039, 3072, 6291462, 2099202, 5243909, 3147779, 7340039, 2099202, 6291462, 2099202, 7340039, 1051649, 4195332, 7340039, 2099202, 4195332, 2099202, 3072, 6291462, 5243909, 3147779, 2099202, 3147779, 6291462, 3072, 3147779, 5243909, 2099202, 4195332, 7340039, 2099202, 5243909, 3147779, 1051649, 6291462, 4195332, 2099202, 6291462, 3147779, 7340039, 3147779, 7340039, 4195332, 3072, 7340039, 2099202, 6291462, 7340039, 1051649, 6291462, 2099202, 7340039, 5243909, 2099202, + 2099202, 3072, 7340039, 5243909, 3147779, 7340039, 3072, 2099202, 5243909, 3147779, 4195332, 7340039, 1051649, 3147779, 3072, 6291462, 1051649, 6291462, 3072, 4195332, 2099202, 7340039, 1051649, 5243909, 1051649, 6291462, 2099202, 3147779, 6291462, 3147779, 1051649, 6291462, 2099202, 3072, 6291462, 1051649, 7340039, 1051649, 6291462, 3147779, 4195332, 3072, 3147779, 7340039, 1051649, 2099202, 1051649, 5243909, 3147779, 3072, 4195332, 1051649, 6291462, 6291462, 1051649, 7340039, 1051649, 4195332, 7340039, 4195332, 1051649, 7340039, 3072, 3147779, 2099202, 3072, 5243909, 1051649, 1051649, 5243909, 2099202, 4195332, 1051649, 2099202, 3147779, 4195332, 1051649, 6291462, 3147779, 1051649, 2099202, 5243909, 3072, 4195332, 3072, 5243909, 3147779, 1051649, 6291462, 3072, 7340039, 5243909, 2099202, 4195332, 3072, 7340039, 5243909, 1051649, 4195332, 7340039, 3072, 6291462, 3147779, 3072, 2099202, 6291462, 3072, 7340039, 4195332, 3072, 7340039, 1051649, 2099202, 1051649, 1051649, 4195332, 3147779, 5243909, 4195332, 3072, 3147779, 1051649, 5243909, 3147779, 6291462, 1051649, 3147779, 7340039, + 6291462, 4195332, 2099202, 4195332, 3072, 5243909, 6291462, 4195332, 6291462, 1051649, 3147779, 6291462, 3147779, 7340039, 4195332, 2099202, 5243909, 2099202, 4195332, 7340039, 2099202, 5243909, 3147779, 3072, 7340039, 4195332, 3147779, 5243909, 1051649, 2099202, 6291462, 4195332, 5243909, 1051649, 3147779, 4195332, 1051649, 3147779, 5243909, 3072, 5243909, 6291462, 2099202, 5243909, 3147779, 5243909, 6291462, 1051649, 7340039, 6291462, 2099202, 7340039, 3072, 3147779, 5243909, 2099202, 4195332, 3147779, 1051649, 6291462, 2099202, 5243909, 1051649, 6291462, 6291462, 4195332, 7340039, 3147779, 7340039, 3147779, 7340039, 3072, 5243909, 7340039, 4195332, 7340039, 2099202, 5243909, 3072, 7340039, 6291462, 1051649, 7340039, 4195332, 6291462, 2099202, 6291462, 3147779, 4195332, 5243909, 1051649, 3147779, 6291462, 1051649, 6291462, 4195332, 2099202, 7340039, 3147779, 1051649, 5243909, 4195332, 2099202, 6291462, 4195332, 3147779, 5243909, 1051649, 3147779, 6291462, 3147779, 4195332, 5243909, 6291462, 7340039, 3072, 6291462, 1051649, 7340039, 2099202, 6291462, 6291462, 3072, 4195332, 1051649, 5243909, 3147779, 3072, + 5243909, 1051649, 7340039, 3147779, 2099202, 3147779, 2099202, 1051649, 4195332, 3072, 5243909, 1051649, 3072, 5243909, 1051649, 5243909, 3072, 6291462, 3147779, 3072, 4195332, 1051649, 6291462, 4195332, 2099202, 1051649, 6291462, 3072, 5243909, 7340039, 1051649, 3147779, 3072, 7340039, 2099202, 5243909, 3147779, 6291462, 2099202, 7340039, 2099202, 1051649, 7340039, 3072, 6291462, 3072, 4195332, 3147779, 3072, 2099202, 4195332, 5243909, 2099202, 6291462, 3147779, 3072, 6291462, 7340039, 3147779, 4195332, 3072, 7340039, 3147779, 5243909, 3072, 2099202, 1051649, 4195332, 3072, 6291462, 1051649, 5243909, 2099202, 1051649, 3072, 3147779, 6291462, 2099202, 4195332, 4195332, 3072, 5243909, 3147779, 1051649, 1051649, 5243909, 3072, 5243909, 3072, 3147779, 7340039, 3072, 3147779, 7340039, 2099202, 1051649, 3072, 5243909, 2099202, 6291462, 3147779, 3072, 7340039, 1051649, 5243909, 3072, 3147779, 7340039, 3072, 5243909, 2099202, 7340039, 3072, 4195332, 2099202, 3147779, 5243909, 2099202, 3147779, 5243909, 1051649, 3147779, 7340039, 2099202, 6291462, 1051649, 7340039, 3147779, + 2099202, 6291462, 1051649, 5243909, 7340039, 3072, 7340039, 6291462, 2099202, 7340039, 2099202, 4195332, 7340039, 2099202, 6291462, 3147779, 4195332, 7340039, 1051649, 6291462, 7340039, 5243909, 3147779, 3072, 6291462, 3147779, 7340039, 2099202, 4195332, 3072, 4195332, 7340039, 6291462, 4195332, 5243909, 3072, 7340039, 3072, 4195332, 1051649, 5243909, 4195332, 2099202, 4195332, 3147779, 1051649, 7340039, 3147779, 5243909, 4195332, 1051649, 6291462, 3072, 4195332, 1051649, 7340039, 2099202, 3072, 5243909, 2099202, 5243909, 1051649, 4195332, 2099202, 7340039, 5243909, 3147779, 6291462, 5243909, 1051649, 4195332, 3147779, 7340039, 4195332, 6291462, 3072, 5243909, 1051649, 3147779, 6291462, 3147779, 2099202, 7340039, 5243909, 3147779, 4195332, 7340039, 2099202, 7340039, 2099202, 2099202, 6291462, 4195332, 1051649, 5243909, 7340039, 3147779, 4195332, 6291462, 3072, 4195332, 7340039, 1051649, 6291462, 2099202, 7340039, 1051649, 4195332, 6291462, 3147779, 1051649, 5243909, 1051649, 3147779, 3072, 7340039, 1051649, 6291462, 3072, 7340039, 4195332, 4195332, 2099202, 5243909, 3072, 4195332, 3072, 5243909, + 3072, 7340039, 2099202, 4195332, 1051649, 5243909, 1051649, 4195332, 3072, 3147779, 6291462, 3147779, 3072, 4195332, 1051649, 7340039, 2099202, 3072, 4195332, 3147779, 2099202, 3072, 6291462, 4195332, 5243909, 1051649, 4195332, 2099202, 7340039, 5243909, 3147779, 1051649, 2099202, 1051649, 7340039, 3147779, 2099202, 6291462, 4195332, 7340039, 3072, 7340039, 1051649, 5243909, 7340039, 5243909, 1051649, 2099202, 6291462, 3072, 7340039, 1051649, 7340039, 3147779, 5243909, 2099202, 4195332, 6291462, 1051649, 7340039, 3147779, 3147779, 6291462, 3072, 4195332, 1051649, 7340039, 3072, 2099202, 7340039, 3072, 6291462, 3072, 2099202, 5243909, 3147779, 7340039, 4195332, 7340039, 1051649, 4195332, 6291462, 2099202, 3072, 7340039, 1051649, 4195332, 3147779, 1051649, 6291462, 5243909, 1051649, 5243909, 2099202, 3147779, 6291462, 3072, 4195332, 1051649, 7340039, 2099202, 5243909, 3147779, 1051649, 5243909, 3147779, 6291462, 2099202, 1051649, 4195332, 6291462, 2099202, 4195332, 6291462, 5243909, 2099202, 4195332, 3147779, 6291462, 2099202, 3072, 5243909, 3072, 6291462, 4195332, 7340039, 3147779, 4195332, + 5243909, 3147779, 3072, 4195332, 6291462, 3147779, 4195332, 7340039, 3147779, 5243909, 1051649, 5243909, 6291462, 3147779, 6291462, 3072, 5243909, 4195332, 7340039, 1051649, 3147779, 7340039, 2099202, 5243909, 1051649, 7340039, 3072, 5243909, 3072, 2099202, 5243909, 3072, 7340039, 4195332, 1051649, 6291462, 4195332, 3072, 1051649, 3147779, 2099202, 6291462, 3147779, 2099202, 3072, 3147779, 6291462, 5243909, 3147779, 2099202, 5243909, 3147779, 3147779, 5243909, 1051649, 6291462, 4195332, 3072, 5243909, 2099202, 3072, 5243909, 1051649, 6291462, 3147779, 5243909, 2099202, 4195332, 5243909, 3147779, 5243909, 2099202, 3147779, 7340039, 1051649, 6291462, 3072, 1051649, 5243909, 3072, 7340039, 3072, 5243909, 3147779, 6291462, 3072, 6291462, 2099202, 5243909, 4195332, 3072, 3147779, 6291462, 3072, 7340039, 1051649, 5243909, 2099202, 5243909, 3147779, 5243909, 3072, 4195332, 6291462, 3072, 6291462, 3072, 4195332, 5243909, 2099202, 3072, 7340039, 5243909, 3072, 2099202, 7340039, 3072, 5243909, 1051649, 4195332, 6291462, 2099202, 7340039, 1051649, 3147779, 2099202, 6291462, 1051649, + 7340039, 3147779, 6291462, 2099202, 3072, 7340039, 2099202, 3072, 6291462, 1051649, 6291462, 2099202, 4195332, 1051649, 2099202, 6291462, 3147779, 2099202, 3072, 5243909, 5243909, 3147779, 1051649, 7340039, 2099202, 3147779, 6291462, 4195332, 3147779, 6291462, 3147779, 6291462, 2099202, 3147779, 5243909, 3072, 3147779, 7340039, 5243909, 6291462, 5243909, 3072, 4195332, 7340039, 6291462, 2099202, 4195332, 3072, 6291462, 4195332, 6291462, 1051649, 6291462, 3072, 7340039, 3072, 3147779, 7340039, 3147779, 4195332, 6291462, 3147779, 7340039, 2099202, 6291462, 3072, 4195332, 7340039, 1051649, 6291462, 3072, 7340039, 1051649, 5243909, 4195332, 2099202, 4195332, 6291462, 2099202, 6291462, 3147779, 2099202, 7340039, 4195332, 1051649, 4195332, 5243909, 3072, 7340039, 1051649, 6291462, 7340039, 2099202, 5243909, 3147779, 4195332, 2099202, 7340039, 3072, 6291462, 1051649, 3147779, 7340039, 2099202, 3147779, 5243909, 2099202, 7340039, 3147779, 6291462, 3147779, 4195332, 1051649, 7340039, 1051649, 4195332, 6291462, 3147779, 7340039, 3147779, 1051649, 5243909, 3147779, 4195332, 6291462, 1051649, 5243909, 2099202, + 1051649, 5243909, 1051649, 6291462, 3147779, 5243909, 1051649, 5243909, 3147779, 3072, 4195332, 7340039, 3072, 7340039, 5243909, 3072, 7340039, 3147779, 6291462, 2099202, 1051649, 6291462, 4195332, 4195332, 3072, 5243909, 1051649, 1051649, 7340039, 3072, 1051649, 4195332, 7340039, 1051649, 2099202, 6291462, 2099202, 1051649, 3147779, 3072, 1051649, 6291462, 2099202, 1051649, 4195332, 1051649, 5243909, 7340039, 1051649, 2099202, 3072, 7340039, 4195332, 2099202, 3147779, 4195332, 5243909, 1051649, 3072, 7340039, 1051649, 4195332, 3072, 4195332, 2099202, 7340039, 3147779, 1051649, 2099202, 6291462, 4195332, 2099202, 5243909, 3147779, 3072, 7340039, 3147779, 1051649, 3147779, 5243909, 1051649, 4195332, 3072, 6291462, 2099202, 7340039, 2099202, 4195332, 1051649, 5243909, 3147779, 3072, 4195332, 1051649, 7340039, 3072, 6291462, 4195332, 3147779, 2099202, 7340039, 6291462, 1051649, 4195332, 7340039, 2099202, 4195332, 3072, 5243909, 3072, 7340039, 1051649, 4195332, 3147779, 5243909, 2099202, 3072, 2099202, 3072, 6291462, 3147779, 7340039, 2099202, 3072, 7340039, 3147779, 3072, 6291462, + 4195332, 3072, 4195332, 1051649, 3147779, 4195332, 6291462, 2099202, 7340039, 5243909, 3147779, 1051649, 3147779, 5243909, 2099202, 4195332, 1051649, 5243909, 1051649, 4195332, 6291462, 3072, 2099202, 6291462, 2099202, 3147779, 6291462, 4195332, 2099202, 5243909, 6291462, 3147779, 3072, 5243909, 5243909, 4195332, 7340039, 4195332, 6291462, 4195332, 7340039, 3147779, 4195332, 5243909, 3147779, 7340039, 3072, 3147779, 4195332, 7340039, 2099202, 5243909, 1051649, 5243909, 7340039, 1051649, 6291462, 3147779, 5243909, 2099202, 1051649, 6291462, 5243909, 1051649, 3147779, 6291462, 3072, 5243909, 4195332, 3072, 3147779, 6291462, 1051649, 6291462, 2099202, 5243909, 3072, 7340039, 5243909, 3072, 7340039, 3147779, 5243909, 1051649, 4195332, 3072, 6291462, 3147779, 7340039, 2099202, 4195332, 6291462, 3147779, 5243909, 2099202, 4195332, 1051649, 1051649, 5243909, 4195332, 3072, 4195332, 3147779, 5243909, 3072, 6291462, 1051649, 7340039, 3147779, 2099202, 5243909, 2099202, 5243909, 6291462, 3072, 7340039, 5243909, 7340039, 4195332, 5243909, 1051649, 3072, 6291462, 4195332, 1051649, 7340039, 5243909, 2099202, + 7340039, 5243909, 4195332, 7340039, 6291462, 3072, 1051649, 4195332, 1051649, 5243909, 2099202, 6291462, 4195332, 1051649, 7340039, 3147779, 6291462, 3147779, 7340039, 3072, 3147779, 5243909, 7340039, 1051649, 5243909, 7340039, 3072, 7340039, 3147779, 1051649, 4195332, 6291462, 2099202, 7340039, 2099202, 3072, 3147779, 3072, 2099202, 5243909, 1051649, 5243909, 3072, 7340039, 3072, 3147779, 6291462, 1051649, 6291462, 1051649, 3147779, 4195332, 6291462, 3072, 2099202, 4195332, 2099202, 6291462, 3072, 5243909, 7340039, 2099202, 3147779, 7340039, 5243909, 1051649, 3147779, 6291462, 2099202, 7340039, 1051649, 3147779, 4195332, 1051649, 7340039, 1051649, 5243909, 2099202, 2099202, 5243909, 4195332, 1051649, 3147779, 7340039, 5243909, 3147779, 6291462, 3072, 3147779, 7340039, 3072, 1051649, 6291462, 3072, 7340039, 3147779, 6291462, 3147779, 7340039, 1051649, 7340039, 3072, 6291462, 1051649, 5243909, 2099202, 3147779, 5243909, 1051649, 7340039, 1051649, 6291462, 3072, 2099202, 4195332, 4195332, 1051649, 1051649, 3147779, 2099202, 5243909, 4195332, 2099202, 5243909, 3147779, 1051649, 4195332, 2099202, + 3072, 3147779, 2099202, 3072, 2099202, 6291462, 5243909, 7340039, 2099202, 3072, 7340039, 1051649, 6291462, 2099202, 4195332, 3072, 2099202, 3072, 5243909, 2099202, 6291462, 1051649, 3147779, 4195332, 3072, 2099202, 5243909, 1051649, 5243909, 7340039, 2099202, 3072, 5243909, 1051649, 4195332, 6291462, 3147779, 5243909, 7340039, 2099202, 6291462, 3147779, 2099202, 5243909, 2099202, 5243909, 4195332, 3072, 5243909, 3147779, 7340039, 3072, 2099202, 5243909, 7340039, 3072, 5243909, 1051649, 6291462, 4195332, 3072, 4195332, 5243909, 3072, 2099202, 6291462, 4195332, 3072, 5243909, 4195332, 5243909, 7340039, 3072, 6291462, 4195332, 3147779, 6291462, 4195332, 6291462, 1051649, 6291462, 2099202, 6291462, 3072, 2099202, 3147779, 1051649, 4195332, 6291462, 2099202, 5243909, 3147779, 5243909, 2099202, 4195332, 3072, 2099202, 5243909, 1051649, 4195332, 2099202, 6291462, 2099202, 4195332, 3072, 7340039, 4195332, 3072, 6291462, 4195332, 6291462, 4195332, 3147779, 7340039, 1051649, 6291462, 3147779, 6291462, 7340039, 3072, 7340039, 3147779, 6291462, 3072, 7340039, 3072, 5243909, 7340039, + 1051649, 6291462, 5243909, 5243909, 7340039, 3147779, 3072, 2099202, 4195332, 6291462, 4195332, 3147779, 5243909, 3072, 5243909, 7340039, 5243909, 6291462, 4195332, 7340039, 3147779, 3072, 5243909, 5243909, 7340039, 4195332, 2099202, 6291462, 3147779, 3072, 4195332, 7340039, 3147779, 6291462, 2099202, 1051649, 5243909, 1051649, 3072, 4195332, 3072, 6291462, 1051649, 7340039, 3147779, 1051649, 6291462, 2099202, 7340039, 1051649, 2099202, 4195332, 6291462, 1051649, 3147779, 4195332, 7340039, 3147779, 2099202, 7340039, 1051649, 7340039, 1051649, 6291462, 3147779, 7340039, 1051649, 7340039, 3147779, 1051649, 5243909, 2099202, 2099202, 4195332, 6291462, 3072, 3147779, 3072, 3147779, 3072, 3147779, 5243909, 4195332, 2099202, 6291462, 7340039, 5243909, 3072, 4195332, 1051649, 3147779, 7340039, 1051649, 6291462, 2099202, 6291462, 5243909, 3072, 6291462, 5243909, 3072, 3147779, 5243909, 7340039, 3147779, 2099202, 6291462, 2099202, 3147779, 1051649, 2099202, 3072, 7340039, 3147779, 5243909, 2099202, 3072, 4195332, 2099202, 4195332, 3147779, 1051649, 5243909, 2099202, 4195332, 6291462, 2099202, 2099202, + 6291462, 4195332, 3072, 3147779, 1051649, 4195332, 7340039, 5243909, 3147779, 3072, 7340039, 3072, 3147779, 6291462, 2099202, 1051649, 1051649, 4195332, 2099202, 1051649, 4195332, 7340039, 2099202, 1051649, 1051649, 3147779, 6291462, 3072, 5243909, 6291462, 2099202, 1051649, 4195332, 3072, 6291462, 7340039, 3147779, 6291462, 4195332, 7340039, 3147779, 2099202, 6291462, 3072, 4195332, 7340039, 3147779, 3072, 4195332, 6291462, 5243909, 3072, 7340039, 4195332, 6291462, 1051649, 2099202, 6291462, 3072, 3147779, 5243909, 3147779, 4195332, 2099202, 3072, 4195332, 2099202, 5243909, 1051649, 7340039, 3072, 4195332, 7340039, 1051649, 1051649, 7340039, 2099202, 6291462, 7340039, 4195332, 7340039, 1051649, 3072, 7340039, 1051649, 4195332, 2099202, 7340039, 5243909, 3147779, 6291462, 1051649, 4195332, 3072, 7340039, 3147779, 1051649, 4195332, 3147779, 2099202, 7340039, 5243909, 1051649, 1051649, 6291462, 4195332, 3072, 5243909, 7340039, 3147779, 5243909, 4195332, 1051649, 5243909, 3072, 6291462, 3147779, 5243909, 1051649, 6291462, 1051649, 7340039, 3147779, 5243909, 4195332, 3072, 6291462, 3147779, + 1051649, 4195332, 1051649, 7340039, 6291462, 4195332, 3072, 2099202, 6291462, 1051649, 5243909, 2099202, 5243909, 2099202, 4195332, 7340039, 3147779, 7340039, 3072, 5243909, 6291462, 3072, 4195332, 6291462, 6291462, 3072, 7340039, 4195332, 2099202, 1051649, 7340039, 3147779, 7340039, 2099202, 4195332, 3072, 5243909, 2099202, 3147779, 1051649, 5243909, 4195332, 3147779, 6291462, 2099202, 1051649, 5243909, 7340039, 3147779, 3072, 2099202, 5243909, 2099202, 3147779, 3072, 5243909, 2099202, 4195332, 5243909, 1051649, 6291462, 1051649, 6291462, 3147779, 7340039, 4195332, 6291462, 3072, 4195332, 3147779, 6291462, 2099202, 3147779, 5243909, 2099202, 4195332, 5243909, 2099202, 1051649, 4195332, 2099202, 6291462, 5243909, 3147779, 5243909, 3072, 5243909, 2099202, 1051649, 6291462, 3072, 5243909, 3147779, 5243909, 2099202, 5243909, 7340039, 2099202, 6291462, 1051649, 3147779, 3072, 7340039, 4195332, 5243909, 2099202, 7340039, 4195332, 1051649, 6291462, 3072, 6291462, 3147779, 2099202, 7340039, 2099202, 6291462, 1051649, 7340039, 3072, 4195332, 5243909, 2099202, 3072, 7340039, 3147779, 1051649, 5243909, + 7340039, 3147779, 5243909, 3147779, 1051649, 2099202, 6291462, 1051649, 7340039, 3147779, 4195332, 7340039, 3072, 6291462, 3147779, 3072, 6291462, 2099202, 4195332, 1051649, 3147779, 3147779, 5243909, 2099202, 3147779, 4195332, 1051649, 3147779, 7340039, 5243909, 1051649, 4195332, 3072, 5243909, 1051649, 4195332, 7340039, 3072, 6291462, 7340039, 3072, 7340039, 1051649, 4195332, 7340039, 2099202, 4195332, 1051649, 6291462, 3147779, 7340039, 1051649, 6291462, 6291462, 4195332, 3147779, 7340039, 3072, 7340039, 3147779, 2099202, 7340039, 4195332, 3072, 5243909, 1051649, 2099202, 5243909, 3072, 7340039, 1051649, 5243909, 3072, 6291462, 4195332, 3072, 7340039, 3147779, 5243909, 6291462, 3072, 4195332, 2099202, 1051649, 7340039, 2099202, 4195332, 7340039, 3072, 3147779, 4195332, 2099202, 7340039, 1051649, 4195332, 3072, 6291462, 3072, 7340039, 4195332, 6291462, 2099202, 4195332, 2099202, 3072, 6291462, 1051649, 5243909, 3072, 2099202, 5243909, 1051649, 7340039, 4195332, 1051649, 5243909, 3072, 4195332, 3147779, 3147779, 7340039, 3072, 4195332, 6291462, 2099202, 5243909, 7340039, 2099202, + 3072, 6291462, 3072, 4195332, 5243909, 7340039, 2099202, 5243909, 4195332, 1051649, 6291462, 1051649, 4195332, 1051649, 2099202, 5243909, 2099202, 5243909, 3147779, 7340039, 6291462, 1051649, 7340039, 3072, 6291462, 2099202, 5243909, 6291462, 3072, 3147779, 5243909, 2099202, 6291462, 3147779, 7340039, 1051649, 6291462, 2099202, 4195332, 3147779, 2099202, 5243909, 1051649, 5243909, 3072, 5243909, 4195332, 3072, 5243909, 2099202, 4195332, 3147779, 2099202, 3072, 1051649, 6291462, 3147779, 4195332, 2099202, 5243909, 3072, 5243909, 1051649, 7340039, 2099202, 6291462, 3147779, 2099202, 6291462, 3147779, 3147779, 4195332, 7340039, 1051649, 6291462, 3147779, 1051649, 6291462, 3072, 2099202, 4195332, 7340039, 3072, 6291462, 3147779, 5243909, 1051649, 4195332, 6291462, 2099202, 7340039, 4195332, 3072, 7340039, 6291462, 2099202, 4195332, 3147779, 1051649, 4195332, 3072, 3147779, 6291462, 1051649, 6291462, 3147779, 3147779, 7340039, 4195332, 5243909, 1051649, 6291462, 4195332, 3072, 5243909, 3147779, 7340039, 2099202, 6291462, 1051649, 5243909, 2099202, 6291462, 1051649, 4195332, 3072, 3147779, 4195332, + 5243909, 2099202, 7340039, 2099202, 1051649, 4195332, 3147779, 3072, 3147779, 7340039, 3072, 5243909, 3147779, 7340039, 6291462, 3072, 7340039, 4195332, 3072, 2099202, 4195332, 2099202, 4195332, 5243909, 7340039, 3072, 4195332, 2099202, 5243909, 2099202, 7340039, 3072, 3147779, 5243909, 3072, 4195332, 3147779, 5243909, 1051649, 5243909, 1051649, 3147779, 6291462, 2099202, 6291462, 3147779, 3147779, 6291462, 1051649, 7340039, 3072, 6291462, 3147779, 7340039, 5243909, 3072, 6291462, 1051649, 4195332, 1051649, 6291462, 4195332, 2099202, 3147779, 5243909, 3072, 7340039, 5243909, 1051649, 6291462, 3072, 6291462, 3072, 4195332, 2099202, 5243909, 7340039, 4195332, 2099202, 7340039, 1051649, 2099202, 5243909, 4195332, 3072, 2099202, 7340039, 3072, 5243909, 1051649, 1051649, 3147779, 5243909, 1051649, 3147779, 5243909, 1051649, 6291462, 5243909, 2099202, 5243909, 7340039, 1051649, 5243909, 4195332, 1051649, 5243909, 3072, 2099202, 7340039, 2099202, 3147779, 3072, 6291462, 3147779, 6291462, 1051649, 5243909, 3072, 6291462, 2099202, 7340039, 1051649, 3147779, 6291462, 3147779, 7340039, 2099202, + 1051649, 4195332, 3147779, 6291462, 4195332, 3072, 7340039, 5243909, 2099202, 6291462, 2099202, 5243909, 1051649, 4195332, 1051649, 5243909, 3147779, 1051649, 7340039, 6291462, 3072, 7340039, 3072, 1051649, 3147779, 3147779, 6291462, 1051649, 7340039, 4195332, 4195332, 2099202, 6291462, 1051649, 7340039, 4195332, 3072, 7340039, 2099202, 4195332, 7340039, 5243909, 3072, 4195332, 1051649, 7340039, 3072, 7340039, 4195332, 2099202, 5243909, 1051649, 4195332, 3072, 4195332, 3147779, 1051649, 7340039, 2099202, 7340039, 3147779, 3072, 6291462, 1051649, 6291462, 2099202, 4195332, 3072, 4195332, 2099202, 5243909, 2099202, 5243909, 3147779, 7340039, 3072, 3147779, 1051649, 4195332, 5243909, 3147779, 6291462, 3147779, 1051649, 7340039, 5243909, 3147779, 6291462, 3147779, 6291462, 5243909, 2099202, 6291462, 2099202, 4195332, 3072, 7340039, 3147779, 1051649, 7340039, 3072, 3147779, 4195332, 3072, 3147779, 7340039, 2099202, 6291462, 3147779, 3072, 7340039, 4195332, 3147779, 7340039, 1051649, 2099202, 4195332, 2099202, 7340039, 1051649, 4195332, 3072, 4195332, 6291462, 1051649, 5243909, 3072, 6291462, + 5243909, 1051649, 6291462, 3072, 3147779, 7340039, 1051649, 4195332, 1051649, 3147779, 6291462, 2099202, 7340039, 3072, 3147779, 6291462, 3072, 6291462, 3147779, 2099202, 3147779, 4195332, 6291462, 5243909, 3072, 7340039, 1051649, 4195332, 3072, 6291462, 1051649, 5243909, 3072, 5243909, 2099202, 3147779, 6291462, 2099202, 6291462, 3072, 2099202, 3147779, 7340039, 4195332, 1051649, 5243909, 2099202, 4195332, 3072, 6291462, 1051649, 7340039, 2099202, 5243909, 2099202, 7340039, 5243909, 3147779, 4195332, 3072, 6291462, 1051649, 4195332, 5243909, 3072, 6291462, 3147779, 7340039, 1051649, 7340039, 2099202, 7340039, 1051649, 2099202, 5243909, 1051649, 6291462, 6291462, 3072, 5243909, 3072, 7340039, 3072, 6291462, 3147779, 6291462, 1051649, 2099202, 4195332, 3072, 4195332, 7340039, 3072, 5243909, 7340039, 3147779, 3072, 5243909, 3147779, 2099202, 6291462, 4195332, 7340039, 2099202, 6291462, 3072, 5243909, 1051649, 6291462, 4195332, 2099202, 5243909, 3072, 5243909, 4195332, 7340039, 3072, 6291462, 3147779, 3147779, 7340039, 5243909, 3147779, 3072, 7340039, 1051649, 4195332, 3147779, + 3072, 7340039, 2099202, 5243909, 5243909, 2099202, 6291462, 2099202, 7340039, 4195332, 3072, 5243909, 3147779, 4195332, 6291462, 2099202, 5243909, 4195332, 1051649, 5243909, 6291462, 1051649, 2099202, 4195332, 4195332, 2099202, 6291462, 3147779, 6291462, 3147779, 2099202, 7340039, 3147779, 4195332, 1051649, 6291462, 3072, 4195332, 3147779, 5243909, 6291462, 3072, 2099202, 6291462, 3147779, 7340039, 1051649, 5243909, 3147779, 5243909, 4195332, 3147779, 7340039, 3072, 6291462, 2099202, 3072, 6291462, 2099202, 5243909, 4195332, 3147779, 7340039, 2099202, 7340039, 2099202, 5243909, 1051649, 4195332, 5243909, 3072, 3147779, 4195332, 7340039, 3072, 3147779, 4195332, 2099202, 7340039, 3147779, 1051649, 5243909, 2099202, 4195332, 1051649, 3072, 4195332, 7340039, 2099202, 7340039, 3147779, 1051649, 6291462, 3147779, 1051649, 7340039, 5243909, 2099202, 4195332, 7340039, 4195332, 3072, 2099202, 5243909, 1051649, 4195332, 7340039, 3147779, 3072, 6291462, 3147779, 1051649, 7340039, 2099202, 3072, 5243909, 4195332, 1051649, 5243909, 3072, 3147779, 2099202, 5243909, 4195332, 2099202, 6291462, 2099202, 7340039, + 5243909, 3147779, 1051649, 7340039, 3072, 4195332, 3072, 5243909, 3072, 5243909, 1051649, 7340039, 3072, 5243909, 1051649, 2099202, 7340039, 1051649, 7340039, 3147779, 3072, 5243909, 7340039, 3072, 7340039, 1051649, 5243909, 2099202, 1051649, 5243909, 1051649, 3072, 6291462, 2099202, 7340039, 3147779, 6291462, 1051649, 7340039, 1051649, 1051649, 7340039, 5243909, 3072, 2099202, 4195332, 6291462, 1051649, 6291462, 3072, 2099202, 6291462, 1051649, 4195332, 1051649, 4195332, 7340039, 1051649, 2099202, 7340039, 1051649, 5243909, 3072, 3147779, 4195332, 1051649, 3147779, 6291462, 2099202, 4195332, 3147779, 6291462, 3072, 3147779, 6291462, 5243909, 3072, 4195332, 1051649, 6291462, 4195332, 6291462, 1051649, 3147779, 5243909, 7340039, 3147779, 3072, 5243909, 1051649, 4195332, 6291462, 2099202, 4195332, 3072, 2099202, 4195332, 1051649, 6291462, 3072, 1051649, 5243909, 6291462, 3147779, 7340039, 3147779, 2099202, 6291462, 4195332, 2099202, 7340039, 3147779, 4195332, 6291462, 4195332, 2099202, 3147779, 6291462, 3072, 6291462, 4195332, 7340039, 1051649, 6291462, 3072, 5243909, 2099202, 4195332, + 3147779, 3072, 6291462, 1051649, 3147779, 5243909, 6291462, 3147779, 7340039, 3147779, 6291462, 2099202, 4195332, 2099202, 7340039, 3147779, 3072, 5243909, 3147779, 6291462, 2099202, 4195332, 1051649, 3147779, 5243909, 4195332, 3072, 6291462, 3147779, 7340039, 4195332, 6291462, 3147779, 5243909, 3072, 5243909, 1051649, 4195332, 2099202, 4195332, 5243909, 3147779, 1051649, 6291462, 6291462, 3072, 2099202, 5243909, 3147779, 7340039, 4195332, 3072, 7340039, 3147779, 2099202, 5243909, 3147779, 5243909, 6291462, 3072, 3147779, 5243909, 6291462, 1051649, 5243909, 3147779, 7340039, 3072, 6291462, 2099202, 7340039, 1051649, 5243909, 2099202, 1051649, 7340039, 2099202, 7340039, 2099202, 5243909, 3072, 3147779, 7340039, 6291462, 3072, 2099202, 5243909, 6291462, 2099202, 4195332, 5243909, 3072, 3147779, 7340039, 5243909, 6291462, 1051649, 7340039, 2099202, 5243909, 7340039, 3147779, 3072, 6291462, 3072, 5243909, 1051649, 5243909, 3072, 6291462, 1051649, 6291462, 1051649, 3072, 6291462, 1051649, 7340039, 4195332, 2099202, 5243909, 1051649, 3072, 5243909, 2099202, 6291462, 3147779, 7340039, 1051649, + 5243909, 7340039, 3147779, 4195332, 6291462, 2099202, 1051649, 4195332, 2099202, 5243909, 3072, 4195332, 6291462, 6291462, 1051649, 4195332, 6291462, 2099202, 1051649, 3072, 7340039, 3147779, 5243909, 7340039, 2099202, 2099202, 6291462, 1051649, 5243909, 3072, 3147779, 1051649, 6291462, 2099202, 2099202, 7340039, 3147779, 3072, 5243909, 6291462, 3072, 7340039, 4195332, 2099202, 4195332, 3147779, 7340039, 2099202, 6291462, 1051649, 3147779, 5243909, 1051649, 5243909, 6291462, 3072, 7340039, 3072, 4195332, 6291462, 4195332, 2099202, 2099202, 7340039, 3072, 6291462, 1051649, 4195332, 5243909, 3072, 5243909, 1051649, 4195332, 6291462, 4195332, 2099202, 3147779, 5243909, 3072, 3147779, 7340039, 2099202, 4195332, 2099202, 6291462, 4195332, 1051649, 1051649, 7340039, 3072, 6291462, 2099202, 6291462, 1051649, 2099202, 3072, 6291462, 4195332, 3147779, 1051649, 4195332, 2099202, 4195332, 2099202, 4195332, 2099202, 7340039, 1051649, 3147779, 5243909, 4195332, 2099202, 5243909, 5243909, 3147779, 5243909, 2099202, 3072, 7340039, 3147779, 6291462, 4195332, 3147779, 7340039, 1051649, 4195332, 3072, 6291462, + 2099202, 4195332, 1051649, 7340039, 3072, 6291462, 3147779, 7340039, 3072, 3147779, 7340039, 1051649, 3072, 3147779, 5243909, 3072, 4195332, 6291462, 7340039, 4195332, 5243909, 1051649, 4195332, 3072, 3147779, 7340039, 4195332, 7340039, 2099202, 7340039, 4195332, 5243909, 3072, 7340039, 4195332, 3072, 5243909, 7340039, 3147779, 2099202, 5243909, 3147779, 1051649, 6291462, 3072, 4195332, 3072, 5243909, 3072, 4195332, 6291462, 2099202, 7340039, 2099202, 1051649, 5243909, 3147779, 2099202, 5243909, 1051649, 3072, 7340039, 1051649, 4195332, 4195332, 2099202, 7340039, 3147779, 1051649, 6291462, 3147779, 7340039, 3147779, 3072, 7340039, 1051649, 6291462, 4195332, 1051649, 6291462, 1051649, 5243909, 3072, 5243909, 1051649, 3147779, 7340039, 5243909, 3147779, 4195332, 2099202, 5243909, 1051649, 7340039, 4195332, 5243909, 3147779, 3072, 5243909, 6291462, 3072, 7340039, 1051649, 6291462, 7340039, 1051649, 3147779, 7340039, 4195332, 2099202, 3072, 7340039, 3147779, 2099202, 7340039, 1051649, 5243909, 3147779, 5243909, 1051649, 2099202, 6291462, 2099202, 3072, 4195332, 3147779, 7340039, 2099202, + 1051649, 5243909, 3147779, 2099202, 5243909, 4195332, 3072, 6291462, 2099202, 5243909, 1051649, 5243909, 3147779, 7340039, 2099202, 7340039, 3147779, 1051649, 3072, 3147779, 6291462, 1051649, 2099202, 6291462, 5243909, 3072, 3147779, 3072, 5243909, 1051649, 6291462, 1051649, 4195332, 3147779, 2099202, 6291462, 1051649, 4195332, 3072, 7340039, 1051649, 2099202, 5243909, 3147779, 7340039, 1051649, 6291462, 3147779, 7340039, 1051649, 2099202, 3072, 4195332, 6291462, 3147779, 4195332, 3072, 7340039, 1051649, 3147779, 6291462, 5243909, 3147779, 6291462, 1051649, 6291462, 3072, 4195332, 7340039, 4195332, 1051649, 4195332, 6291462, 2099202, 5243909, 3147779, 3072, 4195332, 7340039, 3147779, 6291462, 4195332, 7340039, 2099202, 4195332, 6291462, 3072, 2099202, 6291462, 3072, 7340039, 3147779, 5243909, 2099202, 4195332, 1051649, 6291462, 2099202, 7340039, 2099202, 5243909, 4195332, 3147779, 5243909, 3072, 4195332, 6291462, 3072, 1051649, 5243909, 7340039, 3147779, 3072, 6291462, 3072, 4195332, 6291462, 2099202, 7340039, 4195332, 7340039, 3072, 5243909, 7340039, 1051649, 6291462, 3072, 5243909, + 4195332, 3072, 6291462, 2099202, 7340039, 1051649, 2099202, 6291462, 3147779, 1051649, 7340039, 3147779, 6291462, 1051649, 5243909, 1051649, 6291462, 5243909, 5243909, 2099202, 3072, 4195332, 7340039, 1051649, 6291462, 2099202, 6291462, 4195332, 3147779, 3072, 3147779, 5243909, 2099202, 7340039, 1051649, 3147779, 6291462, 2099202, 6291462, 3147779, 4195332, 7340039, 4195332, 1051649, 5243909, 3147779, 5243909, 1051649, 4195332, 5243909, 7340039, 3147779, 5243909, 3072, 7340039, 2099202, 6291462, 3147779, 6291462, 4195332, 3147779, 3072, 7340039, 2099202, 5243909, 3147779, 2099202, 5243909, 3072, 2099202, 6291462, 3072, 1051649, 6291462, 2099202, 7340039, 5243909, 2099202, 3072, 5243909, 1051649, 3072, 3147779, 6291462, 1051649, 3147779, 5243909, 3147779, 5243909, 3147779, 1051649, 6291462, 3072, 5243909, 3072, 7340039, 3147779, 5243909, 1051649, 3147779, 1051649, 3072, 6291462, 2099202, 3147779, 5243909, 2099202, 4195332, 6291462, 4195332, 1051649, 5243909, 6291462, 1051649, 7340039, 2099202, 3072, 4195332, 3072, 1051649, 5243909, 3147779, 1051649, 4195332, 5243909, 2099202, 3147779, 6291462, + 7340039, 4195332, 1051649, 4195332, 3072, 5243909, 4195332, 1051649, 7340039, 4195332, 4195332, 3072, 4195332, 2099202, 6291462, 3072, 3147779, 2099202, 4195332, 7340039, 4195332, 6291462, 3072, 3147779, 4195332, 3072, 5243909, 1051649, 2099202, 6291462, 7340039, 3072, 6291462, 3072, 4195332, 6291462, 3072, 5243909, 1051649, 5243909, 3072, 5243909, 2099202, 6291462, 3072, 7340039, 2099202, 7340039, 2099202, 3072, 4195332, 2099202, 6291462, 1051649, 4195332, 1051649, 5243909, 2099202, 3072, 7340039, 2099202, 5243909, 1051649, 4195332, 3072, 7340039, 1051649, 6291462, 3147779, 7340039, 2099202, 5243909, 7340039, 3147779, 3072, 4195332, 1051649, 6291462, 7340039, 3147779, 5243909, 4195332, 5243909, 1051649, 7340039, 2099202, 7340039, 3072, 4195332, 1051649, 7340039, 4195332, 2099202, 6291462, 4195332, 2099202, 3072, 7340039, 2099202, 6291462, 4195332, 7340039, 3147779, 6291462, 3072, 1051649, 7340039, 3147779, 3072, 7340039, 2099202, 1051649, 4195332, 3147779, 4195332, 6291462, 3147779, 6291462, 2099202, 6291462, 3147779, 4195332, 1051649, 7340039, 3072, 4195332, 7340039, 1051649, + 2099202, 3147779, 5243909, 6291462, 3147779, 7340039, 1051649, 6291462, 3072, 2099202, 1051649, 5243909, 7340039, 4195332, 2099202, 4195332, 7340039, 3072, 6291462, 1051649, 2099202, 3147779, 7340039, 5243909, 2099202, 7340039, 3147779, 7340039, 5243909, 1051649, 4195332, 2099202, 4195332, 5243909, 2099202, 7340039, 3147779, 4195332, 1051649, 6291462, 3147779, 3072, 7340039, 2099202, 4195332, 3072, 5243909, 1051649, 6291462, 3147779, 6291462, 1051649, 4195332, 3147779, 6291462, 7340039, 2099202, 6291462, 5243909, 1051649, 4195332, 7340039, 2099202, 6291462, 3147779, 4195332, 5243909, 2099202, 4195332, 3072, 5243909, 3147779, 3072, 4195332, 3147779, 6291462, 2099202, 4195332, 2099202, 3072, 7340039, 1051649, 2099202, 6291462, 3147779, 3072, 4195332, 1051649, 7340039, 5243909, 2099202, 1051649, 7340039, 1051649, 7340039, 3147779, 6291462, 4195332, 4195332, 3072, 6291462, 3072, 5243909, 1051649, 7340039, 4195332, 1051649, 6291462, 3147779, 2099202, 6291462, 3147779, 5243909, 3072, 5243909, 1051649, 3072, 7340039, 3147779, 6291462, 3072, 7340039, 5243909, 2099202, 6291462, 3147779, 1051649, 5243909, + 3072, 7340039, 2099202, 3072, 3147779, 2099202, 4195332, 3147779, 6291462, 5243909, 6291462, 3147779, 2099202, 3072, 7340039, 3147779, 1051649, 5243909, 3147779, 5243909, 6291462, 2099202, 1051649, 5243909, 1051649, 4195332, 1051649, 4195332, 2099202, 7340039, 3147779, 7340039, 1051649, 3147779, 5243909, 1051649, 2099202, 7340039, 3147779, 2099202, 7340039, 4195332, 1051649, 5243909, 6291462, 3147779, 4195332, 4195332, 3072, 3147779, 7340039, 2099202, 7340039, 3072, 2099202, 4195332, 1051649, 4195332, 3072, 6291462, 3147779, 3072, 3147779, 5243909, 1051649, 7340039, 3072, 3147779, 6291462, 2099202, 1051649, 5243909, 7340039, 2099202, 5243909, 3072, 6291462, 3072, 5243909, 3147779, 2099202, 7340039, 5243909, 3072, 4195332, 6291462, 3147779, 6291462, 2099202, 3072, 6291462, 4195332, 3147779, 3147779, 3072, 5243909, 1051649, 1051649, 5243909, 2099202, 3147779, 5243909, 2099202, 3147779, 5243909, 2099202, 5243909, 3072, 4195332, 5243909, 3072, 7340039, 1051649, 6291462, 2099202, 7340039, 2099202, 5243909, 1051649, 1051649, 5243909, 2099202, 1051649, 4195332, 3072, 5243909, 3147779, 6291462, + 4195332, 1051649, 6291462, 4195332, 5243909, 6291462, 3072, 5243909, 2099202, 1051649, 4195332, 3072, 6291462, 5243909, 1051649, 4195332, 7340039, 2099202, 4195332, 3072, 4195332, 3072, 7340039, 3147779, 6291462, 2099202, 6291462, 3072, 6291462, 4195332, 3072, 5243909, 6291462, 3072, 5243909, 3147779, 5243909, 3072, 6291462, 5243909, 1051649, 6291462, 3147779, 2099202, 3072, 7340039, 1051649, 3147779, 6291462, 4195332, 3072, 5243909, 3147779, 5243909, 1051649, 7340039, 3147779, 6291462, 3147779, 4195332, 1051649, 7340039, 5243909, 3072, 4195332, 1051649, 5243909, 7340039, 3072, 4195332, 6291462, 3147779, 1051649, 3147779, 7340039, 2099202, 5243909, 7340039, 1051649, 6291462, 4195332, 3072, 4195332, 1051649, 7340039, 2099202, 3072, 3147779, 5243909, 4195332, 3147779, 1051649, 6291462, 5243909, 2099202, 7340039, 3147779, 6291462, 2099202, 7340039, 4195332, 3072, 7340039, 6291462, 3072, 7340039, 2099202, 3147779, 7340039, 1051649, 6291462, 2099202, 4195332, 2099202, 5243909, 1051649, 4195332, 3147779, 7340039, 5243909, 3147779, 3147779, 6291462, 2099202, 6291462, 1051649, 7340039, 2099202, + 3147779, 7340039, 2099202, 7340039, 3072, 2099202, 4195332, 1051649, 7340039, 3072, 7340039, 5243909, 1051649, 3147779, 6291462, 3072, 4195332, 6291462, 1051649, 7340039, 2099202, 5243909, 4195332, 3147779, 3072, 6291462, 3147779, 5243909, 1051649, 2099202, 5243909, 1051649, 2099202, 6291462, 1051649, 7340039, 2099202, 4195332, 1051649, 4195332, 2099202, 3072, 5243909, 7340039, 3147779, 5243909, 2099202, 6291462, 2099202, 5243909, 2099202, 6291462, 1051649, 4195332, 5243909, 3072, 5243909, 2099202, 3072, 6291462, 2099202, 5243909, 2099202, 7340039, 3147779, 6291462, 1051649, 4195332, 5243909, 1051649, 6291462, 3072, 7340039, 4195332, 1051649, 4195332, 1051649, 3147779, 4195332, 2099202, 3147779, 7340039, 3147779, 6291462, 2099202, 5243909, 7340039, 1051649, 6291462, 3072, 7340039, 6291462, 3072, 1051649, 5243909, 3072, 4195332, 3072, 5243909, 1051649, 6291462, 3147779, 4195332, 1051649, 4195332, 1051649, 6291462, 5243909, 3072, 4195332, 3147779, 5243909, 3072, 4195332, 7340039, 3147779, 5243909, 3072, 4195332, 1051649, 7340039, 5243909, 3072, 7340039, 3147779, 5243909, 3072, 4195332, + 3072, 5243909, 1051649, 3147779, 4195332, 7340039, 3147779, 5243909, 2099202, 6291462, 3147779, 2099202, 7340039, 2099202, 2099202, 5243909, 3147779, 3072, 5243909, 2099202, 6291462, 1051649, 1051649, 6291462, 5243909, 1051649, 7340039, 3072, 4195332, 7340039, 2099202, 7340039, 3147779, 6291462, 4195332, 3072, 6291462, 2099202, 7340039, 3072, 7340039, 4195332, 2099202, 4195332, 1051649, 3147779, 6291462, 3072, 4195332, 7340039, 3072, 3147779, 7340039, 3072, 3147779, 6291462, 1051649, 7340039, 5243909, 2099202, 7340039, 3072, 4195332, 2099202, 6291462, 3072, 7340039, 2099202, 2099202, 7340039, 2099202, 3147779, 5243909, 1051649, 6291462, 5243909, 3147779, 6291462, 3072, 6291462, 5243909, 3072, 4195332, 1051649, 4195332, 3072, 4195332, 7340039, 2099202, 5243909, 2099202, 4195332, 3147779, 7340039, 3147779, 6291462, 2099202, 7340039, 4195332, 3147779, 1051649, 3072, 6291462, 2099202, 7340039, 5243909, 3147779, 1051649, 3147779, 7340039, 1051649, 7340039, 6291462, 2099202, 3072, 6291462, 1051649, 6291462, 2099202, 6291462, 3072, 2099202, 4195332, 1051649, 4195332, 7340039, 2099202, 6291462, + 6291462, 3147779, 5243909, 6291462, 1051649, 6291462, 1051649, 7340039, 4195332, 3072, 4195332, 5243909, 3072, 4195332, 6291462, 1051649, 7340039, 3147779, 7340039, 3072, 3147779, 7340039, 6291462, 1051649, 3147779, 4195332, 2099202, 5243909, 3147779, 4195332, 1051649, 4195332, 3072, 2099202, 3147779, 7340039, 1051649, 4195332, 3147779, 5243909, 2099202, 6291462, 3072, 7340039, 1051649, 7340039, 3072, 5243909, 1051649, 4195332, 1051649, 6291462, 5243909, 2099202, 7340039, 4195332, 3147779, 4195332, 1051649, 6291462, 3147779, 1051649, 6291462, 1051649, 3147779, 5243909, 2099202, 4195332, 6291462, 1051649, 4195332, 7340039, 3072, 4195332, 2099202, 3072, 7340039, 1051649, 5243909, 2099202, 1051649, 5243909, 6291462, 2099202, 7340039, 3147779, 5243909, 3072, 4195332, 3147779, 1051649, 7340039, 5243909, 3072, 4195332, 1051649, 4195332, 2099202, 3072, 6291462, 5243909, 7340039, 2099202, 4195332, 2099202, 3072, 3147779, 7340039, 5243909, 2099202, 5243909, 3147779, 1051649, 7340039, 4195332, 3147779, 2099202, 4195332, 3147779, 4195332, 2099202, 6291462, 5243909, 2099202, 6291462, 3072, 4195332, 1051649, + 1051649, 4195332, 3072, 2099202, 5243909, 3072, 3147779, 3072, 4195332, 7340039, 3147779, 1051649, 7340039, 3147779, 5243909, 2099202, 5243909, 1051649, 4195332, 5243909, 4195332, 3072, 2099202, 7340039, 5243909, 3072, 6291462, 1051649, 7340039, 3072, 6291462, 3147779, 5243909, 3147779, 5243909, 3072, 5243909, 6291462, 3072, 6291462, 1051649, 3147779, 5243909, 3147779, 6291462, 2099202, 5243909, 4195332, 7340039, 2099202, 5243909, 3147779, 1051649, 5243909, 3072, 2099202, 6291462, 3072, 7340039, 3072, 4195332, 5243909, 3147779, 5243909, 1051649, 6291462, 3072, 6291462, 3072, 5243909, 3072, 3147779, 6291462, 2099202, 7340039, 4195332, 2099202, 7340039, 4195332, 2099202, 7340039, 3147779, 1051649, 6291462, 1051649, 5243909, 1051649, 6291462, 2099202, 6291462, 4195332, 1051649, 2099202, 6291462, 2099202, 7340039, 5243909, 3147779, 5243909, 2099202, 4195332, 1051649, 5243909, 3072, 6291462, 4195332, 6291462, 3072, 2099202, 6291462, 3072, 4195332, 4195332, 1051649, 5243909, 3072, 7340039, 1051649, 7340039, 3072, 7340039, 3147779, 3072, 7340039, 1051649, 5243909, 2099202, 7340039, + 1051649, 5243909, 7340039, 2099202, 6291462, 3147779, 6291462, 5243909, 2099202, 5243909, 3072, 6291462, 3147779, 3072, 1051649, 6291462, 3072, 6291462, 3147779, 1051649, 7340039, 2099202, 4195332, 3072, 2099202, 7340039, 4195332, 3147779, 1051649, 6291462, 2099202, 7340039, 3072, 7340039, 1051649, 6291462, 3147779, 2099202, 4195332, 3147779, 6291462, 1051649, 1051649, 4195332, 1051649, 3147779, 7340039, 2099202, 3072, 6291462, 1051649, 7340039, 2099202, 7340039, 3147779, 5243909, 2099202, 5243909, 3147779, 2099202, 7340039, 3072, 4195332, 7340039, 3072, 4195332, 3147779, 4195332, 2099202, 7340039, 5243909, 1051649, 6291462, 3147779, 1051649, 5243909, 3147779, 3072, 3147779, 6291462, 3072, 6291462, 5243909, 3147779, 4195332, 3072, 7340039, 3147779, 6291462, 3072, 3147779, 6291462, 4195332, 3072, 5243909, 1051649, 3072, 7340039, 1051649, 7340039, 3072, 6291462, 3147779, 4195332, 7340039, 1051649, 2099202, 6291462, 4195332, 4195332, 2099202, 6291462, 3072, 7340039, 3147779, 6291462, 4195332, 5243909, 2099202, 4195332, 5243909, 1051649, 3147779, 4195332, 6291462, 3147779, 3147779, 5243909, + 7340039, 3147779, 3072, 4195332, 1051649, 4195332, 2099202, 1051649, 6291462, 1051649, 4195332, 2099202, 4195332, 7340039, 5243909, 4195332, 3147779, 2099202, 7340039, 3147779, 2099202, 5243909, 6291462, 3147779, 5243909, 1051649, 3072, 6291462, 5243909, 2099202, 4195332, 1051649, 5243909, 2099202, 4195332, 4195332, 1051649, 7340039, 3072, 7340039, 4195332, 5243909, 7340039, 3072, 6291462, 5243909, 1051649, 3147779, 6291462, 2099202, 4195332, 3072, 4195332, 1051649, 4195332, 3072, 7340039, 1051649, 4195332, 6291462, 1051649, 5243909, 1051649, 2099202, 4195332, 7340039, 2099202, 7340039, 3147779, 1051649, 4195332, 4195332, 3072, 5243909, 1051649, 6291462, 5243909, 6291462, 5243909, 1051649, 4195332, 2099202, 3072, 2099202, 7340039, 4195332, 2099202, 3072, 5243909, 2099202, 7340039, 1051649, 3147779, 7340039, 3147779, 6291462, 3147779, 6291462, 4195332, 3147779, 6291462, 2099202, 7340039, 1051649, 2099202, 5243909, 3147779, 1051649, 7340039, 1051649, 5243909, 2099202, 4195332, 5243909, 3072, 2099202, 3072, 2099202, 6291462, 1051649, 3072, 6291462, 7340039, 3072, 2099202, 6291462, 3072, 3147779, + 3072, 5243909, 2099202, 6291462, 7340039, 3072, 7340039, 5243909, 3147779, 6291462, 2099202, 7340039, 5243909, 1051649, 2099202, 3072, 7340039, 4195332, 3072, 6291462, 3072, 5243909, 1051649, 7340039, 3147779, 6291462, 5243909, 2099202, 3072, 5243909, 3072, 7340039, 4195332, 6291462, 3072, 7340039, 2099202, 4195332, 5243909, 2099202, 3072, 2099202, 6291462, 4195332, 2099202, 3072, 6291462, 4195332, 1051649, 5243909, 3147779, 6291462, 3147779, 7340039, 2099202, 6291462, 3147779, 5243909, 3072, 4195332, 3147779, 7340039, 3147779, 6291462, 3147779, 1051649, 6291462, 3072, 5243909, 3147779, 6291462, 2099202, 7340039, 3147779, 7340039, 3072, 3147779, 2099202, 1051649, 7340039, 3147779, 7340039, 4195332, 5243909, 1051649, 3147779, 6291462, 3147779, 4195332, 5243909, 2099202, 5243909, 3072, 6291462, 1051649, 5243909, 1051649, 2099202, 3072, 5243909, 1051649, 5243909, 3072, 3147779, 6291462, 3072, 7340039, 5243909, 3072, 6291462, 3147779, 7340039, 1051649, 6291462, 3147779, 7340039, 5243909, 6291462, 3147779, 5243909, 7340039, 2099202, 4195332, 3147779, 5243909, 1051649, 7340039, 4195332, + 2099202, 6291462, 3147779, 1051649, 3147779, 2099202, 5243909, 2099202, 3072, 7340039, 1051649, 3147779, 3072, 6291462, 4195332, 6291462, 3147779, 1051649, 5243909, 2099202, 7340039, 1051649, 4195332, 3072, 4195332, 1051649, 3147779, 7340039, 4195332, 3147779, 6291462, 2099202, 3147779, 1051649, 3147779, 5243909, 3072, 6291462, 1051649, 7340039, 3147779, 5243909, 3072, 3147779, 7340039, 5243909, 2099202, 3147779, 7340039, 3072, 5243909, 1051649, 6291462, 1051649, 5243909, 3072, 2099202, 4195332, 7340039, 1051649, 6291462, 3072, 5243909, 1051649, 5243909, 4195332, 2099202, 4195332, 1051649, 7340039, 3072, 2099202, 5243909, 3072, 2099202, 4195332, 1051649, 7340039, 6291462, 1051649, 4195332, 2099202, 1051649, 6291462, 3072, 7340039, 1051649, 7340039, 1051649, 3072, 7340039, 3147779, 4195332, 2099202, 7340039, 3147779, 7340039, 4195332, 2099202, 7340039, 3147779, 4195332, 6291462, 1051649, 5243909, 3147779, 2099202, 4195332, 3147779, 4195332, 3072, 5243909, 1051649, 3147779, 2099202, 4195332, 1051649, 3147779, 3072, 2099202, 3147779, 5243909, 1051649, 7340039, 2099202, 5243909, 1051649, 4195332, + 6291462, 3072, 7340039, 4195332, 6291462, 4195332, 3072, 7340039, 4195332, 4195332, 1051649, 6291462, 3147779, 7340039, 2099202, 1051649, 6291462, 5243909, 3147779, 4195332, 3147779, 6291462, 3147779, 6291462, 2099202, 7340039, 4195332, 3072, 7340039, 1051649, 5243909, 3072, 6291462, 7340039, 4195332, 2099202, 7340039, 3147779, 5243909, 6291462, 1051649, 2099202, 6291462, 4195332, 1051649, 3147779, 7340039, 3072, 4195332, 5243909, 2099202, 6291462, 3072, 3147779, 4195332, 7340039, 6291462, 1051649, 4195332, 2099202, 5243909, 2099202, 6291462, 3072, 7340039, 3072, 6291462, 2099202, 5243909, 4195332, 6291462, 3147779, 6291462, 4195332, 6291462, 5243909, 3072, 3147779, 4195332, 5243909, 3072, 6291462, 4195332, 5243909, 3147779, 4195332, 5243909, 2099202, 4195332, 6291462, 2099202, 5243909, 1051649, 6291462, 2099202, 3072, 5243909, 2099202, 6291462, 3147779, 1051649, 5243909, 2099202, 7340039, 1051649, 6291462, 4195332, 1051649, 6291462, 1051649, 7340039, 2099202, 7340039, 5243909, 6291462, 3072, 6291462, 7340039, 4195332, 7340039, 3072, 4195332, 1051649, 6291462, 3072, 4195332, 7340039, 2099202, + 4195332, 5243909, 1051649, 5243909, 3072, 3147779, 5243909, 1051649, 6291462, 2099202, 5243909, 2099202, 5243909, 3072, 4195332, 5243909, 2099202, 3072, 7340039, 1051649, 6291462, 3072, 5243909, 1051649, 2099202, 5243909, 1051649, 5243909, 2099202, 4195332, 3147779, 7340039, 2099202, 3072, 3147779, 5243909, 1051649, 4195332, 2099202, 3072, 4195332, 7340039, 4195332, 1051649, 5243909, 3072, 4195332, 6291462, 2099202, 7340039, 1051649, 4195332, 5243909, 7340039, 2099202, 3072, 5243909, 3147779, 6291462, 1051649, 7340039, 4195332, 3147779, 3147779, 2099202, 5243909, 3147779, 7340039, 3072, 3147779, 1051649, 5243909, 3072, 2099202, 1051649, 6291462, 2099202, 7340039, 3072, 3147779, 7340039, 3072, 3147779, 2099202, 6291462, 3072, 1051649, 7340039, 3072, 3147779, 1051649, 7340039, 3072, 5243909, 3147779, 5243909, 3072, 7340039, 3072, 4195332, 7340039, 3072, 4195332, 3147779, 4195332, 3072, 3147779, 7340039, 3072, 5243909, 3147779, 3072, 4195332, 3072, 3147779, 7340039, 2099202, 1051649, 4195332, 1051649, 6291462, 3147779, 6291462, 3147779, 2099202, 6291462, 1051649, 3147779, + 3072, 3147779, 2099202, 7340039, 2099202, 6291462, 3072, 4195332, 1051649, 7340039, 3072, 3147779, 7340039, 3147779, 7340039, 3072, 3147779, 5243909, 2099202, 4195332, 2099202, 3147779, 7340039, 4195332, 6291462, 3072, 7340039, 3147779, 3072, 6291462, 1051649, 1051649, 5243909, 4195332, 1051649, 6291462, 6291462, 3072, 7340039, 3147779, 5243909, 1051649, 3072, 7340039, 3147779, 6291462, 3147779, 1051649, 5243909, 3147779, 6291462, 2099202, 1051649, 3147779, 4195332, 6291462, 2099202, 1051649, 6291462, 3072, 3147779, 3072, 6291462, 7340039, 1051649, 6291462, 1051649, 2099202, 6291462, 1051649, 7340039, 4195332, 5243909, 7340039, 4195332, 3072, 5243909, 2099202, 6291462, 4195332, 2099202, 5243909, 7340039, 3072, 4195332, 7340039, 5243909, 3147779, 4195332, 6291462, 2099202, 4195332, 4195332, 1051649, 7340039, 2099202, 4195332, 5243909, 3147779, 1051649, 6291462, 2099202, 5243909, 3072, 6291462, 2099202, 5243909, 2099202, 4195332, 2099202, 6291462, 2099202, 6291462, 3147779, 5243909, 1051649, 4195332, 5243909, 6291462, 5243909, 3072, 4195332, 1051649, 5243909, 7340039, 3072, 5243909, 6291462, + 7340039, 5243909, 4195332, 1051649, 5243909, 3147779, 7340039, 3147779, 5243909, 3147779, 4195332, 6291462, 1051649, 4195332, 1051649, 5243909, 6291462, 1051649, 7340039, 3072, 6291462, 5243909, 3072, 2099202, 3147779, 4195332, 2099202, 6291462, 3147779, 4195332, 7340039, 5243909, 2099202, 7340039, 4195332, 2099202, 2099202, 4195332, 1051649, 6291462, 3147779, 5243909, 2099202, 5243909, 2099202, 1051649, 5243909, 7340039, 3072, 4195332, 3072, 7340039, 3147779, 6291462, 3072, 3147779, 7340039, 4195332, 5243909, 2099202, 7340039, 4195332, 1051649, 3147779, 4195332, 2099202, 4195332, 5243909, 3147779, 5243909, 2099202, 3072, 3147779, 1051649, 3147779, 7340039, 3147779, 5243909, 1051649, 5243909, 1051649, 6291462, 2099202, 5243909, 2099202, 3147779, 1051649, 5243909, 1051649, 6291462, 3072, 7340039, 3147779, 6291462, 3147779, 3072, 6291462, 2099202, 6291462, 1051649, 4195332, 5243909, 2099202, 7340039, 1051649, 7340039, 3147779, 3072, 7340039, 5243909, 1051649, 5243909, 1051649, 7340039, 2099202, 6291462, 3072, 3147779, 1051649, 2099202, 7340039, 5243909, 3072, 3147779, 1051649, 5243909, 3147779, 2099202, + 3072, 6291462, 1051649, 6291462, 4195332, 2099202, 1051649, 6291462, 3072, 6291462, 2099202, 3072, 5243909, 6291462, 2099202, 7340039, 3072, 3147779, 4195332, 5243909, 1051649, 3147779, 5243909, 7340039, 1051649, 6291462, 4195332, 3072, 7340039, 1051649, 3147779, 3072, 3147779, 1051649, 6291462, 3072, 5243909, 3147779, 5243909, 2099202, 3072, 7340039, 1051649, 6291462, 4195332, 6291462, 2099202, 1051649, 4195332, 7340039, 2099202, 5243909, 3072, 5243909, 2099202, 5243909, 3072, 6291462, 1051649, 3147779, 5243909, 2099202, 6291462, 3072, 7340039, 3147779, 7340039, 3072, 7340039, 3072, 4195332, 7340039, 6291462, 6291462, 1051649, 4195332, 3072, 2099202, 3147779, 7340039, 3072, 4195332, 1051649, 4195332, 3072, 6291462, 6291462, 3072, 7340039, 1051649, 3147779, 5243909, 2099202, 1051649, 4195332, 7340039, 1051649, 7340039, 3072, 3147779, 7340039, 3072, 6291462, 3147779, 4195332, 1051649, 5243909, 6291462, 3147779, 1051649, 7340039, 4195332, 4195332, 3072, 4195332, 3147779, 7340039, 4195332, 7340039, 3072, 3147779, 2099202, 6291462, 4195332, 7340039, 3147779, 1051649, 5243909, + 2099202, 3147779, 7340039, 2099202, 3072, 6291462, 4195332, 3147779, 5243909, 1051649, 4195332, 7340039, 2099202, 4195332, 3072, 3147779, 4195332, 7340039, 1051649, 2099202, 6291462, 2099202, 3072, 5243909, 3147779, 1051649, 6291462, 5243909, 2099202, 5243909, 6291462, 3147779, 6291462, 5243909, 3147779, 7340039, 3072, 7340039, 1051649, 6291462, 3147779, 4195332, 3147779, 7340039, 3072, 3147779, 5243909, 3147779, 6291462, 2099202, 5243909, 1051649, 4195332, 1051649, 7340039, 3147779, 1051649, 2099202, 7340039, 4195332, 3072, 7340039, 1051649, 4195332, 5243909, 3072, 5243909, 1051649, 3147779, 5243909, 2099202, 1051649, 3072, 4195332, 2099202, 5243909, 7340039, 6291462, 4195332, 3147779, 6291462, 2099202, 7340039, 3147779, 7340039, 1051649, 3147779, 4195332, 2099202, 6291462, 4195332, 3072, 5243909, 6291462, 3072, 4195332, 2099202, 4195332, 3147779, 5243909, 2099202, 4195332, 3147779, 1051649, 6291462, 5243909, 2099202, 4195332, 3072, 6291462, 3147779, 3072, 7340039, 2099202, 6291462, 1051649, 2099202, 3072, 5243909, 3147779, 7340039, 5243909, 1051649, 6291462, 2099202, 3072, 4195332, 7340039, + 6291462, 3072, 4195332, 3147779, 5243909, 1051649, 7340039, 3072, 7340039, 5243909, 3147779, 3072, 5243909, 1051649, 6291462, 5243909, 1051649, 3147779, 6291462, 5243909, 4195332, 7340039, 4195332, 2099202, 4195332, 7340039, 3072, 2099202, 4195332, 3072, 4195332, 1051649, 5243909, 3072, 2099202, 5243909, 2099202, 3147779, 4195332, 2099202, 7340039, 3072, 5243909, 2099202, 4195332, 7340039, 3072, 4195332, 1051649, 3072, 6291462, 3147779, 7340039, 4195332, 1051649, 6291462, 5243909, 4195332, 2099202, 6291462, 1051649, 4195332, 5243909, 2099202, 6291462, 1051649, 4195332, 6291462, 2099202, 4195332, 6291462, 7340039, 4195332, 3147779, 7340039, 3072, 3147779, 1051649, 3072, 6291462, 1051649, 5243909, 3072, 6291462, 2099202, 5243909, 6291462, 2099202, 5243909, 3072, 3147779, 7340039, 2099202, 4195332, 6291462, 2099202, 5243909, 1051649, 6291462, 1051649, 7340039, 5243909, 3072, 7340039, 3147779, 3072, 7340039, 1051649, 5243909, 4195332, 2099202, 5243909, 1051649, 5243909, 2099202, 5243909, 4195332, 6291462, 4195332, 1051649, 2099202, 4195332, 2099202, 3072, 5243909, 6291462, 4195332, 1051649, + 4195332, 1051649, 5243909, 1051649, 7340039, 4195332, 2099202, 3147779, 2099202, 4195332, 2099202, 7340039, 3147779, 5243909, 2099202, 7340039, 2099202, 6291462, 3072, 2099202, 3072, 3147779, 1051649, 7340039, 3072, 5243909, 3147779, 7340039, 1051649, 6291462, 2099202, 7340039, 1051649, 7340039, 4195332, 7340039, 1051649, 6291462, 3072, 5243909, 4195332, 1051649, 6291462, 3072, 3147779, 1051649, 6291462, 2099202, 7340039, 5243909, 3147779, 3072, 3147779, 6291462, 2099202, 4195332, 3072, 7340039, 3072, 3147779, 3147779, 1051649, 7340039, 3072, 3147779, 7340039, 3147779, 2099202, 6291462, 3072, 3147779, 1051649, 2099202, 5243909, 1051649, 5243909, 2099202, 4195332, 5243909, 2099202, 7340039, 3147779, 5243909, 1051649, 4195332, 3072, 3147779, 5243909, 3072, 7340039, 4195332, 1051649, 5243909, 1051649, 3147779, 7340039, 3072, 6291462, 2099202, 4195332, 3072, 3147779, 5243909, 4195332, 2099202, 5243909, 3147779, 6291462, 2099202, 1051649, 6291462, 3147779, 7340039, 3072, 6291462, 3072, 7340039, 2099202, 1051649, 5243909, 6291462, 3072, 7340039, 4195332, 3147779, 1051649, 7340039, 3147779, + 7340039, 6291462, 3147779, 7340039, 2099202, 3072, 5243909, 6291462, 3072, 6291462, 1051649, 6291462, 3072, 2099202, 4195332, 3072, 4195332, 1051649, 7340039, 4195332, 7340039, 6291462, 5243909, 1051649, 6291462, 2099202, 6291462, 1051649, 5243909, 4195332, 3072, 3147779, 6291462, 2099202, 4195332, 3072, 4195332, 4195332, 2099202, 6291462, 1051649, 4195332, 3147779, 6291462, 7340039, 4195332, 2099202, 6291462, 3072, 6291462, 1051649, 7340039, 4195332, 3072, 5243909, 7340039, 1051649, 3147779, 5243909, 6291462, 5243909, 4195332, 2099202, 6291462, 1051649, 5243909, 3072, 7340039, 1051649, 5243909, 6291462, 5243909, 6291462, 1051649, 7340039, 3147779, 6291462, 3072, 7340039, 2099202, 4195332, 1051649, 6291462, 3147779, 7340039, 5243909, 1051649, 7340039, 2099202, 5243909, 2099202, 6291462, 3072, 7340039, 4195332, 3147779, 5243909, 3147779, 1051649, 7340039, 6291462, 2099202, 7340039, 1051649, 7340039, 4195332, 1051649, 3072, 4195332, 7340039, 5243909, 3072, 3147779, 2099202, 4195332, 5243909, 1051649, 3147779, 7340039, 3072, 3147779, 6291462, 4195332, 3072, 7340039, 2099202, 5243909, 3072, + 2099202, 3072, 5243909, 1051649, 4195332, 6291462, 3147779, 1051649, 7340039, 3147779, 5243909, 3147779, 1051649, 7340039, 6291462, 3147779, 6291462, 5243909, 1051649, 4195332, 2099202, 3072, 3147779, 7340039, 4195332, 3072, 3147779, 5243909, 2099202, 7340039, 3147779, 6291462, 1051649, 5243909, 2099202, 6291462, 1051649, 7340039, 3072, 3147779, 7340039, 5243909, 3072, 5243909, 2099202, 3072, 5243909, 3147779, 4195332, 4195332, 2099202, 5243909, 2099202, 6291462, 1051649, 2099202, 4195332, 6291462, 1051649, 2099202, 3072, 7340039, 2099202, 3147779, 6291462, 2099202, 5243909, 4195332, 4195332, 1051649, 2099202, 3072, 7340039, 4195332, 3072, 6291462, 3147779, 4195332, 1051649, 5243909, 3072, 7340039, 1051649, 4195332, 3072, 3147779, 2099202, 6291462, 4195332, 1051649, 7340039, 3147779, 4195332, 2099202, 3072, 6291462, 1051649, 6291462, 3072, 4195332, 1051649, 5243909, 2099202, 4195332, 3072, 2099202, 6291462, 3147779, 6291462, 3072, 2099202, 7340039, 4195332, 6291462, 2099202, 7340039, 3147779, 5243909, 2099202, 6291462, 5243909, 1051649, 2099202, 5243909, 4195332, 2099202, 6291462, 3147779, + 7340039, 2099202, 4195332, 6291462, 2099202, 3072, 6291462, 4195332, 2099202, 5243909, 3072, 7340039, 4195332, 3147779, 1051649, 4195332, 3072, 5243909, 1051649, 3147779, 6291462, 2099202, 5243909, 1051649, 3147779, 4195332, 7340039, 3072, 4195332, 1051649, 5243909, 1051649, 4195332, 6291462, 3072, 1051649, 5243909, 3147779, 6291462, 5243909, 2099202, 1051649, 7340039, 1051649, 6291462, 3147779, 7340039, 1051649, 7340039, 1051649, 6291462, 3072, 7340039, 4195332, 3147779, 7340039, 3072, 3147779, 5243909, 7340039, 4195332, 1051649, 5243909, 3072, 4195332, 7340039, 3072, 2099202, 7340039, 3147779, 6291462, 3147779, 2099202, 3147779, 5243909, 2099202, 1051649, 7340039, 3147779, 4195332, 2099202, 5243909, 3147779, 7340039, 2099202, 6291462, 4195332, 3072, 3147779, 5243909, 3072, 5243909, 1051649, 6291462, 5243909, 2099202, 7340039, 2099202, 4195332, 7340039, 3147779, 6291462, 3072, 6291462, 3147779, 7340039, 1051649, 5243909, 2099202, 4195332, 5243909, 3147779, 1051649, 3072, 5243909, 1051649, 6291462, 3072, 4195332, 3147779, 3072, 7340039, 6291462, 3147779, 1051649, 6291462, 3072, 5243909, + 1051649, 3147779, 7340039, 3072, 5243909, 7340039, 2099202, 4195332, 1051649, 7340039, 4195332, 1051649, 6291462, 3072, 6291462, 2099202, 7340039, 3147779, 7340039, 3072, 5243909, 4195332, 1051649, 7340039, 5243909, 1051649, 6291462, 3147779, 6291462, 2099202, 4195332, 3147779, 7340039, 2099202, 7340039, 3147779, 6291462, 3072, 3147779, 2099202, 4195332, 6291462, 3147779, 4195332, 3072, 5243909, 1051649, 5243909, 3147779, 7340039, 2099202, 4195332, 3147779, 3072, 6291462, 1051649, 3147779, 5243909, 3072, 2099202, 3147779, 6291462, 2099202, 7340039, 3147779, 1051649, 4195332, 6291462, 3072, 5243909, 1051649, 7340039, 5243909, 3072, 6291462, 4195332, 5243909, 3072, 6291462, 1051649, 7340039, 2099202, 3072, 6291462, 1051649, 5243909, 2099202, 7340039, 4195332, 3147779, 6291462, 2099202, 7340039, 3072, 3147779, 4195332, 1051649, 5243909, 3072, 5243909, 3072, 3147779, 5243909, 1051649, 5243909, 4195332, 2099202, 6291462, 3072, 7340039, 1051649, 3147779, 7340039, 4195332, 3147779, 6291462, 2099202, 4195332, 1051649, 6291462, 2099202, 4195332, 1051649, 3072, 5243909, 3147779, 1051649, 5243909, + 4195332, 1051649, 4195332, 2099202, 3147779, 1051649, 7340039, 3072, 3147779, 6291462, 2099202, 5243909, 2099202, 5243909, 1051649, 5243909, 3072, 6291462, 2099202, 4195332, 2099202, 6291462, 3147779, 4195332, 3072, 6291462, 2099202, 2099202, 3072, 7340039, 3072, 6291462, 3072, 3147779, 4195332, 5243909, 1051649, 4195332, 7340039, 3072, 7340039, 3072, 2099202, 7340039, 2099202, 4195332, 6291462, 2099202, 3072, 5243909, 1051649, 1051649, 6291462, 2099202, 5243909, 4195332, 6291462, 2099202, 7340039, 4195332, 6291462, 3072, 4195332, 5243909, 3072, 6291462, 5243909, 3147779, 2099202, 6291462, 4195332, 2099202, 4195332, 3147779, 1051649, 7340039, 2099202, 4195332, 3147779, 5243909, 3072, 5243909, 6291462, 2099202, 4195332, 3072, 6291462, 1051649, 1051649, 6291462, 1051649, 4195332, 3147779, 5243909, 1051649, 7340039, 3072, 6291462, 3147779, 2099202, 6291462, 6291462, 1051649, 3147779, 7340039, 3072, 6291462, 4195332, 2099202, 5243909, 1051649, 5243909, 3072, 6291462, 2099202, 3072, 6291462, 1051649, 7340039, 5243909, 3072, 5243909, 7340039, 4195332, 7340039, 2099202, 6291462, 3147779, + 3072, 6291462, 2099202, 5243909, 6291462, 4195332, 3147779, 5243909, 6291462, 3072, 4195332, 1051649, 7340039, 3147779, 4195332, 7340039, 2099202, 3147779, 3072, 7340039, 3147779, 3072, 6291462, 2099202, 7340039, 3147779, 4195332, 7340039, 5243909, 3147779, 4195332, 1051649, 5243909, 7340039, 2099202, 3072, 5243909, 2099202, 6291462, 2099202, 3147779, 5243909, 6291462, 1051649, 5243909, 3072, 7340039, 2099202, 4195332, 7340039, 3147779, 5243909, 3147779, 7340039, 3072, 2099202, 1051649, 5243909, 3072, 4195332, 1051649, 7340039, 3147779, 6291462, 1051649, 3147779, 1051649, 7340039, 4195332, 2099202, 3072, 7340039, 3072, 5243909, 6291462, 3072, 3147779, 1051649, 7340039, 2099202, 6291462, 3147779, 1051649, 5243909, 7340039, 3147779, 4195332, 7340039, 5243909, 2099202, 7340039, 3072, 7340039, 4195332, 6291462, 3147779, 2099202, 4195332, 2099202, 7340039, 3147779, 3072, 4195332, 5243909, 1051649, 4195332, 3147779, 1051649, 7340039, 3147779, 6291462, 2099202, 4195332, 3147779, 7340039, 4195332, 3147779, 4195332, 3147779, 3147779, 7340039, 2099202, 1051649, 3147779, 3072, 4195332, 1051649, 7340039, + 5243909, 4195332, 7340039, 3072, 2099202, 1051649, 5243909, 3072, 3147779, 7340039, 5243909, 1051649, 4195332, 3072, 4195332, 1051649, 3147779, 6291462, 5243909, 1051649, 4195332, 7340039, 3072, 5243909, 1051649, 6291462, 3072, 5243909, 1051649, 2099202, 6291462, 2099202, 5243909, 1051649, 4195332, 6291462, 3147779, 7340039, 1051649, 5243909, 1051649, 5243909, 1051649, 4195332, 4195332, 3147779, 1051649, 5243909, 3072, 4195332, 3072, 6291462, 1051649, 2099202, 5243909, 6291462, 7340039, 3147779, 7340039, 2099202, 3147779, 5243909, 1051649, 2099202, 5243909, 7340039, 2099202, 4195332, 3072, 6291462, 5243909, 2099202, 6291462, 1051649, 2099202, 5243909, 6291462, 5243909, 3072, 4195332, 1051649, 4195332, 7340039, 3072, 3147779, 1051649, 5243909, 3072, 3147779, 1051649, 5243909, 3147779, 2099202, 3072, 2099202, 6291462, 5243909, 7340039, 3072, 4195332, 1051649, 7340039, 1051649, 6291462, 3147779, 7340039, 2099202, 5243909, 3072, 4195332, 3072, 7340039, 5243909, 1051649, 5243909, 2099202, 7340039, 3072, 6291462, 1051649, 3072, 6291462, 4195332, 6291462, 2099202, 7340039, 5243909, 2099202, + 1051649, 3072, 3147779, 4195332, 7340039, 6291462, 2099202, 7340039, 2099202, 1051649, 2099202, 6291462, 3147779, 7340039, 2099202, 6291462, 5243909, 1051649, 4195332, 6291462, 2099202, 3147779, 5243909, 2099202, 4195332, 1051649, 7340039, 2099202, 4195332, 5243909, 3072, 7340039, 2099202, 3147779, 7340039, 1051649, 5243909, 3147779, 1051649, 7340039, 4195332, 2099202, 3147779, 7340039, 2099202, 6291462, 3147779, 4195332, 6291462, 2099202, 5243909, 2099202, 4195332, 7340039, 3147779, 3072, 1051649, 4195332, 1051649, 6291462, 3072, 4195332, 7340039, 4195332, 3072, 6291462, 3072, 7340039, 3147779, 4195332, 1051649, 3147779, 4195332, 3147779, 7340039, 1051649, 3147779, 2099202, 7340039, 4195332, 6291462, 3072, 2099202, 4195332, 6291462, 2099202, 7340039, 2099202, 6291462, 4195332, 3072, 5243909, 6291462, 2099202, 5243909, 3072, 3147779, 1051649, 5243909, 3147779, 5243909, 2099202, 6291462, 2099202, 2099202, 3072, 6291462, 3147779, 7340039, 1051649, 5243909, 3147779, 3072, 7340039, 1051649, 6291462, 3072, 5243909, 2099202, 5243909, 4195332, 2099202, 1051649, 3147779, 5243909, 3147779, 3072, 6291462, + 3147779, 7340039, 5243909, 3072, 3147779, 1051649, 4195332, 3072, 5243909, 6291462, 4195332, 3072, 7340039, 1051649, 5243909, 3147779, 3072, 7340039, 2099202, 3072, 7340039, 1051649, 7340039, 3072, 6291462, 4195332, 3147779, 6291462, 3072, 7340039, 3147779, 5243909, 3072, 6291462, 2099202, 4195332, 3072, 6291462, 3147779, 3072, 6291462, 3072, 6291462, 3147779, 3072, 6291462, 3072, 7340039, 1051649, 3147779, 6291462, 3072, 6291462, 1051649, 5243909, 4195332, 6291462, 3147779, 5243909, 2099202, 6291462, 3147779, 3072, 6291462, 3147779, 4195332, 2099202, 5243909, 1051649, 7340039, 6291462, 1051649, 7340039, 3072, 4195332, 3147779, 7340039, 3072, 4195332, 1051649, 2099202, 7340039, 3147779, 6291462, 3072, 2099202, 4195332, 3072, 7340039, 1051649, 6291462, 3147779, 1051649, 6291462, 4195332, 7340039, 3147779, 6291462, 1051649, 7340039, 1051649, 4195332, 3072, 4195332, 7340039, 4195332, 5243909, 1051649, 4195332, 6291462, 2099202, 2099202, 6291462, 4195332, 3147779, 4195332, 2099202, 7340039, 4195332, 1051649, 7340039, 3147779, 7340039, 3072, 6291462, 1051649, 7340039, 4195332, + 1051649, 4195332, 2099202, 6291462, 3147779, 5243909, 6291462, 4195332, 3147779, 1051649, 6291462, 4195332, 2099202, 5243909, 3072, 4195332, 6291462, 2099202, 4195332, 3147779, 5243909, 1051649, 3147779, 5243909, 2099202, 3072, 5243909, 1051649, 5243909, 3147779, 1051649, 6291462, 4195332, 3072, 7340039, 2099202, 6291462, 2099202, 7340039, 4195332, 3147779, 5243909, 1051649, 6291462, 5243909, 2099202, 3147779, 1051649, 4195332, 7340039, 3147779, 4195332, 3147779, 3072, 7340039, 2099202, 3072, 7340039, 3072, 5243909, 1051649, 5243909, 2099202, 6291462, 1051649, 7340039, 3147779, 1051649, 5243909, 3072, 2099202, 5243909, 2099202, 5243909, 1051649, 5243909, 1051649, 6291462, 3147779, 6291462, 5243909, 3147779, 1051649, 5243909, 4195332, 7340039, 3147779, 5243909, 3147779, 4195332, 2099202, 7340039, 4195332, 3072, 2099202, 1051649, 5243909, 3072, 4195332, 2099202, 5243909, 6291462, 3147779, 7340039, 1051649, 3072, 6291462, 2099202, 7340039, 3072, 4195332, 6291462, 1051649, 2099202, 7340039, 3072, 5243909, 1051649, 3147779, 6291462, 3072, 3147779, 5243909, 4195332, 2099202, 5243909, 2099202, 6291462, + 7340039, 2099202, 6291462, 1051649, 1051649, 7340039, 2099202, 1051649, 7340039, 5243909, 3072, 3147779, 6291462, 2099202, 6291462, 3147779, 1051649, 5243909, 3072, 7340039, 2099202, 5243909, 6291462, 1051649, 7340039, 4195332, 3147779, 6291462, 2099202, 7340039, 2099202, 4195332, 1051649, 3147779, 5243909, 1051649, 4195332, 5243909, 3072, 2099202, 1051649, 7340039, 4195332, 3072, 4195332, 1051649, 7340039, 5243909, 3072, 5243909, 1051649, 7340039, 6291462, 2099202, 5243909, 3147779, 4195332, 2099202, 5243909, 2099202, 4195332, 7340039, 2099202, 4195332, 5243909, 3072, 5243909, 2099202, 6291462, 4195332, 3147779, 7340039, 4195332, 3072, 6291462, 2099202, 7340039, 2099202, 5243909, 1051649, 3072, 5243909, 7340039, 1051649, 6291462, 3072, 5243909, 1051649, 6291462, 3072, 5243909, 1051649, 4195332, 6291462, 7340039, 3147779, 4195332, 2099202, 7340039, 5243909, 3072, 3147779, 1051649, 5243909, 3147779, 3147779, 7340039, 1051649, 3147779, 5243909, 1051649, 3147779, 5243909, 6291462, 1051649, 5243909, 2099202, 7340039, 5243909, 2099202, 5243909, 6291462, 1051649, 2099202, 7340039, 3147779, 4195332, 3072, + 4195332, 3072, 3147779, 5243909, 5243909, 3072, 3147779, 6291462, 3072, 2099202, 7340039, 3147779, 1051649, 7340039, 1051649, 3147779, 7340039, 3147779, 6291462, 2099202, 4195332, 3072, 4195332, 4195332, 2099202, 1051649, 7340039, 3072, 4195332, 1051649, 5243909, 3072, 7340039, 6291462, 3147779, 7340039, 3072, 3147779, 4195332, 6291462, 5243909, 3147779, 1051649, 7340039, 3147779, 5243909, 3147779, 2099202, 6291462, 1051649, 5243909, 3072, 2099202, 4195332, 6291462, 3072, 6291462, 1051649, 3147779, 7340039, 3147779, 3072, 6291462, 3072, 7340039, 3147779, 2099202, 7340039, 3147779, 1051649, 7340039, 1051649, 4195332, 7340039, 3147779, 5243909, 3072, 4195332, 3072, 6291462, 3147779, 4195332, 2099202, 4195332, 1051649, 2099202, 7340039, 2099202, 4195332, 6291462, 1051649, 7340039, 2099202, 3147779, 1051649, 5243909, 7340039, 3072, 3147779, 1051649, 7340039, 2099202, 6291462, 2099202, 6291462, 5243909, 3072, 4195332, 5243909, 2099202, 7340039, 4195332, 3072, 4195332, 3147779, 6291462, 3147779, 3072, 4195332, 1051649, 7340039, 3072, 4195332, 5243909, 3072, 6291462, 1051649, 5243909, + 2099202, 7340039, 6291462, 3072, 3147779, 7340039, 5243909, 2099202, 4195332, 6291462, 1051649, 5243909, 5243909, 3072, 4195332, 5243909, 3072, 4195332, 1051649, 6291462, 3147779, 6291462, 1051649, 7340039, 3072, 5243909, 2099202, 4195332, 6291462, 1051649, 6291462, 3147779, 5243909, 2099202, 1051649, 4195332, 6291462, 1051649, 5243909, 2099202, 3072, 7340039, 2099202, 4195332, 3072, 6291462, 1051649, 7340039, 3147779, 4195332, 3147779, 7340039, 5243909, 3147779, 1051649, 5243909, 1051649, 7340039, 4195332, 3072, 6291462, 1051649, 4195332, 3147779, 1051649, 6291462, 4195332, 3072, 4195332, 6291462, 3072, 5243909, 2099202, 3072, 4195332, 1051649, 6291462, 4195332, 7340039, 2099202, 7340039, 3072, 6291462, 3147779, 6291462, 4195332, 3147779, 3072, 5243909, 2099202, 3147779, 5243909, 3072, 6291462, 4195332, 3072, 2099202, 3147779, 6291462, 4195332, 2099202, 6291462, 3072, 4195332, 3072, 4195332, 2099202, 6291462, 3072, 6291462, 3147779, 1051649, 7340039, 1051649, 6291462, 3072, 7340039, 4195332, 6291462, 3072, 3147779, 6291462, 3147779, 1051649, 7340039, 2099202, 6291462, 3147779, + 5243909, 2099202, 1051649, 6291462, 4195332, 2099202, 3072, 7340039, 1051649, 4195332, 3072, 4195332, 2099202, 7340039, 4195332, 2099202, 7340039, 2099202, 5243909, 3072, 4195332, 1051649, 5243909, 3147779, 5243909, 3147779, 6291462, 3147779, 3072, 4195332, 3147779, 6291462, 3072, 7340039, 1051649, 6291462, 2099202, 7340039, 3072, 7340039, 4195332, 1051649, 5243909, 6291462, 2099202, 4195332, 2099202, 5243909, 3072, 7340039, 1051649, 2099202, 3072, 7340039, 2099202, 4195332, 6291462, 3147779, 1051649, 5243909, 2099202, 7340039, 2099202, 6291462, 3147779, 3072, 5243909, 6291462, 1051649, 2099202, 5243909, 3147779, 6291462, 3147779, 6291462, 4195332, 2099202, 3147779, 1051649, 5243909, 1051649, 5243909, 3147779, 5243909, 3072, 1051649, 7340039, 3147779, 6291462, 3072, 7340039, 3147779, 5243909, 2099202, 7340039, 4195332, 7340039, 6291462, 1051649, 5243909, 3072, 4195332, 5243909, 3147779, 7340039, 1051649, 7340039, 2099202, 7340039, 2099202, 3072, 5243909, 2099202, 4195332, 2099202, 5243909, 1051649, 2099202, 3147779, 6291462, 2099202, 3072, 7340039, 4195332, 5243909, 3072, 3147779, 1051649, + 3072, 7340039, 4195332, 3147779, 1051649, 6291462, 3147779, 5243909, 3147779, 5243909, 7340039, 1051649, 6291462, 3147779, 1051649, 6291462, 3072, 6291462, 4195332, 7340039, 6291462, 2099202, 7340039, 2099202, 1051649, 7340039, 3072, 2099202, 5243909, 7340039, 1051649, 2099202, 4195332, 4195332, 5243909, 3072, 4195332, 2099202, 5243909, 3147779, 3147779, 6291462, 3072, 2099202, 7340039, 3147779, 6291462, 1051649, 4195332, 2099202, 5243909, 6291462, 4195332, 6291462, 3072, 7340039, 2099202, 3072, 7340039, 5243909, 1051649, 4195332, 5243909, 1051649, 7340039, 4195332, 3147779, 1051649, 6291462, 4195332, 1051649, 7340039, 3072, 5243909, 1051649, 7340039, 3072, 6291462, 3147779, 6291462, 2099202, 4195332, 1051649, 2099202, 7340039, 5243909, 4195332, 3072, 6291462, 4195332, 1051649, 6291462, 3072, 4195332, 1051649, 3147779, 3072, 2099202, 4195332, 1051649, 3147779, 7340039, 2099202, 1051649, 2099202, 5243909, 4195332, 1051649, 3147779, 4195332, 5243909, 3147779, 6291462, 3072, 7340039, 3147779, 4195332, 7340039, 3072, 5243909, 4195332, 3147779, 5243909, 1051649, 2099202, 6291462, 4195332, 7340039, + 5243909, 3147779, 1051649, 7340039, 5243909, 2099202, 4195332, 3072, 7340039, 2099202, 1051649, 6291462, 3147779, 3072, 7340039, 3147779, 2099202, 5243909, 1051649, 3147779, 2099202, 5243909, 3072, 4195332, 6291462, 2099202, 4195332, 7340039, 1051649, 3147779, 6291462, 3072, 7340039, 2099202, 1051649, 6291462, 3147779, 1051649, 6291462, 3072, 6291462, 2099202, 4195332, 5243909, 1051649, 5243909, 3072, 3147779, 6291462, 7340039, 1051649, 3147779, 2099202, 1051649, 4195332, 1051649, 4195332, 5243909, 3147779, 2099202, 6291462, 3147779, 3072, 4195332, 2099202, 5243909, 2099202, 7340039, 3072, 6291462, 2099202, 4195332, 3147779, 2099202, 5243909, 1051649, 2099202, 5243909, 3072, 7340039, 3072, 4195332, 7340039, 5243909, 3147779, 1051649, 2099202, 5243909, 1051649, 2099202, 5243909, 2099202, 7340039, 5243909, 3147779, 6291462, 5243909, 1051649, 7340039, 6291462, 5243909, 1051649, 6291462, 4195332, 7340039, 3072, 3147779, 5243909, 6291462, 3072, 7340039, 1051649, 2099202, 5243909, 3147779, 1051649, 6291462, 4195332, 1051649, 7340039, 1051649, 6291462, 2099202, 7340039, 4195332, 3072, 3147779, 2099202, + 6291462, 3072, 5243909, 2099202, 3072, 6291462, 1051649, 6291462, 2099202, 4195332, 5243909, 2099202, 4195332, 5243909, 2099202, 5243909, 3072, 7340039, 1051649, 5243909, 3072, 3147779, 7340039, 4195332, 3072, 5243909, 1051649, 5243909, 3147779, 5243909, 1051649, 4195332, 5243909, 3147779, 6291462, 3147779, 7340039, 4195332, 2099202, 5243909, 1051649, 5243909, 3147779, 3072, 6291462, 1051649, 7340039, 4195332, 3072, 4195332, 3072, 5243909, 4195332, 7340039, 3147779, 6291462, 3072, 7340039, 3072, 4195332, 1051649, 5243909, 7340039, 3147779, 6291462, 3072, 3147779, 2099202, 5243909, 1051649, 7340039, 3072, 7340039, 1051649, 4195332, 7340039, 4195332, 6291462, 3147779, 1051649, 3147779, 6291462, 2099202, 3072, 7340039, 5243909, 6291462, 3147779, 4195332, 7340039, 3072, 6291462, 1051649, 3072, 6291462, 2099202, 4195332, 5243909, 3072, 3147779, 3072, 5243909, 3147779, 3072, 4195332, 6291462, 2099202, 7340039, 1051649, 4195332, 2099202, 5243909, 6291462, 3147779, 1051649, 7340039, 3072, 2099202, 5243909, 2099202, 4195332, 3147779, 6291462, 3072, 3147779, 6291462, 5243909, 1051649, + 4195332, 3147779, 4195332, 7340039, 4195332, 2099202, 5243909, 3072, 7340039, 3147779, 6291462, 3072, 7340039, 1051649, 6291462, 3147779, 4195332, 2099202, 6291462, 4195332, 7340039, 6291462, 1051649, 2099202, 6291462, 3147779, 7340039, 2099202, 3072, 7340039, 3147779, 7340039, 3072, 4195332, 3072, 5243909, 3072, 2099202, 6291462, 3147779, 7340039, 1051649, 7340039, 4195332, 2099202, 4195332, 5243909, 2099202, 6291462, 3147779, 7340039, 1051649, 6291462, 3072, 2099202, 5243909, 2099202, 3147779, 6291462, 2099202, 7340039, 4195332, 1051649, 3072, 5243909, 7340039, 5243909, 1051649, 6291462, 4195332, 3147779, 5243909, 2099202, 6291462, 3147779, 3072, 4195332, 1051649, 5243909, 4195332, 7340039, 1051649, 6291462, 4195332, 2099202, 3147779, 3072, 7340039, 1051649, 4195332, 2099202, 3147779, 4195332, 6291462, 2099202, 1051649, 7340039, 3147779, 6291462, 2099202, 7340039, 2099202, 6291462, 3147779, 5243909, 1051649, 4195332, 3072, 5243909, 3147779, 7340039, 3072, 4195332, 3072, 5243909, 4195332, 6291462, 3147779, 7340039, 3147779, 3072, 7340039, 2099202, 4195332, 7340039, 1051649, 2099202, 7340039, + 3072, 6291462, 1051649, 1051649, 3147779, 7340039, 3147779, 5243909, 3147779, 3072, 1051649, 5243909, 3147779, 4195332, 2099202, 7340039, 3072, 6291462, 3147779, 3072, 1051649, 3147779, 5243909, 6291462, 1051649, 4195332, 3072, 6291462, 4195332, 2099202, 5243909, 1051649, 4195332, 2099202, 7340039, 1051649, 4195332, 7340039, 1051649, 4195332, 3072, 5243909, 2099202, 5243909, 6291462, 3072, 3147779, 7340039, 1051649, 2099202, 4195332, 3147779, 5243909, 2099202, 6291462, 1051649, 7340039, 4195332, 1051649, 6291462, 3072, 7340039, 3147779, 6291462, 2099202, 3147779, 3072, 4195332, 2099202, 7340039, 3072, 3147779, 5243909, 3072, 6291462, 2099202, 7340039, 2099202, 6291462, 3072, 3147779, 5243909, 2099202, 3072, 6291462, 1051649, 4195332, 6291462, 1051649, 6291462, 4195332, 7340039, 3072, 3147779, 4195332, 5243909, 3072, 3147779, 1051649, 5243909, 4195332, 7340039, 3072, 7340039, 2099202, 6291462, 3147779, 7340039, 2099202, 6291462, 1051649, 4195332, 6291462, 1051649, 7340039, 2099202, 3072, 5243909, 1051649, 5243909, 6291462, 1051649, 5243909, 1051649, 4195332, 4195332, 5243909, 2099202, + 6291462, 4195332, 2099202, 6291462, 5243909, 3072, 4195332, 1051649, 6291462, 2099202, 4195332, 7340039, 2099202, 3072, 5243909, 1051649, 3147779, 5243909, 1051649, 5243909, 7340039, 3147779, 3072, 4195332, 2099202, 6291462, 3147779, 2099202, 5243909, 3072, 6291462, 3147779, 6291462, 2099202, 5243909, 3147779, 5243909, 2099202, 6291462, 3147779, 7340039, 1051649, 6291462, 3072, 3147779, 7340039, 1051649, 4195332, 5243909, 6291462, 3072, 7340039, 3072, 5243909, 3147779, 3147779, 5243909, 3072, 5243909, 3147779, 4195332, 2099202, 4195332, 1051649, 6291462, 3147779, 4195332, 6291462, 3072, 3147779, 6291462, 1051649, 7340039, 4195332, 2099202, 5243909, 3147779, 3072, 2099202, 6291462, 4195332, 1051649, 7340039, 4195332, 5243909, 7340039, 2099202, 3147779, 3147779, 5243909, 3072, 5243909, 2099202, 7340039, 1051649, 4195332, 7340039, 4195332, 7340039, 3072, 2099202, 1051649, 5243909, 3147779, 1051649, 3072, 5243909, 1051649, 3072, 4195332, 7340039, 2099202, 3147779, 5243909, 1051649, 4195332, 6291462, 2099202, 6291462, 3072, 2099202, 6291462, 3147779, 7340039, 3072, 7340039, 3072, 3147779, + 1051649, 2099202, 7340039, 3072, 4195332, 7340039, 2099202, 7340039, 4195332, 1051649, 6291462, 3072, 3147779, 7340039, 4195332, 6291462, 3072, 7340039, 2099202, 4195332, 2099202, 5243909, 7340039, 3072, 7340039, 1051649, 6291462, 3072, 7340039, 3147779, 1051649, 5243909, 3072, 6291462, 3072, 7340039, 3072, 4195332, 1051649, 5243909, 3072, 4195332, 3147779, 7340039, 1051649, 4195332, 3147779, 6291462, 3072, 2099202, 5243909, 4195332, 2099202, 7340039, 1051649, 6291462, 1051649, 3147779, 7340039, 1051649, 6291462, 3072, 7340039, 5243909, 3072, 7340039, 1051649, 2099202, 7340039, 4195332, 5243909, 2099202, 4195332, 3072, 6291462, 1051649, 6291462, 3147779, 7340039, 4195332, 3072, 6291462, 1051649, 3147779, 3072, 2099202, 6291462, 3072, 7340039, 1051649, 7340039, 1051649, 5243909, 1051649, 6291462, 2099202, 3072, 2099202, 5243909, 3147779, 6291462, 4195332, 3072, 6291462, 4195332, 7340039, 3147779, 5243909, 6291462, 3147779, 1051649, 6291462, 3072, 7340039, 4195332, 3072, 2099202, 4195332, 3147779, 5243909, 4195332, 3072, 2099202, 5243909, 3147779, 1051649, 6291462, 5243909, + 7340039, 4195332, 1051649, 6291462, 3147779, 3072, 5243909, 1051649, 3147779, 7340039, 2099202, 5243909, 6291462, 1051649, 1051649, 4195332, 3147779, 6291462, 4195332, 3072, 6291462, 1051649, 3147779, 4195332, 5243909, 3147779, 5243909, 4195332, 3147779, 1051649, 7340039, 2099202, 7340039, 4195332, 3147779, 2099202, 6291462, 3147779, 2099202, 7340039, 3147779, 6291462, 3072, 5243909, 2099202, 5243909, 1051649, 2099202, 7340039, 5243909, 2099202, 3147779, 6291462, 2099202, 4195332, 3072, 6291462, 4195332, 2099202, 5243909, 2099202, 5243909, 2099202, 4195332, 3147779, 5243909, 1051649, 5243909, 1051649, 5243909, 3072, 6291462, 7340039, 2099202, 3147779, 7340039, 3072, 5243909, 1051649, 5243909, 3147779, 2099202, 5243909, 5243909, 7340039, 4195332, 1051649, 5243909, 4195332, 3147779, 2099202, 4195332, 6291462, 3072, 3147779, 5243909, 3147779, 6291462, 1051649, 4195332, 1051649, 7340039, 3147779, 1051649, 2099202, 4195332, 1051649, 7340039, 2099202, 1051649, 5243909, 3147779, 5243909, 2099202, 4195332, 6291462, 7340039, 3072, 7340039, 1051649, 7340039, 3147779, 5243909, 1051649, 4195332, 5243909, 2099202, 3147779, + 3072, 4195332, 5243909, 2099202, 5243909, 2099202, 4195332, 6291462, 3072, 4195332, 1051649, 3147779, 3072, 3147779, 7340039, 2099202, 6291462, 1051649, 2099202, 7340039, 4195332, 2099202, 6291462, 1051649, 7340039, 3072, 1051649, 2099202, 6291462, 4195332, 5243909, 3072, 4195332, 1051649, 4195332, 5243909, 1051649, 7340039, 5243909, 2099202, 1051649, 3147779, 6291462, 2099202, 7340039, 3072, 4195332, 7340039, 3147779, 1051649, 6291462, 1051649, 3072, 7340039, 4195332, 5243909, 2099202, 7340039, 4195332, 3072, 7340039, 3147779, 3072, 6291462, 1051649, 6291462, 4195332, 3147779, 2099202, 7340039, 2099202, 3147779, 1051649, 5243909, 4195332, 1051649, 5243909, 2099202, 7340039, 3147779, 1051649, 7340039, 3072, 3147779, 1051649, 4195332, 3072, 7340039, 3072, 6291462, 5243909, 3072, 4195332, 3147779, 6291462, 3072, 7340039, 2099202, 5243909, 3072, 5243909, 2099202, 6291462, 5243909, 6291462, 3072, 5243909, 2099202, 4195332, 6291462, 2099202, 7340039, 3072, 3147779, 6291462, 2099202, 1051649, 5243909, 3147779, 2099202, 3072, 6291462, 1051649, 7340039, 3072, 6291462, 1051649, 5243909, + 2099202, 3147779, 3072, 7340039, 1051649, 6291462, 3072, 2099202, 6291462, 5243909, 7340039, 5243909, 4195332, 6291462, 5243909, 3072, 3147779, 5243909, 3147779, 5243909, 1051649, 5243909, 3072, 6291462, 2099202, 4195332, 7340039, 3147779, 3072, 7340039, 2099202, 3147779, 6291462, 2099202, 7340039, 1051649, 3147779, 4195332, 3072, 5243909, 7340039, 4195332, 1051649, 4195332, 2099202, 6291462, 3147779, 3072, 1051649, 5243909, 3147779, 7340039, 4195332, 3147779, 2099202, 1051649, 6291462, 3072, 3147779, 6291462, 1051649, 5243909, 1051649, 7340039, 4195332, 2099202, 3072, 7340039, 3072, 4195332, 5243909, 7340039, 3147779, 3072, 7340039, 2099202, 4195332, 6291462, 3072, 6291462, 5243909, 4195332, 2099202, 6291462, 7340039, 3147779, 6291462, 2099202, 3147779, 5243909, 2099202, 6291462, 2099202, 7340039, 2099202, 4195332, 1051649, 6291462, 4195332, 7340039, 3147779, 4195332, 3072, 3147779, 2099202, 7340039, 4195332, 1051649, 7340039, 3072, 4195332, 1051649, 6291462, 5243909, 1051649, 3147779, 5243909, 3072, 6291462, 5243909, 6291462, 3147779, 4195332, 3147779, 7340039, 3147779, 4195332, 6291462, + 7340039, 5243909, 6291462, 1051649, 5243909, 3147779, 7340039, 4195332, 2099202, 2099202, 3147779, 1051649, 7340039, 1051649, 2099202, 7340039, 4195332, 1051649, 7340039, 3072, 7340039, 2099202, 5243909, 3147779, 3072, 5243909, 2099202, 4195332, 5243909, 1051649, 4195332, 6291462, 1051649, 5243909, 3072, 4195332, 6291462, 1051649, 7340039, 2099202, 3072, 5243909, 6291462, 3072, 6291462, 3147779, 4195332, 7340039, 4195332, 5243909, 3072, 1051649, 5243909, 3072, 7340039, 5243909, 3147779, 1051649, 5243909, 2099202, 4195332, 3147779, 6291462, 1051649, 3147779, 5243909, 6291462, 3147779, 6291462, 2099202, 3072, 1051649, 6291462, 4195332, 2099202, 7340039, 3072, 3147779, 1051649, 3147779, 3072, 7340039, 2099202, 4195332, 3072, 5243909, 2099202, 6291462, 1051649, 7340039, 1051649, 3147779, 7340039, 3072, 4195332, 3147779, 7340039, 2099202, 3072, 3147779, 1051649, 6291462, 4195332, 7340039, 1051649, 3147779, 3072, 6291462, 3147779, 3147779, 7340039, 3147779, 4195332, 3072, 7340039, 4195332, 7340039, 3147779, 4195332, 1051649, 2099202, 5243909, 3072, 6291462, 2099202, 3072, 5243909, 1051649, + 2099202, 3072, 3147779, 4195332, 7340039, 3072, 4195332, 1051649, 6291462, 3072, 5243909, 3072, 2099202, 5243909, 4195332, 3072, 3147779, 6291462, 2099202, 3147779, 4195332, 3147779, 7340039, 1051649, 6291462, 3147779, 6291462, 3072, 7340039, 2099202, 7340039, 3072, 6291462, 2099202, 7340039, 3147779, 3072, 5243909, 1051649, 4195332, 6291462, 1051649, 3147779, 5243909, 2099202, 3072, 5243909, 1051649, 2099202, 7340039, 3147779, 6291462, 2099202, 4195332, 6291462, 1051649, 6291462, 3147779, 5243909, 3072, 7340039, 3072, 7340039, 2099202, 4195332, 3072, 2099202, 1051649, 4195332, 5243909, 6291462, 5243909, 2099202, 3072, 6291462, 1051649, 5243909, 6291462, 4195332, 6291462, 4195332, 1051649, 5243909, 1051649, 3147779, 6291462, 3072, 5243909, 3147779, 3147779, 4195332, 6291462, 1051649, 5243909, 1051649, 5243909, 3072, 5243909, 6291462, 4195332, 7340039, 1051649, 5243909, 3072, 5243909, 6291462, 3147779, 5243909, 2099202, 6291462, 3072, 5243909, 2099202, 5243909, 2099202, 1051649, 3072, 5243909, 1051649, 7340039, 4195332, 2099202, 7340039, 1051649, 4195332, 7340039, 2099202, 6291462, + 5243909, 4195332, 7340039, 3072, 2099202, 5243909, 3147779, 6291462, 4195332, 3147779, 7340039, 4195332, 6291462, 3072, 6291462, 5243909, 6291462, 3072, 5243909, 1051649, 6291462, 3072, 2099202, 5243909, 4195332, 1051649, 2099202, 5243909, 3147779, 4195332, 1051649, 3147779, 5243909, 4195332, 1051649, 6291462, 4195332, 3147779, 7340039, 2099202, 3072, 7340039, 2099202, 7340039, 3147779, 6291462, 2099202, 4195332, 6291462, 3072, 5243909, 1051649, 6291462, 3072, 2099202, 4195332, 1051649, 7340039, 3072, 6291462, 5243909, 2099202, 4195332, 5243909, 1051649, 7340039, 5243909, 7340039, 1051649, 3147779, 3147779, 1051649, 7340039, 4195332, 3147779, 5243909, 3147779, 2099202, 1051649, 5243909, 2099202, 6291462, 3147779, 7340039, 4195332, 1051649, 4195332, 7340039, 3072, 7340039, 3072, 2099202, 6291462, 3147779, 7340039, 2099202, 4195332, 3147779, 2099202, 3072, 2099202, 5243909, 3147779, 2099202, 4195332, 1051649, 2099202, 6291462, 3072, 5243909, 2099202, 6291462, 1051649, 7340039, 3147779, 6291462, 4195332, 2099202, 7340039, 3147779, 3072, 6291462, 1051649, 5243909, 2099202, 4195332, 1051649, 3147779, + 1051649, 3072, 5243909, 3147779, 6291462, 1051649, 2099202, 1051649, 6291462, 1051649, 5243909, 2099202, 3147779, 7340039, 2099202, 1051649, 2099202, 4195332, 3147779, 7340039, 2099202, 4195332, 6291462, 1051649, 3147779, 7340039, 4195332, 6291462, 3072, 6291462, 2099202, 5243909, 3072, 3147779, 7340039, 3147779, 2099202, 6291462, 3072, 5243909, 3147779, 4195332, 5243909, 3072, 1051649, 6291462, 3072, 7340039, 2099202, 4195332, 3147779, 6291462, 2099202, 7340039, 5243909, 3147779, 5243909, 2099202, 4195332, 3147779, 1051649, 3147779, 6291462, 3072, 6291462, 3147779, 1051649, 4195332, 6291462, 3072, 4195332, 6291462, 2099202, 5243909, 1051649, 7340039, 1051649, 4195332, 7340039, 3072, 7340039, 1051649, 4195332, 2099202, 3072, 6291462, 1051649, 4195332, 2099202, 5243909, 3147779, 5243909, 1051649, 4195332, 3072, 6291462, 1051649, 7340039, 3147779, 7340039, 5243909, 3072, 6291462, 2099202, 7340039, 4195332, 7340039, 1051649, 4195332, 7340039, 1051649, 3147779, 4195332, 3072, 6291462, 1051649, 5243909, 3147779, 3072, 6291462, 5243909, 3147779, 4195332, 7340039, 3072, 6291462, 3147779, 7340039, + 7340039, 4195332, 1051649, 7340039, 3072, 4195332, 7340039, 5243909, 3147779, 3072, 5243909, 1051649, 5243909, 3072, 4195332, 7340039, 3147779, 5243909, 1051649, 4195332, 3072, 7340039, 3147779, 7340039, 3072, 6291462, 3072, 5243909, 1051649, 2099202, 7340039, 4195332, 6291462, 1051649, 5243909, 3072, 6291462, 1051649, 5243909, 1051649, 6291462, 3072, 3147779, 6291462, 4195332, 3147779, 5243909, 1051649, 5243909, 1051649, 7340039, 1051649, 4195332, 2099202, 3072, 6291462, 3072, 7340039, 2099202, 5243909, 7340039, 1051649, 2099202, 7340039, 3147779, 3072, 7340039, 3147779, 2099202, 5243909, 7340039, 1051649, 3147779, 3072, 6291462, 3072, 6291462, 3147779, 2099202, 5243909, 3147779, 3072, 5243909, 2099202, 7340039, 3147779, 5243909, 2099202, 6291462, 1051649, 7340039, 2099202, 6291462, 5243909, 2099202, 4195332, 5243909, 3072, 6291462, 1051649, 4195332, 7340039, 2099202, 6291462, 3072, 3147779, 3072, 5243909, 3147779, 2099202, 5243909, 3072, 7340039, 4195332, 2099202, 7340039, 1051649, 6291462, 4195332, 2099202, 1051649, 6291462, 3072, 2099202, 5243909, 1051649, 4195332, 2099202, + 3072, 3147779, 6291462, 2099202, 5243909, 3147779, 3072, 2099202, 4195332, 7340039, 3147779, 7340039, 2099202, 4195332, 1051649, 1051649, 6291462, 3072, 6291462, 2099202, 5243909, 2099202, 3072, 5243909, 2099202, 4195332, 2099202, 3147779, 7340039, 3147779, 5243909, 3072, 1051649, 6291462, 2099202, 7340039, 2099202, 4195332, 4195332, 7340039, 2099202, 6291462, 4195332, 1051649, 7340039, 2099202, 3072, 7340039, 3147779, 6291462, 3147779, 3072, 7340039, 4195332, 2099202, 5243909, 4195332, 4195332, 1051649, 6291462, 3072, 4195332, 5243909, 2099202, 4195332, 5243909, 2099202, 3072, 6291462, 3147779, 3072, 4195332, 7340039, 4195332, 2099202, 5243909, 4195332, 3072, 6291462, 2099202, 4195332, 6291462, 4195332, 6291462, 3072, 5243909, 1051649, 5243909, 3072, 4195332, 3147779, 3072, 1051649, 7340039, 1051649, 6291462, 1051649, 5243909, 2099202, 5243909, 3147779, 1051649, 4195332, 1051649, 5243909, 5243909, 6291462, 4195332, 3072, 6291462, 2099202, 7340039, 1051649, 3147779, 5243909, 3072, 4195332, 1051649, 7340039, 3147779, 7340039, 2099202, 5243909, 6291462, 2099202, 7340039, 3147779, 5243909, + 2099202, 6291462, 1051649, 7340039, 4195332, 1051649, 7340039, 3147779, 6291462, 1051649, 6291462, 3072, 7340039, 5243909, 6291462, 4195332, 2099202, 7340039, 3147779, 6291462, 1051649, 4195332, 5243909, 1051649, 6291462, 1051649, 7340039, 4195332, 3072, 5243909, 2099202, 6291462, 3147779, 4195332, 3072, 4195332, 3147779, 1051649, 6291462, 3072, 3147779, 4195332, 2099202, 7340039, 2099202, 5243909, 6291462, 4195332, 3072, 2099202, 5243909, 3147779, 5243909, 1051649, 7340039, 1051649, 3147779, 6291462, 3072, 4195332, 3147779, 6291462, 4195332, 3072, 6291462, 1051649, 5243909, 7340039, 4195332, 1051649, 7340039, 2099202, 5243909, 2099202, 6291462, 3147779, 2099202, 7340039, 5243909, 1051649, 7340039, 3072, 1051649, 3147779, 7340039, 2099202, 7340039, 3147779, 6291462, 2099202, 6291462, 7340039, 3147779, 5243909, 2099202, 3147779, 7340039, 3147779, 4195332, 3072, 6291462, 4195332, 3072, 7340039, 3147779, 2099202, 2099202, 1051649, 7340039, 4195332, 1051649, 3147779, 5243909, 3072, 6291462, 3147779, 7340039, 5243909, 2099202, 3072, 4195332, 5243909, 3072, 3147779, 1051649, 4195332, 3072, 6291462, + 5243909, 1051649, 4195332, 3147779, 2099202, 6291462, 5243909, 3072, 2099202, 4195332, 2099202, 4195332, 3147779, 3072, 2099202, 7340039, 4195332, 1051649, 4195332, 3072, 7340039, 3147779, 3147779, 7340039, 3072, 5243909, 3147779, 1051649, 7340039, 3072, 4195332, 5243909, 2099202, 7340039, 5243909, 1051649, 5243909, 7340039, 2099202, 3147779, 7340039, 1051649, 5243909, 3072, 4195332, 3147779, 1051649, 4195332, 7340039, 4195332, 1051649, 6291462, 2099202, 4195332, 5243909, 6291462, 1051649, 3147779, 7340039, 2099202, 5243909, 1051649, 3147779, 7340039, 2099202, 7340039, 1051649, 2099202, 4195332, 5243909, 1051649, 6291462, 3072, 5243909, 3072, 1051649, 5243909, 3072, 2099202, 3147779, 5243909, 3147779, 7340039, 5243909, 4195332, 1051649, 4195332, 1051649, 4195332, 3072, 4195332, 1051649, 4195332, 3072, 4195332, 6291462, 3072, 1051649, 7340039, 3147779, 6291462, 1051649, 6291462, 3147779, 3072, 4195332, 7340039, 3147779, 4195332, 2099202, 6291462, 2099202, 4195332, 7340039, 2099202, 4195332, 3072, 1051649, 6291462, 3147779, 6291462, 1051649, 7340039, 3147779, 6291462, 6291462, 1051649, 3147779, + 3072, 7340039, 5243909, 3072, 6291462, 1051649, 3147779, 5243909, 7340039, 3072, 6291462, 4195332, 6291462, 1051649, 5243909, 3072, 3147779, 6291462, 2099202, 5243909, 2099202, 6291462, 3072, 4195332, 3147779, 3072, 6291462, 5243909, 2099202, 6291462, 3147779, 1051649, 7340039, 3072, 3147779, 7340039, 3072, 2099202, 4195332, 6291462, 3072, 5243909, 3147779, 6291462, 5243909, 2099202, 6291462, 3072, 2099202, 7340039, 5243909, 3072, 7340039, 3072, 2099202, 3147779, 7340039, 3072, 5243909, 3147779, 3072, 6291462, 5243909, 3072, 3147779, 4195332, 3147779, 6291462, 3072, 2099202, 5243909, 3147779, 7340039, 3147779, 7340039, 6291462, 3147779, 7340039, 4195332, 7340039, 3072, 4195332, 2099202, 3072, 3147779, 6291462, 3072, 6291462, 7340039, 2099202, 7340039, 5243909, 2099202, 6291462, 1051649, 5243909, 3147779, 6291462, 2099202, 5243909, 1051649, 4195332, 2099202, 5243909, 7340039, 1051649, 6291462, 3072, 7340039, 3072, 5243909, 7340039, 3072, 3147779, 1051649, 6291462, 3147779, 5243909, 4195332, 5243909, 1051649, 4195332, 2099202, 4195332, 3072, 5243909, 3147779, 7340039, + 4195332, 3147779, 2099202, 5243909, 4195332, 7340039, 4195332, 1051649, 2099202, 5243909, 3072, 3147779, 1051649, 5243909, 3147779, 6291462, 1051649, 5243909, 4195332, 7340039, 1051649, 4195332, 1051649, 6291462, 4195332, 7340039, 2099202, 3147779, 5243909, 1051649, 3147779, 6291462, 2099202, 5243909, 1051649, 4195332, 6291462, 6291462, 1051649, 5243909, 2099202, 7340039, 1051649, 2099202, 1051649, 7340039, 1051649, 6291462, 5243909, 3072, 3147779, 4195332, 2099202, 5243909, 7340039, 3072, 4195332, 2099202, 6291462, 1051649, 7340039, 1051649, 2099202, 5243909, 7340039, 3072, 6291462, 1051649, 4195332, 7340039, 3147779, 3072, 4195332, 2099202, 4195332, 3072, 4195332, 1051649, 3147779, 1051649, 6291462, 2099202, 4195332, 6291462, 5243909, 2099202, 5243909, 3147779, 1051649, 5243909, 3072, 2099202, 7340039, 3147779, 6291462, 3072, 7340039, 4195332, 3072, 4195332, 7340039, 3072, 7340039, 1051649, 3147779, 6291462, 1051649, 5243909, 2099202, 5243909, 1051649, 3147779, 5243909, 4195332, 6291462, 2099202, 1051649, 7340039, 2099202, 3072, 7340039, 3147779, 6291462, 1051649, 7340039, 1051649, 5243909, 2099202, + 3072, 6291462, 1051649, 7340039, 2099202, 3072, 3147779, 6291462, 7340039, 2099202, 6291462, 2099202, 7340039, 3147779, 7340039, 1051649, 7340039, 3147779, 3072, 2099202, 4195332, 7340039, 5243909, 2099202, 1051649, 5243909, 1051649, 6291462, 3072, 4195332, 7340039, 3072, 6291462, 3147779, 6291462, 3072, 2099202, 3147779, 3072, 4195332, 6291462, 3072, 4195332, 6291462, 5243909, 3147779, 3072, 3147779, 4195332, 3147779, 6291462, 1051649, 6291462, 3147779, 1051649, 6291462, 3147779, 7340039, 2099202, 5243909, 4195332, 3147779, 6291462, 4195332, 1051649, 5243909, 2099202, 3147779, 6291462, 1051649, 5243909, 2099202, 6291462, 3072, 5243909, 2099202, 7340039, 6291462, 3072, 6291462, 3147779, 7340039, 1051649, 2099202, 3072, 7340039, 2099202, 3072, 6291462, 2099202, 5243909, 4195332, 3072, 4195332, 2099202, 3147779, 1051649, 2099202, 6291462, 2099202, 3147779, 5243909, 3147779, 5243909, 4195332, 3072, 5243909, 4195332, 6291462, 3147779, 6291462, 2099202, 1051649, 7340039, 3072, 4195332, 6291462, 3072, 4195332, 6291462, 3147779, 3072, 5243909, 2099202, 5243909, 4195332, 3072, 6291462, + 2099202, 5243909, 4195332, 3072, 3147779, 6291462, 4195332, 3072, 4195332, 1051649, 3147779, 5243909, 3072, 4195332, 3072, 2099202, 5243909, 2099202, 5243909, 7340039, 1051649, 3072, 3147779, 6291462, 2099202, 7340039, 4195332, 3147779, 7340039, 2099202, 1051649, 5243909, 2099202, 4195332, 1051649, 5243909, 7340039, 4195332, 7340039, 2099202, 1051649, 5243909, 3147779, 1051649, 3072, 4195332, 7340039, 2099202, 7340039, 1051649, 5243909, 3072, 7340039, 1051649, 6291462, 4195332, 3072, 4195332, 1051649, 5243909, 1051649, 7340039, 3072, 2099202, 6291462, 4195332, 7340039, 4195332, 3072, 7340039, 1051649, 6291462, 1051649, 7340039, 3147779, 5243909, 1051649, 3147779, 5243909, 2099202, 5243909, 1051649, 6291462, 4195332, 5243909, 1051649, 4195332, 6291462, 3147779, 3147779, 7340039, 1051649, 3147779, 5243909, 3147779, 7340039, 6291462, 5243909, 1051649, 7340039, 1051649, 6291462, 3072, 2099202, 6291462, 2099202, 7340039, 2099202, 3072, 1051649, 4195332, 6291462, 4195332, 2099202, 5243909, 3147779, 4195332, 7340039, 2099202, 1051649, 4195332, 6291462, 2099202, 6291462, 3072, 3147779, 7340039, 4195332, + 7340039, 1051649, 3147779, 6291462, 5243909, 1051649, 7340039, 2099202, 6291462, 5243909, 3072, 6291462, 3147779, 6291462, 4195332, 7340039, 3072, 6291462, 1051649, 3147779, 6291462, 3147779, 5243909, 3072, 4195332, 1051649, 3072, 6291462, 2099202, 5243909, 3147779, 7340039, 3072, 3147779, 6291462, 4195332, 2099202, 1051649, 3147779, 5243909, 7340039, 3147779, 7340039, 4195332, 6291462, 2099202, 3147779, 5243909, 3072, 6291462, 3147779, 2099202, 4195332, 4195332, 1051649, 5243909, 2099202, 6291462, 3147779, 7340039, 3072, 4195332, 3147779, 6291462, 3072, 2099202, 3072, 5243909, 3147779, 4195332, 2099202, 5243909, 4195332, 2099202, 4195332, 3072, 6291462, 4195332, 1051649, 7340039, 3072, 5243909, 3147779, 1051649, 7340039, 3147779, 7340039, 1051649, 5243909, 3072, 4195332, 6291462, 2099202, 7340039, 1051649, 4195332, 3072, 3147779, 5243909, 3072, 4195332, 2099202, 7340039, 4195332, 3072, 4195332, 1051649, 3147779, 7340039, 5243909, 3072, 7340039, 3072, 5243909, 1051649, 7340039, 1051649, 2099202, 5243909, 3147779, 7340039, 1051649, 4195332, 1051649, 7340039, 4195332, 1051649, 2099202, + 3072, 4195332, 1051649, 5243909, 2099202, 3072, 5243909, 3147779, 1051649, 3147779, 7340039, 2099202, 5243909, 1051649, 4195332, 2099202, 5243909, 4195332, 3072, 5243909, 2099202, 7340039, 1051649, 6291462, 4195332, 7340039, 5243909, 3147779, 4195332, 3072, 6291462, 1051649, 4195332, 7340039, 2099202, 3072, 6291462, 2099202, 7340039, 3072, 4195332, 1051649, 4195332, 3072, 2099202, 6291462, 1051649, 4195332, 5243909, 1051649, 4195332, 7340039, 3147779, 3072, 6291462, 2099202, 7340039, 4195332, 1051649, 3147779, 6291462, 2099202, 7340039, 1051649, 5243909, 3147779, 7340039, 1051649, 6291462, 1051649, 7340039, 3147779, 3072, 6291462, 1051649, 7340039, 1051649, 2099202, 5243909, 3147779, 4195332, 2099202, 6291462, 3072, 5243909, 3072, 4195332, 2099202, 7340039, 3147779, 7340039, 1051649, 5243909, 3072, 6291462, 2099202, 7340039, 4195332, 2099202, 7340039, 3147779, 5243909, 1051649, 5243909, 7340039, 3147779, 6291462, 5243909, 2099202, 4195332, 3147779, 1051649, 6291462, 2099202, 5243909, 3072, 3147779, 6291462, 3072, 6291462, 2099202, 3147779, 7340039, 4195332, 3072, 6291462, 3147779, 5243909, + 7340039, 5243909, 7340039, 3072, 3147779, 7340039, 2099202, 7340039, 4195332, 4195332, 1051649, 6291462, 3072, 7340039, 1051649, 6291462, 2099202, 7340039, 3147779, 6291462, 3072, 4195332, 3147779, 1051649, 3147779, 3072, 2099202, 7340039, 1051649, 6291462, 2099202, 4195332, 5243909, 3072, 5243909, 3147779, 6291462, 4195332, 1051649, 5243909, 2099202, 6291462, 2099202, 5243909, 7340039, 1051649, 4195332, 7340039, 2099202, 4195332, 3072, 6291462, 2099202, 7340039, 3147779, 5243909, 3072, 2099202, 6291462, 4195332, 1051649, 5243909, 3072, 4195332, 5243909, 1051649, 4195332, 6291462, 2099202, 5243909, 3072, 2099202, 7340039, 3147779, 6291462, 3147779, 4195332, 7340039, 2099202, 6291462, 1051649, 7340039, 2099202, 6291462, 3147779, 4195332, 2099202, 6291462, 1051649, 4195332, 3072, 5243909, 3147779, 4195332, 1051649, 5243909, 3147779, 3072, 6291462, 4195332, 3072, 6291462, 4195332, 2099202, 1051649, 5243909, 1051649, 3072, 7340039, 1051649, 5243909, 4195332, 3147779, 7340039, 1051649, 7340039, 2099202, 5243909, 2099202, 4195332, 3072, 5243909, 2099202, 5243909, 3147779, 2099202, 6291462, 1051649, + 3147779, 1051649, 2099202, 6291462, 4195332, 1051649, 5243909, 1051649, 3072, 6291462, 2099202, 3147779, 5243909, 1051649, 5243909, 3147779, 3072, 3147779, 1051649, 5243909, 2099202, 7340039, 2099202, 6291462, 6291462, 4195332, 5243909, 1051649, 5243909, 3147779, 7340039, 3072, 2099202, 4195332, 1051649, 7340039, 1051649, 3072, 6291462, 3147779, 5243909, 2099202, 6291462, 3072, 3147779, 5243909, 2099202, 3072, 7340039, 3147779, 6291462, 1051649, 5243909, 3147779, 3072, 7340039, 1051649, 6291462, 5243909, 3072, 7340039, 3147779, 3147779, 6291462, 2099202, 7340039, 2099202, 3072, 4195332, 3147779, 6291462, 5243909, 4195332, 1051649, 5243909, 3072, 5243909, 3072, 4195332, 3072, 4195332, 5243909, 3072, 4195332, 1051649, 7340039, 3072, 6291462, 5243909, 2099202, 7340039, 1051649, 6291462, 2099202, 7340039, 1051649, 6291462, 5243909, 1051649, 3147779, 2099202, 1051649, 7340039, 2099202, 6291462, 3147779, 7340039, 3147779, 6291462, 2099202, 4195332, 3072, 6291462, 3072, 3147779, 4195332, 3147779, 6291462, 1051649, 7340039, 5243909, 1051649, 6291462, 3072, 7340039, 5243909, 3072, 4195332, + 6291462, 3147779, 4195332, 2099202, 6291462, 2099202, 3147779, 6291462, 5243909, 2099202, 7340039, 4195332, 3147779, 7340039, 2099202, 6291462, 4195332, 7340039, 5243909, 4195332, 1051649, 5243909, 3072, 4195332, 3072, 3147779, 1051649, 7340039, 4195332, 3072, 3147779, 5243909, 7340039, 3147779, 6291462, 3147779, 5243909, 7340039, 4195332, 1051649, 7340039, 3072, 3147779, 7340039, 5243909, 3072, 6291462, 5243909, 1051649, 6291462, 2099202, 4195332, 1051649, 5243909, 2099202, 4195332, 5243909, 1051649, 3147779, 5243909, 2099202, 1051649, 7340039, 3072, 6291462, 3147779, 1051649, 5243909, 7340039, 1051649, 3147779, 3072, 2099202, 7340039, 2099202, 4195332, 3147779, 7340039, 2099202, 6291462, 1051649, 6291462, 3147779, 7340039, 4195332, 2099202, 5243909, 3147779, 3072, 5243909, 3147779, 4195332, 3072, 5243909, 2099202, 3147779, 4195332, 2099202, 1051649, 7340039, 5243909, 6291462, 3072, 5243909, 4195332, 3072, 5243909, 2099202, 3147779, 6291462, 1051649, 7340039, 2099202, 5243909, 1051649, 6291462, 3072, 7340039, 4195332, 1051649, 3147779, 7340039, 2099202, 4195332, 1051649, 3147779, 6291462, 2099202, + 5243909, 3072, 7340039, 1051649, 5243909, 3072, 6291462, 3072, 3147779, 5243909, 3072, 6291462, 3072, 4195332, 4195332, 3072, 1051649, 2099202, 4195332, 3072, 6291462, 3147779, 7340039, 2099202, 5243909, 7340039, 4195332, 2099202, 6291462, 2099202, 6291462, 2099202, 1051649, 5243909, 3072, 4195332, 3072, 3147779, 2099202, 6291462, 1051649, 5243909, 4195332, 1051649, 2099202, 7340039, 3147779, 1051649, 4195332, 3147779, 5243909, 3072, 7340039, 3147779, 6291462, 1051649, 4195332, 2099202, 7340039, 3072, 4195332, 5243909, 2099202, 4195332, 3147779, 3072, 6291462, 3147779, 2099202, 4195332, 7340039, 4195332, 6291462, 1051649, 6291462, 1051649, 5243909, 3072, 5243909, 3147779, 7340039, 3147779, 2099202, 4195332, 3072, 7340039, 2099202, 6291462, 4195332, 3072, 6291462, 1051649, 7340039, 4195332, 3072, 7340039, 3072, 3147779, 6291462, 3072, 2099202, 3147779, 4195332, 3147779, 2099202, 7340039, 4195332, 3072, 7340039, 3072, 5243909, 3147779, 7340039, 4195332, 5243909, 2099202, 4195332, 3072, 3147779, 6291462, 4195332, 3072, 3147779, 5243909, 6291462, 2099202, 7340039, 3072, + 2099202, 7340039, 3147779, 4195332, 2099202, 7340039, 4195332, 6291462, 1051649, 4195332, 1051649, 7340039, 5243909, 2099202, 6291462, 3147779, 7340039, 6291462, 1051649, 6291462, 2099202, 5243909, 1051649, 6291462, 1051649, 2099202, 6291462, 3072, 3147779, 5243909, 3072, 6291462, 1051649, 4195332, 6291462, 2099202, 5243909, 7340039, 3072, 4195332, 3147779, 1051649, 7340039, 3147779, 6291462, 1051649, 4195332, 6291462, 7340039, 3072, 3147779, 7340039, 2099202, 2099202, 3072, 5243909, 7340039, 3072, 6291462, 2099202, 7340039, 1051649, 6291462, 3072, 5243909, 7340039, 2099202, 6291462, 3072, 6291462, 3072, 2099202, 5243909, 3147779, 3072, 6291462, 2099202, 7340039, 1051649, 3147779, 3072, 5243909, 6291462, 3072, 5243909, 3147779, 1051649, 1051649, 2099202, 7340039, 4195332, 3147779, 5243909, 1051649, 6291462, 2099202, 5243909, 6291462, 4195332, 7340039, 5243909, 3072, 7340039, 1051649, 6291462, 3072, 3147779, 6291462, 2099202, 5243909, 6291462, 1051649, 3147779, 3072, 2099202, 7340039, 3147779, 6291462, 5243909, 3072, 2099202, 6291462, 7340039, 1051649, 4195332, 3072, 5243909, 3147779, + 4195332, 3072, 5243909, 1051649, 5243909, 3147779, 1051649, 4195332, 3147779, 7340039, 3147779, 2099202, 1051649, 6291462, 1051649, 5243909, 3072, 3147779, 4195332, 3147779, 7340039, 3072, 4195332, 3147779, 7340039, 5243909, 1051649, 7340039, 4195332, 1051649, 5243909, 3147779, 4195332, 7340039, 1051649, 7340039, 2099202, 5243909, 2099202, 7340039, 3147779, 6291462, 2099202, 4195332, 3072, 5243909, 2099202, 3072, 2099202, 6291462, 5243909, 1051649, 6291462, 4195332, 7340039, 2099202, 3147779, 5243909, 3147779, 4195332, 3072, 5243909, 3147779, 7340039, 2099202, 4195332, 1051649, 4195332, 5243909, 2099202, 4195332, 7340039, 1051649, 4195332, 7340039, 2099202, 4195332, 1051649, 6291462, 4195332, 7340039, 1051649, 2099202, 6291462, 1051649, 5243909, 7340039, 5243909, 6291462, 1051649, 6291462, 2099202, 3072, 3147779, 4195332, 7340039, 1051649, 3147779, 3072, 2099202, 6291462, 4195332, 1051649, 5243909, 2099202, 5243909, 4195332, 1051649, 4195332, 3147779, 1051649, 4195332, 7340039, 4195332, 6291462, 1051649, 5243909, 1051649, 2099202, 7340039, 4195332, 2099202, 3072, 5243909, 6291462, 3147779, 1051649, 7340039, + 6291462, 2099202, 3147779, 6291462, 1051649, 7340039, 3072, 7340039, 2099202, 5243909, 3072, 5243909, 7340039, 4195332, 1051649, 5243909, 2099202, 7340039, 2099202, 4195332, 1051649, 5243909, 2099202, 6291462, 3072, 3147779, 1051649, 5243909, 3147779, 7340039, 2099202, 7340039, 3072, 2099202, 3147779, 4195332, 1051649, 3147779, 4195332, 3072, 5243909, 3072, 5243909, 4195332, 7340039, 2099202, 7340039, 5243909, 3147779, 4195332, 3072, 4195332, 1051649, 5243909, 1051649, 3147779, 6291462, 1051649, 7340039, 1051649, 3147779, 6291462, 1051649, 4195332, 3072, 5243909, 1051649, 7340039, 2099202, 7340039, 1051649, 3147779, 6291462, 3147779, 3072, 3147779, 5243909, 6291462, 3147779, 3072, 2099202, 5243909, 3147779, 4195332, 7340039, 3072, 4195332, 3147779, 3072, 4195332, 2099202, 7340039, 5243909, 6291462, 2099202, 3072, 5243909, 5243909, 6291462, 3147779, 1051649, 7340039, 4195332, 3072, 7340039, 1051649, 6291462, 6291462, 3072, 7340039, 2099202, 5243909, 2099202, 3072, 6291462, 3147779, 3072, 7340039, 4195332, 1051649, 5243909, 3147779, 4195332, 2099202, 3072, 7340039, 4195332, 1051649, + 2099202, 4195332, 7340039, 3072, 4195332, 3147779, 6291462, 3147779, 3072, 4195332, 6291462, 2099202, 3072, 3147779, 7340039, 3072, 6291462, 1051649, 5243909, 3072, 7340039, 3147779, 6291462, 1051649, 4195332, 7340039, 2099202, 4195332, 3072, 6291462, 3072, 4195332, 5243909, 6291462, 3072, 4195332, 6291462, 1051649, 7340039, 6291462, 2099202, 6291462, 2099202, 3072, 1051649, 3147779, 4195332, 1051649, 6291462, 2099202, 7340039, 3147779, 6291462, 3072, 4195332, 6291462, 3072, 4195332, 2099202, 6291462, 4195332, 3072, 6291462, 3147779, 7340039, 3147779, 5243909, 3072, 5243909, 3147779, 6291462, 5243909, 3072, 7340039, 5243909, 1051649, 4195332, 3072, 2099202, 5243909, 6291462, 1051649, 7340039, 3072, 3147779, 4195332, 2099202, 5243909, 2099202, 7340039, 3147779, 3072, 4195332, 1051649, 5243909, 7340039, 3147779, 1051649, 3072, 4195332, 5243909, 2099202, 3147779, 5243909, 3147779, 4195332, 3072, 3147779, 5243909, 1051649, 6291462, 3072, 5243909, 3147779, 3147779, 4195332, 5243909, 2099202, 4195332, 7340039, 3072, 6291462, 7340039, 1051649, 5243909, 2099202, 3147779, 6291462, + 3072, 3147779, 1051649, 5243909, 6291462, 1051649, 2099202, 6291462, 2099202, 5243909, 1051649, 6291462, 3147779, 5243909, 2099202, 4195332, 4195332, 3147779, 7340039, 4195332, 1051649, 5243909, 3072, 3147779, 5243909, 3072, 6291462, 2099202, 7340039, 2099202, 3147779, 5243909, 1051649, 3147779, 5243909, 2099202, 6291462, 3072, 3147779, 4195332, 1051649, 3147779, 6291462, 4195332, 7340039, 5243909, 3072, 7340039, 3072, 5243909, 1051649, 5243909, 4195332, 3147779, 7340039, 2099202, 2099202, 5243909, 5243909, 3072, 7340039, 4195332, 2099202, 5243909, 2099202, 1051649, 7340039, 3147779, 1051649, 4195332, 3072, 2099202, 4195332, 2099202, 4195332, 7340039, 2099202, 3147779, 7340039, 1051649, 4195332, 5243909, 2099202, 5243909, 7340039, 1051649, 6291462, 1051649, 7340039, 1051649, 6291462, 3147779, 2099202, 7340039, 3147779, 1051649, 4195332, 6291462, 6291462, 2099202, 7340039, 3072, 2099202, 6291462, 1051649, 7340039, 5243909, 2099202, 7340039, 1051649, 4195332, 5243909, 2099202, 7340039, 3072, 7340039, 1051649, 6291462, 3072, 3147779, 5243909, 2099202, 1051649, 6291462, 4195332, 5243909, 3072, 5243909, + 7340039, 4195332, 7340039, 4195332, 2099202, 4195332, 5243909, 3072, 7340039, 1051649, 4195332, 3072, 6291462, 1051649, 7340039, 3072, 6291462, 2099202, 3072, 3147779, 6291462, 2099202, 7340039, 3147779, 6291462, 3147779, 5243909, 1051649, 5243909, 3072, 7340039, 1051649, 4195332, 6291462, 1051649, 7340039, 3147779, 5243909, 6291462, 1051649, 5243909, 7340039, 3072, 5243909, 2099202, 1051649, 6291462, 3147779, 4195332, 2099202, 7340039, 3072, 2099202, 5243909, 3072, 4195332, 7340039, 3147779, 1051649, 6291462, 2099202, 1051649, 7340039, 3072, 6291462, 4195332, 2099202, 6291462, 6291462, 1051649, 7340039, 5243909, 1051649, 6291462, 3072, 3147779, 5243909, 7340039, 1051649, 6291462, 3072, 3147779, 6291462, 3072, 2099202, 6291462, 4195332, 5243909, 2099202, 5243909, 3072, 5243909, 1051649, 4195332, 2099202, 7340039, 3072, 4195332, 2099202, 1051649, 5243909, 3147779, 7340039, 4195332, 3072, 2099202, 4195332, 1051649, 3147779, 6291462, 3147779, 7340039, 1051649, 6291462, 1051649, 6291462, 3147779, 2099202, 5243909, 3147779, 1051649, 6291462, 4195332, 3072, 3147779, 1051649, 7340039, 1051649, + 5243909, 2099202, 3072, 6291462, 3072, 7340039, 2099202, 6291462, 3147779, 4195332, 7340039, 3147779, 2099202, 5243909, 3147779, 1051649, 2099202, 5243909, 4195332, 6291462, 2099202, 5243909, 1051649, 4195332, 3072, 2099202, 4195332, 7340039, 2099202, 4195332, 3147779, 6291462, 3072, 2099202, 5243909, 3072, 2099202, 1051649, 7340039, 3147779, 2099202, 4195332, 3147779, 1051649, 6291462, 5243909, 2099202, 1051649, 6291462, 4195332, 1051649, 3147779, 6291462, 1051649, 6291462, 3147779, 3072, 5243909, 6291462, 2099202, 4195332, 5243909, 1051649, 3147779, 3147779, 5243909, 3072, 4195332, 3072, 4195332, 3147779, 3072, 5243909, 5243909, 3147779, 6291462, 3072, 2099202, 4195332, 6291462, 3147779, 7340039, 1051649, 3147779, 6291462, 2099202, 3072, 3147779, 6291462, 3147779, 3147779, 7340039, 2099202, 6291462, 3072, 4195332, 6291462, 1051649, 7340039, 4195332, 6291462, 3072, 2099202, 4195332, 6291462, 7340039, 2099202, 6291462, 4195332, 3072, 4195332, 3072, 4195332, 3147779, 5243909, 2099202, 3072, 7340039, 1051649, 6291462, 4195332, 2099202, 5243909, 7340039, 5243909, 6291462, 3147779, 2099202, + 3072, 4195332, 6291462, 3147779, 5243909, 1051649, 5243909, 3072, 5243909, 1051649, 2099202, 5243909, 7340039, 3072, 4195332, 5243909, 7340039, 3072, 7340039, 1051649, 6291462, 3072, 6291462, 1051649, 7340039, 5243909, 4195332, 3072, 6291462, 1051649, 7340039, 1051649, 5243909, 3147779, 6291462, 4195332, 7340039, 4195332, 3072, 5243909, 7340039, 3072, 5243909, 7340039, 3072, 3147779, 4195332, 7340039, 3072, 5243909, 3147779, 7340039, 5243909, 1051649, 4195332, 7340039, 2099202, 4195332, 1051649, 3147779, 7340039, 3072, 6291462, 5243909, 1051649, 7340039, 2099202, 7340039, 3147779, 5243909, 7340039, 3147779, 2099202, 1051649, 7340039, 1051649, 4195332, 6291462, 3072, 2099202, 4195332, 1051649, 5243909, 4195332, 1051649, 7340039, 3147779, 6291462, 3072, 7340039, 4195332, 3072, 5243909, 3147779, 6291462, 2099202, 5243909, 3147779, 3072, 3147779, 1051649, 5243909, 6291462, 3147779, 3072, 1051649, 5243909, 3072, 2099202, 6291462, 2099202, 6291462, 2099202, 7340039, 3072, 5243909, 4195332, 5243909, 3072, 4195332, 7340039, 3072, 3147779, 1051649, 2099202, 3072, 4195332, 6291462, + 3147779, 7340039, 2099202, 1051649, 3147779, 6291462, 3147779, 7340039, 2099202, 4195332, 6291462, 3072, 4195332, 3147779, 7340039, 3147779, 1051649, 4195332, 2099202, 4195332, 3147779, 7340039, 2099202, 5243909, 3147779, 2099202, 1051649, 7340039, 3147779, 2099202, 5243909, 4195332, 1051649, 7340039, 3072, 2099202, 1051649, 6291462, 3147779, 2099202, 1051649, 4195332, 1051649, 4195332, 2099202, 7340039, 3072, 3147779, 2099202, 3147779, 6291462, 3072, 2099202, 7340039, 3147779, 3072, 6291462, 5243909, 3072, 5243909, 2099202, 4195332, 3147779, 2099202, 6291462, 3072, 4195332, 2099202, 6291462, 1051649, 3072, 6291462, 7340039, 2099202, 4195332, 6291462, 1051649, 5243909, 3147779, 4195332, 7340039, 3072, 7340039, 3147779, 4195332, 2099202, 5243909, 1051649, 4195332, 1051649, 5243909, 2099202, 6291462, 3072, 4195332, 1051649, 7340039, 2099202, 6291462, 5243909, 7340039, 3147779, 1051649, 5243909, 7340039, 3147779, 5243909, 3147779, 7340039, 3147779, 5243909, 3147779, 1051649, 5243909, 2099202, 7340039, 1051649, 3147779, 6291462, 1051649, 2099202, 5243909, 3147779, 7340039, 4195332, 7340039, 1051649, 5243909, + 3147779, 3072, 5243909, 7340039, 4195332, 3072, 2099202, 4195332, 1051649, 7340039, 1051649, 3147779, 6291462, 1051649, 3072, 6291462, 5243909, 2099202, 6291462, 3072, 5243909, 1051649, 4195332, 3072, 6291462, 3147779, 6291462, 4195332, 3072, 6291462, 3072, 6291462, 3147779, 3147779, 4195332, 5243909, 7340039, 3072, 3147779, 7340039, 5243909, 6291462, 3147779, 7340039, 3147779, 5243909, 6291462, 1051649, 6291462, 4195332, 1051649, 4195332, 5243909, 3072, 4195332, 6291462, 1051649, 7340039, 3147779, 6291462, 1051649, 7340039, 3072, 7340039, 4195332, 3147779, 6291462, 3072, 4195332, 5243909, 2099202, 4195332, 1051649, 4195332, 3072, 7340039, 2099202, 5243909, 1051649, 7340039, 2099202, 5243909, 1051649, 6291462, 3072, 7340039, 1051649, 5243909, 2099202, 7340039, 3072, 5243909, 3147779, 1051649, 7340039, 2099202, 4195332, 1051649, 5243909, 2099202, 3072, 4195332, 7340039, 3072, 2099202, 4195332, 3072, 7340039, 1051649, 4195332, 3072, 7340039, 6291462, 4195332, 1051649, 4195332, 6291462, 2099202, 7340039, 3147779, 7340039, 3072, 6291462, 2099202, 3072, 3147779, 5243909, 2099202, + 4195332, 6291462, 1051649, 6291462, 3072, 5243909, 6291462, 3147779, 5243909, 2099202, 4195332, 7340039, 2099202, 6291462, 5243909, 2099202, 3072, 7340039, 3147779, 7340039, 2099202, 7340039, 3147779, 5243909, 1051649, 6291462, 3072, 2099202, 7340039, 4195332, 2099202, 5243909, 3072, 6291462, 4195332, 1051649, 3147779, 4195332, 6291462, 3072, 2099202, 4195332, 3072, 5243909, 1051649, 3072, 2099202, 5243909, 3072, 7340039, 2099202, 7340039, 2099202, 2099202, 6291462, 2099202, 4195332, 1051649, 3147779, 4195332, 2099202, 4195332, 5243909, 2099202, 3072, 6291462, 1051649, 6291462, 3147779, 1051649, 6291462, 2099202, 6291462, 3147779, 5243909, 2099202, 3072, 6291462, 3147779, 6291462, 3072, 3147779, 5243909, 2099202, 3147779, 6291462, 4195332, 3072, 6291462, 3147779, 4195332, 1051649, 7340039, 4195332, 3147779, 6291462, 3072, 7340039, 3147779, 3147779, 6291462, 2099202, 5243909, 3147779, 6291462, 1051649, 5243909, 2099202, 5243909, 1051649, 6291462, 2099202, 3072, 7340039, 3147779, 6291462, 3072, 5243909, 3072, 4195332, 1051649, 5243909, 2099202, 5243909, 4195332, 6291462, 3072, 7340039, + 5243909, 1051649, 4195332, 3147779, 2099202, 7340039, 1051649, 4195332, 3072, 6291462, 1051649, 5243909, 3072, 3147779, 1051649, 5243909, 4195332, 5243909, 1051649, 3147779, 3072, 4195332, 1051649, 7340039, 3147779, 2099202, 4195332, 5243909, 1051649, 5243909, 3147779, 7340039, 2099202, 7340039, 1051649, 5243909, 2099202, 7340039, 1051649, 4195332, 1051649, 6291462, 2099202, 3147779, 6291462, 4195332, 6291462, 2099202, 7340039, 3147779, 4195332, 1051649, 6291462, 5243909, 1051649, 3147779, 3072, 7340039, 5243909, 3072, 7340039, 1051649, 1051649, 5243909, 5243909, 3147779, 7340039, 1051649, 4195332, 7340039, 3147779, 5243909, 3072, 7340039, 1051649, 6291462, 4195332, 4195332, 1051649, 1051649, 4195332, 6291462, 3072, 7340039, 2099202, 3072, 3147779, 7340039, 2099202, 1051649, 5243909, 6291462, 2099202, 3072, 6291462, 4195332, 3147779, 5243909, 1051649, 7340039, 3072, 6291462, 1051649, 1051649, 4195332, 7340039, 3147779, 1051649, 7340039, 3147779, 4195332, 2099202, 5243909, 3147779, 1051649, 2099202, 4195332, 3147779, 7340039, 2099202, 6291462, 3147779, 1051649, 6291462, 1051649, 2099202, 5243909, 2099202, + 3072, 7340039, 1051649, 6291462, 1051649, 3147779, 7340039, 2099202, 6291462, 3147779, 7340039, 2099202, 4195332, 7340039, 3147779, 7340039, 3072, 2099202, 4195332, 6291462, 5243909, 2099202, 5243909, 3072, 5243909, 7340039, 3147779, 3072, 7340039, 1051649, 4195332, 3072, 5243909, 1051649, 3147779, 6291462, 3072, 2099202, 6291462, 5243909, 7340039, 3147779, 6291462, 3072, 7340039, 1051649, 4195332, 3072, 5243909, 1051649, 5243909, 4195332, 3072, 3147779, 5243909, 7340039, 6291462, 4195332, 3072, 6291462, 3147779, 6291462, 3147779, 7340039, 1051649, 2099202, 2099202, 4195332, 5243909, 3072, 3147779, 5243909, 2099202, 4195332, 3147779, 2099202, 7340039, 3072, 5243909, 7340039, 3147779, 2099202, 4195332, 4195332, 5243909, 6291462, 5243909, 2099202, 4195332, 7340039, 3147779, 3072, 4195332, 6291462, 1051649, 1051649, 5243909, 3072, 6291462, 2099202, 4195332, 3147779, 5243909, 6291462, 2099202, 3072, 5243909, 6291462, 3072, 6291462, 3072, 6291462, 1051649, 5243909, 7340039, 4195332, 6291462, 1051649, 3147779, 6291462, 3072, 7340039, 4195332, 2099202, 7340039, 4195332, 1051649, 7340039, + 4195332, 3147779, 7340039, 2099202, 4195332, 5243909, 3072, 5243909, 3147779, 3072, 4195332, 1051649, 5243909, 3072, 6291462, 2099202, 4195332, 6291462, 3072, 1051649, 3147779, 7340039, 3147779, 6291462, 2099202, 1051649, 4195332, 6291462, 3147779, 5243909, 2099202, 6291462, 3147779, 7340039, 3072, 4195332, 4195332, 5243909, 3072, 2099202, 3147779, 1051649, 4195332, 2099202, 5243909, 1051649, 7340039, 4195332, 3147779, 6291462, 3072, 7340039, 2099202, 7340039, 1051649, 3072, 2099202, 5243909, 2099202, 4195332, 2099202, 4195332, 3072, 3147779, 4195332, 5243909, 7340039, 3072, 6291462, 2099202, 7340039, 1051649, 6291462, 3072, 6291462, 1051649, 5243909, 2099202, 5243909, 3072, 6291462, 1051649, 7340039, 1051649, 3072, 4195332, 1051649, 6291462, 3072, 4195332, 1051649, 6291462, 2099202, 3147779, 5243909, 7340039, 2099202, 7340039, 4195332, 5243909, 2099202, 7340039, 1051649, 4195332, 7340039, 4195332, 1051649, 4195332, 3147779, 4195332, 2099202, 7340039, 4195332, 3072, 2099202, 3072, 3147779, 5243909, 1051649, 2099202, 5243909, 1051649, 6291462, 3072, 3147779, 5243909, 3072, 3147779, + 3147779, 2099202, 5243909, 3072, 6291462, 1051649, 6291462, 2099202, 4195332, 5243909, 3147779, 6291462, 2099202, 6291462, 3147779, 5243909, 1051649, 2099202, 7340039, 4195332, 6291462, 3072, 4195332, 1051649, 5243909, 6291462, 1051649, 2099202, 7340039, 3072, 6291462, 3147779, 1051649, 5243909, 2099202, 7340039, 1051649, 3147779, 7340039, 4195332, 6291462, 3072, 5243909, 2099202, 6291462, 3147779, 1051649, 5243909, 2099202, 3147779, 4195332, 3147779, 1051649, 6291462, 3147779, 6291462, 3147779, 7340039, 1051649, 5243909, 6291462, 1051649, 7340039, 2099202, 6291462, 3072, 4195332, 1051649, 5243909, 3147779, 4195332, 1051649, 4195332, 3147779, 5243909, 3072, 3147779, 7340039, 4195332, 2099202, 5243909, 3147779, 5243909, 3147779, 7340039, 2099202, 7340039, 1051649, 3147779, 6291462, 3072, 5243909, 7340039, 1051649, 4195332, 3072, 4195332, 1051649, 2099202, 3072, 4195332, 3072, 6291462, 2099202, 3072, 3147779, 7340039, 2099202, 5243909, 1051649, 6291462, 3147779, 1051649, 4195332, 6291462, 4195332, 6291462, 3072, 7340039, 4195332, 2099202, 5243909, 3147779, 4195332, 6291462, 1051649, 6291462, 5243909, + 6291462, 3072, 5243909, 4195332, 3147779, 7340039, 1051649, 7340039, 3072, 6291462, 3072, 7340039, 1051649, 4195332, 1051649, 3072, 7340039, 3147779, 2099202, 5243909, 1051649, 2099202, 6291462, 7340039, 3072, 3147779, 6291462, 4195332, 2099202, 2099202, 4195332, 3072, 7340039, 3147779, 6291462, 1051649, 6291462, 2099202, 5243909, 3072, 2099202, 7340039, 3147779, 7340039, 3072, 4195332, 6291462, 3072, 7340039, 3072, 7340039, 5243909, 5243909, 2099202, 4195332, 1051649, 5243909, 3072, 4195332, 3147779, 3072, 5243909, 4195332, 6291462, 1051649, 3147779, 7340039, 2099202, 6291462, 3072, 7340039, 6291462, 2099202, 7340039, 1051649, 4195332, 7340039, 3072, 3147779, 7340039, 1051649, 6291462, 3072, 5243909, 2099202, 3147779, 5243909, 2099202, 5243909, 2099202, 7340039, 3147779, 2099202, 5243909, 2099202, 6291462, 3147779, 5243909, 6291462, 7340039, 3147779, 6291462, 3147779, 1051649, 5243909, 6291462, 2099202, 6291462, 3072, 7340039, 3072, 5243909, 1051649, 7340039, 2099202, 5243909, 1051649, 3147779, 6291462, 4195332, 3072, 6291462, 3072, 7340039, 2099202, 5243909, 2099202, 1051649, + 3147779, 7340039, 2099202, 6291462, 3072, 2099202, 4195332, 3147779, 6291462, 3147779, 1051649, 4195332, 3147779, 5243909, 7340039, 3147779, 4195332, 5243909, 3072, 4195332, 7340039, 5243909, 1051649, 3147779, 4195332, 5243909, 1051649, 3072, 6291462, 4195332, 7340039, 5243909, 2099202, 4195332, 3072, 5243909, 3147779, 3072, 4195332, 6291462, 5243909, 3147779, 1051649, 2099202, 4195332, 7340039, 2099202, 3147779, 4195332, 2099202, 2099202, 1051649, 1051649, 6291462, 3072, 7340039, 2099202, 4195332, 7340039, 2099202, 7340039, 2099202, 3072, 5243909, 2099202, 6291462, 3072, 5243909, 1051649, 3147779, 5243909, 2099202, 3072, 3147779, 6291462, 2099202, 4195332, 2099202, 6291462, 1051649, 4195332, 3147779, 4195332, 6291462, 3072, 6291462, 3072, 7340039, 1051649, 5243909, 3147779, 3072, 6291462, 1051649, 5243909, 3072, 7340039, 1051649, 3072, 3147779, 1051649, 5243909, 2099202, 7340039, 4195332, 1051649, 4195332, 2099202, 4195332, 3147779, 3147779, 7340039, 2099202, 5243909, 3072, 3147779, 7340039, 5243909, 1051649, 2099202, 7340039, 3147779, 5243909, 1051649, 4195332, 3072, 7340039, 4195332, + 3072, 4195332, 1051649, 4195332, 6291462, 5243909, 3072, 2099202, 1051649, 5243909, 7340039, 2099202, 5243909, 3072, 2099202, 6291462, 1051649, 6291462, 1051649, 7340039, 3147779, 3072, 6291462, 1051649, 7340039, 2099202, 4195332, 7340039, 5243909, 3072, 3147779, 1051649, 4195332, 7340039, 4195332, 2099202, 5243909, 7340039, 1051649, 2099202, 3072, 6291462, 5243909, 1051649, 6291462, 3072, 5243909, 1051649, 6291462, 6291462, 4195332, 7340039, 3147779, 5243909, 4195332, 3147779, 3072, 6291462, 1051649, 6291462, 3147779, 1051649, 5243909, 3147779, 7340039, 4195332, 2099202, 4195332, 4195332, 7340039, 1051649, 4195332, 7340039, 5243909, 1051649, 5243909, 3072, 6291462, 3147779, 5243909, 3072, 7340039, 2099202, 1051649, 4195332, 3147779, 6291462, 4195332, 3072, 4195332, 1051649, 5243909, 4195332, 7340039, 3147779, 2099202, 4195332, 3147779, 5243909, 4195332, 7340039, 1051649, 6291462, 3072, 3147779, 7340039, 3072, 6291462, 1051649, 5243909, 2099202, 5243909, 3072, 4195332, 6291462, 1051649, 4195332, 3072, 7340039, 3147779, 4195332, 1051649, 2099202, 6291462, 7340039, 3147779, 1051649, 6291462, + 7340039, 3147779, 6291462, 2099202, 1051649, 3147779, 7340039, 4195332, 7340039, 3072, 2099202, 6291462, 1051649, 7340039, 4195332, 3072, 4195332, 3147779, 5243909, 1051649, 5243909, 2099202, 4195332, 5243909, 3147779, 3072, 6291462, 1051649, 3147779, 2099202, 6291462, 1051649, 6291462, 3072, 3147779, 7340039, 1051649, 3147779, 6291462, 7340039, 4195332, 3072, 4195332, 7340039, 3147779, 2099202, 4195332, 7340039, 3072, 1051649, 5243909, 3072, 6291462, 3072, 2099202, 6291462, 5243909, 2099202, 5243909, 3072, 7340039, 4195332, 6291462, 1051649, 5243909, 3072, 7340039, 1051649, 6291462, 3072, 5243909, 3147779, 3072, 2099202, 6291462, 3147779, 7340039, 1051649, 2099202, 7340039, 4195332, 2099202, 6291462, 3147779, 7340039, 1051649, 1051649, 3147779, 7340039, 3147779, 7340039, 6291462, 2099202, 3072, 5243909, 1051649, 6291462, 3072, 7340039, 2099202, 5243909, 2099202, 4195332, 5243909, 4195332, 2099202, 5243909, 3147779, 7340039, 3072, 6291462, 1051649, 7340039, 2099202, 3147779, 7340039, 2099202, 5243909, 3147779, 6291462, 3072, 7340039, 4195332, 3147779, 1051649, 5243909, 4195332, 2099202, + 1051649, 5243909, 3072, 7340039, 3147779, 5243909, 1051649, 2099202, 6291462, 4195332, 5243909, 3072, 4195332, 3147779, 6291462, 5243909, 7340039, 3072, 2099202, 6291462, 4195332, 1051649, 6291462, 3072, 7340039, 5243909, 3147779, 4195332, 7340039, 1051649, 4195332, 5243909, 2099202, 6291462, 3072, 6291462, 2099202, 5243909, 3072, 3147779, 1051649, 6291462, 3147779, 1051649, 5243909, 6291462, 1051649, 3147779, 5243909, 7340039, 3147779, 3147779, 2099202, 4195332, 7340039, 1051649, 3072, 4195332, 3147779, 5243909, 2099202, 3072, 2099202, 7340039, 3147779, 1051649, 3147779, 6291462, 2099202, 3147779, 5243909, 2099202, 7340039, 4195332, 7340039, 1051649, 3147779, 5243909, 3072, 6291462, 1051649, 5243909, 3072, 5243909, 2099202, 7340039, 4195332, 6291462, 1051649, 5243909, 2099202, 3072, 4195332, 6291462, 3147779, 7340039, 2099202, 4195332, 1051649, 5243909, 3072, 6291462, 3147779, 1051649, 3072, 7340039, 1051649, 5243909, 2099202, 4195332, 3147779, 5243909, 4195332, 6291462, 3072, 5243909, 3072, 6291462, 1051649, 2099202, 6291462, 3147779, 3072, 5243909, 1051649, 7340039, 2099202, 6291462, + 4195332, 3147779, 6291462, 4195332, 3072, 2099202, 6291462, 5243909, 1051649, 2099202, 3147779, 7340039, 1051649, 7340039, 3072, 2099202, 2099202, 6291462, 3147779, 3072, 2099202, 7340039, 3147779, 2099202, 4195332, 2099202, 3072, 5243909, 1051649, 6291462, 3072, 3147779, 5243909, 2099202, 5243909, 1051649, 4195332, 6291462, 2099202, 7340039, 4195332, 5243909, 2099202, 6291462, 3072, 4195332, 6291462, 2099202, 3072, 4195332, 1051649, 7340039, 6291462, 1051649, 5243909, 3147779, 5243909, 3147779, 7340039, 1051649, 6291462, 4195332, 6291462, 4195332, 3072, 5243909, 6291462, 1051649, 5243909, 7340039, 3072, 6291462, 3147779, 1051649, 4195332, 2099202, 6291462, 4195332, 2099202, 4195332, 1051649, 3147779, 6291462, 4195332, 3072, 5243909, 2099202, 3072, 6291462, 1051649, 6291462, 3147779, 7340039, 1051649, 4195332, 3072, 4195332, 6291462, 2099202, 3147779, 6291462, 1051649, 7340039, 5243909, 3147779, 6291462, 4195332, 3147779, 3072, 6291462, 3072, 2099202, 1051649, 3147779, 7340039, 2099202, 4195332, 3147779, 4195332, 5243909, 1051649, 5243909, 2099202, 7340039, 4195332, 3072, 4195332, 3072, + 7340039, 2099202, 1051649, 5243909, 7340039, 4195332, 1051649, 3147779, 5243909, 7340039, 3072, 6291462, 4195332, 1051649, 3147779, 6291462, 4195332, 1051649, 5243909, 7340039, 4195332, 3072, 5243909, 6291462, 1051649, 6291462, 7340039, 3147779, 2099202, 5243909, 3147779, 7340039, 1051649, 4195332, 3147779, 7340039, 4195332, 3072, 5243909, 1051649, 4195332, 3072, 7340039, 3147779, 5243909, 2099202, 3072, 6291462, 5243909, 3147779, 5243909, 3072, 2099202, 4195332, 1051649, 7340039, 1051649, 6291462, 3072, 7340039, 1051649, 3147779, 1051649, 4195332, 7340039, 3147779, 2099202, 4195332, 3072, 3147779, 4195332, 3072, 5243909, 6291462, 3072, 5243909, 3147779, 3072, 7340039, 2099202, 7340039, 5243909, 3072, 3147779, 7340039, 2099202, 4195332, 7340039, 3147779, 4195332, 3072, 3147779, 5243909, 2099202, 7340039, 1051649, 6291462, 1051649, 4195332, 7340039, 2099202, 4195332, 3072, 7340039, 2099202, 3072, 1051649, 7340039, 6291462, 4195332, 7340039, 5243909, 6291462, 3072, 5243909, 2099202, 6291462, 3072, 7340039, 3072, 7340039, 2099202, 6291462, 1051649, 3147779, 7340039, 5243909, 2099202, + 1051649, 7340039, 5243909, 3072, 2099202, 5243909, 7340039, 3072, 4195332, 2099202, 4195332, 3147779, 2099202, 5243909, 6291462, 1051649, 5243909, 7340039, 2099202, 3147779, 1051649, 6291462, 3147779, 3072, 4195332, 4195332, 3147779, 3072, 7340039, 6291462, 3072, 2099202, 7340039, 3072, 5243909, 1051649, 2099202, 6291462, 3147779, 3147779, 7340039, 2099202, 4195332, 1051649, 7340039, 5243909, 2099202, 4195332, 1051649, 7340039, 2099202, 7340039, 5243909, 3147779, 6291462, 4195332, 2099202, 5243909, 3147779, 2099202, 3147779, 7340039, 5243909, 2099202, 3072, 5243909, 1051649, 6291462, 2099202, 6291462, 2099202, 7340039, 3147779, 2099202, 7340039, 1051649, 6291462, 5243909, 1051649, 5243909, 3072, 2099202, 6291462, 4195332, 1051649, 5243909, 1051649, 4195332, 3072, 7340039, 5243909, 2099202, 3072, 6291462, 3147779, 5243909, 2099202, 5243909, 3072, 3147779, 6291462, 2099202, 4195332, 2099202, 5243909, 3147779, 5243909, 1051649, 4195332, 2099202, 1051649, 2099202, 3147779, 6291462, 1051649, 7340039, 1051649, 6291462, 3147779, 4195332, 1051649, 4195332, 3072, 5243909, 4195332, 1051649, 3072, 5243909, + 4195332, 3072, 4195332, 3147779, 6291462, 1051649, 2099202, 6291462, 5243909, 1051649, 6291462, 3072, 7340039, 3147779, 2099202, 4195332, 3072, 3147779, 5243909, 1051649, 7340039, 4195332, 2099202, 7340039, 6291462, 3072, 1051649, 5243909, 4195332, 1051649, 7340039, 4195332, 3147779, 6291462, 2099202, 7340039, 4195332, 1051649, 7340039, 3072, 5243909, 1051649, 6291462, 3147779, 3072, 3147779, 7340039, 5243909, 2099202, 4195332, 3072, 3147779, 1051649, 6291462, 3072, 2099202, 6291462, 3072, 5243909, 4195332, 6291462, 3072, 2099202, 6291462, 4195332, 1051649, 7340039, 3147779, 7340039, 1051649, 5243909, 1051649, 5243909, 1051649, 4195332, 4195332, 3072, 3147779, 2099202, 6291462, 4195332, 7340039, 3147779, 3072, 7340039, 3147779, 6291462, 2099202, 6291462, 2099202, 3147779, 6291462, 4195332, 1051649, 5243909, 3072, 7340039, 3147779, 7340039, 5243909, 3072, 5243909, 1051649, 6291462, 1051649, 7340039, 3147779, 7340039, 3072, 3147779, 5243909, 7340039, 4195332, 3072, 4195332, 3147779, 5243909, 3147779, 2099202, 5243909, 2099202, 5243909, 3147779, 7340039, 3072, 6291462, 6291462, 3147779, + 7340039, 3147779, 6291462, 1051649, 4195332, 3147779, 7340039, 3147779, 3072, 7340039, 3147779, 5243909, 1051649, 5243909, 3072, 7340039, 3147779, 6291462, 3072, 4195332, 3147779, 3072, 5243909, 1051649, 2099202, 5243909, 7340039, 3147779, 1051649, 4195332, 2099202, 5243909, 3072, 1051649, 5243909, 3072, 5243909, 1051649, 5243909, 5243909, 2099202, 4195332, 3072, 7340039, 4195332, 1051649, 4195332, 3072, 7340039, 1051649, 6291462, 4195332, 6291462, 2099202, 4195332, 7340039, 4195332, 3147779, 7340039, 3072, 2099202, 7340039, 3147779, 3072, 6291462, 3147779, 5243909, 3072, 2099202, 4195332, 3147779, 6291462, 3072, 6291462, 2099202, 7340039, 3147779, 7340039, 4195332, 3072, 3147779, 1051649, 6291462, 4195332, 2099202, 5243909, 3072, 5243909, 4195332, 3072, 6291462, 1051649, 7340039, 4195332, 2099202, 6291462, 4195332, 1051649, 3147779, 1051649, 7340039, 3147779, 6291462, 4195332, 1051649, 5243909, 3072, 4195332, 5243909, 6291462, 1051649, 2099202, 1051649, 6291462, 7340039, 2099202, 5243909, 3072, 6291462, 3072, 7340039, 1051649, 6291462, 2099202, 3147779, 2099202, 4195332, 2099202, + 2099202, 5243909, 1051649, 6291462, 3072, 5243909, 1051649, 4195332, 6291462, 2099202, 4195332, 2099202, 6291462, 4195332, 6291462, 1051649, 4195332, 2099202, 7340039, 2099202, 6291462, 2099202, 7340039, 3147779, 6291462, 1051649, 4195332, 6291462, 2099202, 6291462, 3072, 6291462, 4195332, 6291462, 2099202, 3147779, 7340039, 3147779, 3147779, 1051649, 6291462, 2099202, 6291462, 3147779, 5243909, 1051649, 6291462, 2099202, 3147779, 6291462, 2099202, 3072, 4195332, 3072, 5243909, 1051649, 5243909, 1051649, 1051649, 5243909, 1051649, 5243909, 4195332, 6291462, 2099202, 7340039, 3072, 6291462, 4195332, 7340039, 3072, 2099202, 4195332, 4195332, 5243909, 1051649, 5243909, 1051649, 6291462, 2099202, 5243909, 5243909, 1051649, 3147779, 6291462, 1051649, 3147779, 7340039, 1051649, 7340039, 2099202, 5243909, 3147779, 3072, 7340039, 1051649, 5243909, 2099202, 6291462, 4195332, 3147779, 3072, 2099202, 3147779, 7340039, 2099202, 6291462, 2099202, 3147779, 3072, 4195332, 7340039, 5243909, 3147779, 3072, 4195332, 1051649, 7340039, 4195332, 6291462, 2099202, 4195332, 1051649, 5243909, 7340039, 1051649, 6291462, 3072, + 6291462, 1051649, 7340039, 3147779, 7340039, 2099202, 6291462, 3147779, 3072, 6291462, 1051649, 7340039, 3072, 3147779, 2099202, 7340039, 3072, 5243909, 1051649, 5243909, 5243909, 1051649, 4195332, 3072, 2099202, 7340039, 3147779, 3072, 5243909, 3147779, 7340039, 2099202, 3072, 4195332, 1051649, 7340039, 3072, 6291462, 3072, 7340039, 2099202, 7340039, 3072, 4195332, 2099202, 6291462, 3147779, 7340039, 3072, 5243909, 3147779, 5243909, 7340039, 3147779, 7340039, 2099202, 3147779, 6291462, 4195332, 3147779, 7340039, 3147779, 1051649, 5243909, 3072, 3147779, 5243909, 2099202, 1051649, 3147779, 5243909, 6291462, 7340039, 3072, 3147779, 6291462, 3072, 4195332, 3147779, 7340039, 3072, 4195332, 7340039, 2099202, 3072, 7340039, 5243909, 3072, 5243909, 3147779, 4195332, 3072, 6291462, 2099202, 5243909, 3147779, 3072, 7340039, 4195332, 3072, 6291462, 5243909, 7340039, 4195332, 3072, 5243909, 1051649, 4195332, 7340039, 5243909, 1051649, 2099202, 3072, 6291462, 2099202, 7340039, 3147779, 1051649, 3147779, 3147779, 5243909, 3072, 7340039, 3147779, 3072, 5243909, 3147779, 4195332, +}; + + +#elif (DFB_DITHER565 == DFB_DITHER_SIMPLE) + + +#define DM_WIDTH 8 +#define DM_HEIGHT 8 +#define DM_WIDTH_SHIFT 3 + +static const u32 DM_565[DM_WIDTH * DM_HEIGHT] = +{ + 3072, 4195332, 1051649, 5243909, 3072, 4195332, 1051649, 5243909, + 6291462, 2099202, 7340039, 3147779, 6291462, 2099202, 7340039, 3147779, + 1051649, 5243909, 3072, 4195332, 1051649, 5243909, 3072, 4195332, + 7340039, 3147779, 6291462, 2099202, 7340039, 3147779, 6291462, 2099202, + 3072, 4195332, 1051649, 5243909, 3072, 4195332, 1051649, 5243909, + 6291462, 2099202, 7340039, 3147779, 6291462, 2099202, 7340039, 3147779, + 1051649, 5243909, 3072, 4195332, 1051649, 5243909, 3072, 4195332, + 7340039, 3147779, 6291462, 2099202, 7340039, 3147779, 6291462, 2099202, +}; + +#endif + + +#endif /* __DITHER565_H__ */ diff --git a/Source/DirectFB/src/misc/gfx_util.c b/Source/DirectFB/src/misc/gfx_util.c new file mode 100755 index 0000000..1165112 --- /dev/null +++ b/Source/DirectFB/src/misc/gfx_util.c @@ -0,0 +1,964 @@ +/* + (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) + (c) Copyright 2000-2004 Convergence (integrated media) GmbH + + All rights reserved. + + Written by Denis Oliver Kropp <dok@directfb.org>, + Andreas Hundt <andi@fischlustig.de>, + Sven Neumann <neo@directfb.org>, + Ville Syrjälä <syrjala@sci.fi> and + Claudio Ciccani <klan@users.sf.net>. + + Scaling routines ported from gdk_pixbuf by Sven Neumann + <sven@convergence.de>. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <config.h> + +#include <stdlib.h> +#include <stdio.h> + +#include <pthread.h> + +#include <directfb.h> + +#include <core/core.h> +#include <core/coredefs.h> +#include <core/coretypes.h> + +#include <core/palette.h> +#include <core/surface.h> + +#include <direct/memcpy.h> +#include <direct/mem.h> +#include <direct/messages.h> +#include <direct/util.h> + +#include <misc/util.h> +#include <misc/dither565.h> +#include <misc/gfx_util.h> + +#include <gfx/clip.h> +#include <gfx/convert.h> + + +#define SUBSAMPLE_BITS 4 +#define SUBSAMPLE (1 << SUBSAMPLE_BITS) +#define SUBSAMPLE_MASK ((1 << SUBSAMPLE_BITS)-1) +#define SCALE_SHIFT 16 + + +typedef struct _PixopsFilter PixopsFilter; + +struct _PixopsFilter { + int *weights; + int n_x; + int n_y; + float x_offset; + float y_offset; +}; + + +static void write_argb_span (u32 *src, u8 *dst[], int len, + int dx, int dy, CoreSurface *dst_surface) +{ + CorePalette *palette = dst_surface->palette; + u8 *d = dst[0]; + u8 *d1,*d2; + int i, j; + + if (dst_surface->config.caps & DSCAPS_PREMULTIPLIED) { + for (i = 0; i < len; i++) { + const u32 s = src[i]; + const u32 a = (s >> 24) + 1; + + src[i] = ((((s & 0x00ff00ff) * a) >> 8) & 0x00ff00ff) | + ((((s & 0x0000ff00) * a) >> 8) & 0x0000ff00) | + ((((s & 0xff000000) ) ) ); + } + } + + switch (dst_surface->config.format) { + case DSPF_A1: + for (i = 0; i < len; i++) { + if (i & 7) + d[i>>3] |= (src[i] >> 31) << (7-(i&7)); + else + d[i>>3] = (src[i] >> 24) & 0x80; + } + break; + + case DSPF_A4: + for (i = 0, j = 0; i < len; i += 2, j++) + d[j] = ((src[i] >> 24) & 0xF0) | (src[i+1] >> 28); + break; + + case DSPF_A8: + for (i = 0; i < len; i++) + d[i] = src[i] >> 24; + break; + + case DSPF_RGB332: + for (i = 0; i < len; i++) + d[i] = RGB32_TO_RGB332( src[i] ); + break; + + case DSPF_ARGB1555: + for (i = 0; i < len; i++) + ((u16*)d)[i] = ARGB_TO_ARGB1555( src[i] ); + break; + + case DSPF_ARGB2554: + for (i = 0; i < len; i++) + ((u16*)d)[i] = ARGB_TO_ARGB2554( src[i] ); + break; + + case DSPF_ARGB4444: + for (i = 0; i < len; i++) + ((u16*)d)[i] = ARGB_TO_ARGB4444( src[i] ); + break; + + case DSPF_RGBA4444: + for (i = 0; i < len; i++) + ((u16*)d)[i] = ARGB_TO_RGBA4444( src[i] ); + break; + + case DSPF_RGB16: +#ifdef DFB_DITHER565 + /* use a pre-generated dither matrix to improve the appearance of the result */ + { + const u32 *dm = DM_565 + ((dy & (DM_HEIGHT - 1)) << DM_WIDTH_SHIFT); + + for (i = 0; i < len; i++) { + u32 rgb = ((src[i] & 0xFF) | + (src[i] & 0xFF00) << 2 | + (src[i] & 0xFF0000) << 4); + + rgb += dm[(dx + i) & (DM_WIDTH - 1)]; + rgb += (0x10040100 + - ((rgb & 0x1e0001e0) >> 5) + - ((rgb & 0x00070000) >> 6)); + + ((u16*)d)[i] = (((rgb & 0x0f800000) >> 12) | + ((rgb & 0x0003f000) >> 7) | + ((rgb & 0x000000f8) >> 3)); + } + } +#else + for (i = 0; i < len; i++) + ((u16*)d)[i] = RGB32_TO_RGB16( src[i] ); +#endif + break; + + case DSPF_ARGB1666: + for (i = 0; i < len; i++) { + const u32 pixel = PIXEL_ARGB1666( src[i] >> 24, + src[i] >> 16, + src[i] >> 8, + src[i] ); + + *d++ = pixel; + *d++ = pixel >> 8; + *d++ = pixel >> 16; + } + break; + + case DSPF_ARGB6666: + for (i = 0; i < len; i++) { + const u32 pixel = PIXEL_ARGB6666( src[i] >> 24, + src[i] >> 16, + src[i] >> 8, + src[i] ); + + *d++ = pixel; + *d++ = pixel >> 8; + *d++ = pixel >> 16; + } + break; + + case DSPF_RGB18: + for (i = 0; i < len; i++) { + const u32 pixel = PIXEL_RGB18( src[i] >> 16, + src[i] >> 8, + src[i] ); + + *d++ = pixel; + *d++ = pixel >> 8; + *d++ = pixel >> 16; + } + break; + + case DSPF_RGB24: + for (i = 0; i < len; i++) { +#ifdef WORDS_BIGENDIAN + *d++ = src[i] >> 16; + *d++ = src[i] >> 8; + *d++ = src[i]; +#else + *d++ = src[i]; + *d++ = src[i] >> 8; + *d++ = src[i] >> 16; +#endif + } + break; + + case DSPF_RGB32: + case DSPF_ARGB: + direct_memcpy( d, src, len*4 ); + break; + + case DSPF_AiRGB: + for (i = 0; i < len; i++) + ((u32*)d)[i] = src[i] ^ 0xff000000; + break; + + case DSPF_LUT8: + if (palette) { + for (i = 0; i < len; i++) { + d[i] = dfb_palette_search( palette, + (src[i] >> 16) & 0xff, + (src[i] >> 8) & 0xff, + (src[i] ) & 0xff, + (src[i] >> 24) & 0xff ); + } + } + break; + + case DSPF_ALUT44: + if (palette) { + for (i = 0; i < len; i++) { + d[i] = ((src[i] >> 24) & 0xf0) + + dfb_palette_search( palette, + (src[i] >> 16) & 0xff, + (src[i] >> 8) & 0xff, + (src[i] ) & 0xff, 0x80 ); + } + } + break; + + case DSPF_YUY2: + if (dx & 1) { + u32 y, u, v; + + RGB_TO_YCBCR( (src[0] >> 16) & 0xff, + (src[0] >> 8) & 0xff, + (src[0] ) & 0xff, y, u, v ); + *((u16*)d) = y | (v << 8); + d += 2; + src++; + len--; + } + for (i = 0; i < (len-1); i += 2) { + u32 y0, u, v; + u32 y1, u1, v1; + + RGB_TO_YCBCR( (src[i+0] >> 16) & 0xff, + (src[i+0] >> 8) & 0xff, + (src[i+0] ) & 0xff, y0, u, v ); + RGB_TO_YCBCR( (src[i+1] >> 16) & 0xff, + (src[i+1] >> 8) & 0xff, + (src[i+1] ) & 0xff, y1, u1, v1 ); + + u = (u + u1) >> 1; + v = (v + v1) >> 1; + + ((u16*)d)[i+0] = y0 | (u << 8); + ((u16*)d)[i+1] = y1 | (v << 8); + } + if (len & 1) { + u32 y, u, v; + + src += len-1; + d += (len-1) * 2; + + RGB_TO_YCBCR( (*src >> 16) & 0xff, + (*src >> 8) & 0xff, + (*src ) & 0xff, y, u, v ); + *((u16*)d) = y | (u << 8); + } + break; + + case DSPF_UYVY: + if (dx & 1) { + u32 y, u, v; + + RGB_TO_YCBCR( (src[0] >> 16) & 0xff, + (src[0] >> 8) & 0xff, + (src[0] ) & 0xff, y, u, v ); + *((u16*)d) = v | (y << 8); + d += 2; + src++; + len--; + } + for (i = 0; i < (len-1); i += 2) { + u32 y0, u, v; + u32 y1, u1, v1; + + RGB_TO_YCBCR( (src[i+0] >> 16) & 0xff, + (src[i+0] >> 8) & 0xff, + (src[i+0] ) & 0xff, y0, u, v ); + RGB_TO_YCBCR( (src[i+1] >> 16) & 0xff, + (src[i+1] >> 8) & 0xff, + (src[i+1] ) & 0xff, y1, u1, v1 ); + + u = (u + u1) >> 1; + v = (v + v1) >> 1; + + ((u16*)d)[i+0] = u | (y0 << 8); + ((u16*)d)[i+1] = v | (y1 << 8); + } + if (len & 1) { + u32 y, u, v; + + src += len-1; + d += (len-1) * 2; + + RGB_TO_YCBCR( (*src >> 16) & 0xff, + (*src >> 8) & 0xff, + (*src ) & 0xff, y, u, v ); + *((u16*)d) = u | (y << 8); + } + break; + + case DSPF_AYUV: + for (i = 0; i < len; i++) { + u32 a, y, u, v; + + RGB_TO_YCBCR( (src[i] >> 16) & 0xff, + (src[i] >> 8) & 0xff, + (src[i] ) & 0xff, y, u, v ); + a = (src[i] >> 24) & 0xff; + + ((u32*)d)[i] = PIXEL_AYUV( a, y, u, v ); + } + break; + + case DSPF_YV12: + case DSPF_I420: + d1 = dst[1]; + d2 = dst[2]; + for (i = 0; i < (len-1); i += 2) { + u32 y0, u0, v0; + u32 y1, u1, v1; + + RGB_TO_YCBCR( (src[i+0] >> 16) & 0xff, + (src[i+0] >> 8) & 0xff, + (src[i+0] ) & 0xff, y0, u0, v0 ); + RGB_TO_YCBCR( (src[i+1] >> 16) & 0xff, + (src[i+1] >> 8) & 0xff, + (src[i+1] ) & 0xff, y1, u1, v1 ); + + d[i+0] = y0; + d[i+1] = y1; + + if (dy & 1) { + d1[i>>1] = (u0 + u1) >> 1; + d2[i>>1] = (v0 + v1) >> 1; + } + } + if (len & 1) { + u32 y, u, v; + + i = len-1; + + RGB_TO_YCBCR( (src[i] >> 16) & 0xff, + (src[i] >> 8) & 0xff, + (src[i] ) & 0xff, y, u, v ); + + d[i] = y; + if (dy & 1) { + d1[i>>1] = u; + d2[i>>1] = v; + } + } + break; + + case DSPF_NV12: + case DSPF_NV16: + d1 = dst[1]; + for (i = 0; i < (len-1); i += 2) { + u32 y0, u0, v0; + u32 y1, u1, v1; + + RGB_TO_YCBCR( (src[i+0] >> 16) & 0xff, + (src[i+0] >> 8) & 0xff, + (src[i+0] ) & 0xff, y0, u0, v0 ); + RGB_TO_YCBCR( (src[i+1] >> 16) & 0xff, + (src[i+1] >> 8) & 0xff, + (src[i+1] ) & 0xff, y1, u1, v1 ); + + d[i+0] = y0; + d[i+1] = y1; + + if (dst_surface->config.format == DSPF_NV16 || dy & 1) { +#ifdef WORDS_BIGENDIAN + ((u16*)d1)[i>>1] = ((v0 + v1) >> 1) | + (((u0 + u1) >> 1) << 8); +#else + ((u16*)d1)[i>>1] = ((u0 + u1) >> 1) | + (((v0 + v1) >> 1) << 8); +#endif + } + } + if (len & 1) { + u32 y, u, v; + + i = len-1; + + RGB_TO_YCBCR( (src[i] >> 16) & 0xff, + (src[i] >> 8) & 0xff, + (src[i] ) & 0xff, y, u, v ); + + d[i] = y; + if (dst_surface->config.format == DSPF_NV16 || dy & 1) +#ifdef WORDS_BIGENDIAN + ((u16*)d1)[i>>1] = v | (u << 8); +#else + ((u16*)d1)[i>>1] = u | (v << 8); +#endif + } + break; + + case DSPF_NV21: + d1 = dst[1]; + for (i = 0; i < (len-1); i += 2) { + u32 y0, u0, v0; + u32 y1, u1, v1; + + RGB_TO_YCBCR( (src[i+0] >> 16) & 0xff, + (src[i+0] >> 8) & 0xff, + (src[i+0] ) & 0xff, y0, u0, v0 ); + RGB_TO_YCBCR( (src[i+1] >> 16) & 0xff, + (src[i+1] >> 8) & 0xff, + (src[i+1] ) & 0xff, y1, u1, v1 ); + + d[i+0] = y0; + d[i+1] = y1; + + if (dy & 1) { +#ifdef WORDS_BIGENDIAN + ((u16*)d1)[i>>1] = ((u0 + u1) >> 1) | + (((v0 + v1) >> 1) << 8); +#else + ((u16*)d1)[i>>1] = ((v0 + v1) >> 1) | + (((u0 + u1) >> 1) << 8); +#endif + } + } + if (len & 1) { + u32 y, u, v; + + i = len-1; + + RGB_TO_YCBCR( (src[i] >> 16) & 0xff, + (src[i] >> 8) & 0xff, + (src[i] ) & 0xff, y, u, v ); + + d[i] = y; + if (dy & 1) +#ifdef WORDS_BIGENDIAN + ((u16*)d1)[i>>1] = u | (v << 8); +#else + ((u16*)d1)[i>>1] = v | (u << 8); +#endif + } + break; + + case DSPF_RGB555: + for (i = 0; i < len; i++) + ((u16*)d)[i] = ARGB_TO_RGB555( src[i] ); + break; + + case DSPF_BGR555: + for (i = 0; i < len; i++) + ((u16*)d)[i] = ARGB_TO_BGR555( src[i] ); + break; + + case DSPF_RGB444: + for (i = 0; i < len; i++) + ((u16*)d)[i] = ARGB_TO_RGB444( src[i] ); + break; + + default: + D_ONCE( "unimplemented destination format (0x%08x)", dst_surface->config.format ); + break; + } +} + +#define LINE_PTR(dst,caps,y,h,pitch) \ + ((caps & DSCAPS_SEPARATED) \ + ? (((u8*)(dst)) + (y)/2 * (pitch) + (((y)%2) ? (h)/2 * (pitch) : 0)) \ + : (((u8*)(dst)) + (y) * (pitch))) + +void dfb_copy_buffer_32( u32 *src, + void *dst, int dpitch, DFBRectangle *drect, + CoreSurface *dst_surface, const DFBRegion *dst_clip ) +{ + void *dst1, *dst2; + int sw = drect->w; + int y, x; + + if (dst_clip) { + int sx = 0, sy = 0; + + if (drect->x < dst_clip->x1) { + sx = dst_clip->x1 - drect->x; + drect->w -= sx; + drect->x += sx; + } + if (drect->y < dst_clip->y1) { + sy = dst_clip->y1 - drect->y; + drect->h -= sy; + drect->y += sy; + } + if ((drect->x + drect->w - 1) > dst_clip->x2) { + drect->w -= drect->x + drect->w - 1 - dst_clip->x2; + } + if ((drect->y + drect->h - 1) > dst_clip->y2) { + drect->h -= drect->y + drect-> h - 1 - dst_clip->y2; + } + + src += sy * sw + sx; + } + + if (drect->w < 1 || drect->h < 1) + return; + x = drect->x; + + switch (dst_surface->config.format) { + case DSPF_YV12: + case DSPF_I420: + if (dst_surface->config.format == DSPF_I420) { + dst1 = dst + dpitch * dst_surface->config.size.h; + dst2 = dst1 + dpitch/2 * dst_surface->config.size.h/2; + } else { + dst2 = dst + dpitch * dst_surface->config.size.h; + dst1 = dst2 + dpitch/2 * dst_surface->config.size.h/2; + } + + for (y = drect->y; y < drect->y + drect->h; y++) { + u8 *d[3]; + + d[0] = LINE_PTR( dst, dst_surface->config.caps, y, + dst_surface->config.size.h, dpitch ) + x; + d[1] = LINE_PTR( dst1, dst_surface->config.caps, y/2, + dst_surface->config.size.h/2, dpitch/2 ) + x/2; + d[2] = LINE_PTR( dst2, dst_surface->config.caps, y/2, + dst_surface->config.size.h/2, dpitch/2 ) + x/2; + + write_argb_span( src, d, drect->w, x, y, dst_surface ); + + src += sw; + } + break; + + case DSPF_NV12: + case DSPF_NV21: + dst1 = dst + dpitch * dst_surface->config.size.h; + + for (y = drect->y; y < drect->y + drect->h; y++) { + u8 *d[2]; + + d[0] = LINE_PTR( dst, dst_surface->config.caps, y, + dst_surface->config.size.h, dpitch ) + x; + d[1] = LINE_PTR( dst1, dst_surface->config.caps, y/2, + dst_surface->config.size.h/2, dpitch ) + (x&~1); + + write_argb_span( src, d, drect->w, x, y, dst_surface ); + + src += sw; + } + break; + + case DSPF_NV16: + dst1 = dst + dpitch * dst_surface->config.size.h; + + for (y = drect->y; y < drect->y + drect->h; y++) { + u8 *d[2]; + + d[0] = LINE_PTR( dst, dst_surface->config.caps, y, + dst_surface->config.size.h, dpitch ) + x; + d[1] = LINE_PTR( dst1, dst_surface->config.caps, y, + dst_surface->config.size.h, dpitch ) + (x&~1); + + write_argb_span( src, d, drect->w, x, y, dst_surface ); + + src += sw; + } + break; + + default: + for (y = drect->y; y < drect->y + drect->h; y++) { + u8 *d[1]; + + d[0] = LINE_PTR( dst, dst_surface->config.caps, + y, dst_surface->config.size.h, dpitch ) + + DFB_BYTES_PER_LINE( dst_surface->config.format, x ); + + write_argb_span( src, d, drect->w, x, y, dst_surface ); + + src += sw; + } + break; + } +} + +static int bilinear_make_fast_weights( PixopsFilter *filter, + const float x_scale, const float y_scale ) +{ + int i_offset, j_offset; + float *x_weights, *y_weights; + int n_x, n_y; + + if (x_scale > 1.0) { /* Bilinear */ + n_x = 2; + filter->x_offset = 0.5 * (1.0 / x_scale - 1); + } + else { /* Tile */ + n_x = D_ICEIL (1.0 + 1.0 / x_scale); + filter->x_offset = 0.0; + } + + if (y_scale > 1.0) { /* Bilinear */ + n_y = 2; + filter->y_offset = 0.5 * (1.0 / y_scale - 1); + } + else { /* Tile */ + n_y = D_ICEIL (1.0 + 1.0 / y_scale); + filter->y_offset = 0.0; + } + + if (n_x > 64) + n_x = 64; + + if (n_y > 64) + n_y = 64; + + filter->n_y = n_y; + filter->n_x = n_x; + filter->weights = (int *) D_MALLOC( SUBSAMPLE * SUBSAMPLE * n_x * n_y * + sizeof (int) ); + if (!filter->weights) { + D_WARN ("couldn't allocate memory for scaling"); + return 0; + } + + x_weights = (float *) alloca (n_x * sizeof (float)); + y_weights = (float *) alloca (n_y * sizeof (float)); + + if (!x_weights || !y_weights) { + D_FREE( filter->weights ); + + D_WARN ("couldn't allocate memory for scaling"); + return 0; + } + + for (i_offset = 0; i_offset < SUBSAMPLE; i_offset++) + for (j_offset = 0; j_offset < SUBSAMPLE; j_offset++) { + int *pixel_weights = filter->weights + + ((i_offset * SUBSAMPLE) + j_offset) + * n_x * n_y; + + float x = (float)j_offset / 16; + float y = (float)i_offset / 16; + int i, j; + + if (x_scale > 1.0) { /* Bilinear */ + for (i = 0; i < n_x; i++) { + x_weights[i] = ((i == 0) ? (1 - x) : x) / x_scale; + } + } + else { /* Tile */ + for (i = 0; i < n_x; i++) { + if (i < x) { + if (i + 1 > x) + x_weights[i] = MIN( i + 1, x + 1.0 / x_scale ) -x; + else + x_weights[i] = 0; + } + else { + if (x + 1/x_scale > i) + x_weights[i] = MIN( i + 1, x + 1.0 / x_scale ) -i; + else + x_weights[i] = 0; + } + } + } + + if (y_scale > 1.0) { /* Bilinear */ + for (i = 0; i < n_y; i++) { + y_weights[i] = ((i == 0) ? (1 - y) : y) / y_scale; + } + } + else { /* Tile */ + for (i = 0; i < n_y; i++) { + if (i < y) { + if (i + 1 > y) + y_weights[i] = MIN( i + 1, y + 1.0 / y_scale ) -y; + else + y_weights[i] = 0; + } + else { + if (y + 1/y_scale > i) + y_weights[i] = MIN( i + 1, y + 1.0 / y_scale ) -i; + else + y_weights[i] = 0; + } + } + } + + for (i = 0; i < n_y; i++) { + for (j = 0; j < n_x; j++) { + pixel_weights[n_x * i + j] = + 65536.0 * x_weights[j] * x_scale + * y_weights[i] * y_scale; + } + } + } + + return 1; +} + +static void scale_pixel( const int *weights, int n_x, int n_y, + u32 *dst, const u32 **src, int x, int sw ) +{ + u32 r = 0, g = 0, b = 0, a = 0; + int i, j; + + for (i = 0; i < n_y; i++) { + const int *pixel_weights = weights + n_x * i; + + for (j = 0; j < n_x; j++) { + const u32 *q; + + if (x + j < 0) + q = src[i]; + else if (x + j < sw) + q = src[i] + x + j; + else + q = src[i] + sw - 1; + + { + const u32 ta = ((*q & 0xFF000000) >> 24) * pixel_weights[j]; + + b += ta * (((*q & 0xFF)) + 1); + g += ta * (((*q & 0xFF00) >> 8) + 1); + r += ta * (((*q & 0xFF0000) >> 16) + 1); + a += ta; + } + } + } + + r = (r >> 24) == 0xFF ? 0xFF : (r + 0x800000) >> 24; + g = (g >> 24) == 0xFF ? 0xFF : (g + 0x800000) >> 24; + b = (b >> 24) == 0xFF ? 0xFF : (b + 0x800000) >> 24; + a = (a >> 16) == 0xFF ? 0xFF : (a + 0x8000) >> 16; + + *dst = (a << 24) | (r << 16) | (g << 8) | b; +} + +static u32* scale_line( const int *weights, int n_x, int n_y, + u32 *dst, u32 *dst_end, + const u32 **src, int x, int x_step, int sw ) +{ + while (dst < dst_end) { + const int x_scaled = x >> SCALE_SHIFT; + const int *pixel_weights = weights + ((x >> (SCALE_SHIFT - + SUBSAMPLE_BITS)) + & SUBSAMPLE_MASK) * n_x * n_y; + u32 r = 0, g = 0, b = 0, a = 0; + int i, j; + + for (i = 0; i < n_y; i++) { + const int *line_weights = pixel_weights + n_x * i; + const u32 *q = src[i] + x_scaled; + + for (j = 0; j < n_x; j++) { + const u32 ta = ((*q & 0xFF000000) >> 24) * line_weights[j]; + + b += ta * (((*q & 0xFF)) + 1); + g += ta * (((*q & 0xFF00) >> 8) + 1); + r += ta * (((*q & 0xFF0000) >> 16) + 1); + a += ta; + + q++; + } + } + + r = (r >> 24) == 0xFF ? 0xFF : (r + 0x800000) >> 24; + g = (g >> 24) == 0xFF ? 0xFF : (g + 0x800000) >> 24; + b = (b >> 24) == 0xFF ? 0xFF : (b + 0x800000) >> 24; + a = (a >> 16) == 0xFF ? 0xFF : (a + 0x8000) >> 16; + + *dst++ = (a << 24) | (r << 16) | (g << 8) | b; + + x += x_step; + } + + return dst; +} + +void dfb_scale_linear_32( u32 *src, int sw, int sh, + void *dst, int dpitch, DFBRectangle *drect, + CoreSurface *dst_surface, const DFBRegion *dst_clip ) +{ + DFBRectangle srect = { 0, 0, sw, sh }; + float scale_x, scale_y; + int i, j; + int sx, sy; + int x_step, y_step; + int scaled_x_offset; + PixopsFilter filter; + void *dst1 = NULL, *dst2 = NULL; + u32 *buf; + + if (drect->w == sw && drect->h == sh) { + dfb_copy_buffer_32( src, dst, dpitch, drect, dst_surface, dst_clip ); + return; + } + + if (dst_clip) + dfb_clip_stretchblit( dst_clip, &srect, drect ); + + if (srect.w < 1 || srect.h < 1 || drect->w < 1 || drect->h < 1) + return; + + src += srect.y * sw + srect.x; + + scale_x = (float)drect->w / srect.w; + scale_y = (float)drect->h / srect.h; + + x_step = (1 << SCALE_SHIFT) / scale_x; + y_step = (1 << SCALE_SHIFT) / scale_y; + + if (! bilinear_make_fast_weights( &filter, scale_x, scale_y )) + return; + + scaled_x_offset = D_IFLOOR( filter.x_offset * (1 << SCALE_SHIFT) ); + sy = D_IFLOOR( filter.y_offset * (1 << SCALE_SHIFT) ); + + switch (dst_surface->config.format) { + case DSPF_I420: + dst1 = dst + dpitch * dst_surface->config.size.h; + dst2 = dst1 + dpitch/2 * dst_surface->config.size.h/2; + break; + case DSPF_YV12: + dst2 = dst + dpitch * dst_surface->config.size.h; + dst1 = dst2 + dpitch/2 * dst_surface->config.size.h/2; + break; + case DSPF_NV12: + case DSPF_NV21: + case DSPF_NV16: + dst1 = dst + dpitch * dst_surface->config.size.h; + break; + default: + break; + } + + buf = (u32*) alloca( drect->w * 4 ); + + for (i = drect->y; i < drect->y + drect->h; i++) { + int x_start; + int y_start; + const int *run_weights; + u32 *outbuf = buf; + u32 *outbuf_end = buf + drect->w; + u32 *new_outbuf; + const u32 **line_bufs; + u8 *d[3]; + + y_start = sy >> SCALE_SHIFT; + + run_weights = filter.weights + ((sy >> (SCALE_SHIFT - SUBSAMPLE_BITS)) + & SUBSAMPLE_MASK) * filter.n_x * filter.n_y * SUBSAMPLE; + + line_bufs = (const u32 **) alloca( filter.n_y * sizeof (void *) ); + + for (j = 0; j < filter.n_y; j++) { + if (y_start < 0) + line_bufs[j] = src; + else if (y_start < sh) + line_bufs[j] = src + sw * y_start; + else + line_bufs[j] = src + sw * (sh - 1); + + y_start++; + } + + sx = scaled_x_offset; + x_start = sx >> SCALE_SHIFT; + + while (x_start < 0 && outbuf < outbuf_end) { + scale_pixel( run_weights + ((sx >> (SCALE_SHIFT - SUBSAMPLE_BITS)) + & SUBSAMPLE_MASK) * (filter.n_x * filter.n_y), + filter.n_x, filter.n_y, + outbuf, line_bufs, sx >> SCALE_SHIFT, sw ); + sx += x_step; + x_start = sx >> SCALE_SHIFT; + outbuf++; + } + + new_outbuf = scale_line( run_weights, filter.n_x, filter.n_y, + outbuf, outbuf_end, line_bufs, + sx >> SCALE_SHIFT, x_step, sw ); + sx = ((outbuf_end - outbuf) >> 2) * x_step + scaled_x_offset; + outbuf = new_outbuf; + + while (outbuf < outbuf_end) { + scale_pixel( run_weights + ((sx >> (SCALE_SHIFT - SUBSAMPLE_BITS)) + & SUBSAMPLE_MASK) * (filter.n_x * filter.n_y), + filter.n_x, filter.n_y, + outbuf, line_bufs, sx >> SCALE_SHIFT, sw ); + sx += x_step; + outbuf++; + } + + sy += y_step; + + d[0] = LINE_PTR( dst, dst_surface->config.caps, + i, dst_surface->config.size.h, dpitch ) + + DFB_BYTES_PER_LINE( dst_surface->config.format, drect->x ); + + switch (dst_surface->config.format) { + case DSPF_I420: + case DSPF_YV12: + d[1] = LINE_PTR( dst1, dst_surface->config.caps, i/2, + dst_surface->config.size.h/2, dpitch/2 ) + drect->x/2; + d[2] = LINE_PTR( dst2, dst_surface->config.caps, i/2, + dst_surface->config.size.h/2, dpitch/2 ) + drect->x/2; + break; + case DSPF_NV12: + case DSPF_NV21: + d[1] = LINE_PTR( dst1, dst_surface->config.caps, i/2, + dst_surface->config.size.h/2, dpitch ) + (drect->x&~1); + break; + case DSPF_NV16: + d[1] = LINE_PTR( dst1, dst_surface->config.caps, i, + dst_surface->config.size.h, dpitch ) + (drect->x&~1); + break; + default: + break; + } + + write_argb_span( buf, d, drect->w, drect->x, i, dst_surface ); + } + + D_FREE(filter.weights); +} + diff --git a/Source/DirectFB/src/misc/gfx_util.h b/Source/DirectFB/src/misc/gfx_util.h new file mode 100755 index 0000000..56b7944 --- /dev/null +++ b/Source/DirectFB/src/misc/gfx_util.h @@ -0,0 +1,48 @@ +/* + (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) + (c) Copyright 2000-2004 Convergence (integrated media) GmbH + + All rights reserved. + + Written by Denis Oliver Kropp <dok@directfb.org>, + Andreas Hundt <andi@fischlustig.de>, + Sven Neumann <neo@directfb.org>, + Ville Syrjälä <syrjala@sci.fi> and + Claudio Ciccani <klan@users.sf.net>. + + Scaling routines ported from gdk_pixbuf by Sven Neumann + <sven@convergence.de>. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef __GFX_UTIL_H__ +#define __GFX_UTIL_H__ + +#include <directfb.h> + +#include <core/coretypes.h> + +void dfb_copy_buffer_32( u32 *src, + void *dst, int dpitch, DFBRectangle *drect, + CoreSurface *dst_surface, const DFBRegion *dst_clip ); + +void dfb_scale_linear_32( u32 *src, int sw, int sh, + void *dst, int dpitch, DFBRectangle *drect, + CoreSurface *dst_surface, const DFBRegion *dst_clip ); + + +#endif diff --git a/Source/DirectFB/src/misc/util.c b/Source/DirectFB/src/misc/util.c new file mode 100755 index 0000000..7a80eec --- /dev/null +++ b/Source/DirectFB/src/misc/util.c @@ -0,0 +1,471 @@ +/* + (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) + (c) Copyright 2000-2004 Convergence (integrated media) GmbH + + All rights reserved. + + Written by Denis Oliver Kropp <dok@directfb.org>, + Andreas Hundt <andi@fischlustig.de>, + Sven Neumann <neo@directfb.org>, + Ville Syrjälä <syrjala@sci.fi> and + Claudio Ciccani <klan@users.sf.net>. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <config.h> + +#include <string.h> + +#include <sys/types.h> +#include <sys/stat.h> + +#include <fcntl.h> + +#include <sys/time.h> +#include <time.h> + +#include <direct/debug.h> +#include <direct/messages.h> +#include <direct/util.h> + +#include <misc/util.h> + + +D_DEBUG_DOMAIN( DFB_Updates, "DirectFB/Updates", "DirectFB Updates" ); + +/**********************************************************************************************************************/ + +const DirectFBPixelFormatNames( dfb_pixelformat_names ); + +/**********************************************************************************************************************/ + +bool +dfb_region_intersect( DFBRegion *region, + int x1, int y1, int x2, int y2 ) +{ + if (region->x2 < x1 || + region->y2 < y1 || + region->x1 > x2 || + region->y1 > y2) + return false; + + if (region->x1 < x1) + region->x1 = x1; + + if (region->y1 < y1) + region->y1 = y1; + + if (region->x2 > x2) + region->x2 = x2; + + if (region->y2 > y2) + region->y2 = y2; + + return true; +} + +bool +dfb_region_region_intersect( DFBRegion *region, + const DFBRegion *clip ) +{ + if (region->x2 < clip->x1 || + region->y2 < clip->y1 || + region->x1 > clip->x2 || + region->y1 > clip->y2) + return false; + + if (region->x1 < clip->x1) + region->x1 = clip->x1; + + if (region->y1 < clip->y1) + region->y1 = clip->y1; + + if (region->x2 > clip->x2) + region->x2 = clip->x2; + + if (region->y2 > clip->y2) + region->y2 = clip->y2; + + return true; +} + +bool +dfb_region_rectangle_intersect( DFBRegion *region, + const DFBRectangle *rect ) +{ + int x2 = rect->x + rect->w - 1; + int y2 = rect->y + rect->h - 1; + + if (region->x2 < rect->x || + region->y2 < rect->y || + region->x1 > x2 || + region->y1 > y2) + return false; + + if (region->x1 < rect->x) + region->x1 = rect->x; + + if (region->y1 < rect->y) + region->y1 = rect->y; + + if (region->x2 > x2) + region->x2 = x2; + + if (region->y2 > y2) + region->y2 = y2; + + return true; +} + +bool +dfb_unsafe_region_intersect( DFBRegion *region, + int x1, int y1, int x2, int y2 ) +{ + if (region->x1 > region->x2) { + int temp = region->x1; + region->x1 = region->x2; + region->x2 = temp; + } + + if (region->y1 > region->y2) { + int temp = region->y1; + region->y1 = region->y2; + region->y2 = temp; + } + + return dfb_region_intersect( region, x1, y1, x2, y2 ); +} + +bool +dfb_unsafe_region_rectangle_intersect( DFBRegion *region, + const DFBRectangle *rect ) +{ + if (region->x1 > region->x2) { + int temp = region->x1; + region->x1 = region->x2; + region->x2 = temp; + } + + if (region->y1 > region->y2) { + int temp = region->y1; + region->y1 = region->y2; + region->y2 = temp; + } + + return dfb_region_rectangle_intersect( region, rect ); +} + +bool +dfb_rectangle_intersect_by_unsafe_region( DFBRectangle *rectangle, + DFBRegion *region ) +{ + /* validate region */ + if (region->x1 > region->x2) { + int temp = region->x1; + region->x1 = region->x2; + region->x2 = temp; + } + + if (region->y1 > region->y2) { + int temp = region->y1; + region->y1 = region->y2; + region->y2 = temp; + } + + /* adjust position */ + if (region->x1 > rectangle->x) { + rectangle->w -= region->x1 - rectangle->x; + rectangle->x = region->x1; + } + + if (region->y1 > rectangle->y) { + rectangle->h -= region->y1 - rectangle->y; + rectangle->y = region->y1; + } + + /* adjust size */ + if (region->x2 < rectangle->x + rectangle->w - 1) + rectangle->w = region->x2 - rectangle->x + 1; + + if (region->y2 < rectangle->y + rectangle->h - 1) + rectangle->h = region->y2 - rectangle->y + 1; + + /* set size to zero if there's no intersection */ + if (rectangle->w <= 0 || rectangle->h <= 0) { + rectangle->w = 0; + rectangle->h = 0; + + return false; + } + + return true; +} + +bool +dfb_rectangle_intersect_by_region( DFBRectangle *rectangle, + const DFBRegion *region ) +{ + /* adjust position */ + if (region->x1 > rectangle->x) { + rectangle->w -= region->x1 - rectangle->x; + rectangle->x = region->x1; + } + + if (region->y1 > rectangle->y) { + rectangle->h -= region->y1 - rectangle->y; + rectangle->y = region->y1; + } + + /* adjust size */ + if (region->x2 < rectangle->x + rectangle->w - 1) + rectangle->w = region->x2 - rectangle->x + 1; + + if (region->y2 < rectangle->y + rectangle->h - 1) + rectangle->h = region->y2 - rectangle->y + 1; + + /* set size to zero if there's no intersection */ + if (rectangle->w <= 0 || rectangle->h <= 0) { + rectangle->w = 0; + rectangle->h = 0; + + return false; + } + + return true; +} + +bool dfb_rectangle_intersect( DFBRectangle *rectangle, + const DFBRectangle *clip ) +{ + DFBRegion region = { clip->x, clip->y, + clip->x + clip->w - 1, clip->y + clip->h - 1 }; + + /* adjust position */ + if (region.x1 > rectangle->x) { + rectangle->w -= region.x1 - rectangle->x; + rectangle->x = region.x1; + } + + if (region.y1 > rectangle->y) { + rectangle->h -= region.y1 - rectangle->y; + rectangle->y = region.y1; + } + + /* adjust size */ + if (region.x2 < rectangle->x + rectangle->w - 1) + rectangle->w = region.x2 - rectangle->x + 1; + + if (region.y2 < rectangle->y + rectangle->h - 1) + rectangle->h = region.y2 - rectangle->y + 1; + + /* set size to zero if there's no intersection */ + if (rectangle->w <= 0 || rectangle->h <= 0) { + rectangle->w = 0; + rectangle->h = 0; + + return false; + } + + return true; +} + +void dfb_rectangle_union ( DFBRectangle *rect1, + const DFBRectangle *rect2 ) +{ + if (!rect2->w || !rect2->h) + return; + + /* FIXME: OPTIMIZE */ + + if (rect1->w) { + int temp = MIN (rect1->x, rect2->x); + rect1->w = MAX (rect1->x + rect1->w, rect2->x + rect2->w) - temp; + rect1->x = temp; + } + else { + rect1->x = rect2->x; + rect1->w = rect2->w; + } + + if (rect1->h) { + int temp = MIN (rect1->y, rect2->y); + rect1->h = MAX (rect1->y + rect1->h, rect2->y + rect2->h) - temp; + rect1->y = temp; + } + else { + rect1->y = rect2->y; + rect1->h = rect2->h; + } +} + +void +dfb_updates_init( DFBUpdates *updates, + DFBRegion *regions, + int max_regions ) +{ + D_ASSERT( updates != NULL ); + D_ASSERT( regions != NULL ); + D_ASSERT( max_regions > 0 ); + + updates->regions = regions; + updates->max_regions = max_regions; + updates->num_regions = 0; + + D_MAGIC_SET( updates, DFBUpdates ); +} + +void +dfb_updates_add( DFBUpdates *updates, + const DFBRegion *region ) +{ + int i; + + D_MAGIC_ASSERT( updates, DFBUpdates ); + DFB_REGION_ASSERT( region ); + D_ASSERT( updates->regions != NULL ); + D_ASSERT( updates->num_regions >= 0 ); + D_ASSERT( updates->num_regions <= updates->max_regions ); + + D_DEBUG_AT( DFB_Updates, "%s( %p, %4d,%4d-%4dx%4d )\n", __FUNCTION__, updates, + DFB_RECTANGLE_VALS_FROM_REGION(region) ); + + if (updates->num_regions == 0) { + D_DEBUG_AT( DFB_Updates, " -> added as first\n" ); + + updates->regions[0] = updates->bounding = *region; + updates->num_regions = 1; + + return; + } + + for (i=0; i<updates->num_regions; i++) { + if (dfb_region_region_extends( &updates->regions[i], region ) || + dfb_region_region_intersects( &updates->regions[i], region )) + { + D_DEBUG_AT( DFB_Updates, " -> combined with [%d] %4d,%4d-%4dx%4d\n", i, + DFB_RECTANGLE_VALS_FROM_REGION(&updates->regions[i]) ); + + dfb_region_region_union( &updates->regions[i], region ); + + dfb_region_region_union( &updates->bounding, region ); + + D_DEBUG_AT( DFB_Updates, " -> resulting in [%d] %4d,%4d-%4dx%4d\n", i, + DFB_RECTANGLE_VALS_FROM_REGION(&updates->regions[i]) ); + + return; + } + } + + if (updates->num_regions == updates->max_regions) { + dfb_region_region_union( &updates->bounding, region ); + + updates->regions[0] = updates->bounding; + updates->num_regions = 1; + + D_DEBUG_AT( DFB_Updates, " -> collapsing to [0] %4d,%4d-%4dx%4d\n", + DFB_RECTANGLE_VALS_FROM_REGION(&updates->regions[0]) ); + } + else { + updates->regions[updates->num_regions++] = *region; + + dfb_region_region_union( &updates->bounding, region ); + + D_DEBUG_AT( DFB_Updates, " -> added as [%d] %4d,%4d-%4dx%4d\n", updates->num_regions - 1, + DFB_RECTANGLE_VALS_FROM_REGION(&updates->regions[updates->num_regions - 1]) ); + } +} + +void +dfb_updates_stat( DFBUpdates *updates, + int *ret_total, + int *ret_bounding ) +{ + int i; + + D_MAGIC_ASSERT( updates, DFBUpdates ); + D_ASSERT( updates->regions != NULL ); + D_ASSERT( updates->num_regions >= 0 ); + D_ASSERT( updates->num_regions <= updates->max_regions ); + + if (updates->num_regions == 0) { + if (ret_total) + *ret_total = 0; + + if (ret_bounding) + *ret_bounding = 0; + + return; + } + + if (ret_total) { + int total = 0; + + for (i=0; i<updates->num_regions; i++) { + const DFBRegion *r = &updates->regions[i]; + + total += (r->x2 - r->x1 + 1) * (r->y2 - r->y1 + 1); + } + + *ret_total = total; + } + + if (ret_bounding) + *ret_bounding = (updates->bounding.x2 - updates->bounding.x1 + 1) * + (updates->bounding.y2 - updates->bounding.y1 + 1); +} + +void +dfb_updates_get_rectangles( DFBUpdates *updates, + DFBRectangle *ret_rects, + int *ret_num ) +{ + D_MAGIC_ASSERT( updates, DFBUpdates ); + D_ASSERT( updates->regions != NULL ); + D_ASSERT( updates->num_regions >= 0 ); + D_ASSERT( updates->num_regions <= updates->max_regions ); + + switch (updates->num_regions) { + case 0: + *ret_num = 0; + break; + + default: { + int n, d, total, bounding; + + dfb_updates_stat( updates, &total, &bounding ); + + n = updates->max_regions - updates->num_regions + 1; + d = n + 1; + + /* Try to optimize updates. Use individual regions only if not too much overhead. */ + if (total < bounding * n / d) { + *ret_num = updates->num_regions; + + for (n=0; n<updates->num_regions; n++) + ret_rects[n] = DFB_RECTANGLE_INIT_FROM_REGION( &updates->regions[n] ); + + break; + } + } + /* fall through */ + + case 1: + *ret_num = 1; + *ret_rects = DFB_RECTANGLE_INIT_FROM_REGION( &updates->bounding ); + break; + } +} diff --git a/Source/DirectFB/src/misc/util.h b/Source/DirectFB/src/misc/util.h new file mode 100755 index 0000000..3d2d8e6 --- /dev/null +++ b/Source/DirectFB/src/misc/util.h @@ -0,0 +1,34 @@ +/* + (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) + (c) Copyright 2000-2004 Convergence (integrated media) GmbH + + All rights reserved. + + Written by Denis Oliver Kropp <dok@directfb.org>, + Andreas Hundt <andi@fischlustig.de>, + Sven Neumann <neo@directfb.org>, + Ville Syrjälä <syrjala@sci.fi> and + Claudio Ciccani <klan@users.sf.net>. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef __MISC__UTIL_H__ +#define __MISC__UTIL_H__ + +#include <directfb_util.h> + +#endif |