summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Plattner <aplattner@nvidia.com>2008-02-12 21:22:58 -0800
committerAaron Plattner <aplattner@nvidia.com>2008-02-12 21:22:58 -0800
commit4256beee1897d25700b9cd6bf51728bc31c86627 (patch)
treeb5e053ff765d0a51ae02a5bc2aefae69264f90e5
parent014e25b8ac7d68d70cb9110c59cdad0508879b82 (diff)
1.0-76641.0-7664
-rw-r--r--Makefile42
-rw-r--r--samples/Makefile11
-rw-r--r--samples/README7
-rw-r--r--samples/nv-control-events.c165
-rw-r--r--samples/nv-ddcci-client.c796
-rw-r--r--src/gtk+-2.x/Makefile.inc9
-rw-r--r--src/gtk+-2.x/ctkclocks.c1588
-rw-r--r--src/gtk+-2.x/ctkclocks.h105
-rw-r--r--src/gtk+-2.x/ctkconfig.c159
-rw-r--r--src/gtk+-2.x/ctkconfig.h3
-rw-r--r--src/gtk+-2.x/ctkcursorshadow.c112
-rw-r--r--src/gtk+-2.x/ctkcursorshadow.h3
-rw-r--r--src/gtk+-2.x/ctkdevice.c31
-rw-r--r--src/gtk+-2.x/ctkdisplaydevice-dfp.c85
-rw-r--r--src/gtk+-2.x/ctkevent.c21
-rw-r--r--src/gtk+-2.x/ctkframelock.c244
-rw-r--r--src/gtk+-2.x/ctkframelock.h5
-rw-r--r--src/gtk+-2.x/ctkglx.c42
-rw-r--r--src/gtk+-2.x/ctkglx.h5
-rw-r--r--src/gtk+-2.x/ctkgvo.c19
-rw-r--r--src/gtk+-2.x/ctkmultisample.c6
-rw-r--r--src/gtk+-2.x/ctkrandr.c5
-rw-r--r--src/gtk+-2.x/ctkthermal.c101
-rw-r--r--src/gtk+-2.x/ctkthermal.h5
-rw-r--r--src/gtk+-2.x/ctkutils.c52
-rw-r--r--src/gtk+-2.x/ctkutils.h38
-rw-r--r--src/gtk+-2.x/ctkwindow.c104
-rw-r--r--src/gtk+-2.x/ctkwindow.h3
-rw-r--r--src/image_data/HOWTO-ADD-IMAGES20
-rw-r--r--src/image_data/Makefile.inc6
-rw-r--r--src/image_data/big_banner_sun.h2446
-rw-r--r--src/image_data/clocks_banner.h1884
-rw-r--r--src/libXNVCtrl/NVCtrl.c575
-rw-r--r--src/libXNVCtrl/NVCtrl.h1376
-rw-r--r--src/libXNVCtrl/NVCtrlLib.h254
-rw-r--r--src/libXNVCtrl/libXNVCtrl.abin6624 -> 13488 bytes
-rw-r--r--src/libXNVCtrl/nv_control.h310
-rw-r--r--src/libXNVCtrlAttributes/NvCtrlAttributes.c11
-rw-r--r--src/libXNVCtrlAttributes/NvCtrlAttributesGlx.c12
-rw-r--r--src/libXNVCtrlAttributes/NvCtrlAttributesPrivate.h78
-rw-r--r--src/libXNVCtrlAttributes/NvCtrlAttributesXrandr.c30
-rw-r--r--src/libXNVCtrlAttributes/NvCtrlAttributesXv.c220
-rw-r--r--src/msg.h1
-rw-r--r--src/parse.c16
-rw-r--r--src/query-assign.c13
45 files changed, 10663 insertions, 355 deletions
diff --git a/Makefile b/Makefile
index 7380793..aa771c1 100644
--- a/Makefile
+++ b/Makefile
@@ -39,13 +39,14 @@
SHELL = /bin/sh
INSTALL = install -m 755
BUILD_OS := $(shell uname)
+BUILD_ARCH := $(shell uname -m)
ifndef CC
CC = gcc
endif
ifndef CFLAGS
- CFLAGS = -Wall -fpedantic
+ CFLAGS = -Wall
endif
ifndef PKG_CONFIG
@@ -53,7 +54,11 @@ ifndef PKG_CONFIG
endif
ifndef X11R6_LIB_DIR
- X11R6_LIB_DIR = /usr/X11R6/lib
+ ifeq ($(BUILD_OS)-$(BUILD_ARCH),Linux-x86_64)
+ X11R6_LIB_DIR = /usr/X11R6/lib64
+ else
+ X11R6_LIB_DIR = /usr/X11R6/lib
+ endif
endif
ifndef X11R6_INC_DIR
@@ -79,6 +84,17 @@ else
prefix = /usr/local
endif
+# default echo within SunOS sh does not have -n option. Use /usr/ucb/echo instead.
+# Solaris install has a different argument syntax
+ifeq ($(BUILD_OS),SunOS)
+ECHO=/usr/ucb/echo
+INSTALL_RULE=$(INSTALL) -f $(bindir) $(NVIDIA_SETTINGS)
+LD_RUN_FLAG=-R/usr/X11R6/lib
+else
+ECHO=echo
+INSTALL_RULE=$(INSTALL) $(NVIDIA_SETTINGS) $(bindir)/$(NVIDIA_SETTINGS)
+endif
+
exec_prefix = $(prefix)
bindir = $(exec_prefix)/bin
@@ -87,13 +103,7 @@ X11R6_CFLAGS = -I $(X11R6_INC_DIR)
GTK_CFLAGS := $(shell $(PKG_CONFIG) --cflags gtk+-2.0)
GTK_LDFLAGS := $(shell $(PKG_CONFIG) --libs gtk+-2.0)
-ifeq ($(BUILD_OS),SunOS)
-LIBXV = -lXv
-else
-LIBXV = -Wl,-Bstatic -lXv -Wl,-Bdynamic
-endif
-
-X11R6_LIBS := -L $(X11R6_LIB_DIR) -Wl,-Bstatic -lXxf86vm -Wl,-Bdynamic $(LIBXV) -lX11 -lXext
+X11R6_LIBS := -L $(X11R6_LIB_DIR) -Wl,-Bstatic -lXxf86vm -Wl,-Bdynamic -lX11 -lXext
XNVCTRL_LIB := src/libXNVCtrl/libXNVCtrl.a
@@ -113,7 +123,7 @@ SRCDIRS := $(addprefix $(CURDIR)/, $(RELATIVE_SRCDIRS))
INC_FLAGS := $(addprefix -I , $(RELATIVE_SRCDIRS))
ALL_CFLAGS = $(CFLAGS) $(X11R6_CFLAGS) $(GTK_CFLAGS) $(INC_FLAGS)
-ALL_LDFLAGS = $(LDFLAGS) $(GTK_LDFLAGS) $(X11R6_LIBS)
+ALL_LDFLAGS = $(LD_RUN_FLAG) $(LDFLAGS) $(GTK_LDFLAGS) $(X11R6_LIBS)
CPPFLAGS = $(ALL_CFLAGS)
@@ -129,7 +139,8 @@ STAMP_C = g_stamp.c
# Define the files in the SAMPLES directory
-SAMPLES = Makefile README nv-control-dvc.c nv-control-info.c
+SAMPLES = Makefile README nv-control-dvc.c nv-control-info.c \
+ nv-control-events.c nv-ddcci-client.c
# initialize SRC and EXTRA_DIST, then include each of the subdirectory
# Makefiles so that they can append to SRC and EXTRA_DIST
@@ -159,13 +170,6 @@ DEPS_DIR = .deps
OBJS := $(patsubst %.c,$(OBJS_DIR)/%.o,$(ALL_SRC))
DEPS := $(patsubst %.c,$(DEPS_DIR)/%.d,$(SRC))
-# default echo within SunOS sh does not have -n option. Use /usr/ucb/echo instead.
-ifeq ($(BUILD_OS),SunOS)
-ECHO=/usr/ucb/echo
-else
-ECHO=echo
-endif
-
# and now, the build rules:
default: all
@@ -174,7 +178,7 @@ all: $(NVIDIA_SETTINGS)
install: $(NVIDIA_SETTINGS)
$(STRIP) $<
- $(INSTALL) $< $(bindir)/$<
+ $(INSTALL_RULE)
$(OBJS_DIR)/%.o: %.c
@ mkdir -p $(OBJS_DIR)
diff --git a/samples/Makefile b/samples/Makefile
index 0c3d0e1..544d634 100644
--- a/samples/Makefile
+++ b/samples/Makefile
@@ -34,6 +34,9 @@
# X11R6_INC_DIR = /usr/X11R6/include
# X11R6_LIB_DIR = /usr/X11R6/lib/
+BUILD_OS := $(shell uname)
+BUILD_ARCH := $(shell uname -m)
+
ifndef CC
CC = gcc
endif
@@ -51,7 +54,11 @@ ifndef X11R6_INC_DIR
endif
ifndef X11R6_LIB_DIR
- X11R6_LIB_DIR = /usr/X11R6/lib/
+ ifeq ($(BUILD_OS)-$(BUILD_ARCH),Linux-x86_64)
+ X11R6_LIB_DIR = /usr/X11R6/lib64
+ else
+ X11R6_LIB_DIR = /usr/X11R6/lib
+ endif
endif
LIBXNVCTRL_DIR = ../src/libXNVCtrl
@@ -61,7 +68,7 @@ ALL_CFLAGS = $(CFLAGS) -I $(LIBXNVCTRL_DIR) -I $(X11R6_INC_DIR)
ALL_LDFLAGS = $(LDFLAGS) -L $(LIBXNVCTRL_DIR) -L $(X11R6_LIB_DIR) \
-lXNVCtrl -lXext -lX11
-SAMPLES = nv-control-info nv-control-dvc nv-control-events
+SAMPLES = nv-control-info nv-control-dvc nv-control-events nv-ddcci-client
all: $(SAMPLES)
diff --git a/samples/README b/samples/README
index 126c489..3992ba8 100644
--- a/samples/README
+++ b/samples/README
@@ -13,12 +13,15 @@ source package).
Sample applications:
nv-control-info: demonstrates how to query for extension
- presense, basic information
+ presense, basic information.
nv-control-dvc: demonstrates how to query and assign an
integer attribute (NV_CTRL_DIGITAL_VIBRANCE); also
shows how to handle multiple display devices.
nv-control-events: demonstrates how to register to receive and
- interpret NV-CONTROL events
+ interpret NV-CONTROL events.
+
+ nv-ddcci-client: demonstrates how to use the implementation of the
+ DDC/CI interface with the NV-CONTROL X extension.
diff --git a/samples/nv-control-events.c b/samples/nv-control-events.c
new file mode 100644
index 0000000..2f89eaa
--- /dev/null
+++ b/samples/nv-control-events.c
@@ -0,0 +1,165 @@
+/*
+ * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix
+ * and Linux systems.
+ *
+ * Copyright (C) 2004 NVIDIA Corporation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of Version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program 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 Version 2
+ * of the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the:
+ *
+ * Free Software Foundation, Inc.
+ * 59 Temple Place - Suite 330
+ * Boston, MA 02111-1307, USA
+ *
+ */
+
+/*
+ * nv-control-events.c - trivial sample NV-CONTROL client that
+ * demonstrates how to handle NV-CONTROL events.
+ */
+
+#include <stdio.h>
+
+#include <X11/Xlib.h>
+
+#include "NVCtrl.h"
+#include "NVCtrlLib.h"
+
+static const char *attr2str(int n);
+
+int main(void)
+{
+ Display *dpy;
+ Bool ret;
+ int event_base, error_base, screen;
+ XEvent event;
+ XNVCtrlAttributeChangedEvent *nvevent;
+
+ /*
+ * Open a display connection, and make sure the NV-CONTROL X
+ * extension is present on the screen we want to use.
+ */
+
+ dpy = XOpenDisplay(NULL);
+ if (!dpy) {
+ fprintf(stderr, "Cannot open display '%s'.\n", XDisplayName(NULL));
+ return 1;
+ }
+
+ screen = DefaultScreen(dpy);
+
+ if (!XNVCTRLIsNvScreen(dpy, screen)) {
+ fprintf(stderr, "The NV-CONTROL X not available on screen "
+ "%d of '%s'.\n", screen, XDisplayName(NULL));
+ return 1;
+ }
+
+ /*
+ * check if the NV-CONTROL X extension is present on this X server
+ */
+
+ ret = XNVCTRLQueryExtension(dpy, &event_base, &error_base);
+ if (ret != True) {
+ fprintf(stderr, "The NV-CONTROL X extension does not exist on '%s'.\n",
+ XDisplayName(NULL));
+ return 1;
+ }
+
+ /*
+ * register to receive NV-CONTROL events: whenever any NV-CONTROL
+ * attribute is changed by an NV-CONTROL client, any other client
+ * can receive notification of the change.
+ */
+
+ ret = XNVCtrlSelectNotify(dpy, screen, ATTRIBUTE_CHANGED_EVENT, True);
+ if (ret != True) {
+ fprintf(stderr, "Unable to register to receive NV-CONTROL events "
+ "on '%s'.\n", XDisplayName(NULL));
+ return 1;
+ }
+
+ /*
+ * Loop forever, processing events
+ */
+
+ while (True) {
+
+ /* block for the next event */
+
+ XNextEvent(dpy, &event);
+
+ /* if this is not one of our events, then bail out of this iteration */
+
+ if (event.type != (event_base + ATTRIBUTE_CHANGED_EVENT)) continue;
+
+ /* cast the X event as an XNVCtrlAttributeChangedEvent */
+
+ nvevent = (XNVCtrlAttributeChangedEvent *) &event;
+
+ /* print out the event information */
+
+ printf("received NV-CONTROL event [attribute: %d (%s) value: %d]\n",
+ nvevent->attribute,
+ attr2str(nvevent->attribute),
+ nvevent->value);
+ }
+
+ return 0;
+}
+
+
+
+/*
+ * attr2str() - translate an attribute integer into a string
+ */
+
+static const char *attr2str(int n)
+{
+ switch (n) {
+ case NV_CTRL_FLATPANEL_SCALING: return "flatpanel scaling"; break;
+ case NV_CTRL_FLATPANEL_DITHERING: return "flatpanel dithering"; break;
+ case NV_CTRL_DIGITAL_VIBRANCE: return "digital vibrance"; break;
+ case NV_CTRL_SYNC_TO_VBLANK: return "sync to vblank"; break;
+ case NV_CTRL_LOG_ANISO: return "log aniso"; break;
+ case NV_CTRL_FSAA_MODE: return "fsaa mode"; break;
+ case NV_CTRL_TEXTURE_SHARPEN: return "texture sharpen"; break;
+ case NV_CTRL_FORCE_GENERIC_CPU: return "force generic cpu"; break;
+ case NV_CTRL_OPENGL_AA_LINE_GAMMA: return "opengl aa line gamma"; break;
+ case NV_CTRL_FLIPPING_ALLOWED: return "flipping allowed"; break;
+ case NV_CTRL_TEXTURE_CLAMPING: return "texture clamping"; break;
+ case NV_CTRL_CURSOR_SHADOW: return "cursor shadow"; break;
+ case NV_CTRL_CURSOR_SHADOW_ALPHA: return "cursor shadow alpha"; break;
+ case NV_CTRL_CURSOR_SHADOW_RED: return "cursor shadow red"; break;
+ case NV_CTRL_CURSOR_SHADOW_GREEN: return "cursor shadow green"; break;
+ case NV_CTRL_CURSOR_SHADOW_BLUE: return "cursor shadow blue"; break;
+ case NV_CTRL_CURSOR_SHADOW_X_OFFSET: return "cursor shadow x offset"; break;
+ case NV_CTRL_CURSOR_SHADOW_Y_OFFSET: return "cursor shadow y offset"; break;
+ case NV_CTRL_FSAA_APPLICATION_CONTROLLED: return "fsaa application controlled"; break;
+ case NV_CTRL_LOG_ANISO_APPLICATION_CONTROLLED: return "log aniso application controlled"; break;
+ case NV_CTRL_IMAGE_SHARPENING: return "image sharpening"; break;
+ case NV_CTRL_TV_OVERSCAN: return "tv overscan"; break;
+ case NV_CTRL_TV_FLICKER_FILTER: return "tv flicker filter"; break;
+ case NV_CTRL_TV_BRIGHTNESS: return "tv brightness"; break;
+ case NV_CTRL_TV_HUE: return "tv hue"; break;
+ case NV_CTRL_TV_CONTRAST: return "tv contrast"; break;
+ case NV_CTRL_TV_SATURATION: return "tv saturation"; break;
+ case NV_CTRL_TV_RESET_SETTINGS: return "tv reset settings"; break;
+ case NV_CTRL_GPU_CORE_TEMPERATURE: return "gpu core temperature"; break;
+ case NV_CTRL_GPU_CORE_THRESHOLD: return "gpu core threshold"; break;
+ case NV_CTRL_GPU_DEFAULT_CORE_THRESHOLD: return "gpu default core threshold"; break;
+ case NV_CTRL_GPU_MAX_CORE_THRESHOLD: return "gpu max core_threshold"; break;
+ case NV_CTRL_AMBIENT_TEMPERATURE: return "ambient temperature"; break;
+ case NV_CTRL_USE_HOUSE_SYNC: return "use house sync"; break;
+ default:
+ return "Unknown";
+ }
+} /* attr2str() */
diff --git a/samples/nv-ddcci-client.c b/samples/nv-ddcci-client.c
new file mode 100644
index 0000000..003f7cb
--- /dev/null
+++ b/samples/nv-ddcci-client.c
@@ -0,0 +1,796 @@
+/*
+ * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix
+ * and Linux systems.
+ *
+ * Copyright (C) 2004 NVIDIA Corporation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of Version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program 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 Version 2
+ * of the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the:
+ *
+ * Free Software Foundation, Inc.
+ * 59 Temple Place - Suite 330
+ * Boston, MA 02111-1307, USA
+ *
+ */
+
+
+/* nv-ddcci-client: A tool for exercising all the display-supported DDC/CI VCP codes
+ *
+ * This test program does the following:
+ * - Check for the available displays
+ * - For each available display:
+ * + Get the timing report
+ * + Get the monitor capabilities (list of vcp supported codes)
+ * + Write and reads each supported vcp code
+ * + Try to excercise the special vcp codes. These are vcp codes
+ * that cannot be implemented with the XNVCTRLSetAttribute...()
+ * interface.
+ *
+ * Usage:
+ * Just run the client on a display
+ *
+ * Options:
+ * -defaults: Tries to restore the display defaults only. Does not run the test
+ *
+ * If the monitor does not support the factory defaults reset through DDC/CI,
+ * it is strongly recommended to do so through the OSD.
+ * After the test all monitor settings are changed, and the client tries to
+ * restore the factory defaults.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <X11/Xlib.h>
+#include <string.h>
+
+#include "NVCtrl.h"
+#include "NVCtrlLib.h"
+
+static void Do_Capable(Display *dpy, int screen, unsigned int *ddcci_devices);
+static void Do_Timing_Report(Display *dpy, int screen, unsigned int ddcci_devices);
+static void Do_VCP_List(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask,
+ unsigned int *nvctrl_vcp_supported, unsigned int *possible_values_offset,
+ unsigned int *possible_values_size, unsigned int *nvctrl_vcp_possible_values);
+static void Do_String_VCP(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask,
+ unsigned int *nvctrl_string_vcp_supported);
+static void Do_Special_VCP(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask);
+static Bool Do_Capabilities(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask,
+ unsigned int **nvctrl_vcp_supported, unsigned int **possible_values_offset,
+ unsigned int **possible_values_size, unsigned int **nvctrl_vcp_possible_values,
+ unsigned int **nvctrl_string_vcp_supported);
+static void RestoreDefaults(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask,
+ unsigned int *nvctrl_vcp_supported);
+
+#define DISPLAY_DEVICES 0xFF
+#define TRUE 1
+#define FALSE 0
+
+#define RETRIES 1
+
+#define VERSION "1.0"
+
+int main(int argc, char **argv) {
+ Display *dpy;
+ int screen;
+ int bit;
+ unsigned int display_mask;
+ unsigned int ddcci_devices;
+ unsigned int *nvctrl_vcp_supported;
+ unsigned int *possible_values_offset;
+ unsigned int *possible_values_size;
+ unsigned int *nvctrl_vcp_possible_values;
+ unsigned int *nvctrl_string_vcp_supported;
+ int defaults=0;
+ Bool ret;
+
+ printf("nv-ddcci-client v%s\n\n", VERSION);
+
+
+ if(argc==2 && !strcmp(argv[1], "-defaults") ) {
+ defaults=1;
+ }
+ else if(argc!=1) {
+ printf("Usage: nv-ddcci-client [-defaults]\n");
+ printf("Option -defaults: Tries to restore the display defaults only\n");
+ return 1;
+ }
+
+ dpy = XOpenDisplay(NULL);
+ if(dpy==NULL) {
+ printf("Cannot open display\n");
+ return 1;
+ }
+ screen=DefaultScreen(dpy);
+
+ Do_Capable(dpy, screen, &ddcci_devices);
+ if(ddcci_devices==0) {
+ printf("No capable devices found.\n");
+ printf("Please make sure you allowed DDC/CI with the X config option\n");
+ printf("\"AllowDDCCI\" set to \"1\" in the device section of your X config file, i.e.:\n");
+ printf("Option \"AllowDDCCI\" \"1\"\n");
+ return 1;
+ }
+
+ if(defaults==0)
+ Do_Timing_Report(dpy, screen, ddcci_devices);
+
+ for (bit = 0; bit < 24; bit++) {
+ display_mask = (1 << bit);
+ ret=Do_Capabilities(dpy, screen, ddcci_devices, display_mask,
+ &nvctrl_vcp_supported, &possible_values_offset,
+ &possible_values_size, &nvctrl_vcp_possible_values,
+ &nvctrl_string_vcp_supported);
+ if(ret==FALSE)
+ continue;
+
+ if(defaults==0) {
+ Do_VCP_List(dpy, screen, ddcci_devices, display_mask,
+ nvctrl_vcp_supported, possible_values_offset,
+ possible_values_size, nvctrl_vcp_possible_values);
+ Do_String_VCP(dpy, screen, ddcci_devices, display_mask,
+ nvctrl_string_vcp_supported);
+ Do_Special_VCP(dpy, screen, ddcci_devices, display_mask);
+ }
+ RestoreDefaults(dpy, screen, ddcci_devices, display_mask, nvctrl_vcp_supported);
+ }
+ return 0 ;
+}
+
+/*
+ * - RestoreDefaults
+ * Restore display defaults
+ * If the display does not support this command, the display has to be reset manually
+ */
+static void RestoreDefaults(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask,
+ unsigned int *nvctrl_vcp_supported) {
+ int display_devices=DISPLAY_DEVICES;
+
+ if ((display_mask & display_devices) == 0x0) return;
+ if ((display_mask & ddcci_devices) == 0x0) return;
+
+ printf("Restoring defaults\n");
+ printf("------------------\n");
+
+ printf(" Display Mask 0x%x\n", display_mask);
+ if(nvctrl_vcp_supported[NV_CTRL_DDCCI_PRESET_SETTINGS_RESTORE_FACTORY_DEFAULTS]) {
+ printf(" Sending request\n");
+ XNVCTRLSetAttribute (dpy, screen, display_mask, NV_CTRL_DDCCI_PRESET_SETTINGS_RESTORE_FACTORY_DEFAULTS, 1);
+ }
+ else
+ printf(" Code not supported on display. PLEASE RESET YOUR DISPLAY MANUALLY !\n");
+ printf("================================================================================\n\n");
+
+}
+
+/*
+ * - Do_Capable
+ * Returns in ddcci_devices a mask of DDC/CI capable displays
+ */
+static void Do_Capable(Display *dpy, int screen, unsigned int *ddcci_devices) {
+ int status;
+ unsigned int display_mask;
+ int bit;
+ unsigned int display_devices=DISPLAY_DEVICES;
+ int val;
+
+ *ddcci_devices=0;
+ printf("DDC/CI Capable\n");
+ printf("--------------\n");
+
+ for (bit = 0; bit < 24; bit++) {
+ display_mask = (1 << bit);
+
+ if ((display_mask & display_devices) == 0x0) continue;
+
+ printf(" Display Mask 0x%x\n", display_mask);
+
+ status = XNVCTRLQueryAttribute (dpy, screen, display_mask, NV_CTRL_DDCCI_CAPABLE, &val);
+ if (!status) {
+ printf(" Error when querying attribute\n");
+ }
+ else if(val==1) {
+ printf(" Display is DDC/CI capable\n");
+ *ddcci_devices |= display_mask;
+ }
+ else
+ printf(" Display is not DDC/CI capable\n");
+ }
+ printf("================================================================================\n\n");
+}
+
+
+/*
+ * - Do_Timing_Report
+ * Prints the timing report
+ */
+static void Do_Timing_Report(Display *dpy, int screen, unsigned int ddcci_devices) {
+ int status;
+ unsigned int display_mask;
+ int bit;
+ int display_devices=DISPLAY_DEVICES;
+ unsigned int sync_freq_out_range, unstable_count, positive_h_sync, positive_v_sync,
+ h_freq, v_freq;
+
+ printf("Timing Report\n");
+ printf("-------------\n");
+
+ for (bit = 0; bit < 24; bit++) {
+ display_mask = (1 << bit);
+
+ if ((display_mask & display_devices) == 0x0) continue;
+ if ((display_mask & ddcci_devices) == 0x0) continue;
+
+ printf(" Display Mask 0x%x\n", display_mask);
+
+ status = XNVCTRLQueryDDCCITimingReport (dpy, screen, display_mask,
+ &sync_freq_out_range, &unstable_count, &positive_h_sync, &positive_v_sync,
+ &h_freq, &v_freq);
+ if (!status) {
+ printf(" Error when querying Timing Report\n");
+ continue;
+ }
+
+ if(sync_freq_out_range) printf(" - Sync out of range\n");
+ if(unstable_count) printf(" - Unstable count\n");
+ if(positive_h_sync) printf(" - Positive H sync\n"); else printf(" - Negative H sync\n");
+ if(positive_v_sync) printf(" - Positive V sync\n"); else printf(" - Negative V sync\n");
+ printf(" - H Freq = %d\n", h_freq);
+ printf(" - V Freq = %d\n", v_freq);
+ }
+ printf("================================================================================\n\n");
+}
+
+/* - Do_Capabilities
+ * Gets the supported NV-CONTROL DDC/CI attributes
+ */
+static Bool Do_Capabilities(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask,
+ unsigned int **nvctrl_vcp_supported, unsigned int **possible_values_offset,
+ unsigned int **possible_values_size, unsigned int **nvctrl_vcp_possible_values,
+ unsigned int **nvctrl_string_vcp_supported) {
+ int status;
+ int display_devices=DISPLAY_DEVICES;
+ int i;
+
+ if ((display_mask & display_devices) == 0x0) return FALSE;
+ if ((display_mask & ddcci_devices) == 0x0) return FALSE;
+
+ printf("Capabilities Query\n");
+ printf("------------------\n");
+
+ printf(" Display Mask 0x%x\n", display_mask);
+
+ status = NVCTRLQueryDDCCICapabilities (dpy, screen, display_mask,
+ nvctrl_vcp_supported, possible_values_offset,
+ possible_values_size, nvctrl_vcp_possible_values,
+ nvctrl_string_vcp_supported);
+
+ if (!status) {
+ printf(" Error when querying Capabilities\n");
+ return FALSE;
+ }
+
+ printf(" Supported NV_CTRL:");
+ for(i=0;i<NV_CTRL_DDCCI_LAST_VCP+1;i++) {
+ if((*nvctrl_vcp_supported)[i]) {
+ printf(" %d", i);
+ if((*possible_values_offset)[i]!=-1) {
+ unsigned int of=(*possible_values_offset)[i];
+ unsigned int sz=(*possible_values_size)[i];
+ int p;
+ printf(" (");
+ for(p=0;p<sz;p++)
+ printf(" %d", (*nvctrl_vcp_possible_values)[of+p]);
+ printf(")");
+ }
+ }
+ }
+ printf("\n");
+ printf(" Supported String NV_CTRL:");
+ for(i=0;i<NV_CTRL_STRING_LAST_ATTRIBUTE+1;i++) {
+ if((*nvctrl_string_vcp_supported)[i]) {
+ printf(" %d", i);
+
+ }
+ }
+ printf("\n");
+ printf("================================================================================\n\n");
+ return TRUE;
+}
+
+/* - Do_VCP_List
+ * Excercies the simple NV-CONTROL DDC/CI attributes. Setting and Querying
+ */
+static void Do_VCP_List(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask,
+ unsigned int *nvctrl_vcp_supported, unsigned int *possible_values_offset,
+ unsigned int *possible_values_size, unsigned int *nvctrl_vcp_possible_values) {
+ int status;
+ int attr, val;
+ NVCTRLAttributeValidValuesRec valid;
+ int boolean, integer, range, bitmask, writable, readable;
+ int display_devices=DISPLAY_DEVICES;
+ int retry;
+
+ if ((display_mask & display_devices) == 0x0) return;
+ if ((display_mask & ddcci_devices) == 0x0) return;
+
+ printf("NVCTRL_ Attributes\n");
+ printf("------------------\n");
+
+ printf(" Display Mask 0x%x\n", display_mask);
+
+ for(attr=NV_CTRL_DDCCI_FIRST_VCP;
+ attr<=NV_CTRL_DDCCI_LAST_VCP;attr++) {
+ if(!nvctrl_vcp_supported[attr]) continue;
+ printf(" Testing attribute %d\n", attr);
+
+ retry=RETRIES;
+ do {
+ status = XNVCTRLQueryValidAttributeValues (dpy, screen, display_mask, attr, &valid);
+ if (!status) {
+ printf(" Error when querying valid values for attribute");
+ if(retry)
+ printf(" ... retrying\n");
+ else
+ printf("\n");
+ }
+ else
+ retry=0;
+ } while(retry--);
+
+ boolean=integer=range=writable=readable=0;
+
+ if(status) switch(valid.type) {
+ case ATTRIBUTE_TYPE_INTEGER:
+ printf(" Type is integer\n");
+ break;
+ case ATTRIBUTE_TYPE_BITMASK:
+ printf(" Type is bitmask\n");
+ bitmask=1;
+ break;
+ case ATTRIBUTE_TYPE_BOOL:
+ printf(" Type is boolean\n");
+ boolean=1;
+ break;
+ case ATTRIBUTE_TYPE_RANGE:
+ printf(" Type is range: %d-%d\n", valid.u.range.min, valid.u.range.max);
+ range=1;
+ break;
+ case ATTRIBUTE_TYPE_INT_BITS:
+ printf(" Type is integer bits\n");
+ break;
+ default:
+ printf(" Error: Unknown type\n");
+ break;
+ }
+
+ if(status && (valid.permissions & ATTRIBUTE_TYPE_WRITE)) {
+ printf(" Writable\n");
+ writable=1;
+ }
+ if(status && (valid.permissions & ATTRIBUTE_TYPE_READ)) {
+ printf(" Readable\n");
+ readable=1;
+ }
+
+ if(range) {
+ int set_val;
+ int error=0;
+ retry=RETRIES;;
+ if(readable && writable) {
+ for(set_val=valid.u.range.min; set_val<=valid.u.range.max; set_val++) {
+ printf(" Setting attribute to %d - ", set_val);fflush(stdout);
+ status=XNVCTRLSetAttributeAndGetStatus (dpy, screen, display_mask, attr, set_val);
+ if(!status)
+ printf("failed - ");
+ status = XNVCTRLQueryAttribute (dpy, screen, display_mask, attr, &val);
+ if (!status) {
+ printf("Error when querying attribute \n");
+ error=1;
+ }
+ else {
+ if(val==set_val) {
+ printf("Reading back correct value %d\r", val);fflush(stdout);
+ retry=RETRIES;
+ }
+ else {
+ error=1;
+ if(retry--) {
+ printf("Reading back value: %d - retrying \n", val);
+ set_val--;
+ }
+ else {
+ printf("Error when reading back value: %d \n", val);
+ retry=1;
+ }
+ }
+ }
+ }
+ }
+ else if(readable) {
+ status = XNVCTRLQueryAttribute (dpy, screen, display_mask, attr, &val);
+ if (!status) {
+ printf(" Error when querying attribute \n");
+ error=1;
+ }
+ else {
+ printf(" Reading back current value is %d\r", val);fflush(stdout);
+ }
+ }
+ // There is no WO range
+ if(error)
+ printf(" Errors occured \n");
+ else
+ printf(" Attribute setting and reading back complete \n");
+
+ }
+
+ else if(boolean) {
+ int set_val=NV_CTRL_DDCCI_OFF;
+ retry=RETRIES+1;
+ while(1) {
+ if(writable) {
+ printf(" Setting attribute to %d - ", set_val);fflush(stdout);
+ status=XNVCTRLSetAttributeAndGetStatus (dpy, screen, display_mask, attr, set_val);
+ if(!status)
+ printf("failed.");
+ }
+ if(readable) {
+ status = XNVCTRLQueryAttribute (dpy, screen, display_mask, attr, &val);
+ if (!status)
+ printf(" Error when querying attribute");
+ else if(writable) {
+ if(val==set_val) {
+ printf(" Reading back correct value %d", val);
+ retry=0;
+ }
+ else {
+ printf(" Error when reading back value: %d", val);
+ retry--;
+ }
+ }
+ else
+ printf(" Current value is %d", val);
+ }
+ else {
+ printf("OK");
+ retry=0;
+ }
+ printf("\n");
+
+ if(!writable)
+ break;
+
+ if(retry==0) {
+ if(set_val==NV_CTRL_DDCCI_ON)
+ break;
+ set_val=NV_CTRL_DDCCI_ON;
+ retry=RETRIES;
+ }
+ }
+
+ }
+
+ else if(integer||bitmask) {
+ int set_val;
+ int offset=possible_values_offset[attr];
+ int size=possible_values_size[attr];
+ int index;
+ retry=RETRIES;
+
+
+ for(index=offset;offset!=-1 && index<offset+size;index++) {
+ set_val=nvctrl_vcp_possible_values[index];
+ if(writable) {
+ printf(" Setting attribute to %d - ", set_val);fflush(stdout);
+ status=XNVCTRLSetAttributeAndGetStatus (dpy, screen, display_mask, attr, set_val);
+ if(!status)
+ printf("failed - ");
+ }
+ if(readable) {
+ status = XNVCTRLQueryAttribute (dpy, screen, display_mask, attr, &val);
+ if (!status)
+ printf(" Error when querying attribute");
+ else if(writable) {
+ if(val==set_val) {
+ printf(" Reading back correct value %d", val);
+ retry=RETRIES;
+ }
+ else {
+ printf(" Error when reading back value: %d", val);
+ if(retry--)
+ index--;
+ else
+ retry=RETRIES;
+ }
+ }
+ else
+ printf(" Current value is %d", val);
+ }
+ printf("\n");
+ }
+ if(offset==-1 && readable) {
+ status = XNVCTRLQueryAttribute (dpy, screen, display_mask, attr, &val);
+ if (!status)
+ printf(" Error when querying attribute");
+ printf(" Current value is %d\n", val);
+ }
+ }
+ }
+ printf("================================================================================\n\n");
+}
+
+
+/* - Do_String_VCP
+ * Excercises the String NV-CONTROL DDC/CI atytributes
+ */
+static void Do_String_VCP(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask,
+ unsigned int *nvctrl_string_vcp_supported) {
+ int display_devices=DISPLAY_DEVICES;
+ int status;
+ int attr;
+ int retry;
+
+ if ((display_mask & display_devices) == 0x0) return;
+ if ((display_mask & ddcci_devices) == 0x0) return;
+
+ printf("NVCTRL_ String Attributes\n");
+ printf("-------------------------\n");
+
+ printf(" Display Mask 0x%x\n", display_mask);
+ if(nvctrl_string_vcp_supported[NV_CTRL_STRING_DDCCI_MISC_TRANSMIT_DISPLAY_DESCRIPTOR])
+ {
+ char *ptr=NULL;
+ char *str="New String for NV_CTRL_STRING_DDCCI_MISC_TRANSMIT_DISPLAY_DESCRIPTOR";
+ printf(" Testing attribute NV_CTRL_STRING_DDCCI_MISC_TRANSMIT_DISPLAY_DESCRIPTOR\n");
+
+ attr=NV_CTRL_STRING_DDCCI_MISC_TRANSMIT_DISPLAY_DESCRIPTOR;
+ retry=RETRIES;
+ do {
+ printf(" Setting attribute... "); fflush(stdout);
+ XNVCTRLSetStringAttribute(dpy, screen, display_mask, attr, str);
+ if(status)
+ printf("success\n");
+ else {
+ printf("failed.\n");
+ }
+
+ printf(" Querying attribute... "); fflush(stdout);
+ status=XNVCTRLQueryStringAttribute(dpy, screen, display_mask, attr, &ptr);
+ if (!status) {
+ printf("Error when querying attribute");
+ if(retry) {
+ retry--;
+ printf(". Retrying ...");
+ }
+ printf("\n");;
+ }
+ else if(strcmp(ptr, str)) {
+ printf("Error when reading back string: %s", ptr);
+ if(retry) {
+ retry--;
+ printf(". Retrying ...");
+ }
+ printf("\n");
+ }
+ else {
+ printf("Reading back correct string: %s\n", ptr);
+ retry=0;
+ }
+ free(ptr);
+ } while (retry--);
+ }
+
+ if(nvctrl_string_vcp_supported[NV_CTRL_STRING_DDCCI_MISC_AUXILIARY_DISPLAY_DATA])
+ {
+ char *str="New String for NV_CTRL_STRING_DDCCI_MISC_AUXILIARY_DISPLAY_DATA";
+ printf(" Testing attribute NV_CTRL_STRING_DDCCI_MISC_AUXILIARY_DISPLAY_DATA\n");
+
+ attr=NV_CTRL_STRING_DDCCI_MISC_AUXILIARY_DISPLAY_DATA;
+ printf(" Setting attribute... "); fflush(stdout);
+ status=XNVCTRLSetStringAttribute(dpy, screen, display_mask, attr, str);
+ if(status)
+ printf("success\n");
+ else
+ printf("failed\n");
+ }
+ printf("================================================================================\n\n");
+}
+
+/* - Do_Special_VCP
+ * Excercises the scpecial VCP codes, that are neither simple or string NV-CONTROL attributes
+ * These correspond to VCP code that handle multiple values at once
+ */
+static void Do_Special_VCP(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask) {
+ int display_devices=DISPLAY_DEVICES;
+ int status;
+ int retry, error;
+
+ if ((display_mask & display_devices) == 0x0) return;
+ if ((display_mask & ddcci_devices) == 0x0) return;
+
+ printf("NVCTRL_ String Attributes\n");
+ printf("-------------------------\n");
+
+ printf(" Display Mask 0x%x\n", display_mask);
+
+ printf(" Testing function XNVCTRLQueryDDCCILutSize\n");
+ {
+ unsigned int red_entries;
+ unsigned int green_entries;
+ unsigned int blue_entries;
+ unsigned int red_bits_per_entries;
+ unsigned int green_bits_per_entries;
+ unsigned int blue_bits_per_entries;
+
+ printf(" Querying attribute... "); fflush(stdout);
+ status=XNVCTRLQueryDDCCILutSize (dpy, screen, display_mask,
+ &red_entries, &green_entries, &blue_entries,
+ &red_bits_per_entries, &green_bits_per_entries, &blue_bits_per_entries);
+ if (!status) {
+ printf("Error when querying attribute.\n");
+ printf(" (normal if this attribute is not supported by the display)\n");
+ }
+ else {
+ printf("red_entries=%d; green_entries=%d; blue_entries=%d\n", red_entries, green_entries, blue_entries);
+ printf("red_bits_per_entries=%d; green_bits_per_entries=%d; blue_bits_per_entries=%d\n",
+ red_bits_per_entries, green_bits_per_entries, blue_bits_per_entries);
+ }
+ }
+
+ printf(" Testing function XNVCTRLSetDDCCISinglePointLutOperation\n");
+ printf(" XNVCTRLQueryDDCCISinglePointLutOperation\n");
+ {
+ unsigned int offset;
+ unsigned int red_value, ret_red_value;
+ unsigned int green_value, ret_green_value;
+ unsigned int blue_value, ret_blue_value;
+
+ offset=0;
+ red_value=1;
+ green_value=2;
+ blue_value=3;
+
+ retry=RETRIES;
+ do {
+ error=0;
+ printf(" Setting attribute... "); fflush(stdout);
+ status=XNVCTRLSetDDCCISinglePointLutOperation(dpy, screen, display_mask, offset, red_value, green_value, blue_value);
+ if(status)
+ printf("success\n");
+ else {
+ printf("failed.\n");
+ printf(" (normal if this attribute is not supported by the display)\n");
+ }
+ printf(" Querying attribute... "); fflush(stdout);
+
+ status=XNVCTRLQueryDDCCISinglePointLutOperation(dpy, screen, display_mask, offset,
+ &ret_red_value, &ret_green_value, &ret_blue_value);
+ if (!status) {
+ printf("Error when querying attribute.\n");
+ printf(" (normal if this attribute is not supported by the display)\n");
+ error=1;
+ }
+ else {
+ if(red_value!=ret_red_value) {
+ printf(" Error when reading back red_value: %d\n", ret_red_value);
+ error=1;
+ }
+ if(red_value!=ret_red_value) {
+ printf(" Error when reading back green_value: %d\n", ret_green_value);
+ error=1;
+ }
+ if(red_value!=ret_red_value) {
+ printf(" Error when reading back blue_value: %d\n", ret_blue_value);
+ error=1;
+ }
+ }
+ if(error) {
+ if(retry) {
+ printf(" Retrying...\n");
+ }
+ }
+ } while(retry--);
+ }
+
+ printf(" Testing function XNVCTRLSetDDCCIBlockLutOperation\n");
+ printf(" XNVCTRLQueryDDCCIBlockLutOperation\n");
+ {
+ unsigned int color; // NV_CTRL_DDCCI_RED_LUT, NV_CTRL_DDCCI_GREEN_LUT, NV_CTRL_DDCCI_BLUE_LUT
+ unsigned int offset;
+ unsigned int size=2;
+ unsigned int value[2], *ret_value;
+ int i;
+
+ color=NV_CTRL_DDCCI_RED_LUT;
+ offset=0;
+ value[0]=1;
+ value[1]=2;
+
+ retry=RETRIES;
+ do {
+ printf(" Setting attribute... "); fflush(stdout);
+ status=XNVCTRLSetDDCCIBlockLutOperation(dpy, screen, display_mask, color, offset, size, value);
+ if(status)
+ printf("success\n");
+ else {
+ printf("failed.\n");
+ printf(" (normal if this attribute is not supported by the display)\n");
+ }
+
+ printf(" Querying attribute... "); fflush(stdout);
+ status=XNVCTRLQueryDDCCIBlockLutOperation(dpy, screen, display_mask, color, offset, size, &ret_value);
+ if (!status) {
+ printf("Error when querying attribute.\n");
+ printf(" (normal if this attribute is not supported by the display)\n");
+ error=1;
+ }
+ else {
+ for(i=0;i<size;i++)
+ if(value[i]!=ret_value[i]) {
+ printf("Error when reading back value[%d]: %d", i, ret_value[i]);
+ error=1;
+ }
+ free(ret_value);
+ }
+ if(error) {
+ if(retry) {
+ printf(" Retrying...\n");
+ }
+ }
+ } while(retry--);
+ }
+
+ printf(" Testing function XNVCTRLSetDDCCIRemoteProcedureCall\n");
+ {
+ unsigned int offset;
+ unsigned int size=2;
+ unsigned int red_lut[2];
+ unsigned int green_lut[2];
+ unsigned int blue_lut[2];
+ unsigned int increment[2];
+
+ offset=0;
+ red_lut[0]=1;red_lut[1]=2;
+ green_lut[0]=3;green_lut[1]=4;
+ blue_lut[0]=5;blue_lut[1]=6;
+ increment[0]=7;increment[1]=8;
+
+ printf(" Setting attribute... "); fflush(stdout);
+ status=XNVCTRLSetDDCCIRemoteProcedureCall(dpy, screen, display_mask, offset, size,
+ red_lut, green_lut, blue_lut, increment);
+ if(status)
+ printf("success\n");
+ else
+ printf("failed\n");
+ }
+
+ printf(" Testing function XNVCTRLQueryDDCCIDisplayControllerType\n");
+ {
+ unsigned char *controller_manufacturer;
+ unsigned int controller_type;
+ int status;
+
+ printf(" Querying attribute... "); fflush(stdout);
+ status=XNVCTRLQueryDDCCIDisplayControllerType(dpy, screen, display_mask, &controller_manufacturer, &controller_type);
+ if (!status) {
+ printf("Error when querying attribute.\n");
+ printf(" (normal if this attribute is not supported by the display)\n");
+ }
+ else {
+ printf("Controller manufacturer =%s\n", controller_manufacturer);
+ printf("Controller type =%d\n", controller_type);
+ free(controller_manufacturer);
+ }
+ }
+ printf("================================================================================\n\n");
+}
diff --git a/src/gtk+-2.x/Makefile.inc b/src/gtk+-2.x/Makefile.inc
index 0501eb3..947c560 100644
--- a/src/gtk+-2.x/Makefile.inc
+++ b/src/gtk+-2.x/Makefile.inc
@@ -50,7 +50,9 @@ SRC += \
ctkthermal.c \
ctkgvo.c \
ctkdropdownmenu.c \
- ctkrandr.c
+ ctkrandr.c \
+ ctkclocks.c \
+ ctkutils.c
EXTRA_DIST += \
@@ -79,5 +81,6 @@ EXTRA_DIST += \
ctkthermal.h \
ctkgvo.h \
ctkdropdownmenu.h \
- ctkrandr.h
-
+ ctkrandr.h \
+ ctkclocks.h \
+ ctkutils.h
diff --git a/src/gtk+-2.x/ctkclocks.c b/src/gtk+-2.x/ctkclocks.c
new file mode 100644
index 0000000..23d7533
--- /dev/null
+++ b/src/gtk+-2.x/ctkclocks.c
@@ -0,0 +1,1588 @@
+/*
+ * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix
+ * and Linux systems.
+ *
+ * Copyright (C) 2004 NVIDIA Corporation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of Version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program 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 Version 2
+ * of the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the:
+ *
+ * Free Software Foundation, Inc.
+ * 59 Temple Place - Suite 330
+ * Boston, MA 02111-1307, USA
+ *
+ */
+
+/**** INCLUDES ***************************************************************/
+
+#include <gtk/gtk.h>
+#include <gdk/gdkx.h>
+
+#include "clocks_banner.h"
+
+#include "ctkclocks.h"
+
+#include "ctkscale.h"
+#include "ctkhelp.h"
+#include "ctkevent.h"
+#include "ctkconstants.h"
+
+
+
+/**** DEFINES ****************************************************************/
+
+/* GUI padding space around frames */
+
+#define FRAME_PADDING 5
+
+
+
+/**** MACROS *****************************************************************/
+
+/* Setting/Getting GPU and Memory frequencies from packed int */
+
+#define GET_GPU_CLOCK(C) ( (C) >> 16 )
+#define GET_MEM_CLOCK(C) ( (C) & 0xFFFF )
+#define MAKE_CLOCKS(G, M) ( ((G) << 16) | ((M) & 0xFFFF) )
+
+
+
+/**** PROTOTYPES *************************************************************/
+
+static void overclocking_state_update_gui(CtkClocks *ctk_object);
+static void overclocking_state_toggled(GtkWidget *widget, gpointer user_data);
+static void overclocking_state_received(GtkObject *object, gpointer arg1,
+ gpointer user_data);
+
+static void auto_detection_state_received(GtkObject *object, gpointer arg1,
+ gpointer user_data);
+
+static void sync_gui_to_modify_clocks(CtkClocks *ctk_object, int which_clocks);
+
+static void set_clocks_value(CtkClocks *ctk_object, int clocks,
+ int which_clocks);
+static void adjustment_value_changed(GtkAdjustment *adjustment,
+ gpointer user_data);
+
+static void clock_menu_changed(GtkOptionMenu *option_menu, gpointer user_data);
+
+static void apply_clocks_clicked(GtkWidget *widget, gpointer user_data);
+static void detect_clocks_clicked(GtkWidget *widget, gpointer user_data);
+static void reset_clocks_clicked(GtkWidget *widget, gpointer user_data);
+
+static void clocks_received(GtkObject *object, gpointer arg1,
+ gpointer user_data);
+
+static void license_scrolled(GtkRange *range,
+ gpointer user_data);
+
+
+
+/**** GLOBALS ****************************************************************/
+
+/* Tooltips */
+
+static const char * __enable_button_help =
+"The Enable Overclocking checkbox enables access to GPU and graphics card "
+"memory interface overclocking functionality. Note that overclocking your "
+"GPU and/or graphics card memory interface is not recommended and is done "
+"at your own risk. You should never have to enable this.";
+
+static const char * __clock_menu_help =
+"Selects which clock frequencies to modify. Standard (2D) only affects 2D "
+"applications. Performance (3D) only affects 3D applications.";
+
+static const char * __gpu_clock_help =
+"The GPU Clock Frequency is the core clock speed that the NVIDIA GPU will be "
+"set to when the graphics card is operating in this mode (2D/3D).";
+
+static const char * __mem_clock_help =
+"The Memory Clock Frequency is the clock speed of the memory interface on "
+"the graphics card. On some systems, the clock frequency is required to "
+"be the same for both 2D and 3D modes. For these systems, setting the 2D "
+"memory clock frequency will also set the 3D memory clock frequency.";
+
+static const char * __apply_button_help =
+"The Apply button allows you to set the desired clock frequencies for the "
+"GPU and graphics card memory interface. Slider positions are only applied "
+"after clicking this button.";
+
+static const char * __detect_button_help =
+"The Auto Detect button determines the maximum clock setting that is safe "
+"on your system at this instant. The maximum clock setting determined here "
+"can vary on consecutive runs and depends on how well the system handles the "
+"auto-detection stress tests. This is only available for 3D clock "
+"frequencies. You must click the Apply button to set the results found.";
+
+static const char * __cancel_button_help =
+"The Cancel Detection button allows you to cancel testing for the optimal 3D "
+"clock frequencies.";
+
+static const char * __reset_button_help =
+"The Reset Hardware Defaults button lets you restore the original GPU and "
+"memory interface clock frequencies.";
+
+
+/* Messages */
+
+static const char * __enable_confirm_msg =
+"To use the features on the Clock Frequencies panel you\n"
+"must agree to the terms of the preceding license agreement.\n"
+"Do you agree accept this agreement?";
+
+static const char * __detect_confirm_msg =
+"To find the best 3D clock frequencies your system supports,\n"
+"a series of tests will take place. This testing may take several "
+"minutes.\n";
+
+
+static const char * __detect_wait_msg =
+"Optimal 3D clock frequencies are being probed, please wait...";
+
+static const char * __canceled_msg =
+"Probing for optimal 3D clock frequencies has been canceled.";
+
+
+static const char * __license_pre_msg =
+"Please read the following license agreement.";
+
+static const char * __license_msg =
+"<b>TERMS AND CONDITIONS</b>\n"
+"\n"
+"WARNING: THE SOFTWARE UTILITY YOU ARE ABOUT TO \n"
+"ENABLE (\"UTILITY\") MAY CAUSE SYSTEM DAMAGE AND \n"
+"VOID WARRANTIES. THIS UTILITY RUNS YOUR COMPUTER \n"
+"SYSTEM OUT OF THE MANUFACTURER'S DESIGN \n"
+"SPECIFICATIONS, INCLUDING, BUT NOT LIMITED TO: \n"
+"HIGHER SYSTEM VOLTAGES, ABOVE NORMAL \n"
+"TEMPERATURES, EXCESSIVE FREQUENCIES, AND \n"
+"CHANGES TO BIOS THAT MAY CORRUPT THE BIOS. YOUR \n"
+"COMPUTER'S OPERATING SYSTEM MAY HANG AND RESULT \n"
+"IN DATA LOSS OR CORRUPTED IMAGES. DEPENDING ON \n"
+"THE MANUFACTURER OF YOUR COMPUTER SYSTEM, THE \n"
+"COMPUTER SYSTEM, HARDWARE AND SOFTWARE \n"
+"WARRANTIES MAY BE VOIDED, AND YOU MAY NOT \n"
+"RECEIVE ANY FURTHER MANUFACTURER SUPPORT. \n"
+"NVIDIA DOES NOT PROVIDE CUSTOMER SERVICE SUPPORT \n"
+"FOR THIS UTILITY. IT IS FOR THESE REASONS THAT \n"
+"ABSOLUTELY NO WARRANTY OR GUARANTEE IS EITHER \n"
+"EXPRESS OR IMPLIED. BEFORE ENABLING AND USING, YOU \n"
+"SHOULD DETERMINE THE SUITABILITY OF THE UTILITY \n"
+"FOR YOUR INTENDED USE, AND YOU SHALL ASSUME ALL \n"
+"RESPONSIBILITY IN CONNECTION THEREWITH.\n"
+"\n"
+"\n"
+"<b>DISCLAIMER OF WARRANTIES</b>\n"
+"\n"
+"ALL MATERIALS, INFORMATION, AND SOFTWARE \n"
+"PRODUCTS, INCLUDED IN OR MADE AVAILABLE THROUGH \n"
+"THIS UTILITY ARE PROVIDED \"AS IS\" AND \"AS AVAILABLE\" \n"
+"FOR YOUR USE. THE UTILITY IS PROVIDED WITHOUT \n"
+"WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, \n"
+"INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF \n"
+"MERCHANTABILITY, FITNESS FOR A PARTICULAR \n"
+"PURPOSE, OR NONINFRINGEMENT. NVIDIA AND ITS \n"
+"SUBSIDIARIES DO NOT WARRANT THAT THE UTILITY IS \n"
+"RELIABLE OR CORRECT; THAT ANY DEFECTS OR ERRORS \n"
+"WILL BE CORRECTED; OR THAT THE UTILITY IS FREE OF \n"
+"VIRUSES OR OTHER HARMFUL COMPONENTS. YOUR USE \n"
+"OF THE UTILITY IS SOLELY AT YOUR RISK. BECAUSE SOME \n"
+"JURISDICTIONS DO NOT PERMIT THE EXCLUSION OF \n"
+"CERTAIN WARRANTIES, THESE EXCLUSIONS MAY NOT \n"
+"APPLY TO YOU.\n"
+"\n"
+"\n"
+"<b>LIMITATION OF LIABILITY</b>\n"
+"\n"
+"UNDER NO CIRCUMSTANCES SHALL NVIDIA AND ITS \n"
+"SUBSIDIARIES BE LIABLE FOR ANY DIRECT, INDIRECT, \n"
+"PUNITIVE, INCIDENTAL, SPECIAL, OR CONSEQUENTIAL \n"
+"DAMAGES THAT RESULT FROM THE USE OF, OR INABILITY \n"
+"TO USE, THE UTILITY. THIS LIMITATION APPLIES WHETHER \n"
+"THE ALLEGED LIABILITY IS BASED ON CONTRACT, TORT, \n"
+"NEGLIGENCE, STRICT LIABILITY, OR ANY OTHER BASIS, \n"
+"EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF \n"
+"SUCH DAMAGE. BECAUSE SOME JURISDICTIONS DO NOT \n"
+"ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR \n"
+"CONSEQUENTIAL DAMAGES, NVIDIA'S LIABILITY IN SUCH \n"
+"JURISDICTIONS SHALL BE LIMITED TO THE EXTENT \n"
+"PERMITTED BY LAW. \n"
+"\n"
+"IF YOU HAVE READ, UNDERSTOOD, AND AGREE TO ALL OF \n"
+"THE ABOVE TERMS AND CONDITIONS, CLICK THE \"YES\" \n"
+"BUTTON BELOW. \n"
+"\n"
+"IF YOU DO NOT AGREE WITH ALL OF THE ABOVE TERMS \n"
+"AND CONDITIONS, THEN CLICK ON THE \"NO\" BUTTON \n"
+"BELOW, AND DO NOT ENABLE OR USE THE UTILITY. \n\n";
+
+
+
+
+/**** FUNCTIONS **************************************************************/
+
+/*****
+ *
+ * Returns the gpu overclocking ctk object type.
+ *
+ */
+GType ctk_clocks_get_type(void)
+{
+ static GType ctk_object_type = 0;
+
+ if (!ctk_object_type) {
+ static const GTypeInfo ctk_object_info = {
+ sizeof (CtkClocksClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ NULL, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof(CtkClocks),
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ };
+
+ ctk_object_type = g_type_register_static
+ (GTK_TYPE_VBOX, "CtkClocks", &ctk_object_info, 0);
+ }
+
+ return ctk_object_type;
+
+} /* ctk_clocks_get_type() */
+
+
+/*****
+ *
+ * Main CTK widget creation.
+ *
+ */
+GtkWidget* ctk_clocks_new(NvCtrlAttributeHandle *handle,
+ CtkConfig *ctk_config,
+ CtkEvent *ctk_event)
+{
+ GObject *object;
+ CtkClocks *ctk_object;
+ GtkObject *adjustment;
+ GtkWidget *alignment;
+ GtkWidget *scale;
+ GtkWidget *menu;
+ GtkWidget *menu_item;
+ GtkWidget *scrollWin;
+ GtkWidget *event;
+ GdkColor color;
+
+ GtkWidget *label;
+
+ GtkWidget *frame;
+ GtkWidget *hbox;
+ GtkWidget *vbox;
+
+
+ ReturnStatus ret; /* NvCtrlxxx function return value */
+ int value;
+ int clocks_2D;
+ NVCTRLAttributeValidValuesRec ranges_2D;
+ int clocks_3D;
+ NVCTRLAttributeValidValuesRec ranges_3D;
+
+ Bool overclocking_enabled;
+ Bool probing_optimal;
+ Bool can_access_2d_clocks;
+ Bool can_access_3d_clocks;
+
+
+ /* Make sure we have a handle */
+
+ g_return_val_if_fail(handle != NULL, NULL);
+
+ /* If we can't query the overclocking state, don't load the page */
+
+ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_OVERCLOCKING_STATE,
+ &value);
+ if ( ret != NvCtrlSuccess )
+ return NULL;
+ overclocking_enabled =
+ (value==NV_CTRL_GPU_OVERCLOCKING_STATE_MANUAL)?True:False;
+
+ /* Check if overclocking is busy */
+
+ if ( overclocking_enabled ) {
+ ret = NvCtrlGetAttribute(handle,
+ NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE,
+ &value);
+ if ( ret != NvCtrlSuccess )
+ return NULL;
+ probing_optimal = (value==NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_BUSY);
+ } else {
+ probing_optimal = FALSE;
+ }
+
+ /* Can we access the 2D clocks? */
+
+ can_access_2d_clocks = True;
+ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_2D_CLOCK_FREQS, &clocks_2D);
+ if ( ret != NvCtrlSuccess )
+ can_access_2d_clocks = False;
+ ret = NvCtrlGetValidAttributeValues(handle, NV_CTRL_GPU_2D_CLOCK_FREQS,
+ &ranges_2D);
+ if ( ret != NvCtrlSuccess )
+ can_access_2d_clocks = False;
+
+ /* Can we access the 3D clocks? */
+
+ can_access_3d_clocks = True;
+ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_3D_CLOCK_FREQS, &clocks_3D);
+ if ( ret != NvCtrlSuccess )
+ can_access_3d_clocks = False;
+ ret = NvCtrlGetValidAttributeValues(handle, NV_CTRL_GPU_3D_CLOCK_FREQS,
+ &ranges_3D);
+ if ( ret != NvCtrlSuccess )
+ can_access_3d_clocks = False;
+
+ /* If we can't access either of the clocks, don't load the page */
+
+ if ( !can_access_2d_clocks && !can_access_3d_clocks )
+ return NULL;
+
+ /* Create the ctk object */
+
+ object = g_object_new(CTK_TYPE_CLOCKS, NULL);
+ ctk_object = CTK_CLOCKS(object);
+
+ /* Cache the handke and configuration */
+
+ ctk_object->handle = handle;
+ ctk_object->ctk_config = ctk_config;
+ ctk_object->license_accepted = // = overclocking_enabled
+ ctk_object->overclocking_enabled = overclocking_enabled;
+ ctk_object->probing_optimal = probing_optimal;
+
+ /* Create the Clock menu widget */
+
+ menu = gtk_menu_new();
+
+ if ( can_access_2d_clocks ) {
+ menu_item = gtk_menu_item_new_with_label("2D Clock Frequencies");
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
+ }
+
+ if ( can_access_3d_clocks ) {
+ menu_item = gtk_menu_item_new_with_label("3D Clock Frequencies");
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
+ }
+
+ ctk_object->clock_menu = gtk_option_menu_new ();
+ gtk_option_menu_set_menu
+ (GTK_OPTION_MENU(ctk_object->clock_menu), menu);
+
+ g_signal_connect(G_OBJECT(ctk_object->clock_menu), "changed",
+ G_CALLBACK(clock_menu_changed),
+ (gpointer) ctk_object);
+
+ ctk_config_set_tooltip(ctk_config, ctk_object->clock_menu,
+ __clock_menu_help);
+
+ gtk_widget_set_sensitive(ctk_object->clock_menu,
+ overclocking_enabled && !probing_optimal);
+
+ /* Create the GPU clock frequency slider widget */
+
+ if ( can_access_2d_clocks ) {
+ adjustment =
+ gtk_adjustment_new(GET_GPU_CLOCK(clocks_2D),
+ GET_GPU_CLOCK(ranges_2D.u.range.min),
+ GET_GPU_CLOCK(ranges_2D.u.range.max),
+ 1, 5, 0.0);
+ ctk_object->clocks_being_modified = CLOCKS_2D;
+ } else {
+ adjustment =
+ gtk_adjustment_new(GET_GPU_CLOCK(clocks_3D),
+ GET_GPU_CLOCK(ranges_3D.u.range.min),
+ GET_GPU_CLOCK(ranges_3D.u.range.max),
+ 1, 5, 0.0);
+ ctk_object->clocks_being_modified = CLOCKS_3D;
+ }
+
+ scale = ctk_scale_new(GTK_ADJUSTMENT(adjustment), "GPU (MHz)",
+ ctk_config, G_TYPE_INT);
+ ctk_object->gpu_clk_scale = scale;
+
+ g_signal_connect(adjustment, "value_changed",
+ G_CALLBACK(adjustment_value_changed),
+ (gpointer) ctk_object);
+
+ ctk_config_set_tooltip(ctk_config,
+ CTK_SCALE(ctk_object->gpu_clk_scale)->gtk_scale,
+ __gpu_clock_help);
+
+ gtk_widget_set_sensitive(ctk_object->gpu_clk_scale,
+ overclocking_enabled && !probing_optimal);
+
+ /* Create the Memory clock frequency slider widget */
+
+ if ( can_access_2d_clocks ) {
+ adjustment =
+ gtk_adjustment_new(GET_MEM_CLOCK(clocks_2D),
+ GET_MEM_CLOCK(ranges_2D.u.range.min),
+ GET_MEM_CLOCK(ranges_2D.u.range.max),
+ 1, 5, 0.0);
+ } else {
+ adjustment =
+ gtk_adjustment_new(GET_MEM_CLOCK(clocks_3D),
+ GET_MEM_CLOCK(ranges_3D.u.range.min),
+ GET_MEM_CLOCK(ranges_3D.u.range.max),
+ 1, 5, 0.0);
+ }
+
+ scale = ctk_scale_new(GTK_ADJUSTMENT(adjustment), "Memory (MHz)",
+ ctk_config, G_TYPE_INT);
+ ctk_object->mem_clk_scale = scale;
+
+ g_signal_connect(adjustment, "value_changed",
+ G_CALLBACK(adjustment_value_changed),
+ (gpointer) ctk_object);
+
+ ctk_config_set_tooltip(ctk_config,
+ CTK_SCALE(ctk_object->mem_clk_scale)->gtk_scale,
+ __mem_clock_help);
+
+ gtk_widget_set_sensitive(ctk_object->mem_clk_scale,
+ overclocking_enabled && !probing_optimal);
+
+ /* Create the Enable Overclocking checkbox widget */
+
+ ctk_object->enable_checkbox =
+ gtk_check_button_new_with_label("Enable Overclocking");
+
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON(ctk_object->enable_checkbox),
+ overclocking_enabled);
+
+ gtk_widget_set_sensitive(ctk_object->enable_checkbox,
+ overclocking_enabled && !probing_optimal);
+
+ g_signal_connect(G_OBJECT(ctk_object->enable_checkbox), "toggled",
+ G_CALLBACK(overclocking_state_toggled),
+ (gpointer) ctk_object);
+
+ ctk_config_set_tooltip(ctk_config, ctk_object->enable_checkbox,
+ __enable_button_help);
+
+ gtk_widget_set_sensitive(ctk_object->enable_checkbox, !probing_optimal);
+
+ /* Create the Apply button widget */
+
+ ctk_object->apply_button =
+ gtk_button_new_with_label("Apply");
+
+ g_signal_connect(G_OBJECT(ctk_object->apply_button), "clicked",
+ G_CALLBACK(apply_clocks_clicked),
+ (gpointer) ctk_object);
+
+ ctk_config_set_tooltip(ctk_config, ctk_object->apply_button,
+ __apply_button_help);
+
+ gtk_widget_set_sensitive(ctk_object->apply_button, False);
+
+ /* Create the Auto Detect button widget */
+
+ ctk_object->detect_button =
+ gtk_button_new_with_label("Auto Detect");
+
+ g_signal_connect(G_OBJECT(ctk_object->detect_button), "clicked",
+ G_CALLBACK(detect_clocks_clicked),
+ (gpointer) ctk_object);
+
+ ctk_config_set_tooltip(ctk_config, ctk_object->detect_button,
+ __detect_button_help);
+
+ if ( ctk_object->clocks_being_modified == CLOCKS_2D ) {
+ gtk_widget_set_sensitive(ctk_object->detect_button, False);
+ } else {
+ gtk_widget_set_sensitive(ctk_object->detect_button,
+ overclocking_enabled && !probing_optimal);
+ }
+
+ /* Create the Reset hardware button widget */
+
+ ctk_object->reset_button =
+ gtk_button_new_with_label("Reset Hardware Defaults");
+
+ g_signal_connect(G_OBJECT(ctk_object->reset_button), "clicked",
+ G_CALLBACK(reset_clocks_clicked),
+ (gpointer) ctk_object);
+
+ ctk_config_set_tooltip(ctk_config, ctk_object->reset_button,
+ __reset_button_help);
+
+ gtk_widget_set_sensitive(ctk_object->reset_button, False);
+
+ /* Create the enable dialog */
+
+ ctk_object->enable_dialog =
+ gtk_dialog_new_with_buttons("License Agreement",
+ GTK_WINDOW(gtk_widget_get_parent(GTK_WIDGET(ctk_object))),
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
+ GTK_STOCK_YES,
+ GTK_RESPONSE_ACCEPT,
+ GTK_STOCK_NO,
+ GTK_RESPONSE_REJECT,
+ NULL
+ );
+
+ hbox = gtk_hbox_new(TRUE, 10);
+ label = gtk_label_new(__license_pre_msg);
+
+ gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 10);
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ctk_object->enable_dialog)->vbox),
+ hbox, FALSE, FALSE, 10);
+
+ scrollWin = gtk_scrolled_window_new(NULL, NULL);
+ hbox = gtk_hbox_new(FALSE, 0);
+ label = gtk_label_new("");
+ event = gtk_event_box_new();
+ ctk_object->license_window = scrollWin;
+
+ gdk_color_parse("white", &color);
+ gtk_widget_modify_bg(event, GTK_STATE_NORMAL, &color);
+
+ gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
+ gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
+ gtk_label_set_markup(GTK_LABEL(label), __license_msg);
+
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollWin),
+ GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
+
+
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
+ gtk_container_add(GTK_CONTAINER(event), hbox);
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollWin),
+ event);
+ hbox = gtk_hbox_new(TRUE, 10);
+ gtk_box_pack_start(GTK_BOX(hbox), scrollWin, TRUE, TRUE, 10);
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ctk_object->enable_dialog)->vbox),
+ hbox, TRUE, TRUE, 10);
+
+
+ hbox = gtk_hbox_new(FALSE, 10);
+ label = gtk_label_new(__enable_confirm_msg);
+
+ gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 15);
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ctk_object->enable_dialog)->vbox),
+ hbox, FALSE, FALSE, 10);
+
+ g_signal_connect((gpointer)
+ GTK_RANGE(GTK_SCROLLED_WINDOW(scrollWin)->vscrollbar),
+ "value_changed",
+ G_CALLBACK(license_scrolled),
+ (gpointer) ctk_object);
+
+ /* Create the auto detect dialog */
+
+ ctk_object->detect_dialog =
+ gtk_dialog_new_with_buttons("Auto Detect Optimal 3D Clock Frequencies?",
+ GTK_WINDOW(gtk_widget_get_parent(GTK_WIDGET(ctk_object))),
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
+ GTK_STOCK_OK,
+ GTK_RESPONSE_ACCEPT,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_REJECT,
+ NULL
+ );
+
+ label = gtk_label_new(__detect_confirm_msg);
+ hbox = gtk_hbox_new(TRUE, 15);
+
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 15);
+
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ctk_object->detect_dialog)->vbox),
+ hbox, FALSE, FALSE, 15);
+
+ /*
+ * Now that we've created all the widgets we care about, we're
+ * ready to compose the panel
+ */
+
+ /* Set container properties of the ctk object */
+
+ gtk_box_set_spacing(GTK_BOX(ctk_object), 10);
+
+
+ { /* Banner image */
+ const nv_image_t *image_data = &clocks_banner_image;
+ guint8 *image_buffer = decompress_image_data(image_data);
+ GdkPixbuf *image_pixbuf =
+ gdk_pixbuf_new_from_data(image_buffer, GDK_COLORSPACE_RGB,
+ FALSE, 8, image_data->width,
+ image_data->height,
+ image_data->width * image_data->bytes_per_pixel,
+ free_decompressed_image, NULL);
+ GtkWidget *image = gtk_image_new_from_pixbuf(image_pixbuf);
+
+ frame = gtk_frame_new(NULL);
+
+ hbox = gtk_hbox_new(FALSE, 0);
+
+ gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, FALSE, 0);
+
+ gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
+ gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 0);
+
+ gtk_container_add(GTK_CONTAINER(frame), image);
+ }
+
+ /* Add Overclocking checkbox */
+
+ hbox = gtk_hbox_new(FALSE, 0);
+
+ gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, FALSE, 0);
+
+ gtk_box_pack_start(GTK_BOX(hbox), ctk_object->enable_checkbox,
+ FALSE, FALSE, 0);
+
+ /* Add Clock frequency frame */
+
+ frame = gtk_frame_new("Clock Frequencies");
+ vbox = gtk_vbox_new(FALSE, 0);
+ hbox = gtk_hbox_new(FALSE, 0);
+
+ gtk_container_set_border_width(GTK_CONTAINER(vbox), FRAME_PADDING);
+
+ gtk_box_pack_start(GTK_BOX(object), frame, FALSE, FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(frame), vbox);
+
+
+ gtk_box_pack_start(GTK_BOX(hbox), ctk_object->clock_menu,
+ FALSE, FALSE, 0);
+
+ gtk_box_pack_start(GTK_BOX(vbox), hbox,
+ FALSE, FALSE, 5);
+
+ gtk_box_pack_start(GTK_BOX(vbox), ctk_object->gpu_clk_scale,
+ FALSE, FALSE, 5);
+
+ gtk_box_pack_start(GTK_BOX(vbox), ctk_object->mem_clk_scale,
+ FALSE, FALSE, 5);
+
+ /* Add the Apply, Auto Detect, and Reset buttons */
+
+ hbox = gtk_hbox_new(FALSE, 5);
+
+ gtk_box_pack_start(GTK_BOX(hbox), ctk_object->apply_button,
+ FALSE, FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(hbox), ctk_object->detect_button);
+ gtk_container_add(GTK_CONTAINER(hbox), ctk_object->reset_button);
+
+ alignment = gtk_alignment_new(1, 1, 0, 0);
+ gtk_container_add(GTK_CONTAINER(alignment), hbox);
+ gtk_box_pack_start(GTK_BOX(object), alignment, TRUE, TRUE, 0);
+
+ /* Setup the initial gui state */
+
+ sync_gui_to_modify_clocks(ctk_object, ctk_object->clocks_being_modified);
+
+ /* Handle events from other NV-CONTROL clients */
+
+ g_signal_connect(G_OBJECT(ctk_event),
+ CTK_EVENT_NAME(NV_CTRL_GPU_OVERCLOCKING_STATE),
+ G_CALLBACK(overclocking_state_received),
+ (gpointer) ctk_object);
+
+ g_signal_connect(G_OBJECT(ctk_event),
+ CTK_EVENT_NAME(NV_CTRL_GPU_2D_CLOCK_FREQS),
+ G_CALLBACK(clocks_received),
+ (gpointer) ctk_object);
+
+ g_signal_connect(G_OBJECT(ctk_event),
+ CTK_EVENT_NAME(NV_CTRL_GPU_3D_CLOCK_FREQS),
+ G_CALLBACK(clocks_received),
+ (gpointer) ctk_object);
+
+ g_signal_connect(G_OBJECT(ctk_event),
+ CTK_EVENT_NAME(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS),
+ G_CALLBACK(clocks_received),
+ (gpointer) ctk_object);
+
+ g_signal_connect(G_OBJECT(ctk_event),
+ CTK_EVENT_NAME(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS),
+ G_CALLBACK(clocks_received),
+ (gpointer) ctk_object);
+
+ g_signal_connect(G_OBJECT(ctk_event),
+ CTK_EVENT_NAME(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE),
+ G_CALLBACK(auto_detection_state_received),
+ (gpointer) ctk_object);
+
+ /* Show the widget */
+
+ gtk_widget_show_all(GTK_WIDGET(ctk_object));
+
+ return GTK_WIDGET(ctk_object);
+
+} /* ctk_clocks_new() */
+
+
+
+/*****
+ *
+ * GPU overclocking help screen.
+ *
+ */
+GtkTextBuffer *ctk_clocks_create_help(GtkTextTagTable *table,
+ CtkClocks *ctk_object)
+{
+ GtkTextIter i;
+ GtkTextBuffer *b;
+
+ b = gtk_text_buffer_new(table);
+
+ gtk_text_buffer_get_iter_at_offset(b, &i, 0);
+
+ ctk_help_title(b, &i, "Clock Frequency Overclocking Help");
+ ctk_help_para(b, &i,
+ "WARNING: Overclocking has the potential of destroying your "
+ "graphics card, CPU, RAM and any other component. It may "
+ "also reduce the life expectancy of your components and "
+ "void manufacturer warranties. DO THIS AT YOUR OWN RISK. "
+ );
+ ctk_help_heading(b, &i, "Enabeling Clock Frequencies");
+ ctk_help_para(b, &i, __enable_button_help);
+ ctk_help_para(b, &i,
+ "GPU Overclocking functionality is currently limited to "
+ "GeForce FX and newer non-mobile GPUs."
+ );
+ ctk_help_heading(b, &i, "2D/3D Clock Frequencies");
+ ctk_help_para(b, &i,
+ "The 2D clock frequencies are the standard clock "
+ "frequencies used when only 2D applications are running."
+ );
+ ctk_help_para(b, &i,
+ "The 3D clock frequencies are the performance clock "
+ "frequencies used when running 3D applications."
+ );
+ ctk_help_heading(b, &i, "GPU Clock Frequency");
+ ctk_help_para(b, &i, __gpu_clock_help);
+ ctk_help_heading(b, &i, "Memory Clock Frequency");
+ ctk_help_para(b, &i, __mem_clock_help);
+ ctk_help_heading(b, &i, "Applying Custom Clock Frequencies");
+ ctk_help_para(b, &i, __apply_button_help);
+ ctk_help_heading(b, &i, "Auto Detect Optimal 3D Clock Frequencies");
+ ctk_help_para(b, &i, __detect_button_help);
+ ctk_help_heading(b, &i, "Canceling Optimal 3D Clock Frequency Auto "
+ "Dection.");
+ ctk_help_para(b, &i, __cancel_button_help);
+ ctk_help_para(b, &i,
+ "This button is only available if the Optimal "
+ "clocks are currently being probed.");
+ ctk_help_heading(b, &i, "Restoring Hardware Default Frequencies");
+ ctk_help_para(b, &i, __reset_button_help);
+
+ ctk_help_finish(b);
+
+ return b;
+
+} /* ctk_clocks_create_help() */
+
+
+
+/****
+ *
+ * Updates sensitivity of widgets in relation to the state
+ * of overclocking.
+ *
+ */
+static void sync_gui_sensitivity(CtkClocks *ctk_object)
+{
+ gboolean enabled = ctk_object->overclocking_enabled;
+ gboolean probing = ctk_object->probing_optimal;
+ gboolean modified = ctk_object->clocks_modified;
+ gboolean moved = ctk_object->clocks_moved;
+
+
+ /* Update the enable checkbox */
+
+ g_signal_handlers_block_by_func(G_OBJECT(ctk_object->enable_checkbox),
+ G_CALLBACK(overclocking_state_toggled),
+ (gpointer) ctk_object);
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ctk_object->enable_checkbox),
+ enabled);
+
+ g_signal_handlers_unblock_by_func(G_OBJECT(ctk_object->enable_checkbox),
+ G_CALLBACK(overclocking_state_toggled),
+ (gpointer) ctk_object);
+
+ gtk_widget_set_sensitive(ctk_object->enable_checkbox,
+ !probing);
+
+
+ /* Update the clock selection dropdown */
+
+ gtk_widget_set_sensitive(ctk_object->clock_menu, enabled && !probing);
+
+ /* Update the GPU clock slider */
+
+ gtk_widget_set_sensitive(ctk_object->gpu_clk_scale, enabled && !probing);
+
+ /* Update the Memory clock slider */
+
+ gtk_widget_set_sensitive(ctk_object->mem_clk_scale, enabled && !probing);
+
+ /* Update the Apply button */
+
+ gtk_widget_set_sensitive(ctk_object->apply_button,
+ enabled && !probing && moved);
+
+
+ /* Enable the Auto Detect button for 3D clocks only */
+
+ if ( probing ) {
+ gtk_button_set_label(GTK_BUTTON(ctk_object->detect_button), "Cancel Detection");
+ gtk_widget_set_sensitive(ctk_object->detect_button, True);
+ ctk_config_set_tooltip(ctk_object->ctk_config, ctk_object->detect_button,
+ __cancel_button_help);
+
+ } else {
+ gtk_button_set_label(GTK_BUTTON(ctk_object->detect_button), "Auto Detect");
+ gtk_widget_set_sensitive(ctk_object->detect_button,
+ (ctk_object->clocks_being_modified == CLOCKS_3D)?enabled:False);
+ ctk_config_set_tooltip(ctk_object->ctk_config, ctk_object->detect_button,
+ __detect_button_help);
+ }
+
+ /* Update the Reset hardware defaults button */
+
+ gtk_widget_set_sensitive(ctk_object->reset_button,
+ enabled && !probing && (moved || modified));
+
+} /* sync_gui_sensitivity() */
+
+
+
+/****
+ *
+ * Updates widgets in relation to current overclocking state.
+ *
+ */
+static void overclocking_state_update_gui(CtkClocks *ctk_object)
+{
+ ReturnStatus ret;
+ int value;
+ gboolean enabled;
+
+
+ /* We need to check the overclocking state status with
+ * the server everytime someone tries to change the state
+ * because the set might have failed.
+ */
+
+ ret = NvCtrlGetAttribute(ctk_object->handle,
+ NV_CTRL_GPU_OVERCLOCKING_STATE,
+ &value);
+ if ( ret != NvCtrlSuccess )
+ enabled = False;
+ else
+ enabled = (value==NV_CTRL_GPU_OVERCLOCKING_STATE_MANUAL)?True:False;
+
+ ctk_object->overclocking_enabled = enabled;
+
+
+ /* We need to also make sure the server is not busy probing
+ * for the optimal clocks.
+ */
+
+ if ( enabled ) {
+ ret = NvCtrlGetAttribute(ctk_object->handle,
+ NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE,
+ &value);
+ if ( ret == NvCtrlSuccess )
+ ctk_object->probing_optimal =
+ (value == NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_BUSY);
+ }
+
+ /* Sync the gui to be able to modify the clocks */
+
+ sync_gui_to_modify_clocks(ctk_object, ctk_object->clocks_being_modified);
+
+ /* Update the status bar */
+
+ ctk_config_statusbar_message(ctk_object->ctk_config,
+ "GPU overclocking %sabled.",
+ enabled?"en":"dis");
+
+} /* overclocking_state_update_gui() */
+
+
+
+/*****
+ *
+ * Signal handler - Called when the user toggles the "Enable Overclocking"
+ * button.
+ *
+ */
+static void overclocking_state_toggled(GtkWidget *widget, gpointer user_data)
+{
+ CtkClocks *ctk_object = CTK_CLOCKS(user_data);
+ gboolean enabled;
+ ReturnStatus ret;
+ int value;
+ gint result;
+
+ /* Get enabled state */
+
+ enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+
+ value = (enabled==1) ? NV_CTRL_GPU_OVERCLOCKING_STATE_MANUAL :
+ NV_CTRL_GPU_OVERCLOCKING_STATE_NONE;
+
+ /* Verify user knows the risks involved */
+
+ if ( enabled && !ctk_object->license_accepted ) {
+
+ /* Reset dialog window size */
+
+ gint w, h;
+ GdkScreen * s =
+ gtk_window_get_screen(GTK_WINDOW(GTK_DIALOG(ctk_object->enable_dialog)));
+
+ gtk_window_get_size(GTK_WINDOW(GTK_DIALOG(ctk_object->enable_dialog)),
+ &w, &h);
+
+ /* Make license dialog default to 75% of the screen height */
+
+ h = (gint)(0.55f * gdk_screen_get_height(s));
+ w = 1;
+
+ gtk_window_resize(GTK_WINDOW(GTK_DIALOG(ctk_object->enable_dialog)),
+ w, h);
+
+ /* Reset scroll bar to the top */
+
+ gtk_adjustment_set_value(GTK_ADJUSTMENT(
+ GTK_RANGE(
+ GTK_SCROLLED_WINDOW(
+ ctk_object->license_window)->vscrollbar)->adjustment)
+ ,0.0f);
+
+
+ /* Disable the YES button */
+
+ gtk_dialog_set_response_sensitive(GTK_DIALOG(ctk_object->enable_dialog),
+ GTK_RESPONSE_ACCEPT,
+ FALSE);
+
+ gtk_widget_show_all(ctk_object->enable_dialog);
+ result = gtk_dialog_run (GTK_DIALOG(ctk_object->enable_dialog));
+ gtk_widget_hide(ctk_object->enable_dialog);
+
+ switch (result)
+ {
+ case GTK_RESPONSE_ACCEPT:
+ ctk_object->license_accepted = TRUE;
+ break;
+
+ case GTK_RESPONSE_REJECT:
+ default:
+ /* Cancel */
+ g_signal_handlers_block_by_func(G_OBJECT(ctk_object->enable_checkbox),
+ G_CALLBACK(overclocking_state_toggled),
+ (gpointer) ctk_object);
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
+ FALSE);
+
+ g_signal_handlers_unblock_by_func(G_OBJECT(ctk_object->enable_checkbox),
+ G_CALLBACK(overclocking_state_toggled),
+ (gpointer) ctk_object);
+ return;
+ }
+ }
+
+
+ /* Update the server */
+
+ ret = NvCtrlSetAttribute(ctk_object->handle,
+ NV_CTRL_GPU_OVERCLOCKING_STATE, value);
+
+ /* Update the GUI */
+
+ overclocking_state_update_gui(ctk_object);
+
+} /* enable_overclocking_toggled() */
+
+
+
+/*****
+ *
+ * Signal handler - Called when another NV-CONTROL client has set the
+ * overclocking state.
+ *
+ */
+static void overclocking_state_received(GtkObject *object,
+ gpointer arg1, gpointer user_data)
+{
+ CtkClocks *ctk_object = CTK_CLOCKS(user_data);
+
+ /* Update GUI with enable status */
+
+ overclocking_state_update_gui(ctk_object);
+
+} /* overclocking_state_update_received() */
+
+
+
+/*****
+ *
+ * Signal handler - Called when overclocking becomes busy due to
+ * an NV-CONTROL client probing for the optimal clocks.
+ *
+ */
+static void auto_detection_state_received(GtkObject *object,
+ gpointer arg1, gpointer user_data)
+{
+ CtkEventStruct *event_struct = (CtkEventStruct *) arg1;
+ CtkClocks *ctk_object = CTK_CLOCKS(user_data);
+
+
+ /* Update GUI with probing status */
+
+ ctk_object->probing_optimal =
+ (event_struct->value == NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_BUSY);
+ sync_gui_sensitivity(ctk_object);
+
+ /* Update the status bar */
+
+ if ( ctk_object->probing_optimal ) {
+ ctk_config_statusbar_message(ctk_object->ctk_config,
+ __detect_wait_msg);
+ } else {
+ ctk_config_statusbar_message(ctk_object->ctk_config,
+ __canceled_msg);
+ }
+
+} /* auto_detection_state_received() */
+
+
+
+/*****
+ *
+ * Syncs the gui to properly display the correct clocks the user wants to
+ * modify, or has modified with another NV_CONTROL client.
+ *
+ */
+static void sync_gui_to_modify_clocks(CtkClocks *ctk_object, int which_clocks)
+{
+ GtkRange *gtk_range;
+ GtkAdjustment *gtk_adjustment_gpu;
+ GtkAdjustment *gtk_adjustment_mem;
+
+ ReturnStatus ret;
+ int clk_values;
+ int default_clk_values;
+ NVCTRLAttributeValidValuesRec clk_ranges;
+
+
+
+ /* Obtain the current value and range of the desired clocks */
+
+ switch (which_clocks) {
+ case CLOCKS_2D:
+ ret = NvCtrlGetAttribute(ctk_object->handle,
+ NV_CTRL_GPU_2D_CLOCK_FREQS, &clk_values);
+ if ( ret != NvCtrlSuccess )
+ return;
+ ret = NvCtrlGetValidAttributeValues(ctk_object->handle,
+ NV_CTRL_GPU_2D_CLOCK_FREQS,
+ &clk_ranges);
+ if ( ret != NvCtrlSuccess )
+ return;
+ break;
+
+ case CLOCKS_3D:
+ ret = NvCtrlGetAttribute(ctk_object->handle,
+ NV_CTRL_GPU_3D_CLOCK_FREQS, &clk_values);
+ if ( ret != NvCtrlSuccess )
+ return;
+ ret = NvCtrlGetValidAttributeValues(ctk_object->handle,
+ NV_CTRL_GPU_3D_CLOCK_FREQS,
+ &clk_ranges);
+ if ( ret != NvCtrlSuccess )
+ return;
+ break;
+
+ case CLOCKS_NONE:
+ default:
+ return;
+ }
+
+
+ /* See if the clocks were modified */
+
+ ret = NvCtrlGetAttribute(ctk_object->handle,
+ which_clocks==CLOCKS_2D?
+ NV_CTRL_GPU_DEFAULT_2D_CLOCK_FREQS:
+ NV_CTRL_GPU_DEFAULT_3D_CLOCK_FREQS,
+ &default_clk_values);
+
+ ctk_object->clocks_modified =
+ ((ret == NvCtrlSuccess) && (default_clk_values != clk_values));
+
+ if ( ctk_object->clocks_being_modified != which_clocks ) {
+ ctk_object->clocks_moved = False;
+ }
+
+ ctk_object->clocks_being_modified = which_clocks;
+
+
+ /* Make sure the dropdown reflects the right clock set */
+
+ g_signal_handlers_block_by_func(G_OBJECT(ctk_object->clock_menu),
+ G_CALLBACK(clock_menu_changed),
+ (gpointer) ctk_object);
+
+ gtk_option_menu_set_history(GTK_OPTION_MENU(ctk_object->clock_menu),
+ (which_clocks==CLOCKS_2D)?0:1);
+
+ g_signal_handlers_unblock_by_func(G_OBJECT(ctk_object->clock_menu),
+ G_CALLBACK(clock_menu_changed),
+ (gpointer) ctk_object);
+
+
+ /* Make GPU and Memory clocks reflect the right range/values */
+
+ gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->gpu_clk_scale)->gtk_scale);
+ gtk_adjustment_gpu = GTK_ADJUSTMENT(gtk_range->adjustment);
+
+ g_signal_handlers_block_by_func(G_OBJECT(gtk_adjustment_gpu),
+ G_CALLBACK(adjustment_value_changed),
+ (gpointer) ctk_object);
+ gtk_range_set_range(gtk_range,
+ GET_GPU_CLOCK(clk_ranges.u.range.min),
+ GET_GPU_CLOCK(clk_ranges.u.range.max));
+
+ gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->mem_clk_scale)->gtk_scale);
+ gtk_adjustment_mem = GTK_ADJUSTMENT(gtk_range->adjustment);
+
+ g_signal_handlers_block_by_func(G_OBJECT(gtk_adjustment_mem),
+ G_CALLBACK(adjustment_value_changed),
+ (gpointer) ctk_object);
+ gtk_range_set_range(gtk_range,
+ GET_MEM_CLOCK(clk_ranges.u.range.min),
+ GET_MEM_CLOCK(clk_ranges.u.range.max));
+
+ set_clocks_value(ctk_object, clk_values, which_clocks);
+
+ g_signal_handlers_unblock_by_func(G_OBJECT(gtk_adjustment_mem),
+ G_CALLBACK(adjustment_value_changed),
+ (gpointer) ctk_object);
+
+ g_signal_handlers_unblock_by_func(G_OBJECT(gtk_adjustment_gpu),
+ G_CALLBACK(adjustment_value_changed),
+ (gpointer) ctk_object);
+
+
+ /* Update the gui sensitivity */
+
+ sync_gui_sensitivity(ctk_object);
+
+} /* sync_gui_to_modify_clocks() */
+
+
+
+/*****
+ *
+ * Helper function - Sets the value of the clock frequencies scales
+ *
+ */
+static void set_clocks_value(CtkClocks *ctk_object, int clocks,
+ int which_clocks)
+{
+ GtkRange *gtk_range;
+
+
+ /* Update the clock values */
+
+ if ( ctk_object->gpu_clk_scale ) {
+ gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->gpu_clk_scale)->gtk_scale);
+ gtk_range_set_value(gtk_range, GET_GPU_CLOCK(clocks));
+ }
+
+ if ( ctk_object->mem_clk_scale ) {
+ gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->mem_clk_scale)->gtk_scale);
+ gtk_range_set_value(gtk_range, GET_MEM_CLOCK(clocks));
+ }
+
+} /* set_clocks_value() */
+
+
+
+/*****
+ *
+ * Signal handler - Handles slider adjustments by the user.
+ *
+ */
+static void adjustment_value_changed(GtkAdjustment *adjustment,
+ gpointer user_data)
+{
+ CtkClocks *ctk_object = CTK_CLOCKS(user_data);
+
+
+ /* Enable the apply button */
+
+ gtk_widget_set_sensitive(ctk_object->apply_button, True);
+
+
+ /* Enable the reset button */
+
+ gtk_widget_set_sensitive(ctk_object->reset_button, True);
+
+
+ /* Set the clocks moved flag */
+
+ ctk_object->clocks_moved = True;
+
+} /* adjustment_value_changed() */
+
+
+
+/*****
+ *
+ * Signal handler - User selected a clock set from the clock menu.
+ *
+ */
+static void clock_menu_changed(GtkOptionMenu *option_menu, gpointer user_data)
+{
+ CtkClocks *ctk_object = CTK_CLOCKS(user_data);
+ gint history;
+
+
+ /* Sync to allow user to modify the clocks */
+
+ history = gtk_option_menu_get_history(option_menu);
+ switch (history) {
+ default:
+ /* Fall throught */
+ case 0: /* 2D */
+ sync_gui_to_modify_clocks(ctk_object, CLOCKS_2D);
+ break;
+ case 1: /* 3D */
+ sync_gui_to_modify_clocks(ctk_object, CLOCKS_3D);
+ break;
+ }
+
+} /* clock_menu_changed() */
+
+
+
+/*****
+ *
+ * Signal handler - User clicked the "apply" button.
+ *
+ */
+static void apply_clocks_clicked(GtkWidget *widget, gpointer user_data)
+{
+ CtkClocks *ctk_object = CTK_CLOCKS(user_data);
+ GtkRange *gtk_range;
+
+ ReturnStatus ret;
+ int gpu_clk;
+ int mem_clk;
+ int clocks;
+
+
+ /* Update server clocks with values from scales */
+
+ if ( !ctk_object->gpu_clk_scale || !ctk_object->mem_clk_scale )
+ return;
+
+
+ /* Get new clock values from sliders */
+
+ gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->gpu_clk_scale)->gtk_scale);
+ gpu_clk = gtk_range_get_value(gtk_range);
+ gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->mem_clk_scale)->gtk_scale);
+ mem_clk = gtk_range_get_value(gtk_range);
+ clocks = MAKE_CLOCKS(gpu_clk, mem_clk);
+
+
+ /* Set clocks on server */
+
+ ret = NvCtrlSetAttribute(ctk_object->handle,
+ (ctk_object->clocks_being_modified==CLOCKS_2D) ?
+ NV_CTRL_GPU_2D_CLOCK_FREQS :
+ NV_CTRL_GPU_3D_CLOCK_FREQS,
+ clocks);
+ if ( ret != NvCtrlSuccess ) {
+ ctk_config_statusbar_message(ctk_object->ctk_config,
+ "Failed to set clock frequencies!");
+ return;
+ }
+
+
+ /* Clear the clocks moved flag */
+
+ ctk_object->clocks_moved = False;
+
+
+ /* Sync up with the server */
+
+ sync_gui_to_modify_clocks(ctk_object, ctk_object->clocks_being_modified);
+
+ gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->gpu_clk_scale)->gtk_scale);
+ gpu_clk = gtk_range_get_value(gtk_range);
+ gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->mem_clk_scale)->gtk_scale);
+ mem_clk = gtk_range_get_value(gtk_range);
+
+ ctk_config_statusbar_message(ctk_object->ctk_config,
+ "Set %s clocks to (GPU) %i MHz, "
+ "(Memory) %i MHz",
+ (ctk_object->clocks_being_modified==CLOCKS_2D)?
+ "2D":"3D",
+ gpu_clk,
+ mem_clk);
+
+} /* apply_clocks_clicked() */
+
+
+
+/*****
+ *
+ * Signal handler - User clicked the 'reset hardware defaults' button.
+ *
+ */
+static void reset_clocks_clicked(GtkWidget *widget, gpointer user_data)
+{
+ CtkClocks *ctk_object = CTK_CLOCKS(user_data);
+ int clocks;
+ ReturnStatus ret;
+
+
+ /* Get the default clock frequencies */
+
+ ret = NvCtrlGetAttribute(ctk_object->handle,
+ (ctk_object->clocks_being_modified==CLOCKS_2D) ?
+ NV_CTRL_GPU_DEFAULT_2D_CLOCK_FREQS :
+ NV_CTRL_GPU_DEFAULT_3D_CLOCK_FREQS,
+ &clocks);
+ if ( ret != NvCtrlSuccess )
+ goto fail;
+
+ /* Set clock frequencies to use default values */
+
+ ret = NvCtrlSetAttribute(ctk_object->handle,
+ (ctk_object->clocks_being_modified==CLOCKS_2D) ?
+ NV_CTRL_GPU_2D_CLOCK_FREQS :
+ NV_CTRL_GPU_3D_CLOCK_FREQS,
+ clocks);
+ if ( ret != NvCtrlSuccess )
+ goto fail;
+
+ /* Set slider positions */
+
+ set_clocks_value(ctk_object, clocks, ctk_object->clocks_being_modified);
+
+ ctk_config_statusbar_message(ctk_object->ctk_config,
+ "Reset %s clock frequency "
+ "hardware defaults.",
+ (ctk_object->clocks_being_modified==CLOCKS_2D)?
+ "2D":"3D");
+
+ /* Disable the apply button */
+
+ gtk_widget_set_sensitive(ctk_object->apply_button, False);
+
+ /* Disable the reset button */
+
+ gtk_widget_set_sensitive(ctk_object->reset_button, False);
+
+ return;
+
+
+ fail:
+ ctk_config_statusbar_message(ctk_object->ctk_config,
+ "Failed to reset clock frequencies!");
+ return;
+
+} /* reset_clocks_clicked() */
+
+
+
+/*****
+ *
+ * Signal handler - User clicked the 'auto detect/cancel' button.
+ *
+ */
+static void detect_clocks_clicked(GtkWidget *widget, gpointer user_data)
+{
+ CtkClocks *ctk_object = CTK_CLOCKS(user_data);
+ ReturnStatus ret;
+ gint result;
+
+
+ if ( ctk_object->probing_optimal ) {
+
+ /* Stop the test for optimal clock freqs */
+ ret = NvCtrlSetAttribute(ctk_object->handle,
+ NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION,
+ NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_CANCEL);
+ } else {
+
+ /* User must hit the OK button to start the testing */
+
+ gtk_widget_show_all(ctk_object->detect_dialog);
+ result = gtk_dialog_run (GTK_DIALOG (ctk_object->detect_dialog));
+ gtk_widget_hide(ctk_object->detect_dialog);
+
+ switch (result)
+ {
+ case GTK_RESPONSE_ACCEPT:
+
+ /* Start the test for optimal clock freqs */
+ ret = NvCtrlSetAttribute(ctk_object->handle,
+ NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION,
+ NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_START);
+ break;
+
+ case GTK_RESPONSE_REJECT:
+ default:
+ /* Do nothing. */
+ return;
+ }
+ }
+
+ return;
+
+} /* detect_clocks_clicked() */
+
+
+
+/*****
+ *
+ * Signal handler - Handles incoming NV-CONTROL messages caused by clocks
+ * being changed.
+ *
+ */
+static void clocks_received(GtkObject *object, gpointer arg1,
+ gpointer user_data)
+{
+ CtkEventStruct *event_struct = (CtkEventStruct *) arg1;
+ CtkClocks *ctk_object = CTK_CLOCKS(user_data);
+ int clocks = event_struct->value;
+
+ /* Some hardware requires that the memory clocks be the same for
+ * both the 2D and 3D clock frequency setting. Therefore, we
+ * always need to check what the current clocks we're modifying
+ * have been set to on clock events.
+ */
+
+ switch (event_struct->attribute) {
+ case NV_CTRL_GPU_2D_CLOCK_FREQS:
+ sync_gui_to_modify_clocks(ctk_object, CLOCKS_2D);
+
+ ctk_config_statusbar_message(ctk_object->ctk_config,
+ "Set 2D clocks to (GPU) %i MHz, "
+ "(Memory) %i MHz",
+ GET_GPU_CLOCK(clocks),
+ GET_MEM_CLOCK(clocks));
+ break;
+ case NV_CTRL_GPU_3D_CLOCK_FREQS:
+ sync_gui_to_modify_clocks(ctk_object, CLOCKS_3D);
+
+ ctk_config_statusbar_message(ctk_object->ctk_config,
+ "Set 3D clocks to (GPU) %i MHz, "
+ "(Memory) %i MHz",
+ GET_GPU_CLOCK(clocks),
+ GET_MEM_CLOCK(clocks));
+ break;
+ case NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS:
+ ctk_object->probing_optimal = False;
+
+ ctk_config_statusbar_message(ctk_object->ctk_config,
+ "Found optimal 3D clocks: (GPU) %i MHz, "
+ "(Memory) %i MHz",
+ GET_GPU_CLOCK(clocks),
+ GET_MEM_CLOCK(clocks));
+
+ /* Only update gui if user is on 3D clocks */
+
+ if ( ctk_object->clocks_being_modified == CLOCKS_3D ) {
+
+ /* Update clock values */
+
+ set_clocks_value(ctk_object, clocks, CLOCKS_3D);
+
+ /* Allow user to apply the settings */
+
+ if ( ctk_object->apply_button )
+ gtk_widget_set_sensitive(ctk_object->apply_button, True);
+ }
+
+ break;
+ default:
+ break;
+ }
+
+} /* clocks_received() */
+
+
+
+/*****
+ *
+ * Callback Function - This function gets called when the GPU Overclocking
+ * page gets selected from the tree view.
+ *
+ */
+void ctk_clocks_select(GtkWidget *widget)
+{
+ CtkClocks *ctk_object = CTK_CLOCKS(widget);
+ ReturnStatus ret;
+ int value;
+
+ /* See if we're busy probing for optimal clocks so we can tell the user */
+
+ ret = NvCtrlGetAttribute(ctk_object->handle,
+ NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE,
+ &value);
+
+ if ( ret == NvCtrlSuccess &&
+ value == NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_BUSY ) {
+ ctk_config_statusbar_message(ctk_object->ctk_config,
+ __detect_wait_msg);
+ }
+}
+
+
+
+/*****
+ *
+ * Callback Function - This function gets called when the user scrolls
+ * the license agreement text. Once the user has scrolled to the end
+ * of the document, the YES button is activated.
+ *
+ */
+
+static void license_scrolled(GtkRange *range,
+ gpointer user_data)
+{
+ CtkClocks *ctk_object = CTK_CLOCKS(user_data);
+ GtkAdjustment *adj = gtk_range_get_adjustment(range);
+
+
+ /* Enable the dialog's "YES" button once user reaches end of license */
+ if ( adj->value + adj->page_size >= adj->upper ) {
+
+ gtk_dialog_set_response_sensitive(GTK_DIALOG(ctk_object->enable_dialog),
+ GTK_RESPONSE_ACCEPT,
+ TRUE);
+ }
+}
diff --git a/src/gtk+-2.x/ctkclocks.h b/src/gtk+-2.x/ctkclocks.h
new file mode 100644
index 0000000..da42299
--- /dev/null
+++ b/src/gtk+-2.x/ctkclocks.h
@@ -0,0 +1,105 @@
+/*
+ * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix
+ * and Linux systems.
+ *
+ * Copyright (C) 2004 NVIDIA Corporation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of Version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program 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 Version 2
+ * of the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the:
+ *
+ * Free Software Foundation, Inc.
+ * 59 Temple Place - Suite 330
+ * Boston, MA 02111-1307, USA
+ *
+ */
+
+#ifndef __CTK_CLOCKS_H__
+#define __CTK_CLOCKS_H__
+
+#include "ctkevent.h"
+#include "ctkconfig.h"
+
+G_BEGIN_DECLS
+
+#define CTK_TYPE_CLOCKS (ctk_clocks_get_type())
+
+#define CTK_CLOCKS(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_CLOCKS, CtkClocks))
+
+#define CTK_CLOCKS_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_CLOCKS, CtkClocksClass))
+
+#define CTK_IS_CLOCKS(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_CLOCKS))
+
+#define CTK_IS_CLOCKS_CLASS(class) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_CLOCKS))
+
+#define CTK_CLOCKS_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_CLOCKS, CtkClocksClass))
+
+#define CLOCKS_NONE 0
+#define CLOCKS_2D 2
+#define CLOCKS_3D 3
+
+
+typedef struct _CtkClocks CtkClocks;
+typedef struct _CtkClocksClass CtkClocksClass;
+
+struct _CtkClocks
+{
+ GtkVBox parent;
+
+ NvCtrlAttributeHandle *handle;
+ CtkConfig *ctk_config;
+
+ GtkWidget *enable_dialog;
+ GtkWidget *detect_dialog;
+
+ Bool license_accepted;
+ GtkWidget *license_window;
+
+
+ GtkWidget *enable_checkbox; /* Overclocking available */
+ GtkWidget *clock_menu; /* 2D/3D dropdown selector */
+
+ GtkWidget *gpu_clk_scale; /* Current 2D or 3D clock sliders */
+ GtkWidget *mem_clk_scale;
+
+ GtkWidget *apply_button; /* Apply target clock frequencies */
+ GtkWidget *detect_button; /* Auto detects best 3D clock frequencies */
+ GtkWidget *reset_button; /* Reset hardware default frequencies */
+
+ int clocks_being_modified; /* Wether we're editing the 2D or 3D clocks */
+ Bool clocks_modified; /* The clocks were modified by the user */
+ Bool clocks_moved; /* The clock sliders were moved by the user */
+
+ Bool overclocking_enabled; /* Overclocking is enabled */
+ Bool probing_optimal; /* Optimal clocks being probed */
+};
+
+struct _CtkClocksClass
+{
+ GtkVBoxClass parent_class;
+};
+
+GType ctk_clocks_get_type (void) G_GNUC_CONST;
+GtkWidget *ctk_clocks_new (NvCtrlAttributeHandle *, CtkConfig *,
+ CtkEvent *);
+
+GtkTextBuffer *ctk_clocks_create_help (GtkTextTagTable *, CtkClocks *);
+
+void ctk_clocks_select (GtkWidget *widget);
+
+G_END_DECLS
+
+#endif /* __CTK_CLOCKS_H__ */
diff --git a/src/gtk+-2.x/ctkconfig.c b/src/gtk+-2.x/ctkconfig.c
index 7f31732..669d1de 100644
--- a/src/gtk+-2.x/ctkconfig.c
+++ b/src/gtk+-2.x/ctkconfig.c
@@ -297,6 +297,7 @@ GtkWidget* ctk_config_new(ConfigProperties *conf)
ctk_config->timer_list_box = gtk_hbox_new(FALSE, 0);
ctk_config->timer_list = create_timer_list(ctk_config);
+ g_object_ref(ctk_config->timer_list);
ctk_config->timer_list_visible = FALSE;
gtk_box_pack_start(GTK_BOX(ctk_config), ctk_config->timer_list_box,
@@ -501,12 +502,13 @@ static void timer_enable_toggled(GtkCellRendererToggle*, gchar*, gpointer);
enum {
- ENABLE_COLUMN = 0,
+ USER_ENABLE_COLUMN = 0,
TIME_INTERVAL_COLUMN,
DESCRIPTION_COLUMN,
FUNCTION_COLUMN,
DATA_COLUMN,
HANDLE_COLUMN,
+ OWNER_ENABLE_COLUMN,
NUM_COLUMNS,
};
@@ -528,12 +530,13 @@ static GtkWidget *create_timer_list(CtkConfig *ctk_config)
ctk_config->list_store =
gtk_list_store_new(NUM_COLUMNS,
- G_TYPE_BOOLEAN, /* ENABLE_COLUMN */
+ G_TYPE_BOOLEAN, /* USER_ENABLE_COLUMN */
G_TYPE_UINT, /* TIME_INTERVAL_COLUMN */
G_TYPE_STRING, /* DESCRIPTION_COLUMN */
G_TYPE_POINTER, /* FUNCTION_COLUMN */
G_TYPE_POINTER, /* DATA_COLUMN */
- G_TYPE_UINT); /* HANDLE_COLUMN */
+ G_TYPE_UINT, /* HANDLE_COLUMN */
+ G_TYPE_BOOLEAN); /* OWNER_ENABLE_COLUMN */
model = GTK_TREE_MODEL(ctk_config->list_store);
@@ -547,7 +550,7 @@ static GtkWidget *create_timer_list(CtkConfig *ctk_config)
g_signal_connect(renderer, "toggled",
G_CALLBACK(timer_enable_toggled), ctk_config);
column = gtk_tree_view_column_new_with_attributes("Enabled", renderer,
- "active", ENABLE_COLUMN,
+ "active", USER_ENABLE_COLUMN,
NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
@@ -639,6 +642,8 @@ static void time_interval_edited(GtkCellRendererText *cell,
GSourceFunc function;
gpointer data;
guint interval;
+ gboolean user_enabled;
+ gboolean owner_enabled;
interval = strtol(new_text, (char **)NULL, 10);
@@ -656,17 +661,24 @@ static void time_interval_edited(GtkCellRendererText *cell,
TIME_INTERVAL_COLUMN, interval, -1);
gtk_tree_model_get(model, &iter,
+ USER_ENABLE_COLUMN, &user_enabled,
+ OWNER_ENABLE_COLUMN, &owner_enabled,
HANDLE_COLUMN, &handle,
FUNCTION_COLUMN, &function,
DATA_COLUMN, &data,
-1);
- g_source_remove(handle);
-
- handle = g_timeout_add(interval, function, data);
+ /* Restart the timer if it is already running */
- gtk_list_store_set(ctk_config->list_store, &iter,
- HANDLE_COLUMN, handle, -1);
+ if (user_enabled && owner_enabled) {
+
+ g_source_remove(handle);
+
+ handle = g_timeout_add(interval, function, data);
+
+ gtk_list_store_set(ctk_config->list_store, &iter,
+ HANDLE_COLUMN, handle, -1);
+ }
}
static void timer_enable_toggled(GtkCellRendererToggle *cell,
@@ -681,32 +693,38 @@ static void timer_enable_toggled(GtkCellRendererToggle *cell,
GSourceFunc function;
gpointer data;
guint interval;
- gboolean enabled;
+ gboolean user_enabled;
+ gboolean owner_enabled;
path = gtk_tree_path_new_from_string(path_string);
gtk_tree_model_get_iter(model, &iter, path);
gtk_tree_path_free(path);
gtk_tree_model_get(model, &iter,
- ENABLE_COLUMN, &enabled,
+ USER_ENABLE_COLUMN, &user_enabled,
+ OWNER_ENABLE_COLUMN, &owner_enabled,
HANDLE_COLUMN, &handle,
FUNCTION_COLUMN, &function,
DATA_COLUMN, &data,
TIME_INTERVAL_COLUMN, &interval,
-1);
- enabled ^= 1;
+ user_enabled ^= 1;
- if (enabled) {
- handle = g_timeout_add(interval, function, data);
- gtk_list_store_set(ctk_config->list_store, &iter,
- HANDLE_COLUMN, handle, -1);
- } else {
- g_source_remove(handle);
+ /* Start/stop the timer only when the owner widget has enabled it */
+
+ if (owner_enabled) {
+ if (user_enabled) {
+ handle = g_timeout_add(interval, function, data);
+ gtk_list_store_set(ctk_config->list_store, &iter,
+ HANDLE_COLUMN, handle, -1);
+ } else {
+ g_source_remove(handle);
+ }
}
gtk_list_store_set(ctk_config->list_store, &iter,
- ENABLE_COLUMN, enabled, -1);
+ USER_ENABLE_COLUMN, user_enabled, -1);
}
void ctk_config_add_timer(CtkConfig *ctk_config,
@@ -716,17 +734,16 @@ void ctk_config_add_timer(CtkConfig *ctk_config,
gpointer data)
{
GtkTreeIter iter;
- guint handle;
- handle = g_timeout_add(interval, function, data);
-
+ /* Timer defaults to user enabled/owner disabled */
+
gtk_list_store_append(ctk_config->list_store, &iter);
gtk_list_store_set(ctk_config->list_store, &iter,
- ENABLE_COLUMN, TRUE,
+ USER_ENABLE_COLUMN, TRUE,
+ OWNER_ENABLE_COLUMN, FALSE,
TIME_INTERVAL_COLUMN, interval,
DESCRIPTION_COLUMN, descr,
FUNCTION_COLUMN, function,
- HANDLE_COLUMN, handle,
DATA_COLUMN, data, -1);
/* make the timer list visible if it is not */
@@ -747,15 +764,26 @@ void ctk_config_remove_timer(CtkConfig *ctk_config, GSourceFunc function)
GSourceFunc func;
gboolean valid;
guint handle;
+ gboolean user_enabled;
+ gboolean owner_enabled;
+
model = GTK_TREE_MODEL(ctk_config->list_store);
valid = gtk_tree_model_get_iter_first(model, &iter);
while (valid) {
- gtk_tree_model_get(model, &iter, FUNCTION_COLUMN, &func,
+ gtk_tree_model_get(model, &iter,
+ FUNCTION_COLUMN, &func,
+ USER_ENABLE_COLUMN, &user_enabled,
+ OWNER_ENABLE_COLUMN, &owner_enabled,
HANDLE_COLUMN, &handle, -1);
if (func == function) {
- g_source_remove(handle);
+
+ /* Remove the timer if it was running */
+
+ if (user_enabled && owner_enabled) {
+ g_source_remove(handle);
+ }
gtk_list_store_remove(ctk_config->list_store, &iter);
break;
}
@@ -772,4 +800,83 @@ void ctk_config_remove_timer(CtkConfig *ctk_config, GSourceFunc function)
}
}
+void ctk_config_start_timer(CtkConfig *ctk_config, GSourceFunc function)
+{
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ GSourceFunc func;
+ gboolean valid;
+ guint handle;
+ guint interval;
+ gboolean user_enabled;
+ gboolean owner_enabled;
+ gpointer data;
+
+ model = GTK_TREE_MODEL(ctk_config->list_store);
+ valid = gtk_tree_model_get_iter_first(model, &iter);
+ while (valid) {
+ gtk_tree_model_get(model, &iter,
+ USER_ENABLE_COLUMN, &user_enabled,
+ OWNER_ENABLE_COLUMN, &owner_enabled,
+ HANDLE_COLUMN, &handle,
+ FUNCTION_COLUMN, &func,
+ DATA_COLUMN, &data,
+ TIME_INTERVAL_COLUMN, &interval,
+ -1);
+ if (func == function) {
+
+ /* Start the timer if is enabled by the user and
+ it is not already running. */
+
+ if (user_enabled && !owner_enabled) {
+ handle = g_timeout_add(interval, function, data);
+ gtk_list_store_set(ctk_config->list_store, &iter,
+ HANDLE_COLUMN, handle, -1);
+ }
+ gtk_list_store_set(ctk_config->list_store, &iter,
+ OWNER_ENABLE_COLUMN, TRUE, -1);
+ break;
+ }
+ valid = gtk_tree_model_iter_next(model, &iter);
+ }
+}
+
+void ctk_config_stop_timer(CtkConfig *ctk_config, GSourceFunc function)
+{
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ GSourceFunc func;
+ gboolean valid;
+ guint handle;
+ guint interval;
+ gboolean user_enabled;
+ gboolean owner_enabled;
+ gpointer data;
+
+ model = GTK_TREE_MODEL(ctk_config->list_store);
+
+ valid = gtk_tree_model_get_iter_first(model, &iter);
+ while (valid) {
+ gtk_tree_model_get(model, &iter,
+ USER_ENABLE_COLUMN, &user_enabled,
+ OWNER_ENABLE_COLUMN, &owner_enabled,
+ HANDLE_COLUMN, &handle,
+ FUNCTION_COLUMN, &func,
+ DATA_COLUMN, &data,
+ TIME_INTERVAL_COLUMN, &interval,
+ -1);
+ if (func == function) {
+
+ /* Remove the timer if was running. */
+
+ if (user_enabled && owner_enabled) {
+ g_source_remove(handle);
+ }
+ gtk_list_store_set(ctk_config->list_store, &iter,
+ OWNER_ENABLE_COLUMN, FALSE, -1);
+ break;
+ }
+ valid = gtk_tree_model_iter_next(model, &iter);
+ }
+}
diff --git a/src/gtk+-2.x/ctkconfig.h b/src/gtk+-2.x/ctkconfig.h
index d0e3688..8599701 100644
--- a/src/gtk+-2.x/ctkconfig.h
+++ b/src/gtk+-2.x/ctkconfig.h
@@ -101,6 +101,9 @@ GtkTextBuffer *ctk_config_create_help (GtkTextTagTable *);
void ctk_config_add_timer(CtkConfig *, guint, gchar *, GSourceFunc, gpointer);
void ctk_config_remove_timer(CtkConfig *, GSourceFunc);
+void ctk_config_start_timer(CtkConfig *, GSourceFunc);
+void ctk_config_stop_timer(CtkConfig *, GSourceFunc);
+
gboolean ctk_config_slider_text_entry_shown(CtkConfig *);
G_END_DECLS
diff --git a/src/gtk+-2.x/ctkcursorshadow.c b/src/gtk+-2.x/ctkcursorshadow.c
index 856c62a..3f13256 100644
--- a/src/gtk+-2.x/ctkcursorshadow.c
+++ b/src/gtk+-2.x/ctkcursorshadow.c
@@ -33,12 +33,11 @@
*
* TODO:
*
- * - Use color selection dialog
* - provide mechanism for configuring ARGB cursor themes, etc...
*/
-
+#include <stdio.h> /* sprintf */
#include <gtk/gtk.h>
#include "NvCtrlAttributes.h"
@@ -68,7 +67,7 @@ static const char *__alpha_help =
"shadow is.";
static const char *__color_selector_help =
-"The Cursor Shadow Color Selector checkbox toggles "
+"The Cursor Shadow Color Selector button toggles "
"the Cursor Shadow Color Selector window, which allows "
"you to select the color for the cursor shadow.";
@@ -146,6 +145,8 @@ static gboolean
color_selector_window_destroy(GtkWidget *widget, GdkEvent *event,
gpointer user_data);
+static void post_color_selector_changed(CtkCursorShadow *ctk_cursor_shadow,
+ gint red, gint green, gint blue);
static void color_selector_changed(GtkColorSelection *colorselection,
gpointer user_data);
@@ -207,10 +208,13 @@ GtkWidget* ctk_cursor_shadow_new(NvCtrlAttributeHandle *handle,
GtkWidget *vbox;
GtkWidget *check_button;
GtkWidget *label;
+ GdkColor color;
ReturnStatus ret;
gint enabled;
guint8 *image_buffer = NULL;
const nv_image_t *img;
+ gint red, green, blue;
+ char str[16];
/* check to see if we can support cursor shadow */
@@ -317,25 +321,81 @@ GtkWidget* ctk_cursor_shadow_new(NvCtrlAttributeHandle *handle,
(gpointer) ctk_cursor_shadow);
- /* "Color Shadow Selector" check box */
+ /* "Color Shadow Selector" button */
- ctk_cursor_shadow->color_selector_check_button =
- gtk_check_button_new_with_label("Cursor Shadow Color Selector");
+ ctk_cursor_shadow->color_selector_button =
+ gtk_toggle_button_new();
- gtk_box_pack_start(GTK_BOX(vbox),
- ctk_cursor_shadow->color_selector_check_button,
- FALSE, FALSE, 0);
+ /* Cursor Shadow Color Box */
+
+ frame = gtk_aspect_frame_new(NULL, 0, 0, 1, FALSE);
+
+ gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT);
+
+ gtk_container_set_border_width(GTK_CONTAINER(frame), 1);
+
+
+ ctk_cursor_shadow->cursor_shadow_bg = gtk_event_box_new();
+
+ gtk_widget_set_size_request(ctk_cursor_shadow->cursor_shadow_bg, 10, 10);
+
+ /* Grab current cursor shadow color */
+
+ NvCtrlGetAttribute(ctk_cursor_shadow->handle,
+ NV_CTRL_CURSOR_SHADOW_RED, &red);
+
+ NvCtrlGetAttribute(ctk_cursor_shadow->handle,
+ NV_CTRL_CURSOR_SHADOW_GREEN, &green);
+
+ NvCtrlGetAttribute(ctk_cursor_shadow->handle,
+ NV_CTRL_CURSOR_SHADOW_BLUE, &blue);
+
+ sprintf(str, "#%2.2X%2.2X%2.2X", red, green, blue);
+
+ gdk_color_parse (str, &color);
+
+ gtk_widget_modify_bg(ctk_cursor_shadow->cursor_shadow_bg,
+ GTK_STATE_NORMAL, &color);
+
+ gtk_widget_modify_bg(ctk_cursor_shadow->cursor_shadow_bg,
+ GTK_STATE_ACTIVE, &color);
+
+ gtk_widget_modify_bg(ctk_cursor_shadow->cursor_shadow_bg,
+ GTK_STATE_PRELIGHT, &color);
+
+ /* pack cursor color selector button */
+
+ gtk_container_add(GTK_CONTAINER(frame),
+ ctk_cursor_shadow->cursor_shadow_bg);
+ label = gtk_label_new("Cursor Shadow Color Selector");
+
+ hbox = gtk_hbox_new(FALSE, 0);
+
+ gtk_box_pack_start( GTK_BOX(hbox), frame, TRUE, TRUE, 2);
+
+ gtk_box_pack_end( GTK_BOX(hbox), label, FALSE, FALSE, 5);
+
+ gtk_container_add(GTK_CONTAINER(ctk_cursor_shadow->color_selector_button),
+ hbox);
+
+ hbox = gtk_hbox_new(FALSE, 5);
+ gtk_box_pack_start(GTK_BOX(hbox),
+ ctk_cursor_shadow->color_selector_button,
+ FALSE, FALSE, 0);
+
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
+
gtk_toggle_button_set_active
- (GTK_TOGGLE_BUTTON(ctk_cursor_shadow->color_selector_check_button),
+ (GTK_TOGGLE_BUTTON(ctk_cursor_shadow->color_selector_button),
FALSE);
- g_signal_connect(G_OBJECT(ctk_cursor_shadow->color_selector_check_button),
- "toggled", G_CALLBACK(color_toggled),
+ g_signal_connect(G_OBJECT(ctk_cursor_shadow->color_selector_button),
+ "clicked", G_CALLBACK(color_toggled),
(gpointer) ctk_cursor_shadow);
ctk_config_set_tooltip(ctk_config,
- ctk_cursor_shadow->color_selector_check_button,
+ ctk_cursor_shadow->color_selector_button,
__color_selector_help);
/* Color Selector */
@@ -596,6 +656,9 @@ static void reset_defaults(GtkButton *button, gpointer user_data)
gtk_color_selection_set_current_color
(GTK_COLOR_SELECTION(ctk_cursor_shadow->color_selector), &color);
+
+ post_color_selector_changed(ctk_cursor_shadow,
+ color.red, color.green, color.blue);
g_signal_handlers_unblock_matched
(G_OBJECT(ctk_cursor_shadow->color_selector),
@@ -717,6 +780,8 @@ static void set_cursor_shadow_sensitivity(CtkCursorShadow *ctk_cursor_shadow,
gtk_widget_set_sensitive(ctk_cursor_shadow->color_selector, enabled);
+ gtk_widget_set_sensitive(ctk_cursor_shadow->color_selector_button, enabled);
+
/*
* We separately track whether the reset button should be
* sensitive because, unlike the sliders (which should be
@@ -963,7 +1028,7 @@ color_selector_close_button_clicked(GtkButton *button, gpointer user_data)
CtkCursorShadow *ctk_cursor_shadow = CTK_CURSOR_SHADOW(user_data);
gtk_toggle_button_set_active
- (GTK_TOGGLE_BUTTON(ctk_cursor_shadow->color_selector_check_button),
+ (GTK_TOGGLE_BUTTON(ctk_cursor_shadow->color_selector_button),
FALSE);
} /* color_selector_close_button_clicked() */
@@ -977,7 +1042,7 @@ color_selector_window_destroy(GtkWidget *widget, GdkEvent *event,
CtkCursorShadow *ctk_cursor_shadow = CTK_CURSOR_SHADOW(user_data);
gtk_toggle_button_set_active
- (GTK_TOGGLE_BUTTON(ctk_cursor_shadow->color_selector_check_button),
+ (GTK_TOGGLE_BUTTON(ctk_cursor_shadow->color_selector_button),
FALSE);
return TRUE;
@@ -1033,6 +1098,23 @@ static int get_value_and_range(CtkCursorShadow *ctk_cursor_shadow,
static void post_color_selector_changed(CtkCursorShadow *ctk_cursor_shadow,
gint red, gint green, gint blue)
{
+ GdkColor color;
+ char str[16];
+ sprintf(str, "#%2.2X%2.2X%2.2X", red, green, blue);
+
+
+ /* Update the color square */
+
+ gdk_color_parse(str, &color);
+ gtk_widget_modify_bg(ctk_cursor_shadow->cursor_shadow_bg,
+ GTK_STATE_NORMAL, &color);
+
+ gtk_widget_modify_bg(ctk_cursor_shadow->cursor_shadow_bg,
+ GTK_STATE_ACTIVE, &color);
+
+ gtk_widget_modify_bg(ctk_cursor_shadow->cursor_shadow_bg,
+ GTK_STATE_PRELIGHT, &color);
+
/* make the reset button sensitive */
ctk_cursor_shadow->reset_button_sensitivity = TRUE;
diff --git a/src/gtk+-2.x/ctkcursorshadow.h b/src/gtk+-2.x/ctkcursorshadow.h
index 1519ece..83b6432 100644
--- a/src/gtk+-2.x/ctkcursorshadow.h
+++ b/src/gtk+-2.x/ctkcursorshadow.h
@@ -64,7 +64,8 @@ struct _CtkCursorShadow
CtkEvent *ctk_event;
GtkWidget *scales[3];
GtkWidget *reset_button;
- GtkWidget *color_selector_check_button;
+ GtkWidget *color_selector_button;
+ GtkWidget *cursor_shadow_bg;
GtkWidget *cursor_shadow_check_button;
GtkWidget *color_selector;
GtkWidget *color_selector_window;
diff --git a/src/gtk+-2.x/ctkdevice.c b/src/gtk+-2.x/ctkdevice.c
index ec0bb03..6ee5d3b 100644
--- a/src/gtk+-2.x/ctkdevice.c
+++ b/src/gtk+-2.x/ctkdevice.c
@@ -29,18 +29,13 @@
#include "big_banner_penguin.h"
#include "big_banner_bsd.h"
+#include "big_banner_sun.h"
#include "image.h"
#include "ctkdevice.h"
#include "ctkhelp.h"
-
-static void add_table_row(GtkWidget *table,
- const gint row,
- const gint value_alignment,
- const gchar *name,
- const gchar *value);
-
+#include "ctkutils.h"
#define N_GDK_PIXBUFS 45
@@ -202,7 +197,7 @@ GtkWidget* ctk_device_new(
} else if (os_val == NV_CTRL_OPERATING_SYSTEM_FREEBSD) {
img = &big_banner_bsd_image;
} else if (os_val == NV_CTRL_OPERATING_SYSTEM_SUNOS) {
- img = &big_banner_penguin_image; /* XXX To be replaced with Sun Logo */
+ img = &big_banner_sun_image;
} else {
img = &big_banner_penguin_image; /* Should never get here */
}
@@ -261,26 +256,6 @@ GtkWidget* ctk_device_new(
return GTK_WIDGET(object);
}
-
-static void add_table_row(GtkWidget *table,
- const gint row,
- const gint value_alignment,
- const gchar *name,
- const gchar *value)
-{
- GtkWidget *label;
-
- label = gtk_label_new(name);
- gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
- gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row + 1,
- GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
-
- label = gtk_label_new(value);
- gtk_misc_set_alignment(GTK_MISC(label), value_alignment, 0.5);
- gtk_table_attach(GTK_TABLE(table), label, 1, 2, row, row + 1,
- GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
-}
-
GtkTextBuffer *ctk_device_create_help(GtkTextTagTable *table,
const gchar *screen_name)
diff --git a/src/gtk+-2.x/ctkdisplaydevice-dfp.c b/src/gtk+-2.x/ctkdisplaydevice-dfp.c
index 06d2f20..8909ccc 100644
--- a/src/gtk+-2.x/ctkdisplaydevice-dfp.c
+++ b/src/gtk+-2.x/ctkdisplaydevice-dfp.c
@@ -32,6 +32,7 @@
#include "ctkimagesliders.h"
#include "ctkconfig.h"
#include "ctkhelp.h"
+#include "ctkutils.h"
static GtkWidget *make_scaling_radio_button(CtkDisplayDeviceDfp
@@ -71,6 +72,7 @@ static void dfp_update_received(GtkObject *object, gpointer arg1,
#define __SCALING (1<<0)
#define __DITHERING (1<<1)
+#define __INFO (1<<2)
static const char *__scaling_help =
@@ -85,6 +87,10 @@ static const char *__dithering_help =
"properly display on a flatpanel; this option allows "
"you to control the dithering behavior.";
+static const char *__info_help =
+"This section describes basic informations about the "
+"DVI connection to the digital flat panel.";
+
GType ctk_display_device_dfp_get_type(void)
{
@@ -137,6 +143,8 @@ GtkWidget* ctk_display_device_dfp_new(NvCtrlAttributeHandle *handle,
GtkWidget *radio3;
GtkWidget *alignment;
+ GtkWidget *table;
+
ReturnStatus ret;
guint8 *image_buffer = NULL;
@@ -202,11 +210,64 @@ GtkWidget* ctk_display_device_dfp_new(NvCtrlAttributeHandle *handle,
"The Reset Hardware Defaults button restores "
"the DFP settings to their default values.");
- /* create the hbox to store scaling and dithering */
+ /* create the hbox to store dfp info, scaling and dithering */
hbox = gtk_hbox_new(FALSE, FRAME_PADDING);
gtk_box_pack_start(GTK_BOX(object), hbox, TRUE, TRUE, FRAME_PADDING);
+ /* DFP info */
+ ret = NvCtrlGetDisplayAttribute(handle, display_device_mask,
+ NV_CTRL_FLATPANEL_CHIP_LOCATION, &val);
+ if (ret == NvCtrlSuccess) {
+ char *chip_location, *link, *signal;
+ gint tmp;
+
+ /* NV_CTRL_FLATPANEL_CHIP_LOCATION */
+ ret = NvCtrlGetDisplayAttribute(handle, display_device_mask,
+ NV_CTRL_FLATPANEL_CHIP_LOCATION, &tmp);
+ chip_location = NULL;
+ if (ret == NvCtrlSuccess) {
+ if (tmp == NV_CTRL_FLATPANEL_CHIP_LOCATION_INTERNAL) chip_location = "Internal";
+ if (tmp == NV_CTRL_FLATPANEL_CHIP_LOCATION_EXTERNAL) chip_location = "External";
+ }
+
+ ret = NvCtrlGetDisplayAttribute(handle, display_device_mask,
+ NV_CTRL_FLATPANEL_LINK, &tmp);
+ link = NULL;
+ if (ret == NvCtrlSuccess) {
+ if (tmp == NV_CTRL_FLATPANEL_LINK_SINGLE) link = "Single";
+ if (tmp == NV_CTRL_FLATPANEL_LINK_DUAL) link = "Dual";
+ }
+
+ ret = NvCtrlGetDisplayAttribute(handle, display_device_mask,
+ NV_CTRL_FLATPANEL_SIGNAL, &tmp);
+ signal = NULL;
+ if (ret == NvCtrlSuccess) {
+ if (tmp == NV_CTRL_FLATPANEL_SIGNAL_LVDS) signal = "LVDS";
+ if (tmp == NV_CTRL_FLATPANEL_SIGNAL_TMDS) signal = "TMDS";
+ }
+
+ frame = gtk_frame_new("Flat Panel Information");
+ gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0);
+
+ table = gtk_table_new(3, 2, FALSE);
+ gtk_container_add(GTK_CONTAINER(frame), table);
+
+ gtk_table_set_row_spacings(GTK_TABLE(table), 3);
+ gtk_table_set_col_spacings(GTK_TABLE(table), 15);
+
+ gtk_container_set_border_width(GTK_CONTAINER(table), 5);
+
+
+ add_table_row(table, 0, 0, "Chip location:", chip_location);
+ add_table_row(table, 1, 0, "DVI connection link:", link);
+ add_table_row(table, 2, 0, "Signal:", signal);
+
+ ctk_display_device_dfp->active_attributes |= __INFO;
+ }
+ else
+ ctk_display_device_dfp->active_attributes &= ~__INFO;
+
/* FlatPanel Scaling */
ret = NvCtrlGetDisplayAttribute(handle, display_device_mask,
@@ -750,6 +811,28 @@ GtkTextBuffer *ctk_display_device_dfp_create_help(GtkTextTagTable *table,
ctk_help_title(b, &i, "%s Help", ctk_display_device_dfp->name);
+ if (ctk_display_device_dfp->active_attributes & __INFO) {
+ ctk_help_heading(b, &i, "FlatPanel Information");
+ ctk_help_para(b, &i, __info_help);
+
+ ctk_help_term(b, &i, "Chip Location");
+ ctk_help_para(b, &i, "Report whether the flatpanel is driven by "
+ "the on-chip controller (internal), or a "
+ " separate controller chip elsewhere on the "
+ "graphics board (external)");
+
+ ctk_help_term(b, &i, "Link");
+ ctk_help_para(b, &i, "Report whether the specified display device "
+ "is driven by a single link or dual link DVI "
+ "connection.");
+
+ ctk_help_term(b, &i, "Signal");
+ ctk_help_para(b, &i, "Report whether the flatpanel is driven by "
+ "an LVDS or TMDS signal");
+
+ ret = TRUE;
+ }
+
if (ctk_display_device_dfp->active_attributes & __SCALING) {
ctk_help_heading(b, &i, "FlatPanel Scaling");
ctk_help_para(b, &i, __scaling_help);
diff --git a/src/gtk+-2.x/ctkevent.c b/src/gtk+-2.x/ctkevent.c
index 5eb49e5..e77d7d1 100644
--- a/src/gtk+-2.x/ctkevent.c
+++ b/src/gtk+-2.x/ctkevent.c
@@ -187,7 +187,13 @@ static void ctk_event_class_init(CtkEventClass *ctk_event_class)
MAKE_SIGNAL(NV_CTRL_GVO_VIDEO_FORMAT_REFRESH_RATE);
MAKE_SIGNAL(NV_CTRL_GVO_X_SCREEN_PAN_X);
MAKE_SIGNAL(NV_CTRL_GVO_X_SCREEN_PAN_Y);
-
+ MAKE_SIGNAL(NV_CTRL_GPU_OVERCLOCKING_STATE);
+ MAKE_SIGNAL(NV_CTRL_GPU_2D_CLOCK_FREQS);
+ MAKE_SIGNAL(NV_CTRL_GPU_3D_CLOCK_FREQS);
+ MAKE_SIGNAL(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS);
+ MAKE_SIGNAL(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE);
+ MAKE_SIGNAL(NV_CTRL_USE_HOUSE_SYNC);
+
#undef MAKE_SIGNAL
/*
@@ -197,7 +203,7 @@ static void ctk_event_class_init(CtkEventClass *ctk_event_class)
* knows about.
*/
-#if NV_CTRL_LAST_ATTRIBUTE != NV_CTRL_GVO_X_SCREEN_PAN_Y
+#if NV_CTRL_LAST_ATTRIBUTE != NV_CTRL_USE_HOUSE_SYNC
#warning "There are attributes that do not emit signals!"
#endif
@@ -279,11 +285,12 @@ static gboolean ctk_event_check(GSource *source)
{
CtkEventSource *event_source = (CtkEventSource *) source;
- if (event_source->event_poll_fd.revents & G_IO_IN) {
- return XPending(event_source->dpy);
- }
-
- return FALSE;
+ /*
+ * XXX We could check for (event_source->event_poll_fd.revents & G_IO_IN),
+ * but doing so caused some events to be missed as they came in with only
+ * the G_IO_OUT flag set which is odd.
+ */
+ return XPending(event_source->dpy);
}
static gboolean ctk_event_dispatch(GSource *source,
diff --git a/src/gtk+-2.x/ctkframelock.c b/src/gtk+-2.x/ctkframelock.c
index 1b336fb..39b5c25 100644
--- a/src/gtk+-2.x/ctkframelock.c
+++ b/src/gtk+-2.x/ctkframelock.c
@@ -84,7 +84,7 @@ static void add_member_to_list_store(CtkFramelock *ctk_framelock,
static void apply_parsed_attribute_list(CtkFramelock *ctk_framelock,
ParsedAttribute *p);
-static GtkWidget *add_house_sync_controls(CtkFramelock *ctk_framelock);
+static GtkWidget *add_house_sync_controls(NvCtrlAttributeHandle *handle, CtkFramelock *ctk_framelock);
static void update_house_sync_controls(CtkFramelock *ctk_framelock);
static void add_columns_to_treeview(CtkFramelock *ctk_framelock);
@@ -323,7 +323,7 @@ GtkWidget* ctk_framelock_new(NvCtrlAttributeHandle *handle,
/* Sync Interval and House Sync Format controls */
- hbox = add_house_sync_controls(ctk_framelock);
+ hbox = add_house_sync_controls(handle, ctk_framelock);
gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, TRUE, 0);
hseparator = gtk_hseparator_new();
@@ -453,6 +453,8 @@ static gchar *houseFormatStrings[] = {
"Composite, Tri-Level", /* VIDEO_MODE_COMPOSITE_TRI_LEVEL */
};
+static void use_house_sync_released(GtkToggleButton *togglebutton,
+ gpointer user_data);
static void detect_house_sync_format_toggled(GtkToggleButton *togglebutton,
gpointer user_data);
@@ -640,26 +642,136 @@ static void detect_house_sync_format_toggled(GtkToggleButton *togglebutton,
} /* detect_house_sync_format_toggled() */
+/*
+ * When the use_house_sync button is released, check to see if we
+ * have a house signal (if applicable) then try to set the state of
+ * the hardware (i.e. P294). We do this as a release instead of a toggler
+ * because if
+ * the hardware change is not successful, we must toggle the button
+ * back, which would end up triggering toggle function from the toggle function.
+ */
+
+static void use_house_sync_released(GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+
+ NvCtrlAttributeHandle *handle = NULL;
+ CtkFramelock *ctk_framelock = CTK_FRAMELOCK(user_data);
+ gboolean enabled;
+ gint val;
+
+
+ enabled = gtk_toggle_button_get_active(togglebutton);
+ if (find_master(ctk_framelock, NULL, &handle))
+ {
+ if (enabled)
+ {
+ if (( NvCtrlGetAttribute(
+ handle, NV_CTRL_FRAMELOCK_HOUSE_STATUS, &val)) !=
+ NvCtrlSuccess)
+ {
+ ctk_config_statusbar_message(ctk_framelock->ctk_config,
+ "Framelock could not determine house sync status.");
+ gtk_toggle_button_set_active(togglebutton, !enabled);
+ return;
+ }
+ else if (!val)
+ {
+ ctk_config_statusbar_message(ctk_framelock->ctk_config,
+ "Framelock could not find house sync signal.");
+ gtk_toggle_button_set_active(togglebutton, !enabled);
+ return;
+ }
+ }
+ if (( NvCtrlSetAttribute(handle, NV_CTRL_USE_HOUSE_SYNC, enabled)) !=
+ NvCtrlSuccess)
+ {
+ ctk_config_statusbar_message(ctk_framelock->ctk_config,
+ "Framelock could not %sable house sync.",
+ enabled ? "en" : "dis");
+ gtk_toggle_button_set_active(togglebutton, !enabled);
+ return;
+ }
+ }
+ else
+ {
+ ctk_config_statusbar_message(ctk_framelock->ctk_config,
+ "Framelock could not establish master.");
+ gtk_toggle_button_set_active(togglebutton, !enabled);
+ return;
+ }
+
+ gtk_widget_set_sensitive(ctk_framelock->sync_interval_frame, enabled);
+ gtk_widget_set_sensitive(ctk_framelock->house_format_frame, enabled);
+
+ ctk_config_statusbar_message(ctk_framelock->ctk_config,
+ "Framelock %s house sync.",
+ enabled ? "using" : "not using");
+
+} /* use_house_sync_released() */
/*
* add_house_sync_controls() -
*/
-static GtkWidget *add_house_sync_controls(CtkFramelock *ctk_framelock)
+static GtkWidget *add_house_sync_controls(NvCtrlAttributeHandle *handle, CtkFramelock *ctk_framelock)
{
+ GtkWidget *hboxroot;
GtkWidget *hbox;
+ GtkWidget *vbox;
GtkWidget *hbox2;
GtkWidget *label;
+ GtkWidget *check_button;
GList *glist;
+ gint val = 0;
+ gboolean use_house_sync_option = FALSE;
+ ReturnStatus ret;
+
+ hboxroot = gtk_vbox_new(FALSE, 5);
+
+ ctk_framelock->house_sync_frame = gtk_frame_new(NULL);
+ gtk_box_pack_start(GTK_BOX(hboxroot), ctk_framelock->house_sync_frame,
+ FALSE, TRUE, 0);
+
+ vbox = gtk_vbox_new(FALSE, 5);
+ gtk_container_add(GTK_CONTAINER(ctk_framelock->house_sync_frame),vbox);
+
+ ctk_framelock->use_house_sync_button = NULL;
+
+ ret = NvCtrlGetAttribute(handle, NV_CTRL_USE_HOUSE_SYNC, &val);
+ if (ret == NvCtrlSuccess) {
+ use_house_sync_option = TRUE;
+
+ hbox = gtk_hbox_new(FALSE, 5);
+
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 5);
+
+ label = gtk_label_new("Use House Sync");
+
+ check_button = gtk_check_button_new();
+ gtk_container_add(GTK_CONTAINER(check_button), label);
+ ctk_framelock->use_house_sync_button = check_button;
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), val);
+
+ gtk_box_pack_start(GTK_BOX(hbox), check_button, FALSE, FALSE, 5);
+
+ // see callback definition for why we use "released"
+ g_signal_connect(G_OBJECT(check_button), "released",
+ G_CALLBACK(use_house_sync_released),
+ (gpointer) ctk_framelock);
+ }
+
hbox = gtk_hbox_new(FALSE, 5);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 5);
/* sync interval */
ctk_framelock->sync_interval_frame = gtk_frame_new(NULL);
gtk_box_pack_start(GTK_BOX(hbox), ctk_framelock->sync_interval_frame,
- FALSE, TRUE, 0);
+ FALSE, TRUE, 5);
hbox2 = gtk_hbox_new(FALSE, 5);
gtk_container_add(GTK_CONTAINER(ctk_framelock->sync_interval_frame),hbox2);
@@ -734,7 +846,14 @@ static GtkWidget *add_house_sync_controls(CtkFramelock *ctk_framelock)
G_CALLBACK(detect_house_sync_format_toggled),
ctk_framelock);
- return hbox;
+ /* disable these controls until use_house_sync is selected */
+ if (use_house_sync_option)
+ {
+ gtk_widget_set_sensitive(ctk_framelock->sync_interval_frame, FALSE);
+ gtk_widget_set_sensitive(ctk_framelock->house_format_frame, FALSE);
+ }
+
+ return hboxroot;
} /* add_house_sync_controls() */
@@ -748,7 +867,7 @@ static GtkWidget *add_house_sync_controls(CtkFramelock *ctk_framelock)
static void update_house_sync_controls(CtkFramelock *ctk_framelock)
{
GtkTreeModel *model = GTK_TREE_MODEL(ctk_framelock->list_store);
- gboolean house = FALSE, sensitive;
+ gboolean house = FALSE, sensitive, use_house;
gint sync_interval, house_format;
gchar str[32];
GtkTreeIter iter;
@@ -772,8 +891,27 @@ static void update_house_sync_controls(CtkFramelock *ctk_framelock)
(GTK_ENTRY(GTK_COMBO(ctk_framelock->house_format_combo)->entry),
houseFormatStrings[house_format]);
}
-
- if (ctk_framelock->framelock_enabled) {
+
+ use_house = TRUE;
+
+ if (ctk_framelock->use_house_sync_button)
+ {
+ use_house =
+ gtk_toggle_button_get_active(
+ GTK_TOGGLE_BUTTON(ctk_framelock->use_house_sync_button));
+ }
+
+ if (ctk_framelock->framelock_enabled)
+ {
+ sensitive = FALSE;
+ } else {
+ sensitive = TRUE;
+ }
+
+ // This includes the checkbutton for selecting house sync
+ gtk_widget_set_sensitive(ctk_framelock->house_sync_frame, sensitive);
+
+ if (ctk_framelock->framelock_enabled || !use_house) {
sensitive = FALSE;
} else {
sensitive = TRUE;
@@ -1062,7 +1200,7 @@ static void led_renderer_func(GtkTreeViewColumn *tree_column,
static GdkPixbuf *led_green_pixbuf = NULL;
static GdkPixbuf *led_red_pixbuf = NULL;
static GdkPixbuf *led_grey_pixbuf = NULL;
- gboolean value, master, framelock_enabled;
+ gboolean value, master, framelock_enabled, use_house;
gpointer obj;
gint column, house = 0;
@@ -1079,9 +1217,15 @@ static void led_renderer_func(GtkTreeViewColumn *tree_column,
COLUMN_MASTER, &master, -1);
framelock_enabled = FALSE;
+ use_house = TRUE;
if (obj) {
CtkFramelock *ctk_framelock = CTK_FRAMELOCK(obj);
if (ctk_framelock->framelock_enabled) framelock_enabled = TRUE;
+ if (ctk_framelock->use_house_sync_button) {
+ use_house =
+ gtk_toggle_button_get_active(
+ GTK_TOGGLE_BUTTON(ctk_framelock->use_house_sync_button));
+ }
}
gtk_tree_model_get(model, iter, COLUMN_HOUSE, &house, -1);
@@ -1091,10 +1235,12 @@ static void led_renderer_func(GtkTreeViewColumn *tree_column,
* (otherwise, it will be red when framelock is enabled, which is
* confusing).
*
- * If we are receiving house sync, then light the LED green.
+ * If we are receiving house sync, then light the LED green, unless
+ * the user has opted to not use it (e.g. p294)
*/
- if ((column == COLUMN_TIMING) && master && framelock_enabled && !house) {
+ if ((column == COLUMN_TIMING) && master && framelock_enabled &&
+ (!house || !use_house)) {
if (!led_grey_pixbuf)
led_grey_pixbuf = gdk_pixbuf_new_from_xpm_data(led_grey_xpm);
g_object_set(GTK_CELL_RENDERER(cell), "pixbuf", led_grey_pixbuf, NULL);
@@ -1717,7 +1863,13 @@ static void remove_x_screen(GtkWidget *button, gint response,
model = GTK_TREE_MODEL(ctk_framelock->list_store);
valid = gtk_tree_model_get_iter_first(model, &iter);
if (!valid) {
+ // Nothing to house sync to
+ if (ctk_framelock->use_house_sync_button) {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
+ ctk_framelock->use_house_sync_button), FALSE);
+ }
gtk_widget_set_sensitive(ctk_framelock->sync_state_button, FALSE);
+ update_house_sync_controls (ctk_framelock);
}
}
@@ -2139,11 +2291,6 @@ static void toggle_sync_state_button(GtkWidget *button,
gtk_widget_set_sensitive(ctk_framelock->remove_x_screen_button, FALSE);
gtk_widget_set_sensitive(ctk_framelock->test_link_button, TRUE);
- /* disable the house sync controls */
-
- gtk_widget_set_sensitive(ctk_framelock->sync_interval_frame, FALSE);
- gtk_widget_set_sensitive(ctk_framelock->house_format_frame, FALSE);
-
} else {
if (ctk_framelock->framelock_enabled) {
gtk_container_remove
@@ -2162,15 +2309,12 @@ static void toggle_sync_state_button(GtkWidget *button,
selection = gtk_tree_view_get_selection(ctk_framelock->treeview);
tree_selection_changed(selection, GTK_OBJECT(ctk_framelock));
-
- /* enable the house sync controls */
-
- gtk_widget_set_sensitive(ctk_framelock->sync_interval_frame, TRUE);
- gtk_widget_set_sensitive(ctk_framelock->house_format_frame, TRUE);
}
ctk_framelock->framelock_enabled = enabled;
+ update_house_sync_controls (ctk_framelock);
+
ctk_config_statusbar_message(ctk_framelock->ctk_config,
"FrameLock %s.",
enabled ? "enabled" : "disabled");
@@ -2386,6 +2530,8 @@ static gboolean check_for_ethernet(gpointer user_data)
gchar *display_name;
gboolean valid;
gint val;
+
+ static gboolean first_error = TRUE;
ctk_framelock = CTK_FRAMELOCK(user_data);
model = GTK_TREE_MODEL(ctk_framelock->list_store);
@@ -2399,23 +2545,27 @@ static gboolean check_for_ethernet(gpointer user_data)
NvCtrlGetAttribute(handle, NV_CTRL_FRAMELOCK_ETHERNET_DETECTED, &val);
if (val != NV_CTRL_FRAMELOCK_ETHERNET_DETECTED_NONE) {
- error_msg(ctk_framelock, "<span weight=\"bold\" size=\"larger\">"
- "FrameLock RJ45 Error</span>\n\n"
- "Either an Ethernet LAN cable is connected to the "
- "framelock board on X Screen '%s' or the linked PC is "
- "not turned on. "
- "Either disconnect the LAN cable or turn on the linked "
- "PC for proper operation.",
- display_name);
-
- ctk_config_remove_timer(ctk_framelock->ctk_config,
- (GSourceFunc) check_for_ethernet);
- return FALSE;
+
+ if (first_error) {
+ error_msg(ctk_framelock, "<span weight=\"bold\" "
+ "size=\"larger\">FrameLock RJ45 Error</span>\n\n"
+ "Either an Ethernet LAN cable is connected to the "
+ "framelock board on X Screen '%s' or the linked "
+ "PC is not turned on. Either disconnect the LAN "
+ "cable or turn on the linked PC for proper "
+ "operation.",
+ display_name);
+ }
+ first_error = FALSE;
+
+ return TRUE;
}
valid = gtk_tree_model_iter_next(model, &iter);
}
+ first_error = TRUE;
+
return TRUE;
}
@@ -2735,3 +2885,31 @@ GtkTextBuffer *ctk_framelock_create_help(GtkTextTagTable *table)
return b;
}
+
+
+void ctk_framelock_select(GtkWidget *w)
+{
+ CtkFramelock *ctk_framelock = CTK_FRAMELOCK(w);
+
+ /* Start the framelock timers */
+
+ ctk_config_start_timer(ctk_framelock->ctk_config,
+ (GSourceFunc) update_status);
+
+ ctk_config_start_timer(ctk_framelock->ctk_config,
+ (GSourceFunc) check_for_ethernet);
+}
+
+
+void ctk_framelock_unselect(GtkWidget *w)
+{
+ CtkFramelock *ctk_framelock = CTK_FRAMELOCK(w);
+
+ /* Stop the framelock timers */
+
+ ctk_config_stop_timer(ctk_framelock->ctk_config,
+ (GSourceFunc) update_status);
+
+ ctk_config_stop_timer(ctk_framelock->ctk_config,
+ (GSourceFunc) check_for_ethernet);
+}
diff --git a/src/gtk+-2.x/ctkframelock.h b/src/gtk+-2.x/ctkframelock.h
index e59bb49..11d7984 100644
--- a/src/gtk+-2.x/ctkframelock.h
+++ b/src/gtk+-2.x/ctkframelock.h
@@ -64,6 +64,8 @@ struct _CtkFramelock
GtkWindow *parent_window;
+ GtkWidget *house_sync_frame;
+ GtkWidget *use_house_sync_button;
GtkWidget *sync_interval_entry;
GtkWidget *sync_interval_frame;
@@ -115,6 +117,9 @@ GtkTextBuffer *ctk_framelock_create_help(GtkTextTagTable *);
void ctk_framelock_config_file_attributes(GtkWidget *, ParsedAttribute *);
+void ctk_framelock_select (GtkWidget *);
+void ctk_framelock_unselect (GtkWidget *);
+
G_END_DECLS
#endif /* __CTK_FRAMELOCK_H__ */
diff --git a/src/gtk+-2.x/ctkglx.c b/src/gtk+-2.x/ctkglx.c
index ebd2754..906c9df 100644
--- a/src/gtk+-2.x/ctkglx.c
+++ b/src/gtk+-2.x/ctkglx.c
@@ -28,6 +28,8 @@
#include <gtk/gtk.h>
#include <NvCtrlAttributes.h>
+#include "glxinfo.h" /* xxx_abbrev functions */
+
#include "glx_banner.h"
#include "ctkglx.h"
#include "ctkconfig.h"
@@ -36,15 +38,6 @@
#include <GL/glx.h> /* GLX #defines */
-
-/* Prototypes */
-
-static void ctk_glx_probe_info(GtkWidget *widget,
- GtkObject *old_parent,
- gpointer data);
-
-
-
/* Number of FBConfigs attributes reported in gui */
#define NUM_FBCONFIG_ATTRIBS 30
@@ -208,7 +201,7 @@ GtkWidget* ctk_glx_new(NvCtrlAttributeHandle *handle,
GtkWidget *image;
GtkWidget *frame;
GtkWidget *hseparator;
- GtkWidget *hbox, *hbox2;
+ GtkWidget *hbox;
GtkWidget *vbox, *vbox2;
GtkWidget *alignment;
GtkWidget *table;
@@ -286,7 +279,7 @@ GtkWidget* ctk_glx_new(NvCtrlAttributeHandle *handle,
/* Determine if GLX is supported */
ret = NvCtrlGetStringAttribute(ctk_glx->handle,
NV_CTRL_STRING_GLX_SERVER_VENDOR,
- &glx_info_str );
+ &glx_info_str);
free(glx_info_str);
if ( ret != NvCtrlSuccess ) {
goto fail_glx_not_supported;
@@ -468,12 +461,6 @@ GtkWidget* ctk_glx_new(NvCtrlAttributeHandle *handle,
gtk_widget_show_all(GTK_WIDGET(object));
- /* Set to probe for GLX info when widget is swapped in */
- ctk_glx->probe_handler_id =
- g_signal_connect(G_OBJECT(ctk_glx), "parent-set",
- G_CALLBACK(ctk_glx_probe_info),
- (gpointer) ctk_glx);
-
return GTK_WIDGET(object);
@@ -503,11 +490,9 @@ GtkWidget* ctk_glx_new(NvCtrlAttributeHandle *handle,
/* Probes for GLX information and sets up the results
* in the GLX widget.
*/
-static void ctk_glx_probe_info(GtkWidget *widget,
- GtkObject *old_parent,
- gpointer data)
+void ctk_glx_probe_info(GtkWidget *widget)
{
- CtkGLX *ctk_glx = (CtkGLX *) data;
+ CtkGLX *ctk_glx = CTK_GLX(widget);
ReturnStatus ret;
@@ -532,18 +517,15 @@ static void ctk_glx_probe_info(GtkWidget *widget,
GtkWidget *table;
- /* Make sure the widget was initialized */
- if ( !ctk_glx || !ctk_glx->glxinfo_vpane || !ctk_glx->probe_handler_id ) {
+ /* Make sure the widget was initialized and that glx information
+ * has not yet been initialized.
+ */
+ if ( !ctk_glx || !ctk_glx->glxinfo_vpane ||
+ ctk_glx->glxinfo_initialized ) {
return;
}
- /* Disconnect the handler */
- g_signal_handler_disconnect(G_OBJECT(ctk_glx),
- ctk_glx->probe_handler_id);
- ctk_glx->probe_handler_id = 0;
-
-
/* Get GLX information */
ret = NvCtrlGetStringAttribute(ctk_glx->handle,
NV_CTRL_STRING_GLX_DIRECT_RENDERING,
@@ -718,7 +700,7 @@ static void ctk_glx_probe_info(GtkWidget *widget,
/* Show the information */
gtk_widget_show_all(GTK_WIDGET(ctk_glx));
-
+ ctk_glx->glxinfo_initialized = True;
/* Fall through */
done:
diff --git a/src/gtk+-2.x/ctkglx.h b/src/gtk+-2.x/ctkglx.h
index 56a47ae..2390ef1 100644
--- a/src/gtk+-2.x/ctkglx.h
+++ b/src/gtk+-2.x/ctkglx.h
@@ -59,7 +59,7 @@ struct _CtkGLX
CtkConfig *ctk_config;
GtkWidget *glxinfo_vpane;
- int probe_handler_id; /* Signal handler ID */
+ Bool glxinfo_initialized;
};
struct _CtkGLXClass
@@ -73,6 +73,9 @@ GtkWidget* ctk_glx_new (NvCtrlAttributeHandle *,
GtkTextBuffer *ctk_glx_create_help(GtkTextTagTable *, CtkGLX *);
+void ctk_glx_probe_info(GtkWidget *widget);
+
+
G_END_DECLS
#endif /* __CTK_GLX_H__ */
diff --git a/src/gtk+-2.x/ctkgvo.c b/src/gtk+-2.x/ctkgvo.c
index ee0eff1..e06c7d7 100644
--- a/src/gtk+-2.x/ctkgvo.c
+++ b/src/gtk+-2.x/ctkgvo.c
@@ -169,8 +169,13 @@ static const FormatName videoFormatNames[] = {
{ NV_CTRL_GVO_VIDEO_FORMAT_1080P_25_00_SMPTE274, "1080p 25.00 Hz (SMPTE274)" },
{ NV_CTRL_GVO_VIDEO_FORMAT_1080P_29_97_SMPTE274, "1080p 29.97 Hz (SMPTE274)" },
{ NV_CTRL_GVO_VIDEO_FORMAT_1080P_30_00_SMPTE274, "1080p 30.00 Hz (SMPTE274)" },
- { NV_CTRL_GVO_VIDEO_FORMAT_1080I_23_98_SMPTE274, "1080PsF 23.98 Hz (SMPTE274)" },
- { NV_CTRL_GVO_VIDEO_FORMAT_1080I_24_00_SMPTE274, "1080PsF 24.00 Hz (SMPTE274)" },
+ { NV_CTRL_GVO_VIDEO_FORMAT_1080I_47_96_SMPTE274, "1080i 47.96 Hz (SMPTE274)" },
+ { NV_CTRL_GVO_VIDEO_FORMAT_1080I_48_00_SMPTE274, "1080i 48.00 Hz (SMPTE274)" },
+ { NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_25_00_SMPTE274, "1080PsF 25.00 Hz (SMPTE274)" },
+ { NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_29_97_SMPTE274, "1080PsF 29.97 Hz (SMPTE274)" },
+ { NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_30_00_SMPTE274, "1080PsF 30.00 Hz (SMPTE274)" },
+ { NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_24_00_SMPTE274, "1080PsF 24.00 Hz (SMPTE274)" },
+ { NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_23_98_SMPTE274, "1080PsF 23.98 Hz (SMPTE274)" },
{ -1, NULL },
};
@@ -643,16 +648,6 @@ static void output_data_format_changed(CtkDropDownMenu *menu,
-static gboolean update_status(gpointer user_data)
-{
- //CtkGvo *ctk_gvo = CTK_GVO(user_data);
-
-
- return TRUE;
-}
-
-
-
/*
* update_sync_mode_menu() - given the COMPOSITE_SYNC and SDI_SYNC
* values, set the sensitivity of each entry in sync_mode_menu.
diff --git a/src/gtk+-2.x/ctkmultisample.c b/src/gtk+-2.x/ctkmultisample.c
index 1d749af..131d57e 100644
--- a/src/gtk+-2.x/ctkmultisample.c
+++ b/src/gtk+-2.x/ctkmultisample.c
@@ -753,16 +753,20 @@ static void fsaa_update_received(GtkObject *object,
CtkEventStruct *event_struct;
CtkMultisample *ctk_multisample;
GtkRange *range;
+ gint val;
event_struct = (CtkEventStruct *) arg1;
ctk_multisample = CTK_MULTISAMPLE(user_data);
range = GTK_RANGE(ctk_multisample->fsaa_scale);
+ val = map_nv_ctrl_fsaa_value_to_slider(ctk_multisample,
+ event_struct->value);
+
g_signal_handlers_block_by_func(G_OBJECT(range),
G_CALLBACK(fsaa_value_changed),
(gpointer) ctk_multisample);
- gtk_range_set_value(range, event_struct->value);
+ gtk_range_set_value(range, val);
g_signal_handlers_unblock_by_func(G_OBJECT(range),
G_CALLBACK(fsaa_value_changed),
diff --git a/src/gtk+-2.x/ctkrandr.c b/src/gtk+-2.x/ctkrandr.c
index 12f712c..9077f0a 100644
--- a/src/gtk+-2.x/ctkrandr.c
+++ b/src/gtk+-2.x/ctkrandr.c
@@ -22,7 +22,7 @@
*
*/
-#include <stdlib.h>
+#include <stdlib.h> /* malloc */
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <X11/Xlib.h>
@@ -39,6 +39,7 @@
#include "rotate_right_off.h"
#include "ctkevent.h"
+#include "ctkhelp.h"
#include "ctkrandr.h"
@@ -405,8 +406,6 @@ GtkWidget* ctk_randr_new(NvCtrlAttributeHandle *handle,
{
GObject *object;
CtkRandR *ctk_randr;
- GtkWidget *alignment;
- GtkWidget *button;
Bool ret; /* NvCtrlxxx function return value */
int rotation_supported;
diff --git a/src/gtk+-2.x/ctkthermal.c b/src/gtk+-2.x/ctkthermal.c
index 9de4f6c..b3b4e4f 100644
--- a/src/gtk+-2.x/ctkthermal.c
+++ b/src/gtk+-2.x/ctkthermal.c
@@ -53,7 +53,8 @@ static const char *__ambient_temp_help =
static const char *__temp_level_help =
"This is a graphical representation of the current GPU core "
-"temperature relative to the Core Slowdown Threshold.";
+"temperature relative to the maximum GPU Core Slowdown "
+"Threshold temperature.";
GType ctk_thermal_get_type(void)
{
@@ -97,12 +98,6 @@ static gboolean update_thermal_info(gpointer user_data)
return FALSE;
}
- ret = NvCtrlGetAttribute(handle, NV_CTRL_AMBIENT_TEMPERATURE, &ambient);
- if (ret != NvCtrlSuccess) {
- /* thermal information no longer available */
- return FALSE;
- }
-
s = g_strdup_printf(" %d C ", core);
gtk_label_set_text(GTK_LABEL(ctk_thermal->core_label), s);
g_free(s);
@@ -110,9 +105,16 @@ static gboolean update_thermal_info(gpointer user_data)
ctk_gauge_set_current(CTK_GAUGE(ctk_thermal->core_gauge), core);
ctk_gauge_draw(CTK_GAUGE(ctk_thermal->core_gauge));
- s = g_strdup_printf(" %d C ", ambient);
- gtk_label_set_text(GTK_LABEL(ctk_thermal->ambient_label), s);
- g_free(s);
+ if (ctk_thermal->ambient_label) {
+ ret = NvCtrlGetAttribute(handle, NV_CTRL_AMBIENT_TEMPERATURE, &ambient);
+ if (ret != NvCtrlSuccess) {
+ /* thermal information no longer available */
+ return FALSE;
+ }
+ s = g_strdup_printf(" %d C ", ambient);
+ gtk_label_set_text(GTK_LABEL(ctk_thermal->ambient_label), s);
+ g_free(s);
+ }
return TRUE;
}
@@ -128,6 +130,7 @@ GtkWidget* ctk_thermal_new(NvCtrlAttributeHandle *handle,
GtkWidget *eventbox, *entry;
ReturnStatus ret;
+ gint trigger, ambient;
gint core, upper;
guint8 *image_buffer = NULL;
const nv_image_t *img;
@@ -152,6 +155,12 @@ GtkWidget* ctk_thermal_new(NvCtrlAttributeHandle *handle,
return NULL;
}
+ ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_CORE_THRESHOLD, &trigger);
+ if (ret != NvCtrlSuccess) {
+ /* thermal information unavailable */
+ return NULL;
+ }
+
/* create the CtkThermal object */
object = g_object_new(CTK_TYPE_THERMAL, NULL);
@@ -216,7 +225,7 @@ GtkWidget* ctk_thermal_new(NvCtrlAttributeHandle *handle,
gtk_widget_set_sensitive(entry, FALSE);
gtk_entry_set_width_chars(GTK_ENTRY(entry), 5);
- s = g_strdup_printf(" %d ", upper);
+ s = g_strdup_printf(" %d ", trigger);
gtk_entry_set_text(GTK_ENTRY(entry), s);
g_free(s);
@@ -253,25 +262,30 @@ GtkWidget* ctk_thermal_new(NvCtrlAttributeHandle *handle,
/* Ambient Temperature */
- hbox2 = gtk_hbox_new(FALSE, 0);
- gtk_table_attach(GTK_TABLE(table), hbox2, 0, 1, 1, 2,
- GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0);
-
- label = gtk_label_new("Ambient Temperature:");
- gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
-
- frame = gtk_frame_new(NULL);
- eventbox = gtk_event_box_new();
- gtk_container_add(GTK_CONTAINER(eventbox), frame);
- gtk_table_attach(GTK_TABLE(table), eventbox, 1, 2, 1, 2,
- GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
-
- label = gtk_label_new(NULL);
- gtk_container_add(GTK_CONTAINER(frame), label);
- ctk_thermal->ambient_label = label;
-
- ctk_config_set_tooltip(ctk_config, eventbox, __ambient_temp_help);
+ ret = NvCtrlGetAttribute(handle, NV_CTRL_AMBIENT_TEMPERATURE, &ambient);
+ if (ret == NvCtrlSuccess) {
+ hbox2 = gtk_hbox_new(FALSE, 0);
+ gtk_table_attach(GTK_TABLE(table), hbox2, 0, 1, 1, 2,
+ GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0);
+
+ label = gtk_label_new("Ambient Temperature:");
+ gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
+
+ frame = gtk_frame_new(NULL);
+ eventbox = gtk_event_box_new();
+ gtk_container_add(GTK_CONTAINER(eventbox), frame);
+ gtk_table_attach(GTK_TABLE(table), eventbox, 1, 2, 1, 2,
+ GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
+
+ label = gtk_label_new(NULL);
+ gtk_container_add(GTK_CONTAINER(frame), label);
+ ctk_thermal->ambient_label = label;
+
+ ctk_config_set_tooltip(ctk_config, eventbox, __ambient_temp_help);
+ } else {
+ ctk_thermal->ambient_label = NULL;
+ }
/* GPU Core Temperature Gauge */
@@ -307,7 +321,8 @@ GtkWidget* ctk_thermal_new(NvCtrlAttributeHandle *handle,
return GTK_WIDGET(ctk_thermal);
}
-GtkTextBuffer *ctk_thermal_create_help(GtkTextTagTable *table)
+GtkTextBuffer *ctk_thermal_create_help(GtkTextTagTable *table,
+ CtkThermal *ctk_thermal)
{
GtkTextIter i;
GtkTextBuffer *b;
@@ -324,8 +339,10 @@ GtkTextBuffer *ctk_thermal_create_help(GtkTextTagTable *table)
ctk_help_heading(b, &i, "Core Temperature");
ctk_help_para(b, &i, __core_temp_help);
- ctk_help_heading(b, &i, "Ambient Temperature");
- ctk_help_para(b, &i, __ambient_temp_help);
+ if (ctk_thermal->ambient_label) {
+ ctk_help_heading(b, &i, "Ambient Temperature");
+ ctk_help_para(b, &i, __ambient_temp_help);
+ }
ctk_help_heading(b, &i, "Temperature Level");
ctk_help_para(b, &i, __temp_level_help);
@@ -334,3 +351,23 @@ GtkTextBuffer *ctk_thermal_create_help(GtkTextTagTable *table)
return b;
}
+
+void ctk_thermal_start_timer(GtkWidget *widget)
+{
+ CtkThermal *ctk_thermal = CTK_THERMAL(widget);
+
+ /* Start the thermal timer */
+
+ ctk_config_start_timer(ctk_thermal->ctk_config,
+ (GSourceFunc) update_thermal_info);
+}
+
+void ctk_thermal_stop_timer(GtkWidget *widget)
+{
+ CtkThermal *ctk_thermal = CTK_THERMAL(widget);
+
+ /* Stop the thermal timer */
+
+ ctk_config_stop_timer(ctk_thermal->ctk_config,
+ (GSourceFunc) update_thermal_info);
+}
diff --git a/src/gtk+-2.x/ctkthermal.h b/src/gtk+-2.x/ctkthermal.h
index cac4c66..0cb0bbb 100644
--- a/src/gtk+-2.x/ctkthermal.h
+++ b/src/gtk+-2.x/ctkthermal.h
@@ -70,7 +70,10 @@ struct _CtkThermalClass
GType ctk_thermal_get_type (void) G_GNUC_CONST;
GtkWidget* ctk_thermal_new (NvCtrlAttributeHandle *, CtkConfig *);
-GtkTextBuffer* ctk_thermal_create_help (GtkTextTagTable *);
+GtkTextBuffer* ctk_thermal_create_help (GtkTextTagTable *, CtkThermal *);
+
+void ctk_thermal_start_timer (GtkWidget *);
+void ctk_thermal_stop_timer (GtkWidget *);
G_END_DECLS
diff --git a/src/gtk+-2.x/ctkutils.c b/src/gtk+-2.x/ctkutils.c
new file mode 100644
index 0000000..6436475
--- /dev/null
+++ b/src/gtk+-2.x/ctkutils.c
@@ -0,0 +1,52 @@
+/*
+ * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix
+ * and Linux systems.
+ *
+ * Copyright (C) 2004 NVIDIA Corporation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of Version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program 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 Version 2
+ * of the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the:
+ *
+ * Free Software Foundation, Inc.
+ * 59 Temple Place - Suite 330
+ * Boston, MA 02111-1307, USA
+ *
+ */
+
+#include <gtk/gtk.h>
+#include "ctkutils.h"
+
+#include <stdlib.h>
+
+
+void add_table_row(GtkWidget *table,
+ const gint row,
+ const gint value_alignment,
+ const gchar *name,
+ const gchar *value)
+{
+ GtkWidget *label;
+
+ label = gtk_label_new(name);
+ gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+ gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row + 1,
+ GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+
+ if (value == NULL)
+ label = gtk_label_new("Unknown");
+ else
+ label = gtk_label_new(value);
+ gtk_misc_set_alignment(GTK_MISC(label), value_alignment, 0.5);
+ gtk_table_attach(GTK_TABLE(table), label, 1, 2, row, row + 1,
+ GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+}
+
diff --git a/src/gtk+-2.x/ctkutils.h b/src/gtk+-2.x/ctkutils.h
new file mode 100644
index 0000000..a58159b
--- /dev/null
+++ b/src/gtk+-2.x/ctkutils.h
@@ -0,0 +1,38 @@
+/*
+ * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix
+ * and Linux systems.
+ *
+ * Copyright (C) 2004 NVIDIA Corporation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of Version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program 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 Version 2
+ * of the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the:
+ *
+ * Free Software Foundation, Inc.
+ * 59 Temple Place - Suite 330
+ * Boston, MA 02111-1307, USA
+ *
+ */
+
+#ifndef __CTK_UTILS_H__
+#define __CTK_UTILS_H__
+
+#include <gtk/gtk.h>
+
+
+G_BEGIN_DECLS
+
+void add_table_row(GtkWidget *, const gint, const gint, const gchar *,
+ const gchar *);
+
+G_END_DECLS
+
+#endif /* __CTK_UTILS_H__ */
diff --git a/src/gtk+-2.x/ctkwindow.c b/src/gtk+-2.x/ctkwindow.c
index badeddc..a49f2d6 100644
--- a/src/gtk+-2.x/ctkwindow.c
+++ b/src/gtk+-2.x/ctkwindow.c
@@ -48,6 +48,7 @@
#include "ctkglx.h"
#include "ctkmultisample.h"
#include "ctkthermal.h"
+#include "ctkclocks.h"
#include "ctkdisplaydevice.h"
#include "ctkdisplaydevice-crt.h"
@@ -65,11 +66,15 @@ enum {
CTK_WINDOW_WIDGET_COLUMN,
CTK_WINDOW_HELP_COLUMN,
CTK_WINDOW_CONFIG_FILE_ATTRIBUTES_FUNC_COLUMN,
+ CTK_WINDOW_SELECT_WIDGET_FUNC_COLUMN,
+ CTK_WINDOW_UNSELECT_WIDGET_FUNC_COLUMN,
CTK_WINDOW_NUM_COLUMNS
};
typedef void (*config_file_attributes_func_t)(GtkWidget *, ParsedAttribute *);
+typedef void (*select_widget_func_t)(GtkWidget *);
+typedef void (*unselect_widget_func_t)(GtkWidget *);
static void ctk_window_class_init(CtkWindowClass *);
@@ -77,7 +82,9 @@ static void ctk_window_real_destroy(GtkObject *);
static void add_page(GtkWidget *, GtkTextBuffer *, CtkWindow *,
GtkTreeIter *, const gchar *,
- config_file_attributes_func_t func);
+ config_file_attributes_func_t func,
+ select_widget_func_t load_func,
+ unselect_widget_func_t unload_func);
static GtkWidget *create_quit_dialog(CtkWindow *ctk_window);
@@ -220,12 +227,17 @@ static void tree_selection_changed(GtkTreeSelection *selection,
GtkWidget *widget;
GtkTextBuffer *help;
+ select_widget_func_t select_func;
+ unselect_widget_func_t unselect_func;
+
if (!gtk_tree_selection_get_selected(selection, &model, &iter))
return;
gtk_tree_model_get(model, &iter, CTK_WINDOW_LABEL_COLUMN, &str, -1);
gtk_tree_model_get(model, &iter, CTK_WINDOW_WIDGET_COLUMN, &widget, -1);
gtk_tree_model_get(model, &iter, CTK_WINDOW_HELP_COLUMN, &help, -1);
+ gtk_tree_model_get(model, &iter, CTK_WINDOW_SELECT_WIDGET_FUNC_COLUMN,
+ &select_func, -1);
/*
* remove the existing widget from the page viewer, if anything is
@@ -238,15 +250,37 @@ static void tree_selection_changed(GtkTreeSelection *selection,
ctk_window->page = NULL;
}
+ /* Call the unselect func for the existing widget, if any */
+
+ if ( ctk_window->widget ) {
+ gtk_tree_model_get(model, &(ctk_window->iter),
+ CTK_WINDOW_UNSELECT_WIDGET_FUNC_COLUMN,
+ &unselect_func, -1);
+ if ( unselect_func ) {
+ (*unselect_func)(ctk_window->widget);
+ }
+ }
+
+ /* Pack the new widget */
+
if (widget) {
ctk_window->page = widget;
gtk_box_pack_start(GTK_BOX(ctk_window->page_viewer), widget,
TRUE, TRUE, 2);
}
+ /* Call the select func for the new widget */
+
+ if (select_func) (*select_func)(widget);
+
/* update the help page */
ctk_help_set_page(CTK_HELP(ctk_window->ctk_help), help);
+
+ /* Keep track of the selected widget */
+
+ ctk_window->iter = iter;
+ ctk_window->widget = widget;
} /* tree_selection_changed() */
@@ -426,11 +460,14 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles,
/* create the tree model */
- ctk_window->tree_store = gtk_tree_store_new(CTK_WINDOW_NUM_COLUMNS,
- G_TYPE_STRING,
- G_TYPE_POINTER,
- G_TYPE_POINTER,
- G_TYPE_POINTER);
+ ctk_window->tree_store =
+ gtk_tree_store_new(CTK_WINDOW_NUM_COLUMNS,
+ G_TYPE_STRING, /* Label */
+ G_TYPE_POINTER, /* Main widget */
+ G_TYPE_POINTER, /* Help widget */
+ G_TYPE_POINTER, /* Config file attr func */
+ G_TYPE_POINTER, /* Load widget func */
+ G_TYPE_POINTER); /* Unload widget func */
model = GTK_TREE_MODEL(ctk_window->tree_store);
/* create the tree view */
@@ -516,7 +553,7 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles,
if (child) {
help = ctk_color_correction_create_help(tag_table);
add_page(child, help, ctk_window, &iter,
- "X Server Color Correction", NULL);
+ "X Server Color Correction", NULL, NULL, NULL);
}
/* xvideo settings */
@@ -525,7 +562,7 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles,
if (child) {
help = ctk_xvideo_create_help(tag_table, CTK_XVIDEO(child));
add_page(child, help, ctk_window, &iter,
- "X Server XVideo Settings", NULL);
+ "X Server XVideo Settings", NULL, NULL, NULL);
}
/* randr settings */
@@ -534,7 +571,7 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles,
if (child) {
help = ctk_randr_create_help(tag_table, CTK_RANDR(child));
add_page(child, help, ctk_window, &iter,
- "Rotation Settings", NULL);
+ "Rotation Settings", NULL, NULL, NULL);
}
/* cursor shadow */
@@ -543,7 +580,8 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles,
if (child) {
help = ctk_cursor_shadow_create_help(tag_table,
CTK_CURSOR_SHADOW(child));
- add_page(child, help, ctk_window, &iter, "Cursor Shadow", NULL);
+ add_page(child, help, ctk_window, &iter, "Cursor Shadow",
+ NULL, NULL, NULL);
}
/* opengl settings */
@@ -551,7 +589,8 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles,
child = ctk_opengl_new(handles[i], ctk_config, ctk_event);
if (child) {
help = ctk_opengl_create_help(tag_table, CTK_OPENGL(child));
- add_page(child, help, ctk_window, &iter, "OpenGL Settings", NULL);
+ add_page(child, help, ctk_window, &iter, "OpenGL Settings",
+ NULL, NULL, NULL);
}
@@ -560,7 +599,8 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles,
child = ctk_glx_new(handles[i], ctk_config, ctk_event);
if (child) {
help = ctk_glx_create_help(tag_table, CTK_GLX(child));
- add_page(child, help, ctk_window, &iter, "OpenGL/GLX Information", NULL);
+ add_page(child, help, ctk_window, &iter, "OpenGL/GLX Information",
+ NULL, ctk_glx_probe_info, NULL);
}
@@ -570,16 +610,17 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles,
if (child) {
help = ctk_multisample_create_help(tag_table,
CTK_MULTISAMPLE(child));
- add_page(child, help, ctk_window, &iter,
- "Antialiasing Settings", NULL);
+ add_page(child, help, ctk_window, &iter, "Antialiasing Settings",
+ NULL, NULL, NULL);
}
/* thermal information */
child = ctk_thermal_new(handles[i], ctk_config);
if (child) {
- help = ctk_thermal_create_help(tag_table);
- add_page(child, help, ctk_window, &iter, "Thermal Monitor", NULL);
+ help = ctk_thermal_create_help(tag_table, CTK_THERMAL(child));
+ add_page(child, help, ctk_window, &iter, "Thermal Monitor",
+ NULL, ctk_thermal_start_timer, ctk_thermal_stop_timer);
}
/* gvo (Graphics To Video Out) */
@@ -587,8 +628,17 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles,
child = ctk_gvo_new(handles[i], ctk_config);
if (child) {
help = ctk_gvo_create_help(tag_table);
- add_page(child, help, ctk_window, &iter,
- "Graphics to Video Out", NULL);
+ add_page(child, help, ctk_window, &iter, "Graphics to Video Out",
+ NULL, NULL, NULL);
+ }
+
+ /* clocks (GPU overclocking) */
+
+ child = ctk_clocks_new(handles[i], ctk_config, ctk_event);
+ if (child) {
+ help = ctk_clocks_create_help(tag_table, CTK_CLOCKS(child));
+ add_page(child, help, ctk_window, &iter, "Clock Frequencies",
+ NULL, ctk_clocks_select, NULL);
}
/* display devices */
@@ -616,7 +666,9 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles,
add_page(widget, ctk_framelock_create_help(tag_table),
ctk_window, NULL, "FrameLock",
- ctk_framelock_config_file_attributes);
+ ctk_framelock_config_file_attributes,
+ ctk_framelock_select,
+ ctk_framelock_unselect);
break;
}
@@ -624,7 +676,8 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles,
add_page(GTK_WIDGET(ctk_window->ctk_config),
ctk_config_create_help(tag_table),
- ctk_window, NULL, "nvidia-settings Configuration", NULL);
+ ctk_window, NULL, "nvidia-settings Configuration",
+ NULL, NULL, NULL);
/*
* we're done with the current data in the parsed attribute list,
@@ -665,7 +718,9 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles,
static void add_page(GtkWidget *widget, GtkTextBuffer *help,
CtkWindow *ctk_window, GtkTreeIter *iter,
- const gchar *label, config_file_attributes_func_t func)
+ const gchar *label, config_file_attributes_func_t func,
+ select_widget_func_t select_func,
+ unselect_widget_func_t unselect_func)
{
GtkTreeIter child_iter;
@@ -683,7 +738,12 @@ static void add_page(GtkWidget *widget, GtkTextBuffer *help,
gtk_tree_store_set(ctk_window->tree_store, &child_iter,
CTK_WINDOW_CONFIG_FILE_ATTRIBUTES_FUNC_COLUMN,
func, -1);
-
+ gtk_tree_store_set(ctk_window->tree_store, &child_iter,
+ CTK_WINDOW_SELECT_WIDGET_FUNC_COLUMN,
+ select_func, -1);
+ gtk_tree_store_set(ctk_window->tree_store, &child_iter,
+ CTK_WINDOW_UNSELECT_WIDGET_FUNC_COLUMN,
+ unselect_func, -1);
} /* add_page() */
diff --git a/src/gtk+-2.x/ctkwindow.h b/src/gtk+-2.x/ctkwindow.h
index a8c118f..3256b8e 100644
--- a/src/gtk+-2.x/ctkwindow.h
+++ b/src/gtk+-2.x/ctkwindow.h
@@ -75,6 +75,9 @@ struct _CtkWindow
GtkWidget *quit_dialog;
ParsedAttribute *attribute_list;
+
+ GtkTreeIter iter;
+ GtkWidget *widget;
};
struct _CtkWindowClass
diff --git a/src/image_data/HOWTO-ADD-IMAGES b/src/image_data/HOWTO-ADD-IMAGES
new file mode 100644
index 0000000..98523f6
--- /dev/null
+++ b/src/image_data/HOWTO-ADD-IMAGES
@@ -0,0 +1,20 @@
+
+If I have a png, how do I build it into nvidia-settings?
+
+ - Open the file in gimp:
+ - make sure the image is in RGB mode (check IMAGE-> Mode -> RGB)
+ - select the filetype as C-Source, and name the file <something>.h
+ - click OK, on the subsequent option page, select the following:
+
+ [ ] Save Comment to File
+ [*] Use Glib Types (guint8*)
+ [ ] Use Macros instead of Struct
+ [*] use 1 Byte Run-Length-Encoding
+ [ ] Save alpha Channel (RGBA/RGB)
+
+ Opacity: 100.0
+
+ - modify the header file, removing the struct declaration,
+ following the convention in other header files, like
+ big_banner_penguin.h.
+
diff --git a/src/image_data/Makefile.inc b/src/image_data/Makefile.inc
index 1713a55..48d28df 100644
--- a/src/image_data/Makefile.inc
+++ b/src/image_data/Makefile.inc
@@ -30,9 +30,11 @@ SRC += \
image.c
EXTRA_DIST += \
+ HOWTO-ADD-IMAGES \
antialiasing_banner.h \
big_banner_bsd.h \
big_banner_penguin.h \
+ big_banner_sun.h \
color_correction_banner.h \
configuration_banner.h \
frame_lock_banner.h \
@@ -76,5 +78,5 @@ EXTRA_DIST += \
rotation_orientation_horiz_flipped.h \
rotation_orientation_horiz.h \
rotation_orientation_vert_flipped.h \
- rotation_orientation_vert.h
-
+ rotation_orientation_vert.h \
+ clocks_banner.h
diff --git a/src/image_data/big_banner_sun.h b/src/image_data/big_banner_sun.h
new file mode 100644
index 0000000..158d0d3
--- /dev/null
+++ b/src/image_data/big_banner_sun.h
@@ -0,0 +1,2446 @@
+/* GIMP RGB C-Source image dump 1-byte-run-length-encoded (big_banner_sun.h) */
+
+#include "image.h"
+
+static const nv_image_t big_banner_sun_image = {
+ 360, 110, 3,
+ "\377\376\376\376\333\376\376\376\5\231\236v\177\177\177jjkvvw\177\177\177"
+ "\202\205\205\206\202\212\212\214\7\220\220\217\217\216\224\223\223\224\227"
+ "\227\231\223\223\224\212\212\214\205\205\206\202\212\212\214\203\205\205"
+ "\206\2\212\212\214\223\223\224\210\227\227\231\2\217\216\224\205\205\206"
+ "\203\177\177\177\203\205\205\206\202\177\177\177\202vvw\6\177\177\177\205"
+ "\205\206\212\212\214\217\216\224\212\212\214\205\205\206\203\177\177\177"
+ "\10\205\205\206\212\212\214\217\216\224\223\223\224\217\216\224\212\212\214"
+ "\205\205\206\177\177\177\205vvw\202\177\177\177\5\205\205\206\212\212\214"
+ "\217\216\224\223\223\224\227\227\231\223\235\235\234\203\227\227\231\2\223"
+ "\223\224\217\216\224\202\212\212\214\202\205\205\206\1\177\177\177\202\205"
+ "\205\206\2\212\212\214\217\216\224\202\227\227\231\5\235\235\234\227\227"
+ "\231\217\216\224\212\212\214\217\216\224\204\223\223\224\1\217\216\224\202"
+ "\212\212\214\4\223\223\224\227\227\231\223\223\224\220\220\217\203\212\212"
+ "\214\3\217\216\224\223\223\224\217\216\224\202\212\212\214\205\227\227\231"
+ "\2\223\223\224\212\212\214\203\205\205\206\1\177\177\177\377\376\376\376"
+ "\333\376\376\376\6\244\246\230\177\177\177vvw\205\205\206\220\220\217\223"
+ "\223\224\202\227\227\231\6\235\235\234\240\240\241\245\245\247\253\252\253"
+ "\245\245\247\235\235\234\204\227\227\231\202\223\223\224\2\227\227\231\245"
+ "\245\247\202\253\252\253\203\245\245\247\203\253\252\253\5\240\240\241\217"
+ "\216\224\205\205\206\212\212\214\217\216\224\203\227\227\231\6\212\212\214"
+ "\205\205\206\177\177\177\205\205\206\212\212\214\227\227\231\202\240\240"
+ "\241\1\227\227\231\204\217\216\224\2\227\227\231\235\235\234\202\240\240"
+ "\241\3\227\227\231\212\212\214\205\205\206\202\177\177\177\202\205\205\206"
+ "\7\212\212\214\223\223\224\227\227\231\240\240\241\245\245\247\253\252\253"
+ "\255\255\260\230\261\261\260\203\255\255\260\3\253\252\253\245\245\247\240"
+ "\240\241\202\227\227\231\203\217\216\224\3\223\223\224\235\235\234\245\245"
+ "\247\203\253\252\253\3\240\240\241\227\227\231\240\240\241\205\245\245\247"
+ "\202\227\227\231\1\240\240\241\202\245\245\247\1\240\240\241\203\235\235"
+ "\234\5\240\240\241\245\245\247\235\235\234\227\227\231\240\240\241\204\253"
+ "\252\253\3\245\245\247\240\240\241\227\227\231\202\220\220\217\1\212\212"
+ "\214\377\376\376\376\332\376\376\376\16\307\322\237\215\216\206\177\177\177"
+ "\205\205\206\223\223\224\235\235\234\240\240\241\245\245\247\253\252\253"
+ "\255\255\260\261\261\260\267\267\272\264\264\265\255\255\260\202\245\245"
+ "\247\202\253\252\253\4\245\245\247\240\240\241\245\245\247\267\267\272\202"
+ "\274\274\274\203\267\267\272\203\274\274\274\2\255\255\260\235\235\234\202"
+ "\227\227\231\5\245\245\247\253\252\253\255\255\260\245\245\247\227\227\231"
+ "\202\217\216\224\5\227\227\231\245\245\247\255\255\260\264\264\265\255\255"
+ "\260\202\245\245\247\1\240\240\241\202\245\245\247\202\255\255\260\3\253"
+ "\252\253\240\240\241\223\223\224\203\217\216\224\6\223\223\224\235\235\234"
+ "\245\245\247\255\255\260\267\267\272\274\274\274\242\302\302\302\5\274\274"
+ "\274\267\267\272\264\264\265\255\255\260\245\245\247\203\240\240\241\3\245"
+ "\245\247\255\255\260\267\267\272\202\274\274\274\1\264\264\265\202\253\252"
+ "\253\1\264\264\265\204\267\267\272\3\255\255\260\245\245\247\255\255\260"
+ "\202\267\267\272\1\264\264\265\203\255\255\260\202\264\264\265\3\255\255"
+ "\260\245\245\247\264\264\265\203\274\274\274\6\267\267\272\264\264\265\255"
+ "\255\260\240\240\241\227\227\231\223\223\224\377\376\376\376\330\376\376"
+ "\376\14\364\367\350\325\343\240\244\246\230\177\177\177\205\205\206\223\223"
+ "\224\240\240\241\245\245\247\255\255\260\264\264\265\267\267\272\274\274"
+ "\274\202\306\306\310\1\273\273\302\202\264\264\265\202\267\267\272\4\264"
+ "\264\265\255\255\260\264\264\265\306\306\310\202\314\314\315\203\306\306"
+ "\310\202\314\314\315\6\306\306\310\267\267\272\245\245\247\240\240\241\255"
+ "\255\260\267\267\272\202\273\273\302\12\264\264\265\245\245\247\235\235\234"
+ "\240\240\241\253\252\253\273\273\302\306\306\310\302\302\302\273\273\302"
+ "\267\267\272\202\264\264\265\1\267\267\272\202\273\273\302\3\264\264\265"
+ "\245\245\247\235\235\234\202\227\227\231\5\240\240\241\253\252\253\264\264"
+ "\265\273\273\302\306\306\310\202\314\314\315\204\322\322\323\203\314\314"
+ "\315\206\306\306\310\204\314\314\315\225\322\322\323\5\321\321\313\314\314"
+ "\315\306\306\310\273\273\302\267\267\272\202\255\255\260\3\264\264\265\274"
+ "\274\274\306\306\310\202\314\314\315\4\306\306\310\273\273\302\267\267\272"
+ "\277\277\310\204\306\306\310\1\302\302\302\202\267\267\272\202\306\306\310"
+ "\1\302\302\302\203\273\273\302\202\302\302\302\3\274\274\274\267\267\272"
+ "\302\302\302\202\314\314\315\202\306\306\310\4\302\302\302\267\267\272\245"
+ "\245\247\227\227\231\377\376\376\376\331\376\376\376\1\307\322\237\202\205"
+ "\205\206\14\223\223\224\240\240\241\253\252\253\264\264\265\267\267\272\302"
+ "\302\302\306\306\310\314\314\315\322\322\323\305\305\315\277\277\310\302"
+ "\302\302\202\306\306\310\1\277\277\310\202\273\273\302\12\314\314\315\333"
+ "\333\333\327\327\327\324\324\332\316\316\326\322\322\323\327\327\327\333"
+ "\333\333\327\327\327\306\306\310\202\255\255\260\15\267\267\272\305\305\315"
+ "\316\316\326\312\312\322\273\273\302\255\255\260\245\245\247\253\252\253"
+ "\273\273\302\316\316\326\324\324\332\316\316\326\314\314\315\203\305\305"
+ "\315\202\312\312\322\12\277\277\310\255\255\260\245\245\247\240\240\241\245"
+ "\245\247\253\252\253\267\267\272\305\305\315\316\316\326\327\327\335\203"
+ "\333\333\333\10\327\327\335\324\324\332\322\322\323\314\314\315\306\306\310"
+ "\273\273\302\274\274\274\267\267\272\203\264\264\265\1\261\261\260\203\264"
+ "\264\265\202\267\267\272\6\273\273\302\302\302\302\314\314\315\322\322\323"
+ "\327\327\335\337\337\331\212\341\341\341\1\334\334\341\204\333\333\333\3"
+ "\337\337\331\341\341\341\337\337\331\202\333\333\333\3\316\316\326\305\305"
+ "\315\302\302\302\202\273\273\302\2\277\277\310\316\316\326\202\333\333\333"
+ "\4\327\327\327\306\306\310\277\277\310\316\316\326\203\322\322\323\2\324"
+ "\324\332\322\322\323\202\277\277\310\4\316\316\326\324\324\332\322\322\323"
+ "\312\312\322\202\314\314\315\5\322\322\323\316\316\326\306\306\310\302\302"
+ "\302\322\322\323\202\327\327\327\5\322\322\323\314\314\315\306\306\310\267"
+ "\267\272\245\245\247\377\376\376\376\331\376\376\376\21\231\232\217\177\177"
+ "\177\220\220\217\235\235\234\253\252\253\264\264\265\273\273\302\306\306"
+ "\310\314\314\315\322\322\323\333\333\333\324\324\332\314\314\315\305\305"
+ "\315\312\312\322\322\322\323\312\312\322\202\306\306\310\4\324\324\332\341"
+ "\341\341\341\341\346\334\334\341\202\327\327\335\23\341\341\341\345\345\346"
+ "\341\341\341\316\316\326\273\273\302\267\267\272\305\305\315\324\324\332"
+ "\334\334\341\327\327\335\305\305\315\263\263\277\255\255\260\263\263\277"
+ "\312\312\322\334\334\341\341\341\346\334\334\341\327\327\335\202\324\324"
+ "\332\202\327\327\335\23\316\316\326\273\273\302\255\255\260\245\245\247\255"
+ "\255\260\263\263\277\305\305\315\322\322\323\334\334\341\341\341\346\344"
+ "\344\351\345\345\346\341\341\346\334\334\341\324\324\332\312\312\322\302"
+ "\302\302\273\273\302\267\267\272\206\264\264\265\207\267\267\272\1\274\274"
+ "\274\202\273\273\302\7\302\302\302\306\306\310\314\314\315\322\322\323\333"
+ "\333\333\341\341\341\351\351\351\203\355\355\351\205\351\351\351\2\345\345"
+ "\346\344\344\351\202\341\341\346\202\345\345\346\202\351\351\351\4\345\345"
+ "\346\341\341\341\327\327\335\316\316\326\202\305\305\315\22\312\312\322\327"
+ "\327\335\341\341\346\345\345\346\341\341\341\324\324\332\312\312\322\327"
+ "\327\335\334\334\341\327\327\335\334\334\341\341\341\341\334\334\341\316"
+ "\316\326\312\312\322\327\327\335\341\341\341\334\334\341\202\324\324\332"
+ "\5\327\327\335\334\334\341\324\324\332\312\312\322\322\322\323\202\341\341"
+ "\341\5\333\333\333\327\327\327\322\322\323\306\306\310\264\264\265\377\376"
+ "\376\376\330\376\376\376\12\273\301\235\177\177\177\212\212\214\235\235\234"
+ "\253\252\253\264\264\265\302\302\302\306\306\310\322\322\323\327\327\335"
+ "\202\334\334\341\5\324\324\332\316\316\326\324\324\332\333\333\333\327\327"
+ "\335\202\312\312\322\1\327\327\335\202\351\351\355\7\344\344\351\341\341"
+ "\341\341\341\346\344\344\351\355\355\355\351\351\355\327\327\335\202\277"
+ "\277\310\14\316\316\326\341\341\346\351\351\355\341\341\346\316\316\326\273"
+ "\273\302\263\263\277\277\277\310\334\334\341\351\351\355\355\355\355\351"
+ "\351\355\204\344\344\351\11\334\334\341\305\305\315\263\263\277\255\255\260"
+ "\264\264\265\277\277\310\316\316\326\341\341\346\351\351\355\202\354\354"
+ "\361\6\351\351\355\344\344\351\334\334\341\322\322\323\306\306\310\273\273"
+ "\302\203\267\267\272\4\274\274\274\273\273\302\302\302\302\306\306\310\202"
+ "\314\314\315\3\322\322\323\324\324\332\327\327\327\202\327\327\335\203\327"
+ "\327\327\3\324\324\332\322\322\323\316\316\326\205\314\314\315\4\322\322"
+ "\323\327\327\335\341\341\341\351\351\351\202\361\361\361\1\365\365\361\203"
+ "\361\361\361\2\356\356\361\355\355\355\206\351\351\355\17\356\356\361\361"
+ "\361\361\356\356\361\351\351\351\341\341\346\327\327\335\316\316\326\324"
+ "\324\332\334\334\341\351\351\355\355\355\355\351\351\355\334\334\341\324"
+ "\324\332\334\334\341\203\341\341\346\24\346\346\355\351\351\351\327\327\335"
+ "\324\324\332\334\334\341\351\351\355\344\344\351\341\341\346\341\341\341"
+ "\341\341\346\344\344\351\334\334\341\322\322\323\334\334\341\351\351\351"
+ "\345\345\346\341\341\341\327\327\327\314\314\315\302\302\302\377\376\376"
+ "\376\330\376\376\376\26\220\220\217\205\205\206\223\223\224\245\245\247\264"
+ "\264\265\273\273\302\306\306\310\322\322\323\333\333\333\341\341\341\341"
+ "\341\346\333\333\333\324\324\332\327\327\335\341\341\346\334\334\341\324"
+ "\324\332\316\316\326\327\327\335\351\351\355\356\356\364\351\351\355\202"
+ "\344\344\351\1\351\351\355\202\361\361\361\1\327\327\335\202\305\305\315"
+ "\22\327\327\335\354\354\361\362\362\366\351\351\355\324\324\332\277\277\310"
+ "\263\263\277\312\312\322\346\346\355\362\362\366\365\365\365\360\360\365"
+ "\356\356\364\356\356\361\356\356\364\354\354\361\327\327\335\277\277\310"
+ "\202\263\263\277\4\277\277\310\327\327\335\351\351\355\361\361\361\202\365"
+ "\365\365\23\360\360\365\346\346\355\327\327\335\314\314\315\306\306\310\273"
+ "\273\302\274\274\274\273\273\302\302\302\302\305\305\315\322\322\323\327"
+ "\327\335\334\334\341\345\345\346\351\351\355\354\354\361\356\356\361\361"
+ "\361\361\360\360\365\204\362\362\366\1\360\360\365\202\361\361\361\7\356"
+ "\356\361\351\351\355\351\351\351\345\345\346\341\341\341\334\334\341\333"
+ "\333\333\203\327\327\327\6\327\327\335\341\341\346\351\351\355\361\361\361"
+ "\365\365\365\370\370\365\202\365\365\365\3\362\362\366\360\360\365\354\354"
+ "\361\202\351\351\355\203\354\354\361\1\356\356\361\202\365\365\365\15\362"
+ "\362\366\354\354\361\341\341\346\334\334\341\327\327\335\341\341\346\354"
+ "\354\361\365\365\365\362\362\366\344\344\351\327\327\335\344\344\351\351"
+ "\351\355\202\344\344\351\11\351\351\360\354\354\361\341\341\346\327\327\335"
+ "\341\341\346\356\356\361\354\354\361\351\351\351\346\346\355\202\351\351"
+ "\355\10\334\334\341\327\327\335\351\351\355\355\355\355\345\345\346\333\333"
+ "\333\322\322\323\306\306\310\377\376\376\376\327\376\376\376\21\256\263\231"
+ "\177\177\177\212\212\214\235\235\234\255\255\260\274\274\274\306\306\310"
+ "\322\322\323\333\333\333\341\341\346\344\344\351\341\341\346\327\327\335"
+ "\334\334\341\344\344\351\346\346\355\334\334\341\202\324\324\332\6\346\346"
+ "\355\362\362\366\356\356\364\351\351\355\346\346\355\351\351\360\202\365"
+ "\365\371\14\344\344\351\312\312\322\305\305\315\334\334\341\362\362\366\371"
+ "\371\371\362\362\366\334\334\341\305\305\315\273\273\302\316\316\326\354"
+ "\354\361\203\371\371\371\203\365\365\371\10\356\356\361\327\327\335\273\273"
+ "\302\263\263\277\277\277\310\324\324\332\346\346\355\365\365\371\203\371"
+ "\371\371\16\356\356\361\344\344\351\322\322\323\306\306\310\277\277\310\302"
+ "\302\302\306\306\310\314\314\315\322\322\323\334\334\341\345\345\346\355"
+ "\355\355\360\360\365\362\362\366\202\365\365\371\204\371\371\374\202\374"
+ "\372\374\205\371\371\374\203\365\365\371\7\362\362\366\360\360\365\356\356"
+ "\361\351\351\355\351\351\351\345\345\346\341\341\341\202\334\334\341\4\341"
+ "\341\341\344\344\351\356\356\361\365\365\371\203\371\371\371\202\365\365"
+ "\371\3\360\360\365\354\354\361\351\351\355\203\354\354\361\2\360\360\365"
+ "\365\365\371\202\371\371\371\2\365\365\365\351\351\360\202\341\341\346\6"
+ "\346\346\355\362\362\366\371\371\371\365\365\371\344\344\351\334\334\341"
+ "\202\351\351\360\11\344\344\354\346\346\355\356\356\364\362\362\366\344\344"
+ "\351\334\334\341\351\351\355\362\362\366\360\360\365\202\354\354\361\11\356"
+ "\356\361\351\351\355\334\334\341\341\341\346\355\355\355\351\351\351\341"
+ "\341\341\327\327\327\306\306\310\377\376\376\376\327\376\376\376\13\215\216"
+ "\206\205\205\206\227\227\231\245\245\247\264\264\265\302\302\302\314\314"
+ "\315\327\327\327\341\341\341\345\345\346\341\341\346\202\334\334\341\33\344"
+ "\344\351\351\351\355\344\344\351\327\327\335\324\324\332\341\341\346\360"
+ "\360\365\362\362\366\354\354\361\346\346\355\351\351\355\362\362\366\371"
+ "\371\374\346\346\355\316\316\326\312\312\322\334\334\341\365\365\371\374"
+ "\372\374\365\365\371\344\344\351\305\305\315\277\277\310\316\316\326\356"
+ "\356\361\374\372\374\374\374\372\202\371\371\371\202\374\372\374\2\354\354"
+ "\361\316\316\326\202\273\273\302\3\316\316\326\346\346\355\365\365\371\202"
+ "\374\372\374\15\374\374\372\365\365\371\346\346\355\324\324\332\305\305\315"
+ "\302\302\302\306\306\310\314\314\315\322\322\323\334\334\341\351\351\351"
+ "\354\354\361\360\360\365\202\362\362\366\204\365\365\371\202\371\371\374"
+ "\204\365\365\371\1\365\365\365\210\362\362\366\1\365\365\365\202\362\362"
+ "\366\13\360\360\365\361\361\361\355\355\355\351\351\355\351\351\351\345\345"
+ "\346\341\341\346\345\345\346\351\351\355\361\361\361\365\365\371\202\374"
+ "\372\374\"\371\371\374\365\365\371\360\360\365\351\351\355\344\344\351\346"
+ "\346\355\354\354\361\356\356\364\360\360\365\365\365\371\371\371\371\374"
+ "\372\374\371\371\371\360\360\365\351\351\360\344\344\354\351\351\360\365"
+ "\365\371\374\372\374\365\365\371\344\344\354\341\341\346\354\354\361\351"
+ "\351\360\346\346\355\351\351\355\360\360\365\365\365\371\346\346\355\334"
+ "\334\341\354\354\361\365\365\371\362\362\366\356\356\364\202\360\360\365"
+ "\7\346\346\355\334\334\341\345\345\346\355\355\355\341\341\341\327\327\327"
+ "\314\314\315\377\376\376\376\326\376\376\376\13\256\263\231\177\177\177\220"
+ "\220\217\240\240\241\261\261\260\274\274\274\314\314\315\324\324\332\334"
+ "\334\341\345\345\346\346\346\355\202\334\334\341\32\341\341\346\354\354\361"
+ "\351\351\355\334\334\341\324\324\332\334\334\341\356\356\361\362\362\366"
+ "\354\354\361\346\346\355\351\351\355\360\360\365\365\365\371\354\354\361"
+ "\316\316\326\312\312\322\341\341\346\365\365\371\374\374\374\371\371\374"
+ "\344\344\354\305\305\315\277\277\310\324\324\332\362\362\366\374\374\374"
+ "\203\374\372\374\10\374\374\374\365\365\371\344\344\351\305\305\315\273\273"
+ "\302\305\305\315\341\341\346\365\365\371\203\374\374\374\12\371\371\374\354"
+ "\354\361\334\334\341\314\314\315\277\277\310\306\306\310\314\314\315\327"
+ "\327\335\344\344\351\354\354\361\202\360\360\365\203\362\362\366\202\365"
+ "\365\371\4\365\365\365\362\362\366\361\361\361\355\355\355\202\351\351\351"
+ "\1\345\345\346\202\345\345\340\205\341\341\341\202\345\345\340\1\345\345"
+ "\346\202\351\351\351\3\351\351\355\355\355\355\356\356\361\203\361\361\361"
+ "\12\356\356\361\355\355\355\351\351\355\351\351\351\345\345\346\351\351\351"
+ "\351\351\355\362\362\366\371\371\374\374\374\374\202\371\371\374\2\365\365"
+ "\371\354\354\361\202\341\341\346\5\344\344\351\354\354\361\356\356\364\362"
+ "\362\366\371\371\371\202\374\374\374\31\365\365\371\356\356\364\351\351\360"
+ "\354\354\361\365\365\371\374\374\374\371\371\371\346\346\355\344\344\354"
+ "\356\356\364\351\351\360\344\344\354\346\346\355\360\360\365\365\365\371"
+ "\346\346\355\341\341\346\354\354\361\365\365\371\362\362\366\360\360\365"
+ "\362\362\366\360\360\365\341\341\346\327\327\335\202\345\345\346\2\333\333"
+ "\333\314\314\315\377\376\376\376\325\376\376\376\14\332\337\264\215\216\206"
+ "\205\205\206\227\227\231\253\252\253\267\267\272\306\306\310\322\322\323"
+ "\333\333\333\341\341\346\351\351\351\341\341\346\202\334\334\341\3\351\351"
+ "\355\356\356\361\341\341\346\202\327\327\335\3\351\351\355\362\362\366\356"
+ "\356\364\202\351\351\355\7\354\354\361\365\365\371\354\354\361\324\324\332"
+ "\305\305\315\334\334\341\371\371\371\202\376\376\376\6\354\354\361\312\312"
+ "\322\277\277\310\316\316\326\362\362\366\376\376\376\203\374\374\374\24\376"
+ "\376\376\371\371\374\334\334\341\277\277\310\273\273\302\316\316\326\354"
+ "\354\361\374\372\374\376\376\376\376\376\374\376\376\376\371\371\374\346"
+ "\346\355\316\316\326\306\306\310\302\302\302\314\314\315\327\327\327\351"
+ "\351\351\360\360\365\202\362\362\366\10\361\361\361\362\362\366\365\365\365"
+ "\365\365\371\365\365\365\361\361\361\355\355\355\351\351\351\202\345\345"
+ "\340\220\337\337\331\202\345\345\340\1\352\352\343\202\355\355\351\1\355"
+ "\355\355\203\361\361\361\20\356\356\361\355\355\355\351\351\355\351\351\351"
+ "\351\351\355\356\356\361\365\365\371\376\376\376\374\374\376\371\371\374"
+ "\365\365\371\354\354\361\341\341\346\327\327\335\334\334\341\351\351\360"
+ "\202\356\356\364\1\371\371\371\202\376\376\376\24\371\371\374\360\360\365"
+ "\354\354\361\360\360\365\374\372\374\376\376\376\371\371\371\344\344\351"
+ "\351\351\355\356\356\364\346\346\355\344\344\351\346\346\355\360\360\365"
+ "\371\371\374\346\346\355\341\341\346\362\362\366\371\371\374\365\365\371"
+ "\202\362\362\366\6\351\351\360\327\327\335\333\333\333\341\341\341\333\333"
+ "\333\314\314\315\377\376\376\376\325\376\376\376\11\256\263\231\177\177\177"
+ "\220\220\217\240\240\241\261\261\260\273\273\302\314\314\315\327\327\327"
+ "\341\341\341\202\345\345\346\202\334\334\341\13\346\346\355\360\360\365\351"
+ "\351\355\334\334\341\327\327\335\341\341\346\360\360\365\362\362\366\354"
+ "\354\361\351\351\355\354\354\361\202\362\362\366\4\327\327\335\305\305\315"
+ "\327\327\335\365\365\371\202\376\376\376\5\365\365\371\324\324\332\277\277"
+ "\310\316\316\326\356\356\364\205\376\376\376\2\371\371\374\334\334\341\202"
+ "\277\277\310\2\327\327\335\362\362\366\204\376\376\376\21\365\365\371\341"
+ "\341\346\312\312\322\306\306\310\314\314\315\327\327\327\351\351\351\360"
+ "\360\365\365\365\371\365\365\365\362\362\366\365\365\365\365\365\371\365"
+ "\365\365\361\361\361\355\355\355\351\351\351\206\345\345\340\203\352\352"
+ "\343\1\355\355\351\211\361\361\354\202\355\355\351\206\352\352\343\1\355"
+ "\355\351\202\361\361\354\203\361\361\361\203\355\355\355\4\356\356\361\365"
+ "\365\371\374\374\376\376\376\376\202\371\371\374\2\356\356\364\341\341\346"
+ "\202\327\327\335!\341\341\346\354\354\361\360\360\365\362\362\366\374\374"
+ "\376\376\376\376\374\372\374\365\365\371\360\360\365\365\365\371\374\374"
+ "\376\376\376\376\365\365\371\344\344\354\351\351\360\356\356\364\344\344"
+ "\354\344\344\351\351\351\355\362\362\366\365\365\371\346\346\355\344\344"
+ "\351\365\365\371\371\371\374\365\365\371\362\362\366\356\356\364\344\344"
+ "\351\324\324\332\334\334\341\333\333\333\314\314\315\377\376\376\376\325"
+ "\376\376\376\27\215\216\206\205\205\206\227\227\231\253\252\253\267\267\272"
+ "\306\306\310\322\322\323\333\333\333\341\341\346\344\344\351\341\341\341"
+ "\334\334\341\341\341\346\356\356\361\356\356\364\341\341\346\327\327\335"
+ "\334\334\341\354\354\361\360\360\365\354\354\361\351\351\360\354\354\361"
+ "\202\362\362\366\4\341\341\346\312\312\322\324\324\332\365\365\371\202\376"
+ "\376\376\5\371\371\374\334\334\341\277\277\310\312\312\322\351\351\360\205"
+ "\376\376\376\6\365\365\371\334\334\341\273\273\302\305\305\315\341\341\346"
+ "\371\371\374\204\376\376\376\2\360\360\365\327\327\335\202\306\306\310\3"
+ "\322\322\323\341\341\346\362\362\366\205\365\365\371\4\365\365\365\361\361"
+ "\361\351\351\351\352\352\343\203\345\345\340\5\352\352\343\357\357\346\361"
+ "\361\354\365\365\361\370\370\365\202\371\371\371\2\374\374\372\374\374\374"
+ "\211\376\376\376\1\376\376\374\202\374\374\372\3\371\371\371\370\370\365"
+ "\365\365\361\202\361\361\354\202\357\357\346\1\355\355\351\202\361\361\354"
+ "\203\361\361\361\203\355\355\355\16\362\362\366\371\371\374\376\376\376\374"
+ "\372\374\371\371\374\360\360\365\334\334\341\322\322\323\316\316\326\334"
+ "\334\341\351\351\360\356\356\364\362\362\366\374\372\374\202\376\376\376"
+ "\3\371\371\374\365\365\371\371\371\374\202\376\376\376\4\362\362\366\344"
+ "\344\354\354\354\361\351\351\360\202\341\341\346\16\346\346\355\362\362\366"
+ "\365\365\371\344\344\351\346\346\355\365\365\371\371\371\374\365\365\371"
+ "\362\362\366\351\351\355\327\327\335\322\322\323\327\327\327\314\314\315"
+ "\377\376\376\376\324\376\376\376\13\256\263\231\177\177\177\220\220\217\240"
+ "\240\241\261\261\260\273\273\302\314\314\315\324\324\332\341\341\341\344"
+ "\344\351\341\341\341\202\334\334\341\3\354\354\361\362\362\366\351\351\355"
+ "\202\327\327\335\13\344\344\351\360\360\365\356\356\364\354\354\361\351\351"
+ "\360\356\356\364\362\362\366\344\344\351\312\312\322\324\324\332\360\360"
+ "\365\203\376\376\376\7\346\346\355\305\305\315\312\312\322\346\346\355\374"
+ "\374\376\376\376\376\374\374\376\202\376\376\376\6\365\365\371\327\327\335"
+ "\277\277\310\312\312\322\354\354\361\374\374\376\204\376\376\376\6\354\354"
+ "\361\322\322\323\306\306\310\314\314\315\334\334\341\356\356\364\202\371"
+ "\371\374\203\371\371\371\3\365\365\365\355\355\355\352\352\343\202\345\345"
+ "\340\10\352\352\343\357\357\346\361\361\354\365\365\361\370\370\365\374\372"
+ "\374\374\374\374\374\374\376\224\376\376\376\4\376\376\374\374\374\372\370"
+ "\370\365\365\365\361\205\361\361\354\202\361\361\361\203\355\355\355\16\356"
+ "\356\361\365\365\371\376\376\376\374\374\376\371\371\374\362\362\366\334"
+ "\334\341\316\316\326\312\312\322\324\324\332\344\344\351\354\354\361\362"
+ "\362\366\374\372\374\202\376\376\376\3\371\371\374\365\365\371\371\371\374"
+ "\202\376\376\376\4\360\360\365\344\344\354\354\354\361\344\344\354\202\341"
+ "\341\346\1\351\351\355\202\362\362\366\2\341\341\346\351\351\355\202\365"
+ "\365\371\6\362\362\366\354\354\361\341\341\346\312\312\322\316\316\326\314"
+ "\314\315\367\376\376\376\2\360\255p\361\266\177\332\376\376\376\12\215\216"
+ "\206\205\205\206\227\227\231\253\252\253\267\267\272\306\306\310\322\322"
+ "\323\333\333\333\341\341\346\344\344\351\202\334\334\341\1\344\344\351\202"
+ "\360\360\365\15\341\341\346\324\324\332\334\334\341\351\351\360\360\360\365"
+ "\354\354\361\351\351\360\354\354\361\360\360\365\346\346\355\324\324\332"
+ "\312\312\322\346\346\355\203\376\376\376\16\360\360\365\316\316\326\277\277"
+ "\310\334\334\341\371\371\374\376\376\376\374\372\374\374\374\376\376\376"
+ "\376\371\371\371\327\327\335\277\277\310\312\312\322\354\354\361\205\376"
+ "\376\376\6\354\354\361\324\324\332\306\306\310\322\322\323\341\341\346\365"
+ "\365\371\202\374\374\376\202\371\371\374\3\365\365\371\361\361\361\355\355"
+ "\351\202\345\345\340\202\352\352\343\3\355\355\351\361\361\361\365\365\361"
+ "\235\365\365\365\3\361\361\361\361\361\354\355\355\351\203\352\352\343\204"
+ "\351\351\351\17\351\351\355\356\356\361\365\365\371\376\376\376\374\372\374"
+ "\371\371\374\360\360\365\334\334\341\312\312\322\305\305\315\316\316\326"
+ "\341\341\346\354\352\362\362\362\366\371\371\374\202\376\376\376\5\374\372"
+ "\374\371\371\374\374\374\376\376\376\376\374\374\376\202\351\351\360\11\354"
+ "\354\361\341\341\346\334\334\341\341\341\346\351\351\355\365\365\371\356"
+ "\356\364\341\341\346\354\354\361\202\365\365\371\3\356\356\361\345\345\346"
+ "\322\322\323\202\306\306\310\370\376\376\376\3\356\244`\352\2110\371\343"
+ "\316\217\376\376\376\1\373\354\336\307\376\376\376\13\273\301\235\177\177"
+ "\177\220\220\217\240\240\241\261\261\260\273\273\302\314\314\315\327\327"
+ "\327\334\334\341\344\344\351\341\341\341\202\334\334\341\3\356\356\361\365"
+ "\365\371\351\351\355\202\327\327\335\1\344\344\351\202\356\356\364\202\354"
+ "\354\361\6\356\356\364\354\354\361\327\327\335\312\312\322\334\334\341\374"
+ "\372\374\202\376\376\376\6\365\365\371\324\324\332\277\277\310\324\324\332"
+ "\362\362\366\374\374\376\202\371\371\374\6\376\376\376\371\371\374\334\334"
+ "\341\277\277\310\312\312\322\354\354\361\204\376\376\376\7\374\374\376\351"
+ "\351\355\322\322\323\314\314\315\327\327\335\351\351\355\371\371\374\202"
+ "\376\376\376\4\374\374\376\371\371\374\365\365\365\355\355\351\204\352\352"
+ "\343\1\326\343z\205\343\346\177\204\342\346x\1\351\352u\203\343\352l\3\336"
+ "\351g\332\352b\332\344`\203\324\344V\203\316\350Q\202\312\346M\203\304\341"
+ "M\215\275\333G\23\271\326C\315\333}\341\341\341\345\345\346\351\351\351\354"
+ "\354\361\365\365\371\374\372\374\374\374\376\371\371\374\360\360\365\327"
+ "\327\335\305\305\315\277\277\310\312\312\322\334\334\341\354\352\362\360"
+ "\360\365\371\371\374\202\376\376\376\202\374\374\376\202\376\376\376\4\365"
+ "\365\371\344\344\354\354\354\361\346\346\355\202\334\334\341\12\341\341\346"
+ "\354\354\361\365\365\371\351\351\355\341\341\346\360\360\365\365\365\371"
+ "\356\356\364\351\351\355\327\327\335\202\302\302\302\371\376\376\376\3\352"
+ "\2110\347x\20\371\343\316\216\376\376\376\1\355\233P\307\376\376\376\12\231"
+ "\232\217\205\205\206\227\227\231\245\245\247\264\264\265\302\302\302\316"
+ "\316\326\333\333\333\341\341\346\344\344\351\202\334\334\341\10\346\346\355"
+ "\365\365\371\360\360\365\334\334\341\324\324\332\334\334\341\354\354\361"
+ "\360\360\365\202\354\354\361\6\356\356\364\354\354\361\334\334\341\312\312"
+ "\322\324\324\332\365\365\371\203\376\376\376\4\341\341\346\277\277\310\312"
+ "\312\322\351\351\360\203\371\371\374\6\374\374\376\371\371\371\334\334\341"
+ "\277\277\310\316\316\326\360\360\365\205\376\376\376\5\346\346\355\322\322"
+ "\323\314\314\315\334\334\341\365\365\365\204\376\376\376\2\371\371\371\361"
+ "\361\354\202\352\352\343\1\357\357\346\202\365\365\361\3\352\352\343\315"
+ "\333}\373\370\226\204\357\354\205\204\353\352\177\205\351\352u\202\343\352"
+ "l\4\340\360u\336\360s\333\356m\336\351g\202\326\354c\202\322\354]\202\320"
+ "\352Y\203\311\350T\202\304\341M\203\275\333G\2\271\333@\271\326C\202\264"
+ "\322@\202\261\3217\24\246\306(\274\320e\322\322\323\337\337\331\345\345\346"
+ "\351\351\355\355\355\355\360\360\365\374\372\374\374\374\376\371\371\374"
+ "\360\360\365\324\324\332\305\305\315\277\277\310\305\305\315\327\327\335"
+ "\346\346\355\360\360\365\371\371\374\206\376\376\376\4\360\360\365\346\346"
+ "\355\354\352\362\344\344\351\202\334\334\341\3\341\341\346\356\356\364\365"
+ "\365\371\202\344\344\351\6\362\362\366\360\360\365\351\351\355\334\334\341"
+ "\306\306\310\267\267\272\371\376\376\376\4\366\321\256\345o\0\347x\20\371"
+ "\343\316\215\376\376\376\2\365\310\236\355\233P\305\376\376\376\20\312\316"
+ "\253\205\205\206\212\212\214\235\235\234\255\255\260\274\274\274\314\314"
+ "\315\327\327\327\334\334\341\344\344\351\341\341\341\334\334\341\341\341"
+ "\346\360\360\365\365\365\371\351\351\355\202\327\327\335\3\344\344\351\360"
+ "\360\365\356\356\364\202\354\354\361\5\356\356\364\344\344\354\316\316\326"
+ "\312\312\322\351\351\355\203\376\376\376\4\362\362\366\312\312\322\305\305"
+ "\315\334\334\341\203\365\365\371\202\371\371\374\4\344\344\351\305\305\315"
+ "\312\312\322\360\360\365\205\376\376\376\5\354\354\361\322\322\323\314\314"
+ "\315\341\341\341\365\365\371\204\376\376\376\2\365\365\365\355\355\351\202"
+ "\352\352\343\7\361\361\354\370\370\365\376\376\376\371\371\371\345\345\340"
+ "\274\320e\373\370\226\206\353\352\177\205\351\352u\202\343\352l\203\336\351"
+ "g\203\332\352b\202\324\351^\202\320\352Y\1\320\350U\203\311\350T\203\304"
+ "\341M\204\275\333G\203\271\326C\202\264\322@\6\256\3170\274\320e\302\302"
+ "\302\322\322\323\341\341\341\345\345\346\202\351\351\355\15\362\362\366\374"
+ "\372\374\376\376\376\371\371\374\351\351\360\316\316\326\277\277\310\273"
+ "\273\302\277\277\310\327\327\335\351\351\360\360\360\365\374\372\374\205"
+ "\376\376\376\1\374\374\376\202\351\351\360\16\346\346\355\334\334\341\327"
+ "\327\335\334\334\341\344\344\351\362\362\366\356\356\364\341\341\346\351"
+ "\351\360\360\360\365\351\351\355\341\341\341\316\316\326\267\267\272\372"
+ "\376\376\376\202\345o\0\1\352\2110\216\376\376\376\2\345o\0\370\332\276\304"
+ "\376\376\376\12\244\246\230\205\205\206\223\223\224\245\245\247\264\264\265"
+ "\302\302\302\314\314\315\327\327\335\341\341\346\345\345\346\202\334\334"
+ "\341\20\354\354\361\365\365\371\362\362\366\341\341\346\324\324\332\334\334"
+ "\341\351\351\360\360\360\365\356\356\361\354\354\361\356\356\364\351\351"
+ "\360\327\327\335\305\305\315\341\341\346\374\372\374\202\376\376\376\15\374"
+ "\372\374\334\334\341\277\277\310\324\324\332\354\354\361\365\365\371\362"
+ "\362\366\365\365\371\371\371\374\351\351\360\312\312\322\305\305\315\354"
+ "\354\361\205\376\376\376\5\361\361\361\327\327\327\322\322\323\341\341\341"
+ "\365\365\371\203\376\376\376\7\374\374\374\365\365\361\357\357\346\352\352"
+ "\343\357\357\346\370\370\365\374\374\372\202\376\376\376\4\365\365\365\337"
+ "\337\331\274\320e\373\370\226\203\357\354\205\203\353\352\177\205\351\352"
+ "u\203\343\352l\203\336\351g\1\332\352b\202\326\354_\1\322\354]\202\320\352"
+ "Y\1\320\350U\202\311\350T\1\312\346M\203\304\341M\202\275\333G\2\271\333"
+ "@\275\333G\203\271\326C\202\264\322@\7\256\3170\256\302]\264\264\265\314"
+ "\314\315\333\333\333\345\345\346\351\351\351\202\351\351\355\6\362\362\366"
+ "\374\372\374\374\374\376\365\365\371\346\346\355\312\312\322\202\273\273"
+ "\302\5\277\277\310\327\327\335\351\351\360\360\360\365\374\372\374\205\376"
+ "\376\376\4\365\365\371\346\346\355\351\351\360\341\341\346\202\327\327\335"
+ "\5\334\334\341\344\344\354\362\362\366\346\346\355\341\341\346\202\351\351"
+ "\355\3\341\341\346\324\324\332\273\273\302\345\376\376\376\4\361\266\177"
+ "\356\244`\363\277\216\371\343\316\221\376\376\376\203\345o\0\1\366\321\256"
+ "\215\376\376\376\202\352\2110\304\376\376\376\17\215\216\206\212\212\214"
+ "\235\235\234\253\252\253\267\267\272\306\306\310\322\322\323\333\333\333"
+ "\345\345\346\341\341\341\327\327\335\341\341\346\365\365\371\371\371\374"
+ "\354\354\361\202\327\327\335\1\341\341\346\202\356\356\364\7\354\354\361"
+ "\356\356\364\354\354\361\341\341\346\312\312\322\324\324\332\365\365\371"
+ "\203\376\376\376\1\354\354\361\202\305\305\315\1\344\344\354\203\362\362"
+ "\366\5\365\365\371\356\356\361\316\316\326\305\305\315\344\344\351\205\376"
+ "\376\376\5\361\361\361\333\333\333\322\322\323\345\345\346\371\371\371\203"
+ "\376\376\376\6\374\374\374\365\365\361\357\357\346\352\352\343\361\361\354"
+ "\371\371\371\202\376\376\376\6\374\374\374\371\371\371\361\361\361\333\333"
+ "\333\256\302]\373\370\226\205\376\376\212\202\374\374z\1\360\362x\203\351"
+ "\352u\203\343\352l\202\336\351g\202\332\352b\202\324\351^\1\322\354]\202"
+ "\320\352Y\203\311\350T\204\304\341M\202\275\333G\2\271\326C\271\333@\202"
+ "\271\326C\203\264\322@\6\256\3170\256\302]\261\261\260\314\314\315\333\333"
+ "\333\345\345\346\203\351\351\351\2\351\351\355\360\360\365\202\374\374\376"
+ "\3\365\365\371\344\344\351\305\305\315\202\263\263\277\5\277\277\310\327"
+ "\327\335\351\351\360\362\362\366\374\374\376\205\376\376\376\1\356\356\364"
+ "\202\346\346\355\1\334\334\341\202\327\327\335\3\334\334\341\351\351\355"
+ "\360\360\365\202\341\341\346\4\351\351\355\341\341\346\327\327\327\302\302"
+ "\302\346\376\376\376\5\370\332\276\353\222@\345o\0\350\200\40\365\310\236"
+ "\217\376\376\376\203\345o\0\1\356\244`\215\376\376\376\3\350\200\40\345o"
+ "\0\371\343\316\302\376\376\376\12\273\301\235\177\177\177\220\220\217\245"
+ "\245\247\261\261\260\302\302\302\314\314\315\324\324\332\341\341\341\345"
+ "\345\346\202\334\334\341\17\354\354\361\371\371\374\365\365\371\344\344\351"
+ "\324\324\332\334\334\341\351\351\355\356\356\364\356\356\361\354\354\361"
+ "\356\356\364\344\344\354\316\316\326\312\312\322\351\351\355\203\376\376"
+ "\376\5\365\365\371\324\324\332\277\277\310\327\327\335\356\356\364\202\360"
+ "\360\365\5\362\362\366\356\356\364\324\324\332\305\305\315\344\344\351\205"
+ "\376\376\376\5\365\365\371\333\333\333\322\322\323\345\345\346\371\371\371"
+ "\203\376\376\376\16\371\371\371\361\361\354\352\352\343\357\357\346\370\370"
+ "\365\374\374\372\376\376\376\374\374\376\371\371\371\365\365\365\361\361"
+ "\361\341\341\341\302\302\302z\200Y\203\\\\^\5jjkz\200Y\231\236v\273\306t"
+ "\342\346x\203\374\374z\2\360\362x\343\352l\204\336\351g\4\332\352b\326\354"
+ "_\324\351^\322\354]\202\320\352Y\1\320\350U\203\311\350T\203\304\341M\203"
+ "\275\333G\204\271\326C\203\264\322@\10\256\3170\256\302]\253\252\253\314"
+ "\314\315\345\345\346\355\355\355\351\351\351\345\345\346\202\344\344\351"
+ "\2\351\351\355\362\362\366\202\374\374\376\3\365\365\371\334\334\341\273"
+ "\273\302\202\263\263\277\4\277\277\310\327\327\335\351\351\360\365\365\371"
+ "\205\376\376\376\4\371\371\374\351\351\355\351\351\360\341\341\346\202\324"
+ "\324\332\5\327\327\335\334\334\341\354\354\361\351\351\355\334\334\341\202"
+ "\341\341\346\2\327\327\335\306\306\310\350\376\376\376\1\356\244`\202\345"
+ "o\0\2\352\2110\373\354\336\214\376\376\376\1\365\310\236\203\345o\0\1\353"
+ "\222@\214\376\376\376\1\373\354\336\202\345o\0\1\361\266\177\302\376\376"
+ "\376\10\244\246\230\205\205\206\227\227\231\253\252\253\267\267\272\306\306"
+ "\310\322\322\323\327\327\335\202\341\341\346\10\334\334\341\341\341\346\365"
+ "\365\371\374\374\376\362\362\366\334\334\341\327\327\335\341\341\346\202"
+ "\356\356\364\7\354\354\361\356\356\364\354\354\361\334\334\341\305\305\315"
+ "\327\327\335\371\371\371\203\376\376\376\4\344\344\351\277\277\310\312\312"
+ "\322\344\344\351\202\356\356\364\202\360\360\365\4\334\334\341\305\305\315"
+ "\324\324\332\371\371\371\204\376\376\376\5\376\376\374\345\345\346\327\327"
+ "\327\341\341\341\365\365\365\203\376\376\376\17\374\372\374\361\361\354\352"
+ "\352\343\357\357\346\370\370\365\374\374\374\371\371\371\355\355\355\322"
+ "\322\323\261\261\260\212\212\214jjkIILvvwIIL\207557\5IIL\\\\^z\200Y\274\320"
+ "e\346\374f\202\370\376k\202\336\351g\202\332\352b\202\324\351^\203\320\352"
+ "Y\203\311\350T\1\312\346M\203\304\341M\203\275\333G\1\271\333@\203\271\326"
+ "C\202\264\322@\12\271\326C\256\3170\256\302]\253\252\253\314\314\315\351"
+ "\351\351\365\365\365\361\361\361\351\351\351\345\345\346\202\344\344\351"
+ "\6\351\351\355\365\365\371\376\376\376\374\374\376\356\356\364\312\312\322"
+ "\203\263\263\277\4\277\277\310\341\341\346\356\356\364\371\371\374\205\376"
+ "\376\376\4\360\360\365\351\351\360\346\346\355\327\327\335\202\324\324\332"
+ "\10\327\327\335\341\341\346\356\356\361\341\341\346\327\327\335\341\341\341"
+ "\327\327\335\314\314\315\351\376\376\376\1\352\2110\202\345o\0\1\347x\20"
+ "\214\376\376\376\1\352\2110\204\345o\0\214\376\376\376\1\360\255p\202\345"
+ "o\0\1\353\222@\302\376\376\376\11\215\216\206\212\212\214\240\240\241\255"
+ "\255\260\274\274\274\314\314\315\324\324\332\334\334\341\344\344\351\202"
+ "\334\334\341\1\354\354\361\202\371\371\374\5\351\351\360\327\327\335\334"
+ "\334\341\351\351\355\356\356\364\202\354\354\361\5\356\356\364\344\344\354"
+ "\316\316\326\312\312\322\354\354\361\203\376\376\376\5\365\365\371\316\316"
+ "\326\277\277\310\327\327\335\351\351\360\202\356\356\364\5\360\360\365\341"
+ "\341\346\305\305\315\316\316\326\360\360\365\205\376\376\376\4\356\356\361"
+ "\333\333\333\341\341\341\365\365\361\203\376\376\376\12\374\372\374\361\361"
+ "\354\352\352\343\357\357\346\365\365\365\351\351\355\306\306\310\212\212"
+ "\214IIL!\"!\204\0\0\0\5IILjjk\177\177\177vvwjjk\202\\\\^\1IIL\202557\202"
+ "IIL\4\\\\^jjkz\200Y\305\327T\202\370\376k\4\332\344`\324\351^\326\354_\324"
+ "\351^\202\320\352Y\1\320\350U\203\311\350T\204\304\341M\203\275\333G\204"
+ "\271\326C\202\264\322@\12\271\326C\256\3170\232\256S\245\245\247\314\314"
+ "\315\351\351\351\371\371\371\376\376\376\362\362\366\351\351\351\202\341"
+ "\341\346\7\344\344\351\351\351\360\371\371\374\374\374\376\371\371\374\344"
+ "\344\354\305\305\315\203\263\263\277\4\305\305\315\344\344\354\360\360\365"
+ "\371\371\374\204\376\376\376\1\371\371\374\202\351\351\360\1\341\341\346"
+ "\203\324\324\332\3\327\327\335\346\346\355\351\351\355\202\327\327\335\2"
+ "\327\327\327\314\314\315\351\376\376\376\1\365\310\236\203\345o\0\1\353\222"
+ "@\212\376\376\376\1\363\277\216\205\345o\0\213\376\376\376\1\370\332\276"
+ "\203\345o\0\1\353\222@\301\376\376\376\10\273\301\235\177\177\177\223\223"
+ "\224\245\245\247\264\264\265\302\302\302\314\314\315\327\327\327\202\341"
+ "\341\346\10\334\334\341\341\341\346\365\365\371\376\376\376\365\365\371\341"
+ "\341\346\327\327\335\341\341\346\202\356\356\364\7\354\354\361\356\356\364"
+ "\354\354\361\327\327\335\312\312\322\334\334\341\371\371\374\203\376\376"
+ "\376\4\344\344\351\277\277\310\312\312\322\341\341\346\202\354\354\361\5"
+ "\356\356\364\346\346\355\316\316\326\305\305\315\351\351\355\205\376\376"
+ "\376\1\365\365\365\202\337\337\331\2\361\361\361\374\374\374\202\376\376"
+ "\376\10\374\374\372\361\361\354\352\352\343\357\357\346\327\327\327\235\235"
+ "\234\\\\^\14\14\15\203\0\0\0\6!\"!\\\\^\177\177\177\220\220\217557z\200Y"
+ "\203\231\236v\2\215\216\206\212\212\214\202\205\205\206\2\177\177\177vvw"
+ "\202\\\\^\11vvw\212\212\214vvwz\200Y\260\301O\370\376k\335\370Z\315\347^"
+ "\324\351^\202\320\352Y\204\311\350T\204\304\341M\203\275\333G\204\271\326"
+ "C\202\264\322@\7\271\326C\256\3170\232\256S\240\240\241\306\306\310\341\341"
+ "\341\365\365\371\202\376\376\376\2\365\365\365\344\344\351\203\341\341\346"
+ "\6\354\354\361\371\371\374\374\374\376\365\365\371\334\334\341\273\273\302"
+ "\203\263\263\277\4\316\316\326\351\351\360\360\360\365\374\372\374\204\376"
+ "\376\376\5\362\362\366\351\351\360\344\344\354\324\324\332\316\316\326\202"
+ "\324\324\332\6\334\334\341\346\346\355\334\334\341\316\316\326\322\322\323"
+ "\314\314\315\352\376\376\376\204\345o\0\1\370\332\276\211\376\376\376\1\347"
+ "x\20\205\345o\0\212\376\376\376\2\366\321\256\347x\20\203\345o\0\1\355\233"
+ "P\214\376\376\376\1\373\354\336\264\376\376\376\23\244\246\230\205\205\206"
+ "\227\227\231\253\252\253\267\267\272\306\306\310\322\322\323\334\334\341"
+ "\345\345\346\341\341\346\334\334\341\351\351\355\371\371\371\374\374\376"
+ "\356\356\361\334\334\341\327\327\335\346\346\355\360\360\365\202\354\354"
+ "\361\2\356\356\364\346\346\355\202\316\316\326\1\354\354\361\203\376\376"
+ "\376\5\371\371\371\316\316\326\277\277\310\324\324\332\346\346\355\202\354"
+ "\354\361\5\351\351\360\327\327\335\305\305\315\334\334\341\374\372\374\204"
+ "\376\376\376\5\371\371\371\345\345\346\337\337\331\355\355\351\374\372\374"
+ "\202\376\376\376\6\371\371\371\361\361\354\345\345\340\314\314\315\212\212"
+ "\214557\203\0\0\0\22\14\14\15\\\\^\240\240\241\245\245\247\212\212\214jj"
+ "k\\\\^IIL\323\335i\374\374z\360\362x\343\352l\336\351g\316\344d\274\320e"
+ "\254\266l\231\232\217\220\220\217\202\215\216\206\13\177\177\177vvw\217\216"
+ "\224\255\255\260\177\177\177z\200Y\324\354W\352\376W\311\350T\320\350U\320"
+ "\352Y\203\311\350T\1\312\346M\203\304\341M\204\275\333G\203\271\326C\203"
+ "\264\322@\7\271\326C\256\3170\232\256S\245\245\247\302\302\302\337\337\331"
+ "\355\355\355\203\376\376\376\6\362\362\366\344\344\351\334\334\341\341\341"
+ "\346\344\344\351\360\360\365\202\374\374\376\2\362\362\366\312\312\322\203"
+ "\263\263\277\4\273\273\302\334\334\341\354\354\361\365\365\371\204\376\376"
+ "\376\4\371\371\374\354\354\361\346\346\355\327\327\335\202\316\316\326\202"
+ "\324\324\332\5\334\334\341\341\341\346\316\316\326\312\312\322\314\314\315"
+ "\352\376\376\376\204\345o\0\1\356\244`\210\376\376\376\1\361\266\177\206"
+ "\345o\0\211\376\376\376\1\360\255p\205\345o\0\1\363\277\216\214\376\376\376"
+ "\2\370\332\276\365\310\236\263\376\376\376\23\215\216\206\212\212\214\240"
+ "\240\241\255\255\260\274\274\274\314\314\315\327\327\327\341\341\341\344"
+ "\344\351\334\334\341\341\341\346\362\362\366\374\374\374\374\372\374\351"
+ "\351\355\327\327\335\334\334\341\354\354\361\356\356\364\203\354\354\361"
+ "\4\334\334\341\312\312\322\327\327\335\374\372\374\203\376\376\376\1\351"
+ "\351\355\202\305\305\315\2\334\334\341\351\351\360\202\354\354\361\4\341"
+ "\341\346\312\312\322\316\316\326\365\365\365\205\376\376\376\4\356\356\361"
+ "\337\337\331\345\345\340\370\370\365\202\376\376\376\5\371\371\371\361\361"
+ "\354\321\321\313\205\205\206!\"!\203\0\0\0\7!\"!vvw\267\267\272\302\302\302"
+ "\245\245\247\205\205\206jjk\202\\\\^\3jjk\315\333}\376\376\212\203\357\354"
+ "\205\21\353\352\177\343\352l\336\351g\332\344`\310\330r\273\301\235\245\245"
+ "\247\240\240\241\235\235\234\220\220\217\205\205\206\245\245\247\263\263"
+ "\277\\\\^\215\230S\370\376k\323\363P\203\311\350T\204\304\341M\204\275\333"
+ "G\205\271\326C\202\264\322@\15\271\326C\256\3170\232\256S\245\245\247\302"
+ "\302\302\330\330\320\345\345\346\365\365\361\374\374\376\376\376\376\374"
+ "\374\374\360\360\365\341\341\346\202\334\334\341\6\344\344\354\365\365\371"
+ "\376\376\376\371\371\374\341\341\346\273\273\302\203\263\263\277\4\305\305"
+ "\315\341\341\346\360\360\365\371\371\374\204\376\376\376\3\362\362\366\351"
+ "\351\360\341\341\346\202\316\316\326\5\324\324\332\316\316\326\324\324\332"
+ "\334\334\341\324\324\332\202\306\306\310\352\376\376\376\205\345o\0\210\376"
+ "\376\376\1\347x\20\206\345o\0\210\376\376\376\1\353\222@\206\345o\0\1\373"
+ "\354\336\214\376\376\376\2\370\332\276\356\244`\262\376\376\376\23\312\316"
+ "\253\177\177\177\220\220\217\245\245\247\264\264\265\302\302\302\322\322"
+ "\323\327\327\335\345\345\346\344\344\351\334\334\341\351\351\355\371\371"
+ "\371\376\376\376\371\371\371\341\341\346\327\327\335\344\344\351\360\360"
+ "\365\202\354\354\361\5\356\356\364\346\346\355\316\316\326\312\312\322\354"
+ "\354\361\203\376\376\376\13\371\371\371\324\324\332\277\277\310\324\324\332"
+ "\344\344\354\351\351\360\354\354\361\344\344\351\324\324\332\305\305\315"
+ "\351\351\355\205\376\376\376\1\371\371\371\202\345\345\340\7\365\365\361"
+ "\374\372\374\374\374\376\371\371\371\341\341\341\227\227\231557\204\0\0\0"
+ "\11jjk\306\306\310\341\341\341\314\314\315\235\235\234\177\177\177vvw\177"
+ "\177\177\205\205\206\202\212\212\214\3\273\306t\374\374z\360\362x\205\374"
+ "\374z\21\351\352u\336\351g\332\344`\323\335i\273\301\235\253\252\253\245"
+ "\245\247\235\235\234\223\223\224\220\220\217\267\267\272\217\216\224\\\\"
+ "^\346\374f\352\376W\304\341M\311\350T\204\304\341M\204\275\333G\205\271\326"
+ "C\202\264\322@\15\271\326C\261\3217\232\256S\253\252\253\314\314\315\337"
+ "\337\331\345\345\340\345\345\346\361\361\361\374\374\374\376\376\376\374"
+ "\374\376\356\356\364\203\334\334\341\5\351\351\360\371\371\374\376\376\376"
+ "\365\365\371\316\316\326\204\263\263\277\3\312\312\322\351\351\360\365\365"
+ "\371\204\376\376\376\5\371\371\374\354\354\361\344\344\354\324\324\332\312"
+ "\312\322\203\316\316\326\4\324\324\332\327\327\335\306\306\310\302\302\302"
+ "\351\376\376\376\1\370\332\276\205\345o\0\1\361\266\177\206\376\376\376\1"
+ "\363\277\216\207\345o\0\207\376\376\376\1\352\2110\206\345o\0\1\355\233P"
+ "\215\376\376\376\2\370\332\276\352\2110\262\376\376\376\11\256\263\231\205"
+ "\205\206\227\227\231\253\252\253\267\267\272\306\306\310\322\322\323\334"
+ "\334\341\345\345\346\202\341\341\346\10\361\361\361\374\374\374\376\376\376"
+ "\362\362\366\334\334\341\327\327\335\351\351\355\356\356\364\202\354\354"
+ "\361\5\356\356\364\334\334\341\312\312\322\327\327\335\371\371\374\203\376"
+ "\376\376\1\354\354\361\202\305\305\315\10\334\334\341\351\351\355\351\351"
+ "\360\351\351\355\327\327\335\305\305\315\324\324\332\371\371\371\205\376"
+ "\376\376\10\355\355\351\337\337\331\355\355\351\370\370\365\371\371\374\365"
+ "\365\365\273\273\302IIL\204\0\0\0\17""557\302\302\302\345\345\346\302\302"
+ "\302\240\240\241\205\205\206\177\177\177\205\205\206\215\216\206\227\227"
+ "\231\240\240\241\235\235\234\231\232\217jjk\\\\^\202IIL\4\\\\^z\200Y\254"
+ "\266l\332\344`\202\374\374z\17\343\352l\332\344`\324\344V\317\323\213\272"
+ "\272\264\261\261\260\253\252\253\240\240\241\223\223\224\240\240\241\245"
+ "\245\247\\\\^\310\332_\352\376W\275\333G\203\304\341M\205\275\333G\205\271"
+ "\326C\202\264\322@\6\271\326C\261\3217\232\256S\253\252\253\314\314\315\341"
+ "\341\341\202\345\345\340\6\341\341\341\355\355\355\374\374\374\376\376\376"
+ "\374\372\374\351\351\360\202\334\334\341\6\341\341\346\360\360\365\376\376"
+ "\376\374\374\376\346\346\355\273\273\302\204\263\263\277\3\327\327\335\360"
+ "\360\365\371\371\374\204\376\376\376\4\360\360\365\351\351\360\327\327\335"
+ "\312\312\322\203\316\316\326\4\312\312\322\324\324\332\312\312\322\274\274"
+ "\274\351\376\376\376\1\365\310\236\205\345o\0\1\350\200\40\206\376\376\376"
+ "\1\355\233P\207\345o\0\1\366\321\256\205\376\376\376\1\353\222@\207\345o"
+ "\0\1\365\310\236\215\376\376\376\2\360\255p\345o\0\262\376\376\376\14\231"
+ "\232\217\212\212\214\235\235\234\255\255\260\274\274\274\314\314\315\327"
+ "\327\327\341\341\341\344\344\351\341\341\346\344\344\351\365\365\371\202"
+ "\374\374\374\13\354\354\361\327\327\335\334\334\341\356\356\361\356\356\364"
+ "\351\351\360\354\354\361\351\351\360\324\324\332\312\312\322\344\344\354"
+ "\204\376\376\376\4\334\334\341\277\277\310\312\312\322\341\341\346\202\351"
+ "\351\360\4\341\341\346\312\312\322\305\305\315\344\344\351\205\376\376\376"
+ "\10\370\370\365\345\345\340\352\352\343\365\365\361\365\365\365\341\341\346"
+ "\205\205\206\14\14\15\204\0\0\0\17\177\177\177\345\345\346\314\314\315\227"
+ "\227\231\205\205\206\212\212\214\215\216\206\220\220\217\235\235\234\240"
+ "\240\241\212\212\214jjkIILvvwjjk\203IIL\26""557IIL\\\\^jjkz\200Y\305\327"
+ "T\374\374z\343\352l\336\351g\320\350U\323\335i\312\316\253\274\274\274\272"
+ "\272\264\253\252\253\235\235\234\220\220\217\227\227\231\\\\^\273\306t\352"
+ "\376W\275\333G\202\304\341M\205\275\333G\205\271\326C\202\264\322@\13\271"
+ "\326C\261\3217\232\256S\253\252\253\314\314\315\345\345\346\355\355\351\345"
+ "\345\340\337\337\331\334\334\341\361\361\361\202\376\376\376\11\365\365\371"
+ "\344\344\351\327\327\335\334\334\341\344\344\354\365\365\371\376\376\376"
+ "\365\365\371\316\316\326\204\263\263\277\4\305\305\315\351\351\360\362\362"
+ "\366\374\374\376\203\376\376\376\3\365\365\371\351\351\360\341\341\346\202"
+ "\316\316\326\3\324\324\332\316\316\326\305\305\315\202\316\316\326\1\274"
+ "\274\274\351\376\376\376\1\361\266\177\206\345o\0\1\361\266\177\205\376\376"
+ "\376\1\353\222@\207\345o\0\1\356\244`\204\376\376\376\1\365\310\236\207\345"
+ "o\0\1\347x\20\216\376\376\376\2\347x\20\345o\0\262\376\376\376\31\205\205"
+ "\206\220\220\217\245\245\247\264\264\265\302\302\302\322\322\323\327\327"
+ "\335\345\345\346\344\344\351\341\341\346\354\354\361\374\372\374\376\376"
+ "\376\374\372\374\346\346\355\334\334\341\344\344\351\360\360\365\354\354"
+ "\361\351\351\360\356\356\364\344\344\351\312\312\322\316\316\326\365\365"
+ "\371\203\376\376\376\13\362\362\366\312\312\322\277\277\310\324\324\332\346"
+ "\346\355\351\351\360\346\346\355\327\327\335\277\277\310\322\322\323\371"
+ "\371\371\205\376\376\376\6\355\355\351\345\345\340\355\355\351\365\365\361"
+ "\306\306\310557\202\0\0\0\1\14\14\15\202\0\0\0\13\302\302\302\345\345\346"
+ "\245\245\247\205\205\206\212\212\214\223\223\224\231\232\217\235\235\234"
+ "\212\212\214IIL\14\14\15\203\0\0\0\6jjkvvw\220\220\217\205\205\206\177\177"
+ "\177vvw\202\\\\^\25\177\177\177\245\245\247\177\177\177z\200Y\374\374z\346"
+ "\374f\332\352b\324\354W\324\351^\307\322\237\306\306\310\302\302\302\267"
+ "\267\272\245\245\247\223\223\224\177\177\177\\\\^\254\266l\352\376W\271\333"
+ "@\304\341M\204\275\333G\211\271\326C\13\261\3217\232\256S\245\245\247\314"
+ "\314\315\345\345\346\365\365\361\355\355\351\337\337\331\327\327\327\334"
+ "\334\341\361\361\361\202\376\376\376\5\362\362\366\341\341\346\327\327\335"
+ "\334\334\341\354\352\362\202\376\376\376\2\346\346\355\273\273\302\204\263"
+ "\263\277\3\327\327\335\360\360\365\371\371\374\203\376\376\376\5\374\372"
+ "\374\356\356\364\351\351\355\324\324\332\312\312\322\202\316\316\326\202"
+ "\305\305\315\2\312\312\322\273\273\302\326\376\376\376\3\371\343\316\363"
+ "\277\216\356\244`\203\353\222@\3\355\233P\363\277\216\373\354\336\212\376"
+ "\376\376\1\361\266\177\207\345o\0\1\370\332\276\204\376\376\376\1\353\222"
+ "@\210\345o\0\1\373\354\336\203\376\376\376\1\353\222@\207\345o\0\1\356\244"
+ "`\215\376\376\376\1\355\233P\202\345o\0\261\376\376\376\23\312\316\253\205"
+ "\205\206\223\223\224\245\245\247\267\267\272\306\306\310\322\322\323\334"
+ "\334\341\345\345\346\341\341\346\344\344\351\362\362\366\374\374\374\376"
+ "\376\376\365\365\371\341\341\346\334\334\341\354\354\361\360\360\365\202"
+ "\354\354\361\4\356\356\364\334\334\341\312\312\322\341\341\346\204\376\376"
+ "\376\4\344\344\351\277\277\310\305\305\315\334\334\341\202\351\351\360\4"
+ "\341\341\346\312\312\322\305\305\315\351\351\355\205\376\376\376\1\365\365"
+ "\365\202\345\345\340\4\351\351\351\223\223\224\14\14\15\0\0\0\202\14\14\15"
+ "\13\0\0\0!\"!\322\322\323\327\327\327\220\220\217\205\205\206\223\223\224"
+ "\240\240\241\245\245\247\212\212\214557\203\0\0\0\5""557\212\212\214\220"
+ "\220\217jjk\205\205\206\202\227\227\231\4\231\232\217\223\223\224\220\220"
+ "\217\215\216\206\202\205\205\206\11\240\240\241\227\227\231IIL\374\374z\352"
+ "\376W\324\351^\320\352Y\316\350Q\317\323\213\202\314\314\315\10\302\302\302"
+ "\261\261\260\227\227\231jjkIIL\256\263\231\352\376W\267\3309\204\275\333"
+ "G\211\271\326C\14\261\3217\232\256S\235\235\234\306\306\310\345\345\346\370"
+ "\370\365\365\365\365\341\341\341\327\327\327\322\322\323\333\333\333\365"
+ "\365\371\202\376\376\376\10\356\356\364\334\334\341\327\327\335\341\341\346"
+ "\365\365\371\376\376\376\371\371\374\316\316\326\202\263\263\277\6\273\273"
+ "\302\263\263\277\277\277\310\346\346\355\365\365\371\374\374\376\203\376"
+ "\376\376\12\362\362\366\354\352\362\327\327\335\312\312\322\316\316\326\322"
+ "\322\323\312\312\322\277\277\310\306\306\310\302\302\302\326\376\376\376"
+ "\202\370\332\276\3\366\321\256\360\255p\347x\20\204\345o\0\1\361\266\177"
+ "\211\376\376\376\1\361\266\177\207\345o\0\2\347x\20\371\343\316\203\376\376"
+ "\376\1\361\266\177\210\345o\0\1\355\233P\203\376\376\376\210\345o\0\1\361"
+ "\266\177\213\376\376\376\2\370\332\276\352\2110\202\345o\0\1\347x\20\261"
+ "\376\376\376\17\256\263\231\212\212\214\227\227\231\253\252\253\274\274\274"
+ "\314\314\315\327\327\327\341\341\341\351\351\351\341\341\346\351\351\355"
+ "\371\371\371\374\374\374\376\376\376\362\362\366\202\341\341\346\202\360"
+ "\360\365\6\354\354\361\356\356\361\354\354\361\324\324\332\316\316\326\356"
+ "\356\361\203\376\376\376\13\374\374\376\327\327\335\273\273\302\312\312\322"
+ "\344\344\351\351\351\360\346\346\355\327\327\335\277\277\310\324\324\332"
+ "\371\371\371\205\376\376\376\4\352\352\343\337\337\331\327\327\327vvw\202"
+ "\0\0\0\1\14\14\15\202\0\0\0\1""557\202\261\261\260\6\205\205\206\212\212"
+ "\214\227\227\231\253\252\253\240\240\241IIL\204\0\0\0\11\205\205\206\322"
+ "\322\323\253\252\253vvwIIL\260\301O\323\335i\273\306t\256\263\231\203\261"
+ "\261\260\26\253\252\253\245\245\247\227\227\231\220\220\217vvwIIL\357\375"
+ "\216\335\370Z\324\351^\320\352Y\312\346M\317\323\213\302\302\302\313\313"
+ "\301\302\302\302\264\264\265\240\240\241\\\\^IIL\273\301\235\323\363P\271"
+ "\333@\203\275\333G\211\271\326C\23\261\3217\232\256S\235\235\234\302\302"
+ "\302\341\341\341\370\370\365\376\376\376\355\355\355\333\333\333\322\322"
+ "\323\314\314\315\341\341\346\371\371\374\376\376\376\371\371\374\344\344"
+ "\351\324\324\332\327\327\335\354\354\361\202\376\376\376\1\344\344\351\202"
+ "\263\263\277\1\273\273\302\202\263\263\277\3\324\324\332\360\360\365\371"
+ "\371\374\203\376\376\376\3\371\371\371\354\354\361\341\341\346\202\312\312"
+ "\322\3\316\316\326\312\312\322\277\277\310\202\273\273\302\333\376\376\376"
+ "\1\356\244`\204\345o\0\1\353\222@\210\376\376\376\1\361\266\177\211\345o"
+ "\0\1\361\266\177\202\376\376\376\1\373\354\336\204\345o\0\2\352\2110\350"
+ "\200\40\203\345o\0\1\363\277\216\202\376\376\376\210\345o\0\1\370\332\276"
+ "\210\376\376\376\3\371\343\316\361\266\177\352\2110\204\345o\0\1\355\233"
+ "P\261\376\376\376\10\231\232\217\212\212\214\240\240\241\255\255\260\302"
+ "\302\302\322\322\323\333\333\333\345\345\346\202\344\344\351\17\354\354\361"
+ "\374\372\374\374\374\374\376\376\376\360\360\365\334\334\341\346\346\355"
+ "\362\362\366\356\356\364\354\354\361\360\360\365\346\346\355\316\316\326"
+ "\334\334\341\371\371\374\203\376\376\376\12\365\365\371\312\312\322\277\277"
+ "\310\324\324\332\346\346\355\351\351\360\341\341\346\316\316\326\277\277"
+ "\310\344\344\351\205\376\376\376\4\370\370\365\337\337\331\261\261\260jj"
+ "k\202\0\0\0\1\14\14\15\202\0\0\0\1""557\202vvw\6\177\177\177\220\220\217"
+ "\240\240\241\261\261\260\212\212\214\14\14\15\203\0\0\0\15""557\314\314\315"
+ "\333\333\333\274\274\274\212\212\214\177\177\177vvw\256\302]\374\374z\332"
+ "\344`\323\335i\307\322\237\306\306\310\202\314\314\315\14\302\302\302\264"
+ "\264\265\240\240\241\205\205\206557\\\\^\376\376\212\316\350Q\315\347^\346"
+ "\374f\303\343C\231\236v\202\313\313\301\3\302\302\302\272\272\264\240\240"
+ "\241\202IIL\2\357\375\216\271\336:\203\275\333G\211\271\326C\15\261\3217"
+ "\232\256S\235\235\234\272\272\264\337\337\331\365\365\365\376\376\376\371"
+ "\371\371\341\341\341\322\322\323\314\314\315\316\316\326\354\354\361\202"
+ "\376\376\376\17\360\360\365\334\334\341\324\324\332\341\341\346\371\371\374"
+ "\376\376\376\365\365\371\305\305\315\263\263\277\273\273\302\277\277\310"
+ "\263\263\277\277\277\310\346\346\355\365\365\371\203\376\376\376\5\374\374"
+ "\376\360\360\365\344\344\354\312\312\322\305\305\315\202\316\316\326\1\277"
+ "\277\310\202\267\267\272\334\376\376\376\1\353\222@\204\345o\0\1\356\244"
+ "`\207\376\376\376\1\363\277\216\212\345o\0\4\355\233P\373\354\336\376\376"
+ "\376\371\343\316\210\376\376\376\1\370\332\276\202\376\376\376\1\350\200"
+ "\40\207\345o\0\1\370\332\276\205\376\376\376\3\373\354\336\360\255p\350\200"
+ "\40\207\345o\0\1\370\332\276\260\376\376\376\31\362\370\317\215\216\206\220"
+ "\220\217\240\240\241\264\264\265\306\306\310\322\322\323\334\334\341\345"
+ "\345\346\344\344\351\346\346\355\362\362\366\374\374\374\376\376\376\374"
+ "\374\376\354\354\361\341\341\346\354\354\361\362\362\366\356\356\364\354"
+ "\354\361\360\360\365\341\341\346\316\316\326\351\351\355\204\376\376\376"
+ "\1\354\354\361\202\305\305\315\7\334\334\341\351\351\360\346\346\355\327"
+ "\327\335\277\277\310\312\312\322\365\365\371\205\376\376\376\4\355\355\351"
+ "\333\333\333\264\264\265jjk\202\0\0\0\12\14\14\15\0\0\0\14\14\15\227\227"
+ "\231!\"!\177\177\177\220\220\217\245\245\247\261\261\260jjk\203\0\0\0\17"
+ "\14\14\15IIL\337\337\331\302\302\302\215\216\206\205\205\206\220\220\217"
+ "\223\223\224\220\220\217\254\266l\374\374z\351\352u\343\352l\324\344V\313"
+ "\313\301\202\327\327\327\15\321\321\313\313\313\301\272\272\264\244\246\230"
+ "z\200Y\274\320e\335\370Z\311\350T\346\374f\352\376WOj\16\\\\^\274\274\274"
+ "\202\321\321\313\6\313\313\301\261\261\260\231\232\217\260\301O\303\343C"
+ "\271\326C\202\275\333G\210\271\326C\10\264\322@\271\326C\261\3217\215\230"
+ "S\235\235\234\272\272\264\330\330\320\355\355\355\202\376\376\376\11\356"
+ "\356\361\327\327\327\322\322\323\314\314\315\324\324\332\365\365\371\376"
+ "\376\376\374\372\374\346\346\355\202\327\327\335\1\356\356\364\202\376\376"
+ "\376\1\334\334\341\202\263\263\277\6\305\305\315\273\273\302\263\263\277"
+ "\327\327\335\365\365\371\371\371\374\203\376\376\376\11\362\362\366\351\351"
+ "\360\324\324\332\305\305\315\316\316\326\324\324\332\305\305\315\263\263"
+ "\277\264\264\265\334\376\376\376\1\373\354\336\205\345o\0\1\356\244`\206"
+ "\376\376\376\1\373\354\336\207\345o\0\2\355\233P\365\310\236\221\376\376"
+ "\376\3\373\354\336\363\277\216\352\2110\204\345o\0\1\363\277\216\204\376"
+ "\376\376\1\360\255p\211\345o\0\1\353\222@\261\376\376\376\10\332\337\264"
+ "\205\205\206\223\223\224\245\245\247\267\267\272\306\306\310\327\327\327"
+ "\341\341\341\202\344\344\351\17\351\351\355\365\365\371\374\374\374\376\376"
+ "\376\371\371\374\351\351\355\341\341\346\360\360\365\362\362\366\356\356"
+ "\364\360\360\365\356\356\364\327\327\335\324\324\332\365\365\371\204\376"
+ "\376\376\11\334\334\341\277\277\310\312\312\322\341\341\346\351\351\360\344"
+ "\344\351\316\316\326\277\277\310\334\334\341\205\376\376\376\2\371\371\371"
+ "\341\341\341\202\327\327\327\3\177\177\177IIL\0\0\0\202\14\14\15\26\0\0\0"
+ "jjkvvw\212\212\214\245\245\247\274\274\274\253\252\253jjk\0\0\0\14\14\15"
+ "\0\0\0IIL\227\227\231\223\223\224\177\177\177\212\212\214\227\227\231\245"
+ "\245\247\253\252\253\235\235\234\254\266l\374\374z\203\343\352l\3\323\335"
+ "i\313\313\301\321\321\313\202\330\330\320\14\313\313\301\273\306t\333\356"
+ "m\346\374f\304\341M\346\374f\352\376WOj\16IILjjk\272\272\264\321\321\313"
+ "\202\330\330\320\3\312\316\253\313\342Z\307\344H\202\275\333G\210\271\326"
+ "C\203\264\322@!\271\326C\261\3217\215\230S\235\235\234\272\272\264\330\330"
+ "\320\345\345\340\371\371\371\376\376\376\371\371\371\341\341\341\322\322"
+ "\323\312\312\322\305\305\315\341\341\346\374\372\374\376\376\376\362\362"
+ "\366\334\334\341\324\324\332\344\344\351\371\371\374\376\376\376\354\354"
+ "\361\273\273\302\263\263\277\305\305\315\277\277\310\263\263\277\305\305"
+ "\315\354\352\362\371\371\374\374\374\376\202\376\376\376\11\365\365\371\356"
+ "\356\364\327\327\335\305\305\315\312\312\322\324\324\332\312\312\322\263"
+ "\263\277\255\255\260\335\376\376\376\1\355\233P\205\345o\0\1\356\244`\206"
+ "\376\376\376\1\360\255p\203\345o\0\3\347x\20\361\266\177\373\354\336\226"
+ "\376\376\376\2\373\354\336\356\244`\202\345o\0\1\356\244`\203\376\376\376"
+ "\1\353\222@\211\345o\0\1\350\200\40\262\376\376\376\21\273\301\235\205\205"
+ "\206\227\227\231\253\252\253\274\274\274\314\314\315\327\327\327\341\341"
+ "\341\351\351\351\344\344\351\356\356\361\371\371\371\374\374\374\376\376"
+ "\376\371\371\371\346\346\355\344\344\351\202\362\362\366\6\356\356\364\362"
+ "\362\366\354\354\361\324\324\332\334\334\341\371\371\374\203\376\376\376"
+ "\12\374\372\374\324\324\332\277\277\310\324\324\332\344\344\354\351\351\360"
+ "\334\334\341\305\305\315\277\277\310\354\354\361\205\376\376\376\6\361\361"
+ "\361\333\333\333\337\337\331\333\333\333\227\227\231\220\220\217\202\0\0"
+ "\0\22\14\14\15\0\0\0!\"!\223\223\224\235\235\234\274\274\274\314\314\315"
+ "\322\322\323vvwIIL\0\0\0\14\14\15\0\0\0\177\177\177vvw\220\220\217\245\245"
+ "\247\267\267\272\202\302\302\302\4\261\261\260\254\266l\374\374z\336\351"
+ "g\202\343\352l\3\324\344V\310\330r\313\313\301\202\330\330\320\20\326\343"
+ "\210\331\355f\324\354W\313\342Z\346\374f\352\376WOj\16""557IIL\231\232\217"
+ "\261\261\260\313\313\301\330\330\320\332\337\264\305\327T\271\326C\202\275"
+ "\333G\2\271\326C\303\343C\205\271\326C\206\264\322@\7\261\3217\215\230S\235"
+ "\235\234\272\272\264\330\330\320\337\337\331\361\361\354\202\376\376\376"
+ "\22\351\351\355\324\324\332\316\316\326\305\305\315\312\312\322\356\356\364"
+ "\376\376\376\374\372\374\346\346\355\324\324\332\334\334\341\362\362\366"
+ "\376\376\376\371\371\374\305\305\315\263\263\277\305\305\315\312\312\322"
+ "\202\273\273\302\3\341\341\346\365\365\371\374\372\374\202\376\376\376\3"
+ "\371\371\374\360\360\365\341\341\346\202\305\305\315\4\324\324\332\316\316"
+ "\326\273\273\302\253\252\253\335\376\376\376\1\363\277\216\206\345o\0\2\352"
+ "\2110\370\332\276\205\376\376\376\3\356\244`\347x\20\361\266\177\233\376"
+ "\376\376\3\373\354\336\356\244`\347x\20\202\376\376\376\1\361\266\177\211"
+ "\345o\0\2\347x\20\371\343\316\262\376\376\376\30\256\263\231\212\212\214"
+ "\235\235\234\253\252\253\274\274\274\314\314\315\333\333\333\341\341\346"
+ "\351\351\351\351\351\355\362\362\366\371\371\374\374\374\374\376\376\376"
+ "\365\365\371\344\344\351\351\351\355\365\365\371\362\362\366\360\360\365"
+ "\362\362\366\344\344\354\324\324\332\351\351\355\204\376\376\376\12\362\362"
+ "\366\312\312\322\277\277\310\334\334\341\351\351\355\346\346\355\324\324"
+ "\332\273\273\302\312\312\322\371\371\371\205\376\376\376\2\351\351\351\327"
+ "\327\327\202\337\337\331\1\313\313\301\202jjk\1\0\0\0\202\14\14\15\10\0\0"
+ "\0vvw\240\240\241\306\306\310\333\333\333\322\322\323\177\177\177\223\223"
+ "\224\203\0\0\0\5IIL\205\205\206\240\240\241\274\274\274\314\314\315\202\330"
+ "\330\320\3\302\302\302\254\266l\370\376k\203\336\351g\5\340\360u\275\333"
+ "G\273\301\235\312\316\253\326\343z\202\320\350U\4\313\342Z\370\376k\332\375"
+ "HOj\16\202557\7\205\205\206\240\240\241\272\272\264\321\321\313\332\337\264"
+ "\305\327T\271\333@\203\275\333G\6\323\363P\261\3217\312\350G\303\343C\264"
+ "\322@\271\326C\207\264\322@\40\261\3217\215\230S\235\235\234\272\272\264"
+ "\330\330\320\337\337\331\345\345\340\365\365\371\376\376\376\365\365\371"
+ "\334\334\341\322\322\323\316\316\326\305\305\315\334\334\341\374\372\374"
+ "\376\376\376\365\365\371\334\334\341\327\327\335\351\351\360\374\374\376"
+ "\376\376\376\334\334\341\263\263\277\277\277\310\316\316\326\305\305\315"
+ "\263\263\277\316\316\326\365\365\371\371\371\374\202\376\376\376\11\374\374"
+ "\376\362\362\366\344\344\354\305\305\315\277\277\310\316\316\326\324\324"
+ "\332\277\277\310\253\252\253\335\376\376\376\1\370\332\276\210\345o\0\2\355"
+ "\233P\366\321\256\243\376\376\376\4\371\343\316\373\354\336\376\376\376\347"
+ "x\20\210\345o\0\2\347x\20\371\343\316\262\376\376\376\15\362\370\317\244"
+ "\246\230\220\220\217\240\240\241\255\255\260\302\302\302\322\322\323\333"
+ "\333\333\345\345\346\351\351\351\351\351\355\365\365\371\374\374\374\202"
+ "\376\376\376\4\362\362\366\344\344\351\354\354\361\365\365\371\203\362\362"
+ "\366\3\341\341\346\327\327\335\360\360\365\204\376\376\376\1\351\351\355"
+ "\202\305\305\315\6\341\341\346\351\351\360\344\344\354\312\312\322\273\273"
+ "\302\334\334\341\205\376\376\376\40\374\372\374\334\334\341\327\327\327\345"
+ "\345\340\341\341\341\321\321\313\205\205\206\223\223\224\14\14\15\0\0\0\14"
+ "\14\15\0\0\0\14\14\15\235\235\234\306\306\310\327\327\327\321\321\313\272"
+ "\272\264jjkvvw\0\0\0\14\14\15\0\0\0\177\177\177\245\245\247\306\306\310\333"
+ "\333\333\345\345\340\352\352\343\330\330\320\273\306t\346\374f\203\336\351"
+ "g\35\332\352b\326\354c\312\346M\332\344`\320\350U\320\352Y\315\347^\370\376"
+ "k\270\336-557IIL557\205\205\206\235\235\234\267\267\272\314\314\315\325\343"
+ "\240\304\341M\271\333@\275\333G\271\326C\304\341M\332\375H\222\261\33\177"
+ "\177\177jjk\264\322@\312\3577\271\336:\207\264\322@\5\256\3170\200\220E\245"
+ "\245\247\274\274\274\330\330\320\202\337\337\331\1\355\355\355\202\376\376"
+ "\376\3\351\351\355\324\324\332\322\322\323\202\312\312\322\11\360\360\365"
+ "\376\376\376\374\374\376\346\346\355\324\324\332\341\341\346\371\371\371"
+ "\376\376\376\354\354\361\202\273\273\302\6\324\324\332\316\316\326\273\273"
+ "\302\277\277\310\356\356\364\371\371\374\202\376\376\376\11\374\374\374\365"
+ "\365\371\351\351\360\312\312\322\277\277\310\316\316\326\324\324\332\306"
+ "\306\310\255\255\260\336\376\376\376\213\345o\0\2\347x\20\370\332\276\242"
+ "\376\376\376\1\373\354\336\211\345o\0\1\371\343\316\217\376\376\376\1\373"
+ "\354\336\243\376\376\376\1\362\370\317\202\220\220\217\26\240\240\241\264"
+ "\264\265\306\306\310\322\322\323\334\334\341\345\345\346\351\351\351\354"
+ "\354\361\371\371\371\374\374\374\376\376\376\374\374\376\360\360\365\344"
+ "\344\351\356\356\364\365\365\371\362\362\366\365\365\371\360\360\365\327"
+ "\327\335\334\334\341\371\371\374\204\376\376\376\11\344\344\351\277\277\310"
+ "\316\316\326\344\344\354\351\351\360\341\341\346\305\305\315\277\277\310"
+ "\354\354\361\205\376\376\376\1\361\361\361\202\327\327\327\202\345\345\346"
+ "\4\330\330\320\272\272\264\\\\^\240\240\241\202\0\0\0\12\14\14\15\0\0\0\\"
+ "\\^\261\261\260\314\314\315\321\321\313\313\313\301jjk\245\245\247!\"!\202"
+ "\0\0\0+\14\14\15\227\227\231\306\306\310\333\333\333\355\355\351\361\361"
+ "\361\327\327\327\304\323|\346\374f\326\354c\332\352b\326\354_\324\351^\326"
+ "\354c\322\354]\311\350T\315\347^\346\374f\370\376kb\203\27""557\\\\^557\177"
+ "\177\177\223\223\224\253\252\253\302\302\302\317\323\213\275\333G\271\333"
+ "@\275\333G\271\326C\323\363P\332\375HOj\16""557\\\\^\245\245\247vvwz\200"
+ "Y\271\326C\312\3577\267\3309\205\264\322@\5\256\3170\200\220E\253\252\253"
+ "\302\302\302\330\330\320\202\337\337\331\11\341\341\341\371\371\371\376\376"
+ "\376\365\365\371\327\327\335\324\324\332\322\322\323\305\305\315\341\341"
+ "\346\202\376\376\376\31\360\360\365\327\327\335\334\334\341\362\362\366\376"
+ "\376\376\365\365\371\312\312\322\263\263\277\324\324\332\334\334\341\277"
+ "\277\310\273\273\302\341\341\346\371\371\374\374\374\376\376\376\376\374"
+ "\374\376\371\371\374\356\356\364\324\324\332\273\273\302\312\312\322\327"
+ "\327\335\312\312\322\255\255\260\336\376\376\376\1\355\233P\211\345o\0\1"
+ "\352\2110\245\376\376\376\2\371\343\316\347x\20\206\345o\0\1\361\266\177"
+ "\217\376\376\376\2\373\354\336\363\277\216\242\376\376\376\32\366\372\337"
+ "\356\366\304\205\205\206\223\223\224\245\245\247\264\264\265\306\306\310"
+ "\322\322\323\341\341\341\345\345\346\351\351\355\360\360\365\371\371\371"
+ "\374\374\374\376\376\376\374\374\376\356\356\364\346\346\355\362\362\366"
+ "\365\365\371\362\362\366\365\365\371\354\354\361\327\327\335\341\341\346"
+ "\374\374\376\203\376\376\376\4\374\372\374\334\334\341\277\277\310\324\324"
+ "\332\202\351\351\360\4\334\334\341\277\277\310\305\305\315\365\365\365\205"
+ "\376\376\376\3\351\351\351\322\322\323\333\333\333\202\345\345\346\3\330"
+ "\330\320\313\313\301\240\240\241\202vvw\2\0\0\0\14\14\15\202\0\0\0\7\220"
+ "\220\217\274\274\274\313\313\301\314\314\315\272\272\264jjk\267\267\272\203"
+ "\0\0\0\10""557\255\255\260\322\322\323\351\351\351\355\355\355\330\330\320"
+ "\304\323|\335\370Z\204\324\351^\202\315\347^\14\332\362e\370\376k\312\357"
+ "7!\"!jjk\205\205\206\\\\^\177\177\177\220\220\217\245\245\247\273\301\235"
+ "\310\330r\202\271\333@\202\275\333G\26\352\376W\250\326!Oj\16IIL557jjkvv"
+ "w\205\205\206\227\227\231vvw\200\220E\271\333@\312\3577\261\3217\264\322"
+ "@\261\3217\264\322@\256\3170\200\220E\253\252\253\306\306\310\330\330\320"
+ "\202\337\337\331$\333\333\333\361\361\361\376\376\376\374\372\374\341\341"
+ "\346\324\324\332\327\327\335\312\312\322\324\324\332\365\365\371\376\376"
+ "\376\365\365\371\341\341\346\327\327\335\351\351\360\376\376\376\374\374"
+ "\376\327\327\335\263\263\277\316\316\326\341\341\346\316\316\326\263\263"
+ "\277\324\324\332\365\365\371\374\374\376\376\376\376\374\374\374\371\371"
+ "\374\360\360\365\327\327\335\273\273\302\305\305\315\327\327\335\316\316"
+ "\326\267\267\272\336\376\376\376\1\365\310\236\210\345o\0\1\356\244`\250"
+ "\376\376\376\1\352\2110\204\345o\0\1\347x\20\220\376\376\376\2\361\266\177"
+ "\370\332\276\242\376\376\376\22\364\371\327\332\337\264\205\205\206\223\223"
+ "\224\245\245\247\267\267\272\306\306\310\327\327\327\341\341\341\345\345"
+ "\346\351\351\355\360\360\365\371\371\371\374\374\374\376\376\376\374\372"
+ "\374\356\356\361\351\351\355\204\365\365\371\3\351\351\360\327\327\335\351"
+ "\351\360\204\376\376\376\12\365\365\371\324\324\332\305\305\315\334\334\341"
+ "\351\351\360\351\351\355\324\324\332\273\273\302\327\327\335\374\372\374"
+ "\204\376\376\376\4\371\371\374\334\334\341\314\314\315\333\333\333\202\345"
+ "\345\346\21\337\337\331\330\330\320\314\314\315vvw\245\245\247557\0\0\0\14"
+ "\14\15\0\0\0!\"!\240\240\241\302\302\302\314\314\315\302\302\302\231\232"
+ "\217vvw\255\255\260\203\0\0\0\7""557\255\255\260\334\334\341\345\345\346"
+ "\321\321\313\304\323|\335\370Z\202\315\347^\202\322\354]\26\335\370Z\352"
+ "\376W\332\375Hb\203\27!\"!\255\255\260\245\245\247jjk\177\177\177\220\220"
+ "\217\244\246\230\317\323\213\310\332_\271\333@\275\333G\271\326C\311\350"
+ "T\332\375Hx\253\27""557\\\\^IIL\202\177\177\177\1\205\205\206\202\177\177"
+ "\177\6\212\212\214\217\216\224vvw\215\230S\275\341<\256\3170\202\264\322"
+ "@\4\256\3170\200\220E\253\252\253\314\314\315\203\337\337\331\12\327\327"
+ "\327\345\345\346\374\374\376\376\376\376\354\354\361\324\324\332\334\334"
+ "\341\324\324\332\312\312\322\351\351\360\202\376\376\376\30\351\351\360\327"
+ "\327\335\344\344\354\374\372\374\376\376\376\346\346\355\263\263\277\312"
+ "\312\322\346\346\355\334\334\341\273\273\302\305\305\315\360\360\365\374"
+ "\374\376\376\376\376\374\374\374\371\371\374\362\362\366\334\334\341\277"
+ "\277\310\305\305\315\327\327\335\324\324\332\273\273\302\337\376\376\376"
+ "\1\347x\20\206\345o\0\1\356\244`\252\376\376\376\1\352\2110\203\345o\0\1"
+ "\360\255p\220\376\376\376\2\347x\20\371\343\316\242\376\376\376\22\364\371"
+ "\327\312\316\253\212\212\214\227\227\231\245\245\247\267\267\272\314\314"
+ "\315\327\327\327\334\334\341\345\345\346\351\351\355\362\362\366\371\371"
+ "\374\374\374\374\376\376\376\371\371\374\354\354\361\351\351\360\204\365"
+ "\365\371\3\344\344\354\334\334\341\362\362\366\204\376\376\376\11\365\365"
+ "\365\316\316\326\305\305\315\341\341\346\351\351\360\344\344\354\312\312"
+ "\322\277\277\310\344\344\351\205\376\376\376\14\365\365\365\322\322\323\314"
+ "\314\315\333\333\333\345\345\346\341\341\341\337\337\331\345\345\340\334"
+ "\334\341\302\302\302jjk\267\267\272\202\0\0\0\4\14\14\15\0\0\0IIL\255\255"
+ "\260\202\313\313\301\5\272\272\264\177\177\177jjk\245\245\247\14\14\15\202"
+ "\0\0\0\5!\"!\235\235\234\314\314\315\302\302\302\273\306t\203\352\376W\202"
+ "\332\375H\15\275\341<x\222'557\212\212\214\316\316\326\240\240\241vvw\177"
+ "\177\177\231\232\217\256\263\231\310\330r\275\333G\267\3309\202\271\326C"
+ "\17\335\370Z\275\341-Oj\16\\\\^jjk\\\\^\177\177\177\223\223\224\240\240\241"
+ "\245\245\247\244\246\230\231\232\217\215\216\206\177\177\177\212\212\214"
+ "\202\177\177\177\20\332\362e\246\306(\264\322@\256\3170\200\220E\253\252"
+ "\253\314\314\315\341\341\341\345\345\340\337\337\331\330\330\320\334\334"
+ "\341\365\365\371\376\376\376\365\365\365\327\327\335\202\334\334\341\21\312"
+ "\312\322\334\334\341\371\371\374\376\376\376\362\362\366\327\327\335\341"
+ "\341\346\365\365\371\376\376\376\360\360\365\277\277\310\305\305\315\351"
+ "\351\360\344\344\354\305\305\315\273\273\302\344\344\354\202\374\374\376"
+ "\4\374\374\374\371\371\374\365\365\371\344\344\351\202\277\277\310\3\327"
+ "\327\335\327\327\327\277\277\310\337\376\376\376\1\363\277\216\205\345o\0"
+ "\1\356\244`\254\376\376\376\1\352\2110\202\345o\0\1\371\343\316\217\376\376"
+ "\376\2\355\233P\347x\20\243\376\376\376\20\364\371\327\273\301\235\212\212"
+ "\214\235\235\234\253\252\253\274\274\274\314\314\315\327\327\327\341\341"
+ "\341\351\351\351\354\354\361\365\365\371\374\372\374\374\374\374\376\376"
+ "\376\371\371\374\202\354\354\361\204\365\365\371\3\344\344\351\341\341\346"
+ "\365\365\371\204\376\376\376\1\362\362\366\202\312\312\322\3\344\344\351"
+ "\354\352\362\341\341\346\202\305\305\315\1\354\354\361\205\376\376\376\1"
+ "\361\361\361\202\314\314\315\2\333\333\333\341\341\341\202\337\337\331\6"
+ "\355\355\355\351\351\351\327\327\327\264\264\265jjk\264\264\265\202\0\0\0"
+ "\4\14\14\15\0\0\0\\\\^\267\267\272\202\302\302\302\5\274\274\274\177\177"
+ "\177IIL\220\220\217IIL\203\0\0\0\14IIL\220\220\217\177\177\177z\200Y\200"
+ "\220E\215\230S\231\236v\177\177\177\205\205\206\255\255\260\312\312\322\253"
+ "\252\253\202\177\177\177\5\205\205\206\231\232\217\273\306t\305\327T\267"
+ "\3309\202\271\326C\5\324\354W\332\375Hb\203\27""557\217\216\224\202jjk\33"
+ "\205\205\206\231\232\217\253\252\253\302\302\302\306\306\310\302\302\302"
+ "\272\272\264\245\245\247\231\232\217\215\216\206\254\266l\315\333}\261\321"
+ "7\252\3108\264\322@\256\3170\200\220E\253\252\253\314\314\315\345\345\346"
+ "\352\352\343\337\337\331\330\330\320\327\327\327\360\360\365\376\376\376"
+ "\371\371\374\202\334\334\341\1\341\341\346\202\316\316\326\32\365\365\371"
+ "\376\376\376\365\365\371\341\341\346\334\334\341\362\362\366\376\376\376"
+ "\365\365\371\305\305\315\277\277\310\346\346\355\354\352\362\312\312\322"
+ "\263\263\277\334\334\341\374\374\376\376\376\376\374\374\374\371\371\374"
+ "\365\365\371\346\346\355\305\305\315\277\277\310\324\324\332\327\327\335"
+ "\306\306\310\340\376\376\376\1\360\255p\203\345o\0\1\356\244`\256\376\376"
+ "\376\2\352\2110\345o\0\216\376\376\376\4\371\343\316\353\222@\345o\0\355"
+ "\233P\243\376\376\376\23\364\371\327\256\263\231\212\212\214\235\235\234"
+ "\253\252\253\274\274\274\314\314\315\327\327\327\334\334\341\351\351\351"
+ "\354\354\361\365\365\371\374\372\374\374\374\376\376\376\376\365\365\371"
+ "\354\354\361\356\356\361\365\365\371\202\371\371\374\4\362\362\366\341\341"
+ "\346\344\344\351\371\371\374\204\376\376\376\11\356\356\364\312\312\322\316"
+ "\316\326\346\346\355\354\352\362\341\341\346\277\277\310\316\316\326\371"
+ "\371\374\205\376\376\376\3\351\351\355\306\306\310\314\314\315\202\333\333"
+ "\333\11\327\327\327\337\337\331\370\370\365\365\365\365\345\345\346\314\314"
+ "\315\240\240\241jjk\261\261\260\202\0\0\0\14\14\14\15\0\0\0\\\\^\272\272"
+ "\264\306\306\310\314\314\315\267\267\272vvw\\\\^\223\223\224jjk!\"!\202\0"
+ "\0\0(557jjkIIL\\\\^vvw\217\216\224\255\255\260\263\263\277\235\235\234\177"
+ "\177\177vvw\177\177\177\231\236v\273\306t\305\327T\271\326C\264\322@\271"
+ "\326C\311\350T\332\375H\222\261\33!\"!vvw\253\252\253vvw\177\177\177\215"
+ "\216\206\235\235\234\261\261\260\302\302\302\327\327\327\345\345\346\341"
+ "\341\341\321\321\313\302\302\302\273\301\235\274\320e\275\341<\246\306(\244"
+ "\3014\202\252\3108+\256\3170\200\220E\245\245\247\314\314\315\345\345\346"
+ "\361\361\354\345\345\340\330\330\320\322\322\323\351\351\351\374\374\376"
+ "\376\376\376\344\344\351\334\334\341\344\344\354\334\334\341\312\312\322"
+ "\346\346\355\376\376\376\374\372\374\351\351\360\334\334\341\360\360\365"
+ "\376\376\376\374\374\376\316\316\326\277\277\310\346\346\355\362\362\366"
+ "\327\327\335\263\263\277\316\316\326\371\371\374\376\376\376\374\374\374"
+ "\374\372\374\371\371\374\354\354\361\312\312\322\273\273\302\324\324\332"
+ "\333\333\333\306\306\310\321\376\376\376\1\371\343\316\203\361\266\177\2"
+ "\363\277\216\371\343\316\212\376\376\376\3\370\332\276\353\222@\352\2110"
+ "\257\376\376\376\2\373\354\336\347x\20\203\376\376\376\2\365\310\236\353"
+ "\222@\205\345o\0\203\353\222@\1\350\200\40\203\345o\0\1\366\321\256\243\376"
+ "\376\376\23\364\371\327\244\246\230\220\220\217\235\235\234\253\252\253\274"
+ "\274\274\314\314\315\327\327\335\341\341\341\351\351\355\356\356\361\365"
+ "\365\371\371\371\374\374\372\374\376\376\376\365\365\371\354\354\361\356"
+ "\356\364\365\365\371\202\371\371\374\6\362\362\366\341\341\346\351\351\360"
+ "\374\372\374\376\376\376\374\374\376\202\376\376\376\10\351\351\360\312\312"
+ "\322\324\324\332\351\351\360\354\352\362\334\334\341\277\277\310\327\327"
+ "\335\206\376\376\376\7\341\341\346\277\277\310\314\314\315\327\327\335\327"
+ "\327\327\322\322\323\341\341\341\202\371\371\371\24\361\361\361\341\341\341"
+ "\306\306\310\220\220\217jjk\245\245\247\14\14\15\0\0\0\14\14\15\0\0\0IIL"
+ "\264\264\265\314\314\315\306\306\310\264\264\265\220\220\217\177\177\177"
+ "\245\245\247\223\223\224\177\177\177\202IIL\4jjk\177\177\177vvw\177\177\177"
+ "\202\205\205\206\202\177\177\177\16\205\205\206\254\266l\274\320e\305\327"
+ "T\271\326C\264\322@\271\326C\307\344H\323\363P\241\304\27Oj\16IIL\273\273"
+ "\302\245\245\247\202\177\177\177\15\220\220\217\245\245\247\272\272\264\314"
+ "\314\315\333\333\333\345\345\340\355\355\351\361\361\361\337\337\331\321"
+ "\336\204\305\327T\244\3014\235\272+\204\252\3108\22\256\3170x\222'\245\245"
+ "\247\314\314\315\345\345\346\365\365\365\351\351\351\327\327\327\322\322"
+ "\323\341\341\341\371\371\374\376\376\376\354\354\361\334\334\341\344\344"
+ "\354\344\344\351\316\316\326\334\334\341\202\376\376\376\3\360\360\365\334"
+ "\334\341\354\354\361\202\376\376\376\22\327\327\335\277\277\310\344\344\354"
+ "\371\371\374\346\346\355\273\273\302\305\305\315\362\362\366\376\376\376"
+ "\374\374\374\374\372\374\371\371\374\360\360\365\316\316\326\273\273\302"
+ "\324\324\332\333\333\333\314\314\315\317\376\376\376\2\365\310\236\350\200"
+ "\40\206\345o\0\2\353\222@\366\321\256\273\376\376\376\1\371\343\316\202\376"
+ "\376\376\1\353\222@\215\345o\0\1\352\2110\244\376\376\376\22\364\371\327"
+ "\231\232\217\220\220\217\235\235\234\253\252\253\274\274\274\314\314\315"
+ "\327\327\327\341\341\341\351\351\355\356\356\361\365\365\371\371\371\374"
+ "\374\372\374\374\374\376\365\365\371\356\356\364\360\360\365\202\365\365"
+ "\371\7\371\371\374\356\356\364\341\341\346\356\356\364\376\376\376\374\374"
+ "\376\371\371\374\202\376\376\376\3\346\346\355\312\312\322\327\327\335\202"
+ "\351\351\360\3\327\327\335\277\277\310\341\341\346\205\376\376\376\10\374"
+ "\374\376\327\327\335\273\273\302\314\314\315\324\324\332\322\322\323\314"
+ "\314\315\345\345\346\202\376\376\376\10\371\371\371\355\355\355\333\333\333"
+ "\302\302\302\220\220\217\\\\^\240\240\241557\203\0\0\0\14""557\235\235\234"
+ "\306\306\310\302\302\302\264\264\265\245\245\247\220\220\217\212\212\214"
+ "\205\205\206\177\177\177\\\\^\215\230S\202\231\236v\202\231\232\217\5\231"
+ "\236v\254\266l\274\320e\305\327T\275\333G\202\264\322@\20\271\326C\303\343"
+ "C\312\3577\241\304\27Oj\16IIL\255\255\260\277\277\310\220\220\217\205\205"
+ "\206\220\220\217\235\235\234\253\252\253\274\274\274\321\321\313\345\345"
+ "\340\203\352\352\343\5\343\345\233\313\342Z\252\3108\235\272+\244\3014\203"
+ "\252\3108-\244\3014\252\3108\246\306(x\222'\245\245\247\314\314\315\345\345"
+ "\346\365\365\371\361\361\361\333\333\333\322\322\323\334\334\341\365\365"
+ "\371\376\376\376\362\362\366\334\334\341\346\346\355\351\351\360\324\324"
+ "\332\327\327\335\371\371\374\376\376\376\365\365\371\341\341\346\351\351"
+ "\360\374\374\376\376\376\376\334\334\341\277\277\310\341\341\346\371\371"
+ "\374\356\356\364\305\305\315\277\277\310\354\354\361\376\376\376\374\374"
+ "\374\374\372\374\371\371\374\362\362\366\316\316\326\273\273\302\322\322"
+ "\323\333\333\333\314\314\315\315\376\376\376\1\370\332\276\202\350\200\40"
+ "\2\353\222@\347x\20\207\345o\0\2\350\200\40\365\310\236\206\376\376\376\1"
+ "\371\343\316\264\376\376\376\1\353\222@\215\345o\0\2\347x\20\371\343\316"
+ "\244\376\376\376\14\364\371\327\231\232\217\217\216\224\240\240\241\255\255"
+ "\260\273\273\302\314\314\315\327\327\327\341\341\341\351\351\355\356\356"
+ "\361\365\365\371\202\371\371\374\4\374\372\374\365\365\371\356\356\364\360"
+ "\360\365\203\365\365\371\20\356\356\364\344\344\351\362\362\366\376\376\376"
+ "\371\371\374\365\365\371\374\374\376\376\376\376\344\344\354\312\312\322"
+ "\327\327\335\354\352\362\351\351\360\324\324\332\277\277\310\346\346\355"
+ "\205\376\376\376\5\374\372\374\324\324\332\273\273\302\305\305\315\322\322"
+ "\323\202\314\314\315\1\351\351\355\202\376\376\376\11\374\374\374\365\365"
+ "\365\351\351\355\327\327\327\302\302\302\205\205\206IIL\212\212\214\\\\^"
+ "\203\0\0\0\16\14\14\15vvw\267\267\272\302\302\302\267\267\272\255\255\260"
+ "\235\235\234\205\205\206jjk\\\\^\260\301O\312\346G\275\333G\304\341M\202"
+ "\275\333G\1\264\322@\203\261\3217\27\270\3367\275\341-\262\330)\222\261\33"
+ "Oj\16jjk\263\263\277\306\306\310\223\223\224vvw\205\205\206\223\223\224\253"
+ "\252\253\302\302\302\314\314\315\330\330\320\337\337\331\352\352\343\357"
+ "\367\303\335\352\213\305\327T\252\3108\235\272+\207\244\3014,\252\3108\246"
+ "\306(cq2\253\252\253\314\314\315\345\345\346\365\365\371\365\365\365\341"
+ "\341\341\322\322\323\327\327\335\360\360\365\376\376\376\365\365\371\341"
+ "\341\346\346\346\355\354\354\361\334\334\341\324\324\332\362\362\366\376"
+ "\376\376\371\371\374\344\344\354\351\351\360\374\372\374\376\376\376\344"
+ "\344\351\277\277\310\334\334\341\371\371\374\365\365\371\312\312\322\273"
+ "\273\302\351\351\355\376\376\376\374\374\374\374\372\374\371\371\374\362"
+ "\362\366\324\324\332\273\273\302\322\322\323\333\333\333\314\314\315\314"
+ "\376\376\376\3\371\343\316\360\255p\371\343\316\203\376\376\376\2\370\332"
+ "\276\352\2110\210\345o\0\6\352\2110\353\222@\356\244`\353\222@\350\200\40"
+ "\355\233P\264\376\376\376\1\350\200\40\214\345o\0\2\347x\20\371\343\316\245"
+ "\376\376\376\1\361\367\316\202\220\220\217\10\240\240\241\255\255\260\273"
+ "\273\302\314\314\315\327\327\327\341\341\341\354\354\361\356\356\364\202"
+ "\365\365\371\202\371\371\374\1\365\365\371\202\360\360\365\203\365\365\371"
+ "\20\354\354\361\346\346\355\365\365\371\376\376\376\365\365\371\362\362\366"
+ "\371\371\374\376\376\376\344\344\351\316\316\326\334\334\341\354\354\361"
+ "\346\346\355\316\316\326\305\305\315\356\356\364\205\376\376\376\10\374\372"
+ "\374\316\316\326\273\273\302\305\305\315\316\316\326\306\306\310\314\314"
+ "\315\356\356\361\203\376\376\376\12\374\374\374\365\365\365\351\351\351\327"
+ "\327\327\261\261\260\215\216\206IILvvw\177\177\177\14\14\15\203\0\0\0\31"
+ "!\"!\205\205\206\264\264\265\274\274\274\264\264\265\235\235\234\231\232"
+ "\217\215\216\206\254\266l\312\3577\266\3363\266\3341\266\336/\265\332+\270"
+ "\334+\270\336-\265\332+\256\3170\235\272+\200\220Evvw\227\227\231\277\277"
+ "\310\267\267\272\223\223\224\202\177\177\177\13\215\216\206\235\235\234\253"
+ "\252\253\302\302\302\327\327\327\345\345\346\337\337\331\343\345\233\323"
+ "\335i\271\326C\244\3014\202\235\272+\211\244\3014\25\246\306(cq2\253\252"
+ "\253\314\314\315\345\345\346\365\365\371\371\371\371\345\345\346\322\322"
+ "\323\327\327\327\356\356\361\376\376\376\371\371\371\344\344\351\346\346"
+ "\355\356\356\364\341\341\346\324\324\332\356\356\361\376\376\376\374\372"
+ "\374\202\351\351\360\5\371\371\374\376\376\376\351\351\355\277\277\310\334"
+ "\334\341\202\371\371\374\15\324\324\332\273\273\302\344\344\351\376\376\376"
+ "\374\374\374\374\372\374\371\371\374\365\365\371\327\327\335\273\273\302"
+ "\316\316\326\333\333\333\314\314\315\324\376\376\376\1\356\244`\214\345o"
+ "\0\1\373\354\336\264\376\376\376\1\366\321\256\213\345o\0\1\356\244`\247"
+ "\376\376\376\15\361\367\316\215\216\206\223\223\224\240\240\241\255\255\260"
+ "\273\273\302\314\314\315\324\324\332\341\341\341\354\354\361\356\356\361"
+ "\362\362\366\365\365\371\202\371\371\374\1\365\365\371\202\360\360\365\20"
+ "\362\362\366\365\365\371\362\362\366\354\354\361\351\351\355\371\371\374"
+ "\374\374\376\362\362\366\360\360\365\371\371\374\376\376\376\344\344\351"
+ "\316\316\326\334\334\341\354\354\361\344\344\354\202\312\312\322\1\365\365"
+ "\371\205\376\376\376\10\371\371\371\312\312\322\273\273\302\305\305\315\312"
+ "\312\322\277\277\310\312\312\322\362\362\366\204\376\376\376\12\374\372\374"
+ "\365\365\365\345\345\346\313\313\301\261\261\260\235\235\234\\\\^jjk\212"
+ "\212\214IIL\204\0\0\0\7!\"!jjk\223\223\224\240\240\241\245\245\247\231\232"
+ "\217\231\236v\206\232\256S\4\231\236v\215\216\206\227\227\231\255\255\260"
+ "\202\273\273\302\16\253\252\253\212\212\214vvw\205\205\206\220\220\217\235"
+ "\235\234\253\252\253\272\272\264\302\302\302\313\313\301\343\345\233\326"
+ "\343z\305\327T\252\3108\202\235\272+\214\244\3014\15\246\306(cq2\253\252"
+ "\253\314\314\315\341\341\346\365\365\371\374\374\376\351\351\355\327\327"
+ "\327\324\324\332\354\354\361\376\376\376\371\371\374\202\346\346\355\4\356"
+ "\356\364\346\346\355\327\327\335\354\354\361\202\376\376\376\16\356\356\364"
+ "\351\351\360\371\371\374\376\376\376\356\356\364\305\305\315\334\334\341"
+ "\371\371\374\376\376\376\341\341\346\277\277\310\334\334\341\376\376\376"
+ "\374\374\376\202\374\372\374\6\365\365\371\327\327\335\263\263\277\316\316"
+ "\326\333\333\333\314\314\315\325\376\376\376\1\352\2110\212\345o\0\1\361"
+ "\266\177\266\376\376\376\1\353\222@\207\345o\0\2\347x\20\361\266\177\251"
+ "\376\376\376\14\361\367\316\205\205\206\223\223\224\240\240\241\255\255\260"
+ "\273\273\302\314\314\315\324\324\332\341\341\346\354\354\361\356\356\361"
+ "\362\362\366\202\365\365\371\2\371\371\374\365\365\371\202\360\360\365\203"
+ "\362\362\366\2\354\354\361\351\351\360\202\371\371\374\202\356\356\364\12"
+ "\365\365\371\376\376\376\344\344\354\316\316\326\341\341\346\356\356\364"
+ "\344\344\354\312\312\322\316\316\326\365\365\371\205\376\376\376\3\371\371"
+ "\371\305\305\315\263\263\277\202\305\305\315\3\273\273\302\316\316\326\365"
+ "\365\371\205\376\376\376\14\374\372\374\361\361\361\330\330\320\313\313\301"
+ "\272\272\264\244\246\230\177\177\177vvw\223\223\224\205\205\206IIL\14\14"
+ "\15\204\0\0\0\3\14\14\15""557\177\177\177\202jjk\5vvw\177\177\177\217\216"
+ "\224\227\227\231\245\245\247\202\263\263\277\3\264\264\265\240\240\241\212"
+ "\212\214\202\177\177\177\15\205\205\206\223\223\224\240\240\241\261\261\260"
+ "\274\274\274\312\316\253\317\323\213\323\335i\305\327T\252\3108\235\272+"
+ "\222\261\33\235\272+\216\244\3014\15\246\306(cq2\253\252\253\314\314\315"
+ "\341\341\341\365\365\365\374\374\376\356\356\361\327\327\327\324\324\332"
+ "\351\351\355\376\376\376\371\371\374\202\351\351\360\4\356\356\364\351\351"
+ "\360\334\334\341\351\351\355\202\376\376\376\14\360\360\365\351\351\360\371"
+ "\371\374\376\376\376\362\362\366\305\305\315\334\334\341\371\371\374\376"
+ "\376\376\344\344\354\277\277\310\327\327\335\202\374\374\376\10\374\372\374"
+ "\371\371\374\371\371\371\327\327\335\273\273\302\316\316\326\333\333\333"
+ "\314\314\315\325\376\376\376\1\371\343\316\211\345o\0\1\347x\20\267\376\376"
+ "\376\1\370\332\276\206\345o\0\1\361\266\177\253\376\376\376\11\361\367\316"
+ "\205\205\206\223\223\224\245\245\247\255\255\260\273\273\302\314\314\315"
+ "\324\324\332\341\341\346\202\354\354\361\1\362\362\366\203\365\365\371\202"
+ "\362\362\366\202\360\360\365\202\362\362\366\202\354\354\361\202\371\371"
+ "\374\202\351\351\360\12\365\365\371\376\376\376\344\344\354\324\324\332\341"
+ "\341\346\356\356\364\344\344\351\312\312\322\324\324\332\371\371\371\205"
+ "\376\376\376\3\371\371\371\305\305\315\263\263\277\202\305\305\315\3\273"
+ "\273\302\322\322\323\374\372\374\206\376\376\376\16\362\362\366\337\337\331"
+ "\330\330\320\313\313\301\272\272\264\253\252\253\240\240\241\205\205\206"
+ "\220\220\217\240\240\241\220\220\217jjkIIL\14\14\15\203\0\0\0\3""557jjk\177"
+ "\177\177\207\205\205\206\202\212\212\214\202\215\216\206\10\231\232\217\244"
+ "\246\230\273\301\235\317\323\213\310\330r\305\327T\264\322@\244\3014\202"
+ "\222\261\33\221\235\272+\24\244\3014\246\306(cq2\253\252\253\314\314\315"
+ "\341\341\341\362\362\366\374\374\376\362\362\366\333\333\333\324\324\332"
+ "\346\346\355\376\376\376\374\372\374\354\352\362\351\351\360\356\356\364"
+ "\354\354\361\334\334\341\346\346\355\202\376\376\376\26\362\362\366\354\352"
+ "\362\371\371\374\376\376\376\362\362\366\312\312\322\334\334\341\371\371"
+ "\374\376\376\376\354\354\361\305\305\315\324\324\332\374\372\374\374\374"
+ "\376\374\372\374\371\371\374\371\371\371\334\334\341\273\273\302\316\316"
+ "\326\333\333\333\314\314\315\326\376\376\376\1\363\277\216\210\345o\0\1\356"
+ "\244`\270\376\376\376\1\352\2110\203\345o\0\2\347x\20\370\332\276\254\376"
+ "\376\376\11\361\367\316\205\205\206\223\223\224\245\245\247\255\255\260\274"
+ "\274\274\314\314\315\324\324\332\341\341\346\202\354\354\361\202\362\362"
+ "\366\202\365\365\371\202\362\362\366\2\360\360\365\356\356\364\202\360\360"
+ "\365\4\354\354\361\356\356\364\371\371\374\365\365\371\202\346\346\355\12"
+ "\362\362\366\376\376\376\346\346\355\324\324\332\341\341\346\356\356\364"
+ "\341\341\346\312\312\322\327\327\335\371\371\374\205\376\376\376\3\371\371"
+ "\371\312\312\322\263\263\277\202\277\277\310\2\273\273\302\324\324\332\207"
+ "\376\376\376\2\365\365\365\337\337\331\202\330\330\320\5\321\321\313\313"
+ "\313\301\302\302\302\255\255\260\235\235\234\202\205\205\206\5\212\212\214"
+ "\205\205\206\177\177\177vvwjjk\202IIL\1\177\177\177\202\223\223\224\1\220"
+ "\220\217\203\215\216\206\13\223\223\224\227\227\231\244\246\230\256\263\231"
+ "\254\266l\273\306t\274\320e\305\327T\264\322@\244\3014\235\272+\202\222\261"
+ "\33\224\235\272+\20\244\3014\246\306(cq2\253\252\253\314\314\315\341\341"
+ "\341\361\361\361\374\374\376\365\365\371\334\334\341\324\324\332\346\346"
+ "\355\374\374\376\371\371\374\356\356\364\354\354\361\202\356\356\364\202"
+ "\344\344\354\21\374\372\374\376\376\376\365\365\371\354\352\362\371\371\374"
+ "\376\376\376\365\365\371\316\316\326\341\341\346\371\371\374\376\376\376"
+ "\360\360\365\312\312\322\324\324\332\371\371\374\374\374\376\371\371\374"
+ "\202\371\371\371\5\334\334\341\273\273\302\322\322\323\333\333\333\314\314"
+ "\315\327\376\376\376\1\356\244`\207\345o\0\1\373\354\336\270\376\376\376"
+ "\1\365\310\236\202\345o\0\2\347x\20\371\343\316\255\376\376\376\13\361\367"
+ "\316\205\205\206\223\223\224\245\245\247\255\255\260\274\274\274\314\314"
+ "\315\324\324\332\345\345\346\354\354\361\351\351\355\202\362\362\366\202"
+ "\365\365\371\202\362\362\366\2\360\360\365\354\354\361\202\356\356\364\4"
+ "\354\354\361\360\360\365\371\371\374\362\362\366\202\344\344\354\12\360\360"
+ "\365\376\376\376\351\351\360\327\327\335\341\341\346\356\356\364\341\341"
+ "\346\316\316\326\334\334\341\374\372\374\205\376\376\376\3\371\371\371\312"
+ "\312\322\263\263\277\202\277\277\310\2\263\263\277\324\324\332\207\376\376"
+ "\376\17\365\365\365\333\333\333\327\327\327\337\337\331\330\330\320\337\337"
+ "\331\333\333\333\314\314\315\274\274\274\253\252\253\235\235\234\212\212"
+ "\214vvwjjk\\\\^\202jjk\2\\\\^\232\256S\205\273\306t\202\274\320e\5\260\301"
+ "O\264\322@\252\3108\244\3014\235\272+\204\222\261\33\227\235\272+\16\244"
+ "\3014\246\306(cq2\253\252\253\314\314\315\341\341\341\356\356\361\371\371"
+ "\374\365\365\371\341\341\341\327\327\335\351\351\355\374\374\376\371\371"
+ "\374\202\356\356\364\202\354\352\362\23\346\346\355\344\344\354\371\371\374"
+ "\376\376\376\365\365\371\356\356\364\371\371\374\376\376\376\362\362\366"
+ "\316\316\326\344\344\354\374\374\376\376\376\376\362\362\366\316\316\326"
+ "\324\324\332\371\371\374\374\374\376\371\371\374\202\371\371\371\5\334\334"
+ "\341\273\273\302\322\322\323\333\333\333\314\314\315\330\376\376\376\1\352"
+ "\2110\205\345o\0\1\352\2110\272\376\376\376\3\347x\20\345o\0\366\321\256"
+ "\256\376\376\376\15\361\367\316\177\177\177\223\223\224\245\245\247\255\255"
+ "\260\274\274\274\314\314\315\322\322\323\345\345\346\354\354\361\351\351"
+ "\355\360\360\365\362\362\366\202\365\365\371\3\362\362\366\365\365\371\360"
+ "\360\365\202\354\354\361\202\356\356\364\3\360\360\365\371\371\374\360\360"
+ "\365\202\341\341\346\12\356\356\364\376\374\376\354\354\361\327\327\335\341"
+ "\341\346\354\354\361\341\341\346\316\316\326\334\334\341\374\372\374\205"
+ "\376\376\376\3\371\371\371\312\312\322\263\263\277\202\277\277\310\2\273"
+ "\273\302\324\324\332\207\376\376\376\23\365\365\365\333\333\333\330\330\320"
+ "\333\333\333\337\337\331\351\351\351\355\355\355\345\345\346\327\327\327"
+ "\314\314\315\274\274\274\255\255\260\240\240\241\227\227\231\212\212\214"
+ "vvwjjk\\\\^\232\256S\214\222\261\33\233\235\272+\22\244\3014\246\306(cq2"
+ "\253\252\253\314\314\315\341\341\341\356\356\361\371\371\374\365\365\371"
+ "\341\341\346\333\333\333\354\354\361\374\374\376\371\371\374\360\360\365"
+ "\356\356\364\351\351\360\354\352\362\202\346\346\355\21\371\371\374\376\376"
+ "\376\371\371\374\360\360\365\371\371\374\376\376\376\362\362\366\316\316"
+ "\326\346\346\355\374\374\376\376\376\376\365\365\371\316\316\326\324\324"
+ "\332\371\371\374\374\374\376\371\371\374\202\371\371\371\5\334\334\341\273"
+ "\273\302\324\324\332\333\333\333\314\314\315\331\376\376\376\1\355\233P\204"
+ "\345o\0\1\363\277\216\272\376\376\376\2\356\244`\353\222@\257\376\376\376"
+ "\11\360\367\307\205\205\206\223\223\224\245\245\247\255\255\260\274\274\274"
+ "\306\306\310\322\322\323\345\345\346\202\351\351\355\1\360\360\365\202\362"
+ "\362\366\4\365\365\371\360\360\365\365\365\371\360\360\365\202\351\351\360"
+ "\5\354\354\361\356\356\364\362\362\366\371\371\374\356\356\364\202\341\341"
+ "\346\12\351\351\360\374\374\376\354\354\361\334\334\341\341\341\346\354\352"
+ "\362\341\341\346\316\316\326\341\341\346\374\374\376\205\376\376\376\3\371"
+ "\371\374\316\316\326\263\263\277\202\277\277\310\2\273\273\302\327\327\335"
+ "\207\376\376\376\17\365\365\371\327\327\327\322\322\323\327\327\327\337\337"
+ "\331\355\355\355\371\371\371\365\365\365\355\355\355\345\345\346\333\333"
+ "\333\314\314\315\302\302\302\267\267\272\253\252\253\202\231\232\217\2\220"
+ "\220\217\232\256S\207\222\261\33\205\235\272+\202\222\261\33\231\235\272"
+ "+\7\244\3014\246\306(cq2\245\245\247\314\314\315\341\341\341\355\355\355"
+ "\202\365\365\371\3\345\345\346\334\334\341\356\356\361\202\371\371\374\202"
+ "\360\360\365\1\346\346\355\203\351\351\360\14\371\371\374\376\376\376\371"
+ "\371\374\362\362\366\371\371\374\376\376\376\362\362\366\324\324\332\351"
+ "\351\360\374\374\376\376\376\376\365\365\371\202\324\324\332\3\371\371\374"
+ "\374\374\376\371\371\374\202\371\371\371\5\334\334\341\273\273\302\324\324"
+ "\332\333\333\333\314\314\315\332\376\376\376\2\371\343\316\361\266\177\202"
+ "\353\222@\1\373\354\336\272\376\376\376\2\365\310\236\366\321\256\257\376"
+ "\376\376\11\360\367\307\205\205\206\223\223\224\245\245\247\255\255\260\274"
+ "\274\274\306\306\310\322\322\323\345\345\346\202\351\351\355\202\360\360"
+ "\365\202\362\362\366\3\356\356\364\365\365\371\360\360\365\202\351\351\355"
+ "\5\354\354\361\356\356\364\362\362\366\371\371\374\354\354\361\202\334\334"
+ "\341\14\346\346\355\371\371\374\360\360\365\334\334\341\341\341\346\351\351"
+ "\360\341\341\346\324\324\332\344\344\354\374\374\376\371\371\374\374\374"
+ "\376\203\376\376\376\3\374\372\374\324\324\332\273\273\302\202\277\277\310"
+ "\2\273\273\302\327\327\335\207\376\376\376\23\371\371\371\333\333\333\321"
+ "\321\313\322\322\323\327\327\327\361\361\361\376\376\376\374\374\374\371"
+ "\371\371\365\365\365\355\355\355\351\351\351\341\341\341\327\327\327\314"
+ "\314\315\272\272\264\261\261\260\244\246\230\254\266l\202x\253\27\226\222"
+ "\261\33\203\235\272+\204\246\306(\1\256\3170\202\261\3217\205\267\3309\16"
+ "\271\336:\275\341-cq2\245\245\247\314\314\315\341\341\341\351\351\355\365"
+ "\365\371\371\371\374\351\351\351\341\341\346\360\360\365\371\371\374\365"
+ "\365\371\202\360\360\365\2\344\344\354\346\346\355\202\354\352\362\20\371"
+ "\371\374\376\376\376\371\371\374\365\365\371\371\371\374\376\376\376\362"
+ "\362\366\327\327\335\354\352\362\374\374\376\376\376\376\365\365\371\327"
+ "\327\335\324\324\332\371\371\374\374\374\376\202\371\371\374\6\365\365\371"
+ "\327\327\335\277\277\310\327\327\335\333\333\333\314\314\315\377\376\376"
+ "\376\313\376\376\376\13\360\367\307\205\205\206\223\223\224\245\245\247\255"
+ "\255\260\267\267\272\306\306\310\322\322\323\341\341\346\351\351\355\346"
+ "\346\355\202\360\360\365\202\362\362\366\12\356\356\364\365\365\371\360\360"
+ "\365\351\351\355\346\346\355\351\351\360\356\356\364\362\362\366\365\365"
+ "\371\354\354\361\202\334\334\341\3\344\344\354\371\371\374\362\362\366\202"
+ "\341\341\346\5\351\351\360\341\341\346\324\324\332\344\344\354\374\372\374"
+ "\202\371\371\374\203\376\376\376\2\374\372\374\334\334\341\203\277\277\310"
+ "\2\273\273\302\327\327\335\207\376\376\376\6\374\372\374\333\333\333\321"
+ "\321\313\322\322\323\330\330\320\355\355\355\203\376\376\376\14\374\374\374"
+ "\371\371\371\370\370\365\362\362\366\355\355\355\345\345\346\330\330\320"
+ "\313\313\301\261\261\260\254\266l\244\3014\252\3108\206\244\3014\206\235"
+ "\272+\214\222\261\33\204x\253\27\204b\203\27\207Oj\16\20cq2\245\245\247\314"
+ "\314\315\341\341\341\351\351\351\365\365\371\371\371\374\351\351\355\351"
+ "\351\351\365\365\371\371\371\374\365\365\371\362\362\366\356\356\364\341"
+ "\341\346\346\346\355\202\354\352\362\14\371\371\374\376\376\376\371\371\374"
+ "\365\365\371\374\372\374\376\376\376\360\360\365\327\327\335\356\356\364"
+ "\374\374\376\376\376\376\365\365\371\202\327\327\335\2\371\371\374\374\374"
+ "\376\202\371\371\374\6\365\365\371\327\327\335\277\277\310\334\334\341\333"
+ "\333\333\314\314\315\377\376\376\376\313\376\376\376\13\360\367\307\205\205"
+ "\206\223\223\224\245\245\247\255\255\260\267\267\272\306\306\310\322\322"
+ "\323\341\341\346\351\351\355\346\346\355\202\360\360\365\202\362\362\366"
+ "\1\354\354\361\202\362\362\366\3\346\346\355\344\344\354\351\351\360\202"
+ "\360\360\365\2\365\365\371\354\354\361\202\334\334\341\1\341\341\346\202"
+ "\365\365\371\7\344\344\351\341\341\346\351\351\360\344\344\351\327\327\335"
+ "\346\346\355\374\372\374\202\371\371\374\204\376\376\376\1\344\344\351\204"
+ "\277\277\310\1\333\333\333\207\376\376\376\7\374\374\374\341\341\341\314"
+ "\314\315\321\321\313\322\322\323\351\351\351\374\374\376\205\376\376\376"
+ "\7\374\374\374\371\371\371\370\370\365\352\352\343\330\330\320\302\302\302"
+ "\177\177\177\205\205\205\206\211\177\177\177\202\205\205\206\202\212\212"
+ "\214\5\215\216\206\220\220\217\227\227\231\235\235\234\240\240\241\204\245"
+ "\245\247\4\240\240\241\235\235\234\227\227\231\223\223\224\202\220\220\217"
+ "\205\212\212\214\203\217\216\224\7\220\220\217\253\252\253\314\314\315\341"
+ "\341\341\351\351\351\365\365\371\371\371\374\202\354\354\361\13\371\371\374"
+ "\365\365\371\362\362\366\365\365\371\354\354\361\341\341\346\344\344\354"
+ "\356\356\364\360\360\365\371\371\374\376\376\376\202\371\371\374\14\374\374"
+ "\376\376\376\376\354\354\361\334\334\341\360\360\365\371\371\374\376\376"
+ "\376\365\365\371\327\327\335\334\334\341\374\372\374\374\374\376\202\371"
+ "\371\374\6\365\365\371\324\324\332\305\305\315\341\341\341\333\333\333\314"
+ "\314\315\377\376\376\376\313\376\376\376\14\360\367\307\215\216\206\220\220"
+ "\217\245\245\247\255\255\260\267\267\272\306\306\310\322\322\323\341\341"
+ "\346\351\351\355\344\344\351\356\356\364\202\360\360\365\2\362\362\366\354"
+ "\354\361\202\362\362\366\3\346\346\355\344\344\351\351\351\355\202\360\360"
+ "\365\2\365\365\371\351\351\360\203\334\334\341\14\362\362\366\365\365\371"
+ "\346\346\355\344\344\351\351\351\360\344\344\351\334\334\341\346\346\355"
+ "\371\371\374\365\365\371\371\371\374\376\376\376\202\374\374\376\3\376\376"
+ "\376\354\354\361\312\312\322\202\305\305\315\2\277\277\310\327\327\335\210"
+ "\376\376\376\6\351\351\351\314\314\315\321\321\313\322\322\323\345\345\346"
+ "\374\374\374\210\376\376\376\7\365\365\361\345\345\340\321\321\313\253\252"
+ "\253\227\227\231\212\212\214\205\205\206\206\177\177\177\213\205\205\206"
+ "\207\212\212\214\205\220\220\217\210\223\223\224\202\240\240\241\23\264\264"
+ "\265\322\322\323\341\341\341\351\351\351\365\365\371\371\371\374\356\356"
+ "\361\360\360\365\371\371\374\362\362\366\360\360\365\365\365\371\351\351"
+ "\360\334\334\341\344\344\354\360\360\365\362\362\366\374\372\374\376\376"
+ "\376\202\371\371\374\24\374\374\376\376\376\376\354\354\361\341\341\346\362"
+ "\362\366\365\365\371\371\371\374\365\365\371\327\327\335\334\334\341\374"
+ "\372\374\374\374\376\371\371\374\374\372\374\365\365\365\316\316\326\305"
+ "\305\315\341\341\341\333\333\333\314\314\315\377\376\376\376\313\376\376"
+ "\376\14\360\367\307\215\216\206\217\216\224\245\245\247\255\255\260\267\267"
+ "\272\302\302\302\316\316\326\341\341\346\351\351\355\344\344\351\356\356"
+ "\361\202\360\360\365\7\362\362\366\354\354\361\356\356\364\362\362\366\351"
+ "\351\355\344\344\351\346\346\355\202\360\360\365\16\362\362\366\354\352\362"
+ "\334\334\341\327\327\335\334\334\341\360\360\365\371\371\374\351\351\360"
+ "\344\344\351\351\351\355\344\344\354\334\334\341\346\346\355\374\372\374"
+ "\202\365\365\371\202\376\376\376\4\374\372\374\376\376\376\362\362\366\316"
+ "\316\326\203\305\305\315\2\327\327\335\371\371\374\207\376\376\376\6\361"
+ "\361\361\322\322\323\321\321\313\322\322\323\341\341\341\374\374\372\210"
+ "\376\376\376\10\374\374\372\352\352\343\330\330\320\313\313\301\274\274\274"
+ "\253\252\253\235\235\234\223\223\224\205\220\220\217\205\223\223\224\205"
+ "\220\220\217\204\223\223\224\1\220\220\217\202\215\216\206\203\223\223\224"
+ "\3\220\220\217\215\216\206\220\220\217\202\223\223\224\1\220\220\217\203"
+ "\223\223\224\25\215\216\206\220\220\217\240\240\241\253\252\253\302\302\302"
+ "\333\333\333\341\341\341\351\351\351\365\365\371\371\371\374\356\356\364"
+ "\365\365\371\371\371\374\360\360\365\356\356\364\365\365\371\344\344\351"
+ "\327\327\335\346\346\355\360\360\365\362\362\366\202\374\374\376\202\371"
+ "\371\374\202\376\376\376\22\354\354\361\344\344\354\362\362\366\365\365\371"
+ "\371\371\374\362\362\366\334\334\341\344\344\351\374\374\376\374\374\374"
+ "\371\371\374\374\372\374\362\362\366\316\316\326\312\312\322\341\341\341"
+ "\333\333\333\314\314\315\233\376\376\376\4\336\346\354\236\270\311~\240\270"
+ "i\221\254\202S\201\240\4i\221\254~\240\270\236\270\311\310\327\341\220\376"
+ "\376\376\3\275\317\333\223\260\303~\240\270\204S\201\240\4i\221\254~\240"
+ "\270\250\277\317\371\372\373\213\376\376\376\1\275\317\333\205~\240\270\1"
+ "\236\270\311\217\376\376\376\3\371\372\373\275\317\333\236\270\311\202~\240"
+ "\270\203S\201\240\4^\211\246~\240\270\223\260\303\275\317\333\215\376\376"
+ "\376\205\250\277\317\1\371\372\373\204\376\376\376\6\262\307\325s\231\262"
+ "S\201\240i\221\254\223\260\303\371\372\373\204\376\376\376\1\275\317\333"
+ "\205\250\277\317\1\371\372\373\212\376\376\376\4\323\337\346\236\270\311"
+ "~\240\270^\211\246\202S\201\240\4i\221\254~\240\270\236\270\311\310\327\341"
+ "\202\376\376\376\1\371\372\373\202\323\337\346\2\371\372\373\336\346\354"
+ "\232\376\376\376\1\360\367\307\202\220\220\217\11\240\240\241\255\255\260"
+ "\267\267\272\302\302\302\316\316\326\341\341\346\351\351\355\344\344\351"
+ "\354\354\361\202\360\360\365\7\362\362\366\354\354\361\356\356\364\365\365"
+ "\371\351\351\360\341\341\346\346\346\355\202\360\360\365\20\362\362\366\354"
+ "\354\361\334\334\341\327\327\335\334\334\341\354\352\362\371\371\374\356"
+ "\356\364\344\344\354\351\351\355\346\346\355\341\341\346\351\351\355\374"
+ "\372\374\362\362\366\365\365\371\202\376\376\376\4\371\371\374\374\374\376"
+ "\365\365\371\327\327\335\202\312\312\322\3\305\305\315\327\327\335\371\371"
+ "\371\207\376\376\376\6\365\365\371\327\327\327\321\321\313\322\322\323\337"
+ "\337\331\371\371\371\211\376\376\376\12\361\361\354\337\337\331\330\330\320"
+ "\314\314\315\306\306\310\274\274\274\267\267\272\264\264\265\261\261\260"
+ "\264\264\265\203\261\261\260\214\267\267\272\1\264\264\265\202\253\252\253"
+ "\1\261\261\260\202\267\267\272\1\261\261\260\202\253\252\253\1\264\264\265"
+ "\202\267\267\272\1\264\264\265\202\267\267\272\6\261\261\260\253\252\253"
+ "\264\264\265\274\274\274\306\306\310\327\327\327\202\341\341\341\20\351\351"
+ "\355\371\371\371\371\371\374\362\362\366\371\371\374\365\365\371\354\354"
+ "\361\360\360\365\365\365\371\341\341\346\327\327\335\351\351\355\362\362"
+ "\366\365\365\371\374\374\376\374\372\374\202\371\371\374\2\376\376\376\374"
+ "\374\376\202\351\351\360\20\360\360\365\362\362\366\365\365\371\360\360\365"
+ "\334\334\341\351\351\355\376\376\376\374\372\374\371\371\374\374\372\374"
+ "\360\360\365\312\312\322\324\324\332\341\341\346\333\333\333\314\314\315"
+ "\231\376\376\376\2\323\337\346~\240\270\212S\201\240\2^\211\246\250\277\317"
+ "\214\376\376\376\2\236\270\311^\211\246\213S\201\240\2~\240\270\371\372\373"
+ "\211\376\376\376\1\250\277\317\205S\201\240\1~\240\270\214\376\376\376\3"
+ "\336\346\354\236\270\311i\221\254\214S\201\240\2^\211\246\250\277\317\213"
+ "\376\376\376\205S\201\240\1\323\337\346\202\376\376\376\2\371\372\373s\231"
+ "\262\205S\201\240\1\323\337\346\204\376\376\376\1~\240\270\205S\201\240\1"
+ "\323\337\346\210\376\376\376\2\323\337\346i\221\254\212S\201\240\3^\211\246"
+ "\250\277\317\310\327\341\202~\240\270\2\223\260\303^\211\246\232\376\376"
+ "\376\17\354\366\307\231\232\217\212\212\214\240\240\241\255\255\260\267\267"
+ "\272\302\302\302\316\316\326\341\341\346\351\351\355\344\344\351\354\354"
+ "\361\362\362\366\360\360\365\362\362\366\202\354\354\361\4\365\365\371\354"
+ "\354\361\341\341\346\344\344\354\203\360\360\365\2\354\354\361\334\334\341"
+ "\202\327\327\335\15\346\346\355\371\371\374\360\360\365\346\346\355\351\351"
+ "\360\351\351\355\341\341\346\351\351\355\374\374\374\365\365\371\362\362"
+ "\366\374\374\376\376\376\376\203\371\371\374\6\344\344\351\322\322\323\316"
+ "\316\326\312\312\322\327\327\335\365\365\365\207\376\376\376\2\374\372\374"
+ "\345\345\346\202\322\322\323\2\333\333\333\362\362\366\211\376\376\376\2"
+ "\371\371\371\352\352\343\203\337\337\331\1\333\333\333\202\327\327\327\204"
+ "\322\322\323\202\321\321\313\1\322\322\323\210\327\327\327\2\322\322\323"
+ "\321\321\313\202\313\313\301\1\322\322\323\203\327\327\327\202\313\313\301"
+ "\1\321\321\313\206\327\327\327\3\314\314\315\313\313\301\327\327\327\202"
+ "\333\333\333\202\351\351\351\3\341\341\341\356\356\361\374\372\374\203\371"
+ "\371\374\4\360\360\365\351\351\355\362\362\366\356\356\364\202\327\327\335"
+ "\1\354\354\361\202\365\365\371\1\374\374\376\202\371\371\374\4\374\372\374"
+ "\376\376\376\371\371\374\351\351\360\202\354\352\362\17\356\356\364\362\362"
+ "\366\356\356\364\334\334\341\354\354\361\376\376\376\374\372\374\371\371"
+ "\374\374\372\374\354\354\361\312\312\322\327\327\335\345\345\346\333\333"
+ "\333\314\314\315\230\376\376\376\1\275\317\333\216S\201\240\1\310\327\341"
+ "\211\376\376\376\2\323\337\346^\211\246\216S\201\240\2^\211\246\275\317\333"
+ "\210\376\376\376\1\250\277\317\205S\201\240\1~\240\270\213\376\376\376\1"
+ "~\240\270\221S\201\240\1s\231\262\212\376\376\376\205S\201\240\4\250\277"
+ "\317\376\376\376\336\346\354^\211\246\206S\201\240\1\371\372\373\204\376"
+ "\376\376\1~\240\270\205S\201\240\1\323\337\346\207\376\376\376\1\236\270"
+ "\311\216S\201\240\1\323\337\346\202\250\277\317\2S\201\240^\211\246\232\376"
+ "\376\376\31\354\366\307\244\246\230\212\212\214\240\240\241\255\255\260\264"
+ "\264\265\302\302\302\314\314\315\341\341\341\351\351\351\341\341\346\354"
+ "\354\361\362\362\366\360\360\365\362\362\366\354\354\361\346\346\355\362"
+ "\362\366\354\354\361\341\341\346\344\344\351\356\356\364\360\360\365\356"
+ "\356\364\354\354\361\202\334\334\341\4\327\327\335\344\344\351\365\365\371"
+ "\362\362\366\203\351\351\360\5\344\344\354\351\351\355\371\371\374\365\365"
+ "\371\356\356\364\202\376\376\376\5\374\372\374\371\371\374\374\374\376\354"
+ "\354\361\327\327\335\202\322\322\323\2\327\327\335\362\362\366\210\376\376"
+ "\376\5\361\361\361\327\327\327\322\322\323\327\327\327\355\355\351\212\376"
+ "\376\376\5\365\365\361\352\352\343\345\345\340\355\355\351\361\361\361\202"
+ "\355\355\355\1\351\351\355\204\351\351\351\203\345\345\340\205\351\351\351"
+ "\2\345\345\346\345\345\340\202\337\337\331\2\345\345\340\351\351\351\202"
+ "\355\355\355\5\351\351\355\345\345\340\337\337\331\345\345\340\355\355\351"
+ "\205\355\355\355\22\351\351\351\337\337\331\345\345\340\355\355\355\351\351"
+ "\355\355\355\355\362\362\366\351\351\351\345\345\340\361\361\361\376\376"
+ "\376\371\371\374\374\372\374\371\371\374\354\354\361\351\351\355\365\365"
+ "\371\351\351\355\202\327\327\335\1\360\360\365\202\365\365\371\203\371\371"
+ "\374\5\374\372\374\376\376\376\371\371\371\351\351\360\354\352\362\202\351"
+ "\351\360\16\356\356\364\354\352\362\334\334\341\360\360\365\376\376\376\374"
+ "\372\374\371\371\374\374\372\374\346\346\355\316\316\326\341\341\346\345"
+ "\345\346\333\333\333\314\314\315\227\376\376\376\1\275\317\333\217S\201\240"
+ "\1\371\372\373\210\376\376\376\1\275\317\333\222S\201\240\1\310\327\341\207"
+ "\376\376\376\1\250\277\317\205S\201\240\1~\240\270\213\376\376\376\1~\240"
+ "\270\222S\201\240\1~\240\270\211\376\376\376\205S\201\240\3\250\277\317\376"
+ "\376\376i\221\254\207S\201\240\205\376\376\376\1~\240\270\205S\201\240\1"
+ "\323\337\346\206\376\376\376\1\262\307\325\217S\201\240\1\376\376\376\202"
+ "\323\337\346\202\275\317\333\232\376\376\376\27\354\366\307\256\263\231\212"
+ "\212\214\235\235\234\253\252\253\264\264\265\302\302\302\314\314\315\334"
+ "\334\341\351\351\355\341\341\346\354\354\361\362\362\366\360\360\365\362"
+ "\362\366\354\354\361\346\346\355\362\362\366\356\356\364\341\341\346\344"
+ "\344\351\356\356\364\360\360\365\202\354\354\361\202\334\334\341\23\327\327"
+ "\335\341\341\346\365\365\371\362\362\366\354\354\361\351\351\360\354\354"
+ "\361\346\346\355\351\351\360\371\371\374\365\365\371\356\356\364\374\372"
+ "\374\376\376\376\374\372\374\365\365\371\374\374\376\365\365\365\341\341"
+ "\341\202\327\327\327\2\333\333\333\361\361\361\210\376\376\376\2\371\371"
+ "\371\341\341\341\202\327\327\327\1\351\351\351\212\376\376\376\5\374\374"
+ "\372\361\361\354\357\357\346\361\361\354\371\371\371\203\374\372\374\6\370"
+ "\370\365\365\365\361\370\370\365\371\371\371\370\370\365\365\365\361\203"
+ "\361\361\354\206\357\357\346\2\365\365\361\371\371\371\202\374\372\374\5"
+ "\371\371\371\361\361\354\352\352\343\357\357\346\365\365\361\202\374\372"
+ "\374\202\371\371\371\27\374\372\374\371\371\371\357\357\346\352\352\343\365"
+ "\365\365\371\371\371\365\365\365\371\371\371\370\370\365\352\352\343\351"
+ "\351\351\365\365\371\376\376\376\374\372\374\374\374\376\365\365\371\346"
+ "\346\355\351\351\355\365\365\371\341\341\346\324\324\332\334\334\341\365"
+ "\365\371\202\362\362\366\202\371\371\374\202\374\372\374\13\376\376\376\365"
+ "\365\371\354\352\362\351\351\360\344\344\354\346\346\355\356\356\364\351"
+ "\351\360\341\341\346\365\365\371\376\376\376\203\374\372\374\6\341\341\346"
+ "\316\316\326\344\344\351\345\345\346\333\333\333\314\314\315\227\376\376"
+ "\376\1^\211\246\206S\201\240\2^\211\246\223\260\303\203\250\277\317\4\210"
+ "\250\275s\231\262S\201\240i\221\254\210\376\376\376\2\336\346\354^\211\246"
+ "\207S\201\240\203~\240\270\1^\211\246\207S\201\240\2^\211\246\371\372\373"
+ "\206\376\376\376\1\250\277\317\205S\201\240\1~\240\270\213\376\376\376\1"
+ "\236\270\311\205S\201\240\1i\221\254\204~\240\270\1i\221\254\210S\201\240"
+ "\1\275\317\333\210\376\376\376\205S\201\240\2\223\260\303s\231\262\207S\201"
+ "\240\1i\221\254\205\376\376\376\1~\240\270\205S\201\240\1\323\337\346\205"
+ "\376\376\376\1\371\372\373\207S\201\240\2i\221\254\223\260\303\203\250\277"
+ "\317\4\210\250\275i\221\254S\201\240s\231\262\240\376\376\376\32\273\301"
+ "\235\205\205\206\235\235\234\253\252\253\264\264\265\273\273\302\314\314"
+ "\315\333\333\333\351\351\351\341\341\346\351\351\355\362\362\366\360\360"
+ "\365\362\362\366\356\356\364\344\344\351\356\356\364\362\362\366\344\344"
+ "\354\344\344\351\356\356\364\362\362\366\354\352\362\356\356\364\341\341"
+ "\346\327\327\335\202\334\334\341\3\360\360\365\365\365\371\356\356\364\204"
+ "\354\354\361\4\365\365\371\371\371\371\356\356\361\371\371\374\202\376\376"
+ "\376\4\365\365\371\371\371\374\374\372\374\351\351\355\202\333\333\333\2"
+ "\337\337\331\356\356\361\211\376\376\376\1\355\355\355\202\337\337\331\2"
+ "\345\345\340\371\371\371\212\376\376\376\4\371\371\371\361\361\354\357\357"
+ "\346\370\370\365\204\376\376\376\7\371\371\371\370\370\365\371\371\371\374"
+ "\374\374\374\374\376\374\374\374\371\371\371\205\370\370\365\2\371\371\371"
+ "\374\374\374\203\376\376\376\2\371\371\371\361\361\354\202\357\357\346\1"
+ "\371\371\371\206\376\376\376\13\365\365\361\357\357\346\361\361\354\374\374"
+ "\374\371\371\371\370\370\365\374\374\374\361\361\361\345\345\340\355\355"
+ "\355\374\372\374\202\376\376\376\14\374\372\374\354\354\361\341\341\346\356"
+ "\356\364\362\362\366\334\334\341\324\324\332\344\344\351\365\365\371\356"
+ "\356\364\362\362\366\365\365\371\202\371\371\374\202\374\372\374\12\362\362"
+ "\366\356\356\364\344\344\354\341\341\346\344\344\354\354\354\361\351\351"
+ "\360\344\344\354\371\371\374\376\376\376\202\374\372\374\7\371\371\374\334"
+ "\334\341\324\324\332\351\351\355\345\345\346\333\333\333\314\314\315\226"
+ "\376\376\376\1\250\277\317\206S\201\240\1\223\260\303\210\376\376\376\1\336"
+ "\346\354\210\376\376\376\1s\231\262\206S\201\240\2\250\277\317\363\366\370"
+ "\204\376\376\376\2\275\317\333^\211\246\206S\201\240\1\223\260\303\206\376"
+ "\376\376\1\250\277\317\205S\201\240\1~\240\270\213\376\376\376\5\310\327"
+ "\341S\201\240i\221\254\236\270\311\323\337\346\207\376\376\376\2\371\372"
+ "\373~\240\270\206S\201\240\1\210\250\275\210\376\376\376\213S\201\240\4^"
+ "\211\246i\221\254S\201\240~\240\270\205\376\376\376\1~\240\270\205S\201\240"
+ "\1\323\337\346\205\376\376\376\1\223\260\303\206S\201\240\1\250\277\317\210"
+ "\376\376\376\1\336\346\354\240\376\376\376\15\307\322\237\205\205\206\227"
+ "\227\231\253\252\253\264\264\265\273\273\302\314\314\315\333\333\333\351"
+ "\351\351\341\341\346\346\346\355\362\362\366\356\356\364\202\360\360\365"
+ "\12\344\344\351\354\354\361\362\362\366\351\351\355\344\344\351\354\354\361"
+ "\362\362\366\351\351\360\356\356\364\341\341\346\203\334\334\341\5\354\354"
+ "\361\365\365\371\360\360\365\356\356\364\356\356\361\202\354\354\361\4\365"
+ "\365\371\371\371\374\356\356\361\365\365\371\202\376\376\376\5\371\371\371"
+ "\365\365\371\376\376\376\361\361\361\345\345\346\202\341\341\341\2\355\355"
+ "\355\374\374\374\210\376\376\376\5\371\371\371\345\345\340\337\337\331\345"
+ "\345\340\365\365\361\213\376\376\376\1\371\371\371\202\361\361\354\1\371"
+ "\371\371\204\376\376\376\1\374\374\372\202\370\370\365\2\371\371\371\374"
+ "\374\376\211\376\376\376\2\374\374\372\365\365\361\202\357\357\346\2\361"
+ "\361\354\371\371\371\206\376\376\376\1\371\371\371\202\357\357\346\3\371"
+ "\371\371\374\372\374\370\370\365\202\371\371\371\202\352\352\343\1\365\365"
+ "\365\203\376\376\376\5\365\365\371\351\351\351\345\345\346\365\365\371\351"
+ "\351\355\202\327\327\335\5\351\351\360\365\365\371\354\354\361\362\362\366"
+ "\365\365\371\204\371\371\374\10\362\362\366\354\354\361\341\341\346\334\334"
+ "\341\341\341\346\351\351\360\346\346\355\351\351\360\202\374\374\376\202"
+ "\374\372\374\1\365\365\371\202\334\334\341\4\351\351\355\345\345\346\333"
+ "\333\333\314\314\315\226\376\376\376\1s\231\262\205S\201\240\1~\240\270\221"
+ "\376\376\376\1\275\317\333\206S\201\240\1\275\317\333\207\376\376\376\2\336"
+ "\346\354^\211\246\206S\201\240\1\371\372\373\205\376\376\376\1\250\277\317"
+ "\205S\201\240\1~\240\270\214\376\376\376\1\336\346\354\214\376\376\376\1"
+ "~\240\270\206S\201\240\210\376\376\376\211S\201\240\2^\211\246\275\317\333"
+ "\203\376\376\376\1\336\346\354\205\376\376\376\1~\240\270\205S\201\240\1"
+ "\323\337\346\205\376\376\376\1i\221\254\205S\201\240\1\210\250\275\252\376"
+ "\376\376\14\325\343\240\205\205\206\223\223\224\253\252\253\264\264\265\273"
+ "\273\302\314\314\315\333\333\333\351\351\351\341\341\346\344\344\351\362"
+ "\362\366\202\360\360\365\1\362\362\366\202\346\346\355\16\365\365\371\354"
+ "\354\361\344\344\351\354\354\361\362\362\366\351\351\360\354\354\361\344"
+ "\344\351\334\334\341\341\341\346\334\334\341\346\346\355\365\365\371\362"
+ "\362\366\202\360\360\365\202\356\356\361\4\365\365\371\374\372\374\361\361"
+ "\361\365\365\371\202\376\376\376\5\371\371\374\365\365\371\374\374\376\371"
+ "\371\371\355\355\351\202\345\345\346\2\355\355\351\374\374\374\211\376\376"
+ "\376\1\361\361\354\202\345\345\340\1\361\361\354\214\376\376\376\1\371\371"
+ "\371\202\365\365\361\1\374\372\374\204\376\376\376\1\374\374\372\203\370"
+ "\370\365\3\371\371\371\374\372\374\374\374\374\202\376\376\376\5\374\374"
+ "\374\374\372\374\370\370\365\365\365\361\361\361\354\202\357\357\346\2\370"
+ "\370\365\374\374\372\206\376\376\376\14\376\376\374\361\361\354\352\352\343"
+ "\365\365\361\376\376\376\371\371\371\370\370\365\374\374\376\365\365\361"
+ "\352\352\343\355\355\351\371\371\371\203\376\376\376\14\361\361\361\341\341"
+ "\341\351\351\355\365\365\371\341\341\346\327\327\327\334\334\341\360\360"
+ "\365\365\365\371\354\354\361\362\362\366\365\365\371\203\371\371\374\3\365"
+ "\365\371\362\362\366\351\351\360\202\334\334\341\1\341\341\346\202\351\351"
+ "\360\14\360\360\365\376\376\376\374\374\376\374\372\374\374\374\374\360\360"
+ "\365\334\334\341\344\344\351\355\355\355\345\345\346\333\333\333\314\314"
+ "\315\226\376\376\376\206S\201\240\1\262\307\325\221\376\376\376\1s\231\262"
+ "\205S\201\240\1\223\260\303\211\376\376\376\1\262\307\325\206S\201\240\1"
+ "\262\307\325\205\376\376\376\1\250\277\317\205S\201\240\1~\240\270\231\376"
+ "\376\376\1\336\346\354\206S\201\240\1\336\346\354\207\376\376\376\210S\201"
+ "\240\2^\211\246\336\346\354\212\376\376\376\1~\240\270\205S\201\240\1\323"
+ "\337\346\205\376\376\376\206S\201\240\1\310\327\341\252\376\376\376\14\337"
+ "\360\236\215\216\206\220\220\217\245\245\247\264\264\265\274\274\274\306"
+ "\306\310\327\327\335\345\345\346\341\341\346\344\344\351\362\362\366\202"
+ "\360\360\365\10\362\362\366\351\351\355\344\344\351\362\362\366\356\356\364"
+ "\344\344\354\354\354\361\365\365\371\202\351\351\360\5\346\346\355\334\334"
+ "\341\341\341\346\334\334\341\344\344\351\203\362\362\366\203\360\360\365"
+ "\2\365\365\371\374\372\374\202\362\362\366\203\376\376\376\4\365\365\371"
+ "\371\371\371\374\374\374\365\365\361\202\355\355\351\2\361\361\354\371\371"
+ "\371\211\376\376\376\5\371\371\371\357\357\346\352\352\343\357\357\346\374"
+ "\374\372\214\376\376\376\4\371\371\371\365\365\361\370\370\365\374\372\374"
+ "\205\376\376\376\1\374\374\372\202\370\370\365\205\365\365\361\204\361\361"
+ "\354\2\365\365\361\371\371\371\210\376\376\376\10\365\365\361\357\357\346"
+ "\361\361\354\374\374\372\371\371\371\370\370\365\374\372\374\374\374\372"
+ "\202\357\357\346\1\365\365\361\203\376\376\376\3\374\372\374\355\355\351"
+ "\345\345\346\202\362\362\366\10\341\341\341\333\333\333\345\345\346\365\365"
+ "\371\361\361\361\354\354\361\362\362\366\365\365\371\202\371\371\374\1\365"
+ "\365\371\202\362\362\366\22\344\344\351\327\327\335\334\334\341\341\341\346"
+ "\354\354\361\354\352\362\365\365\371\376\376\376\374\374\376\374\372\374"
+ "\374\374\374\354\354\361\334\334\341\351\351\355\355\355\355\345\345\346"
+ "\333\333\333\314\314\315\226\376\376\376\206S\201\240\1\250\277\317\220\376"
+ "\376\376\1\336\346\354\206S\201\240\1\350\356\362\212\376\376\376\1^\211"
+ "\246\205S\201\240\1\210\250\275\205\376\376\376\1\250\277\317\205S\201\240"
+ "\1~\240\270\232\376\376\376\206S\201\240\1\323\337\346\207\376\376\376\207"
+ "S\201\240\2^\211\246\336\346\354\213\376\376\376\1~\240\270\205S\201\240"
+ "\1\323\337\346\205\376\376\376\206S\201\240\1\310\327\341\252\376\376\376"
+ "\27\346\363\262\231\232\217\220\220\217\245\245\247\264\264\265\274\274\274"
+ "\306\306\310\324\324\332\344\344\351\345\345\346\341\341\346\360\360\365"
+ "\362\362\366\356\356\364\362\362\366\354\354\361\341\341\346\356\356\364"
+ "\362\362\366\351\351\355\351\351\360\365\365\371\354\354\361\202\351\351"
+ "\355\1\334\334\341\203\341\341\346\1\356\356\361\205\362\362\366\5\365\365"
+ "\371\371\371\374\365\365\371\365\365\361\374\374\374\202\376\376\376\202"
+ "\371\371\371\2\376\376\376\371\371\371\203\361\361\354\1\370\370\365\212"
+ "\376\376\376\1\365\365\361\202\357\357\346\1\365\365\361\215\376\376\376"
+ "\1\374\374\372\202\370\370\365\1\374\374\372\206\376\376\376\202\374\374"
+ "\372\1\371\371\371\205\370\370\365\202\374\374\372\211\376\376\376\14\365"
+ "\365\361\357\357\346\361\361\354\374\374\372\374\374\374\370\370\365\371"
+ "\371\371\376\376\376\365\365\361\357\357\346\365\365\361\374\374\372\203"
+ "\376\376\376\11\365\365\365\345\345\346\355\355\351\371\371\371\355\355\355"
+ "\337\337\331\341\341\341\355\355\355\371\371\371\202\355\355\355\1\362\362"
+ "\366\202\371\371\374\10\365\365\371\362\362\366\365\365\371\362\362\366\334"
+ "\334\341\327\327\335\334\334\341\341\341\346\202\356\356\364\14\371\371\374"
+ "\376\376\376\374\374\376\374\374\374\374\372\374\351\351\355\341\341\346"
+ "\354\354\361\355\355\355\345\345\346\333\333\333\314\314\315\226\376\376"
+ "\376\206S\201\240\1~\240\270\220\376\376\376\1\262\307\325\205S\201\240\1"
+ "~\240\270\213\376\376\376\1\223\260\303\205S\201\240\1^\211\246\205\376\376"
+ "\376\1\250\277\317\205S\201\240\1~\240\270\232\376\376\376\1s\231\262\205"
+ "S\201\240\1\323\337\346\207\376\376\376\206S\201\240\2^\211\246\336\346\354"
+ "\214\376\376\376\1~\240\270\205S\201\240\1\323\337\346\205\376\376\376\206"
+ "S\201\240\1~\240\270\253\376\376\376\30\244\246\230\212\212\214\240\240\241"
+ "\261\261\260\274\274\274\306\306\310\322\322\323\345\345\346\344\344\351"
+ "\341\341\346\356\356\361\365\365\371\360\360\365\362\362\366\360\360\365"
+ "\341\341\346\351\351\355\365\365\371\354\354\361\351\351\360\362\362\366"
+ "\356\356\364\346\346\355\354\354\361\202\341\341\346\3\346\346\355\341\341"
+ "\346\354\354\361\202\362\362\366\202\365\365\371\6\365\365\365\365\365\371"
+ "\371\371\374\371\371\371\365\365\361\371\371\371\202\376\376\376\5\374\374"
+ "\374\370\370\365\374\374\374\374\372\374\365\365\361\202\361\361\354\2\365"
+ "\365\361\374\374\374\211\376\376\376\5\371\371\371\361\361\354\357\357\346"
+ "\361\361\354\374\374\372\215\376\376\376\1\374\374\376\202\371\371\371\2"
+ "\374\372\374\374\374\376\210\376\376\376\2\374\374\376\376\376\376\204\374"
+ "\374\374\210\376\376\376\5\365\365\361\357\357\346\361\361\354\374\374\372"
+ "\374\374\374\202\370\370\365\2\374\372\374\365\365\361\202\357\357\346\1"
+ "\371\371\371\203\376\376\376\3\374\372\374\361\361\354\352\352\343\202\365"
+ "\365\365\16\345\345\346\341\341\341\345\345\346\365\365\371\365\365\365\351"
+ "\351\355\356\356\361\365\365\371\371\371\374\365\365\371\362\362\366\360"
+ "\360\365\365\365\371\351\351\355\203\327\327\335\5\344\344\351\360\360\365"
+ "\362\362\366\374\372\374\376\376\376\202\374\374\376\10\371\371\371\344\344"
+ "\354\346\346\355\354\354\361\355\355\355\345\345\346\333\333\333\314\314"
+ "\315\226\376\376\376\1s\231\262\206S\201\240\1\210\250\275\217\376\376\376"
+ "\1\210\250\275\205S\201\240\1\250\277\317\213\376\376\376\1\262\307\325\206"
+ "S\201\240\205\376\376\376\1\250\277\317\205S\201\240\1~\240\270\232\376\376"
+ "\376\1~\240\270\205S\201\240\1\323\337\346\207\376\376\376\206S\201\240\1"
+ "\262\307\325\215\376\376\376\1~\240\270\205S\201\240\1\323\337\346\205\376"
+ "\376\376\1^\211\246\206S\201\240\1\223\260\303\252\376\376\376\15\256\263"
+ "\231\212\212\214\235\235\234\255\255\260\274\274\274\302\302\302\316\316"
+ "\326\341\341\346\344\344\351\341\341\346\354\354\361\365\365\371\360\360"
+ "\365\202\362\362\366\202\344\344\351\16\365\365\371\356\356\364\351\351\360"
+ "\362\362\366\360\360\365\346\346\355\354\354\361\344\344\351\341\341\346"
+ "\351\351\355\341\341\346\351\351\351\362\362\366\365\365\365\202\365\365"
+ "\371\2\370\370\365\365\365\371\202\370\370\365\5\341\341\341\334\334\341"
+ "\361\361\361\370\370\365\371\371\371\202\370\370\365\6\362\362\366\345\345"
+ "\346\322\322\323\337\337\331\355\355\351\365\365\365\202\374\372\374\3\365"
+ "\365\365\351\351\351\345\345\346\203\351\351\351\3\345\345\346\341\341\346"
+ "\355\355\355\202\357\357\346\3\365\365\361\351\351\351\345\345\346\203\351"
+ "\351\351\2\341\341\346\355\355\355\202\371\371\371\202\374\372\374\202\345"
+ "\345\346\202\351\351\351\1\345\345\346\202\341\341\341\1\362\362\366\203"
+ "\371\371\371\202\345\345\346\5\341\341\341\341\341\346\341\341\341\333\333"
+ "\333\324\324\332\202\322\322\323\4\327\327\335\341\341\341\356\356\361\365"
+ "\365\365\202\371\371\371\202\374\374\374\1\370\370\365\202\357\357\346\13"
+ "\371\371\371\374\374\374\370\370\365\345\345\346\341\341\346\345\345\346"
+ "\337\337\331\330\330\320\333\333\333\334\334\341\351\351\355\202\371\371"
+ "\371\23\365\365\361\357\357\346\361\361\354\371\371\371\361\361\361\352\352"
+ "\343\345\345\340\355\355\355\371\371\371\355\355\355\327\327\327\334\334"
+ "\341\362\362\366\365\365\371\362\362\366\360\360\365\362\362\366\365\365"
+ "\371\345\345\346\202\327\327\335\4\334\334\341\346\346\355\362\362\366\365"
+ "\365\371\204\374\374\376\2\365\365\371\346\346\355\202\354\354\361\4\351"
+ "\351\355\345\345\346\333\333\333\314\314\315\226\376\376\376\1\236\270\311"
+ "\207S\201\240\2^\211\246\250\277\317\215\376\376\376\1i\221\254\205S\201"
+ "\240\1\310\327\341\213\376\376\376\1\323\337\346\206S\201\240\1\323\337\346"
+ "\204\376\376\376\1\250\277\317\205S\201\240\1~\240\270\232\376\376\376\1"
+ "~\240\270\205S\201\240\1\323\337\346\207\376\376\376\206S\201\240\1\323\337"
+ "\346\215\376\376\376\1~\240\270\205S\201\240\1\323\337\346\205\376\376\376"
+ "\1\223\260\303\207S\201\240\2^\211\246\250\277\317\250\376\376\376\14\307"
+ "\322\237\205\205\206\227\227\231\255\255\260\267\267\272\302\302\302\322"
+ "\322\323\341\341\341\344\344\351\334\334\341\351\351\355\365\365\371\202"
+ "\360\360\365\6\365\365\371\351\351\355\341\341\346\360\360\365\362\362\366"
+ "\354\354\361\202\362\362\366\23\346\346\355\354\354\361\346\346\355\341\341"
+ "\346\351\351\355\351\351\351\345\345\346\360\360\365\365\365\365\365\365"
+ "\371\371\371\371\370\370\365\365\365\365\351\351\351\235\235\234557IIL\240"
+ "\240\241\351\351\351\202\361\361\361\2\314\314\315\177\177\177\202557\11"
+ "\177\177\177\327\327\327\351\351\351\362\362\366\365\365\365\235\235\234"
+ "\177\177\177jjk\\\\^\202jjk\202vvw\10\220\220\217\345\345\346\352\352\343"
+ "\306\306\310\177\177\177jjk\\\\^jjk\202\\\\^\12\212\212\214\341\341\346\361"
+ "\361\361\365\365\365\302\302\302\177\177\177jjk\\\\^jjk\\\\^\202vvw\5\253"
+ "\252\253\356\356\361\362\362\366\306\306\310\212\212\214\202jjk\203IIL\202"
+ "vvw\1\\\\^\202IIL\16jjk\245\245\247\327\327\327\355\355\355\361\361\361\361"
+ "\361\354\357\357\346\361\361\354\374\372\374\376\376\376\370\370\365\341"
+ "\341\341\205\205\206jjk\204\\\\^\4jjk\205\205\206\355\355\355\361\361\361"
+ "\202\357\357\346\202\370\370\365\6\355\355\351\352\352\343\355\355\351\370"
+ "\370\365\365\365\365\274\274\274\202\205\205\206\7\355\355\355\356\356\361"
+ "\355\355\355\356\356\361\365\365\371\361\361\361\334\334\341\202\333\333"
+ "\333\5\334\334\341\354\354\361\365\365\371\371\371\374\376\376\376\203\374"
+ "\374\376\3\360\360\365\351\351\360\354\354\361\202\351\351\355\3\341\341"
+ "\346\327\327\335\314\314\315\226\376\376\376\2\371\372\373^\211\246\211S"
+ "\201\240\2\210\250\275\310\327\341\212\376\376\376\206S\201\240\1\323\337"
+ "\346\213\376\376\376\1\350\356\362\206S\201\240\1\323\337\346\204\376\376"
+ "\376\1\250\277\317\205S\201\240\1~\240\270\221\376\376\376\3\336\346\354"
+ "\275\317\333\236\270\311\203~\240\270\211S\201\240\1\323\337\346\207\376"
+ "\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201\240"
+ "\1\323\337\346\205\376\376\376\1\371\372\373\212S\201\240\2\223\260\303\323"
+ "\337\346\245\376\376\376\26\325\343\240\215\216\206\223\223\224\245\245\247"
+ "\267\267\272\302\302\302\314\314\315\333\333\333\345\345\346\334\334\341"
+ "\344\344\351\365\365\371\362\362\366\360\360\365\365\365\371\356\356\364"
+ "\341\341\346\354\354\361\365\365\371\356\356\364\360\360\365\365\365\371"
+ "\202\351\351\355\2\354\354\361\344\344\351\202\354\354\361\2\345\345\346"
+ "\356\356\361\202\365\365\365\5\371\371\371\365\365\365\333\333\333jjk\14"
+ "\14\15\202\0\0\0\7jjk\235\235\234\341\341\341\245\245\247!\"!557jjk\202\0"
+ "\0\0\7\205\205\206\264\264\265\345\345\346\355\355\355\212\212\214jjkvvw"
+ "\203\0\0\0\6\177\177\177\212\212\214\205\205\206\327\327\327\341\341\341"
+ "\253\252\253\203\\\\^\202\0\0\0\24\177\177\177\227\227\231\264\264\265\345"
+ "\345\346\355\355\355\220\220\217jjkvvw\14\14\15\0\0\0\14\14\15\240\240\241"
+ "\255\255\260\220\220\217\341\341\341\351\351\351\227\227\231vvw\177\177\177"
+ "vvw\202\0\0\0\25\\\\^\306\306\310\240\240\241\177\177\177jjk\\\\^!\"!\14"
+ "\14\15!\"!\223\223\224\306\306\310\337\337\331\355\355\351\371\371\371\374"
+ "\374\374\371\371\371\365\365\365\240\240\241vvw\177\177\177jjk\202\0\0\0"
+ "\4vvw\302\302\302\205\205\206\333\333\333\202\345\345\340\3\361\361\354\371"
+ "\371\371\361\361\354\202\357\357\346\32\365\365\361\371\371\371\355\355\351"
+ "vvw!\"!IIL\314\314\315\341\341\341\345\345\346\355\355\355\371\371\371\351"
+ "\351\351\334\334\341\333\333\333\334\334\341\341\341\346\362\362\366\365"
+ "\365\371\371\371\374\376\376\376\374\374\376\376\376\376\374\372\374\356"
+ "\356\364\354\354\361\351\351\360\202\351\351\355\3\341\341\346\327\327\327"
+ "\306\306\310\227\376\376\376\1\275\317\333\213S\201\240\2i\221\254\275\317"
+ "\333\210\376\376\376\206S\201\240\1\323\337\346\214\376\376\376\206S\201"
+ "\240\1\323\337\346\204\376\376\376\1\250\277\317\205S\201\240\1~\240\270"
+ "\216\376\376\376\3\371\372\373\250\277\317i\221\254\217S\201\240\1\323\337"
+ "\346\207\376\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270"
+ "\205S\201\240\1\323\337\346\206\376\376\376\1\275\317\333\213S\201\240\2"
+ "i\221\254\275\317\333\243\376\376\376\11\347\363\272\241\242\230\220\220"
+ "\217\245\245\247\267\267\272\302\302\302\314\314\315\327\327\335\344\344"
+ "\351\202\341\341\346\3\360\360\365\365\365\371\360\360\365\202\362\362\366"
+ "\16\341\341\346\344\344\351\365\365\371\362\362\366\360\360\365\365\365\371"
+ "\354\354\361\351\351\355\356\356\361\344\344\351\354\354\361\360\360\365"
+ "\351\351\355\355\355\355\203\365\365\365\6\314\314\315IIL\14\14\15\306\306"
+ "\310!\"!\0\0\0\202\227\227\231\27\223\223\224\14\14\15\\\\^\355\355\355\255"
+ "\255\260557\0\0\0jjkvvw\327\327\327\341\341\341\322\322\323vvw\177\177\177"
+ "\227\227\231\0\0\0\14\14\15\274\274\274\261\261\260\253\252\253\314\314\315"
+ "\333\333\333\322\322\323\202vvw\11\177\177\177\0\0\0IIL\333\333\333\314\314"
+ "\315\267\267\272\333\333\333\345\345\346\302\302\302\202vvw\35""557\0\0\0"
+ "vvw\322\322\323\333\333\333\245\245\247\327\327\327\341\341\341\302\302\302"
+ "\227\227\231\264\264\265\177\177\177!\"!\0\0\0\255\255\260\327\327\327\274"
+ "\274\274\235\235\234\177\177\177vvw\212\212\214\177\177\177\14\14\15\0\0"
+ "\0jjk\302\302\302\351\351\351\361\361\361\365\365\365\202\370\370\365\4\302"
+ "\302\302\245\245\247\227\227\231jjk\202\0\0\0\6\327\327\327\334\334\341\267"
+ "\267\272\314\314\315\330\330\320\345\345\340\202\370\370\365\202\357\357"
+ "\346\33\361\361\354\371\371\371\365\365\365\274\274\274\177\177\177\0\0\0"
+ "\14\14\15\235\235\234\322\322\323\333\333\333\356\356\361\365\365\365\345"
+ "\345\346\341\341\341\334\334\341\341\341\341\351\351\355\371\371\374\365"
+ "\365\371\374\372\374\376\376\376\374\374\376\376\376\376\371\371\374\356"
+ "\356\364\354\354\361\346\346\355\202\351\351\355\3\341\341\341\324\324\332"
+ "\306\306\310\230\376\376\376\2\310\327\341^\211\246\213S\201\240\2i\221\254"
+ "\336\346\354\205\376\376\376\1\336\346\354\206S\201\240\1\323\337\346\214"
+ "\376\376\376\206S\201\240\1\323\337\346\204\376\376\376\1\250\277\317\205"
+ "S\201\240\1~\240\270\215\376\376\376\2\250\277\317^\211\246\221S\201\240"
+ "\1\323\337\346\207\376\376\376\206S\201\240\1\323\337\346\215\376\376\376"
+ "\1~\240\270\205S\201\240\1\323\337\346\207\376\376\376\2\275\317\333^\211"
+ "\246\213S\201\240\2s\231\262\336\346\354\242\376\376\376\10\256\263\231\212"
+ "\212\214\240\240\241\264\264\265\302\302\302\314\314\315\327\327\327\345"
+ "\345\346\202\341\341\346\16\356\356\364\365\365\371\360\360\365\362\362\366"
+ "\365\365\371\346\346\355\341\341\346\356\356\364\365\365\371\362\362\366"
+ "\365\365\371\356\356\364\344\344\351\356\356\361\202\351\351\355\3\365\365"
+ "\371\361\361\361\355\355\355\202\365\365\361\5\327\327\327IIL\0\0\0\376\376"
+ "\376\306\306\310\202\0\0\0\27\371\371\371\306\306\310\14\14\15IIL\361\361"
+ "\361\327\327\327\212\212\214\14\14\15\0\0\0\212\212\214\223\223\224\302\302"
+ "\302\327\327\327\333\333\333\322\322\323\264\264\265vvw!\"!\0\0\0vvw\227"
+ "\227\231\255\255\260\306\306\310\202\333\333\333\24\314\314\315\240\240\241"
+ "557\0\0\0\253\252\253\227\227\231\245\245\247\274\274\274\327\327\327\345"
+ "\345\346\341\341\341\322\322\323\220\220\217557\0\0\0\\\\^\223\223\224\245"
+ "\245\247\274\274\274\322\322\323\202\341\341\341\10\327\327\327\274\274\274"
+ "jjk!\"!\0\0\0vvw\223\223\224\227\227\231\202\235\235\234\32\177\177\177j"
+ "jk\177\177\177\223\223\224557\0\0\0\\\\^\302\302\302\345\345\346\361\361"
+ "\361\371\371\371\365\365\365\337\337\331\313\313\301\212\212\214\\\\^\0\0"
+ "\0\14\14\15\212\212\214\240\240\241\261\261\260\302\302\302\321\321\313\355"
+ "\355\351\370\370\365\361\361\354\202\357\357\346\12\365\365\361\371\371\371"
+ "\355\355\351\177\177\177jjk!\"!\0\0\0jjk\274\274\274\322\322\323\202\355"
+ "\355\355\202\345\345\340\22\341\341\341\345\345\346\362\362\366\371\371\374"
+ "\365\365\371\371\371\374\374\372\374\376\376\376\374\374\376\365\365\371"
+ "\360\360\365\351\351\355\346\346\355\351\351\355\351\351\351\334\334\341"
+ "\324\324\332\302\302\302\232\376\376\376\1\236\270\311\214S\201\240\1\275"
+ "\317\333\204\376\376\376\1\323\337\346\206S\201\240\1\323\337\346\214\376"
+ "\376\376\206S\201\240\1\323\337\346\204\376\376\376\1\250\277\317\205S\201"
+ "\240\1~\240\270\214\376\376\376\1~\240\270\223S\201\240\1\323\337\346\207"
+ "\376\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201"
+ "\240\1\323\337\346\210\376\376\376\2\371\372\373\223\260\303\213S\201\240"
+ "\2^\211\246\336\346\354\241\376\376\376\14\273\301\235\212\212\214\227\227"
+ "\231\255\255\260\274\274\274\306\306\310\322\322\323\341\341\346\344\344"
+ "\351\334\334\341\351\351\355\365\365\371\202\360\360\365\4\365\365\371\356"
+ "\356\361\334\334\341\351\351\355\203\365\365\371\5\362\362\366\344\344\351"
+ "\355\355\355\356\356\361\351\351\355\202\365\365\371\202\361\361\361\17\345"
+ "\345\346jjk\14\14\15\345\345\346\371\371\371557\0\0\0IIL\365\365\365\0\0"
+ "\0""557\306\306\310\267\267\272\220\220\217IIL\202\0\0\0\7\264\264\265\261"
+ "\261\260\272\272\264\322\322\323\334\334\341\327\327\327\302\302\302\202"
+ "jjk\20\0\0\0""557\223\223\224\253\252\253\306\306\310\333\333\333\341\341"
+ "\341\322\322\323\212\212\214\14\14\15\\\\^\240\240\241\220\220\217\245\245"
+ "\247\302\302\302\333\333\333\202\345\345\346\11\327\327\327\223\223\2245"
+ "57\0\0\0\\\\^\212\212\214\245\245\247\274\274\274\327\327\327\202\345\345"
+ "\346\10\333\333\333\302\302\302\\\\^557\0\0\0vvw\220\220\217\235\235\234"
+ "\203\245\245\247\30\235\235\234vvwIIL\264\264\265!\"!\0\0\0vvw\314\314\315"
+ "\351\351\351\361\361\354\352\352\343\337\337\331\321\321\313\212\212\214"
+ "jjk\0\0\0\14\14\15\177\177\177\227\227\231\253\252\253\302\302\302\337\337"
+ "\331\361\361\361\361\361\354\202\357\357\346\13\361\361\354\374\374\372\365"
+ "\365\361\330\330\320vvw557\345\345\346\0\0\0!\"!\227\227\231\321\321\313"
+ "\202\345\345\346\203\345\345\340\2\355\355\351\371\371\374\202\365\365\371"
+ "\202\371\371\374\13\374\374\376\371\371\374\362\362\366\356\356\364\344\344"
+ "\351\346\346\355\351\351\355\344\344\351\333\333\333\322\322\323\302\302"
+ "\302\233\376\376\376\3\371\372\373\250\277\317i\221\254\212S\201\240\1\336"
+ "\346\354\203\376\376\376\1\323\337\346\206S\201\240\1\323\337\346\214\376"
+ "\376\376\206S\201\240\1\323\337\346\204\376\376\376\1\250\277\317\205S\201"
+ "\240\1~\240\270\213\376\376\376\1\210\250\275\206S\201\240\3i\221\254\236"
+ "\270\311\275\317\333\202\323\337\346\203\376\376\376\1~\240\270\205S\201"
+ "\240\1\323\337\346\207\376\376\376\206S\201\240\1\323\337\346\215\376\376"
+ "\376\1~\240\270\205S\201\240\1\323\337\346\212\376\376\376\3\371\372\373"
+ "\236\270\311^\211\246\211S\201\240\2^\211\246\371\372\373\240\376\376\376"
+ "\20\325\343\240\212\212\214\223\223\224\253\252\253\274\274\274\306\306\310"
+ "\322\322\323\341\341\341\344\344\351\334\334\341\344\344\351\365\365\371"
+ "\362\362\366\360\360\365\365\365\371\362\362\366\202\341\341\346\1\362\362"
+ "\366\203\365\365\371\202\351\351\355\13\360\360\365\351\351\355\365\365\371"
+ "\371\371\374\365\365\365\361\361\354\341\341\341vvw\327\327\327\355\355\355"
+ "\177\177\177\202\0\0\0\16\306\306\310IIL\14\14\15\264\264\265\205\205\206"
+ "\212\212\214vvw!\"!\0\0\0IIL\253\252\253\223\223\224\261\261\260\321\321"
+ "\313\202\341\341\341\3\322\322\323\253\252\253vvw\202\0\0\0\11\205\205\206"
+ "\253\252\253\306\306\310\341\341\341\345\345\346\327\327\327\\\\^\0\0\0\253"
+ "\252\253\202\227\227\231\16\261\261\260\314\314\315\345\345\346\356\356\361"
+ "\355\355\355\334\334\341\223\223\224557\0\0\0\\\\^\212\212\214\255\255\260"
+ "\306\306\310\341\341\341\202\355\355\355\11\345\345\346\314\314\315jjk!\""
+ "!\0\0\0vvw\227\227\231\253\252\253\274\274\274\202\302\302\302\17\267\267"
+ "\272\253\252\253jjk\\\\^\267\267\272\0\0\0!\"!\227\227\231\322\322\323\337"
+ "\337\331\345\345\340\351\351\351\341\341\341\223\223\224jjk\202\14\14\15"
+ "\6\177\177\177\227\227\231\261\261\260\321\321\313\351\351\355\361\361\354"
+ "\202\357\357\346\16\361\361\354\370\370\365\371\371\371\352\352\343\220\220"
+ "\217jjkIIL\302\302\302IIL\0\0\0vvw\306\306\310\327\327\327\345\345\340\203"
+ "\352\352\343\4\365\365\361\371\371\374\362\362\366\365\365\371\203\371\371"
+ "\374\202\365\365\371\2\354\354\361\344\344\351\202\351\351\355\4\341\341"
+ "\346\327\327\335\322\322\323\302\302\302\236\376\376\376\2\310\327\341~\240"
+ "\270\210S\201\240\1~\240\270\204\376\376\376\206S\201\240\1\323\337\346\214"
+ "\376\376\376\206S\201\240\1\323\337\346\204\376\376\376\1\250\277\317\205"
+ "S\201\240\1~\240\270\212\376\376\376\1\275\317\333\206S\201\240\1\262\307"
+ "\325\210\376\376\376\1~\240\270\205S\201\240\1\323\337\346\207\376\376\376"
+ "\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201\240\1\323"
+ "\337\346\215\376\376\376\2\275\317\333~\240\270\210S\201\240\1~\240\270\240"
+ "\376\376\376\13\342\361\255\231\232\217\220\220\217\245\245\247\267\267\272"
+ "\302\302\302\314\314\315\334\334\341\345\345\346\341\341\341\341\341\346"
+ "\202\365\365\371\202\362\362\366\4\365\365\371\351\351\355\334\334\341\354"
+ "\354\361\203\365\365\371\26\354\354\361\344\344\351\360\360\365\356\356\361"
+ "\362\362\366\374\372\374\371\371\371\361\361\354\351\351\351\223\223\224"
+ "\327\327\327\245\245\247557\0\0\0IIL\261\261\260\0\0\0\235\235\234vvw\177"
+ "\177\177\212\212\214\\\\^\202\0\0\0""0\240\240\241vvw\227\227\231\264\264"
+ "\265\322\322\323\351\351\351\355\355\355\341\341\341\314\314\315vvwIIL\0"
+ "\0\0\\\\^\245\245\247\314\314\315\341\341\341\351\351\351\267\267\272!\""
+ "!557\274\274\274\227\227\231\253\252\253\306\306\310\334\334\341\356\356"
+ "\361\370\370\365\365\365\365\345\345\346\235\235\234557\0\0\0\\\\^\223\223"
+ "\224\274\274\274\327\327\327\351\351\355\365\365\365\370\370\365\361\361"
+ "\361\334\334\341jjk557\0\0\0vvw\245\245\247\302\302\302\327\327\327\202\341"
+ "\341\341\17\327\327\327\306\306\310\261\261\260\\\\^\245\245\247\14\14\15"
+ "\0\0\0vvw\274\274\274\330\330\320\355\355\351\365\365\365\351\351\351\240"
+ "\240\241jjk\202\14\14\15\5\177\177\177\235\235\234\274\274\274\341\341\341"
+ "\355\355\355\203\357\357\346\6\365\365\361\374\374\372\361\361\354\337\337"
+ "\331vvwIIL\202\\\\^\6\255\255\260\0\0\0IIL\240\240\241\314\314\315\337\337"
+ "\331\202\352\352\343\7\361\361\354\371\371\371\370\370\365\362\362\366\365"
+ "\365\371\371\371\371\371\371\374\203\365\365\371\202\344\344\351\202\351"
+ "\351\355\4\341\341\341\327\327\335\322\322\323\306\306\310\240\376\376\376"
+ "\2\323\337\346s\231\262\207S\201\240\1\336\346\354\203\376\376\376\206S\201"
+ "\240\1\262\307\325\213\376\376\376\1\336\346\354\206S\201\240\205\376\376"
+ "\376\1\250\277\317\205S\201\240\1~\240\270\212\376\376\376\1i\221\254\205"
+ "S\201\240\1\262\307\325\211\376\376\376\1~\240\270\205S\201\240\1\323\337"
+ "\346\207\376\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270"
+ "\205S\201\240\1\323\337\346\217\376\376\376\2\323\337\346i\221\254\207S\201"
+ "\240\1\371\372\373\240\376\376\376\14\256\263\231\212\212\214\235\235\234"
+ "\264\264\265\302\302\302\314\314\315\327\327\335\345\345\346\341\341\346"
+ "\334\334\341\360\360\365\365\365\371\202\362\362\366\4\365\365\371\360\360"
+ "\365\341\341\346\346\346\355\202\365\365\371\4\371\371\374\360\360\365\344"
+ "\344\351\355\355\355\202\361\361\361'\374\372\374\374\374\376\361\361\361"
+ "\345\345\340\327\327\327\267\267\272\227\227\231!\"!\0\0\0\227\227\231!\""
+ "!jjk\220\220\217\\\\^\212\212\214\177\177\177!\"!\0\0\0jjk\223\223\224vv"
+ "w\240\240\241\274\274\274\327\327\327\355\355\355\365\365\365\356\356\361"
+ "\333\333\333\220\220\217\177\177\177\0\0\0!\"!\223\223\224\306\306\310\341"
+ "\341\341\351\351\351vvw\0\0\0\223\223\224\202\245\245\247\17\274\274\274"
+ "\327\327\327\351\351\355\370\370\365\374\374\374\371\371\371\355\355\355"
+ "\240\240\241557\0\0\0\\\\^\235\235\234\302\302\302\341\341\341\361\361\361"
+ "\202\374\374\374\32\365\365\365\345\345\346vvw557\0\0\0vvw\253\252\253\314"
+ "\314\315\341\341\341\361\361\361\362\362\366\351\351\355\341\341\341\314"
+ "\314\315\240\240\241jjkIIL\0\0\0\\\\^\261\261\260\327\327\327\355\355\355"
+ "\370\370\365\355\355\355\253\252\253jjk\202\14\14\15\4\177\177\177\245\245"
+ "\247\321\321\313\345\345\346\203\357\357\346\12\365\365\361\374\372\374\370"
+ "\370\365\352\352\343\261\261\260jjkIIL\223\223\224IIL\261\261\260\202\14"
+ "\14\15\11\205\205\206\274\274\274\330\330\320\345\345\340\357\357\346\365"
+ "\365\365\374\374\372\362\362\366\365\365\365\204\365\365\371\12\371\371\371"
+ "\356\356\361\341\341\346\344\344\351\354\354\361\344\344\351\334\334\341"
+ "\333\333\333\322\322\323\306\306\310\242\376\376\376\1s\231\262\206S\201"
+ "\240\1\262\307\325\203\376\376\376\1^\211\246\205S\201\240\1\236\270\311"
+ "\213\376\376\376\1\310\327\341\205S\201\240\1i\221\254\205\376\376\376\1"
+ "\250\277\317\205S\201\240\1~\240\270\211\376\376\376\1\336\346\354\205S\201"
+ "\240\1i\221\254\212\376\376\376\1~\240\270\205S\201\240\1\323\337\346\207"
+ "\376\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201"
+ "\240\1\323\337\346\221\376\376\376\1s\231\262\206S\201\240\1\323\337\346"
+ "\240\376\376\376\13\307\322\237\212\212\214\227\227\231\255\255\260\274\274"
+ "\274\314\314\315\327\327\327\341\341\346\345\345\346\334\334\341\351\351"
+ "\355\202\365\365\371\1\362\362\366\202\365\365\371\3\346\346\355\341\341"
+ "\346\360\360\365\202\371\371\374=\365\365\371\351\351\351\351\351\355\362"
+ "\362\366\361\361\361\371\371\371\376\376\376\370\370\365\351\351\351\333"
+ "\333\333\306\306\310jjk\0\0\0""557jjk!\"!\240\240\241\\\\^\205\205\206\223"
+ "\223\224\\\\^\0\0\0\14\14\15\235\235\234jjk\220\220\217\255\255\260\314\314"
+ "\315\341\341\341\361\361\361\371\371\371\365\365\371\345\345\346\314\314"
+ "\315vvw\14\14\15\0\0\0\177\177\177\274\274\274\327\327\327\314\314\315II"
+ "L\14\14\15\267\267\272\240\240\241\261\261\260\306\306\310\341\341\341\365"
+ "\365\365\374\374\374\376\376\376\374\372\374\355\355\355\235\235\234557\0"
+ "\0\0\\\\^\235\235\234\306\306\310\341\341\341\365\365\365\202\376\376\376"
+ "\17\371\371\371\351\351\351vvw557\0\0\0vvw\255\255\260\314\314\315\351\351"
+ "\351\370\370\365\374\374\374\371\371\371\355\355\355\333\333\333\302\302"
+ "\302\202\\\\^'\0\0\0IIL\245\245\247\322\322\323\351\351\351\365\365\365\361"
+ "\361\361\261\261\260jjk\14\14\15\0\0\0\177\177\177\261\261\260\321\321\313"
+ "\337\337\331\352\352\343\357\357\346\365\365\361\374\372\374\370\370\365"
+ "\357\357\346\345\345\340\177\177\177IILvvw\220\220\217jjk\253\252\253\\\\"
+ "^\0\0\0\\\\^\261\261\260\321\321\313\337\337\331\361\361\354\374\374\372"
+ "\370\370\365\365\365\361\365\365\365\202\365\365\371\1\365\365\365\202\365"
+ "\365\371\2\345\345\346\341\341\346\202\351\351\355\1\341\341\346\202\334"
+ "\334\341\2\324\324\332\314\314\315\242\376\376\376\1\336\346\354\206S\201"
+ "\240\1\250\277\317\203\376\376\376\1~\240\270\205S\201\240\1s\231\262\213"
+ "\376\376\376\1\236\270\311\205S\201\240\1\223\260\303\205\376\376\376\1\250"
+ "\277\317\205S\201\240\1~\240\270\211\376\376\376\1\275\317\333\205S\201\240"
+ "\1~\240\270\212\376\376\376\1~\240\270\205S\201\240\1\323\337\346\207\376"
+ "\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201\240"
+ "\1\323\337\346\221\376\376\376\1\310\327\341\206S\201\240\1\250\277\317\240"
+ "\376\376\376\13\333\356\227\231\232\217\223\223\224\245\245\247\274\274\274"
+ "\306\306\310\322\322\323\341\341\341\345\345\346\341\341\341\344\344\351"
+ "\204\365\365\3717\371\371\374\360\360\365\341\341\346\351\351\355\365\365"
+ "\371\371\371\374\365\365\371\354\354\361\351\351\351\362\362\366\361\361"
+ "\361\365\365\365\376\376\376\374\372\374\361\361\354\345\345\340\274\274"
+ "\274IIL\0\0\0vvw!\"!\227\227\231jjkvvw\220\220\217\177\177\177!\"!\0\0\0"
+ "jjk\212\212\214vvw\227\227\231\267\267\272\327\327\327\351\351\355\365\365"
+ "\365\370\370\365\371\371\371\361\361\361\327\327\327\177\177\177\\\\^\0\0"
+ "\0IIL\245\245\247\306\306\310\235\235\234\14\14\15vvw\253\252\253\245\245"
+ "\247\274\274\274\327\327\327\351\351\355\371\371\371\202\376\376\376\12\374"
+ "\372\374\355\355\355\235\235\234!\"!\0\0\0\\\\^\240\240\241\306\306\310\341"
+ "\341\341\365\365\365\202\376\376\376\"\371\371\371\351\351\351vvw557\0\0"
+ "\0vvw\255\255\260\314\314\315\345\345\346\370\370\365\374\374\372\370\370"
+ "\365\361\361\361\345\345\346\322\322\323jjkIIL\0\0\0IIL\235\235\234\306\306"
+ "\310\345\345\346\365\365\365\361\361\361\264\264\265jjk!\"!\0\0\0\177\177"
+ "\177\255\255\260\313\313\301\337\337\331\352\352\343\361\361\354\202\371"
+ "\371\371\4\357\357\346\352\352\343\321\321\313\205\205\206\202\0\0\0\202"
+ "!\"!\1\14\14\15\202\0\0\0\6!\"!\220\220\217\302\302\302\337\337\331\361\361"
+ "\354\374\374\372\202\365\365\361\203\365\365\365\7\362\362\366\371\371\374"
+ "\356\356\361\341\341\341\341\341\346\351\351\355\344\344\351\202\334\334"
+ "\341\3\341\341\341\324\324\332\314\314\315\243\376\376\376\206S\201\240\1"
+ "\250\277\317\203\376\376\376\1\236\270\311\206S\201\240\1\350\356\362\212"
+ "\376\376\376\1i\221\254\205S\201\240\1\275\317\333\205\376\376\376\1\250"
+ "\277\317\205S\201\240\1~\240\270\211\376\376\376\1\250\277\317\205S\201\240"
+ "\1~\240\270\212\376\376\376\1~\240\270\205S\201\240\1\323\337\346\207\376"
+ "\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201\240"
+ "\1\323\337\346\222\376\376\376\206S\201\240\1\250\277\317\241\376\376\376"
+ "\10\256\263\231\220\220\217\240\240\241\264\264\265\302\302\302\316\316\326"
+ "\334\334\341\345\345\346\202\341\341\346\2\362\362\366\371\371\374\202\365"
+ "\365\371\5\371\371\371\365\365\371\344\344\351\341\341\346\360\360\365\202"
+ "\371\371\374\13\360\360\365\351\351\351\356\356\361\365\365\365\365\365\361"
+ "\374\374\374\376\376\376\370\370\365\351\351\351\212\212\214!\"!\202\0\0"
+ "\0\17\177\177\177\212\212\214jjk\212\212\214\227\227\231\\\\^\0\0\0\14\14"
+ "\15\240\240\241\\\\^\223\223\224\253\252\253\302\302\302\341\341\341\362"
+ "\362\366\203\371\371\371\21\365\365\365\341\341\341\261\261\260\177\177\177"
+ "\0\0\0\14\14\15\223\223\224\267\267\272jjk\14\14\15\255\255\260\245\245\247"
+ "\255\255\260\306\306\310\341\341\341\362\362\366\374\374\374\202\376\376"
+ "\376\12\371\371\371\355\355\355\240\240\241!\"!\0\0\0\\\\^\240\240\241\306"
+ "\306\310\341\341\341\365\365\365\202\376\376\376\12\371\371\371\351\351\351"
+ "vvw557\0\0\0vvw\255\255\260\314\314\315\345\345\346\365\365\365\202\374\374"
+ "\372\30\371\371\371\361\361\361\341\341\341vvw557\0\0\0IIL\235\235\234\302"
+ "\302\302\341\341\341\362\362\366\355\355\355\272\272\264jjk!\"!\0\0\0\177"
+ "\177\177\253\252\253\302\302\302\337\337\331\355\355\351\371\371\371\374"
+ "\374\372\361\361\354\202\352\352\343\3\227\227\231\\\\^\0\0\0\202\253\252"
+ "\253\3\240\240\241\235\235\234\264\264\265\202\0\0\0\5jjk\272\272\264\327"
+ "\327\327\361\361\361\370\370\365\202\365\365\361\202\365\365\365\1\361\361"
+ "\361\202\365\365\371\6\351\351\351\341\341\346\344\344\351\351\351\355\341"
+ "\341\346\334\334\341\202\341\341\346\2\327\327\335\321\321\313\243\376\376"
+ "\376\206S\201\240\1\250\277\317\203\376\376\376\1\310\327\341\206S\201\240"
+ "\1\250\277\317\211\376\376\376\1\275\317\333\205S\201\240\1^\211\246\206"
+ "\376\376\376\1\250\277\317\205S\201\240\1~\240\270\211\376\376\376\1\250"
+ "\277\317\205S\201\240\1s\231\262\212\376\376\376\1s\231\262\205S\201\240"
+ "\1\323\337\346\207\376\376\376\206S\201\240\1\323\337\346\215\376\376\376"
+ "\1~\240\270\205S\201\240\1\323\337\346\221\376\376\376\1\371\372\373\206"
+ "S\201\240\1\275\317\333\240\376\376\376\15\370\373\355\307\322\237\220\220"
+ "\217\235\235\234\255\255\260\302\302\302\314\314\315\327\327\335\341\341"
+ "\346\345\345\346\334\334\341\356\356\361\371\371\374\203\365\365\371\7\371"
+ "\371\374\356\356\361\341\341\346\351\351\355\365\365\371\371\371\374\365"
+ "\365\371\202\351\351\355\7\365\365\365\362\362\366\371\371\371\376\376\376"
+ "\371\371\371\345\345\346\\\\^\202\0\0\0#IIL\240\240\241\\\\^\205\205\206"
+ "\235\235\234\205\205\206!\"!\0\0\0jjkvvw\177\177\177\235\235\234\267\267"
+ "\272\322\322\323\345\345\340\370\370\365\374\374\376\374\372\374\371\371"
+ "\371\370\370\365\355\355\355\322\322\323\177\177\177557\0\0\0vvw\220\220"
+ "\217!\"!IIL\253\252\253\245\245\247\267\267\272\322\322\323\351\351\351\370"
+ "\370\365\203\376\376\376\12\371\371\371\355\355\355\235\235\234!\"!\0\0\0"
+ "\\\\^\240\240\241\306\306\310\341\341\341\365\365\365\202\376\376\376\12"
+ "\371\371\371\351\351\351vvw557\0\0\0vvw\255\255\260\314\314\315\351\351\351"
+ "\365\365\371\203\376\376\376(\370\370\365\345\345\346\205\205\206\14\14\15"
+ "\0\0\0\\\\^\235\235\234\302\302\302\341\341\341\355\355\351\345\345\340\272"
+ "\272\264jjk!\"!\0\0\0vvw\245\245\247\302\302\302\337\337\331\365\365\361"
+ "\374\372\374\361\361\354\352\352\343\357\357\346\345\345\340\177\177\177"
+ "\0\0\0jjk\333\333\333\314\314\315\327\327\327\302\302\302jjk\177\177\177"
+ "\0\0\0""557\235\235\234\322\322\323\351\351\351\361\361\354\204\365\365\361"
+ "\7\361\361\361\371\371\371\361\361\361\341\341\341\345\345\346\351\351\355"
+ "\344\344\351\202\341\341\341\4\351\351\351\341\341\346\327\327\335\321\321"
+ "\313\242\376\376\376\1\250\277\317\206S\201\240\1\323\337\346\204\376\376"
+ "\376\1^\211\246\206S\201\240\1\336\346\354\207\376\376\376\2\350\356\362"
+ "^\211\246\205S\201\240\1\223\260\303\206\376\376\376\1\250\277\317\205S\201"
+ "\240\1~\240\270\211\376\376\376\1\275\317\333\206S\201\240\1\336\346\354"
+ "\207\376\376\376\2\350\356\362s\231\262\206S\201\240\1\323\337\346\207\376"
+ "\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201\240"
+ "\1\323\337\346\221\376\376\376\1\236\270\311\206S\201\240\1\336\346\354\240"
+ "\376\376\376\14\372\374\361\341\361\250\231\232\217\227\227\231\245\245\247"
+ "\267\267\272\306\306\310\324\324\332\341\341\341\345\345\346\341\341\341"
+ "\346\346\355\204\365\365\3715\371\371\374\365\365\371\344\344\351\341\341"
+ "\346\360\360\365\371\371\371\365\365\371\356\356\361\351\351\351\362\362"
+ "\366\365\365\365\370\370\365\374\374\374\371\371\371\261\261\260!\"!\0\0"
+ "\0!\"!\240\240\241jjk\177\177\177\227\227\231\240\240\241\\\\^\0\0\0!\"!"
+ "\220\220\217jjk\205\205\206\212\212\214\240\240\241\333\333\333\351\351\351"
+ "\365\365\361\374\374\374\376\376\376\374\372\374\371\371\371\361\361\361"
+ "\341\341\341\235\235\234vvw\0\0\0!\"!\227\227\231\0\0\0\253\252\253\235\235"
+ "\234\255\255\260\302\302\302\333\333\333\361\361\361\374\372\374\203\376"
+ "\376\376\12\371\371\371\355\355\355\227\227\231!\"!\0\0\0\\\\^\240\240\241"
+ "\306\306\310\341\341\341\365\365\365\202\376\376\376\12\371\371\371\351\351"
+ "\351vvw557\0\0\0vvw\255\255\260\314\314\315\351\351\351\370\370\365\203\376"
+ "\376\376\3\365\365\365\322\322\323\\\\^\202\0\0\0\4vvw\245\245\247\302\302"
+ "\302\333\333\333\202\352\352\343\22\302\302\302jjk!\"!\0\0\0vvw\245\245\247"
+ "\313\313\301\345\345\346\365\365\365\361\361\354\352\352\343\357\357\346"
+ "\361\361\361\253\252\253vvw\14\14\15jjk\215\216\206\202\212\212\214\3vvw"
+ "IIL\322\322\323\202\0\0\0\4\177\177\177\306\306\310\337\337\331\352\352\343"
+ "\203\365\365\361\3\314\314\315\212\212\214\240\240\241\202\341\341\341\11"
+ "\345\345\346\351\351\351\341\341\346\341\341\341\345\345\346\355\355\355"
+ "\341\341\346\333\333\333\322\322\323\226\376\376\376\3\310\327\341\275\317"
+ "\333\371\372\373\210\376\376\376\1\250\277\317\206S\201\240\1i\221\254\205"
+ "\376\376\376\1\250\277\317\206S\201\240\2^\211\246\310\327\341\205\376\376"
+ "\376\2\323\337\346^\211\246\205S\201\240\1^\211\246\207\376\376\376\1\250"
+ "\277\317\205S\201\240\1^\211\246\211\376\376\376\1\336\346\354\206S\201\240"
+ "\2s\231\262\350\356\362\204\376\376\376\3\363\366\370\250\277\317^\211\246"
+ "\207S\201\240\1\323\337\346\207\376\376\376\206S\201\240\1\323\337\346\215"
+ "\376\376\376\1~\240\270\205S\201\240\1\323\337\346\205\376\376\376\3\275"
+ "\317\333\310\327\341\371\372\373\210\376\376\376\1\250\277\317\206S\201\240"
+ "\1i\221\254\243\376\376\376\10\256\263\231\223\223\224\240\240\241\264\264"
+ "\265\302\302\302\322\322\323\333\333\333\345\345\346\202\341\341\346\1\365"
+ "\365\365\202\371\371\374\6\371\371\371\365\365\371\371\371\374\354\354\361"
+ "\341\341\341\351\351\355\202\365\365\371\10\362\362\366\351\351\351\355\355"
+ "\355\370\370\365\365\365\365\371\371\371\362\362\366jjk\202\0\0\0\32\205"
+ "\205\206\177\177\177jjk\220\220\217\245\245\247\205\205\206!\"!\0\0\0\\\\"
+ "^\227\227\231\205\205\206\14\14\15jjk\220\220\217\333\333\333\351\351\355"
+ "\361\361\354\370\370\365\374\374\376\376\376\376\374\372\374\365\365\365"
+ "\351\351\351\314\314\315\177\177\177!\"!\202\0\0\0\7""557\261\261\260\235"
+ "\235\234\264\264\265\314\314\315\345\345\346\365\365\365\204\376\376\376"
+ "\12\371\371\371\355\355\355\227\227\231!\"!\0\0\0jjk\240\240\241\306\306"
+ "\310\341\341\341\365\365\365\202\376\376\376\12\371\371\371\351\351\351v"
+ "vw557\0\0\0vvw\255\255\260\314\314\315\345\345\346\370\370\365\202\376\376"
+ "\376\3\371\371\371\355\355\355\245\245\247\202\0\0\0\31IIL\220\220\217\245"
+ "\245\247\302\302\302\337\337\331\361\361\354\361\361\361\306\306\310jjk!"
+ "\"!\0\0\0vvw\253\252\253\314\314\315\345\345\346\357\357\346\352\352\343"
+ "\357\357\346\365\365\361\361\361\361\205\205\206!\"!557\205\205\206\223\223"
+ "\224\202\235\235\234\15\223\223\224IIL\235\235\234\\\\^\0\0\0\\\\^\261\261"
+ "\260\321\321\313\345\345\340\361\361\354\365\365\361\302\302\302557\202!"
+ "\"!\6IIL\333\333\333\341\341\346\345\345\346\341\341\341\341\341\346\202"
+ "\355\355\355\3\341\341\346\333\333\333\322\322\323\226\376\376\376\1~\240"
+ "\270\202S\201\240\3^\211\246~\240\270\236\270\311\203\250\277\317\2\210\250"
+ "\275^\211\246\207S\201\240\1\262\307\325\206\376\376\376\1^\211\246\207S"
+ "\201\240\5i\221\254\210\250\275\250\277\317\223\260\303i\221\254\207S\201"
+ "\240\1\275\317\333\207\376\376\376\1\262\307\325\206S\201\240\1~\240\270"
+ "\203\250\277\317\2~\240\270\236\270\311\204\376\376\376\1i\221\254\206S\201"
+ "\240\2^\211\246\223\260\303\202\250\277\317\1\210\250\275\212S\201\240\1"
+ "\323\337\346\207\376\376\376\206S\201\240\1\323\337\346\215\376\376\376\1"
+ "~\240\270\205S\201\240\1\323\337\346\205\376\376\376\1s\231\262\202S\201"
+ "\240\2i\221\254~\240\270\204\250\277\317\2\210\250\275^\211\246\207S\201"
+ "\240\1\310\327\341\243\376\376\376\15\307\322\237\220\220\217\235\235\234"
+ "\253\252\253\274\274\274\314\314\315\327\327\335\341\341\346\344\344\351"
+ "\334\334\341\354\354\361\371\371\371\365\365\371\203\371\371\374\4\365\365"
+ "\371\344\344\351\341\341\346\361\361\361\202\365\365\371\2\355\355\355\351"
+ "\351\351\202\365\365\365\25\365\365\361\274\274\274557\0\0\0IIL\220\220\217"
+ "\\\\^\212\212\214\235\235\234\253\252\253\\\\^\0\0\0IIL\365\365\371\205\205"
+ "\206\14\14\15jjk\240\240\241\220\220\217\322\322\323\351\351\351\202\365"
+ "\365\361\1\370\370\365\202\376\376\376\5\371\371\371\355\355\355\333\333"
+ "\333\212\212\214jjk\202\0\0\0\7\223\223\224\227\227\231\240\240\241\302\302"
+ "\302\333\333\333\355\355\355\371\371\371\204\376\376\376\12\371\371\371\355"
+ "\355\355\227\227\231!\"!\0\0\0\\\\^\245\245\247\306\306\310\341\341\341\365"
+ "\365\365\202\376\376\376\16\371\371\371\351\351\351\177\177\177557\0\0\0"
+ "jjk\253\252\253\314\314\315\345\345\346\365\365\365\374\372\374\371\371\371"
+ "\341\341\341\245\245\247\202\0\0\0\32\14\14\15\240\240\241\227\227\231\253"
+ "\252\253\314\314\315\351\351\351\365\365\365\355\355\355\321\321\313\\\\"
+ "^557\0\0\0jjk\255\255\260\314\314\315\337\337\331\345\345\340\361\361\354"
+ "\370\370\365\371\371\371\306\306\310vvw\0\0\0\\\\^\235\235\234\245\245\247"
+ "\203\261\261\260\15jjk\\\\^\261\261\260\0\0\0!\"!\212\212\214\302\302\302"
+ "\337\337\331\355\355\351\361\361\354jjk\\\\^!\"!\202557\1\327\327\327\202"
+ "\341\341\341\7\334\334\341\351\351\355\361\361\361\351\351\355\341\341\346"
+ "\333\333\333\314\314\315\226\376\376\376\1^\211\246\220S\201\240\1\210\250"
+ "\275\207\376\376\376\1\323\337\346\222S\201\240\1\236\270\311\210\376\376"
+ "\376\1\323\337\346\213S\201\240\1i\221\254\204\376\376\376\1\250\277\317"
+ "\217S\201\240\1^\211\246\205S\201\240\1\323\337\346\207\376\376\376\206S"
+ "\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201\240\1\323\337"
+ "\346\205\376\376\376\221S\201\240\1\223\260\303\245\376\376\376\7\244\246"
+ "\230\227\227\231\245\245\247\267\267\272\306\306\310\322\322\323\334\334"
+ "\341\202\341\341\346\2\344\344\351\365\365\371\205\371\371\374\24\360\360"
+ "\365\341\341\346\351\351\355\362\362\366\365\365\371\361\361\361\351\351"
+ "\351\355\355\355\365\365\365\355\355\355\177\177\177\14\14\15\0\0\0\223\223"
+ "\224\\\\^vvw\227\227\231\255\255\260\220\220\217!\"!\202\0\0\0\12""557\0"
+ "\0\0vvw\355\355\355\223\223\224\261\261\260\314\314\315\345\345\346\365\365"
+ "\365\371\371\371\202\370\370\365\17\374\374\374\376\376\376\365\365\365\341"
+ "\341\346\264\264\265\177\177\177\0\0\0\14\14\15\255\255\260\220\220\217\253"
+ "\252\253\314\314\315\341\341\341\365\365\365\374\374\374\203\376\376\376"
+ "\20\374\374\374\355\355\355\327\327\327\235\235\234\14\14\15\0\0\0jjk\240"
+ "\240\241\302\302\302\334\334\341\361\361\361\374\372\374\374\374\374\356"
+ "\356\361\327\327\327\220\220\217\202\0\0\0\10\14\14\15\223\223\224\267\267"
+ "\272\322\322\323\333\333\333\316\316\326\255\255\260jjk\202\0\0\0\13""55"
+ "7vvw\227\227\231\240\240\241\274\274\274\333\333\333\355\355\351\361\361"
+ "\354\337\337\331\302\302\302\205\205\206\202\0\0\0\24vvw\245\245\247\274"
+ "\274\274\330\330\320\355\355\351\370\370\365\371\371\371\351\351\355\261"
+ "\261\260557\0\0\0\177\177\177\240\240\241\261\261\260\274\274\274\313\313"
+ "\301\302\302\302\253\252\253jjk\273\273\302\202\0\0\0\6\\\\^\261\261\260"
+ "\321\321\313\345\345\340\352\352\343vvw\202557\14IIL557\314\314\315\327\327"
+ "\327\333\333\333\341\341\341\362\362\366\361\361\361\351\351\351\341\341"
+ "\346\333\333\333\314\314\315\226\376\376\376\220S\201\240\1\223\260\303\211"
+ "\376\376\376\2\275\317\333^\211\246\217S\201\240\1\262\307\325\212\376\376"
+ "\376\1^\211\246\213S\201\240\205\376\376\376\1s\231\262\215S\201\240\3~\240"
+ "\270\376\376\376^\211\246\204S\201\240\1\323\337\346\207\376\376\376\206"
+ "S\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201\240\1\323\337"
+ "\346\204\376\376\376\1\336\346\354\220S\201\240\1\223\260\303\246\376\376"
+ "\376\7\273\301\235\223\223\224\240\240\241\255\255\260\302\302\302\314\314"
+ "\315\333\333\333\203\341\341\346\1\360\360\365\202\371\371\374\1\374\372"
+ "\374\203\371\371\374\40\351\351\355\341\341\346\356\356\361\365\365\371\365"
+ "\365\365\355\355\355\351\351\351\362\362\366\351\351\351jjk\0\0\0""557\177"
+ "\177\177\\\\^\220\220\217\253\252\253\274\274\274vvw\0\0\0\14\14\15!\"!I"
+ "IL\274\274\274\365\365\365\255\255\260\227\227\231\261\261\260\314\314\315"
+ "\345\345\346\365\365\365\376\376\376\374\374\372\202\370\370\365\7\374\374"
+ "\374\371\371\371\351\351\355\322\322\323\177\177\177!\"!jjk\202\227\227\231"
+ "\4\267\267\272\327\327\327\351\351\355\371\371\371\203\376\376\376\6\374"
+ "\374\374\327\327\327\227\227\231\212\212\214IIL\14\14\15\202!\"!\13\177\177"
+ "\177\212\212\214\306\306\310\351\351\351\365\365\365\351\351\355\227\227"
+ "\231\212\212\214557\14\14\15!\"!\202\14\14\15\23\\\\^\217\216\224\227\227"
+ "\231jjk!\"!\14\14\15jjk\220\220\217jjk\205\205\206\235\235\234\264\264\265"
+ "\314\314\315\341\341\341\352\352\343\302\302\302\223\223\224\205\205\206"
+ "557\202\14\14\15\21!\"!vvw\205\205\206\274\274\274\351\351\351\365\365\365"
+ "\227\227\231\253\252\253jjk\0\0\0\14\14\15""557\205\205\206\240\240\241\302"
+ "\302\302\321\321\313\272\272\264\202\240\240\241\27""557\14\14\15!\"!\14"
+ "\14\15jjk\217\216\224\313\313\301\337\337\331\327\327\327557IIL557\\\\^\306"
+ "\306\310\322\322\323\327\327\327\351\351\355\365\365\371\356\356\361\344"
+ "\344\351\341\341\341\327\327\327\314\314\315\226\376\376\376\2\323\337\346"
+ "\223\260\303\214S\201\240\2i\221\254\275\317\333\213\376\376\376\2\336\346"
+ "\354~\240\270\214S\201\240\2~\240\270\336\346\354\213\376\376\376\1\262\307"
+ "\325\213S\201\240\1\323\337\346\205\376\376\376\1\210\250\275\212S\201\240"
+ "\2^\211\246\262\307\325\202\376\376\376\1~\240\270\204S\201\240\1\323\337"
+ "\346\207\376\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270"
+ "\205S\201\240\1\323\337\346\205\376\376\376\2\323\337\346\210\250\275\214"
+ "S\201\240\2i\221\254\310\327\341\247\376\376\376\14\307\322\237\231\232\217"
+ "\235\235\234\253\252\253\274\274\274\314\314\315\327\327\327\341\341\341"
+ "\341\341\346\341\341\341\351\351\355\371\371\371\202\371\371\374\24\374\374"
+ "\376\371\371\374\374\372\374\362\362\366\344\344\351\351\351\351\361\361"
+ "\361\365\365\365\356\356\361\351\351\351\351\351\355\345\345\346\205\205"
+ "\206vvw\333\333\333vvw\205\205\206\240\240\241\272\272\264\306\306\310\202"
+ "vvw\13\227\227\231\302\302\302\355\355\351\334\334\341\227\227\231\205\205"
+ "\206\240\240\241\274\274\274\327\327\327\351\351\355\370\370\365\202\376"
+ "\376\376\1\374\374\372\202\365\365\361\14\370\370\365\361\361\361\341\341"
+ "\341\227\227\231jjk\240\240\241\220\220\217\240\240\241\302\302\302\341\341"
+ "\341\362\362\366\374\374\374\203\376\376\376\21\371\371\371\302\302\302j"
+ "jkvvw\205\205\206\223\223\224\212\212\214\177\177\177\\\\^\177\177\177\245"
+ "\245\247\341\341\341\355\355\355\314\314\315jjkvvw\220\220\217\203\245\245"
+ "\247\1\240\240\241\202\223\223\224\5\220\220\217\227\227\231\274\274\274"
+ "\327\327\327\306\306\310\202\220\220\217\25\235\235\234\255\255\260\302\302"
+ "\302\327\327\327\345\345\340\352\352\343\177\177\177vvw\220\220\217\245\245"
+ "\247\274\274\274\267\267\272\240\240\241\220\220\217\205\205\206\274\274"
+ "\274\341\341\341\322\322\323jjk\220\220\217\235\235\234\202\274\274\274\11"
+ "\245\245\247\223\223\224vvw\313\313\301\330\330\320jjk\205\205\206\227\227"
+ "\231\245\245\247\202\302\302\302\24\264\264\265\240\240\241vvw\272\272\264"
+ "\333\333\333\341\341\341\321\321\313\212\212\214\227\227\231\302\302\302"
+ "\306\306\310\314\314\315\334\334\341\362\362\366\365\365\365\351\351\355"
+ "\345\345\346\341\341\341\327\327\327\314\314\315\231\376\376\376\3\275\317"
+ "\333\223\260\303s\231\262\205S\201\240\3s\231\262\223\260\303\310\327\341"
+ "\217\376\376\376\3\336\346\354\236\270\311s\231\262\206S\201\240\3~\240\270"
+ "\236\270\311\336\346\354\216\376\376\376\3\310\327\341\210\250\275^\211\246"
+ "\203S\201\240\5s\231\262~\240\270\223\260\303\250\277\317\336\346\354\207"
+ "\376\376\376\3\323\337\346\223\260\303i\221\254\204S\201\240\3^\211\246\210"
+ "\250\275\275\317\333\204\376\376\376\1\275\317\333\204\250\277\317\1\371"
+ "\372\373\207\376\376\376\206\250\277\317\1\371\372\373\215\376\376\376\1"
+ "\275\317\333\205\250\277\317\1\371\372\373\207\376\376\376\4\371\372\373"
+ "\262\307\325\210\250\275i\221\254\205S\201\240\3~\240\270\236\270\311\310"
+ "\327\341\252\376\376\376\13\256\263\231\227\227\231\240\240\241\264\264\265"
+ "\302\302\302\316\316\326\334\334\341\345\345\346\341\341\346\345\345\346"
+ "\365\365\371\202\371\371\374\7\374\374\376\374\372\374\371\371\374\374\372"
+ "\374\355\355\355\341\341\346\351\351\355\202\362\362\366\1\355\355\355\202"
+ "\345\345\346\25\274\274\274vvw\302\302\302\227\227\231\240\240\241\267\267"
+ "\272\314\314\315\322\322\323\267\267\272\177\177\177\205\205\206\261\261"
+ "\260\245\245\247\205\205\206\212\212\214\235\235\234\261\261\260\314\314"
+ "\315\345\345\346\362\362\366\371\371\371\203\376\376\376\2\374\372\374\365"
+ "\365\365\202\361\361\361\11\351\351\351\314\314\315vvw\223\223\224\245\245"
+ "\247\267\267\272\322\322\323\345\345\346\365\365\365\204\376\376\376\6\371"
+ "\371\371\345\345\346\220\220\217\253\252\253\245\245\247\227\227\231\202"
+ "\220\220\217\4\223\223\224\255\255\260\274\274\274\327\327\327\202\345\345"
+ "\346\1\235\235\234\202\264\264\265\1\253\252\253\203\245\245\247\3\255\255"
+ "\260\264\264\265\267\267\272\202\302\302\302\1\261\261\260\202\235\235\234"
+ "*\240\240\241\255\255\260\302\302\302\322\322\323\345\345\340\355\355\351"
+ "\361\361\354\245\245\247\314\314\315\327\327\327\314\314\315\274\274\274"
+ "\272\272\264\274\274\274\314\314\315\245\245\247\306\306\310\333\333\333"
+ "\322\322\323\255\255\260\345\345\346\322\322\323\306\306\310\302\302\302"
+ "\314\314\315\255\255\260\244\246\230\302\302\302\321\321\313\235\235\234"
+ "\334\334\341\327\327\327\302\302\302\272\272\264\274\274\274\306\306\310"
+ "\302\302\302\227\227\231\302\302\302\333\333\333\327\327\327\321\321\313"
+ "\204\306\306\310\11\322\322\323\351\351\351\365\365\371\355\355\355\344\344"
+ "\351\341\341\346\334\334\341\333\333\333\314\314\315\377\376\376\376\323"
+ "\376\376\376\10\307\322\237\223\223\224\235\235\234\253\252\253\274\274\274"
+ "\314\314\315\327\327\327\341\341\341\202\341\341\346#\355\355\355\371\371"
+ "\371\371\371\374\374\374\376\376\376\376\374\372\374\371\371\374\365\365"
+ "\371\344\344\351\341\341\346\355\355\355\361\361\361\356\356\361\345\345"
+ "\346\334\334\341\327\327\327\274\274\274\255\255\260\253\252\253\264\264"
+ "\265\314\314\315\334\334\341\337\337\331\322\322\323\302\302\302\245\245"
+ "\247\223\223\224\220\220\217\227\227\231\245\245\247\274\274\274\306\306"
+ "\310\327\327\327\355\355\355\371\371\371\206\376\376\376\5\365\365\371\355"
+ "\355\351\345\345\346\333\333\333\306\306\310\202\274\274\274\5\314\314\315"
+ "\334\334\341\356\356\361\365\365\371\374\372\374\203\376\376\376\6\371\371"
+ "\371\355\355\355\333\333\333\306\306\310\261\261\260\240\240\241\202\227"
+ "\227\231\4\240\240\241\255\255\260\302\302\302\327\327\327\202\345\345\346"
+ "\4\333\333\333\306\306\310\264\264\265\240\240\241\203\227\227\231\1\240"
+ "\240\241\202\245\245\247\1\253\252\253\203\245\245\247\14\253\252\253\272"
+ "\272\264\306\306\310\327\327\327\345\345\346\362\362\366\371\371\371\365"
+ "\365\365\345\345\346\322\322\323\272\272\264\245\245\247\203\227\227\231"
+ "\32\240\240\241\264\264\265\306\306\310\322\322\323\330\330\320\321\321\313"
+ "\302\302\302\264\264\265\240\240\241\223\223\224\231\232\217\235\235\234"
+ "\261\261\260\302\302\302\330\330\320\333\333\333\321\321\313\261\261\260"
+ "\235\235\234\220\220\217\215\216\206\220\220\217\227\227\231\253\252\253"
+ "\306\306\310\322\322\323\203\327\327\327\203\322\322\323\1\341\341\341\202"
+ "\362\362\366\6\351\351\351\345\345\346\341\341\346\341\341\341\333\333\333"
+ "\306\306\310\377\376\376\376\324\376\376\376\7\244\246\230\227\227\231\245"
+ "\245\247\264\264\265\306\306\310\322\322\323\334\334\341\202\341\341\346"
+ "\2\351\351\351\365\365\371\202\371\371\374\202\376\376\376\10\371\371\374"
+ "\374\372\374\356\356\361\341\341\346\344\344\351\356\356\361\361\361\361"
+ "\351\351\351\202\333\333\333\17\314\314\315\302\302\302\306\306\310\314\314"
+ "\315\334\334\341\351\351\355\355\355\355\337\337\331\314\314\315\274\274"
+ "\274\261\261\260\253\252\253\264\264\265\302\302\302\314\314\315\202\341"
+ "\341\341\2\351\351\351\371\371\371\207\376\376\376\4\365\365\365\345\345"
+ "\346\333\333\333\327\327\327\202\322\322\323\6\334\334\341\351\351\355\365"
+ "\365\365\371\371\374\371\371\371\374\372\374\202\376\376\376\6\371\371\371"
+ "\361\361\361\341\341\341\322\322\323\302\302\302\274\274\274\202\264\264"
+ "\265\12\267\267\272\302\302\302\314\314\315\341\341\341\351\351\351\351\351"
+ "\355\345\345\346\322\322\323\306\306\310\274\274\274\203\264\264\265\203"
+ "\267\267\272\203\274\274\274\6\302\302\302\306\306\310\327\327\327\341\341"
+ "\341\355\355\355\365\365\365\202\374\372\374\6\362\362\366\345\345\346\330"
+ "\330\320\306\306\310\274\274\274\267\267\272\202\264\264\265\3\274\274\274"
+ "\306\306\310\321\321\313\202\330\330\320\4\337\337\331\322\322\323\302\302"
+ "\302\261\261\260\202\253\252\253\3\261\261\260\302\302\302\321\321\313\202"
+ "\341\341\341\4\321\321\313\274\274\274\261\261\260\253\252\253\202\245\245"
+ "\247\16\255\255\260\302\302\302\314\314\315\322\322\323\327\327\327\333\333"
+ "\333\334\334\341\333\333\333\327\327\327\334\334\341\356\356\361\365\365"
+ "\371\351\351\355\344\344\351\203\341\341\346\2\327\327\335\273\273\302\377"
+ "\376\376\376\324\376\376\376\36\273\301\235\223\223\224\240\240\241\255\255"
+ "\260\273\273\302\314\314\315\327\327\327\341\341\341\345\345\346\341\341"
+ "\346\356\356\361\371\371\371\371\371\374\374\374\376\376\376\376\374\374"
+ "\376\374\372\374\371\371\374\355\355\355\341\341\346\351\351\351\356\356"
+ "\361\355\355\355\341\341\341\334\334\341\341\341\341\327\327\327\333\333"
+ "\333\345\345\346\355\355\355\202\365\365\365\3\355\355\355\333\333\333\322"
+ "\322\323\203\314\314\315\7\327\327\327\333\333\333\351\351\351\356\356\361"
+ "\351\351\351\355\355\355\374\372\374\206\376\376\376\3\374\374\376\365\365"
+ "\371\351\351\351\202\333\333\333\4\341\341\346\355\355\355\365\365\365\371"
+ "\371\371\202\376\376\376\202\371\371\374\7\374\372\374\371\371\374\365\365"
+ "\365\355\355\355\341\341\341\333\333\333\327\327\327\202\322\322\323\4\327"
+ "\327\327\333\333\333\341\341\341\351\351\355\202\361\361\361\4\355\355\355"
+ "\345\345\346\333\333\333\327\327\327\207\322\322\323\202\327\327\327\16\334"
+ "\334\341\345\345\346\355\355\355\362\362\366\371\371\371\374\372\374\371"
+ "\371\374\371\371\371\362\362\366\356\356\361\345\345\346\334\334\341\333"
+ "\333\333\327\327\327\204\322\322\323\2\330\330\320\337\337\331\202\351\351"
+ "\351\2\333\333\333\314\314\315\203\302\302\302\10\313\313\301\330\330\320"
+ "\345\345\346\351\351\351\341\341\341\330\330\320\321\321\313\313\313\301"
+ "\203\302\302\302\5\314\314\315\333\333\333\322\322\323\327\327\327\337\337"
+ "\331\202\341\341\341\14\333\333\333\334\334\341\351\351\355\371\371\371\356"
+ "\356\361\344\344\351\345\345\346\341\341\346\344\344\351\345\345\346\314"
+ "\314\315\274\274\274\377\376\376\376\325\376\376\376\7\244\246\230\235\235"
+ "\234\245\245\247\267\267\272\306\306\310\322\322\323\334\334\341\202\341"
+ "\341\346\2\346\346\355\365\365\371\202\371\371\374\202\376\376\376\202\374"
+ "\372\374\10\371\371\371\351\351\355\341\341\346\351\351\355\355\355\355\345"
+ "\345\346\341\341\341\341\341\346\202\351\351\351\6\361\361\361\370\370\365"
+ "\371\371\371\374\372\374\371\371\371\361\361\361\202\341\341\341\1\341\341"
+ "\346\202\341\341\341\7\341\341\346\351\351\351\356\356\361\361\361\361\345"
+ "\345\346\355\355\355\374\372\374\207\376\376\376\7\371\371\371\361\361\361"
+ "\345\345\346\341\341\346\351\351\355\365\365\371\374\374\374\203\376\376"
+ "\376\1\374\372\374\202\371\371\374\3\371\371\371\365\365\371\361\361\361"
+ "\202\355\355\355\202\351\351\355\202\355\355\355\2\361\361\361\365\365\365"
+ "\202\371\371\371\4\370\370\365\362\362\366\356\356\361\355\355\355\202\351"
+ "\351\355\206\355\355\355\202\361\361\361\3\365\365\365\371\371\371\374\374"
+ "\374\202\374\374\376\7\374\372\374\371\371\374\374\372\374\371\371\371\365"
+ "\365\365\361\361\361\355\355\355\202\351\351\355\10\345\345\346\341\341\341"
+ "\337\337\331\351\351\351\365\365\365\361\361\361\345\345\346\333\333\333"
+ "\202\330\330\320\6\322\322\323\327\327\327\337\337\331\355\355\351\361\361"
+ "\361\345\345\340\202\337\337\331\11\333\333\333\327\327\327\322\322\323\330"
+ "\330\320\341\341\341\351\351\351\334\334\341\327\327\327\333\333\333\204"
+ "\341\341\341\4\351\351\355\371\371\374\362\362\366\344\344\351\202\341\341"
+ "\346\5\344\344\351\351\351\355\333\333\333\306\306\310\274\274\274\377\376"
+ "\376\376\325\376\376\376\16\273\301\235\223\223\224\240\240\241\255\255\260"
+ "\274\274\274\314\314\315\327\327\327\341\341\341\345\345\346\341\341\346"
+ "\356\356\361\371\371\371\371\371\374\374\374\376\202\376\376\376\3\374\372"
+ "\374\374\374\376\362\362\366\202\341\341\346\202\351\351\355\7\341\341\346"
+ "\341\341\341\356\356\361\362\362\366\365\365\371\374\372\374\376\376\376"
+ "\202\374\374\376\6\374\374\374\365\365\365\351\351\351\351\351\355\356\356"
+ "\361\351\351\351\202\345\345\346\1\351\351\351\202\356\356\361\3\341\341"
+ "\346\354\354\361\374\374\374\206\376\376\376\202\374\374\374\2\371\371\371"
+ "\362\362\366\202\351\351\355\2\362\362\366\371\371\374\204\376\376\376\1"
+ "\374\374\376\203\371\371\374\206\371\371\371\2\374\372\374\374\374\374\203"
+ "\376\376\376\1\374\374\374\212\371\371\371\2\374\372\374\374\374\374\211"
+ "\376\376\376\1\374\374\374\203\371\371\371\1\361\361\361\202\351\351\351"
+ "\5\362\362\366\374\372\374\362\362\366\345\345\346\337\337\331\203\333\333"
+ "\333\11\337\337\331\351\351\351\365\365\365\365\365\371\345\345\346\337\337"
+ "\331\341\341\341\345\345\340\341\341\341\202\333\333\333\3\351\351\355\365"
+ "\365\365\351\351\351\202\333\333\333\202\341\341\341\202\334\334\341\1\345"
+ "\345\346\202\365\365\371\1\346\346\355\202\341\341\346\6\345\345\346\355"
+ "\355\355\351\351\355\322\322\323\306\306\310\302\302\302\377\376\376\376"
+ "\326\376\376\376\7\244\246\230\235\235\234\253\252\253\267\267\272\306\306"
+ "\310\322\322\323\334\334\341\202\341\341\346\2\351\351\351\365\365\371\202"
+ "\371\371\374\17\374\374\376\376\376\376\374\374\376\374\372\374\371\371\374"
+ "\354\354\361\341\341\341\341\341\346\351\351\355\345\345\346\341\341\341"
+ "\345\345\346\365\365\371\365\365\365\371\371\371\205\376\376\376\5\371\371"
+ "\371\355\355\355\354\354\361\356\356\361\351\351\355\202\341\341\346\6\346"
+ "\346\355\356\356\361\351\351\355\341\341\341\351\351\355\371\371\374\211"
+ "\376\376\376\2\371\371\374\362\362\366\202\354\354\361\3\360\360\365\371"
+ "\371\371\374\374\376\203\376\376\376\203\374\374\376\242\376\376\376\4\371"
+ "\371\374\362\362\366\361\361\361\365\365\365\202\374\372\374\2\356\356\361"
+ "\341\341\341\204\333\333\333\6\341\341\341\355\355\355\371\371\371\365\365"
+ "\371\345\345\346\337\337\331\203\341\341\341\6\337\337\331\333\333\333\355"
+ "\355\355\371\371\371\355\355\355\341\341\341\202\334\334\341\20\341\341\341"
+ "\334\334\341\333\333\333\341\341\341\356\356\361\371\371\374\351\351\355"
+ "\341\341\341\334\334\341\341\341\346\354\354\361\361\361\361\341\341\341"
+ "\312\312\322\314\314\315\306\306\310\377\376\376\376\326\376\376\376\10\273"
+ "\301\235\223\223\224\245\245\247\255\255\260\274\274\274\314\314\315\327"
+ "\327\327\341\341\341\202\341\341\346\4\356\356\361\371\371\371\371\371\374"
+ "\374\374\376\202\376\376\376\4\374\374\376\374\372\374\371\371\374\351\351"
+ "\355\202\341\341\346\4\344\344\351\341\341\346\341\341\341\355\355\355\202"
+ "\365\365\371\1\374\372\374\205\376\376\376\5\371\371\371\351\351\355\355"
+ "\355\355\356\356\364\351\351\355\202\341\341\346\6\344\344\351\354\354\361"
+ "\351\351\355\334\334\341\344\344\351\371\371\371\212\376\376\376\2\371\371"
+ "\374\365\365\371\202\354\354\361\4\356\356\364\365\365\371\371\371\374\374"
+ "\374\376\243\376\376\376\11\374\374\376\371\371\371\362\362\366\365\365\371"
+ "\374\372\374\374\374\376\362\362\366\344\344\351\333\333\333\203\327\327"
+ "\327\12\333\333\333\341\341\346\361\361\361\374\372\374\362\362\366\341\341"
+ "\341\333\333\333\341\341\341\341\341\346\341\341\341\202\333\333\333\5\351"
+ "\351\351\371\371\371\355\355\355\334\334\341\333\333\333\203\334\334\341"
+ "\6\333\333\333\334\334\341\356\356\361\371\371\374\354\354\361\341\341\341"
+ "\202\334\334\341\7\351\351\355\365\365\365\351\351\355\324\324\332\316\316"
+ "\326\314\314\315\306\306\310\377\376\376\376\327\376\376\376\7\244\246\230"
+ "\235\235\234\253\252\253\267\267\272\302\302\302\322\322\323\333\333\333"
+ "\202\341\341\346\5\346\346\355\365\365\365\371\371\371\371\371\374\374\374"
+ "\376\202\376\376\376\202\374\372\374\5\371\371\374\351\351\355\334\334\341"
+ "\341\341\346\345\345\346\202\341\341\341\1\356\356\361\202\365\365\371\206"
+ "\376\376\376\5\371\371\371\351\351\355\346\346\355\354\354\361\351\351\355"
+ "\202\341\341\346\1\344\344\351\202\354\354\361\3\334\334\341\341\341\346"
+ "\365\365\371\213\376\376\376\3\374\374\376\365\365\371\362\362\366\202\360"
+ "\360\365\4\362\362\366\365\365\371\371\371\374\374\372\374\236\376\376\376"
+ "\12\374\374\376\374\372\374\371\371\374\371\371\371\374\374\374\376\376\376"
+ "\365\365\371\344\344\351\327\327\335\324\324\332\202\322\322\323\13\324\324"
+ "\332\333\333\333\351\351\351\365\365\371\374\372\374\355\355\355\334\334"
+ "\341\333\333\333\341\341\341\341\341\346\341\341\341\202\333\333\333\5\351"
+ "\351\355\371\371\371\355\355\355\333\333\333\327\327\335\203\333\333\333"
+ "\6\327\327\335\334\334\341\351\351\355\371\371\374\360\360\365\341\341\346"
+ "\202\334\334\341\4\344\344\351\365\365\365\356\356\361\334\334\341\203\324"
+ "\324\332\1\306\306\310\377\376\376\376\327\376\376\376\10\273\301\235\223"
+ "\223\224\245\245\247\255\255\260\274\274\274\314\314\315\327\327\327\334"
+ "\334\341\202\341\341\346\5\354\354\361\371\371\371\371\371\374\374\372\374"
+ "\374\374\376\202\376\376\376\5\374\372\374\374\374\376\365\365\371\341\341"
+ "\346\334\334\341\202\341\341\346\3\334\334\341\341\341\346\360\360\365\202"
+ "\365\365\371\206\376\376\376\5\365\365\371\351\351\355\344\344\351\354\354"
+ "\361\351\351\360\202\341\341\346\6\344\344\351\354\354\361\351\351\360\327"
+ "\327\335\334\334\341\360\360\365\215\376\376\376\1\374\372\374\202\365\365"
+ "\371\202\362\362\366\1\365\365\371\202\371\371\374\1\374\374\376\233\376"
+ "\376\376\2\374\374\376\374\372\374\202\376\376\376\4\371\371\371\354\354"
+ "\361\334\334\341\324\324\332\202\316\316\326\4\322\322\323\324\324\332\334"
+ "\334\341\354\354\361\202\371\371\374\1\351\351\355\202\333\333\333\3\341"
+ "\341\341\341\341\346\341\341\341\202\327\327\335\5\351\351\355\371\371\374"
+ "\354\354\361\334\334\341\324\324\332\205\327\327\335\4\344\344\351\365\365"
+ "\371\362\362\366\341\341\346\202\334\334\341\4\341\341\341\356\356\361\365"
+ "\365\371\344\344\351\202\327\327\335\3\333\333\333\327\327\327\306\306\310"
+ "\377\376\376\376\330\376\376\376\16\244\246\230\235\235\234\253\252\253\264"
+ "\264\265\302\302\302\322\322\323\333\333\333\341\341\341\341\341\346\344"
+ "\344\351\362\362\366\365\365\371\371\371\374\374\372\374\203\374\374\376"
+ "\4\371\371\374\374\372\374\360\360\365\341\341\346\203\334\334\341\2\327"
+ "\327\335\341\341\346\202\362\362\366\1\365\365\371\202\376\376\376\203\374"
+ "\374\376\11\376\376\376\371\371\374\351\351\355\341\341\346\351\351\355\354"
+ "\354\361\344\344\351\341\341\346\344\344\351\202\351\351\360\5\334\334\341"
+ "\327\327\335\351\351\360\374\372\374\376\376\376\213\374\374\374\202\374"
+ "\374\376\1\374\372\374\205\371\371\374\1\374\372\374\231\376\376\374\203"
+ "\376\376\376\5\371\371\371\354\354\361\334\334\341\322\322\323\316\316\326"
+ "\202\312\312\322\7\316\316\326\327\327\335\344\344\354\365\365\365\374\374"
+ "\376\365\365\365\341\341\346\202\334\334\341\12\341\341\346\345\345\346\334"
+ "\334\341\324\324\332\327\327\335\351\351\355\365\365\371\351\351\355\327"
+ "\327\335\322\322\323\204\324\324\332\5\327\327\335\341\341\346\365\365\371"
+ "\362\362\366\341\341\346\202\327\327\335\6\334\334\341\354\354\361\365\365"
+ "\371\351\351\355\334\334\341\327\327\335\202\334\334\341\2\322\322\323\302"
+ "\302\302\377\376\376\376\330\376\376\376\10\273\301\235\227\227\231\240\240"
+ "\241\255\255\260\274\274\274\306\306\310\322\322\323\334\334\341\202\341"
+ "\341\346\5\351\351\355\365\365\365\365\365\371\371\371\374\374\374\374\203"
+ "\374\372\374\202\371\371\374\2\356\356\361\341\341\341\204\327\327\335\4"
+ "\344\344\351\362\362\366\360\360\365\365\365\371\204\374\374\374\10\374\372"
+ "\374\374\374\374\374\372\374\354\354\361\341\341\346\344\344\351\351\351"
+ "\360\346\346\355\202\344\344\351\6\351\351\360\354\354\361\341\341\346\324"
+ "\324\332\341\341\346\362\362\366\212\374\372\374\241\374\374\372\202\374"
+ "\374\374\5\371\371\374\362\362\366\346\346\355\334\334\341\316\316\326\204"
+ "\312\312\322\3\327\327\335\341\341\346\360\360\365\202\371\371\374\15\356"
+ "\356\361\341\341\346\334\334\341\341\341\346\346\346\355\344\344\351\334"
+ "\334\341\324\324\332\334\334\341\356\356\361\365\365\371\344\344\351\324"
+ "\324\332\202\316\316\326\203\322\322\323\13\324\324\332\341\341\346\362\362"
+ "\366\365\365\365\341\341\346\327\327\335\324\324\332\327\327\335\346\346"
+ "\355\371\371\371\356\356\361\203\334\334\341\4\341\341\346\334\334\341\322"
+ "\322\323\274\274\274\377\376\376\376\331\376\376\376\7\256\263\231\227\227"
+ "\231\245\245\247\264\264\265\302\302\302\314\314\315\327\327\327\202\341"
+ "\341\341\2\341\341\346\355\355\355\202\365\365\371\1\371\371\371\203\371"
+ "\371\374\203\371\371\371\2\356\356\361\334\334\341\202\327\327\335\6\324"
+ "\324\332\327\327\335\351\351\355\362\362\366\356\356\364\371\371\371\207"
+ "\374\372\374\17\361\361\361\341\341\346\334\334\341\346\346\355\351\351\360"
+ "\344\344\354\344\344\351\351\351\355\354\354\361\341\341\346\324\324\332"
+ "\327\327\335\354\354\361\371\371\374\374\372\374\205\371\371\371\212\374"
+ "\374\372\231\374\372\374\5\371\371\371\360\360\365\341\341\346\327\327\335"
+ "\312\312\322\202\305\305\315\202\312\312\322\24\324\324\332\341\341\346\360"
+ "\360\365\371\371\374\374\372\374\365\365\371\346\346\355\341\341\346\344"
+ "\344\351\351\351\355\354\354\361\346\346\355\334\334\341\324\324\332\334"
+ "\334\341\362\362\366\365\365\371\341\341\346\322\322\323\312\312\322\204"
+ "\316\316\326\5\324\324\332\341\341\341\362\362\366\365\365\371\341\341\346"
+ "\203\324\324\332\13\341\341\346\365\365\371\362\362\366\341\341\341\327\327"
+ "\335\341\341\341\344\344\351\341\341\346\327\327\335\306\306\310\267\267"
+ "\272\377\376\376\376\331\376\376\376\1\307\322\237\202\235\235\234\15\255"
+ "\255\260\267\267\272\302\302\302\322\322\323\327\327\335\334\334\341\341"
+ "\341\341\345\345\346\361\361\361\362\362\366\365\365\371\371\371\371\365"
+ "\365\371\203\371\371\371\202\365\365\371\2\351\351\355\327\327\335\203\324"
+ "\324\332\5\327\327\335\346\346\355\356\356\364\356\356\361\365\365\371\207"
+ "\371\371\371\4\362\362\366\341\341\346\334\334\341\341\341\346\204\346\346"
+ "\355\6\351\351\360\341\341\346\327\327\335\324\324\332\341\341\346\360\360"
+ "\365\245\371\371\371\6\365\365\365\356\356\361\346\346\355\334\334\341\324"
+ "\324\332\312\312\322\203\305\305\315\25\316\316\326\324\324\332\341\341\346"
+ "\354\354\361\365\365\371\371\371\371\365\365\371\356\356\361\351\351\355"
+ "\346\346\355\351\351\360\356\356\364\354\354\361\346\346\355\334\334\341"
+ "\327\327\335\344\344\351\362\362\366\360\360\365\334\334\341\316\316\326"
+ "\205\312\312\322\11\316\316\326\334\334\341\356\356\361\362\362\366\344\344"
+ "\351\324\324\332\322\322\323\324\324\332\334\334\341\202\356\356\364\11\341"
+ "\341\346\327\327\335\334\334\341\341\341\346\344\344\351\341\341\341\322"
+ "\322\323\302\302\302\267\267\272\377\376\376\376\332\376\376\376\10\273\301"
+ "\235\223\223\224\245\245\247\261\261\260\274\274\274\306\306\310\322\322"
+ "\323\333\333\333\202\334\334\341\2\345\345\346\356\356\361\202\361\361\361"
+ "\204\365\365\365\1\362\362\366\202\360\360\365\2\345\345\346\327\327\327"
+ "\203\316\316\326\5\324\324\332\344\344\351\354\354\361\351\351\355\361\361"
+ "\361\207\365\365\365\5\361\361\361\344\344\351\327\327\335\324\324\332\334"
+ "\334\341\202\344\344\351\10\344\344\354\346\346\355\344\344\351\327\327\335"
+ "\312\312\322\316\316\326\341\341\346\361\361\361\235\365\365\365\202\362"
+ "\362\366\7\361\361\361\354\354\361\346\346\355\334\334\341\327\327\335\316"
+ "\316\326\312\312\322\203\305\305\315\6\312\312\322\324\324\332\327\327\335"
+ "\344\344\351\356\356\361\362\362\366\202\365\365\365\1\356\356\364\202\351"
+ "\351\355\1\354\354\361\202\360\360\365\10\354\354\361\341\341\346\327\327"
+ "\335\334\334\341\351\351\355\362\362\366\351\351\355\316\316\326\206\305"
+ "\305\315\14\312\312\322\334\334\341\354\354\361\356\356\361\334\334\341\316"
+ "\316\326\312\312\322\316\316\326\327\327\335\351\351\355\356\356\361\334"
+ "\334\341\202\324\324\332\7\334\334\341\345\345\346\341\341\341\324\324\332"
+ "\314\314\315\273\273\302\267\267\272\377\376\376\376\333\376\376\376\10\244"
+ "\246\230\227\227\231\245\245\247\264\264\265\274\274\274\306\306\310\322"
+ "\322\323\327\327\327\202\333\333\333\1\345\345\346\202\351\351\355\203\355"
+ "\355\355\202\356\356\361\202\355\355\355\3\351\351\355\341\341\341\316\316"
+ "\326\203\305\305\315\1\324\324\332\203\344\344\351\1\355\355\355\204\356"
+ "\356\361\204\355\355\355\2\351\351\351\324\324\332\202\316\316\326\1\327"
+ "\327\335\204\341\341\346\1\324\324\332\202\305\305\315\3\316\316\326\341"
+ "\341\346\355\355\355\202\356\356\361\225\355\355\355\202\351\351\355\7\351"
+ "\351\351\344\344\351\341\341\346\334\334\341\327\327\335\316\316\326\312"
+ "\312\322\205\305\305\315\5\316\316\326\324\324\332\334\334\341\351\351\351"
+ "\351\351\355\203\356\356\361\1\355\355\355\203\351\351\355\202\355\355\355"
+ "\11\356\356\361\351\351\355\341\341\346\327\327\335\334\334\341\351\351\351"
+ "\355\355\355\341\341\341\312\312\322\206\277\277\310\6\305\305\315\324\324"
+ "\332\351\351\351\351\351\355\334\334\341\312\312\322\202\305\305\315\4\316"
+ "\316\326\341\341\346\351\351\355\334\334\341\202\316\316\326\1\327\327\335"
+ "\202\334\334\341\5\327\327\335\314\314\315\302\302\302\274\274\274\267\267"
+ "\272\377\376\376\376\333\376\376\376\10\273\301\235\231\232\217\235\235\234"
+ "\253\252\253\264\264\265\274\274\274\306\306\310\314\314\315\202\322\322"
+ "\323\1\324\324\332\203\341\341\341\206\345\345\346\202\341\341\346\2\327"
+ "\327\335\305\305\315\203\277\277\310\2\312\312\322\333\333\333\202\334\334"
+ "\341\1\341\341\346\210\345\345\346\3\341\341\346\327\327\335\312\312\322"
+ "\202\305\305\315\2\316\316\326\324\324\332\202\327\327\335\2\324\324\332"
+ "\312\312\322\202\277\277\310\3\312\312\322\327\327\335\341\341\346\220\345"
+ "\345\346\2\341\341\346\341\341\341\202\334\334\341\1\327\327\335\202\324"
+ "\324\332\202\316\316\326\202\312\312\322\203\305\305\315\1\312\312\322\202"
+ "\316\316\326\3\327\327\335\334\334\341\341\341\341\215\345\345\346\1\341"
+ "\341\341\202\327\327\335\10\341\341\341\345\345\346\341\341\341\316\316\326"
+ "\273\273\302\267\267\272\263\263\277\267\267\272\203\273\273\302\2\277\277"
+ "\310\322\322\323\202\341\341\341\2\316\316\326\306\306\310\202\277\277\310"
+ "\4\305\305\315\333\333\333\341\341\341\324\324\332\202\305\305\315\11\316"
+ "\316\326\327\327\327\324\324\332\322\322\323\314\314\315\302\302\302\273"
+ "\273\302\274\274\274\267\267\272\377\376\376\376\334\376\376\376\7\256\263"
+ "\231\223\223\224\235\235\234\253\252\253\264\264\265\267\267\272\302\302"
+ "\302\203\306\306\310\1\314\314\315\203\327\327\327\206\333\333\333\5\327"
+ "\327\335\333\333\333\322\322\323\277\277\310\274\274\274\202\267\267\272"
+ "\2\277\277\310\316\316\326\202\322\322\323\1\327\327\327\211\333\333\333"
+ "\3\327\327\327\314\314\315\277\277\310\202\273\273\302\2\277\277\310\305"
+ "\305\315\202\312\312\322\2\305\305\315\273\273\302\202\263\263\277\3\273"
+ "\273\302\312\312\322\327\327\327\217\333\333\333\1\327\327\327\202\324\324"
+ "\332\203\322\322\323\202\316\316\326\4\322\322\323\316\316\326\322\322\323"
+ "\324\324\332\202\327\327\327\221\333\333\333\3\324\324\332\322\322\323\327"
+ "\327\327\202\333\333\333\2\316\316\326\273\273\302\206\255\255\260\20\263"
+ "\263\277\273\273\302\314\314\315\333\333\333\324\324\332\306\306\310\273"
+ "\273\302\267\267\272\273\273\302\277\277\310\322\322\323\327\327\327\314"
+ "\314\315\277\277\310\273\273\302\306\306\310\203\314\314\315\2\302\302\302"
+ "\273\273\302\203\274\274\274\1\261\261\260\377\376\376\376\335\376\376\376"
+ "\7\244\246\230\220\220\217\235\235\234\245\245\247\255\255\260\264\264\265"
+ "\267\267\272\203\274\274\274\3\302\302\302\314\314\315\306\306\310\211\314"
+ "\314\315\3\306\306\310\273\273\302\261\261\260\202\255\255\260\5\267\267"
+ "\272\302\302\302\277\277\310\302\302\302\306\306\310\212\314\314\315\3\306"
+ "\306\310\302\302\302\264\264\265\202\255\255\260\3\264\264\265\267\267\272"
+ "\273\273\302\202\267\267\272\1\255\255\260\202\253\252\253\4\255\255\260"
+ "\267\267\272\302\302\302\306\306\310\256\314\314\315\3\306\306\310\267\267"
+ "\272\253\252\253\206\245\245\247\6\253\252\253\264\264\265\306\306\310\314"
+ "\314\315\306\306\310\267\267\272\203\255\255\260\1\267\267\272\202\306\306"
+ "\310\1\273\273\302\202\264\264\265\5\267\267\272\273\273\302\302\302\302"
+ "\273\273\302\267\267\272\203\264\264\265\3\267\267\272\261\261\260\245\245"
+ "\247\377\376\376\376\336\376\376\376\6\231\232\217\220\220\217\227\227\231"
+ "\240\240\241\245\245\247\253\252\253\203\255\255\260\1\261\261\260\203\267"
+ "\267\272\211\274\274\274\3\267\267\272\255\255\260\245\245\247\202\240\240"
+ "\241\1\245\245\247\203\264\264\265\1\267\267\272\214\274\274\274\5\264\264"
+ "\265\245\245\247\240\240\241\235\235\234\240\240\241\204\245\245\247\1\240"
+ "\240\241\202\235\235\234\4\240\240\241\245\245\247\255\255\260\267\267\272"
+ "\253\274\274\274\2\255\255\260\240\240\241\207\227\227\231\2\240\240\241"
+ "\253\252\253\202\274\274\274\11\264\264\265\253\252\253\245\245\247\240\240"
+ "\241\245\245\247\253\252\253\267\267\272\274\274\274\255\255\260\203\245"
+ "\245\247\4\255\255\260\261\261\260\255\255\260\253\252\253\202\245\245\247"
+ "\5\253\252\253\255\255\260\253\252\253\240\240\241\227\227\231",
+};
+
diff --git a/src/image_data/clocks_banner.h b/src/image_data/clocks_banner.h
new file mode 100644
index 0000000..46814e5
--- /dev/null
+++ b/src/image_data/clocks_banner.h
@@ -0,0 +1,1884 @@
+/* GIMP RGB C-Source image dump 1-byte-run-length-encoded */
+
+#include "image.h"
+
+static const nv_image_t clocks_banner_image = {
+ 360, 60, 3,
+ "\204]y\30\202m\216\33\377\201\221\33\311\201\221\33\6\205\234G\226\244b\200"
+ "\200\205z{|\206\207\212\227\227\232\202\235\234\237\1\243\242\244\202\235"
+ "\234\237\2\217\217\222\206\207\212\203\217\217\222\3\206\207\212\200\200"
+ "\205\206\207\212\206\217\217\222\202\200\200\205\1\217\217\222\204\227\227"
+ "\232\3\200\200\205z{|\206\207\212\204\217\217\222\1\206\207\212\202z{|\1"
+ "\217\217\222\205\227\227\232\4\217\217\222rqyz{|\217\217\222\203\227\227"
+ "\232\5\217\217\222\200\200\205rqyz{|\217\217\222\210\227\227\232\2\206\207"
+ "\212\200\200\205\202z{|\1\200\200\205\202\206\207\212\205\217\217\222\225"
+ "\206\207\212\204\200\200\205\1\206\207\212\204\227\227\232\1\217\217\222"
+ "\202\206\207\212\202\217\217\222\203\227\227\232\1\217\217\222\204\206\207"
+ "\212\1\217\217\222\203\227\227\232\2\217\217\222z{|\203rqy\1\200\200\205"
+ "\202\217\217\222\206\227\227\232\202\217\217\222\202\206\207\212\202\200"
+ "\200\205\203\206\207\212\1\200\200\205\202z{|\1iku\203]y\30\202\201\221\33"
+ "\202\222\247#\377\235\262\"\307\235\262\"\11\246\277?\264\277q\241\252vz"
+ "{|\206\207\212\227\227\232\243\242\244\252\252\254\254\254\262\202\261\261"
+ "\264\1\252\252\254\202\235\234\237\202\243\242\244\4\235\234\237\227\227"
+ "\232\217\217\222\227\227\232\205\243\242\244\3\227\227\232\217\217\222\227"
+ "\227\232\204\252\252\254\4\235\234\237\206\207\212\217\217\222\235\234\237"
+ "\203\243\242\244\4\235\234\237\217\217\222\200\200\205\235\234\237\205\252"
+ "\252\254\5\243\242\244\206\207\212\200\200\205\227\227\232\244\244\252\202"
+ "\252\252\254\5\243\242\244\217\217\222\200\200\205\217\217\222\243\242\244"
+ "\207\252\252\254\2\243\242\244\217\217\222\202\206\207\212\3\217\217\222"
+ "\227\227\232\235\234\237\202\243\242\244\202\235\234\237\202\227\227\232"
+ "\1\217\217\222\206\227\227\232\2\235\234\237\227\227\232\203\235\234\237"
+ "\214\227\227\232\203\217\217\222\2\227\227\232\235\234\237\203\252\252\254"
+ "\5\243\242\244\227\227\232\217\217\222\227\227\232\243\242\244\203\252\252"
+ "\254\1\243\242\244\204\227\227\232\1\235\234\237\202\252\252\254\2\244\244"
+ "\252\227\227\232\204\200\200\205\3\217\217\222\235\234\237\243\242\244\205"
+ "\252\252\254\202\243\242\244\2\235\234\237\227\227\232\203\217\217\222\202"
+ "\227\227\232\1\217\217\222\202\200\200\205\2z{|]y\30\202\201\221\33\1\222"
+ "\247#\202\235\262\"\377\261\305&\310\261\305&\10\251\300X\302\312\225\237"
+ "\243\221z{|\217\217\222\243\242\244\252\252\254\265\265\265\202\275\275\276"
+ "\2\302\302\304\264\264\272\202\254\254\262\202\265\265\265\4\252\252\254"
+ "\235\234\237\243\242\244\252\252\254\204\261\261\264\5\254\254\262\233\233"
+ "\250\243\242\244\265\265\265\271\271\272\202\275\275\276\5\271\271\272\243"
+ "\242\244\227\227\232\243\242\244\254\254\262\202\257\255\267\5\261\261\264"
+ "\233\233\250\217\217\222\243\242\244\271\271\272\202\275\275\276\16\271\271"
+ "\272\275\275\276\264\264\272\235\234\237\203\212\224\243\242\244\265\265"
+ "\265\271\271\272\275\275\276\264\264\272\235\234\237\203\212\224\235\234"
+ "\237\265\265\265\202\275\275\276\203\271\271\272\4\275\275\276\271\271\272"
+ "\261\261\264\235\234\237\202\227\227\232\2\243\242\244\252\252\254\203\261"
+ "\261\264\202\252\252\254\204\244\244\252\202\252\252\254\5\254\254\262\261"
+ "\261\264\265\265\265\271\271\272\264\264\272\202\271\271\272\2\265\265\265"
+ "\271\271\272\202\265\265\265\202\261\261\264\1\254\254\262\202\252\252\254"
+ "\206\244\244\252\6\243\242\244\233\233\250\235\234\237\243\242\244\254\254"
+ "\262\271\271\272\202\275\275\276\11\264\264\272\244\244\252\235\234\237\243"
+ "\242\244\261\261\264\271\271\272\275\275\276\271\271\272\257\255\267\203"
+ "\244\244\252\2\252\252\254\261\261\264\202\271\271\272\2\264\264\272\233"
+ "\233\250\203\217\217\222\6\227\227\232\244\244\252\261\261\264\265\265\265"
+ "\275\275\276\271\271\272\202\275\275\276\1\271\271\272\202\261\261\264\3"
+ "\244\244\252\233\233\250\243\242\244\202\235\234\237\6\243\242\244\235\234"
+ "\237\217\217\222\206\207\212z{|m\216\33\202\201\221\33\1\222\247#\202\261"
+ "\305&\1\265\321&\377\301\325.\307\301\325.\11\340\351v\324\343\223\226\231"
+ "\212\206\207\212\235\234\237\252\252\254\265\265\265\302\302\304\311\311"
+ "\311\202\314\314\315\10\302\302\304\275\275\276\302\302\304\311\311\311\302"
+ "\302\304\265\265\265\252\252\254\261\261\264\203\275\275\276\202\302\302"
+ "\304\4\271\271\272\252\252\254\264\264\272\311\311\311\203\314\314\315\10"
+ "\302\302\304\244\244\252\251\244\260\264\264\272\273\273\304\302\302\304"
+ "\275\275\276\264\264\272\202\244\244\252\1\302\302\304\205\314\314\315\13"
+ "\264\264\272\222\230\242\243\242\244\273\273\304\311\311\311\314\314\315"
+ "\303\303\313\254\254\262\222\230\242\244\244\252\302\302\304\202\314\314"
+ "\315\202\311\311\311\202\314\314\315\7\311\311\311\273\273\304\254\254\262"
+ "\244\244\252\254\254\262\264\264\272\273\273\304\202\302\302\304\1\273\273"
+ "\304\202\264\264\272\3\261\261\264\264\264\272\271\271\272\202\302\302\304"
+ "\220\311\311\311\4\303\303\313\302\302\304\275\275\276\271\271\272\204\264"
+ "\264\272\1\265\265\265\202\261\261\264\4\251\244\260\254\254\262\275\275"
+ "\276\311\311\311\202\314\314\315\22\302\302\304\261\261\264\251\244\260\254"
+ "\254\262\275\275\276\311\311\311\314\314\315\311\311\311\302\302\304\264"
+ "\264\272\261\261\264\264\264\272\273\265\277\311\311\311\314\314\315\311"
+ "\311\311\271\271\272\233\233\250\202\222\230\242\5\233\233\250\244\244\252"
+ "\273\265\277\302\302\304\311\311\311\204\314\314\315\3\303\303\313\273\273"
+ "\304\271\271\272\203\254\254\262\203\252\252\254\3\235\234\237\217\217\222"
+ "\206\207\212\202\201\221\33\1\222\247#\202\261\305&\1\301\325.\202\307\333"
+ "0\377\315\341.\305\315\341.\16\320\350R\345\361\223\302\312\225z{|\217\217"
+ "\222\243\242\244\261\261\264\275\275\276\314\314\315\323\323\324\331\331"
+ "\335\323\323\324\311\311\311\314\314\315\202\323\323\324\4\311\311\311\275"
+ "\275\276\264\264\272\302\302\304\203\314\314\315\5\313\313\323\311\311\311"
+ "\273\273\304\271\271\272\313\313\323\204\331\331\331\12\273\273\304\254\254"
+ "\262\273\273\304\311\311\311\313\313\323\314\314\315\303\303\313\264\264"
+ "\272\251\244\260\303\303\313\205\331\331\331\13\323\323\324\254\254\262\244"
+ "\244\252\273\273\304\323\323\331\325\325\335\323\323\331\273\273\304\244"
+ "\244\252\254\254\262\313\313\323\207\331\331\331\5\311\311\311\264\264\272"
+ "\257\255\267\275\275\276\303\303\313\202\323\323\324\11\314\314\315\303\303"
+ "\313\302\302\304\275\275\276\302\302\304\311\311\311\323\323\324\331\331"
+ "\331\325\325\335\202\331\331\331\1\323\323\331\205\323\323\324\202\323\323"
+ "\331\212\331\331\331\3\323\323\324\313\313\323\311\311\311\203\302\302\304"
+ "\1\273\273\304\202\275\275\276\202\264\264\272\2\302\302\304\323\323\324"
+ "\202\331\331\331\5\313\313\323\273\273\304\257\255\267\264\264\272\303\303"
+ "\313\203\331\331\331\1\313\313\323\203\273\273\304\1\313\313\323\202\331"
+ "\331\331\2\323\323\331\264\264\272\203\244\244\252\4\251\244\260\264\264"
+ "\272\313\313\323\323\323\331\205\331\331\331\13\313\313\323\314\314\315\273"
+ "\273\304\264\264\272\271\271\272\264\264\272\254\254\262\261\261\264\244"
+ "\244\252\227\227\232\206\207\212\202\201\221\33\7\235\262\"\261\305&\265"
+ "\321&\307\3330\315\341.\321\345.\315\341.\377\321\345.\304\321\345.\21\325"
+ "\347`\345\361\223\262\270\222\200\200\205\227\227\232\252\252\254\271\271"
+ "\272\303\303\313\323\323\324\331\331\331\333\333\341\325\325\335\323\323"
+ "\331\335\331\335\341\341\341\335\335\335\323\323\324\202\302\302\304\1\313"
+ "\313\323\202\323\323\331\5\325\325\335\331\331\335\313\313\323\302\302\304"
+ "\312\305\321\204\343\342\345\13\331\331\331\273\273\304\273\265\277\313\313"
+ "\323\323\323\331\325\325\335\323\323\331\303\303\313\264\264\272\273\273"
+ "\304\341\341\341\205\343\342\345\12\303\303\313\251\244\260\273\273\304\323"
+ "\323\331\335\335\345\333\333\341\313\313\323\257\255\267\264\264\272\331"
+ "\331\331\207\343\342\345\15\323\323\331\273\273\304\273\265\277\311\311\311"
+ "\325\325\335\335\331\335\331\331\335\323\323\324\314\314\315\305\304\321"
+ "\314\314\315\325\325\335\341\341\341\202\343\342\345\4\341\341\341\335\335"
+ "\335\331\331\331\323\323\331\203\323\323\324\3\323\323\331\323\323\324\323"
+ "\323\331\202\331\331\331\1\323\323\331\204\331\331\331\202\331\331\335\1"
+ "\335\331\335\203\335\335\335\4\335\331\335\331\331\331\323\323\324\314\314"
+ "\315\204\302\302\304\1\303\303\313\202\273\273\304\2\314\314\315\341\341"
+ "\341\202\343\342\345\5\323\323\331\273\273\304\264\264\272\273\273\304\323"
+ "\323\324\203\343\342\345\5\323\323\331\305\304\321\303\303\313\313\313\323"
+ "\331\331\335\202\343\342\345\3\323\323\331\264\264\272\254\254\262\202\257"
+ "\255\267\4\264\264\272\313\313\323\335\331\335\341\341\341\204\343\342\345"
+ "\7\333\333\341\323\323\331\314\314\315\302\302\304\275\275\312\273\273\304"
+ "\271\271\272\202\261\261\264\11\235\234\237\217\217\222\201\221\33\222\247"
+ "#\235\262\"\261\305&\301\325.\307\3330\315\341.\377\324\3452\305\324\345"
+ "2\25\325\3512\340\351v\345\361\223\237\243\221\206\207\212\235\234\237\254"
+ "\254\262\275\275\276\311\311\311\323\323\324\341\341\341\343\342\345\335"
+ "\331\335\333\333\341\345\345\351\351\351\351\343\342\345\325\325\335\311"
+ "\311\311\313\313\323\335\331\335\202\333\333\341\5\335\335\335\335\335\345"
+ "\322\314\324\303\303\313\333\333\341\204\355\355\355\12\323\323\331\273\273"
+ "\304\303\303\313\331\331\335\335\335\345\333\333\341\325\325\335\275\275"
+ "\312\264\264\272\325\325\335\205\355\355\355\12\343\342\345\263\265\303\273"
+ "\265\277\323\323\331\341\341\351\345\345\351\333\333\341\275\275\312\264"
+ "\264\272\325\325\335\207\355\355\355\10\341\341\341\303\303\313\302\302\304"
+ "\315\315\331\335\335\345\345\345\351\343\342\345\331\331\335\202\323\323"
+ "\331\2\335\331\335\345\345\351\203\355\355\355\3\345\345\351\341\341\341"
+ "\324\343\223\211\340\351v\203\325\347`\205\320\350R\204\302\335M\4\277\334"
+ "=\302\335M\271\326B\302\335M\202\271\326B\4\302\335M\302\302\304\303\303"
+ "\313\311\311\311\202\303\303\313\11\325\325\335\355\351\355\355\355\355\351"
+ "\351\351\325\325\335\275\275\312\273\273\304\303\303\313\333\333\341\202"
+ "\355\355\355\12\351\351\351\325\325\335\313\313\323\315\315\331\333\333\341"
+ "\351\351\351\355\355\355\345\345\351\312\305\321\257\255\267\203\264\264"
+ "\272\3\303\303\313\335\335\345\345\345\351\204\355\355\355\4\351\351\351"
+ "\335\335\345\325\325\335\312\305\321\202\303\303\313\13\273\273\304\264\264"
+ "\272\261\261\264\244\244\252\217\217\222\201\221\33\222\247#\241\272*\261"
+ "\305&\301\325.\315\341.\203\324\3452\377\325\3512\302\325\3512\13\324\345"
+ "2\334\355=\345\361\223\324\343\223\206\207\212\217\217\222\243\242\244\261"
+ "\261\264\302\302\304\323\323\324\331\331\335\202\343\342\345\10\341\341\341"
+ "\351\351\351\355\355\361\361\361\361\351\351\355\331\331\335\323\323\324"
+ "\331\331\335\203\343\342\345\5\345\345\351\335\335\345\313\313\323\323\323"
+ "\331\355\355\361\203\365\365\365\13\355\351\355\313\313\323\303\303\313\323"
+ "\323\331\343\342\345\341\341\351\343\342\345\315\315\331\273\273\304\305"
+ "\304\321\355\355\361\202\365\365\365\16\361\361\365\365\365\365\361\361\361"
+ "\315\315\331\264\264\272\313\313\323\341\341\351\345\345\355\341\341\351"
+ "\313\313\323\263\265\303\313\313\323\361\361\361\365\365\365\203\361\361"
+ "\365\202\365\365\365\24\351\351\351\313\313\323\305\304\321\325\325\335\345"
+ "\345\351\351\351\355\345\345\351\333\333\341\325\325\335\333\333\341\351"
+ "\351\351\361\361\361\365\365\365\361\361\361\355\355\355\351\351\351\345"
+ "\345\351\345\341\351\310\325t\370\372\201\202\345\361\223\2\340\351v\370"
+ "\372\201\202\340\351v\1\355\371e\205\340\351v\203\325\347`\203\320\350R\203"
+ "\302\335M\203\271\326B\7\263\315A\257\3232\263\315A\264\264\272\303\303\313"
+ "\313\313\323\315\315\331\202\313\313\323\11\335\335\345\361\361\365\365\365"
+ "\365\351\351\355\323\323\324\303\303\313\275\275\312\313\313\323\345\345"
+ "\351\202\365\365\365\5\351\351\355\325\325\341\323\323\331\325\325\335\345"
+ "\345\351\202\361\361\365\3\341\341\351\275\275\312\263\265\303\203\273\273"
+ "\304\3\325\325\335\351\351\355\355\355\361\203\365\365\365\17\361\361\361"
+ "\351\351\355\341\341\351\323\323\324\312\305\321\314\314\315\303\303\313"
+ "\271\271\272\254\254\262\252\252\254\227\227\232\201\221\33\222\247#\235"
+ "\262\"\261\305&\202\307\3330\2\315\341.\324\3452\226\334\3567\7\325\347`"
+ "\340\351v\310\325t\325\347`\264\277q\320\350R\334\355=\202\335\3556\377\334"
+ "\3567\245\334\3567\16\341\372P\345\361\223\302\312\225\200\200\205\217\217"
+ "\222\252\252\254\265\265\265\311\311\311\323\323\324\341\341\341\345\345"
+ "\351\343\342\345\345\345\351\361\361\361\202\365\365\365\5\355\355\355\333"
+ "\333\341\325\325\335\343\342\345\351\351\355\202\345\345\351\4\351\351\355"
+ "\335\335\345\322\314\324\343\342\345\204\371\371\371\4\345\345\351\312\305"
+ "\321\313\313\323\335\335\345\202\345\345\355\4\335\335\345\312\305\321\303"
+ "\303\313\343\342\345\205\371\371\371\1\345\345\351\202\275\275\312\1\333"
+ "\333\341\202\345\345\355\4\325\325\335\273\273\304\305\304\321\361\361\361"
+ "\206\371\371\371\13\361\361\361\323\323\331\313\313\323\331\331\335\351\351"
+ "\355\355\355\361\351\351\355\335\335\345\333\333\341\343\342\345\361\361"
+ "\361\202\371\371\371\10\365\365\365\355\355\361\355\355\355\355\351\355\355"
+ "\355\355\345\345\351\310\325t\345\361\223\205\370\372\201\203\340\351v\2"
+ "\325\347`\355\371e\204\325\347`\203\320\350R\203\302\335M\2\271\326B\277"
+ "\334=\203\271\326B\12\257\3232\263\315A\271\271\272\303\303\313\323\323\324"
+ "\325\325\335\323\323\324\313\313\323\323\323\324\345\345\351\202\371\371"
+ "\371\6\351\351\355\315\315\331\303\303\313\275\275\312\315\315\331\355\355"
+ "\361\202\371\371\371\20\351\351\361\331\331\335\325\325\335\335\335\345\361"
+ "\361\365\371\371\371\365\365\365\323\323\331\273\273\304\275\275\312\303"
+ "\303\313\273\273\304\313\313\323\345\345\355\361\361\365\365\365\371\203"
+ "\371\371\371\3\355\355\365\351\351\355\331\331\335\203\313\313\323\14\273"
+ "\273\304\254\254\262\244\244\252\227\227\232\201\221\33\222\247#\241\272"
+ "*\261\305&\307\3330\315\341.\324\3452\325\3507\224\334\3567\13\302\335M\263"
+ "\264\244\206\207\212_`l\206\207\212IUW&*49;I\226\231\212\302\335M\334\355"
+ "=\377\334\3567\244\334\3567\24\335\3556\340\351v\345\361\223\262\270\222"
+ "\206\207\212\227\227\232\252\252\254\275\275\276\314\314\315\331\331\331"
+ "\341\341\341\351\351\351\343\342\345\351\351\355\365\365\365\371\371\371"
+ "\365\365\365\355\355\361\335\331\335\335\335\345\203\351\351\355\6\355\355"
+ "\361\355\351\361\331\331\335\325\325\335\355\355\361\375\375\371\202\371"
+ "\371\375\13\371\371\371\333\333\341\305\304\321\323\323\331\345\345\351\351"
+ "\351\355\345\345\355\331\331\335\303\303\313\315\315\331\365\365\365\202"
+ "\371\371\375\16\371\371\371\375\375\371\371\371\371\315\315\331\273\265\277"
+ "\313\313\323\341\341\351\345\345\355\341\341\351\305\304\321\275\275\312"
+ "\345\341\351\371\371\375\375\375\371\203\371\371\371\17\375\375\371\371\371"
+ "\371\343\342\345\313\313\323\325\325\335\345\345\355\355\355\365\351\351"
+ "\355\343\342\345\333\333\341\351\351\355\365\365\371\371\371\375\371\371"
+ "\371\365\365\365\202\355\355\361\202\351\351\355\7\345\345\351\331\331\331"
+ "\226\244b\241\252v\226\244b\241\252v\310\325t\203\370\372\201\202\355\371"
+ "e\1\340\351v\204\325\347`\203\320\350R\2\302\335M\320\350R\203\302\335M\204"
+ "\271\326B\202\263\315A\3\275\275\276\322\314\324\323\323\331\202\325\325"
+ "\335\10\315\315\331\313\313\323\323\323\331\361\361\365\371\371\375\371\371"
+ "\371\343\342\345\305\304\321\202\303\303\313\10\333\333\341\365\365\371\371"
+ "\371\375\365\365\371\341\341\351\325\325\341\333\333\341\351\351\361\202"
+ "\371\371\375\1\345\345\355\202\275\275\312\1\305\304\321\202\303\303\313"
+ "\3\333\333\341\355\355\365\371\371\371\202\371\371\375\4\375\375\371\365"
+ "\365\371\355\355\361\341\341\351\202\313\313\323\15\314\314\315\302\302\304"
+ "\254\254\262\244\244\252\227\227\232\201\221\33\222\247#\241\272*\301\325"
+ ".\307\3330\315\341.\324\3452\331\3556\223\336\3578\1z{|\202rqy\12\235\234"
+ "\237\310\325t\325\347`\340\351v\310\325t\235\234\2379;I_`l\263\264\244\334"
+ "\355=\377\336\3578\243\336\3578\13\334\3567\370\372\201\345\361\223\237\243"
+ "\221\206\207\212\235\234\237\254\254\262\302\302\304\314\314\315\331\331"
+ "\335\343\342\345\202\345\345\351\1\355\355\361\203\371\371\371\3\355\355"
+ "\361\335\335\345\345\345\351\202\355\355\361\23\355\351\355\355\355\361\351"
+ "\351\355\325\325\335\335\335\345\371\371\371\375\375\375\375\375\371\375"
+ "\375\375\365\365\371\323\323\331\312\305\321\333\333\341\345\345\355\351"
+ "\351\361\341\341\351\315\315\331\275\275\312\345\341\351\202\375\375\375"
+ "\7\375\375\371\371\371\375\375\375\375\355\355\361\303\303\313\273\273\304"
+ "\325\325\335\202\345\341\351\5\323\323\331\273\273\304\325\325\335\371\371"
+ "\371\375\375\371\203\371\371\375\202\375\375\375\25\355\355\361\315\315\331"
+ "\323\323\331\345\345\351\355\355\361\355\351\361\343\342\345\335\335\345"
+ "\351\351\355\371\371\371\375\375\371\371\371\375\361\361\365\355\355\361"
+ "\345\345\351\314\314\315\244\244\252rqyDEJTY_DEJ\20201?\202&*4\4:::TY_\226"
+ "\244b\310\325t\203\355\371e\204\325\347`\203\320\350R\203\302\335M\206\271"
+ "\326B\16\263\315A\275\275\276\331\331\335\341\341\341\333\333\341\325\325"
+ "\335\323\323\331\315\315\331\313\313\323\335\335\345\371\371\375\375\375"
+ "\375\361\361\365\325\325\335\202\303\303\313\15\312\305\321\345\345\355\375"
+ "\375\371\375\375\375\355\355\365\333\333\341\325\325\341\341\341\351\365"
+ "\365\371\375\375\371\365\365\365\313\313\323\273\273\304\202\305\304\321"
+ "\5\275\275\312\313\313\323\351\351\361\365\365\371\371\371\375\202\375\375"
+ "\375\4\371\371\371\361\361\365\345\345\355\323\323\324\202\313\313\323\11"
+ "\303\303\313\261\261\264\243\242\244\227\227\232\201\221\33\222\247#\241"
+ "\272*\301\325.\307\3330\202\324\3452\1\334\3567\221\336\3578\5\334\3567\226"
+ "\231\212\16\20\16\265\265\265\320\350R\202\335\3556\1\331\3516\202\334\355"
+ "=\6\336\3578\340\351v\200\200\2059;I\252\252\254\334\355=\377\336\3578\242"
+ "\336\3578\1\335\361:\202\345\361\223\202\217\217\222\5\243\242\244\265\265"
+ "\265\302\302\304\323\323\324\335\335\335\202\345\345\351\11\351\351\351\361"
+ "\361\365\371\371\375\375\375\375\371\371\371\355\351\355\343\342\345\351"
+ "\351\355\361\361\365\202\355\355\361\4\361\361\365\345\345\351\325\325\335"
+ "\355\355\361\204\375\375\375\12\355\355\361\313\313\323\315\315\331\341\341"
+ "\351\355\351\361\351\351\355\333\333\341\305\304\321\313\313\323\365\365"
+ "\371\205\375\375\375\11\333\333\341\263\265\303\305\304\321\335\335\345\341"
+ "\341\351\325\325\341\303\303\313\305\304\321\361\361\365\204\375\375\375"
+ "\6\375\375\371\375\375\375\361\361\365\325\325\335\322\314\324\341\341\351"
+ "\202\355\355\361\34\345\345\351\335\335\345\351\351\355\371\371\375\375\375"
+ "\375\371\371\375\361\361\365\335\335\335\243\242\244IUW\21\20\27\16\20\16"
+ "\5\10\15-,-&*4\216\225{\263\264\244\246\253\221\263\264\244\252\252\254\226"
+ "\231\212rqyTY_iku\200\200\205\251\300X\320\350R\355\371e\202\325\347`\203"
+ "\320\350R\203\302\335M\2\277\334=\302\335M\204\271\326B\14\257\3232\263\315"
+ "A\275\275\276\335\335\335\361\361\361\355\351\355\333\333\341\325\325\335"
+ "\323\323\331\313\313\323\315\315\331\351\351\355\202\375\375\375\14\345\345"
+ "\355\313\313\323\305\304\321\303\303\313\323\323\331\361\361\365\375\375"
+ "\375\371\371\375\345\345\355\332\325\341\335\335\345\355\355\365\202\375"
+ "\375\375\11\335\335\345\275\275\312\303\303\313\313\313\323\305\304\321\303"
+ "\303\313\335\335\345\365\365\371\371\371\375\203\375\375\375\20\365\365\371"
+ "\355\351\361\325\325\335\312\305\321\314\314\315\311\311\311\264\264\272"
+ "\235\234\237\227\227\232\201\221\33\222\247#\261\305&\301\325.\307\3330\324"
+ "\3452\325\3507\222\336\3578\4\302\312\225\21\20\27\313\315\253\335\3556\207"
+ "\336\3578\5\335\3556\336\3578z{|TY_\302\312\225\377\336\3578\242\336\357"
+ "8\12\341\372P\345\361\223\324\343\223\200\200\205\217\217\222\244\244\252"
+ "\265\265\265\311\311\311\323\323\324\341\341\341\202\345\345\351\12\355\355"
+ "\361\365\365\371\375\375\371\375\375\375\371\371\371\351\351\355\341\341"
+ "\351\355\355\361\361\361\365\355\355\361\202\361\361\365\3\335\335\345\333"
+ "\333\341\365\365\371\204\376\376\376\11\345\345\351\313\313\323\325\325\335"
+ "\345\345\355\355\355\361\345\345\355\323\323\331\303\303\313\335\335\345"
+ "\203\376\376\376\6\375\375\375\376\376\376\371\371\371\312\305\321\273\273"
+ "\304\315\315\331\202\335\335\345\3\313\313\323\273\273\304\335\335\345\202"
+ "\376\376\376\203\375\375\375\30\376\376\376\375\375\375\343\342\345\313\313"
+ "\323\333\333\341\351\351\361\355\355\361\345\345\351\343\342\345\355\355"
+ "\361\371\371\375\375\375\375\371\371\371\331\331\335\217\217\222-,-\0\0\0"
+ "\3\3\3:::\217\217\222\206\207\212ikuTY_\310\325t\202\370\372\201\12\355\371"
+ "e\340\351v\324\343\223\271\271\272\265\265\265\252\252\254\227\227\232\233"
+ "\233\250\217\217\222\251\300X\202\341\372P\1\320\350R\206\302\335M\204\271"
+ "\326B\11\263\315A\271\326B\263\315A\275\275\276\341\341\341\365\365\365\371"
+ "\375\375\355\351\355\331\331\335\202\323\323\331\7\313\313\323\325\325\341"
+ "\365\365\371\376\376\376\365\365\371\331\331\335\313\313\323\202\305\304"
+ "\321\23\335\335\345\371\371\375\376\376\376\365\365\371\341\341\351\333\333"
+ "\341\345\345\355\371\371\375\376\376\376\361\361\365\305\304\321\275\275"
+ "\312\323\323\331\315\315\331\303\303\313\315\315\331\355\355\365\371\371"
+ "\375\375\375\375\202\376\376\376\20\365\365\371\355\355\365\333\333\341\311"
+ "\311\311\303\303\313\311\311\311\271\271\272\243\242\244\217\217\222\201"
+ "\221\33\235\262\"\261\305&\301\325.\307\3330\324\3452\325\3507\221\336\357"
+ "8\4\325\347`iku\235\234\237\335\3556\212\336\3578\4\334\355=rqy\200\200\205"
+ "\320\350R\337\336\3578\206\334\3567\273\336\3578\12\355\371e\345\361\223"
+ "\302\312\225\206\207\212\227\227\232\252\252\254\271\271\272\314\314\315"
+ "\331\331\331\341\341\341\202\345\345\351\17\355\355\361\375\375\371\371\371"
+ "\375\375\375\375\371\371\371\351\351\355\345\345\355\365\365\371\365\361"
+ "\371\355\355\361\361\361\365\355\355\361\333\333\341\341\341\351\371\371"
+ "\375\203\376\376\376\12\375\375\375\335\335\345\313\313\323\333\333\341\351"
+ "\351\361\355\355\361\341\341\351\313\313\323\305\304\321\355\355\361\203"
+ "\376\376\376\14\375\375\375\376\376\376\351\351\361\275\275\312\303\303\313"
+ "\325\325\335\335\335\345\325\325\341\275\275\312\303\303\313\355\355\365"
+ "\376\376\376\204\375\375\375\2\376\376\376\365\361\371\202\323\323\331\12"
+ "\345\341\351\355\355\361\345\345\355\335\335\345\345\345\351\371\371\371"
+ "\375\375\375\351\351\355\217\217\222\"#$\202\0\0\0\10fgf\302\302\304\311"
+ "\311\311\252\252\254\227\227\232\235\234\237\252\252\254\310\325t\204\370"
+ "\372\201\202\355\371e\13\340\351v\313\315\253\275\275\276\271\271\272\264"
+ "\264\272\251\244\260\216\225{\302\335M\341\372P\302\335M\320\350R\203\302"
+ "\335M\206\271\326B\202\263\315A\16\275\275\276\335\331\335\365\365\365\376"
+ "\376\376\371\371\375\345\345\351\325\325\335\323\323\331\313\313\323\315"
+ "\315\331\345\345\355\375\375\375\376\376\376\345\345\355\202\313\313\323"
+ "\17\305\304\321\313\313\323\355\355\365\376\376\376\375\375\375\351\351\361"
+ "\333\333\341\341\341\351\365\365\371\376\376\376\371\371\375\323\323\331"
+ "\275\275\312\315\315\331\323\323\331\202\305\304\321\3\345\345\355\371\371"
+ "\375\375\375\375\202\376\376\376\15\371\371\375\361\361\361\335\335\345\312"
+ "\305\321\303\303\313\311\311\311\273\273\304\244\244\252\217\217\222\201"
+ "\221\33\222\247#\263\315A\301\325.\202\324\3452\1\331\3516\221\336\3578\3"
+ "\313\315\253&*4\340\351v\213\336\3578\4\334\355=\310\325tTY_\262\270\222"
+ "\333\336\3578\1\334\3567\202\331\3556\207\331\3516\202\334\3567\270\336\357"
+ "8\17\334\3567\355\371e\345\361\223\262\270\222\206\207\212\227\227\232\252"
+ "\252\254\275\275\276\314\314\315\331\331\335\343\342\345\351\351\351\355"
+ "\351\355\361\361\365\371\371\375\202\375\375\375\4\365\365\371\345\345\355"
+ "\351\351\355\365\365\371\202\361\361\365\4\365\365\371\351\351\355\333\333"
+ "\341\355\355\361\204\376\376\376\12\365\365\371\325\325\335\313\313\323\341"
+ "\341\351\355\355\361\351\351\361\333\333\341\303\303\313\315\315\331\371"
+ "\371\371\202\376\376\376\1\375\375\375\202\376\376\376\12\333\333\341\273"
+ "\273\304\305\304\321\331\331\335\333\333\341\313\313\323\263\265\303\325"
+ "\325\341\375\375\375\376\376\376\203\375\375\375\5\376\376\376\375\375\375"
+ "\341\341\351\313\313\323\333\333\341\202\351\351\355\202\343\342\345\4\365"
+ "\365\365\365\365\371\271\271\272:::\202\0\0\0\4:::\302\302\304\335\335\335"
+ "\311\311\311\202\261\261\264\4\271\271\272\265\265\265\243\242\244z{|\202"
+ "TY_\3z\214^\226\244b\310\325t\202\355\371e\2\325\347`\345\361\223\202\311"
+ "\311\311\5\275\275\276\261\261\264\206\207\212\251\300X\341\372P\205\302"
+ "\335M\206\271\326B\4\263\315A\275\275\276\331\331\335\361\361\365\202\376"
+ "\376\376\12\365\365\371\335\335\345\323\323\331\315\315\331\313\313\323\323"
+ "\323\331\361\361\365\376\376\376\365\365\371\331\331\335\202\313\313\323"
+ "\10\303\303\313\333\333\341\375\375\375\376\376\376\365\365\371\335\335\345"
+ "\333\333\341\355\355\361\202\375\375\375\11\341\341\351\303\303\313\313\313"
+ "\323\333\333\341\315\315\331\303\303\313\333\333\341\365\365\371\371\371"
+ "\375\202\375\375\375\14\371\371\375\361\361\365\345\345\351\313\313\323\303"
+ "\303\313\311\311\311\302\302\304\244\244\252\217\217\222\201\221\33\235\262"
+ "\"\261\305&\202\307\3330\2\324\3452\331\3516\221\336\3578\202sz\205\2\334"
+ "\355=\334\3567\205\336\3578\12\320\350R\264\277q\241\252v\302\312\225\334"
+ "\355=\334\3567\334\355=sz\205\206\207\212\334\355=\325\336\3578\203\334\356"
+ "7\1\331\3556\202\331\3516\202\325\3507\5\320\350R\310\325t\246\253\221\251"
+ "\300X\324\3452\203\325\3507\202\331\3556\1\334\3567\266\336\3578\16\331\355"
+ "6\370\372\201\345\361\223\237\243\221\217\217\222\235\234\237\254\254\262"
+ "\302\302\304\323\323\324\335\331\335\343\342\345\345\345\351\355\355\355"
+ "\365\365\371\203\375\375\375\5\365\365\371\351\351\355\355\355\361\365\365"
+ "\371\365\365\365\202\365\361\371\3\345\345\351\335\335\345\361\361\365\204"
+ "\376\376\376\11\355\355\361\315\315\331\323\323\331\345\345\355\355\355\365"
+ "\351\351\355\321\320\336\303\303\313\335\335\345\203\376\376\376\10\375\375"
+ "\375\376\376\376\371\371\375\313\313\323\273\273\304\315\315\331\333\333"
+ "\341\323\323\331\202\275\275\312\2\355\355\361\376\376\376\204\375\375\375"
+ "\2\376\376\376\365\365\371\202\323\323\331\10\341\341\351\345\345\355\343"
+ "\342\345\335\335\345\355\355\361\345\345\351rqy\5\10\15\202\0\0\0\36\200"
+ "\200\205\331\331\331\311\311\311\265\265\265\275\275\276\271\271\272\206"
+ "\207\212DEJ\31\34\32:::z{|\206\207\212z{|TY__`l\206\207\212\216\225{\325"
+ "\347`\355\371e\320\350R\340\351v\327\330\306\323\323\324\314\314\315\261"
+ "\261\264z{|\264\277q\341\372P\277\334=\302\335M\210\271\326B\5\246\277?\271"
+ "\271\272\335\331\335\355\355\361\375\375\375\202\376\376\376\3\355\355\361"
+ "\331\331\335\315\315\331\202\313\313\323\1\345\341\351\202\375\375\375\1"
+ "\345\345\355\202\315\315\331\13\313\313\323\315\315\331\361\361\365\376\376"
+ "\376\375\375\375\351\351\361\333\333\341\345\341\351\371\371\375\376\376"
+ "\376\355\355\365\202\305\304\321\6\333\333\341\331\331\335\305\304\321\315"
+ "\315\331\361\361\365\371\371\375\203\375\375\375\14\365\365\371\351\351\355"
+ "\315\315\331\275\275\312\303\303\313\302\302\304\254\254\262\217\217\222"
+ "\201\221\33\241\272*\261\305&\307\3330\202\324\3452\1\331\3516\220\334\356"
+ "7\4\320\350Riku\237\243\221\334\355=\202\334\3567\3\320\350R\264\277q\227"
+ "\227\232\202\233\233\250\11rqy9;I\243\245\264\302\335M\334\355=\335\3556"
+ "\226\231\212rqy\325\347`\322\334\3567\203\331\3556\1\331\3516\202\325\350"
+ "7\202\324\3452\11\302\335M\264\277q\216\225{sz\205_mpx\205\210Teg\277\334"
+ "=\307\3330\203\324\3452\2\331\3516\331\3556\267\334\3567\202\345\361\223"
+ "\202\217\217\222\11\235\234\237\261\261\264\302\302\304\323\323\324\335\335"
+ "\335\345\345\351\351\351\355\355\355\361\371\371\371\203\375\375\375\3\361"
+ "\361\365\351\351\355\361\361\365\203\365\365\371\1\361\361\365\202\341\341"
+ "\351\1\371\371\375\204\376\376\376\11\351\351\355\315\315\331\325\325\335"
+ "\351\351\361\355\355\361\345\345\351\313\313\323\303\303\313\355\355\361"
+ "\203\376\376\376\3\375\375\375\376\376\376\355\355\361\202\275\275\312\7"
+ "\315\315\331\325\325\341\313\313\323\273\273\304\323\323\331\371\371\371"
+ "\376\376\376\203\375\375\375\202\376\376\376\11\345\345\355\313\313\323\331"
+ "\331\335\345\345\351\345\341\351\333\333\341\343\342\345\311\311\311:::\203"
+ "\0\0\0\3\227\227\232\335\335\335\271\271\272\202\275\275\276\11z{|\31\34"
+ "\32\0\0\0\5\10\15iku_`l\216\225{\271\271\272\275\275\276\202\311\301\310"
+ "\10\265\265\265\264\264\272\206\207\212\264\277q\355\371e\320\350R\325\347"
+ "`\327\330\306\202\331\331\331\6\254\254\262TY_\264\277q\341\372P\271\326"
+ "B\302\335M\205\271\326B\32\263\315A\277\334=\246\277?\275\275\276\335\335"
+ "\335\355\355\361\371\371\375\375\375\375\376\376\376\371\371\375\345\345"
+ "\351\323\323\331\313\313\323\312\305\321\325\325\335\365\365\371\376\376"
+ "\376\365\365\371\325\325\335\323\323\331\315\315\331\305\304\321\341\341"
+ "\351\375\375\375\376\376\376\361\361\365\202\335\335\345\31\365\365\371\376"
+ "\376\376\371\371\371\323\323\331\303\303\313\333\333\341\341\341\351\315"
+ "\315\331\303\303\313\345\345\355\371\371\375\375\375\375\376\376\376\375"
+ "\375\375\365\365\371\355\355\361\323\323\331\273\273\304\303\303\313\302"
+ "\302\304\261\261\264\217\217\222\201\221\33\241\272*\301\325.\202\307\333"
+ "0\2\324\3452\334\355=\217\334\3567\26\335\3556\325\347`TY_\237\243\221\335"
+ "\3556\334\3567\320\350R\213\222\233DEJTY_\243\245\264\222\230\242\213\222"
+ "\2339;I\222\230\242\302\312\225\335\3556\334\3567\264\277qrqy\320\350R\335"
+ "\3556\316\334\3567\202\331\3556\202\331\3516\202\325\3507\5\324\3452\277"
+ "\334=\251\300X\226\244b\216\225{\202ix{\7iku<QN\222\230\242Tegz{|\205\234"
+ "G\301\325.\202\307\3330\4\324\3452\325\3507\331\3516\331\3556\265\334\356"
+ "7\1\334\355=\202\345\361\223\13\206\207\212\217\217\222\243\242\244\265\265"
+ "\265\311\311\311\323\323\324\341\341\341\345\345\351\351\351\355\361\361"
+ "\365\371\371\371\203\375\375\375\3\361\361\365\351\351\355\365\361\371\203"
+ "\365\365\371\4\361\361\365\335\335\345\345\345\355\375\375\375\203\376\376"
+ "\376\4\375\375\375\341\341\351\315\315\331\333\333\341\202\355\355\361\4"
+ "\335\335\345\305\304\321\315\315\331\365\365\371\202\376\376\376\1\375\375"
+ "\375\202\376\376\376\3\343\342\345\273\273\304\303\303\313\202\323\323\331"
+ "\3\303\303\313\273\273\304\345\341\351\202\376\376\376\203\375\375\375\6"
+ "\376\376\376\371\371\371\331\331\335\315\315\331\335\335\345\345\345\351"
+ "\202\335\335\345\6\243\242\244\21\20\27\3\3\3\0\0\0\5\10\15fgf\202\265\265"
+ "\265\3\302\302\304\244\244\252-,-\202\0\0\0\32z{|\323\323\324\261\261\264"
+ "z{|\251\300X\355\371e\345\361\223\327\330\306\323\323\331\323\323\324\314"
+ "\314\315\261\261\264TY_\241\252v\355\371e\320\350R\325\347`\275\275\276\331"
+ "\331\331\335\331\335\254\254\262IUW\264\277q\323\365?\271\326B\302\335M\206"
+ "\271\326B\4\246\277?\275\275\276\335\335\335\361\361\361\202\371\371\375"
+ "\202\376\376\376\2\365\365\371\333\333\341\203\313\313\323\16\355\355\361"
+ "\376\376\376\371\371\375\335\335\345\323\323\331\325\325\341\313\313\323"
+ "\325\325\335\365\365\371\376\376\376\371\371\375\341\341\351\335\335\345"
+ "\355\355\365\202\375\375\375\7\335\335\345\303\303\313\331\331\335\345\345"
+ "\355\325\325\335\303\303\313\335\335\345\202\371\371\375\6\376\376\376\375"
+ "\375\375\371\371\371\355\355\361\331\331\335\275\275\312\202\302\302\304"
+ "\10\261\261\264\227\227\232\201\221\33\235\262\"\261\305&\307\3330\315\341"
+ ".\324\3452\221\331\3556\3\334\355=rqy\216\225{\202\331\3556\5\331\3516\233"
+ "\233\250TY_9;I\263\265\303\202\233\233\250\3""9;Isz\205\263\264\244\202\331"
+ "\3556\3\217\217\222iku\320\350R\314\331\3556\1\325\3552\202\325\3512\202"
+ "\324\3452\15\315\341.\277\334=\246\277?\226\244b\216\225{ix{_mpx\205\210"
+ "ix{Teg\203\212\224Teg\213\222\233\202_mp\4\222\230\242fgf\263\315A\301\325"
+ ".\202\307\3330\202\324\3452\1\325\3552\264\331\3556\17\331\3552\341\372P"
+ "\345\361\223\324\343\223\200\200\205\227\227\232\243\242\244\264\264\272"
+ "\311\311\311\323\323\331\341\341\341\345\345\351\355\351\355\361\361\361"
+ "\371\371\375\202\375\375\375\3\371\371\375\361\361\365\355\355\361\203\365"
+ "\365\371\4\365\365\375\355\355\361\343\342\345\355\355\361\204\376\376\376"
+ "\12\371\371\371\333\333\341\315\315\331\341\341\351\355\355\365\355\351\361"
+ "\331\331\335\303\303\313\333\333\341\375\375\375\202\376\376\376\14\375\375"
+ "\375\376\376\376\371\371\375\321\320\336\273\273\304\305\304\321\321\320"
+ "\336\315\315\331\273\273\304\305\304\321\365\365\371\376\376\376\204\375"
+ "\375\375\12\376\376\376\355\355\361\315\315\331\323\323\331\335\335\345\343"
+ "\342\345\333\333\341\343\342\345iku\3\3\3\202\0\0\0\202fgf\10\261\261\264"
+ "\311\311\311\217\217\222\16\20\16\0\0\0\31\34\32\235\234\237\331\331\331"
+ "\202\265\265\265\13\303\274\304\264\277q\370\372\201\325\347`\340\351v\323"
+ "\323\324\331\331\335\335\331\335\323\323\324\241\252v\310\325t\202\355\371"
+ "e\10m\204>z{|\323\323\324\341\341\341\342\333\342\264\277q\263\315A\302\335"
+ "M\205\271\326B\10\263\315A\271\326B\277\334=\246\277?\275\275\276\335\335"
+ "\335\361\361\361\371\371\371\202\371\371\375\36\376\376\376\375\375\375\351"
+ "\351\355\315\315\331\313\313\323\312\305\321\341\341\351\375\375\375\376"
+ "\376\376\351\351\361\321\320\336\333\333\341\325\325\335\313\313\323\355"
+ "\351\361\376\376\376\375\375\375\355\351\361\333\333\341\351\351\361\371"
+ "\371\375\376\376\376\351\351\361\303\303\313\325\325\335\351\351\361\341"
+ "\341\351\312\305\321\315\315\331\361\361\371\203\375\375\375\13\371\371\371"
+ "\361\361\365\335\335\345\302\302\304\273\273\304\302\302\304\265\265\265"
+ "\227\227\232\201\221\33\241\272*\301\325.\202\307\3330\1\324\3452\222\331"
+ "\3552\3sz\205\200\200\205\334\355=\202\331\3552\4\251\244\260_`l9;I\243\245"
+ "\264\202\222\230\242\10TY__`l\254\254\262\331\3556\334\355=\217\217\222s"
+ "z\205\334\355=\307\331\3552\202\325\3552\202\325\3512\203\324\3452\26\304"
+ "\3428\263\315A\226\244bz\214^z{|ix{Tegx\205\210_mpsz\205x\205\210_mp\203"
+ "\212\224TY_\203\212\224x\205\210TY_\213\222\233Teg\206\207\212z\214^\261"
+ "\305&\202\301\325.\4\307\3330\324\3452\325\3512\325\3552\263\331\3552\17"
+ "\331\3516\341\372P\345\361\223\302\312\225\206\207\212\227\227\232\244\244"
+ "\252\271\271\272\311\311\311\331\331\331\341\341\341\345\345\351\355\355"
+ "\355\361\361\365\371\371\375\202\375\375\375\12\371\371\375\355\355\365\355"
+ "\355\361\365\365\371\371\371\375\365\365\375\365\365\371\351\351\361\341"
+ "\341\351\365\365\371\204\376\376\376\11\365\365\371\331\331\335\323\323\331"
+ "\345\345\351\355\355\365\351\351\361\323\323\331\305\304\321\351\351\355"
+ "\203\376\376\376\12\375\375\375\376\376\376\361\361\365\305\304\321\263\265"
+ "\303\313\313\323\315\315\331\312\305\321\273\273\304\325\325\335\202\376"
+ "\376\376\203\375\375\375\13\376\376\376\375\375\375\341\341\351\313\313\323"
+ "\325\325\341\335\335\345\333\333\341\335\335\345\361\361\361\252\252\254"
+ "IUW\202\0\0\0$\"*,\252\252\254\275\275\276\331\331\331z{|\"#$\0\0\0-,-\254"
+ "\254\262\252\252\254\275\275\276\323\323\324\335\331\331\264\277q\370\372"
+ "\201\340\351v\325\347`\324\343\223\323\323\324\335\331\331\324\343\223\355"
+ "\371e\341\372P\355\371em\204>:::\252\252\254\323\323\324\343\342\345\324"
+ "\343\223\320\350R\277\334=\302\335M\277\334=\271\326B\263\315A\205\271\326"
+ "B%\246\277?\275\275\276\335\335\335\361\361\361\371\371\375\371\371\371\371"
+ "\371\375\375\375\375\376\376\376\365\365\371\331\331\335\313\313\323\305"
+ "\304\321\325\325\335\365\365\371\376\376\376\365\361\371\325\325\341\333"
+ "\333\341\335\335\345\313\313\323\335\335\345\371\371\375\376\376\376\365"
+ "\361\371\335\335\345\345\341\351\371\371\375\376\376\376\361\361\365\312"
+ "\305\321\315\315\331\355\355\361\351\351\361\315\315\331\312\305\321\351"
+ "\351\355\203\375\375\375\13\371\371\371\361\361\365\343\342\345\302\302\304"
+ "\273\273\304\302\302\304\271\271\272\235\234\237\201\234$\235\262\"\261\305"
+ "&\202\307\3330\1\324\3452\222\325\3552\23\246\253\221TY_\310\325t\325\351"
+ "2\325\3552\302\312\225sz\2059;I\203\212\224\333\334\352\321\320\33601?ik"
+ "u\325\347`\325\3512\325\347`IUW\237\243\221\331\3516\303\325\3552\204\325"
+ "\3512\202\324\3452\34\315\345.\311\342/\271\326B\251\300X\226\244bix{\203"
+ "\212\224_mp_`l\213\222\233Teg\213\222\233Tegsz\205\213\222\233<QN\222\230"
+ "\242_mpix{x\205\210IUW\213\222\233_mpiku\203\212\224_mp\246\277?\261\305"
+ "&\202\301\325.\2\315\341.\315\345.\202\325\3512\263\325\3552\32\325\347`"
+ "\345\361\223\302\312\225\206\207\212\227\227\232\252\252\254\271\271\272"
+ "\314\314\315\331\331\331\341\341\341\345\345\351\355\355\361\365\365\371"
+ "\371\371\375\375\375\371\375\375\375\371\371\375\361\361\365\355\355\365"
+ "\371\371\371\371\371\375\371\371\371\365\365\371\351\351\355\345\345\351"
+ "\371\371\371\204\376\376\376\1\365\365\371\202\325\325\335\6\351\351\355"
+ "\355\355\365\345\345\355\315\315\331\313\313\323\361\361\365\203\376\376"
+ "\376\13\375\375\375\376\376\376\355\355\361\275\275\312\273\273\304\313\313"
+ "\323\315\315\331\275\275\312\273\273\304\345\345\355\376\376\376\204\375"
+ "\375\375\14\376\376\376\371\371\371\325\325\335\315\315\331\331\331\335\335"
+ "\335\345\333\333\341\345\345\351\371\371\371\351\351\351rqy\31\34\32\202"
+ "\0\0\0\12\200\200\205\302\302\304\335\335\335\254\254\262fgf\0\0\0\3\3\3"
+ "\200\200\205\265\265\265\323\323\324\202\351\351\351\20\264\277q\355\371"
+ "e\325\347`\340\351v\320\350R\324\343\223\340\351v\325\347`\355\371e\341\372"
+ "Pm\204>\"#$\217\217\222\275\275\276\323\323\324\345\361\223\202\271\326B"
+ "\3\320\350R\304\3428\263\315A\202\304\3428\204\263\315A\5\271\326B\246\277"
+ "?\275\275\276\335\335\335\361\361\361\204\371\371\375\26\376\376\376\375"
+ "\375\375\345\345\355\315\315\331\312\305\321\315\315\331\355\355\361\376"
+ "\376\376\371\371\375\335\335\345\333\333\341\341\341\351\321\320\336\325"
+ "\325\335\365\365\371\376\376\376\371\371\375\345\341\351\341\341\351\365"
+ "\365\371\376\376\376\365\365\371\202\315\315\331\5\355\351\361\355\355\365"
+ "\325\325\335\305\304\321\341\341\351\202\375\375\375\17\371\371\375\371\371"
+ "\371\361\361\365\345\345\351\303\303\313\273\265\277\302\302\304\264\264"
+ "\272\243\242\244\201\221\33\241\272*\301\325.\307\3330\311\342/\324\3452"
+ "\222\325\3552\23\310\325t9;I\263\264\244\325\3507\325\3552\325\347`\217\217"
+ "\22201?sz\205DEJ\33#,\345\345\371\273\265\277\325\3507\325\3552\226\231\212"
+ "01?\325\347`\325\3507\277\325\3552\1\325\3512\204\321\3512\202\315\345.\36"
+ "\311\342/\277\334=\251\300X\226\244b\216\225{_mp\203\212\224_mp_`l\203\212"
+ "\224Teg\222\230\242IUWsz\205\203\212\224IUW\213\222\233Tegx\205\210ix{Te"
+ "g\222\230\242Tegx\205\210sz\205ix{\222\230\242<QN\206\207\212z\214^\202\261"
+ "\305&\3\301\325.\307\3330\315\341.\202\321\3512\263\325\3552\21\355\371e"
+ "\345\361\223\262\270\222\206\207\212\235\234\237\252\252\254\271\271\272"
+ "\314\314\315\331\331\331\335\335\345\351\351\351\355\355\361\365\365\371"
+ "\371\371\375\375\375\375\376\376\376\371\371\375\202\361\361\365\7\371\371"
+ "\375\371\371\371\371\371\375\365\365\371\345\345\355\351\351\361\371\371"
+ "\375\204\376\376\376\11\361\361\365\325\325\335\331\331\335\355\351\361\361"
+ "\361\365\345\345\355\313\313\323\325\325\335\371\371\375\203\376\376\376"
+ "\5\375\375\375\376\376\376\345\345\355\273\273\304\275\275\312\202\313\313"
+ "\323\4\273\273\304\303\303\313\365\365\365\376\376\376\204\375\375\375\4"
+ "\376\376\376\361\361\365\315\315\331\323\323\331\203\333\333\341\5\355\355"
+ "\361\375\375\375\365\365\365\235\234\237rqy\202\0\0\0\16\31\34\32\271\271"
+ "\272\323\323\324\323\323\331rqyIUW\0\0\0\21\20\27\252\252\254\331\331\331"
+ "\355\355\355\351\351\355\264\277q\355\371e\203\325\347`\24\320\350R\325\347"
+ "`\355\371e\271\334#m\204>01?\217\217\222\275\275\276\327\330\306\340\351"
+ "v\263\315A\302\335M\341\372P\257\3232UlF\200\200\205\216\225{\257\3232\305"
+ "\355.\277\334=\202\263\315A\5\271\326B\241\272*\275\275\276\335\335\335\361"
+ "\361\361\202\371\371\375\6\371\371\371\371\371\375\375\375\375\376\376\376"
+ "\361\361\365\325\325\335\202\313\313\323\1\345\345\351\202\375\375\375\""
+ "\345\345\351\333\333\341\345\345\355\335\335\345\315\315\331\351\351\361"
+ "\376\376\376\371\371\375\355\355\361\341\341\351\361\361\365\376\376\376"
+ "\375\375\375\325\325\341\313\313\323\351\351\361\365\365\371\341\341\351"
+ "\303\303\313\331\331\335\371\371\375\376\376\376\371\371\375\371\371\371"
+ "\361\361\365\351\351\355\311\311\311\264\264\272\302\302\304\271\271\272"
+ "\243\242\244\201\221\33\235\262\"\265\321&\202\307\3330\1\315\345.\222\321"
+ "\351.\22\325\3507\241\252v9;I\262\270\222\325\3507\321\3512\325\3512\313"
+ "\315\253\305\305\33101?\5\10\15\333\334\352\257\255\267\334\355=\216\225"
+ "{\16\20\16\235\234\237\321\3512\277\321\351.\1\321\345.\203\315\345.\11\307"
+ "\3330\301\325.\225\257:\205\234Gz\214^z{|Tegx\205\210Teg\202sz\205\30Teg"
+ "\222\230\242IUW\213\222\233_mpTeg\203\212\224IUW\222\230\242IUWTeg\231\243"
+ "\251iku\213\222\233Tegz{|\222\230\242IUWsz\205_mp\203\212\224sz\205Teg\225"
+ "\257:\202\261\305&\3\301\325.\307\3330\315\341.\264\321\351.\16\340\351v"
+ "\345\361\223\237\243\221\217\217\222\235\234\237\252\252\254\275\275\276"
+ "\314\314\315\331\331\331\341\341\341\351\351\355\355\355\361\365\365\371"
+ "\371\371\375\202\375\375\375\1\371\371\371\202\361\361\365\1\371\363\372"
+ "\202\371\371\375\3\365\365\371\345\345\355\355\355\361\203\375\375\375\202"
+ "\376\376\376\3\355\355\365\325\325\335\333\333\341\202\355\355\365\3\335"
+ "\335\345\313\313\323\335\335\345\205\376\376\376\12\375\375\375\335\335\345"
+ "\263\265\303\303\303\313\313\313\323\305\304\321\273\273\304\315\315\331"
+ "\371\371\371\376\376\376\205\375\375\375\14\351\351\355\313\313\323\323\323"
+ "\331\333\333\341\325\325\335\335\335\345\365\365\371\376\376\376\371\371"
+ "\371\351\351\351z{|TY_\202\0\0\0\15TY_\311\311\311\323\323\324\261\261\264"
+ "\200\200\205\"#$\0\0\0DEJ\311\311\311\335\335\335\343\342\345\264\277q\355"
+ "\371e\203\325\347`\17\355\371e\323\365?}\243\25z{|iku\252\252\254\275\275"
+ "\276\350\350\304\310\325t\257\3232\320\350R\323\365?\201\234$DEJIUW\202\235"
+ "\234\237\22\206\207\212\226\244b\257\3232\275\341&\250\3051\271\326B\225"
+ "\257:\275\275\276\335\335\335\361\361\361\371\371\375\375\375\375\371\371"
+ "\375\371\371\371\371\371\375\376\376\376\371\371\371\343\342\345\202\313"
+ "\313\323\5\335\335\345\371\371\375\376\376\376\351\351\361\335\335\345\202"
+ "\345\345\355\2\321\320\336\343\342\345\202\375\375\375\32\361\361\365\341"
+ "\341\351\355\355\365\375\375\375\376\376\376\335\335\345\312\305\321\351"
+ "\351\361\371\371\375\351\351\361\313\313\323\315\315\331\365\365\371\376"
+ "\376\376\371\371\375\371\371\371\365\365\365\351\351\361\313\313\323\264"
+ "\264\272\275\275\276\271\271\272\243\242\244\201\221\33\241\272*\301\325"
+ ".\202\307\3330\1\315\345.\223\321\351.\13\320\350Rz{|&*4\271\271\272\320"
+ "\350R\321\3512\310\325t\263\265\303rqy\3\3\3\305\305\331\202\222\230\242"
+ "\3\21\20\27sz\205\320\350R\236\321\351.\1\315\351.\207\315\345.\2\321\351"
+ ".\315\351.\222\321\351.\3\315\351.\321\351.\315\351.\202\315\345.\202\311"
+ "\342/\17\304\3428\263\315A\251\300Xz\214^x\205\210sz\205_mp\222\230\242T"
+ "Y_x\205\210ix{_mp\213\222\233<QN\213\222\233\202_mp\34x\205\2103HE\231\243"
+ "\251IUWix{\213\222\233sz\205\203\212\224<QNIUW\16""4$\6)\30\252\261\276<"
+ "QN\203\212\224ix{TY_\231\243\251IUW\217\217\222z\214^\241\272*\261\305&\265"
+ "\321&\276\334,\311\342/\315\345.\315\351.\262\321\351.\15\340\351v\345\361"
+ "\223\237\243\221\217\217\222\235\234\237\252\252\254\275\275\276\314\314"
+ "\315\323\323\331\341\341\341\351\351\355\361\361\361\365\365\371\202\371"
+ "\371\375\2\375\375\375\365\365\371\202\361\361\365\6\365\365\371\371\371"
+ "\371\371\371\375\361\361\365\351\351\355\361\361\365\202\375\375\375\6\371"
+ "\371\375\375\375\375\376\376\376\355\355\361\325\325\335\335\335\345\202"
+ "\355\355\365\3\335\335\345\313\313\323\345\341\351\203\376\376\376\203\375"
+ "\375\375\7\325\325\341\263\265\303\303\303\313\315\315\331\303\303\313\263"
+ "\265\303\331\331\335\207\375\375\375\33\343\342\345\313\313\323\323\323\331"
+ "\331\331\335\325\325\335\345\345\351\375\375\375\376\376\376\375\375\375"
+ "\361\361\365\311\311\311z{|103\0\0\0\3\3\3\200\200\205\311\311\311\322\314"
+ "\324\226\231\212\200\200\205-,-\0\0\0-,-\273\265\277\323\323\324\264\277"
+ "q\355\371e\202\341\372P\10\305\355.\222\247#z\214^\254\254\262\261\261\264"
+ "\254\254\262\275\275\276\345\361\223\202\271\326B\22\341\372P\265\321&]y"
+ "\30fgfz{|\265\265\265\275\275\276\302\302\304\251\244\260\213\222\233sz\205"
+ "\241\252v\277\334=\257\3232\225\257:\271\271\272\335\335\335\361\361\361"
+ "\202\371\371\375\3\375\375\375\371\371\375\371\371\371\202\375\375\375\10"
+ "\351\351\361\323\323\331\312\305\321\331\331\335\365\365\371\376\376\376"
+ "\361\361\371\335\335\345\202\351\351\361!\325\325\341\333\333\341\371\371"
+ "\375\376\376\376\365\365\371\345\345\355\355\355\365\375\375\375\376\376"
+ "\376\345\345\351\312\305\321\345\345\355\371\371\375\361\361\365\315\315"
+ "\331\313\313\323\361\361\365\376\376\376\371\371\375\371\371\371\365\365"
+ "\365\355\355\361\313\313\323\264\264\272\273\273\304\271\271\272\243\242"
+ "\244\201\221\33\241\272*\265\321&\301\325.\306\340*\315\345*\223\315\351"
+ ".\21\315\345*\320\350R\226\231\212\31\34\32DEJ\216\225{\264\277q\252\261"
+ "\276\243\245\264\0\0\0\243\245\264\263\265\30301?\203\212\224\277\334=\321"
+ "\345.\315\345*\233\315\351.\202\315\345*\3\325\347`\320\350R\307\3330\206"
+ "\306\340*\4\311\345*\315\341.\315\345*\315\345.\214\315\351.\1\315\345.\202"
+ "\315\345*\11\311\345*\311\342/\306\340*\307\3330\271\326B\251\300X\226\244"
+ "bix{x\205\210\202_mp\11\222\230\242TY_\213\222\233_mpix{\213\222\233<QN\222"
+ "\230\242Teg\202ix{\11""3HE\231\243\251IUW\203\212\224x\205\210sz\205x\205"
+ "\210/7>,??\203\16""4$\17\30:,\2\24\12\203\212\224_mp\213\222\233TY_\231\243"
+ "\251TY_x\205\210\203\212\224Teg\225\257:\241\272*\261\305&\301\325.\202\306"
+ "\340*\1\315\345*\262\315\351.\15\340\351v\345\361\223\226\231\212\217\217"
+ "\222\235\234\237\252\252\254\275\275\276\314\314\315\331\331\331\343\342"
+ "\345\351\351\355\361\361\361\365\365\371\203\371\371\375\27\365\365\371\361"
+ "\361\365\365\361\371\365\365\371\365\365\375\371\371\371\361\361\365\351"
+ "\351\355\365\365\371\376\376\376\371\371\375\365\365\375\371\371\375\375"
+ "\375\375\351\351\361\325\325\335\341\341\351\355\355\365\355\355\361\333"
+ "\333\341\313\313\323\351\351\361\376\376\376\203\375\375\375\12\376\376\376"
+ "\371\371\375\325\325\335\263\265\303\303\303\313\313\313\323\275\275\312"
+ "\273\273\304\341\341\351\376\376\376\204\375\375\375\4\376\376\376\371\371"
+ "\375\333\333\341\313\313\323\202\325\325\335\2\331\331\335\355\351\355\203"
+ "\376\376\376\27\371\371\371\355\355\361\254\254\262\206\207\212\31\34\32"
+ "\0\0\0\3\3\3\243\242\244\311\311\311\323\323\324\206\207\212fgfDEJ\0\0\0"
+ "\16\20\16iku\216\225{z\214^\226\244b\241\252v\243\242\244\263\265\303\311"
+ "\301\310\202\261\261\264\13\324\343\223\325\347`\271\326B\320\350R\305\345"
+ "*m\216\33fgf\206\207\212\227\227\232\265\265\265\314\314\315\202\335\335"
+ "\335\4\331\331\331\314\314\315\262\270\222\310\325t\202\257\3232\4\225\257"
+ ":\271\271\272\335\335\335\361\361\361\202\371\371\375\1\375\375\375\203\371"
+ "\371\375?\375\375\375\361\361\365\331\331\335\313\313\323\325\325\335\361"
+ "\361\365\376\376\376\365\365\371\341\341\351\345\345\355\355\355\365\335"
+ "\335\345\332\325\341\365\365\371\376\376\376\371\371\375\351\351\361\355"
+ "\351\361\371\371\375\376\376\376\351\351\355\313\313\323\341\341\351\371"
+ "\371\375\365\365\371\325\325\335\313\313\323\355\355\361\376\376\376\371"
+ "\371\375\371\371\371\365\365\365\355\355\361\313\313\323\264\264\272\275"
+ "\275\276\271\271\272\243\242\244\201\221\33\241\272*\265\321&\276\334,\307"
+ "\3330\311\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315"
+ "\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315"
+ "\351.\315\345*\315\351.\315\345*\315\351.\202\315\345*'\325\3507\264\277"
+ "qrqy9;I\"#$\203\212\224\333\334\352\0\0\0sz\205\252\261\276\246\253\221\321"
+ "\345.\321\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315"
+ "\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315"
+ "\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315"
+ "\345*\315\351.\315\345*\315\351.\202\315\345*\202\311\345*\1\263\315A\202"
+ "\345\361\223\11\340\351vm\204>\205\234G\246\277?\301\325.\276\334,\301\325"
+ ".\306\340*\276\334,\203\306\340*\202\311\345*\202\315\345*\3\315\351.\315"
+ "\345*\315\351.\202\315\345*\202\311\345*\203\306\340*\6\271\326B\251\300"
+ "X\226\244b\216\225{Tegx\205\210\202_mp\17\206\207\212IUW\213\222\233IUWs"
+ "z\205x\205\2103HE\231\243\251Tegsz\205_mp<QN\243\245\264Teg\213\222\233\202"
+ "sz\205\4ix{\35""23\21*$\10\26\31\203\16""4$\203\30:,\202\16""4$A\275\275"
+ "\312IUW\203\212\224ix{IUW\222\230\242IUW\227\227\232z\214^\235\262\"\245"
+ "\304\37\265\321&\301\325.\276\334,\306\340*\311\345*\315\351.\315\345*\315"
+ "\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315"
+ "\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315"
+ "\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315"
+ "\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315"
+ "\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315"
+ "\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\202\345\361\223"
+ "\202\217\217\222\12\243\242\244\252\252\254\275\275\276\314\314\315\323\323"
+ "\331\343\342\345\355\355\361\361\361\361\365\365\371\371\371\371\202\371"
+ "\371\375\12\365\365\371\361\361\365\365\361\371\365\365\371\365\365\375\365"
+ "\365\371\355\355\365\355\351\361\365\365\371\375\375\375\202\365\365\371"
+ "\13\371\371\375\375\375\375\351\351\355\325\325\335\341\341\351\361\361\365"
+ "\355\351\361\325\325\341\315\315\331\361\361\365\376\376\376\203\375\375"
+ "\375\12\376\376\376\371\371\375\315\315\331\273\273\304\305\304\321\312\305"
+ "\321\273\273\304\275\275\312\351\351\355\376\376\376\204\375\375\375\4\376"
+ "\376\376\371\371\375\325\325\335\315\315\331\202\325\325\335\2\335\335\345"
+ "\361\361\365\202\376\376\376\26\375\375\375\371\371\375\365\365\365\355\355"
+ "\355\235\234\237\200\200\205\"#$\0\0\0\5\10\15\227\227\232\314\314\315\323"
+ "\323\324\235\234\237\206\207\212\200\200\205-,-\21\20\27_`l\200\200\205\203"
+ "\212\224\261\261\264\313\315\253\202\263\264\244\33\324\343\223\325\347`"
+ "\271\326B\277\334=\275\341&}\243\25m\204>\237\243\221\252\252\254\265\265"
+ "\265\302\302\304\323\323\324\341\341\341\355\355\355\355\355\361\350\350"
+ "\304\340\351v\277\334=\245\304\37\250\3051\271\326B\225\257:\271\271\272"
+ "\335\335\335\361\361\361\371\371\371\371\371\375\202\375\375\375\202\371"
+ "\371\375\27\375\375\375\371\371\375\341\341\351\313\313\323\323\323\331\355"
+ "\355\361\376\376\376\371\371\371\345\345\355\351\351\361\361\361\365\345"
+ "\345\355\333\333\341\361\361\365\376\376\376\375\375\375\355\355\365\355"
+ "\351\361\371\371\375\376\376\376\355\355\361\313\313\323\341\341\351\202"
+ "\371\371\375\20\335\335\345\312\305\321\351\351\355\376\376\376\375\375\375"
+ "\371\371\371\365\365\365\355\355\361\323\323\331\264\264\272\275\275\276"
+ "\271\271\272\243\242\244\201\221\33\241\272*\265\321&\202\276\334,\226\311"
+ "\345*\202\311\342/\11\304\3428\310\325t\264\277q\227\227\232sz\205\213\222"
+ "\233sz\205_`l\325\347`\202\310\325t\4\302\335M\277\334=\311\345*\304\342"
+ "8\230\311\345*\16\306\340*\276\334,UlF\226\244b\320\210\2129;I\33#,\35""2"
+ "3,??UlF\205\234G\225\257:\261\305&\265\321&\203\276\334,\204\306\340*\204"
+ "\311\345*\202\306\340*\15\301\325.\302\335M\241\252vz\214^x\205\210Tegx\205"
+ "\210_mpTeg\213\222\233TY_\213\222\233IUW\202x\205\210\11<QN\203\212\224I"
+ "UW\203\212\224TegTY_\231\243\251_mp\243\245\264\202_mp\6<QN\21*$\16""4$\6"
+ ")\30\10\26\31\2\24\12\202\34?0\205\30:,\10\34?0\2\24\12\222\230\242ix{x\205"
+ "\210IUW\254\254\262TY_\202ix{\6_mp\225\257:\241\272*\261\305&\265\321&\276"
+ "\334,\202\306\340*\261\311\345*\12\340\351v\345\361\223\206\207\212\217\217"
+ "\222\235\234\237\252\252\254\275\275\276\314\314\315\323\323\331\341\341"
+ "\341\202\355\355\361\2\365\365\365\365\365\371\202\371\371\375\1\365\365"
+ "\371\202\361\361\365\203\365\365\371\15\355\355\365\355\355\361\371\371\375"
+ "\375\375\375\365\365\371\365\361\371\371\371\375\375\375\375\351\351\361"
+ "\331\331\335\345\345\355\361\361\365\351\351\361\202\325\325\335\2\365\365"
+ "\371\376\376\376\203\375\375\375\12\376\376\376\371\371\371\315\315\331\273"
+ "\273\304\305\304\321\312\305\321\273\273\304\303\303\313\361\361\365\376"
+ "\376\376\204\375\375\375\4\376\376\376\365\365\371\325\325\335\315\315\331"
+ "\202\325\325\335\2\343\342\345\371\371\371\202\376\376\376\202\375\375\375"
+ "\20\375\375\371\365\365\365\351\351\351\227\227\232rqy:::\0\0\0\3\3\3rqy"
+ "\311\311\311\323\323\324\311\311\311\252\252\254\206\207\212_`l\226\244b"
+ "\203\302\312\225\23\310\325t\320\350R\302\335M\301\325.\257\3232\247\326"
+ "\31\217\265\23m\204>\237\243\221\305\304\321\261\261\264\271\271\272\314"
+ "\314\315\335\335\335\343\342\345\351\351\351\350\350\304\340\351v\271\326"
+ "B\202\241\272*\202\250\3051\7\257\3232\222\247#\265\265\265\335\335\335\361"
+ "\361\365\371\371\371\371\371\375\202\375\375\375\12\371\371\375\371\371\371"
+ "\375\375\375\371\371\375\351\351\355\323\323\331\325\325\335\355\351\361"
+ "\376\376\376\371\371\375\202\351\351\361\31\361\361\365\351\351\361\333\333"
+ "\341\355\355\361\376\376\376\375\375\375\361\361\365\355\351\361\371\371"
+ "\375\376\376\376\361\361\365\315\315\331\341\341\351\371\371\375\375\375"
+ "\375\345\345\355\313\313\323\345\341\351\376\376\376\375\375\375\371\371"
+ "\371\365\365\365\361\361\361\323\323\331\264\264\272\202\271\271\272\4\243"
+ "\242\244\201\221\33\241\272*\265\321&\202\276\334,\232\311\345*\14\306\340"
+ "*\302\335M\213\222\233sz\205\273\265\277_`l01?TY_\227\227\232TY_IUW.1:\202"
+ "IUW\3\226\244b\310\325t\304\3428\222\311\345*\10\305\345*\306\340*\275\341"
+ "&\226\244b\30:,\33#,\5\10\15\22\35!\202.1:\1&*4\202\33#,\6,?\077<QNm\204>\225"
+ "\257:\261\305&\265\321&\202\271\334#\1\276\334,\203\306\340*\16\302\342&"
+ "\306\340*\276\334,\241\252vix{x\205\210<QN\203\212\224ix{_mpx\205\210TY_"
+ "\213\222\233<QN\202x\205\210\15IUW\203\212\224<QN\222\230\242Teg_mp\222\230"
+ "\242_mp\231\243\251TY_Teg\35""23\6)\30\202\16""4$\202\30:,\4\2\24\12!983"
+ "HE\16""4$\207\30:,\202\16""4$\20\252\261\276TY_x\205\210_mpiku\231\243\251"
+ "<QN\206\207\212z\214^\235\262\"\245\304\37\261\305&\265\321&\276\334,\306"
+ "\340*\305\345*\260\311\345*\202\345\361\223\10\200\200\205\217\217\222\243"
+ "\242\244\252\252\254\275\275\276\314\314\315\323\323\331\343\342\345\202"
+ "\355\355\361\202\365\365\371\2\371\371\371\371\371\375\202\365\365\371\1"
+ "\365\361\371\203\365\365\371\2\361\361\365\355\355\365\202\371\371\375\202"
+ "\361\361\365\7\371\371\375\375\375\375\351\351\361\333\333\341\345\345\355"
+ "\361\361\365\351\351\361\202\325\325\335\2\371\371\371\376\376\376\203\375"
+ "\375\375\12\376\376\376\371\371\371\315\315\331\273\273\304\312\305\321\305"
+ "\304\321\273\273\304\312\305\321\365\365\371\376\376\376\204\375\375\375"
+ "\2\376\376\376\361\361\365\202\323\323\331\202\325\325\335\2\345\345\351"
+ "\371\371\375\202\376\376\376\203\375\375\375\6\375\375\371\365\365\365\343"
+ "\342\345\217\217\222fgfTY_\202\0\0\0\2-,-\235\234\237\203\302\302\304\26"
+ "\254\254\262\251\300X\325\3507\304\3428\277\334=\276\334,\257\3232\245\304"
+ "\37\241\272*\225\257:\216\225{\251\244\260\305\304\321\273\265\277\261\261"
+ "\264\302\302\304\314\314\315\341\341\341\355\355\335\345\361\223\325\347"
+ "`\263\315A\202\241\272*\204\250\3051\7\257\3232\201\234$\264\264\272\335"
+ "\331\335\361\361\361\371\371\371\371\371\375\202\375\375\375\5\371\371\375"
+ "\371\371\371\371\371\375\375\375\375\355\355\361\202\325\325\335\3\351\351"
+ "\361\375\375\375\371\371\375\202\355\351\361\22\361\361\365\355\355\365\341"
+ "\341\351\355\355\361\376\376\376\375\375\375\361\361\371\355\355\365\371"
+ "\371\375\376\376\376\365\361\371\323\323\331\341\341\351\371\371\375\376"
+ "\376\376\351\351\361\313\313\323\341\341\351\202\375\375\375\13\371\371\371"
+ "\365\365\365\361\361\361\323\323\331\264\264\272\275\275\276\271\271\272"
+ "\243\242\244\201\221\33\241\272*\265\321&\202\276\334,\231\305\345*\6\302"
+ "\335M\265\265\265_`l\33#,iku\265\265\265\203\375\367\375\13\362\350\354\375"
+ "\367\375\313\304\315rqy\3\3\3\33#,\213\222\233TY_\203\212\224\241\252v\302"
+ "\335M\220\305\345*\7\306\340*\302\342&\271\326B<QN\35""23.1:*2:\202/7>\2"
+ "*2:.1:\202*2:\1*16\202&*4\5*69<QNm\204>\225\257:\250\3051\202\265\321&\15"
+ "\271\334#\276\334,\271\334#\276\334,\251\300XIUW\213\222\233ix{_mpx\205\210"
+ "TY_\231\243\251<QN\202sz\205\11IUWx\205\2103HE\231\243\251Teg_mp\213\222"
+ "\233sz\205\203\212\224\202<QN\2\21*$\6)\30\202\16""4$\1\34?0\202\30""3)\6"
+ "\22\35!\21*$\257\255\267x\205\210\222\230\242\6)\30\207\30:,\2\34?0\2\24"
+ "\12\202sz\205\17\222\230\242<QN\203\212\224IUW\203\212\224ix{Teg\205\234"
+ "G\235\262\"\245\304\37\265\321&\271\334#\276\334,\302\342&\306\340*\257\305"
+ "\345*\202\345\361\223\12\200\200\205\227\227\232\243\242\244\252\252\254"
+ "\275\275\276\311\311\311\323\323\331\343\342\345\355\355\355\355\355\361"
+ "\203\365\365\371\3\371\371\375\365\365\371\365\365\365\202\361\361\365\4"
+ "\365\365\371\365\361\371\355\355\361\361\361\365\202\371\371\375\202\355"
+ "\355\365\13\365\365\371\375\375\375\355\351\361\333\333\341\345\345\355\361"
+ "\361\365\351\351\355\325\325\335\333\333\341\371\371\375\376\376\376\203"
+ "\375\375\375\12\376\376\376\371\371\371\315\315\331\275\275\312\305\304\321"
+ "\312\305\321\275\275\312\315\315\331\371\371\375\376\376\376\204\375\375"
+ "\375\10\376\376\376\361\361\365\325\325\335\323\323\331\325\325\335\331\331"
+ "\335\351\351\355\371\371\375\202\376\376\376\203\375\375\375\10\376\376\376"
+ "\375\375\375\361\361\361\335\335\335\254\254\262rqyz{|-,-\202\0\0\0\5-,-"
+ "fgf\244\244\252\271\271\272\216\225{\202\205\234G\202\226\244b\5\246\253"
+ "\221\252\252\254\264\264\272\275\275\312\312\305\321\202\275\275\276\7\302"
+ "\302\304\314\314\315\327\330\306\324\343\223\340\351v\271\326B\246\277?\202"
+ "\241\272*\203\250\3051\12\241\272*\250\3051\241\272*\257\3232\201\234$\271"
+ "\271\272\335\331\335\361\361\365\371\371\375\371\371\371\203\375\375\375"
+ "\1\365\365\371\202\371\371\375\6\361\361\365\333\333\341\325\325\335\351"
+ "\351\361\375\375\375\371\371\375\202\355\355\365\4\361\361\371\355\355\365"
+ "\345\341\351\351\351\361\202\375\375\375\14\365\365\371\355\355\365\371\371"
+ "\371\376\376\376\365\365\371\321\320\336\341\341\351\371\371\375\376\376"
+ "\376\355\355\365\315\315\331\335\335\345\202\371\371\375\15\371\371\371\365"
+ "\365\365\361\361\361\325\325\335\264\264\272\275\275\276\271\271\272\243"
+ "\242\244\201\221\33\235\262\"\265\321&\276\334,\271\334#\227\302\342&\4\306"
+ "\340*\241\252v\217\217\222_`l\202\375\367\375\22\362\350\354\233\233\250"
+ "TY_rqysz\205iku_`l\203\212\224sz\205\213\222\233rqyIUW\263\265\303\375\367"
+ "\375\321\320\336rqy\216\225{\302\335M\216\302\342&\6\275\341&\301\325.z\214"
+ "^\16""4$.1:*16\202*2:\3\"#$\30)$*16\203*2:\203*16\202&*4\6*2:3HEUlF\205\234"
+ "G\225\257:\261\305&\202\265\321&\23\257\3232IUW\213\222\233Teg\243\245\264"
+ "<QN_mpsz\205_mp\203\212\2243HE\222\230\242_mp\203\212\224sz\205_`lix{!98"
+ "#C5\202\6)\30\1\16""4$\203\6)\30\12\34?0\30""3)\22\35!\30""3)\21*$\30)$T"
+ "eg\10\26\31\6)\30\21*$\205\30:,\24\16""4$\6)\30\34?0\5\10\15\21*$\252\261"
+ "\276<QN\206\207\212Tegix{\222\230\242TY_\213\222\233UlF\235\262\"\245\304"
+ "\37\261\305&\265\321&\271\334#\275\341\"\260\302\342&\202\345\361\223\10"
+ "z{|\217\217\222\243\242\244\252\252\254\275\275\276\311\311\311\323\323\324"
+ "\343\342\345\202\355\355\361\1\361\361\365\205\365\365\371\203\361\361\365"
+ "\22\365\361\371\355\355\365\361\361\365\371\371\375\365\365\371\355\355\361"
+ "\355\351\361\365\365\371\375\375\375\355\355\361\335\335\345\345\345\355"
+ "\361\361\365\345\345\355\325\325\335\335\335\345\371\371\375\376\376\376"
+ "\203\375\375\375\10\376\376\376\371\371\371\315\315\331\275\275\312\312\305"
+ "\321\305\304\321\275\275\312\323\323\331\206\375\375\375\10\376\376\376\361"
+ "\361\365\325\325\335\323\323\331\325\325\335\333\333\341\355\355\361\375"
+ "\375\375\202\376\376\376\203\375\375\375\202\376\376\376\10\365\365\371\351"
+ "\351\355\335\335\335\314\314\315\235\234\237\227\227\232z{|DEJ\203\3\3\3"
+ "\21""103rqy\200\200\205\217\217\222\233\233\250\257\255\267\275\275\276\302"
+ "\302\304\275\275\276\271\271\272\275\275\276\302\302\304\313\315\253\324"
+ "\343\223\325\347`\271\326B\246\277?\202\235\262\"\211\241\272*\5\257\323"
+ "2\201\234$\271\271\272\335\331\335\361\361\361\202\371\371\371\203\375\375"
+ "\375\12\371\371\375\365\365\371\371\371\375\365\365\371\335\335\345\333\333"
+ "\341\351\351\361\375\375\375\371\371\375\361\361\365\202\355\355\365\3\361"
+ "\361\365\345\345\355\351\351\361\202\375\375\375\34\365\365\375\355\355\365"
+ "\371\371\375\376\376\376\365\365\371\325\325\341\345\345\355\371\371\375"
+ "\376\376\376\361\361\371\323\323\331\333\333\341\371\371\375\375\375\375"
+ "\371\371\371\365\365\365\361\361\361\331\331\331\264\264\272\275\275\276"
+ "\271\271\272\243\242\244\201\221\33\245\304\37\265\321&\271\334#\276\334"
+ ",\302\342&\224\301\341\"\34\307\3330\251\300XDEJ9;I\375\375\371\375\367\375"
+ "\203\212\224iku\222\230\242\233\233\250\263\265\303\233\233\250\243\245\264"
+ "\200\200\205\203\212\224\222\230\242\203\212\224\233\233\250\200\200\205"
+ "rqyIUW9;I\273\265\277\375\367\375\305\305\331\203\212\224\264\277q\307\333"
+ "0\213\301\341\"\202\271\334#\4\251\300X\30:,*2:.1:\202*2:\4&*4\30)$\"*,-"
+ ",-\205*2:\2*16*2:\202*16\20&*4\"*,\35""23,??UlFm\204>\222\247#\245\304\37"
+ "\205\234GIUWix{sz\205_mp\213\222\233<QN\213\222\233\202ix{\6sz\205_`lIUW"
+ "\21*$\30:,\6)\30\202\16""4$\23\34?0\16""4$#C5<QN\213\222\233x\205\210\2\24"
+ "\12\21\20\27\21*$\34?0\30""3)\21*$\16""4$\10\26\31\3\3\3\6)\30\30:,\16""4"
+ "$\30:,\202\16""4$\25<QN_mp\5\10\15\22\35!\0\0\0ix{_mp\203\212\224_mp\222"
+ "\230\242<QN\213\222\233sz\205ix{\205\234G\235\262\"\245\304\37\261\305&\265"
+ "\321&\271\334#\275\341\"\256\301\341\"\1\275\341\"\202\345\361\223\10\200"
+ "\200\205\227\227\232\243\242\244\252\252\254\275\275\276\311\311\311\323"
+ "\323\324\343\342\345\202\355\355\355\2\361\361\365\365\365\365\204\365\365"
+ "\371\1\365\361\371\204\361\361\365\20\365\361\371\371\371\375\365\365\371"
+ "\351\351\361\351\351\355\365\361\371\375\375\375\355\355\365\335\335\345"
+ "\345\345\355\361\361\365\345\345\355\325\325\335\341\341\351\371\371\375"
+ "\376\376\376\203\375\375\375\10\376\376\376\371\371\375\323\323\331\275\275"
+ "\312\313\313\323\305\304\321\275\275\312\325\325\335\206\375\375\375\2\376"
+ "\376\376\361\361\365\202\325\325\335\4\331\331\335\333\333\341\355\355\361"
+ "\375\375\375\202\376\376\376\202\375\375\375\203\376\376\376\17\371\371\371"
+ "\355\355\361\355\351\355\343\342\345\335\335\335\314\314\315\261\261\264"
+ "\227\227\232\200\200\205fgfIUW.1:\216\225{\271\271\272\264\264\272\202\265"
+ "\265\265\202\313\315\253\11\324\343\223\310\325t\302\335M\271\326B\250\305"
+ "1\241\272*\235\262\"\222\247#\235\262\"\213\241\272*\5\250\3051\201\234$"
+ "\264\264\272\335\331\335\361\361\365\202\371\371\371\203\375\375\375\11\371"
+ "\371\375\365\365\371\371\371\375\365\365\371\341\341\351\335\335\345\355"
+ "\355\361\375\375\375\371\371\375\202\361\361\365\202\355\355\365\202\351"
+ "\351\361\33\371\371\375\375\375\375\365\365\375\361\361\365\371\371\375\376"
+ "\376\376\365\365\371\325\325\341\345\345\355\375\375\375\376\376\376\365"
+ "\365\371\325\325\341\333\333\341\371\371\375\375\375\375\371\371\371\365"
+ "\365\365\361\361\361\325\325\335\264\264\272\275\275\276\271\271\272\243"
+ "\242\244\201\221\33\235\262\"\265\321&\202\276\334,\224\275\341&\5\277\334"
+ "=fgf\22\35!_`l\375\367\375\202sz\205\15\243\245\264\251\244\260\203\212\224"
+ "rqyTY_rqy\200\200\205\213\222\233\217\217\222sz\205\200\200\205rqy\200\200"
+ "\205\203\213\222\233\7_`lDEJ\251\244\260\365\361\371\222\230\242\226\231"
+ "\212\304\3428\212\275\341&\5\271\334#\263\315A<QN\35""23.1:\203*2:\4.6:*"
+ "16&*4*16\204*2:\1*16\205*2:\202.1:\22&*4\"*,*16#C5<QNUlF#C5\252\261\276<"
+ "QN\233\233\250sz\205Tegsz\205IUW\252\261\276\16""4$\6)\30\16""4$\202\30:"
+ ",\2\34?0\30:,\202\30""3)\3\10\26\31""3HE\252\261\276\2023HE\3\21*$\30)$\22"
+ "\35!\202\6)\30\2\10\26\31\16""4$\202<QN\11\263\265\303\30""3)\34?0\30""3"
+ ")\22\35!\6)\30<QN\277\313\327\22\35!\202\16""4$\4!98\252\261\276<QN\213\222"
+ "\233\202ix{\7x\205\2103HE\243\245\264UlF\217\265\23\235\262\"\245\304\37"
+ "\202\265\321&\1\271\334#\256\275\341&\16\275\341\"\324\343\223\345\361\223"
+ "z{|\217\217\222\235\234\237\252\252\254\271\271\272\303\303\313\323\323\324"
+ "\343\342\345\355\351\355\355\355\361\361\361\365\203\365\365\371\2\365\361"
+ "\371\365\365\371\205\361\361\365\3\365\365\365\371\371\375\365\365\371\202"
+ "\351\351\355\13\361\361\365\375\375\375\355\355\365\341\341\351\345\345\355"
+ "\361\361\365\345\345\355\325\325\341\345\341\351\371\371\375\376\376\376"
+ "\203\375\375\375\10\376\376\376\371\371\375\323\323\331\303\303\313\313\313"
+ "\323\305\304\321\275\275\312\331\331\335\206\375\375\375\4\376\376\376\365"
+ "\365\371\331\331\335\325\325\335\202\333\333\341\2\361\361\365\375\375\375"
+ "\203\376\376\376\1\375\375\375\203\376\376\376\3\371\371\371\361\361\365"
+ "\361\361\361\202\355\355\361\11\351\351\351\335\335\335\314\314\315\261\261"
+ "\264\217\217\222z{|iku\251\300X\302\335M\202\271\326B\3\263\315A\250\305"
+ "1\241\272*\202\235\262\"\202\222\247#\3\217\276$\235\262\"\217\276$\202\241"
+ "\272*\1\217\276$\212\241\272*\7\250\3051\201\234$\271\271\272\335\335\335"
+ "\361\361\361\365\365\371\371\371\371\203\375\375\375\13\371\371\375\365\365"
+ "\371\371\371\375\365\365\375\345\345\355\343\342\345\355\355\365\375\375"
+ "\375\371\371\375\365\361\371\361\361\371\202\355\355\365\202\355\351\361"
+ "\36\371\371\375\375\375\375\371\371\375\365\361\371\371\371\375\376\376\376"
+ "\365\365\371\333\333\341\351\351\361\375\375\375\376\376\376\365\365\371"
+ "\325\325\341\333\333\341\371\371\375\375\375\375\371\371\371\365\365\365"
+ "\361\361\361\325\325\335\264\264\272\302\302\304\271\271\272\243\242\244"
+ "\201\221\33\217\276$\265\321&\271\334#\276\334,\275\341&\222\275\341\"\13"
+ "\271\326B_`liku\0\0\0\233\233\250\213\222\233\257\255\267\203\212\224sz\205"
+ "iku\200\200\205\202\252\261\276\23\301\351\375\321\320\336\275\275\312\311"
+ "\307\331\273\265\277\305\304\321\273\273\304\243\245\264DEJ\217\217\222r"
+ "qy\213\222\233\222\230\242_`lrqy\357\345\361\252\261\276\200\200\205\302"
+ "\335M\210\275\341\"\6\271\334#\265\321&z\214^\30:,*2:*16\202*2:\202*16\222"
+ "*2:\1&*4\202*16\202#C5\5,N<x\205\2103HE\243\245\264TY_\202sz\205\2_mp\6)"
+ "\30\202\34?0\1\30:,\202\30)$\10\30""3)\30:,\30)$\21*$\16""4$\2\24\12\10\26"
+ "\31\6)\30\202\30""3)\35\22\35!Teg_mp\2\24\12Teg\231\243\251Teg_mp\231\243"
+ "\251<QN\2\24\12\30""3)\2\24\12\222\230\242_mp\6)\30\34?0\6)\30\213\222\233"
+ "ix{sz\2053HE\264\264\272IUWx\205\210_mpix{\205\234G\235\262\"\202\245\304"
+ "\37\3\263\333\36\265\321&\271\334#\255\275\341\"\1\275\341&\202\345\361\223"
+ "\10z{|\227\227\232\243\242\244\252\252\254\271\271\272\303\303\313\323\323"
+ "\324\343\342\345\202\351\351\355\202\361\361\365\202\365\365\371\3\361\361"
+ "\365\365\365\371\361\361\365\202\355\355\361\202\361\361\365\3\365\365\371"
+ "\371\371\375\361\361\365\202\345\345\355\11\355\355\365\375\375\375\361\361"
+ "\365\341\341\351\345\345\355\355\355\365\345\345\355\331\331\335\345\345"
+ "\355\205\375\375\375\4\376\376\376\371\371\375\325\325\335\305\304\321\202"
+ "\312\305\321\2\303\303\313\335\335\345\206\375\375\375\7\376\376\376\365"
+ "\365\371\333\333\341\331\331\335\333\333\341\335\335\345\361\361\365\210"
+ "\376\376\376\15\371\371\375\361\361\365\361\361\361\361\361\365\365\365\371"
+ "\371\371\371\361\361\365\351\351\351\335\335\335\323\323\324\314\314\315"
+ "\311\301\310\226\244b\203}\243\25\204\217\265\23\2\235\262\"\217\276$\205"
+ "\235\262\"\7\217\276$\241\272*\235\262\"\217\276$\241\272*\231\311'\241\272"
+ "*\202\250\3051\12\257\3232\250\3051\257\3232\276\334,\201\234$\271\271\272"
+ "\335\331\335\361\361\361\365\365\371\371\371\371\203\375\375\375\14\371\371"
+ "\375\365\365\371\371\371\371\371\371\375\351\351\355\345\345\351\361\361"
+ "\365\375\375\375\371\371\375\365\361\371\361\361\371\355\355\361\203\355"
+ "\355\365\33\371\371\375\375\375\375\371\371\375\365\365\371\371\371\375\376"
+ "\376\376\365\365\371\335\335\345\355\355\361\375\375\375\376\376\376\365"
+ "\365\375\335\335\345\333\333\341\371\371\375\375\375\375\371\371\371\365"
+ "\365\365\361\361\361\325\325\335\273\265\277\302\302\304\271\271\272\243"
+ "\242\244\201\221\33\235\262\"\265\321&\202\276\334,\1\275\341&\210\275\341"
+ "\"\4\277\334=\216\225{\263\315A\275\341&\205\275\341\"#\302\335Miku\375\367"
+ "\375\0\0\0\213\222\233\233\233\250\213\222\233iku\203\212\224\233\233\250"
+ "\275\275\312\311\307\331\320\210\212\200\200\205\322H<\320\210\212\345\340"
+ "\355\332\325\341\342\333\342\321\320\336\365\361\371\341\330\336\345\340"
+ "\355\305\304\321\257\255\267\200\200\205\233\233\250\251\244\260\213\222"
+ "\2339;I\332\325\341\315\315\331z{|\277\334=\275\341&\205\275\341\"\202\271"
+ "\334#\12\263\315A,N<\35""23.1:*2:*16*2:.6:*2:.6:\204*2:\1.1:\202*2:\1.6:"
+ "\204*2:\1*16\204*2:\202.6:\16*16.1:&*4*16\21*$#C5Teg\34?0\213\222\2333HE"
+ "\263\265\303\30)$\16""4$\34?0\202\30""3)\205\30:,\202\21*$\2\30""3)ix{\202"
+ "\6)\30\20\277\313\327<QN\235\234\237IUW_mpix{IUW\222\230\242IUW\222\230\242"
+ "\6)\30\21*$\30:,\6)\30\10\26\31\30""3)\202\21*$\17\10\26\31\273\273\304<"
+ "QN\243\242\244Tegrqy\213\222\233TY_\213\222\233fgf\217\265\23\235\262\"\245"
+ "\304\37\265\321&\263\333\36\202\271\334#\255\275\341\"\14\324\343\223\345"
+ "\361\223\200\200\205\217\217\222\235\234\237\252\252\254\265\265\265\302"
+ "\302\304\313\313\323\343\342\345\345\345\351\351\351\355\203\361\361\365"
+ "\4\365\365\371\361\361\365\365\365\371\365\361\371\202\355\355\361\22\355"
+ "\355\365\361\361\365\365\365\371\371\371\375\361\361\365\345\345\355\345"
+ "\345\351\355\351\361\371\371\375\365\361\371\345\341\351\351\351\355\355"
+ "\355\365\345\345\355\333\333\341\351\351\355\375\375\375\371\371\375\204"
+ "\375\375\375\7\371\371\375\333\333\341\305\304\321\313\313\323\312\305\321"
+ "\305\304\321\335\335\345\206\375\375\375\7\376\376\376\371\371\375\335\335"
+ "\345\331\331\335\333\333\341\335\335\345\361\361\365\210\376\376\376\1\371"
+ "\371\375\202\361\361\365\12\361\361\361\371\371\371\376\376\376\375\375\375"
+ "\365\365\371\355\355\361\351\351\351\343\342\345\341\341\341\251\300X\205"
+ "\217\265\23\1\222\247#\215\217\265\23\210}\243\25\6m\216\33\271\271\272\335"
+ "\335\335\361\361\361\365\365\371\371\371\371\203\375\375\375\7\371\371\371"
+ "\365\365\371\371\371\371\371\371\375\355\355\361\351\351\355\365\365\371"
+ "\202\371\371\375\3\365\365\371\365\361\371\355\351\361\203\355\355\365\14"
+ "\371\371\375\375\375\375\371\371\375\365\365\375\371\371\375\376\376\376"
+ "\365\365\371\335\335\345\355\355\365\375\375\375\376\376\376\371\371\371"
+ "\202\335\335\345\20\371\371\375\375\375\375\371\371\371\365\365\365\361\361"
+ "\361\323\323\331\273\265\277\302\302\304\271\271\272\243\242\244\201\221"
+ "\33\235\262\"\257\3232\271\334#\276\334,\275\341&\207\275\341\"\6\275\341"
+ "&rqyikusz\205\216\225{\302\335M\202\275\341\"\5\271\334#\302\335Miku\371"
+ "\371\375\3\3\3\202\233\233\250\36\203\212\224rqy\251\244\260\273\265\277"
+ "\322\314\324\333\361\375\322H<\341\275\304\223\32\26\375\366\371\320\210"
+ "\212\341\275\304\333\333\341\334\325\335\357\345\361\227\227\23201?\365\357"
+ "\365\341\330\336\345\340\355\311\301\310\233\233\250\200\200\205\257\255"
+ "\267\233\233\2509;I\273\265\277\321\320\336iku\277\334=\204\275\341\"\202"
+ "\271\334#\5\257\3232UlF\30""3).1:*16\205*2:\1.6:\203*2:\1*16\203*2:\1.1:"
+ "\203*2:\1.6:\202*2:\1.1:\203*2:\1.1:\204*2:\4.1:&*4\33#,*16\202\30:,\6x\205"
+ "\210IUW\16""4$\34?0\30""3)\21*$\205\30:,\5\2\24\12\222\230\242ix{\252\261"
+ "\276\34?0\202ix{\12sz\205ix{IUW\231\243\251IUW\213\222\233ix{\203\212\224"
+ "\2\24\12\6)\30\202\30""3)\1\30:,\203\22\35!\15\21*$\3\3\3\203\212\224x\205"
+ "\210\203\212\224IUW\213\222\233IUW\213\222\233_mpix{\205\234G\217\265\23"
+ "\202\245\304\37\1\265\321&\203\271\334#\253\275\341\"\13\275\341&\340\351"
+ "v\345\361\223\200\200\205\217\217\222\243\242\244\252\252\254\265\265\265"
+ "\302\302\304\314\314\315\341\341\341\202\345\345\351\23\361\361\365\365\365"
+ "\365\361\361\365\365\365\371\361\361\365\365\365\371\361\361\371\355\355"
+ "\361\355\351\355\355\355\365\361\361\365\365\365\371\371\371\375\355\355"
+ "\365\341\341\351\345\341\351\351\351\361\371\371\375\365\365\371\202\345"
+ "\345\355\5\355\355\365\345\345\355\333\333\341\351\351\361\375\375\375\202"
+ "\371\371\375\1\376\376\376\203\375\375\375\2\335\335\345\305\304\321\202"
+ "\313\313\323\2\312\305\321\335\335\345\206\375\375\375\10\376\376\376\375"
+ "\375\375\345\341\351\333\333\341\335\335\345\343\342\345\361\361\365\375"
+ "\375\375\207\376\376\376\5\375\375\375\365\365\365\361\361\361\361\361\365"
+ "\371\371\371\202\376\376\376\6\375\375\375\365\365\371\365\365\365\361\361"
+ "\365\355\351\355\226\231\212\213\216\225{\203\226\231\212\1\237\243\221\205"
+ "\246\253\221\3\237\243\221\216\225{\226\231\212\202\216\225{\202\226\231"
+ "\212\6\237\243\221\302\302\304\341\341\341\361\361\365\365\365\365\371\371"
+ "\375\203\375\375\375\2\371\371\371\361\361\365\202\371\371\375\4\355\355"
+ "\365\355\355\361\365\365\375\371\371\375\202\365\365\371\7\361\361\371\351"
+ "\351\361\355\355\361\361\361\365\361\361\371\371\371\375\375\375\375\203"
+ "\371\371\375\7\375\375\375\361\361\365\341\341\351\361\361\371\375\375\375"
+ "\376\376\376\365\365\375\202\335\335\345\202\371\371\375\13\371\371\371\365"
+ "\365\365\361\361\361\323\323\331\273\273\304\303\303\313\271\271\272\243"
+ "\242\244m\216\33\235\262\"\265\321&\202\276\334,\202\275\341&\4\275\341\""
+ "\275\341&\275\341\"\275\341&\202\275\341\"\4\264\277q\5\10\15\0\0\0&*4\202"
+ "sz\205'\302\335M\275\341&\275\341\"sz\205\375\367\375DEJ\203\212\224\222"
+ "\230\242sz\205\213\222\233\233\233\250\325\325\341\334\325\335\335\331\335"
+ "\333\361\375\322H<\341\275\304\223\32\26\320\210\212\322H<\371\375\375\343"
+ "\342\345\342\333\342\375\367\375TY_\244\244\252rqy\362\354\362\334\325\335"
+ "\345\341\351\322\314\324\313\304\315\213\222\233\251\244\260\264\264\272"
+ "DEJ\257\255\267\275\275\312\200\200\205\202\275\341&\1\275\341\"\202\271"
+ "\334#\5\263\333\36\226\244b\30:,/7>*16\204*2:\3*16*2:.1:\202*2:\2*16.1:\202"
+ "*2:\2.6:*16\202&*4\1*16\202\22\35!\1*16\203.6:\211*2:\1*16\202.1:\2\22\35"
+ "!\34?0\203,N<\203\30""3)\7\16""4$\30""3)\16""4$<QNIUW\213\222\233Teg\202"
+ "x\205\210\14<QN\231\243\251IUWx\205\210Tegx\205\210\203\212\224IUW\213\222"
+ "\233!98\252\261\276\3\3\3\202\21*$\1\22\35!\202\30)$\202\22\35!\14\10\26"
+ "\31\263\265\303<QN\213\222\233Teg_mp\206\207\212_mp\233\233\250UlF\222\247"
+ "#\235\262\"\202\245\304\37\1\265\321&\203\271\334#)\275\341\"\275\341&\275"
+ "\341\"\275\341&\275\341\"\275\341&\275\341\"\275\341&\275\341\"\275\341&"
+ "\275\341\"\275\341&\275\341\"\275\341&\275\341\"\275\341&\275\341\"\275\341"
+ "&\275\341\"\275\341&\275\341\"\275\341&\275\341\"\275\341&\275\341\"\275"
+ "\341&\275\341\"\275\341&\275\341\"\275\341&\275\341\"\275\341&\275\341\""
+ "\275\341&\275\341\"\275\341&\275\341\"\275\341&\275\341\"\271\334#\275\341"
+ "&\202\275\341\"\12\324\343\223\345\361\223\206\207\212\217\217\222\235\234"
+ "\237\244\244\252\261\261\264\275\275\276\314\314\315\341\341\341\202\345"
+ "\345\351\1\355\355\361\202\361\361\365\13\365\365\371\361\361\365\365\365"
+ "\371\365\365\365\355\355\361\351\351\361\355\355\361\361\361\365\365\365"
+ "\371\365\365\375\355\355\365\202\341\341\351\15\345\345\355\371\371\371\365"
+ "\365\375\351\351\355\345\345\355\355\355\361\345\345\355\335\335\345\351"
+ "\351\361\371\371\375\365\365\375\371\371\375\376\376\376\203\375\375\375"
+ "\1\345\345\355\203\313\313\323\2\305\304\321\343\342\345\206\375\375\375"
+ "\10\376\376\376\375\375\375\345\345\355\333\333\341\335\335\345\343\342\345"
+ "\361\361\365\375\375\375\207\376\376\376\2\375\375\375\365\365\365\202\361"
+ "\361\365\5\365\365\371\375\375\375\376\376\376\375\375\375\371\371\371\202"
+ "\365\365\371\6\361\361\365\352\343\353\335\331\331\313\304\315\275\275\276"
+ "\273\265\277\202\264\264\272\1\271\271\272\202\273\265\277\202\275\275\276"
+ "\3\271\271\272\265\265\265\271\271\272\203\275\275\276\202\265\265\265\202"
+ "\271\271\272\3\275\275\276\271\271\272\265\265\265\203\275\275\276\6\302"
+ "\302\304\323\323\324\351\351\355\361\361\365\365\365\371\371\371\375\203"
+ "\375\375\375\2\365\365\371\361\361\365\202\371\371\375\202\361\361\365\202"
+ "\371\371\375\11\365\365\371\365\365\375\361\361\365\345\345\355\355\351\361"
+ "\361\361\371\365\361\371\371\371\375\375\375\375\202\371\371\375\202\375"
+ "\375\375\25\361\361\365\345\341\351\365\361\371\371\371\375\375\375\375\371"
+ "\371\375\335\335\345\341\341\351\375\375\375\371\371\375\371\371\371\365"
+ "\365\365\355\355\361\315\315\331\273\273\304\311\311\311\271\271\272\243"
+ "\242\244\201\221\33\241\272*\257\3232\202\276\334,\1\275\341&\207\275\341"
+ "\"\3\235\234\237\233\233\2509;I\202\0\0\0+\243\245\264\213\222\233\246\253"
+ "\221\237\243\221\305\304\321\355\351\355TY_\233\233\250\217\217\222TY_\217"
+ "\217\222\355\351\365\355\351\355\375\367\375\332\320\330\335\331\335\361"
+ "\365\371\320\210\212\254\254\262x\205\210\351\361\375\217\217\222\303\274"
+ "\304\335\331\335\352\343\353\312\305\321\303\274\304\22\35!\376\376\376\341"
+ "\330\336\334\325\335\342\333\342\362\354\362\273\273\304\257\255\267\213"
+ "\222\233\263\265\3039;I\311\307\331\213\222\233\264\277q\271\334#\275\341"
+ "\"\202\271\334#\6\263\315A,N<!98.1:*2:.1:\206*2:\1*16\203*2:\17/7>&*4\5\10"
+ "\15\22\35!*2:.6:\10\26\31rqyTY_\5\10\15\3\3\3\10\26\31&*4*16.6:\202*2:\3"
+ ".1:*2:*69\204*2:\1*16\204.1:\1,??\202,N<\5\34?0#C5\34?0\2\24\12\231\243\251"
+ "\202x\205\210\",N<\231\243\251TY_\203\212\224Teg_mp\213\222\233IUW\213\222"
+ "\233,N<x\205\210Teg_mp\233\233\250Teg\2\24\12\30""3)\21*$\21\20\27\2\24\12"
+ "\21*$\30)$\2\24\12ix{_mp\203\212\224_mp\222\230\2423HE\203\212\224ix{\203"
+ "\212\224m\204>\217\265\23\202\245\304\37\202\263\333\36\1\271\334#\254\275"
+ "\341\"\2\340\351v\345\361\223\202\206\207\212\11\235\234\237\244\244\252"
+ "\261\261\264\275\275\276\314\314\315\333\333\341\345\345\351\343\342\345"
+ "\355\355\361\202\361\361\365\2\365\361\371\355\355\361\202\365\365\371\7"
+ "\355\355\361\351\351\355\355\355\361\365\361\371\361\361\365\365\365\371"
+ "\355\355\365\202\341\341\351\15\345\345\351\365\365\371\371\371\375\351\351"
+ "\361\345\345\355\355\355\361\345\345\355\335\335\345\351\351\361\371\371"
+ "\375\365\365\375\371\371\375\376\376\376\202\375\375\375\3\376\376\376\355"
+ "\355\365\315\315\331\203\313\313\323\1\335\335\345\210\375\375\375\2\355"
+ "\355\361\335\335\345\202\343\342\345\2\355\355\365\375\375\375\210\376\376"
+ "\376\20\371\371\371\361\361\365\361\361\361\365\365\371\375\375\375\376\376"
+ "\376\375\375\375\371\371\375\365\365\371\371\371\371\365\365\365\361\361"
+ "\361\351\351\355\343\342\345\341\341\341\335\331\335\202\331\331\331\1\325"
+ "\325\335\205\331\331\331\1\331\331\335\203\335\335\335\3\331\331\331\323"
+ "\323\324\331\331\331\202\335\335\335\3\335\331\331\323\323\324\331\331\331"
+ "\202\335\335\335\3\335\331\331\335\335\335\351\351\351\202\361\361\365\1"
+ "\365\365\365\204\375\375\375\2\365\365\371\361\361\365\202\371\371\375\202"
+ "\365\365\371\1\371\371\375\202\365\365\371\6\365\365\375\355\355\365\345"
+ "\345\355\355\355\361\361\361\371\365\365\371\202\375\375\375\202\371\371"
+ "\375\202\375\375\375\3\361\361\365\345\345\355\365\365\371\202\371\371\375"
+ "\23\365\365\371\343\342\345\345\345\355\375\375\375\371\371\375\371\371\371"
+ "\365\365\365\355\355\361\322\314\324\302\302\304\311\311\311\271\271\272"
+ "\243\242\244\201\221\33\235\262\"\265\321&\276\334,\304\3428\275\341&\206"
+ "\275\341\"9\276\334,\264\277q\217\217\222\243\245\264\213\222\233_`l\3\3"
+ "\3\0\0\0\273\265\277_`l\371\371\375.1:\203\212\224\213\222\233sz\205\341"
+ "\330\336\355\351\365\362\354\362\227\227\232_`l\375\375\375\362\354\362\251"
+ "\244\260\333\334\352\332\325\341tPV\351\341\345\355\351\365\303\274\304\311"
+ "\301\310\335\331\335\362\354\362rqy\371\360\365\342\333\342\341\330\336\365"
+ "\357\365\362\350\354\313\304\315\376\376\376rqy\217\217\222\264\264\272\233"
+ "\233\250DEJ\355\351\371sz\205\271\326B\275\341\"\271\334#\263\333\36z\214"
+ "^\16""4$01?*16*2:*16\212*2:\2\"*,*69\202\261\261\264\16\206\207\212\235\234"
+ "\237\233\233\250\244\244\252\371\375\375\375\375\375\254\254\262TY_\10\26"
+ "\31\5\10\15\10\26\31.6:*2:.6:\202*2:\1.6:\202*2:\1.6:\202*2:\1.1:\202*2:"
+ "\32*16.1:\"*,\34?0#C5<QN#C5\6)\30\252\261\276!98\222\230\242Tegix{\203\212"
+ "\224<QN\213\222\233<QN\217\217\222Teg_mp\213\222\233Teg\222\230\2423HE<Q"
+ "N\2\24\12\202\30:,\12\22\35!\231\243\251\22\35!\21*$\22\35!\21*$\305\321"
+ "\327,??\227\227\232TY_\202x\205\210\10<QN\254\254\262UlF\222\247#\235\262"
+ "\"\245\304\37\261\305&\263\333\36\202\271\334#\253\275\341\"\15\340\351v"
+ "\324\343\223\216\225{\206\207\212\235\234\237\243\242\244\254\254\262\271"
+ "\271\272\311\311\311\335\331\335\345\345\351\343\342\345\355\355\361\202"
+ "\361\361\365\10\365\361\371\355\355\361\361\361\365\365\365\371\355\355\361"
+ "\351\351\355\355\355\361\365\361\371\202\365\365\371\17\355\355\365\341\341"
+ "\351\343\342\345\341\341\351\361\361\365\371\371\375\355\355\361\345\345"
+ "\355\355\351\361\351\351\355\341\341\351\351\351\361\371\371\375\365\365"
+ "\371\365\365\375\202\375\375\375\4\371\371\375\375\375\375\365\365\371\325"
+ "\325\335\202\315\315\331\3\313\313\323\335\335\345\371\371\375\206\375\375"
+ "\375\2\376\376\376\365\365\371\202\343\342\345\3\345\345\351\355\355\361"
+ "\375\375\375\210\376\376\376\2\375\375\375\365\365\365\202\361\361\365\1"
+ "\371\371\375\202\376\376\376\1\375\375\375\202\371\371\371\3\365\365\371"
+ "\365\365\365\361\361\365\203\365\365\365\2\361\361\365\361\361\361\203\355"
+ "\355\355\202\355\355\361\202\361\361\361\202\365\365\365\23\355\355\361\351"
+ "\351\351\351\351\355\361\361\361\365\365\365\361\361\365\355\355\355\351"
+ "\351\351\355\355\361\365\365\365\361\361\365\361\361\361\361\361\365\365"
+ "\365\371\371\371\371\361\361\365\365\365\371\375\375\375\371\371\375\202"
+ "\375\375\375\5\365\365\371\365\365\365\371\371\371\371\371\375\365\365\371"
+ "\202\371\371\375\202\365\365\371\4\371\371\375\355\355\361\345\341\351\355"
+ "\355\365\202\365\365\371\202\375\375\375\202\371\371\375\202\375\375\375"
+ "\30\355\355\365\351\351\361\365\365\371\365\365\375\371\371\375\365\365\371"
+ "\341\341\351\351\351\355\375\375\375\371\371\375\371\371\371\365\365\365"
+ "\355\355\361\313\313\323\303\303\313\311\311\311\271\271\272\243\242\244"
+ "\201\234$\235\262\"\257\3232\276\334,\304\3428\305\345*\207\275\341\"%\275"
+ "\341&\302\335M\246\253\221\217\217\222\203\212\224\243\245\264\22\35!sz\205"
+ "\375\375\375z{|sz\205\257\255\267z{|\275\275\312\345\341\351\0\0\0\371\360"
+ "\365\3\3\3\217\217\222\342\333\342\303\274\304\323\323\331\322\314\324\332"
+ "\320\330tPV\357\345\361\311\301\310\303\274\304\362\354\362\275\275\276\322"
+ "\314\324\375\367\375\343\342\345\342\333\342\355\351\355\235\234\237\322"
+ "\314\324\202_`l\20\375\367\375\342\333\342\213\222\233\322\314\324_`l\217"
+ "\217\222\275\275\312\216\225{\276\334,\271\334#\246\277?\34?0/7>*16*2:*1"
+ "6\202*2:\1*69\203*2:\1*16\202*2:\14*16.6:\10\26\31z{|\375\375\375IUW\275"
+ "\275\276_mp_`l\271\271\2729;I\302\302\304\203\376\376\376\4\331\331\331\200"
+ "\200\205\22\35!*16\203*2:\1*69\206*2:\1.6:\202*2:\3.1:.6:\31\34\32\202\30"
+ """3)\202,N<\7\2\24\12\3\3\3\252\261\276,N<x\205\210IUW\206\207\212\202_m"
+ "p\4x\205\210Teg\222\230\242<QN\202x\205\210\26Teg\16""4$3HE\21*$\30:,\10"
+ "\26\31\252\261\276_mp\2\24\12\30)$\2\24\12sz\205x\205\210sz\205IUW\243\245"
+ "\264<QN\244\244\252TY_\203\212\224m\204>\217\265\23\202\245\304\37\1\265"
+ "\321&\202\271\334#\252\275\341\"\13\275\341&\325\347`\345\361\223\226\231"
+ "\212\206\207\212\235\234\237\243\242\244\254\254\262\271\271\272\311\311"
+ "\311\331\331\335\202\343\342\345\1\355\355\361\202\361\361\365\7\365\365"
+ "\371\355\355\361\361\361\365\365\365\371\355\355\361\351\351\355\355\351"
+ "\361\202\361\361\365\11\365\365\371\355\355\361\341\341\351\335\335\345\341"
+ "\341\351\355\355\365\371\371\375\355\355\365\351\351\355\202\351\351\361"
+ "\5\341\341\351\351\351\355\371\375\375\365\361\371\365\365\371\202\375\375"
+ "\375\202\371\371\375\2\365\365\371\335\335\345\203\315\315\331\3\335\335"
+ "\345\371\371\375\376\376\376\205\375\375\375\7\376\376\376\371\371\371\345"
+ "\345\355\345\341\351\345\345\351\355\355\361\371\371\375\210\376\376\376"
+ "\17\375\375\375\365\365\371\361\361\361\361\361\365\371\371\371\375\375\375"
+ "\376\376\376\375\375\375\371\371\375\371\371\371\371\371\375\371\371\371"
+ "\365\365\371\371\371\371\375\375\375\203\376\376\376\205\375\375\375\202"
+ "\376\376\376\2\375\375\375\371\371\371\202\361\361\365\1\371\371\371\202"
+ "\375\375\375\1\371\371\371\202\361\361\365\4\371\371\375\376\376\376\375"
+ "\375\375\371\371\375\202\375\375\375\11\371\371\371\361\361\365\371\371\371"
+ "\375\375\375\371\371\375\375\375\375\371\371\375\361\361\365\365\365\371"
+ "\202\371\371\375\1\371\371\371\202\371\371\375\1\361\361\371\202\365\365"
+ "\371\3\351\351\355\341\341\351\355\355\365\202\365\365\371\203\375\375\375"
+ "\1\371\371\375\202\375\375\375\30\355\355\361\355\355\365\365\361\371\365"
+ "\365\371\365\365\375\361\361\371\341\341\351\355\355\361\376\376\376\371"
+ "\371\375\371\371\371\365\365\365\355\355\355\313\313\323\311\311\311\314"
+ "\314\315\271\271\272\243\242\244\201\221\33\222\247#\257\3232\276\334,\304"
+ "\3428\276\334,\202\275\341\"\5\301\341\"\275\341\"\301\341\"\275\341\"\301"
+ "\341\"\203\275\341\"\21\277\334=\271\326B\262\270\222_`l\257\255\267\365"
+ "\357\365TY_\251\244\260rqy\251\244\260\313\304\315\375\375\375\243\242\244"
+ "\217\217\222\251\244\260\217\217\222rqy\202\322\314\324\36\203\212\224\371"
+ "\363\372\203\212\224\303\303\313\341\330\336\333\333\341\342\333\342\264"
+ "\264\272\313\313\323\335\331\335\342\333\342\341\330\336\352\343\353\303"
+ "\274\304\5\10\15\375\375\375\235\234\237\312\305\321\332\320\330\303\274"
+ "\304\251\244\260\275\275\312IUW\275\275\312\203\212\224\251\300X\257\323"
+ "2UlF!98.1:\205*2:\1.6:\205*2:\1*16\202*2:\13\33#,.1:\365\365\365iku\302\302"
+ "\304_`l\376\376\376\5\10\15\376\376\376\0\0\0\314\314\315\203\376\376\376"
+ "\2\233\233\250\5\10\15\206*2:\1.1:\204*2:\2.1:.6:\202*2:\5""01?\"*,\30)$"
+ "\30""3)#C5\202\22\35!\11\243\245\264IUWx\205\210ix{<QN\231\243\251Teg\213"
+ "\222\233<QN\202x\205\210\36_mpx\205\210,N<\231\243\251_mp\222\230\242\2\24"
+ "\12\30)$\5\10\15<QN\203\212\224\5\10\15\22\35!\10\26\31\22\35!\275\275\312"
+ "<QN\231\243\251IUWx\205\210\203\212\224IUW\222\230\242UlF\222\247#\235\262"
+ "\"\245\304\37\247\326\31\263\333\36\271\334#\202\275\341\"'\301\341\"\275"
+ "\341\"\301\341\"\275\341\"\301\341\"\275\341\"\301\341\"\275\341\"\301\341"
+ "\"\275\341\"\301\341\"\275\341\"\301\341\"\275\341\"\301\341\"\275\341\""
+ "\301\341\"\275\341\"\301\341\"\275\341\"\301\341\"\275\341\"\301\341\"\275"
+ "\341\"\301\341\"\275\341\"\301\341\"\275\341\"\301\341\"\275\341\"\301\341"
+ "\"\275\341\"\301\341\"\275\341\"\301\341\"\275\341\"\301\341\"\275\341\""
+ "\301\341\"\202\275\341\"\12\325\347`\345\361\223\226\231\212\206\207\212"
+ "\227\227\232\243\242\244\252\252\254\271\271\272\303\303\313\331\331\335"
+ "\202\343\342\345\1\355\355\361\202\361\361\365\1\365\365\371\202\355\355"
+ "\361\11\365\365\371\355\355\365\345\345\355\351\351\361\365\365\365\365\361"
+ "\371\361\361\371\355\355\365\341\341\351\202\335\335\345\3\351\351\361\371"
+ "\371\375\361\361\371\203\351\351\361\7\345\341\351\351\351\361\371\371\375"
+ "\365\361\371\361\361\365\375\375\375\376\376\376\203\371\371\375\1\345\345"
+ "\351\202\323\323\331\4\315\315\331\333\333\341\365\365\371\376\376\376\205"
+ "\375\375\375\3\376\376\376\375\375\375\355\355\361\202\345\345\351\2\355"
+ "\355\361\371\371\371\211\376\376\376\5\375\375\375\365\365\365\361\361\361"
+ "\365\365\371\375\375\375\202\376\376\376\11\375\375\375\371\371\375\371\371"
+ "\371\371\371\375\371\371\371\365\365\371\371\371\371\371\371\375\375\375"
+ "\375\206\376\376\376\3\375\375\375\371\371\375\365\365\371\202\361\361\365"
+ "\4\371\371\375\375\375\375\376\376\376\371\371\375\202\361\361\365\3\365"
+ "\365\371\375\375\375\376\376\376\202\375\375\375\4\376\376\376\375\375\375"
+ "\365\365\365\361\361\365\202\375\375\375\6\371\371\375\375\375\375\371\371"
+ "\375\361\361\365\365\365\371\376\376\376\202\371\371\375\3\375\375\375\365"
+ "\365\371\361\361\365\202\365\365\371\6\345\345\355\345\341\351\361\361\365"
+ "\365\365\375\365\365\371\375\375\375\203\371\371\375\2\375\375\375\371\371"
+ "\375\203\355\355\365\12\361\361\365\365\361\371\361\361\365\341\341\351\355"
+ "\355\365\376\376\376\371\371\375\371\371\371\365\365\365\351\351\355\202"
+ "\313\313\323\6\314\314\315\271\271\272\243\242\244\201\221\33\235\262\"\250"
+ "\3051\202\276\334,\1\305\345*\214\275\341\"\7\307\3330z{|\371\363\372iku"
+ "\200\200\205\243\245\264\203\212\224\202\342\333\342\6\365\357\365DEJz{|"
+ "\355\351\361\200\200\205\371\363\372\202\342\333\342\10\351\341\345\352\343"
+ "\353\251\244\260\213\222\233\375\375\375\342\333\342\302\302\304\313\304"
+ "\315\202\322\314\324\203\342\333\342\21\376\376\376\5\10\15\243\242\244\21"
+ "\20\27\375\367\375\362\354\362\322\314\324\235\234\237\322\314\324\200\200"
+ "\205iku\311\307\331ikuz\214^\34?0*2:*16\204*2:\2*16.6:\204*2:\17.6:*2:*1"
+ "6*2:.1:\5\10\15\264\264\272\271\271\272rqy\275\275\276\323\323\324\254\254"
+ "\262\217\217\222\203\212\224\345\345\351\202\376\376\376\4\365\365\365\0"
+ "\0\0*16.1:\203*2:\1.6:\202*2:\1*69\202*2:\1*69\202*2:\4.1:*16.6:/7>\202\30"
+ ")$\20!98\35""23\10\26\31\222\230\242Teg\203\212\224IUW\252\252\254<QNx\205"
+ "\210_mpTeg\213\222\233,N<\213\222\233IUW\202x\205\210\5Teg\222\230\242\35"
+ """23\10\26\31\30:,\202\6)\30\21\21*$\22\35!\30)$\3\3\3ix{x\205\210\203\212"
+ "\224Tegsz\205<QN\243\245\264_mpx\205\210m\204>\217\265\23\245\304\37\261"
+ "\305&\202\265\321&\1\271\334#\252\275\341\"\12\325\347`\345\361\223\226\231"
+ "\212\200\200\205\227\227\232\243\242\244\252\252\254\264\264\272\302\302"
+ "\304\331\331\331\202\343\342\345\1\351\351\355\202\361\361\365\1\365\365"
+ "\371\202\355\355\361\2\365\365\371\361\361\365\202\351\351\355\5\361\361"
+ "\365\361\361\371\361\361\365\355\355\361\343\342\345\202\335\335\345\22\345"
+ "\345\355\365\365\371\365\361\371\355\355\361\355\351\361\355\351\355\345"
+ "\345\355\351\351\361\371\371\375\365\361\371\355\355\365\375\375\375\376"
+ "\376\376\371\371\375\365\365\375\371\371\375\355\355\361\325\325\335\202"
+ "\323\323\331\3\331\331\335\361\361\365\376\376\376\205\375\375\375\202\376"
+ "\376\376\1\365\365\371\202\351\351\355\2\355\351\355\365\365\371\212\376"
+ "\376\376\1\371\371\371\202\361\361\365\1\371\371\371\203\376\376\376\2\375"
+ "\375\371\371\371\371\203\371\371\375\203\365\365\371\205\371\371\375\2\371"
+ "\371\371\365\365\371\202\361\361\365\12\365\365\371\371\371\371\375\375\375"
+ "\376\376\376\375\375\375\365\365\371\361\361\361\365\365\365\375\375\375"
+ "\376\376\376\203\375\375\375\5\376\376\376\371\371\371\361\361\365\365\365"
+ "\371\375\375\375\202\371\371\375\5\375\375\375\365\365\371\365\365\365\371"
+ "\371\371\376\376\376\202\375\375\375\12\371\371\375\365\361\371\361\361\365"
+ "\371\371\375\361\361\365\343\342\345\345\345\355\365\365\371\365\365\375"
+ "\365\365\371\203\371\371\375\202\375\375\375\31\371\371\371\355\355\365\361"
+ "\361\365\355\355\365\355\355\361\361\361\371\355\355\365\345\345\355\365"
+ "\361\371\376\376\376\371\371\375\371\371\371\365\365\365\345\345\351\313"
+ "\313\323\323\323\324\314\314\315\271\271\272\243\242\244\201\221\33\222\247"
+ "#\250\3051\276\334,\304\3428\276\334,\212\275\341\"(\271\334#\275\341\"\304"
+ "\3428\203\212\224\345\340\355_`l\251\244\260\200\200\205\273\265\277\341"
+ "\330\336\342\333\342\341\330\336\371\363\372\357\345\361\351\341\345\375"
+ "\367\375\206\207\212\355\351\361rqy\332\320\330\365\357\365\200\200\205\""
+ "#$\200\200\205\365\357\365\342\333\342\352\343\353\355\351\361\273\265\277"
+ "\351\341\345\341\330\336\335\331\335\365\361\371\273\265\277\352\343\353"
+ "\375\367\375\335\331\335\342\333\342\365\357\365\303\274\304\202\257\255"
+ "\267\6rqy\233\233\250rqyIUW,??.1:\202*2:\3*16*2:*16\205*2:\5.6:\33#,\"*,"
+ "*16*69\202*2:\3\3\3\3\222\230\242\244\244\252\202rqy\14\200\200\205\206\207"
+ "\212z{|\22\35!\335\331\335\376\376\376*16\10\26\31/7>*16*2:.6:\202.1:\2*"
+ "2:.1:\203*2:\3.1:*2:.1:\202*2:\36/7>*16\31\34\32,N<$>M\33#,\21*$,N<\10\26"
+ "\31<QN\203\212\224x\205\210<QN\213\222\233<QN\231\243\251<QNx\205\210ix{"
+ "x\205\210\213\222\233,N<\252\261\276\6)\30\16""4$\30:,\30)$\30""3)\34?0\30"
+ """3)\203\22\35!\16\2\24\12\275\275\312,??\231\243\251Tegsz\205ix{Teg\231"
+ "\243\251Teg\222\247#\235\262\"\245\304\37\247\326\31\202\263\333\36\202\271"
+ "\334#\250\275\341\"\15\302\335M\345\361\223\246\253\221z{|\217\217\222\243"
+ "\242\244\252\252\254\264\264\272\302\302\304\323\323\331\343\342\345\341"
+ "\341\341\351\351\355\202\361\361\365\5\365\361\371\361\361\365\351\351\361"
+ "\365\365\371\361\361\365\202\351\351\355\204\361\361\365\1\341\341\351\202"
+ "\335\335\345\4\345\341\351\365\365\371\361\365\371\355\355\365\202\351\351"
+ "\361\21\345\345\355\351\351\355\371\371\375\361\361\365\355\355\365\371\371"
+ "\375\376\376\376\371\371\375\365\365\371\371\371\375\365\365\365\335\335"
+ "\345\325\325\335\323\323\331\331\331\335\361\361\365\376\376\376\205\375"
+ "\375\375\202\376\376\376\6\371\371\371\351\351\355\343\342\345\345\345\351"
+ "\361\361\365\371\371\375\204\371\371\371\202\375\375\375\202\371\371\371"
+ "\2\365\365\371\365\365\365\202\355\355\361\1\361\361\365\202\371\371\371"
+ "\202\365\365\371\202\365\365\365\4\365\365\371\371\371\371\365\365\371\361"
+ "\361\365\202\355\355\361\1\361\361\361\202\361\361\365\7\361\361\361\355"
+ "\355\361\355\351\355\355\355\361\361\361\361\361\361\365\365\365\365\202"
+ "\365\365\371\7\361\361\365\361\361\361\361\361\365\371\371\375\376\376\376"
+ "\375\375\375\371\371\371\202\365\365\371\1\365\365\365\202\355\355\361\5"
+ "\371\371\371\375\375\375\371\371\375\375\375\375\371\371\375\202\365\365"
+ "\365\1\371\371\371\202\371\371\375\2\375\375\375\371\371\371\202\361\361"
+ "\365\7\371\371\375\355\351\355\341\341\351\345\345\355\365\365\371\365\365"
+ "\375\365\365\371\204\371\371\375\32\375\375\375\365\365\371\361\361\365\355"
+ "\355\365\351\351\355\351\351\361\361\361\365\355\355\365\345\345\351\365"
+ "\365\371\376\376\376\371\371\375\371\371\371\365\365\365\343\342\345\313"
+ "\313\323\323\323\331\314\314\315\271\271\272\244\244\252\201\234$\222\247"
+ "#\250\3051\257\3232\276\334,\304\3428\214\271\334#\13\264\277q\275\275\312"
+ "\217\217\222sz\205\275\275\312\206\207\212\322\314\324\362\354\362\351\341"
+ "\345\376\376\376\375\367\375\202\342\333\342\2\351\341\345\325\325\335\202"
+ "\311\301\310\14\355\351\361\365\357\365103\21\20\27-,-\376\376\376\352\343"
+ "\353\235\234\237\227\227\232\323\323\331\351\341\345\342\333\342\202\341"
+ "\330\336\2\352\343\353\343\342\345\202\342\333\342\202\351\341\345\16\342"
+ "\333\342\254\254\262\303\274\304\213\222\233rqy\243\245\264Teg.1:*2:*16*"
+ "2:*16*2:*16\204*2:\4.1:\22\35!_`l9;I\203\33#,\20*2:\"*,\5\10\15\331\331\331"
+ "\371\371\371\343\342\345\303\303\313\217\217\222sz\205\206\207\212\375\375"
+ "\375\275\275\276\0\0\0/7>.6:*16\202*2:\10*69*2:.6:.1:*2:.6:*2:.6:\202*2:"
+ "\1*16\202/7>\15\30)$\30""3)$>M\30:,!98\30""3)\6)\30<QNIUW\213\222\233<QN"
+ "\222\230\242IUW\202x\205\210!_mp\231\243\251IUW\3\3\3x\205\210\203\212\224"
+ "Teg\30""3)\30:,\34?0\30)$\34?0\30:,\34?0\30:,\30""3)\30)$\3\3\3ix{\203\212"
+ "\224x\205\210Teg\227\227\2323HE\222\230\242TY_\213\222\233m\204>\217\265"
+ "\23\235\262\"\245\304\37\247\326\31\265\321&\202\263\333\36\247\271\334#"
+ "\16\275\341\"\304\3428\324\343\223\262\270\222z{|\217\217\222\243\242\244"
+ "\252\252\254\264\264\272\302\302\304\323\323\331\343\342\345\335\335\345"
+ "\351\351\355\204\361\361\365\13\351\351\355\361\361\365\365\365\371\351\351"
+ "\361\351\351\355\361\361\365\365\361\371\355\355\365\361\361\365\345\341"
+ "\351\343\342\345\202\335\335\345\5\361\361\365\365\365\371\355\355\365\355"
+ "\355\361\355\351\361\202\351\351\361\202\365\365\371\5\351\351\361\371\371"
+ "\371\376\376\376\375\375\375\365\365\371\202\371\371\375\1\345\345\355\202"
+ "\325\325\335\2\331\331\335\355\355\361\206\375\375\375\26\376\376\376\371"
+ "\371\371\302\302\304fgf\243\242\244\331\331\335\345\345\351\314\314\315r"
+ "qyfgf\331\331\331\355\355\355\365\365\365\243\242\244\200\200\205z{|\200"
+ "\200\205\206\207\212\244\244\252\345\345\351\323\323\324\206\207\212\203"
+ "z{|\4\275\275\276\355\355\355\331\331\331\217\217\222\203z{|\20\217\217\222"
+ "\331\331\331\355\355\355\243\242\244\200\200\205rqyfgfz{|\200\200\205rqy"
+ "\200\200\205\252\252\254\323\323\324\343\342\345\355\351\355\365\365\371"
+ "\202\375\375\375\3\271\271\272\206\207\212\200\200\205\202z{|\17\243\242"
+ "\244\345\345\351\365\365\365\371\371\371\371\371\375\375\375\375\365\365"
+ "\371\361\361\365\261\261\264\227\227\232\355\355\355\365\365\365\371\371"
+ "\371\365\365\371\355\355\361\202\365\365\371\6\345\345\355\343\342\345\355"
+ "\351\355\371\371\375\365\361\371\365\365\371\203\371\371\375\34\375\375\375"
+ "\371\371\375\365\365\371\361\361\365\351\351\361\345\345\355\351\351\361"
+ "\355\355\365\355\355\361\351\351\361\371\371\375\375\375\375\371\371\375"
+ "\371\371\371\365\365\371\333\333\341\323\323\331\331\331\335\314\314\315"
+ "\271\271\272\243\242\244m\216\33\222\247#\250\3051\257\3232\277\334=\276"
+ "\334,\271\334#\213\263\333\36\33\226\231\212\333\334\352_`l\263\265\303f"
+ "gf\303\303\313\375\375\375\235\234\237\362\354\362\21\20\27IUW\376\376\376"
+ "\342\333\342\351\341\345\311\301\310\362\354\362\345\341\351\303\274\304"
+ "\365\361\371\273\265\277\21\20\27\243\245\264\355\351\355\362\354\362\352"
+ "\343\353\342\333\342\302\302\304\204\342\333\342\1\341\330\336\203\342\333"
+ "\342\14\351\341\345\371\363\372\352\343\353\264\264\272\257\255\267\263\265"
+ "\303TY_\275\275\312iku.1:*2:*16\202*2:\2*69*16\204*2:\16\33#,IUW\235\234"
+ "\237\206\207\212\227\227\232DEJIUW\33#,/7>\22\35!\5\10\15\"*,\200\200\205"
+ "\323\323\324\203\376\376\376\3\375\375\375\5\10\15\"*,\203*2:\1*69\202*2"
+ ":\1*69\211*2:\30*69*16\31\34\32,??&*4\37""8B\30""3)\30)$\2\24\12x\205\210"
+ "\231\243\251Teg<QN\203\212\224ix{TY_\34?0\231\243\251ix{x\205\210\2\24\12"
+ "\30""3)\10\26\31\6)\30\202\21*$\3\30:,\30""3)\30)$\205\34?0\15\30""3)\6)"
+ "\30\264\264\272.6:\231\243\251Teg\206\207\212_mpIUW\252\261\276Teg\222\247"
+ "#\217\265\23\202\245\304\37\1\247\326\31\252\263\333\36\15\277\334=\345\361"
+ "\223\302\312\225z{|\217\217\222\243\242\244\252\252\254\261\261\264\302\302"
+ "\304\323\323\324\343\342\345\341\341\341\345\345\351\203\361\361\365\31\365"
+ "\361\371\351\351\355\355\355\365\365\365\371\355\355\361\351\351\355\361"
+ "\361\365\365\365\371\355\355\361\361\361\365\345\345\355\335\335\345\343"
+ "\342\345\335\335\345\355\355\361\365\365\371\361\361\365\355\355\365\355"
+ "\355\361\351\351\361\351\351\355\365\361\371\371\371\375\351\351\361\365"
+ "\365\371\202\376\376\376\202\365\365\371\10\375\375\375\355\355\361\333\333"
+ "\341\325\325\341\331\331\335\351\351\355\371\371\375\376\376\376\203\375"
+ "\375\375\20\376\376\376\371\371\371\252\252\254103\0\0\0:::\252\252\254\235"
+ "\234\237DEJ\200\200\205\3\3\3IUW\271\271\272\345\345\351rqyz{|\202\5\10\15"
+ "*\235\234\237\217\217\222\335\335\335\252\252\254fgfTY_\3\3\3\206\207\212"
+ "\243\242\244\343\342\345\275\275\276fgfDEJ\0\0\0\217\217\222\275\275\276"
+ "\302\302\304\351\351\351rqy\227\227\232\31\34\32\3\3\3\311\311\311\261\261"
+ "\264rqyIUW\"#$-,-\243\242\244\341\341\341\361\361\361\371\371\371\371\371"
+ "\375z{|\227\227\232\31\34\32\3\3\3\265\265\265\252\252\254\335\335\335\361"
+ "\361\361\365\365\371\202\371\371\375\22\361\361\365\355\355\361fgf\"#$\302"
+ "\302\304\351\351\351\361\361\365\355\355\365\355\355\361\371\371\371\361"
+ "\361\365\343\342\345\341\341\351\355\355\365\371\371\375\361\361\365\365"
+ "\361\371\365\365\375\204\371\371\375\10\365\365\371\361\361\365\345\345\355"
+ "\345\341\351\345\345\355\355\355\365\355\355\361\355\355\365\202\375\375"
+ "\375\14\371\371\375\371\371\371\365\365\365\333\333\341\331\331\335\335\331"
+ "\335\314\314\315\271\271\272\244\244\252m\216\33\222\247#\241\272*\202\257"
+ "\3232\1\276\334,\213\263\333\36\14\276\334,sz\205\315\315\331sz\205\264\264"
+ "\272\200\200\205\206\207\212\233\233\250\5\10\15\375\375\375_`l\227\227\232"
+ "\202\342\333\342\17\352\343\353\311\301\310\313\313\323z{|\273\265\277\375"
+ "\366\371\371\371\371rqy\233\233\250\322\314\324\217\217\222\345\341\351\264"
+ "\264\272\357\345\361\341\330\336\202\342\333\342\1\341\330\336\202\342\333"
+ "\342\16\335\331\335\376\376\376\355\351\355rqy\375\367\375\335\331\331\244"
+ "\244\252\332\325\341_`l\264\264\272\200\200\205DEJ*2:*16\204*2:\27*16*2:"
+ ".6:&*49;I\206\207\212\200\200\205\217\217\222\3\3\3\227\227\232TY_\206\207"
+ "\212/7>TY_9;I\10\26\31\3\3\3\0\0\0\5\10\15&*4\243\242\244Teg\21\20\27\203"
+ "*2:\1*69\211*2:\1.6:\202*2:\4.6:/7>\31\34\32\30:,\202\37""8B\2\252\261\276"
+ "\10\26\31\202\22\35!\11\6)\30\231\243\251,N<\252\252\254IUW\275\275\312\2"
+ "\24\12\16""4$IUW\202\2\24\12\7\30)$\30:,\30""3)\3\3\3\10\26\31\30)$\21*$"
+ "\202\30)$\1\22\35!\202\30""3)\16\30)$\34?0#C5\6)\30_mp\203\212\224_mpIUW"
+ "\213\222\233TY_\252\261\276<QN\206\207\212m\204>\202\217\265\23\202\245\304"
+ "\37\202\247\326\31\251\263\333\36\14\324\343\223\302\312\225z{|\206\207\212"
+ "\235\234\237\252\252\254\265\265\265\302\302\304\323\323\324\341\341\341"
+ "\335\335\345\345\345\351\203\361\361\365\31\365\365\371\351\351\355\355\355"
+ "\361\365\365\371\355\355\365\351\351\355\355\355\365\365\365\371\355\355"
+ "\361\355\355\365\345\345\355\335\335\345\341\341\351\335\335\345\345\345"
+ "\355\365\365\371\361\361\365\355\355\365\355\355\361\355\351\361\351\351"
+ "\361\361\361\365\371\371\375\351\351\361\361\361\365\202\376\376\376\5\371"
+ "\371\375\361\361\365\375\375\375\365\365\371\341\341\351\202\333\333\341"
+ "\3\345\341\351\371\371\375\376\376\376\203\375\375\375\31\371\371\375\227"
+ "\227\232103\345\345\351\0\0\0\235\234\237\227\227\232\"#$\335\331\331\314"
+ "\314\315\3\3\3DEJ\227\227\232\335\331\331\331\331\331\252\252\254IUW\3\3"
+ "\3\252\252\254\275\275\276\331\331\331\335\335\335\261\261\264DEJ:::\202"
+ "\311\311\3110\335\335\335\351\351\351\275\275\276TY_\3\3\3\243\242\244\311"
+ "\311\311\314\314\315\343\342\345\323\323\324\275\275\276:::\31\34\32\311"
+ "\311\311\275\275\276\243\242\244\200\200\205z{|DEJ\16\20\16\227\227\232\341"
+ "\341\341\361\361\361\371\371\371\335\335\335\244\244\252\"#$\21\20\27\314"
+ "\314\315\302\302\304\335\335\335\355\355\355\365\365\371\375\375\375\371"
+ "\371\371\361\361\361\275\275\276TY_\3\3\3z{|\331\331\331\345\345\351\351"
+ "\351\355\361\361\365\371\371\375\351\351\361\343\342\345\341\341\351\202"
+ "\365\365\371\2\355\355\361\361\365\371\204\371\371\375\3\365\365\375\365"
+ "\365\371\355\355\361\202\341\341\351\4\345\345\351\355\355\365\355\355\361"
+ "\361\361\365\202\375\375\375\3\371\371\375\371\371\371\361\361\361\202\333"
+ "\333\341\7\335\335\335\314\314\315\275\275\276\243\242\244m\216\33\201\234"
+ "$\217\276$\203\257\3232\1\263\333\36\212\247\326\31\34\271\326B\233\233\250"
+ "\264\264\272rqy\257\255\267\251\244\260\352\343\353\371\363\372\217\217\222"
+ "z{|\0\0\0\233\233\250\313\304\315\352\343\353\341\330\336\371\363\372\227"
+ "\227\232\375\367\375\371\363\372\206\207\212\332\320\330\233\233\250_`l\375"
+ "\375\375\311\301\310\251\244\260\335\331\335\342\333\342\204\341\330\336"
+ "\16\335\331\335\342\333\342\376\376\376\31\34\32\203\212\224IUW\332\320\330"
+ "\243\242\244_`l\342\333\342rqy\222\230\242\203\212\224IUW\204*2:\25*16*2"
+ ":/7>&*4\10\26\31\33#,&*4\22\35!_`l&*4\5\10\15\254\254\262\206\207\212\22"
+ "\35!*2:\302\302\304\5\10\15\217\217\222_`l&*4\"*,\202\5\10\15\2\22\35!/7"
+ ">\207*2:\1*69\204*2:\2.6:.1:\202*2:\13*69*16\31\34\32,N<\37""8B\10\26\31"
+ "\203\212\224ix{\2\24\12\22\35!\30""3)\202\6)\30\20\203\212\224#C5\21*$\30"
+ """3)\34?0\10\26\31\22\35!\30:,\22\35!\30:,\6)\30x\205\210iku\277\313\327"
+ "\6)\30\21*$\204\22\35!\202\10\26\31\15\2\24\12\6)\30\34?0\252\261\276Teg"
+ "\243\245\264<QNx\205\210ix{_mp\213\222\233Teg\201\234$\202\217\265\23\2\233"
+ "\320\26\245\304\37\251\247\326\31\3\263\333\36\310\325t\324\343\223\202\206"
+ "\207\212\5\235\234\237\252\252\254\261\261\264\275\275\276\323\323\324\202"
+ "\341\341\341\1\343\342\345\203\361\361\365\10\365\365\371\355\355\361\351"
+ "\351\355\365\365\371\361\361\365\351\351\355\355\355\361\365\365\371\202"
+ "\355\355\361\7\351\351\355\335\335\345\341\341\351\335\335\345\341\341\351"
+ "\361\361\371\361\361\365\202\355\355\365\202\355\355\361\13\361\361\365\371"
+ "\371\375\355\351\361\355\355\361\375\375\375\376\376\376\371\371\375\361"
+ "\361\365\365\365\371\371\371\375\345\345\355\202\333\333\341\3\341\341\351"
+ "\365\365\371\376\376\376\203\375\375\375?\314\314\315IUW\355\351\355\200"
+ "\200\205\0\0\0\302\302\304\31\34\32\235\234\237\271\271\272iku\3\3\3\217"
+ "\217\222\311\311\311\323\323\324\343\342\345\341\341\341rqy\5\10\15fgf\275"
+ "\275\276\331\331\331\345\345\351\302\302\304\"#$\235\234\237\271\271\272"
+ "\314\314\315\341\341\341\361\361\361\351\351\351TY_\16\20\16z{|\275\275\276"
+ "\323\323\324\343\342\345\351\351\351\314\314\315:::\"#$\254\254\262\271\271"
+ "\272\311\311\311\314\314\315\252\252\254fgfDEJ\21\20\27\261\261\264\343\342"
+ "\345\361\361\365\361\361\361\243\242\244103\31\34\32\252\252\254\302\302"
+ "\304\341\341\341\355\355\361\371\371\371\371\371\375\361\361\365\355\355"
+ "\361\202z{|\5TY_-,-\275\275\276\331\331\335\345\345\351\202\365\365\371\7"
+ "\345\345\351\343\342\345\351\351\355\371\371\371\361\361\365\355\355\361"
+ "\365\361\371\202\371\371\375\202\365\365\375\202\365\365\371\1\345\345\355"
+ "\202\335\335\345\1\345\345\351\202\355\355\365\1\365\365\371\202\375\375"
+ "\375\15\371\371\375\371\371\371\355\355\361\333\333\341\343\342\345\335\335"
+ "\335\314\314\315\271\271\272\244\244\252m\216\33\201\234$\235\262\"\231\311"
+ "'\203\257\3232\212\247\326\31\10\251\300X\222\230\242\203\212\224\222\230"
+ "\242\257\255\267\233\233\250\355\351\355\342\333\342\202\200\200\205\3\376"
+ "\376\376\257\255\267\362\350\354\203\342\333\342\16\357\345\361\252\252\254"
+ "\365\357\365\235\234\237\343\342\345\311\301\310\22\35!\376\376\376\345\341"
+ "\351\261\261\264\345\341\351\342\333\342\341\330\336\342\333\342\202\335"
+ "\331\335\4\341\330\336\342\333\342\357\345\361\217\217\222\202\332\320\330"
+ "\10*16\375\375\375\257\255\267\332\320\330\222\230\242rqy\203\212\224_`l"
+ "\205*2:\1.1:\202\33#,\27\227\227\232DEJ&*4\33#,\10\26\31\"*,*16DEJ&*4\22"
+ "\35!\302\302\304&*4DEJ\206\207\212\10\26\31\261\261\264\10\26\31rqyDEJ&*"
+ "4\33#,*16.1:\203*2:\2*16*69\210*2:\7*16,??\31\34\32\6)\30$>M\37""8B\30:,"
+ "\202#C5\202\21*$\1\30""3)\202\30:,\2\2\24\12\22\35!\202\10\26\31\2\21*$\30"
+ """3)\202\34?0\6\30:,\21*$\16""4$x\205\2103HE\10\26\31\203\22\35!\202\10\26"
+ "\31\1\2\24\12\202\21*$\16sz\205_mp\244\244\252IUWx\205\210sz\205Teg\213\222"
+ "\233<QN\231\243\251Teg\213\222\233m\204>}\243\25\202\217\265\23\202\233\320"
+ "\26\251\247\326\31\12\325\347`\324\343\223\226\231\212\200\200\205\227\227"
+ "\232\252\252\254\261\261\264\275\275\276\313\313\323\341\341\341\202\343"
+ "\342\345\10\361\361\361\365\365\371\361\361\365\365\365\371\361\361\365\345"
+ "\345\355\361\361\365\365\365\371\202\355\355\361\2\365\365\371\355\355\365"
+ "\202\355\351\361\5\335\335\345\345\341\351\341\341\351\335\335\345\355\355"
+ "\365\202\361\361\365\202\355\355\365\20\355\355\361\355\355\365\365\365\371"
+ "\355\355\365\345\345\355\371\371\375\376\376\376\375\375\375\361\361\371"
+ "\361\361\365\371\371\375\361\361\365\341\341\351\333\333\341\343\342\345"
+ "\361\361\365\204\375\375\375\11\323\323\324\265\265\265\323\323\324\16\20"
+ "\16IUWDEJfgf\227\227\232\243\242\244\202\31\34\32\3\217\217\222\265\265\265"
+ "\331\331\331\202\355\355\355\10\252\252\254103\31\34\32\275\275\276\331\331"
+ "\331\351\351\351z{|-,-\202\302\302\3047\331\331\331\355\355\355\371\371\371"
+ "\361\361\361TY_\16\20\16\200\200\205\311\311\311\341\341\341\361\361\361"
+ "\361\361\365\311\311\311DEJ\"#$\261\261\264\311\311\311\335\335\335\351\351"
+ "\351\341\341\341\235\234\237\200\200\205\3\3\3fgf\323\323\324\355\355\355"
+ "\361\361\365\243\242\244:::\31\34\32\252\252\254\314\314\315\343\342\345"
+ "\365\365\371\375\375\375\365\365\371\361\361\361\323\323\331fgfTY_\206\207"
+ "\212\16\20\16\217\217\222\314\314\315\343\342\345\371\371\371\355\355\365"
+ "\345\341\351\341\341\351\355\355\365\371\371\375\355\351\361\355\355\361"
+ "\365\365\371\371\371\375\365\365\375\203\365\365\371\10\361\361\371\341\341"
+ "\351\333\333\341\335\335\345\345\341\351\355\355\365\361\361\365\371\371"
+ "\375\202\375\375\375\14\371\371\375\371\371\371\345\345\355\343\342\345\341"
+ "\341\351\335\331\335\314\314\315\271\271\272\243\242\244m\216\33\201\234"
+ "$\205\263\37\202\237\322,\2\257\3232\263\333\36\212\247\326\31\6\251\300"
+ "X\263\265\303\213\222\233\203\212\224\257\255\267\273\265\277\202\345\341"
+ "\351\4\371\360\365\375\367\375\342\333\342\352\343\353\205\342\333\342\17"
+ "\362\354\362\273\265\277\254\254\262\342\333\342\303\274\304_`l\251\244\260"
+ "\322\314\324\351\341\345\342\333\342\341\330\336\333\333\341\341\330\336"
+ "\342\333\342\341\330\336\203\342\333\342\14\345\341\351rqy\257\255\267\375"
+ "\375\375\334\325\335\311\301\310\303\274\304\263\265\303_`l\213\222\233_"
+ "`l*16\204*2:\6*16\10\26\31\343\342\345DEJ\244\244\252\331\331\335\202TY_"
+ "\1&*4\202\10\26\31\17\33#,/7>IUW\10\26\31\273\273\304/7>iku\217\217\222/"
+ "7>\264\264\272\10\26\31\22\35!TY_*2:*16\203*2:\1*16\202*2:\1.1:\203*2:\16"
+ "*69*2:*16*69\"*,\2\24\12Teg\37""8B\30:,\35""23\16""4$\30""3)\30:,\34?0\202"
+ "\30:,\4\22\35!\30)$\16""4$\6)\30\202Teg\12\16""4$\30""3)\22\35!\30""3)\30"
+ ")$\30:,\6)\30\30:,\10\26\31\5\10\15\202\2\24\12\202,??\14x\205\210Teg\231"
+ "\243\251_mpx\205\210sz\205IUW\231\243\251<QN\231\243\251Tegx\205\210\202"
+ "ix{\3x\205\210_mp\201\234$\203\217\265\23\1\245\304\37\202\233\320\26\247"
+ "\247\326\31\32\302\335M\324\343\223\237\243\221\200\200\205\227\227\232\252"
+ "\252\254\265\265\265\275\275\276\314\314\315\341\341\341\343\342\345\341"
+ "\341\341\355\355\361\365\365\371\361\361\365\365\365\371\365\361\371\345"
+ "\345\355\355\355\361\365\365\371\355\355\365\355\355\361\365\365\371\361"
+ "\361\365\351\351\355\355\355\361\202\341\341\351\15\345\345\355\335\335\345"
+ "\345\345\355\361\361\365\355\355\365\361\361\365\355\355\365\355\355\361"
+ "\355\355\365\365\365\371\365\361\371\345\345\355\365\365\371\202\376\376"
+ "\376\2\371\371\375\355\355\361\202\371\371\375\1\345\345\355\202\335\335"
+ "\345\2\355\355\361\371\371\375\203\375\375\375U\365\365\365\341\341\341\217"
+ "\217\222\16\20\16TY_fgfz{|\252\252\254iku\3\3\3z{|\217\217\222\302\302\304"
+ "\341\341\341\365\365\365\371\371\371\351\351\351fgf\3\3\3\217\217\222\323"
+ "\323\324\331\331\331103\200\200\205\302\302\304\323\323\324\343\342\345\365"
+ "\365\365\375\375\375\365\365\365TY_\5\10\15\206\207\212\314\314\315\345\345"
+ "\351\371\371\371\371\371\375\323\323\324DEJ\"#$\265\265\265\323\323\324\355"
+ "\355\355\371\371\371\361\361\361\351\341\345rqy\31\34\32:::\311\311\311\343"
+ "\342\345\355\355\355\244\244\252:::\31\34\32\252\252\254\323\323\324\351"
+ "\351\355\371\371\375\371\371\371\355\355\361\361\361\361\217\217\222fgf\243"
+ "\242\244\206\207\212\"*,DEJ\275\275\276\341\341\341\361\361\365\351\351\355"
+ "\343\342\345\345\345\351\365\365\371\361\361\365\351\351\355\355\355\361"
+ "\365\365\371\371\371\375\365\365\371\365\361\371\361\361\365\365\365\371"
+ "\355\355\361\202\333\333\341\5\335\335\345\345\345\355\361\361\371\365\365"
+ "\371\371\371\375\203\375\375\375\1\365\365\371\202\345\345\351\5\343\342"
+ "\345\331\331\335\314\314\315\271\271\272\244\244\252\202m\216\33\5\222\247"
+ "#\231\311'\237\322,\257\3232\237\322,\212\233\320\26\7\264\277q\243\245\264"
+ "iku\251\244\260\233\233\250\273\265\277\362\354\362\203\342\333\342\1\341"
+ "\330\336\207\342\333\342\7\351\341\345\342\333\342\313\304\315\376\376\376"
+ "\5\10\15_`l\357\345\361\202\342\333\342\23\341\330\336\333\333\341\335\331"
+ "\335\341\330\336\342\333\342\335\331\335\341\330\336\342\333\342\351\341"
+ "\345\357\345\361\362\350\354\342\333\342\351\341\345\257\255\267\303\274"
+ "\304\257\255\267z{|\243\245\264_`l\202*16\203*2:\24\22\35!\254\254\262\217"
+ "\217\222\323\323\324TY_IUW\345\345\351iku\217\217\222\243\242\244IUW\22\35"
+ "!\10\26\31\21\20\27*2:\33#,DEJIUW\22\35!\303\303\313\202\33#,\4\217\217\222"
+ "\311\311\311\33#,&*4\203*2:\3*69.6:.1:\205*2:\10*16*69.6:\31\34\32\6)\30"
+ "sz\205_`l\21*$\207\30:,\10\34?0\16""4$3HE\275\275\312ix{_mp\2\24\12\30""3"
+ ")\202\30:,\34\34?0\30""3)\6)\30\16""4$\6)\30IUW<QN\252\261\276Tegx\205\210"
+ "_`lsz\205\213\222\233<QN\213\222\2333HE\243\245\264Tegx\205\210Teg_mp\231"
+ "\243\251<QN\222\230\242<QN\231\243\251m\204>}\243\25\202\217\265\23\252\233"
+ "\320\26\17\271\326B\324\343\223\246\253\221\200\200\205\217\217\222\252\252"
+ "\254\261\261\264\275\275\276\314\314\315\333\333\341\343\342\345\335\335"
+ "\345\355\355\361\365\365\371\361\361\365\202\365\365\371\202\351\351\355"
+ "\14\365\365\371\361\361\365\355\355\361\365\365\371\361\361\365\351\351\355"
+ "\355\355\361\345\341\351\341\341\351\345\345\355\335\335\345\345\341\351"
+ "\202\355\355\365\202\361\361\365\202\355\355\365\17\361\361\365\365\365\371"
+ "\345\345\351\355\355\365\375\375\375\376\376\376\371\371\375\355\355\365"
+ "\361\361\371\375\375\371\355\355\365\345\345\351\343\342\345\351\351\355"
+ "\371\371\371\203\375\375\375+\371\371\371\343\342\345:::\31\34\32IUWz{|\235"
+ "\234\237\243\242\244\31\34\32-,-z{|\265\265\265\323\323\324\351\351\351\371"
+ "\371\371\375\375\371\365\365\365\206\207\212\21\20\27DEJ\311\311\311\252"
+ "\252\254\"#$\271\271\272\311\311\311\335\331\331\355\355\361\371\371\375"
+ "\375\375\375\361\361\365TY_\16\20\16\217\217\222\314\314\315\351\351\351"
+ "\371\371\371\375\375\375\331\331\331DEJ\31\34\32\265\265\265\323\323\324"
+ "\355\355\355\202\371\371\375\17\361\361\361z{|\31\34\32-,-\271\271\272\331"
+ "\331\331\345\345\351\252\252\254DEJ\21\20\27\243\242\244\314\314\315\355"
+ "\355\355\371\371\371\361\361\365\202\355\355\361\4fgf\16\20\16TY_IUW\202"
+ "\16\20\16\2\244\244\252\331\331\335\202\345\345\351\6\345\341\351\351\351"
+ "\361\371\371\371\355\355\361\345\345\355\355\355\365\202\365\365\371\13\365"
+ "\361\371\355\355\365\361\361\365\365\365\371\341\341\351\325\325\341\331"
+ "\331\335\333\333\341\345\345\355\365\361\371\365\365\371\203\375\375\375"
+ "\15\371\371\375\365\365\371\345\345\351\351\351\355\343\342\345\331\331\335"
+ "\314\314\315\271\271\272\243\242\244]y\30\201\234$\205\263\37\241\272*\202"
+ "\237\322,\2\257\3232\247\326\31\211\233\320\26\7\264\277q\243\245\264rqy"
+ "\243\245\264\257\255\267\251\244\260\351\341\345\202\343\342\345\3\342\333"
+ "\342\371\363\372\351\341\345\204\342\333\342\6\341\330\336\342\333\342\341"
+ "\330\336\342\333\342\371\360\365_`l\202(\26\20\3\227\227\232\352\343\353"
+ "\334\325\335\202\342\333\342\11\341\330\336\342\333\342\335\331\335\342\333"
+ "\342\341\330\336\342\333\342\341\330\336\342\333\342\341\330\336\202\342"
+ "\333\342\10\261\261\264\332\320\330\257\255\267iku\233\233\250_`l*2:*16\204"
+ "*2:\4\33#,DEJix{\10\26\31\202\22\35!\1\0\0\0\202\217\217\222\4TY_\365\357"
+ "\365z{|9;I\203\22\35!\11\33#,&*4/7>*16\217\217\222DEJ\302\302\304\10\26\31"
+ "*16\204*2:\1.6:\202*2:\1.1:\202*2:\12.1:*16*69\"*,\2\24\12ix{$>M\203\212"
+ "\224\10\26\31\34?0\204\30:,\2\30""3)\34?0\202\30:,\5\34?0,N<\6)\30\21*$\34"
+ "?0\202\30:,\1\6)\30\202\16""4$\5ix{IUW\243\245\264Tegsz\205\202_mp\6\235"
+ "\234\237,??\213\222\2333HE\244\244\252IUW\202ix{\14_mp\243\245\264<QN\222"
+ "\230\242IUW\231\243\251sz\205x\205\210_mpTeg}\243\25\205\263\37\202\217\265"
+ "\23\247\233\320\26\20\247\326\31\233\320\26\237\322,\324\343\223\302\312"
+ "\225z{|\217\217\222\243\242\244\261\261\264\275\275\276\311\311\311\331\331"
+ "\335\343\342\345\335\335\345\351\351\355\365\365\371\202\361\361\365\20\365"
+ "\365\371\355\355\361\345\345\355\361\361\365\365\365\371\355\355\361\361"
+ "\361\365\365\361\371\345\345\355\355\351\361\345\345\355\341\341\351\351"
+ "\351\355\345\341\351\335\335\345\355\355\361\202\355\355\365\10\361\361\371"
+ "\361\361\365\355\355\365\361\361\365\365\365\371\351\351\355\345\345\355"
+ "\371\371\375\202\376\376\376\10\365\365\371\355\355\361\371\371\375\365\365"
+ "\371\351\351\361\341\341\351\345\345\355\361\361\365\203\375\375\375\4\371"
+ "\371\375\261\261\264\16\20\16\0\0\0\202\200\200\205\25\271\271\272iku\3\3"
+ "\3fgf\235\234\237\275\275\276\335\331\331\361\361\361\375\375\375\376\376"
+ "\376\371\371\371\311\311\311IUW\16\20\16\252\252\254TY_fgf\302\302\304\323"
+ "\323\324\343\342\345\365\365\365\202\375\375\375\35\361\361\361TY_\16\20"
+ "\16\217\217\222\323\323\324\351\351\351\371\371\371\375\375\375\331\331\331"
+ "DEJ\"#$\265\265\265\323\323\324\355\355\355\371\371\375\376\376\376\365\365"
+ "\371\217\217\222\16\20\16""103\271\271\272\323\323\324\345\345\351\265\265"
+ "\265DEJ\16\20\16\244\244\252\323\323\324\355\351\355\202\355\355\361\15\361"
+ "\361\365\302\302\304:::fgf\261\261\264\252\252\254\217\217\222\3\3\3rqy\314"
+ "\314\315\331\331\335\335\335\345\345\345\355\202\365\365\371\20\345\345\351"
+ "\351\351\361\361\361\365\365\365\375\365\365\371\355\355\365\355\355\361"
+ "\365\365\371\355\355\361\333\333\341\325\325\335\325\325\341\333\333\341"
+ "\355\355\361\365\365\371\371\371\375\203\375\375\375\2\371\371\375\361\361"
+ "\365\202\345\345\355\12\335\335\345\331\331\331\314\314\315\271\271\272\243"
+ "\242\244]y\30m\216\33\201\234$\217\276$\231\311'\202\237\322,\212\233\320"
+ "\26\6\241\252v\257\255\267\206\207\212\222\230\242\273\265\277\313\304\315"
+ "\203\352\343\353\5\375\367\375\243\242\244\345\341\351\351\341\345\341\330"
+ "\336\204\342\333\342\202\341\330\336\14\342\333\342\332\320\330:::-,-\315"
+ "\315\331\342\333\342\334\325\335\342\333\342\343\342\345\341\330\336\334"
+ "\325\335\342\333\342\202\341\330\336\3\335\331\335\334\325\335\343\342\345"
+ "\203\342\333\342\6\257\255\267\273\265\277\305\304\321TY_\203\212\224_`l"
+ "\202*2:\1*16\203*2:\26&*4\33#,\22\35!\33#,/7>\376\376\376z{|iku\33#,\206"
+ "\207\212\341\341\341iku\302\302\304\313\313\323ikuIUW\22\35!\"*,\10\26\31"
+ "*16\33#,*2:\2029;I\3IUW\"*,.1:\203*2:\1*69\202*2:\15.6:*69*2:*16*69\16\20"
+ "\16\21*$ikuIUWsz\205IUW\6)\30\34?0\205\30:,\1\34?0\202\30:,\203\16""4$\7"
+ "\6)\30#C5\34?0z{|TY_\263\265\303TY_\202ix{\26TY_\254\254\2623HE\203\212\224"
+ "<QN\213\222\233Teg_mpx\205\210IUW\252\261\276<QN\222\230\242IUW\222\230\242"
+ "x\205\210ix{_mp\37""8B<QNTegz\214^\202}\243\25\3\217\265\23\233\320\26\217"
+ "\265\23\251\233\320\26\2\310\325t\324\343\223\202\206\207\212\20\243\242"
+ "\244\261\261\264\275\275\276\311\311\311\331\331\331\343\342\345\335\335"
+ "\335\345\345\355\365\365\365\365\365\371\361\361\365\365\365\371\361\361"
+ "\365\345\345\351\355\355\361\365\365\371\202\361\361\365\1\365\365\371\203"
+ "\351\351\355\1\341\341\351\202\351\351\355\4\335\335\345\345\345\351\355"
+ "\355\365\355\351\361\202\361\361\365\202\355\355\365\4\365\361\371\355\355"
+ "\361\341\341\351\365\365\371\202\375\375\375\22\371\371\375\355\355\361\361"
+ "\361\365\371\371\375\355\355\365\345\345\355\345\341\351\351\351\361\371"
+ "\371\371\371\375\375\371\371\375\365\365\365fgf\0\0\0fgf\200\200\205\265"
+ "\265\265\261\261\264\202\31\34\32K\217\217\222\235\234\237\227\227\232\335"
+ "\335\335\361\361\361\371\371\375\375\375\375\371\371\375\355\355\355z{|\3"
+ "\3\3fgf-,-\244\244\252\302\302\304\331\331\331\355\355\355\371\371\371\375"
+ "\375\375\375\375\371\371\360\365IUW\16\20\16\217\217\222\314\314\315\351"
+ "\351\351\371\371\371\375\375\375\335\331\331DEJ\31\34\32\265\265\265\323"
+ "\323\324\355\355\355\371\371\371\375\375\375\365\365\365\206\207\212\0\0"
+ "\0TY_\271\271\272\323\323\331\355\355\355\275\275\276DEJ\21\20\27\243\242"
+ "\244\314\314\315\343\342\345\351\351\355\361\361\365\365\365\365\200\200"
+ "\205\31\34\32\275\275\276\314\314\315\271\271\272rqy-,-\"#$\261\261\264\314"
+ "\314\315\333\333\341\355\351\361\341\341\341\235\234\237\311\311\311\345"
+ "\345\355\361\361\365\365\365\371\355\355\361\351\351\361\355\351\361\365"
+ "\365\371\341\341\351\202\323\323\331\5\325\325\335\335\335\345\361\361\371"
+ "\365\365\371\371\371\375\203\375\375\375\11\371\371\375\355\355\365\351\351"
+ "\355\345\345\351\335\335\345\325\325\335\311\311\311\264\264\272\243\242"
+ "\244\202m\216\33\3\201\234$\217\276$\231\311'\203\237\322,\211\233\320\26"
+ "\20\251\300X\233\233\250sz\205\233\233\250\273\265\277\264\264\272\352\343"
+ "\353\375\375\375-,-\227\227\232\5\10\15\217\217\222\365\357\365\342\333\342"
+ "\341\341\341\341\330\336\202\342\333\342\2\341\330\336\335\331\335\202\342"
+ "\333\342\31\257\255\267.1:\303\303\313\341\341\351\375\367\375\341\330\336"
+ "\311\301\310\352\343\353\335\331\335\342\333\342\341\330\336\351\341\345"
+ "\376\376\376\371\360\365\332\320\330\343\342\345\345\341\351\351\341\345"
+ "\257\255\267\342\333\342\251\244\260\200\200\205\222\230\242_`l*16\205*2"
+ ":\1*69\202.1:\27\22\35!\217\217\222\365\365\365\376\376\376TY_\355\355\355"
+ "rqy\0\0\0\10\26\31\261\261\264\254\254\262\33#,\200\200\205\323\323\324_"
+ "`lrqy\33#,\5\10\15&*4\217\217\222TY_*2:&*4\207*2:\16*16.1:*16*69\"*,\2\24"
+ "\12Teg$>M\203\212\224IUW\231\243\251\2\24\12\34?0\30:,\203\34?0\202\30:,"
+ "\33\6)\30\16""4$\6)\30Teg<QN\213\222\233TY_\213\222\233_mpix{sz\205TY_\213"
+ "\222\2333HE\231\243\251IUWsz\205_mpTY_\222\230\242TY_\222\230\2423HE\244"
+ "\244\252_mp\222\230\242ix{\202IUW\6\35""233HEIUWUlFm\204>m\216\33\203}\243"
+ "\25\202\217\265\23\252\233\320\26\24\310\325t\324\343\223\226\231\212\206"
+ "\207\212\235\234\237\254\254\262\275\275\276\303\303\313\323\323\331\343"
+ "\342\345\335\335\345\345\345\351\361\361\365\365\365\371\361\361\365\365"
+ "\365\371\361\361\365\345\345\351\345\345\355\365\361\371\202\361\361\365"
+ "\7\365\365\371\351\351\355\345\345\355\355\355\361\341\341\351\345\345\355"
+ "\355\355\361\202\335\335\345\4\355\351\361\351\351\355\355\355\365\361\361"
+ "\365\203\355\355\365\3\361\361\365\335\335\345\351\351\361\203\375\375\375"
+ "\2\361\361\365\351\351\355\202\365\365\371\7\351\351\355\345\345\351\345"
+ "\345\355\361\361\365\371\371\375\371\371\371\314\314\315\202\31\34\32\30"
+ "z{|\243\242\244\275\275\276fgf\3\3\3\252\252\254fgf103\217\217\222\323\323"
+ "\331\355\355\361\371\371\371\375\375\375\375\375\371\365\365\365\261\261"
+ "\264:::\0\0\0IUW\271\271\272\311\311\311\341\341\341\361\361\361\371\371"
+ "\375\202\375\375\375\21\361\361\361IUW\5\10\15\227\227\232\314\314\315\345"
+ "\345\351\365\365\365\371\371\375\341\341\341DEJ\31\34\32\265\265\265\323"
+ "\323\324\351\351\351\365\365\371\365\365\365\311\311\311\202\16\20\16\17"
+ "\252\252\254\302\302\304\341\341\341\361\361\361\311\311\311DEJ\16\20\16"
+ "\243\242\244\311\311\311\331\331\335\355\355\355\365\365\371\341\341\341"
+ "IUWDEJ\202\302\302\304\14\271\271\272TY_\200\200\205\5\10\15\217\217\222"
+ "\302\302\304\325\325\335\345\345\351iku\"#$DEJ\343\342\345\202\355\355\361"
+ "\6\351\351\355\345\341\351\355\355\365\355\355\361\325\325\335\315\315\331"
+ "\202\323\323\331\4\345\345\351\365\365\371\361\361\365\371\371\371\203\371"
+ "\371\375\16\365\365\371\355\355\361\345\345\355\343\342\345\335\335\335\325"
+ "\325\335\311\311\311\265\265\265\235\234\237]y\30m\216\33\201\234$\217\276"
+ "$\231\311'\203\237\322,\211\233\320\26\15\251\300Xx\205\210\200\200\205\233"
+ "\233\250\313\304\315\217\217\222\313\304\315IUW\345\340\355.1:\375\367\375"
+ "DEJ\355\351\361\204\342\333\342\35\341\330\336\341\341\341\355\351\355\351"
+ "\341\345\355\351\355\251\244\260\33#,rqy\235\234\237\206\207\212\227\227"
+ "\232\251\244\260\351\341\345\334\325\335\341\330\336\351\341\345\311\301"
+ "\3109;I\251\244\260\227\227\2329;I\375\366\371\323\323\331\233\233\250\371"
+ "\363\372\222\230\242\200\200\205sz\205DEJ\207*2:\34*16*2:.1:\33#,\"*,TY_"
+ "\235\234\237\376\376\376.6:\33#,\203\212\224\200\200\205&*4fgfrqy\254\254"
+ "\262fgf9;I\"*,\227\227\232\254\254\262iku\"*,IUW*2:*16*2:*16\204*2:\16.6"
+ ":.1:*16*69\16\20\16\30""3)_mpTY_ikuIUW\222\230\242,??\6)\30\34?0\202\30""3"
+ ")\1\6)\30\202\16""4$\36ix{<QN\222\230\242Tegx\205\210_mpTY_\203\212\224I"
+ "UW\213\222\233,??\222\230\242Tegrqyix{<QN\222\230\242TY_\222\230\2423HE\203"
+ "\212\224x\205\210\217\217\222sz\205,??3HE\35""233HEIUWUlF\202]y\30\204m\216"
+ "\33\202}\243\25\203\217\265\23\251\233\320\26\11\271\326B\324\343\223\246"
+ "\253\221\200\200\205\227\227\232\252\252\254\271\271\272\302\302\304\323"
+ "\323\324\203\341\341\341\2\355\355\361\365\365\371\202\361\361\365\12\365"
+ "\365\371\345\345\355\343\342\345\355\355\361\361\361\365\355\355\365\361"
+ "\361\365\355\355\361\345\341\351\355\351\361\202\345\345\351\6\355\355\365"
+ "\345\345\355\335\335\345\345\345\355\351\351\355\351\351\361\202\355\355"
+ "\365\202\355\355\361\1\361\361\365\202\341\341\351\10\371\371\371\371\371"
+ "\375\375\375\371\365\365\371\351\351\355\361\361\365\371\371\371\361\361"
+ "\365\202\345\345\355\7\355\355\361\371\371\371\365\365\371z{|\3\3\3ikurq"
+ "y\202\271\271\272\35\16\20\16\0\0\0TY_-,-\275\275\276\235\234\237\322\314"
+ "\324\351\351\351\371\371\371\371\371\375\375\375\371\365\365\371\335\335"
+ "\335fgf\3\3\3\227\227\232\265\265\265\314\314\315\345\345\351\365\365\365"
+ "\375\375\371\371\371\375\365\365\365\323\323\324DEJ\3\3\3\227\227\232\311"
+ "\311\311\341\341\341\202\361\361\361*\311\311\311103\3\3\3\206\207\212\302"
+ "\302\304\323\323\324\314\314\315\227\227\232\31\34\32\16\20\16\206\207\212"
+ "\275\275\276\323\323\324\345\345\351\355\351\355\302\302\304DEJ\0\0\0\243"
+ "\242\244\275\275\276\331\331\335\355\355\361\361\361\361\252\252\254\16\20"
+ "\16iku\275\275\276\302\302\304\314\314\315\243\242\244\200\200\205\0\0\0"
+ """103\265\265\265\323\323\324\323\323\331IUW:::DEJ\341\341\341\345\345\355"
+ "\351\351\355\202\341\341\351\2\361\361\365\341\341\351\203\315\315\331\5"
+ "\325\325\335\355\355\361\365\361\371\361\361\365\365\365\371\202\371\371"
+ "\375\17\371\371\371\361\361\365\355\355\361\345\341\351\343\342\345\333\333"
+ "\341\323\323\324\302\302\304\261\261\264\235\234\237]y\30m\216\33\201\234"
+ "$\205\263\37\217\276$\203\237\322,\211\233\320\26\7\237\322,rqy\233\233\250"
+ "\203\212\224\257\255\267\206\207\212\371\363\372\202\227\227\232\4\206\207"
+ "\212sz\205\257\255\267\352\343\353\204\342\333\342\12\341\330\336\342\333"
+ "\342\227\227\232\313\304\315\273\265\277\314\314\315&*4rqy\303\274\304\273"
+ "\265\277\202\303\274\304\1\342\333\342\202\335\331\335\16\355\351\355iku"
+ "\371\360\365&*4\357\345\361iku\334\325\335\345\341\351\244\244\252\371\363"
+ "\372\200\200\205\213\222\233\200\200\205DEJ\203*2:\1*16\203*2:\1*16\202*"
+ "2:\2*16\33#,\202\22\35!\7DEJ\33#,rqy\375\375\371x\205\210\206\207\212\323"
+ "\323\324\202TY_\11IUWTY_\376\376\376z{|x\205\210\217\217\222\22\35!\"*,."
+ "1:\205*2:(.6:*16.6:*16*69\"#$\2\24\12_mp$>M\203\212\224$>M\213\222\233TY"
+ "_\213\222\233\2\24\12\6)\30\34?0\16""4$x\205\210IUW\235\234\237sz\205Teg"
+ "sz\2053HE\233\233\250<QN\222\230\242,??\203\212\224ix{_mpx\205\2103HE\254"
+ "\254\262IUW\203\212\224<QNx\205\210\203\212\224\202ix{\4\30""3),??\35""2"
+ "3<QN\202UlF\203]y\30\2m\216\33]y\30\203m\216\33\202}\243\25\203\217\265\23"
+ "\2\233\320\26\217\265\23\250\233\320\26\31\237\322,\324\343\223\262\270\222"
+ "\200\200\205\217\217\222\244\244\252\271\271\272\302\302\304\323\323\324"
+ "\335\335\335\345\345\351\335\335\345\351\351\355\365\365\365\361\361\365"
+ "\355\355\361\361\361\365\355\355\361\335\335\345\345\345\351\361\361\365"
+ "\355\355\361\355\355\365\355\355\361\343\342\345\202\345\345\355\1\343\342"
+ "\345\202\355\355\361\5\335\335\345\343\342\345\351\351\355\345\345\351\351"
+ "\351\355\202\355\355\361\5\355\351\361\355\355\361\351\351\355\335\335\345"
+ "\355\355\361\203\371\371\371\30\355\355\365\345\345\351\361\361\365\365\365"
+ "\371\351\351\355\345\345\351\345\345\355\361\361\365\361\361\361TY_103fg"
+ "f\243\242\244\302\302\304\217\217\222\"#$:::\200\200\205\343\342\345\302"
+ "\302\304\275\275\276\323\323\324\345\345\351\365\365\365\203\371\371\371"
+ "<\355\355\355\206\207\212DEJ\265\265\265\275\275\276\331\331\331\355\355"
+ "\355\365\365\371\371\371\371\365\365\365\235\234\237z{|DEJ103TY_\217\217"
+ "\222\323\323\324\351\351\351\252\252\254z{|DEJ:::103z{|\217\217\222z{|IU"
+ "Wz{|rqy\265\265\265\311\311\311\335\335\335\351\351\351\217\217\222\200\200"
+ "\205IUW103TY_\206\207\212\323\323\324\314\314\315\206\207\212z{|-,-fgf\227"
+ "\227\232\275\275\276\261\261\264\206\207\212z{|:::-,-z{|\261\261\264\323"
+ "\323\331z{|DEJiku\335\331\335\343\342\345\202\335\335\345\3\351\351\355\355"
+ "\351\361\323\323\331\202\313\313\323\13\315\315\331\335\335\345\361\361\365"
+ "\355\355\361\355\355\365\361\361\365\365\365\371\371\371\371\365\361\371"
+ "\355\355\365\351\351\355\202\335\335\345\13\333\333\341\322\314\324\302\302"
+ "\304\254\254\262\227\227\232]y\30m\216\33\201\234$\205\263\37\217\276$\231"
+ "\311'\214\237\322,\13\200\200\205\263\265\303iku\321\320\336\257\255\267"
+ "\311\301\310\371\360\365\357\345\361\375\375\375\371\360\365\352\343\353"
+ "\206\342\333\342\35\362\350\354\235\234\237\254\254\262\273\265\277\362\354"
+ "\362\257\255\267\233\233\250\342\333\342\322\314\324\261\261\264\313\304"
+ "\315\343\342\345\334\325\335\341\330\336\334\325\335\375\375\375&*4\375\375"
+ "\375iku&*4\365\357\365sz\205\217\217\222\355\351\371iku\243\245\264iku*2"
+ ":*16\202*2:\1*16\204*2:\1.6:\203*2:\14.1:*16\33#,*16\10\26\31""9;I\227\227"
+ "\232\351\351\355\200\200\205\331\331\331\351\351\351\5\10\15\202\33#,\6\371"
+ "\371\371\355\355\361*16\33#,.6:.1:\203*2:\1.6:\204*2:%*16*69\2\24\12\30""3"
+ ")Tegikuix{TY_sz\205,??\263\265\303\30:,ix{_mp\200\200\205\203\212\224TY_"
+ "ix{\35""23\261\261\2643HE\222\230\242IUWix{\203\212\224TY_\203\212\224!9"
+ "8\243\245\264<QN\213\222\233Tegsz\205\222\230\242IUWTeg\35""23\202,??\3I"
+ "UWUlFm\204>\202]y\30\205m\216\33\2}\243\25m\216\33\202}\243\25\202\205\263"
+ "\37\202\217\276$\202\231\311'\252\237\322,\16\324\343\223\313\315\253\200"
+ "\200\205\217\217\222\243\242\244\265\265\265\302\302\304\314\314\315\331"
+ "\331\335\343\342\345\333\333\341\343\342\345\361\361\365\361\361\361\203"
+ "\355\355\361\202\333\333\341\4\351\351\355\355\355\361\355\351\355\355\355"
+ "\361\202\335\335\345\11\345\345\351\335\335\345\351\351\355\355\355\365\341"
+ "\341\351\331\331\335\345\345\351\341\341\351\343\342\345\203\351\351\355"
+ "\5\345\345\351\351\351\355\333\333\341\343\342\345\361\361\365\202\365\365"
+ "\365\31\361\361\365\345\341\351\343\342\345\361\361\365\355\355\361\345\345"
+ "\351\343\342\345\351\351\355\355\355\355\235\234\237\252\252\254\235\234"
+ "\237\302\302\304\323\323\324\261\261\264z{|\265\265\265\335\335\335\271\271"
+ "\272\275\275\276\323\323\324\341\341\341\345\345\351\355\355\361\361\361"
+ "\365\202\365\365\365\7\355\355\355\275\275\276\217\217\222\271\271\272\314"
+ "\314\315\341\341\341\355\355\355\202\365\365\365\16\361\361\361\217\217\222"
+ "\227\227\232\243\242\244\235\234\237\217\217\222\243\242\244\311\311\311"
+ "\341\341\341\217\217\222\243\242\244\271\271\272\275\275\276\271\271\272"
+ "\202\265\265\265\2\302\302\304\331\331\331\202\275\275\276\6\311\311\311"
+ "\323\323\324\343\342\345\351\351\351\217\217\222\314\314\315\202\323\323"
+ "\324\5\314\314\315\254\254\262\314\314\315\271\271\272\261\261\264\203\323"
+ "\323\324\4\235\234\237\302\302\304\243\242\244\271\271\272\202\323\323\324"
+ "\7\331\331\331\265\265\265\244\244\252\302\302\304\303\303\313\302\302\304"
+ "\331\331\331\202\331\331\335\32\323\323\331\333\333\341\355\355\361\331\331"
+ "\335\313\313\323\312\305\321\305\304\321\313\313\323\341\341\351\355\355"
+ "\361\345\345\351\351\351\355\355\355\361\355\355\365\361\361\365\355\355"
+ "\361\355\351\361\341\341\351\331\331\335\333\333\341\331\331\335\314\314"
+ "\315\275\275\276\254\254\262\227\227\232]y\30\202m\216\33\2\201\234$\217"
+ "\276$\202\231\311'\2\237\322,\231\311'\211\237\322,\11\241\252v\243\245\264"
+ "rqy\257\255\267\313\304\315\257\255\267\352\343\353\342\333\342\341\330\336"
+ "\203\342\333\342\202\341\330\336\202\342\333\342\15\341\330\336\342\333\342"
+ "\365\357\365\311\301\310\352\343\353\200\200\205\312\305\321\200\200\205"
+ "\243\242\244\265\265\265\251\244\260\322\314\324\342\333\342\202\334\325"
+ "\335\17\343\342\345\341\330\336&*4\206\207\212\362\354\362\375\375\375\342"
+ "\333\342\264\264\272\322\314\324\305\304\321TY_\213\222\233iku*2:*16\211"
+ "*2:\1*16\203*2:\3*16*2:.6:\203\22\35!\3/7>\264\264\272IUW\202\33#,\5DEJT"
+ "Y_\5\10\15*2:*16\211*2:\24*16*69\30)$\2\24\12sz\205$>Msz\205\37""8B\213\222"
+ "\233IUWsz\205Tegz{|\203\212\2243HE\222\230\242!98\213\222\233<QNsz\205\202"
+ "ix{\17\203\212\224,??\213\222\2333HE\231\243\2513HEx\205\210sz\205x\205\210"
+ "\222\230\242,??3HE\21*$3HE<QN\202UlF\204]y\30\207m\216\33\3\201\234$}\243"
+ "\25\201\234$\202\205\263\37\203\217\276$\205\231\311'\243\237\322,\1\231"
+ "\311'\203\237\322,\17\310\325t\324\343\223\226\231\212\206\207\212\227\227"
+ "\232\254\254\262\275\275\276\311\311\311\323\323\331\341\341\341\331\331"
+ "\335\333\333\341\355\355\355\355\351\355\351\351\355\202\351\351\351\3\333"
+ "\333\341\323\323\331\335\335\345\202\351\351\351\24\351\351\355\335\335\345"
+ "\325\325\335\343\342\345\333\333\341\335\335\345\355\351\355\345\345\351"
+ "\323\323\331\331\331\335\335\335\345\331\331\335\343\342\345\345\345\351"
+ "\343\342\345\335\335\345\341\341\351\333\333\341\323\323\331\351\351\355"
+ "\203\355\355\355\5\345\345\351\333\333\341\345\345\351\355\351\355\343\342"
+ "\345\202\335\335\345\17\343\342\345\335\335\335\314\314\315\302\302\304\314"
+ "\314\315\335\331\331\335\335\335\323\323\324\302\302\304\275\275\276\302"
+ "\302\304\314\314\315\335\335\335\345\345\351\351\351\355\202\351\351\351"
+ "\202\355\355\355\7\355\351\355\341\341\341\331\331\331\323\323\324\331\331"
+ "\331\341\341\341\355\351\355\202\355\355\355\4\351\351\351\343\342\345\323"
+ "\323\324\311\311\311\202\275\275\276\2\302\302\304\323\323\324\202\335\335"
+ "\335\4\323\323\324\311\311\311\275\275\276\271\271\272\202\275\275\276\203"
+ "\302\302\304\7\314\314\315\323\323\324\341\341\341\351\351\351\345\345\351"
+ "\331\331\331\311\311\311\203\271\271\272\17\302\302\304\323\323\324\335\331"
+ "\335\331\331\331\314\314\315\271\271\272\252\252\254\265\265\265\314\314"
+ "\315\323\323\324\303\303\313\264\264\272\254\254\262\261\261\264\275\275"
+ "\276\202\271\271\272\36\312\305\321\331\331\335\335\331\335\331\331\331\315"
+ "\315\331\313\313\323\335\335\345\343\342\345\312\305\321\303\303\313\275"
+ "\275\312\302\302\304\315\315\331\345\345\351\343\342\345\335\335\345\345"
+ "\345\351\345\345\355\351\351\355\345\345\355\351\351\355\345\345\351\325"
+ "\325\335\323\323\331\331\331\335\323\323\324\303\303\313\271\271\272\252"
+ "\252\254\227\227\232\202]y\30\3m\216\33}\243\25\205\263\37\202\217\276$\213"
+ "\231\311'\10\251\300X\203\212\224\206\207\212\213\222\233\321\320\336\251"
+ "\244\260\314\314\315\352\343\353\203\342\333\342\202\362\354\362\17\376\376"
+ "\376\351\341\345\335\331\335\341\330\336\335\331\335\352\343\353\303\274"
+ "\304\235\234\237\257\255\267\273\265\277\313\304\315\303\274\304\357\345"
+ "\361\355\351\355\342\333\342\203\334\325\335\12\335\331\335\365\357\365\375"
+ "\375\375\345\341\351\334\325\335\342\333\342\325\325\341\235\234\237\375"
+ "\367\375\203\212\224\202\200\200\205\2IUW.1:\205*2:\1*16\206*2:\22*69*2:"
+ "*16.1:*16.6:*16&*4\"*,\5\10\15\33#,.1:.6:&*4\22\35!*2:*16.6:\204*2:\1*16"
+ "\202*2:\2.1:*2:\202*16\15\16\20\16\16""4$Tegsz\205_`lTY_\203\212\224IUW\213"
+ "\222\2333HE\213\222\233IUWsz\205\202TY_\22\203\212\224TY_\203\212\224*69"
+ "\222\230\242IUW\203\212\224Teg_mp\203\212\224sz\205\203\212\224\35""23,?"
+ "?\30""3)3HEIUWUlF\204]y\30\2m\216\33]y\30\206m\216\33\4}\243\25\201\234$"
+ "}\243\25\201\234$\205\205\263\37\202\217\276$\254\231\311'\11\251\300X\324"
+ "\343\223\246\253\221z{|\217\217\222\244\244\252\265\265\265\302\302\304\314"
+ "\314\315\202\331\331\335\16\323\323\331\343\342\345\345\345\351\343\342\345"
+ "\341\341\341\343\342\345\335\331\335\313\313\323\323\323\324\335\335\345"
+ "\341\341\341\343\342\345\331\331\335\313\313\323\202\325\325\335\1\323\323"
+ "\331\202\343\342\345\14\323\323\331\313\313\323\325\325\335\323\323\324\323"
+ "\323\331\331\331\335\333\333\341\331\331\335\325\325\335\331\331\335\313"
+ "\313\323\325\325\335\204\343\342\345\6\331\331\331\323\323\331\341\341\341"
+ "\343\342\345\331\331\335\325\325\335\202\331\331\335\202\323\323\324\1\323"
+ "\323\331\202\335\335\335\1\331\331\331\203\323\323\324\1\331\331\331\202"
+ "\341\341\341\202\343\342\345\1\341\341\341\203\343\342\345\5\341\341\341"
+ "\335\331\331\331\331\331\335\331\331\341\341\341\204\343\342\345\3\341\341"
+ "\341\331\331\331\323\323\324\202\314\314\315\202\323\323\324\202\335\335"
+ "\335\2\331\331\331\323\323\324\206\314\314\315\2\323\323\324\331\331\331"
+ "\202\335\335\335\4\335\331\335\323\323\331\323\323\324\313\313\323\203\314"
+ "\314\315\202\323\323\324\30\335\331\335\331\331\331\314\314\315\271\271\272"
+ "\275\275\276\314\314\315\323\323\324\311\311\311\302\302\304\273\273\304"
+ "\275\275\276\311\311\311\302\302\304\264\264\272\273\273\304\313\313\323"
+ "\331\331\331\323\323\331\313\313\323\303\303\313\313\313\323\333\333\341"
+ "\312\305\321\273\273\304\202\273\265\277\5\273\273\304\323\323\324\335\335"
+ "\345\323\323\331\325\325\335\202\333\333\341\14\335\335\345\335\335\335\341"
+ "\341\341\325\325\335\313\313\323\322\314\324\323\323\331\314\314\315\275"
+ "\275\276\265\265\265\244\244\252\217\217\222\202]y\30\202m\216\33\2\201\234"
+ "$\205\263\37\215\217\276$\7\200\200\205\243\245\264sz\205\313\313\323\261"
+ "\261\264\257\255\267\352\343\353\202\342\333\342\7\362\354\362\200\200\205"
+ "\303\303\313\21\20\27\312\305\321\362\350\354\342\333\342\203\341\330\336"
+ "\202\351\341\345\25\371\363\372\243\242\244\254\254\262\335\331\335\332\320"
+ "\330\325\325\335\322\314\324\342\333\342\355\351\361\371\363\372\206\207"
+ "\212\233\233\250\352\343\353\342\333\342\322\314\324\251\244\260\257\255"
+ "\267\342\333\342iku\243\245\264sz\205\203.1:\204*2:\202*16\1.6:\203*2:\3"
+ "*16*2:*16\203*2:\1*16\203*2:\1.6:\204*2:\4.1:*2:*16.1:\206*2:\2*16.1:\202"
+ "*69\32\30)$\2\24\12<QN\37""8B\213\222\233$>M\222\230\242,??\222\230\242_"
+ "mpTegix{,??\243\245\264<QN\213\222\233!98\203\212\224_mpikusz\205IUW\243"
+ "\245\264_mpx\205\210\35""23\202!98\1""3HE\202UlF\206]y\30\2m\216\33]y\30"
+ "\205m\216\33\6}\243\25\201\234$}\243\25\201\234$\205\263\37}\243\25\204\205"
+ "\263\37\256\217\276$\12\231\311'\237\322,\302\312\225\262\270\222z{|\206"
+ "\207\212\227\227\232\252\252\254\271\271\272\302\302\304\202\323\323\324"
+ "\4\314\314\315\323\323\331\335\335\335\331\331\335\203\323\323\331\6\311"
+ "\311\311\303\303\313\323\323\324\323\323\331\331\331\331\323\323\331\202"
+ "\311\311\311\5\323\323\324\312\305\321\323\323\331\335\331\335\323\323\324"
+ "\202\303\303\313\5\314\314\315\303\303\313\313\313\323\323\323\324\322\314"
+ "\324\202\313\313\323\4\303\303\313\302\302\304\323\323\331\335\331\331\203"
+ "\331\331\331\10\312\305\321\314\314\315\331\331\331\323\323\331\322\314\324"
+ "\313\313\323\323\323\324\323\323\331\202\323\323\324\202\331\331\331\204"
+ "\323\323\324\224\331\331\331\205\323\323\324\203\331\331\331\212\323\323"
+ "\324\2\313\313\323\314\314\315\202\323\323\324\1\331\331\331\204\323\323"
+ "\324\10\331\331\331\323\323\324\311\311\311\273\273\304\302\302\304\323\323"
+ "\324\314\314\315\302\302\304\202\273\273\304\3\302\302\304\313\313\323\311"
+ "\311\311\202\264\264\272\11\302\302\304\313\313\323\322\314\324\303\303\313"
+ "\275\275\276\271\271\272\313\313\323\311\311\311\264\264\272\202\257\255"
+ "\267\11\264\264\272\273\273\304\323\323\324\314\314\315\303\303\313\314\314"
+ "\315\313\313\323\323\323\324\313\313\323\202\323\323\331\2\303\303\313\302"
+ "\302\304\202\311\311\311\5\273\273\304\264\264\272\261\261\264\243\242\244"
+ "\217\217\222\203]y\30\2m\216\33}\243\25\203\205\263\37\213\217\276$\17\241"
+ "\252v\200\200\205sz\205\213\222\233\365\357\365\227\227\232\314\314\315\352"
+ "\343\353\375\375\375TY_\342\333\342\5\10\15\376\376\376_`l\355\351\361\202"
+ "\341\330\336\2\342\333\342\341\330\336\202\342\333\342\26\334\325\335\332"
+ "\320\330\322\314\324\303\274\304\264\264\272\261\261\264\343\342\345\342"
+ "\333\342TY_\217\217\222_`l\244\244\252\357\345\361\345\341\351\312\305\321"
+ "\217\217\222\375\375\375\233\233\250rqy\203\212\224TY_\30)$\202\"*,\5*16"
+ ".6:/7>.1:*16\205*2:\1*16\204*2:\1*16\210*2:\202*16\203*2:\1*16\204*2:\2*"
+ "69*2:\202*16\33\"*,\16\20\16,N<]y\30<QNTegikux\205\210IUWx\205\210*69\231"
+ "\243\2513HE\231\243\251IUWikux\205\210IUW\213\222\233IUW\231\243\2513HEI"
+ "UW\30)$!983HE<QN\202UlF\210]y\30\206m\216\33\2}\243\25\201\234$\202}\243"
+ "\25\3\201\234$}\243\25\201\234$\210\205\263\37\2\217\276$\205\263\37\251"
+ "\217\276$\20\205\263\37\217\276$\264\277q\302\312\225\200\200\205z{|\217"
+ "\217\222\243\242\244\254\254\262\271\271\272\302\302\304\311\311\311\302"
+ "\302\304\303\303\313\323\323\324\314\314\315\203\311\311\311\3\302\302\304"
+ "\271\271\272\275\275\276\202\311\311\311\6\314\314\315\302\302\304\264\264"
+ "\272\302\302\304\275\275\276\302\302\304\202\314\314\315\3\275\275\276\264"
+ "\264\272\273\273\304\202\275\275\276\203\302\302\304\4\273\273\304\302\302"
+ "\304\264\264\272\302\302\304\204\314\314\315\5\311\311\311\273\265\277\302"
+ "\302\304\314\314\315\311\311\311\202\302\302\304\204\311\311\311\203\314"
+ "\314\315\202\311\311\311\237\314\314\315\203\311\311\311\1\303\303\313\203"
+ "\302\302\304\202\311\311\311\207\314\314\315\12\311\311\311\273\273\304\261"
+ "\261\264\275\275\276\311\311\311\302\302\304\271\271\272\264\264\272\261"
+ "\261\264\271\271\272\202\302\302\304\13\257\255\267\254\254\262\264\264\272"
+ "\302\302\304\303\303\313\273\273\304\261\261\264\251\244\260\275\275\276"
+ "\302\302\304\257\255\267\203\244\244\252\3\252\252\254\273\265\277\311\311"
+ "\311\202\271\271\272\1\273\273\304\203\302\302\304\13\311\311\311\302\302"
+ "\304\264\264\272\271\271\272\273\273\304\275\275\276\261\261\264\254\254"
+ "\262\252\252\254\235\234\237\217\217\222\203]y\30\202m\216\33\202}\243\25"
+ "\214\205\263\37\24\217\276$\200\200\205\243\245\264iku\305\304\321\357\345"
+ "\361\235\234\237\332\320\330\375\375\375\21\20\27\217\217\22201?\200\200"
+ "\205iku\375\366\371\334\325\335\341\330\336\343\342\345\352\343\353\251\244"
+ "\260\202\273\265\277\35\243\242\244\254\254\262\264\264\272\312\305\321\345"
+ "\341\351\352\343\353\251\244\260\365\361\371TY_\273\265\277\251\244\260\227"
+ "\227\232\332\325\341\257\255\267\334\325\335\332\325\341TY_\243\245\264s"
+ "z\205\"*,\31\34\32\"#$\30)$\"*,\"#$&*4*16*2:.1:\211*2:\1*16\206*2:\3*16*"
+ "2:*69\206*2:\1.6:\202*2:\2.1:*2:\202*16\2\31\34\32\21*$\202]y\30\23Teg\30"
+ """3)\243\245\264,??\213\222\233<QNsz\205x\205\210_`l\213\222\233,??\222\230"
+ "\242<QN\244\244\252,??3HE\21*$!98<QN\202UlF\212]y\30\207m\216\33\2}\243\25"
+ "m\216\33\202}\243\25\1\201\234$\202}\243\25\4\205\263\37}\243\25\205\263"
+ "\37}\243\25\262\205\263\37\14\251\300X\302\312\225\216\225{rqy\200\200\205"
+ "\217\217\222\235\234\237\252\252\254\265\265\265\271\271\272\264\264\272"
+ "\265\265\265\202\275\275\276\204\271\271\272\12\254\254\262\252\252\254\264"
+ "\264\272\271\271\272\275\275\276\264\264\272\254\254\262\261\261\264\264"
+ "\264\272\261\261\264\202\275\275\276\1\271\271\272\202\252\252\254\7\254"
+ "\254\262\252\252\254\254\254\262\264\264\272\261\261\264\254\254\262\261"
+ "\261\264\202\252\252\254\11\271\271\272\275\275\276\271\271\272\275\275\276"
+ "\271\271\272\261\261\264\252\252\254\265\265\265\271\271\272\203\264\264"
+ "\272\207\271\271\272\1\275\275\276\213\271\271\272\206\275\275\276\1\271"
+ "\271\272\212\275\275\276\2\271\271\272\275\275\276\210\271\271\272\210\275"
+ "\275\276\7\271\271\272\254\254\262\244\244\252\254\254\262\271\271\272\265"
+ "\265\265\252\252\254\202\244\244\252\17\252\252\254\265\265\265\271\271\272"
+ "\244\244\252\235\234\237\243\242\244\254\254\262\264\264\272\261\261\264"
+ "\244\244\252\235\234\237\244\244\252\264\264\272\252\252\254\235\234\237"
+ "\203\227\227\232\14\244\244\252\264\264\272\254\254\262\244\244\252\252\252"
+ "\254\254\254\262\261\261\264\254\254\262\261\261\264\271\271\272\252\252"
+ "\254\244\244\252\202\254\254\262\1\252\252\254\202\244\244\252\3\243\242"
+ "\244\217\217\222\206\207\212",
+};
+
diff --git a/src/libXNVCtrl/NVCtrl.c b/src/libXNVCtrl/NVCtrl.c
index 2f8b352..f20b9be 100644
--- a/src/libXNVCtrl/NVCtrl.c
+++ b/src/libXNVCtrl/NVCtrl.c
@@ -13,8 +13,8 @@
#include <stdlib.h>
#include <X11/Xlibint.h>
#include <X11/Xutil.h>
-#include "Xext.h"
-#include "extutil.h"
+#include <X11/extensions/Xext.h>
+#include <X11/extensions/extutil.h>
#include "NVCtrlLib.h"
#include "nv_control.h"
@@ -154,6 +154,44 @@ void XNVCTRLSetAttribute (
SyncHandle ();
}
+Bool XNVCTRLSetAttributeAndGetStatus (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int attribute,
+ int value
+){
+ XExtDisplayInfo *info = find_display (dpy);
+ xnvCtrlSetAttributeAndGetStatusReq *req;
+ xnvCtrlSetAttributeAndGetStatusReply rep;
+ Bool success;
+
+ if(!XextHasExtension(info))
+ return False;
+
+ XNVCTRLCheckExtension (dpy, info, False);
+
+ LockDisplay (dpy);
+ GetReq (nvCtrlSetAttributeAndGetStatus, req);
+ req->reqType = info->codes->major_opcode;
+ req->nvReqType = X_nvCtrlSetAttributeAndGetStatus;
+ req->screen = screen;
+ req->display_mask = display_mask;
+ req->attribute = attribute;
+ req->value = value;
+ if (!_XReply (dpy, (xReply *) &rep, 0, False)) {
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return False;
+ }
+ UnlockDisplay (dpy);
+ SyncHandle ();
+
+ success = rep.flags;
+ return success;
+}
+
+
Bool XNVCTRLQueryAttribute (
Display *dpy,
@@ -243,6 +281,51 @@ Bool XNVCTRLQueryStringAttribute (
return exists;
}
+
+Bool XNVCTRLSetStringAttribute (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int attribute,
+ char *ptr
+){
+ XExtDisplayInfo *info = find_display (dpy);
+ xnvCtrlSetStringAttributeReq *req;
+ xnvCtrlSetStringAttributeReply rep;
+ int size;
+ Bool success;
+
+ if(!XextHasExtension(info))
+ return False;
+
+ XNVCTRLCheckExtension (dpy, info, False);
+
+ size = strlen(ptr)+1;
+
+ LockDisplay (dpy);
+ GetReq (nvCtrlSetStringAttribute, req);
+ req->reqType = info->codes->major_opcode;
+ req->nvReqType = X_nvCtrlSetStringAttribute;
+ req->screen = screen;
+ req->display_mask = display_mask;
+ req->attribute = attribute;
+ req->length += ((size + 3) & ~3) >> 2;
+ req->num_bytes = size;
+ Data(dpy, ptr, size);
+
+ if (!_XReply (dpy, (xReply *) &rep, 0, False)) {
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return False;
+ }
+ UnlockDisplay (dpy);
+ SyncHandle ();
+
+ success = rep.flags;
+ return success;
+}
+
+
Bool XNVCTRLQueryValidAttributeValues (
Display *dpy,
int screen,
@@ -403,6 +486,494 @@ Bool XNVCtrlSelectNotify (
return True;
}
+
+Bool XNVCTRLQueryDDCCILutSize (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int *red_entries,
+ unsigned int *green_entries,
+ unsigned int *blue_entries,
+ unsigned int *red_bits_per_entries,
+ unsigned int *green_bits_per_entries,
+ unsigned int *blue_bits_per_entries
+) {
+ XExtDisplayInfo *info = find_display (dpy);
+ xnvCtrlQueryDDCCILutSizeReply rep;
+ xnvCtrlQueryDDCCILutSizeReq *req;
+ unsigned int buf[6];
+ Bool exists;
+
+ if(!XextHasExtension(info))
+ return False;
+
+ XNVCTRLCheckExtension (dpy, info, False);
+
+ LockDisplay (dpy);
+
+ GetReq (nvCtrlQueryDDCCILutSize, req);
+ req->reqType = info->codes->major_opcode;
+ req->nvReqType = X_nvCtrlQueryDDCCILutSize;
+ req->screen = screen;
+ req->display_mask = display_mask;
+
+ if (!_XReply(dpy, (xReply *) &rep, 0, xFalse)) {
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return False;
+ }
+
+ _XRead(dpy, (char *)(&buf), 24);
+
+ *red_entries = buf[0];
+ *green_entries = buf[1];
+ *blue_entries = buf[2];
+ *red_bits_per_entries = buf[3];
+ *green_bits_per_entries = buf[4];
+ *blue_bits_per_entries = buf[5];
+
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ exists = rep.flags;
+ return exists;
+}
+
+
+Bool XNVCTRLQueryDDCCISinglePointLutOperation (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int offset,
+ unsigned int *red_value,
+ unsigned int *green_value,
+ unsigned int *blue_value
+) {
+ XExtDisplayInfo *info = find_display (dpy);
+ xnvCtrlQueryDDCCISinglePointLutOperationReply rep;
+ xnvCtrlQueryDDCCISinglePointLutOperationReq *req;
+ unsigned int buf[4];
+ Bool exists;
+
+ if(!XextHasExtension(info))
+ return False;
+
+ XNVCTRLCheckExtension (dpy, info, False);
+
+ LockDisplay (dpy);
+
+ GetReq (nvCtrlQueryDDCCISinglePointLutOperation, req);
+ req->reqType = info->codes->major_opcode;
+ req->nvReqType = X_nvCtrlQueryDDCCISinglePointLutOperation;
+ req->screen = screen;
+ req->display_mask = display_mask;
+ req->offset = offset;
+
+ if (!_XReply(dpy, (xReply *) &rep, 0, xFalse)) {
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return False;
+ }
+
+ _XRead(dpy, (char *)(&buf), 12);
+
+ *red_value = buf[0];
+ *green_value = buf[1];
+ *blue_value = buf[2];
+
+ UnlockDisplay (dpy);
+ SyncHandle ();
+
+ exists=rep.flags;
+ return exists;
+}
+
+
+Bool XNVCTRLSetDDCCISinglePointLutOperation (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int offset,
+ unsigned int red_value,
+ unsigned int green_value,
+ unsigned int blue_value
+) {
+ XExtDisplayInfo *info = find_display (dpy);
+ xnvCtrlSetDDCCISinglePointLutOperationReply rep;
+ xnvCtrlSetDDCCISinglePointLutOperationReq *req;
+ Bool success;
+
+ if(!XextHasExtension(info))
+ return False;
+
+ XNVCTRLCheckExtension (dpy, info, False);
+
+ LockDisplay (dpy);
+ GetReq (nvCtrlSetDDCCISinglePointLutOperation, req);
+ req->reqType = info->codes->major_opcode;
+ req->nvReqType = X_nvCtrlSetDDCCISinglePointLutOperation;
+ req->screen = screen;
+ req->display_mask = display_mask;
+ req->offset = offset;
+ req->red_value = red_value;
+ req->green_value = green_value;
+ req->blue_value = blue_value;
+
+ if (!_XReply (dpy, (xReply *) &rep, 0, False)) {
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return False;
+ }
+ UnlockDisplay (dpy);
+ SyncHandle ();
+
+ success = rep.flags;
+ return success;
+}
+
+
+Bool XNVCTRLQueryDDCCIBlockLutOperation (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int color, // NV_CTRL_DDCCI_RED_LUT, NV_CTRL_DDCCI_GREEN_LUT, NV_CTRL_DDCCI_BLUE_LUT
+ unsigned int offset,
+ unsigned int size,
+ unsigned int **value
+) {
+ XExtDisplayInfo *info = find_display (dpy);
+ xnvCtrlQueryDDCCIBlockLutOperationReply rep;
+ xnvCtrlQueryDDCCIBlockLutOperationReq *req;
+ Bool exists;
+ int length, slop;
+ char *ptr;
+
+ if(!XextHasExtension(info))
+ return False;
+
+ XNVCTRLCheckExtension (dpy, info, False);
+
+ LockDisplay (dpy);
+ GetReq (nvCtrlQueryDDCCIBlockLutOperation, req);
+ req->reqType = info->codes->major_opcode;
+ req->nvReqType = X_nvCtrlQueryDDCCIBlockLutOperation;
+ req->screen = screen;
+ req->display_mask = display_mask;
+ req->color=color;
+ req->offset=offset;
+ req->size=size;
+ if (!_XReply (dpy, (xReply *) &rep, 0, False)) {
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return False;
+ }
+ length = rep.length;
+ slop = rep.num_bytes & 3;
+ ptr = (char *) Xmalloc(rep.num_bytes);
+ if (! ptr) {
+ _XEatData(dpy, length);
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return False;
+ } else {
+ _XRead(dpy, (char *) ptr, rep.num_bytes);
+ if (slop) _XEatData(dpy, 4-slop);
+ }
+ exists = rep.flags;
+ if(exists) {
+ *value=(unsigned int *)ptr;
+ }
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return exists;
+}
+
+
+Bool XNVCTRLSetDDCCIBlockLutOperation (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int color, // NV_CTRL_DDCCI_RED_LUT, NV_CTRL_DDCCI_GREEN_LUT, NV_CTRL_DDCCI_BLUE_LUT
+ unsigned int offset,
+ unsigned int size,
+ unsigned int *value
+) {
+ XExtDisplayInfo *info = find_display (dpy);
+ xnvCtrlSetDDCCIBlockLutOperationReq *req;
+ xnvCtrlSetDDCCIBlockLutOperationReply rep;
+ Bool success;
+
+ if(!XextHasExtension(info))
+ return False;
+
+ XNVCTRLCheckExtension (dpy, info, False);
+
+ LockDisplay (dpy);
+ GetReq (nvCtrlSetDDCCIBlockLutOperation, req);
+ req->reqType = info->codes->major_opcode;
+ req->nvReqType = X_nvCtrlSetDDCCIBlockLutOperation;
+ req->screen = screen;
+ req->display_mask = display_mask;
+ req->color = color;
+ req->offset = offset;
+ req->size = size;
+ req->num_bytes = size << 2;
+ req->length += (req->num_bytes + 3) >> 2;
+ Data(dpy, (char *)value, req->num_bytes );
+
+ if (!_XReply (dpy, (xReply *) &rep, 0, False)) {
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return False;
+ }
+ UnlockDisplay (dpy);
+ SyncHandle ();
+
+ success = rep.flags;
+ return success;
+}
+
+
+Bool XNVCTRLSetDDCCIRemoteProcedureCall (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int offset,
+ unsigned int size,
+ unsigned int *red_lut,
+ unsigned int *green_lut,
+ unsigned int *blue_lut,
+ unsigned int *increment
+) {
+ XExtDisplayInfo *info = find_display (dpy);
+ xnvCtrlSetDDCCIRemoteProcedureCallReq *req;
+ xnvCtrlSetDDCCIRemoteProcedureCallReply rep;
+ unsigned int nbytes;
+ Bool success;
+
+ if(!XextHasExtension(info))
+ return False;
+
+ XNVCTRLCheckExtension (dpy, info, False);
+
+ LockDisplay (dpy);
+ GetReq (nvCtrlSetDDCCIRemoteProcedureCall, req);
+ req->reqType = info->codes->major_opcode;
+ req->nvReqType = X_nvCtrlSetDDCCIRemoteProcedureCall;
+ req->screen = screen;
+ req->display_mask = display_mask;
+ req->size = size;
+ nbytes= size << 2;
+ req->num_bytes = nbytes * 4;
+ req->length += (req->num_bytes + 3) >> 2;
+ req->offset = offset;
+ Data(dpy, (char *)red_lut, nbytes );
+ Data(dpy, (char *)green_lut, nbytes );
+ Data(dpy, (char *)blue_lut, nbytes );
+ Data(dpy, (char *)increment, nbytes );
+
+ if (!_XReply (dpy, (xReply *) &rep, 0, False)) {
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return False;
+ }
+ UnlockDisplay (dpy);
+ SyncHandle ();
+
+ success = rep.flags;
+ return success;
+}
+
+/* XXXAlternative: Instead of getting the manufacturer string from the server,
+ * get the manufacturer Id instead, and have controller_manufacturer assigned
+ * to a static string that would not need to be malloc'ed and freed.
+ */
+Bool XNVCTRLQueryDDCCIDisplayControllerType (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned char **controller_manufacturer,
+ unsigned int *controller_type
+)
+{
+ XExtDisplayInfo *info = find_display (dpy);
+ xnvCtrlQueryDDCCIDisplayControllerTypeReply rep;
+ xnvCtrlQueryDDCCIDisplayControllerTypeReq *req;
+ Bool exists;
+ int length, numbytes, slop;
+ char *ptr;
+
+ if(!XextHasExtension(info))
+ return False;
+
+ XNVCTRLCheckExtension (dpy, info, False);
+
+ LockDisplay (dpy);
+ GetReq (nvCtrlQueryDDCCIDisplayControllerType, req);
+ req->reqType = info->codes->major_opcode;
+ req->nvReqType = X_nvCtrlQueryDDCCIDisplayControllerType;
+ req->screen = screen;
+ req->display_mask = display_mask;
+ if (!_XReply (dpy, (xReply *) &rep, 0, False)) {
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return False;
+ }
+ length = rep.length;
+ numbytes = rep.size;
+ slop = numbytes & 3;
+ ptr = (char *) Xmalloc(numbytes);
+ if (! ptr) {
+ _XEatData(dpy, length);
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return False;
+ } else {
+ _XRead(dpy, (char *) ptr, numbytes);
+ if (slop) _XEatData(dpy, 4-slop);
+ }
+ exists = rep.flags;
+ if(exists) {
+ *controller_type=rep.controller_type;
+ *controller_manufacturer=ptr;
+ }
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return exists;
+}
+
+
+Bool NVCTRLQueryDDCCICapabilities (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int **nvctrl_vcp_supported,
+ unsigned int **possible_values_offset,
+ unsigned int **possible_values_size,
+ unsigned int **nvctrl_vcp_possible_values,
+ unsigned int **nvctrl_string_vcp_supported
+)
+{
+ XExtDisplayInfo *info = find_display (dpy);
+ xnvCtrlQueryDDCCICapabilitiesReply rep;
+ xnvCtrlQueryDDCCICapabilitiesReq *req;
+ Bool exists=1;
+ int length, numbytes, slop;
+ char *ptr, *p;
+ int len1, len2, len3, len4, len5;
+ int step;
+
+ *nvctrl_vcp_supported=*nvctrl_vcp_possible_values=*possible_values_offset=*possible_values_size=*nvctrl_string_vcp_supported=NULL;
+
+ if(!XextHasExtension(info))
+ return False;
+
+ XNVCTRLCheckExtension (dpy, info, False);
+
+ LockDisplay (dpy);
+
+ GetReq (nvCtrlQueryDDCCICapabilities, req);
+ req->reqType = info->codes->major_opcode;
+ req->nvReqType = X_nvCtrlQueryDDCCICapabilities;
+
+ req->screen = screen;
+ req->display_mask = display_mask;
+ if (!_XReply (dpy, (xReply *) &rep, 0, False)) {
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return False;
+ }
+ length = rep.length;
+ numbytes = rep.num_bytes;
+ slop = numbytes & 3;
+ ptr = (char *) Xmalloc(numbytes);
+ if (! ptr) {
+ _XEatData(dpy, length);
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return False;
+ } else {
+ _XRead(dpy, (char *) ptr, numbytes);
+ if (slop) _XEatData(dpy, 4-slop);
+ }
+ exists = rep.flags;
+ if(exists) {
+ p = ptr;
+ len1 = len2 = len3 = (NV_CTRL_DDCCI_LAST_VCP+1) << 2 ;
+ len4 = rep.possible_val_len << 2;
+ len5 = (NV_CTRL_STRING_LAST_ATTRIBUTE+1) << 2;
+ *nvctrl_vcp_supported=(unsigned int *) Xmalloc(len1);
+ *possible_values_offset=(unsigned int *) Xmalloc(len2);
+ *possible_values_size=(unsigned int *) Xmalloc(len3);
+ if(len4)
+ *nvctrl_vcp_possible_values=(unsigned int *) Xmalloc(len4);
+ *nvctrl_string_vcp_supported=(unsigned int *) Xmalloc(len5);
+ memcpy((char*)*nvctrl_vcp_supported, p, len1); p += len1;
+ memcpy((char*)*possible_values_offset, p, len2); p += len2;
+ memcpy((char*)*possible_values_size, p, len3); p += len3;
+ if(len4) {
+ memcpy((char*)*nvctrl_vcp_possible_values, p, len4); p += len4;
+ }
+ memcpy((char*)*nvctrl_string_vcp_supported, p, len5);
+ }
+ free(ptr);
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return exists;
+}
+
+Bool XNVCTRLQueryDDCCITimingReport (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int *sync_freq_out_range,
+ unsigned int *unstable_count,
+ unsigned int *positive_h_sync,
+ unsigned int *positive_v_sync,
+ unsigned int *h_freq,
+ unsigned int *v_freq
+) {
+ XExtDisplayInfo *info = find_display (dpy);
+ xnvCtrlQueryDDCCITimingReportReply rep;
+ xnvCtrlQueryDDCCITimingReportReq *req;
+ unsigned int buf[6];
+ Bool exists;
+
+ if(!XextHasExtension(info))
+ return False;
+
+ XNVCTRLCheckExtension (dpy, info, False);
+
+ LockDisplay (dpy);
+
+ GetReq (nvCtrlQueryDDCCITimingReport, req);
+ req->reqType = info->codes->major_opcode;
+ req->nvReqType = X_nvCtrlQueryDDCCITimingReport;
+ req->screen = screen;
+ req->display_mask = display_mask;
+
+ if (!_XReply(dpy, (xReply *) &rep, 0, xFalse)) {
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ return False;
+ }
+
+ _XRead(dpy, (char *)(&buf), 24);
+
+ exists = rep.flags;
+
+ *sync_freq_out_range = buf[0];
+ *unstable_count = buf[1];
+ *positive_h_sync = buf[2];
+ *positive_v_sync = buf[3];
+ *h_freq = buf[4];
+ *v_freq = buf[5];
+
+ UnlockDisplay (dpy);
+ SyncHandle ();
+
+ return exists;
+}
+
static Bool wire_to_event (Display *dpy, XEvent *host, xEvent *wire)
{
XExtDisplayInfo *info = find_display (dpy);
diff --git a/src/libXNVCtrl/NVCtrl.h b/src/libXNVCtrl/NVCtrl.h
index caea219..7561010 100644
--- a/src/libXNVCtrl/NVCtrl.h
+++ b/src/libXNVCtrl/NVCtrl.h
@@ -804,13 +804,20 @@
#define NV_CTRL_GVO_VIDEO_FORMAT_1080P_29_97_SMPTE274 14
#define NV_CTRL_GVO_VIDEO_FORMAT_1080P_30_00_SMPTE274 15
#define NV_CTRL_GVO_VIDEO_FORMAT_720P_50_00_SMPTE296 16
-#define NV_CTRL_GVO_VIDEO_FORMAT_1080I_24_00_SMPTE274 17
-#define NV_CTRL_GVO_VIDEO_FORMAT_1080I_23_98_SMPTE274 18
+#define NV_CTRL_GVO_VIDEO_FORMAT_1080I_24_00_SMPTE274 17 //deprecated
+#define NV_CTRL_GVO_VIDEO_FORMAT_1080I_48_00_SMPTE274 17
+#define NV_CTRL_GVO_VIDEO_FORMAT_1080I_23_98_SMPTE274 18 //deprecated
+#define NV_CTRL_GVO_VIDEO_FORMAT_1080I_47_96_SMPTE274 18
#define NV_CTRL_GVO_VIDEO_FORMAT_720P_30_00_SMPTE296 19
#define NV_CTRL_GVO_VIDEO_FORMAT_720P_29_97_SMPTE296 20
#define NV_CTRL_GVO_VIDEO_FORMAT_720P_25_00_SMPTE296 21
#define NV_CTRL_GVO_VIDEO_FORMAT_720P_24_00_SMPTE296 22
#define NV_CTRL_GVO_VIDEO_FORMAT_720P_23_98_SMPTE296 23
+#define NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_25_00_SMPTE274 24
+#define NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_29_97_SMPTE274 25
+#define NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_30_00_SMPTE274 26
+#define NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_24_00_SMPTE274 27
+#define NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_23_98_SMPTE274 28
/*
@@ -1006,14 +1013,1347 @@
* XXX what sync error attributes do we need to expose?
*/
+/*
+ * NV_CTRL_GPU_OVERCLOCKING_STATE - query the current or set a new
+ * overclocking state; the value of this attribute controls the
+ * availability of additional overclocking attributes (see below).
+ *
+ * Note: this attribute is unavailable unless overclocking support
+ * has been enabled in the X server (by the user).
+ */
+
+#define NV_CTRL_GPU_OVERCLOCKING_STATE 88 /* RW- */
+#define NV_CTRL_GPU_OVERCLOCKING_STATE_NONE 0
+#define NV_CTRL_GPU_OVERCLOCKING_STATE_MANUAL 1
+
+
+/*
+ * NV_CTRL_GPU_{2,3}D_CLOCK_FREQS - query or set the GPU and memory
+ * clocks of the device driving the X screen. New clock frequencies
+ * are tested before being applied, and may be rejected.
+ *
+ * Note: if the target clocks are too aggressive, their testing may
+ * render the system unresponsive.
+ *
+ * Note: while this attribute can always be queried, it can't be set
+ * unless NV_CTRL_GPU_OVERCLOCKING_STATE is set to _MANUAL. Since
+ * the target clocks may be rejected, the requester should read this
+ * attribute after the set to determine success or failure.
+ */
+
+#define NV_CTRL_GPU_2D_CLOCK_FREQS 89 /* RW- */
+#define NV_CTRL_GPU_3D_CLOCK_FREQS 90 /* RW- */
+
+
+/*
+ * NV_CTRL_GPU_DEFAULT_{2,3}D_CLOCK_FREQS - query the default memory
+ * and GPU core clocks of the device driving the X screen.
+ */
+
+#define NV_CTRL_GPU_DEFAULT_2D_CLOCK_FREQS 91 /* R-- */
+#define NV_CTRL_GPU_DEFAULT_3D_CLOCK_FREQS 92 /* R-- */
+
+/*
+ * NV_CTRL_GPU_CURRENT_CLOCK_FREQS - query the current GPU and memory
+ * clocks of the graphics device driving the X screen.
+ */
+
+#define NV_CTRL_GPU_CURRENT_CLOCK_FREQS 93 /* R-- */
+
+
+/*
+ * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS - Holds the last calculated
+ * optimal 3D clock frequencies found by the
+ * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION process. Querying this
+ * attribute before having probed for the optimal clocks will return
+ * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_INVALID
+ *
+ * Note: unless NV_CTRL_GPU_OVERCLOCKING_STATE is set to _MANUAL, the
+ * optimal clock detection process is unavailable.
+ */
+
+#define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS 94 /* R-- */
+#define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_INVALID 0
+
+
+/*
+ * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION - set to _START to
+ * initiate testing for the optimal 3D clock frequencies. Once
+ * found, the optimal clock frequencies will be returned by the
+ * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS attribute asynchronously
+ * (using an X event, see XNVCtrlSelectNotify).
+ *
+ * To cancel an ongoing test for the optimal clocks, set the
+ * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION attribute to _CANCEL
+ *
+ * Note: unless NV_CTRL_GPU_OVERCLOCKING_STATE is set to _MANUAL, the
+ * optimal clock detection process is unavailable.
+ */
+
+#define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION 95 /* -W- */
+#define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_START 0
+#define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_CANCEL 1
+
+
+/*
+ * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE - query this
+ * variable to know if a test is currently being run to
+ * determine the optimal 3D clock frequencies. _BUSY means a
+ * test is currently running, _IDLE means the test is not running.
+ *
+ * Note: unless NV_CTRL_GPU_OVERCLOCKING_STATE is set to _MANUAL, the
+ * optimal clock detection process is unavailable.
+ */
+
+#define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE 96 /* R-- */
+#define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_IDLE 0
+#define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_BUSY 1
+
+
+
+/*************************************************************************
+ * DDC/CI VCP codes *
+ * From the VESA Monitor Control Command Set (MCCS) Standard - Version 2 *
+ *************************************************************************/
+
+#define NV_CTRL_DDCCI_ON 1
+#define NV_CTRL_DDCCI_OFF 0
+
+/*************************************
+ * DDC/CI VCP CODES: GEOMETRY ADJUST *
+ *************************************/
+
+/* Increasing (decreasing) this value moves the image toward the right
+ * (left) side of the screen.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_POSITION 97 /* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the width
+ * of the image.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_SIZE 98 /* RWD */
+
+/* Increasing (decreasing) this value will cause the right and left sides
+ * of the image to become more (less) convex.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_PINCUSHION 99 /* RWD */
+
+/* Increasing (decreasing) this value will move the center section of the
+ * image towards the right(left) side of the display.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_PINCUSHION_BALANCE 100/* RWD */
+
+/* Increasing (decreasing) this value will shift the red pixels to the right
+ * (left) across the image and the blue pixels left (right) across the image
+ * with respect to the green pixels.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_CONVERGENCE 101/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * density of pixels in the image center.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_LINEARITY 102/* RWD */
+
+/* Increasing (decreasing) this value shifts the density of pixels from
+ * the left (right) side to the right (left) side of the image.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_LINEARITY_BALANCE 103/* RWD */
+
+/* Increasing (decreasing) this value moves the image toward the
+ * top (bottom) edge of the display.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_VERTICAL_POSITION 104/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * height of the image
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_VERTICAL_SIZE 105/* RWD */
+
+/* Increasing (decreasing) this value will cause the top and bottom
+ * edges of the image to become more (less) convex.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_VERTICAL_PINCUSHION 106/* RWD */
+
+/* Increasing (decreasing) this value will move the center section of
+ * the image toward the top (bottom) edge of the display.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_VERTICAL_PINCUSHION_BALANCE 107/* RWD */
+
+/* Increasing (decreasing) this value shifts the red pixels up (down)
+ * across the image and the blue pixels down (up) across the image
+ * with respect to the green pixels.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_VERTICAL_CONVERGENCE 108/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * density of scan lines in the image center.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_VERTICAL_LINEARITY 109/* RWD */
+
+/* Increasing (decreasing) this value shifts the density of scan lines
+ * from the top (bottom) end to the bottom (top) end of the image.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_VERTICAL_LINEARITY_BALANCE 110/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * degree of keystone distortion in the image.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_KEYSTONE 111/* RWD */
+
+/* Increasing (decreasing) this value shifts the top section of the
+ * image to the right (left) with respect to the bottom section of the
+ * image.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_KEY_BALANCE 112/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * degree of trapezoid distortion in the image.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_TRAPEZOID 113/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * ratio between the horizontal size at the top of the image and the
+ * horizontal size at the bottom of the image.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_TRAPEZOID 114/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * ratio between the vertical size at the left of the image and the
+ * vertical size at the right of the image.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_VERTICAL_TRAPEZOID 115/* RWD */
+
+/* Increasing (decreasing) this value rotates the image (counter)
+ clockwise about the center point of the image.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_TILT 116/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * distance between the left and right sides at the top of the image.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_TOP_CORNER 117/* RWD */
+
+/* Increasing (decreasing) this value moves the top end of the
+ * image to the right (left).
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_TOP_CORNER_BALANCE 118/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * distance between the left and right sides at the bottom of the
+ * image.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_BOTTOM_CORNER 119/* RWD */
+
+/* Increasing (decreasing) this value moves the bottom end of the
+ * image to the right (left).
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_GEOMETRY_BOTTOM_CORNER_BALANCE 120/* RWD */
+
+
+/**************************************
+ * DDC/CI VCP CODES: PRESET SELECTION *
+ **************************************/
+
+/* Restore all factory presets including brightness / contrast,
+ * geometry, color and TV defaults.
+ * NV__CTRL_DDCCI_ON causes defaults to be restored
+ * A value of NV_CTRL_DDCCI_OFF shall be ignored
+ * Type: Boolean
+ */
+#define NV_CTRL_DDCCI_PRESET_RESTORE_DEFAULTS 121/* -WD */
+
+/* Restores factory defaults for brightness and contrast adjustments.
+ * NV_CTRL_DDCCI_ON causes defaults to be restored
+ * A value of NV_CTRL_DDCCI_OFF shall be ignored
+ * Type: Boolean
+ */
+#define NV_CTRL_DDCCI_PRESET_RESTORE_DEFAULTS_BRIGHTNESS_CONTRAST 122/* -WD */
+
+/* Restore factory defaults for geometry adjustments.
+ * NV_CTRL_DDCCI_ON causes defaults to be restored
+ * A value of NV_CTRL_DDCCI_OFF shall be ignored
+ * Type: Boolean
+ */
+#define NV_CTRL_DDCCI_PRESET_RESTORE_DEFAULTS_GEOMETRY 123/* -WD */
+
+/* Restore factory defaults for color settings.
+ * NV_CTRL_DDCCI_ON causes defaults to be restored
+ * A value of NV_CTRL_DDCCI_OFF shall be ignored
+ * Type: Boolean
+ */
+#define NV_CTRL_DDCCI_PRESET_RESTORE_DEFAULTS_COLOR 124/* -WD */
+
+/* Restore factory defaults for TV functions.
+ * NV_CTRL_DDCCI_ON causes defaults to be restored
+ * A value of NV_CTRL_DDCCI_OFF shall be ignored
+ * Type: Boolean
+ */
+#define NV_CTRL_DDCCI_PRESET_RESTORE_DEFAULTS_TV 125/* -WD */
+
+/* Store / Restore the user saved values for current mode.
+ * - NV_CTRL_DDCCI_PRESET_SETTINGS_STORE_CURRENT:
+ * Store current settings in the monitor.
+ * - NV_CTRL_DDCCI_PRESET_SETTINGS_RESTORE_FACTORY_DEFAULTS:
+ * Restore factory defaults for current mode. If no factory
+ * defaults then restore user values for current mode.
+ * - All other values are reserved and shall be ignored.
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_PRESET_SETTINGS 126/* -WD */
+#define NV_CTRL_DDCCI_PRESET_SETTINGS_STORE_CURRENT 1
+#define NV_CTRL_DDCCI_PRESET_SETTINGS_RESTORE_FACTORY_DEFAULTS 2
+
+
+/***************************************
+ * DDC/CI VCP CODES: IMAGE ADJUSTMENTS *
+ ***************************************/
+
+/*
+ * Increasing (decreasing) this value will increase (decrease) the
+ * Brightness of the image.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_IMAGE_BRIGHTNESS 127/* RWD */
+
+/*
+ * Increasing (decreasing) this value will increase (decrease) the
+ * Contrast of the image.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_IMAGE_CONTRAST 128/* RWD */
+
+/*
+ * Turn on / off an auto setup function (periodic or event driven)
+ * 0 and 3 : Shall be ignored
+ * NV_CTRL_DDCCI_IMAGE_AUTO_SETUP_TOGGLE_OFF : Turn auto setup off
+ * NV_CTRL_DDCCI_IMAGE_AUTO_SETUP_TOGGLE_ON : Turn auto setup on
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_IMAGE_AUTO_SETUP_TOGGLE 129/* -WD */
+#define NV_CTRL_DDCCI_IMAGE_AUTO_SETUP_TOGGLE_OFF 1
+#define NV_CTRL_DDCCI_IMAGE_AUTO_SETUP_TOGGLE_ON 2
+
+/*
+ * Perform autosetup function (H/V position, clock, clock phase, A/D
+ * converter, etc)
+ * NV_CTRL_OFF : Indicates that auto-setup is not active
+ * NV_CTRL_ON : Perform autosetup
+ * >=2 : Shall be ignored
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_IMAGE_AUTO_SETUP 130/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * sampling clock frequency
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_IMAGE_CLOCK 131/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * phase shift of the sampling clock
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_IMAGE_CLOCK_PHASE 132/* RWD */
+
+/* Allows the display to specify the minimum increment in which it
+ * can adjust the color temperature.
+ * This will be used in conjunction with
+ * NV_CTRL_DDCCI_IMAGE_COLOR_TEMPERATURE_REQUEST, Color temperature request.
+ * Values of 0 and > 5000 are invalid and shall be ignored.
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_IMAGE_COLOR_TEMPERATURE_INCREMENT 133/* R-D */
+
+/* Allows a specified color temperature (in °K) to be requested. If
+ * display is unable to achieve requested color temperature, then it
+ * should move to the closest possible temperature.
+ * A value of 0 shall be treated as a request for a color temperature
+ * of 3000°K. Values greater than 0 shall be used as a multiplier of
+ * the color temperature increment (read using
+ * NV_CTRL_DDCCI_IMAGE_COLOR_TEMPERATURE_INCREMENT) and the
+ * result added to the base value of 3000°K
+ * Example:
+ * If NV_CTRL_DDCCI_IMAGE_COLOR_TEMPERATURE_INCREMENT returns a value of
+ * 50°K and NV_CTRL_DDCCI_IMAGE_COLOR_TEMPERATURE_INCREMENT sends a
+ * value of 50 (decimal) then the display shall interpret this as a
+ * request to adjust the color temperature to 5500°K
+ * (3000 + (50 * 50))°K = 5500°K
+ * Notes:
+ * 1) Applications using this function are recommended to read the
+ * actual color temperature after using this command and taking
+ * appropriate action.
+ * 2) This control is only recommended if the display can produce a
+ * continuously (at defined increment, see VCP code 0Bh) variable
+ * color temperature.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_IMAGE_COLOR_TEMPERATURE_REQUEST 134/* RWD */
+
+/* Select a specified color temperature.
+ * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_SRGB : sRGB
+ * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_NATIVE : Display native
+ * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_4000K : 4000 K
+ * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_5000K : 5000 K
+ * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_6500K : 6500 K
+ * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_7500K : 7500 K
+ * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_8200K : 8200 K
+ * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_9300K : 9300 K
+ * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_10000K : 10000 K
+ * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_USER1 : 11500 K
+ * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_USER1 : User 1
+ * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_USER2 : User 2
+ * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_USER3 : User 3
+ * 00 and >=0E shall be ignored
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET 135/* RWD */
+#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_SRGB 0x01
+#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_NATIVE 0x02
+#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_4000K 0x03
+#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_5000K 0x04
+#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_6500K 0x05
+#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_7500K 0x06
+#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_8200K 0x07
+#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_9300K 0x08
+#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_10000K 0x09
+#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_11500K 0x0A
+#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_USER1 0x0B
+#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_USER2 0x0C
+#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_USER3 0x0D
+
+/*
+ * Increasing (decreasing) this value will increase (decrease) the
+ * luminance of red pixels.
+ * The value returned shall be an indication of the actual red gain at
+ * the current color temperature and not be normalized.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_IMAGE_RED_VIDEO_GAIN 136/* RWD */
+
+/*
+ * Increasing (decreasing) this value will increase (decrease) the
+ * luminance of green pixels.
+ * The value returned shall be an indication of the actual green gain at
+ * the current color temperature and not be normalized.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_IMAGE_GREEN_VIDEO_GAIN 137/* RWD */
+
+/*
+ * Increasing (decreasing) this value will increase (decrease) the
+ * luminance of blue pixels.
+ * The value returned shall be an indication of the actual blue gain at
+ * the current color temperature and not be normalized.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_IMAGE_BLUE_VIDEO_GAIN 138/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * black level of red pixels.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_IMAGE_RED_VIDEO_BLACK_LEVEL 139/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * black level of green pixels.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_IMAGE_GREEN_VIDEO_BLACK_LEVEL 140/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * black level of blue pixels.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_IMAGE_BLUE_VIDEO_BLACK_LEVEL 141/* RWD */
+
+/* Increasing (decreasing) this value will adjust the focus of the image.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_IMAGE_FOCUS 142/* RWD */
+
+/* Increasing (decreasing) this value controls the horizontal picture
+ * moiré cancellation.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_IMAGE_HORIZONTAL_MOIRE 143/* RWD */
+
+/* Increasing (decreasing) this value controls the vertical picture
+ * moiré cancellation.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_IMAGE_VERTICAL_MOIRE 144/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * distance to the focal plane of the image.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_IMAGE_ADJUST_FOCAL_PLANE 145/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * zoom function of the optics
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_IMAGE_ADJUST_ZOOM 146/* RWD */
+
+/* This value will cause the picture to flip horizontally.
+ * NV_CTRL_DDCCI_ON : flip horizontally
+ * NV_CTRL_DDCCI_OFF : Shall be ignored
+ * Type: Boolean
+ */
+#define NV_CTRL_DDCCI_IMAGE_HOR_FLIP 147/* -WD */
+
+/* This value will cause the picture to flip vertically.
+ * NV_CTRL_DDCCI_ON : flip vertically
+ * NV_CTRL_DDCCI_OFF : Shall be ignored
+ * Type: Boolean
+ */
+#define NV_CTRL_DDCCI_IMAGE_VER_FLIP 148/* -WD */
+
+/* Changing this value will affect the scaling (input versus output)
+ * function of the display.
+ * NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING_NO_SCALING : No scaling, 1:1 relationship
+ * NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING_MAX_NO_DISTORT2 : Scale to maximum
+ * without AR distortion
+ * NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING_MAX_VERTICAL : Scale to maximum vertical
+ size
+ * NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING_MAX_HORIZONTAL ; Scale to maximum
+ horizontal size
+ * 0 and >=5 : Shall be ignored
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING 149/* RWD */
+#define NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING_NO_SCALING 1
+#define NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING_MAX_NO_DISTORT 2
+#define NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING_MAX_VERTICAL 3
+#define NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING_MAX_HORIZONTAL 4
+
+/* Allows one of several image expansion algorithms to be selecte
+ * to suit different types of image and/or different personal
+ * preference.
+ * NV_CTRL_DDCCI_IMAGE_SHARPNESS_FILTER_FUNC(1) : Filter function 1
+ * NV_CTRL_DDCCI_IMAGE_SHARPNESS_FILTER_FUNC(2) : Filter function 2
+ * NV_CTRL_DDCCI_IMAGE_SHARPNESS_FILTER_FUNC(3) : Filter function 3
+ * NV_CTRL_DDCCI_IMAGE_SHARPNESS_FILTER_FUNC(4) : Filter function 4
+ * 0 and 5 shall be ignored
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_IMAGE_SHARPNESS 150/* RWD */
+#define NV_CTRL_DDCCI_IMAGE_SHARPNESS_FILTER_FUNC(n) n
+
+/* Indicates the orientation of the screen.
+ * NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_0
+ * The normal landscape mode.
+ * NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_90
+ * Portrait mode achieved by clockwise rotation of the display 90 degrees.
+ * NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_180
+ * Landscape mode achieved by rotation of the display 180 degrees.
+ * NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_270
+ * Portrait mode achieved by clockwise rotation of the display 270 degrees.
+ * NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_NA
+ * Indicates that the display cannot supply the current orientation
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION 151/* R-D */
+#define NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_0 0x01
+#define NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_90 0x02
+#define NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_180 0x03
+#define NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_270 0x04
+#define NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_NA 0xFF
+
+/* Selects a scan format.
+ * NV_CTRL_DDCCI_IMAGE_SCAN_FORMAT_UNDERSCAN: Underscan
+ * NV_CTRL_DDCCI_IMAGE_SCAN_FORMAT_OVERSCAN: Overscan
+ * NV_CTRL_DDCCI_IMAGE_SCAN_FORMAT_WIDESCREEN: Widescreen
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_IMAGE_SCAN_FORMAT 152/* RWD */
+#define NV_CTRL_DDCCI_IMAGE_SCAN_FORMAT_UNDERSCAN 1
+#define NV_CTRL_DDCCI_IMAGE_SCAN_FORMAT_OVERSCAN 2
+#define NV_CTRL_DDCCI_IMAGE_SCAN_FORMAT_WIDESCREEN 3
+#define NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE 153/* RWD */
+
+/* Display mode:
+ * NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE_PRODUCTIVITY :
+ * Productivity (e.g. office applications)
+ * NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE_MIXED : Mixed (e.g. internet)
+ * NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE_ENTERTAINMENT :
+ Entertainment (e.g. TV / movie)
+ * NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE_USERDEFINED : User defined
+ * Note:
+ * The condition(s) associated with options 1, 2 and 3 are defined
+ * by the display manufacturer
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE_PRODUCTIVITY 1
+#define NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE_MIXED 2
+#define NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE_ENTERTAINMENT 3
+#define NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE_USERDEFINED 4
+
+/***********************************************
+ * DDC/CI VCP CODES: WINDOWED IMAGE OPERATIONS *
+ ***********************************************/
+
+/* Defines the top left X pixel of an area of the image. Specified in
+ * co-ordinates of incoming image before any scaling etc in the display.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_POSITION_TOP_LEFT_X 154/* RWD */
+
+/* Defines the top left Y pixel of an area of the image. Specified in
+ * co-ordinates of incoming image before any scaling etc in the display.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_POSITION_TOP_LEFT_Y 155/* RWD */
+
+/* Defines the bottom right X pixel of an area of the image.
+ * Specified in co-ordinates of incoming image before any scaling
+ * in the display.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_POSITION_BOTTOM_RIGHT_X 156/* RWD */
+
+/* Defines the bottom right Y pixel of an area of the image.
+ * Specified in co-ordinates of incoming image before any scaling
+ * in the display.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_POSITION_BOTTOM_LEFT_X 157/* RWD */
+
+/* Window control, enables the brightness and color within a
+ * window to be different from the desktop.
+ * NV_CTRL_DDCCI_WINDOWEDIMAGE_OLD_CONTROL_TOGGLE_OFF : Off
+ * NV_CTRL_DDCCI_WINDOWEDIMAGE_OLD_CONTROL_TOGGLE_ON: On
+ * All other values are reserved.
+ * Notes:
+ * 1. This control should be used in conjunction with
+ * NV_CTRL_DDCCI_WINDOWEDIMAGE_BACKGROUND
+ * 2. This command structure is not recommended for new designs,
+ * see NV_CTRL_DDCCI_WINDOWEDIMAGE_CONTROL_TOGGLE for alternate.
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_OLD_CONTROL_TOGGLE 158/* RWD */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_OLD_CONTROL_TOGGLE_OFF 1
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_OLD_CONTROL_TOGGLE_ON 2
+
+/* Changes the contrast ratio between the area of the window and
+ * the rest of the desktop
+ * Lower (higher) values will cause the desktop brightness to
+ * decrease (increase)
+ * Notes:
+ * 1. This contropl should be used in conjunction with
+ * NV_CTRL_DDCCI_WINDOWEDIMAGE_OLD_CONTROL_TOGGLE
+ * 2. This command structure is not recommended for new designs,
+ * see NV_CTRL_DDCCI_WINDOWEDIMAGE_WINDOW_SELECT for alternate.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_BACKGROUND 159/* RWD */
+
+/* A value of 127 shall have no effect.
+ * A value > 127 shall cause the color to shift towards yellow
+ * A value < 127 shall cause the color to shift towards magenta
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_6AXIS_COLOR_CONTROL_RED 160/* RWD */
+
+/* A value of 127 shall have no effect.
+ * A value > 127 shall cause the color to shift towards green
+ * A value < 127 shall cause the color to shift towards red
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_6AXIS_COLOR_CONTROL_YELLOW 161/* RWD */
+
+/* A value of 127 shall have no effect.
+ * A value > 127 shall cause the color to shift towards cyan
+ * A value < 127 shall cause the color to shift towards yellow
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_6AXIS_COLOR_CONTROL_GREEN 162/* RWD */
+
+/* A value of 127 shall have no effect.
+ * A value > 127 shall cause the color to shift towards blue
+ * A value < 127 shall cause the color to shift towards green
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_6AXIS_COLOR_CONTROL_CYAN 163/* RWD */
+
+/* A value of 127 shall have no effect.
+ * A value > 127 shall cause the color to shift towards magenta
+ * A value < 127 shall cause the color to shift towards cyan
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_6AXIS_COLOR_CONTROL_BLUE 164/* RWD */
+
+/* A value of 127 shall have no effect.
+ * A value > 127 shall cause the color to shift towards red
+ * A value < 127 shall cause the color to shift towards blue
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_6AXIS_COLOR_CONTROL_MAGENTA 165/* RWD */
+
+/* Turn the selected window operation on / off.
+ * Bit: NV_CTRL_DDCCI_WINDOWEDIMAGE_CONTROL_TOGGLE_DPY_IMAGE
+ * 0 Window controls have no effect on the
+ * displayed image
+ * 1 Window controls effect the displayed image
+ * (full image area)
+ * Bit: NV_CTRL_DDCCI_WINDOWEDIMAGE_CONTROL_TOGGLE_WINDOW(n)
+ * 0 Window controls have no effect on the
+ * displayed image (window n)
+ * 1 Window controls effect the displayed image
+ * (window n)
+ * n is between 1 and 7
+ * Note: This command structure is recommend, in conjunction with
+ * NV_CTRL_DDCCI_WINDOWEDIMAGE_WINDOW_SELECT, for all new designs.
+ * Type: Bitmask
+ */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_CONTROL_TOGGLE 166/* RWD */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_CONTROL_TOGGLE_DPY_IMAGE 1
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_CONTROL_TOGGLE_WINDOW(n) (1<<n)
+
+/* Change the selected window as defined with
+ * NV_CTRL_DDCCI_WINDOWEDIMAGE_CONTROL_TOGGLE
+ * When a window is selected then all commands that the display
+ * controller supports for window operations are valid, this may
+ * include but is not limited to: brightness, contrast, R/G/B gain, 6-
+ * axis color, sharpness, etc.
+ * meaning of value NV_CTRL_DDCCI_WINDOWEDIMAGE_WINDOW_SELECT_DPY_IMAGE:
+ * Full display image area is selected except for
+ * area(s) of active windows
+ * meaning of value NV_CTRL_DDCCI_WINDOWEDIMAGE_WINDOW_SELECT_WINDOW(n)
+ * Window n is selected
+ * If this command is not supported then the `full image area' shall
+ * be the default.
+ * This command structure is recommend, in conjunction with
+ * NV_CTRL_DDCCI_WINDOWEDIMAGE_CONTROL_TOGGLE, for all new designs.
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_WINDOW_SELECT 167/* RWD */
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_WINDOW_SELECT_DPY_IMAGE 0
+#define NV_CTRL_DDCCI_WINDOWEDIMAGE_WINDOW_SELECT_WINDOW(n) (1<<n)
+
+
+/*************************************/
+/* DDC/CI VCP CODES: AUDIO FUNCTIONS */
+/*************************************/
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * audio volume.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_AUDIO_SPEAKER_VOLUME 168/* RWD */
+
+/* Increasing (decreasing) this value will increase (decrease) the
+ * microphone gain.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_AUDIO_MICROPHONE_VOLUME 169/* RWD */
+
+/* Increasing (decreasing) this control will cause high frequency
+ * audio to be emphasized (de-emphasised).
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_AUDIO_TV_AUDIO_TREBLE 170/* RWD */
+
+/* Increasing (decreasing) this control will cause low frequency
+ * audio to be emphasized (de-emphasised).
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_AUDIO_TV_AUDIO_BASS 171/* RWD */
+
+/* This control affects the left ­ right balance of audio output.
+ * Increasing (decreasing) the value will cause the balance to move
+ * to the right (left).
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_AUDIO_TV_AUDIO_BALANCE 172/* RWD */
+
+/* This control allows one of several audio modes to be selected.
+ * NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE_SPEAKER_OFF: Display audio is disabled,
+ * NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE_SPEAKER_MONO: Both display audio channels,
+ * use the left audio channel
+ * NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE_SPEAKER_STEREO: Incoming left and right
+ * audio. Channels feed separate display output audio channels.
+ * NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE_SPEAKER_STEREO_EXPANDED: As defined
+ * by the manufacturer.
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE 173/* RWD */
+#define NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE_SPEAKER_OFF 0
+#define NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE_SPEAKER_MONO 1
+#define NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE_SPEAKER_STEREO 2
+#define NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE_SPEAKER_STEREO_EXPANDED 3
+
+
+/************************************/
+/* DDC/CI VCP CODES: DPVL Functions */
+/************************************/
+
+/* Video mode and status of a DPVL capable monitor
+ * Bit Value Meaning
+ * 0 0 Raster scan mode
+ * 1 DPVL mode
+ * 1 0 Monitor is able to receive the next packet
+ * 1 Monitor is unable to accept another packet
+ * 2 0 No error detected in the last header received
+ * 1 Error detected in the last header received
+ * Other bits are reserved and shall be set to '0'.
+ * Type: Bitmask
+ */
+#define NV_CTRL_DDCCI_DPVL_MONITOR_STATUS 174/* R-D */
+#define NV_CTRL_DDCCI_DPVL_MONITOR_STATUS_DPVL_MODE (1<<0)
+#define NV_CTRL_DDCCI_DPVL_MONITOR_STATUS_UNABLE_TO_RECEIVE_NEXT_PACKET (1<<1)
+#define NV_CTRL_DDCCI_DPVL_MONITOR_STATUS_ERROR_DETECTED_IN_LAST_HEADER (1<<2)
+
+/* Counter for the DPVL packets received (valid and invalid ones).
+ * This value counts from 0000h to FFFFh and then rolls over to 0000h.
+ * The host can reset the value to 0000h.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_DPVL_PACKET_COUNT 175/* RWD */
+
+/* The X origin of the monitor in the virtual screen. The support of
+ * this command indicates the multi-display support of the display. If
+ * a display supports this command, the monitor must also support
+ * Monitor Y Origin command.
+ * Type: Range; "0000h" to "FFFFh" or 0 to 65535
+ */
+#define NV_CTRL_DDCCI_DPVL_MONITOR_X_ORIGIN 176/* RWD */
+
+/* The Y origin of the display in the virtual screen. The support of
+ * this command indicates the multi-display support of the display. If
+ * a display supports this command, the monitor must also support
+ * Monitor X Origin command.
+ * Type: Range; "0000h" to "FFFFh" or 0 to 65535
+ */
+#define NV_CTRL_DDCCI_DPVL_MONITOR_Y_ORIGIN 177/* RWD */
+
+/* Error Counter for the DPVL header. The counter value saturates
+ * at FFFFh. Host can reset to 0000h.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_DPVL_HEADER_ERROR_COUNT 178/* RWD */
+
+/* CRC error Counter for the DPVL body (containing video data).
+ * The counter value saturates at FFFFh. The Host can reset to 0000h
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_DPVL_BODY_CRC_ERROR_COUNT 179/* RWD */
+
+/* Assigned identification number for the monitor.
+ * Type: Valid range is 0000h to FFFEh, FFFFh is reserved for broadcast.
+ */
+#define NV_CTRL_DDCCI_DPVL_CLIENT_ID 180/* RWD */
+
+/* Indicates the status of the DVI link
+ * NV_CTRL_DDCCI_DPVL_LINK_CONTROL_DISABLED: Link shutdown is disabled
+ * NV_CTRL_DDCCI_DPVL_LINK_CONTROL_ENABLED: Link shutdown is enabled
+ * Type: Boolean
+ */
+#define NV_CTRL_DDCCI_DPVL_LINK_CONTROL 181/* RWD */
+#define NV_CTRL_DDCCI_DPVL_LINK_CONTROL_DISABLED 0
+#define NV_CTRL_DDCCI_DPVL_LINK_CONTROL_ENABLED 1
+
+/**********************************************/
+/* DDC/CI VCP CODES: Miscellaneous Functions */
+/**********************************************/
+
+/* Causes a CRT display to perform a degauss cycle with
+ * NV_CTRL_DDCCI_ON
+ * Type: Boolean
+ */
+#define NV_CTRL_DDCCI_MISC_DEGAUSS 182/* -WD */
+
+/* Used to indicate that a display user control (excluding power
+ * controls) has been used to change and save (or autosave) a new value.
+ * NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE_NO_NEW : No new control value
+ * NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE_NO_USER_CONTROLS : A new control value
+ * has been saved
+ * NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE_NO_USER_CONTROLS : No user controls are present
+ * Note:
+ * A value = NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE_NEW should only be reset to
+ * a value = NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE_NO_NEW by a host write
+ * operation and not by the display
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE 183/* RWD */
+#define NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE_NO_NEW 0x01
+#define NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE_NEW 0x02
+#define NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE_NO_USER_CONTROLS 0xFF
+
+/* Allows display controls to be used as soft keys
+ * NV_CTRL_DDCCI_MISC_SOFT_CONTROLS_NO_BUTTON_ACTIVE : No button active
+ * NV_CTRL_DDCCI_MISC_SOFT_CONTROLS_BUTTON(n): Button n active
+ * n is between 1 and 7.
+ * NV_CTRL_DDCCI_MISC_SOFT_CONTROLS_NONE : No controls present
+ * Note:
+ * A `button active' value should only be reset to a value = 0 by
+ * host write operation and not by the display
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_MISC_SOFT_CONTROLS 184/* RWD */
+#define NV_CTRL_DDCCI_MISC_SOFT_CONTROLS_NO_BUTTON_ACTIVE 0
+#define NV_CTRL_DDCCI_MISC_SOFT_CONTROLS_BUTTON(n) n
+#define NV_CTRL_DDCCI_MISC_SOFT_CONTROLS_NONE 0xFF
+
+/* When read this control returns the VCP code associated with
+ * the new control value reported using 02H
+ * Examples:
+ * If brightness has been changed then return value of 10h
+ * If red gain has been changed then return value of 16h.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_MISC_ACTIVE_CONTROL 185/* R-D */
+
+/* Used to select the active video source
+ * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_ANALOG_1: Analog video (R/G/B) 1
+ * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_ANALOG_2: Analog video (R/G/B) 2
+ * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_DIGITAL_1: Digital video (TMDS) 1
+ * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_DIGITAL_2: Digital video (TMDS) 2
+ * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPOSITE_1: Composite video 1
+ * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPOSITE_2: Composite video 2
+ * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_SVIDEO_1: S-video 1
+ * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_SVIDEO_2: S-video 2
+ * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_TUNER_1: Tuner 1
+ * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_TUNER_2: Tuner 2
+ * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_TUNER_3: Tuner 3
+ * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPONENT_1: Component video (YPrPb/YCrCb) 1
+ * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPONENT_2: Component video (YPrPb/YCrCb) 2
+ * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPONENT_3: Component video (YPrPb/YCrCb) 3
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE 186/* RWD */
+#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_ANALOG_1 1
+#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_ANALOG_2 2
+#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_DIGITAL_1 3
+#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_DIGITAL_2 4
+#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPOSITE_1 5
+#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPOSITE_2 6
+#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_SVIDEO_1 7
+#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_SVIDEO_2 8
+#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_TUNER_1 9
+#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_TUNER_2 10
+#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_TUNER_3 11
+#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPONENT_1 12
+#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPONENT_2 13
+#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPONENT_3 14
+
+/* ncreasing (decreasing) this value will increase (decrease) the
+ * velocity modulation of the horizontal scan as a function of a
+ * change in the luminance level.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_MISC_VELOCITY_SCAN_MODULATION 187/* RWD */
+
+/* Increasing this control increases the amplitude of the color
+ * difference components of the video signal.
+ * The result is an increase in the amount of pure color relative to
+ * white in the video. This control does not affect the RGB input,
+ * only the TV video inputs.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_MISC_TV_COLOR_SATURATION 188/* RWD */
+
+/* Used to increment / decrement between TV-channels, the exact
+ * behavior is implementation specific (e.g. increment / decrement
+ * to next numeric channel or increment / decrement to next
+ * channel with a signal)
+ * NV_CTRL_DDCCI_MISC_TV_CHANNEL_UP_DOWN_INCREMENT: Increment channel
+ * NV_CTRL_DDCCI_MISC_TV_CHANNEL_UP_DOWN_DECREMENT: Decrement channel
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_MISC_TV_CHANNEL_UP_DOWN 189/* -WD */
+#define NV_CTRL_DDCCI_MISC_TV_CHANNEL_UP_DOWN_INCREMENT 1
+#define NV_CTRL_DDCCI_MISC_TV_CHANNEL_UP_DOWN_DECREMENT 2
+
+/* Increasing this control increases the amplitude of the high
+ * frequency components of the video signal.
+ * This allows fine details to be accentuated. This control does not
+ * affect the RGB input, only the TV video inputs.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_MISC_TV_SHARPNESS 190/* RWD */
+
+/* Provides for the TV-audio to be muted or unmated.
+ * NV_CTRL_DDCCI_MISC_TV_AUDIO_MUTE_ON: Mute the audio
+ * NV_CTRL_DDCCI_MISC_TV_AUDIO_MUTE_OFF: Unmute the audio
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_MISC_TV_AUDIO_MUTE 191/* RWD */
+#define NV_CTRL_DDCCI_MISC_TV_AUDIO_MUTE_ON 1
+#define NV_CTRL_DDCCI_MISC_TV_AUDIO_MUTE_OFF 2
+
+/* Increasing (decreasing) this control increases (decreases) the
+ * ratio between whites and blacks in the video.
+ * This control does not affect the RGB input, only the TV video
+ * inputs.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_MISC_TV_CONTRAST 192/* RWD */
+
+/* Also known as `tint'
+ * Increasing (decreasing) this control increases (decreases) the
+ * wavelength of the color component of the video signal.
+ * The result is a shift towards red (blue) in the hue of all colors.
+ * This control does not affect the RGB input, only the TV video
+ * inputs.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_MISC_TV_HUE 193/* RWD */
+
+/* Increasing this control increases the black level of the video,
+ * resulting in an increase of the luminance level of the video.
+ * A value of zero represents the darkest level possible.
+ * This control does not affect the RGB input, only the TV video
+ * inputs.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_MISC_TV_BLACK_LEVEL_SHARPNESS 194/* RWD */
+
+/* Horizontal synchronization signal frequency in Hz as determined
+ * by the display.
+ * FFh: Indicates that the display cannot supply this information
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_MISC_HORIZONTAL_FREQUENCY 195/* R-D */
+
+/* Vertical synchronization signal frequency in 0.01Hz as
+ * determined by the display.
+ * FFh: Indicates that the display cannot supply this information
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_MISC_VERTICAL_FREQUENCY 196/* R-D */
+
+/* Select a type of LCD sub-pixel structure
+ * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_UNDEFINED:
+ * Sub-pixel layout is not defined
+ * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_RGB_V:
+ * Red / Green / Blue vertical stripe
+ * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_RGB_H:
+ * Red / Green / Blue horizontal stripe
+ * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_BGR_V:
+ * Blue / Green / Red vertical stripe
+ * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_BGR_H:
+ * Blue/ Green / Red horizontal stripe
+ * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_QUAD_1:
+ * Quad-pixel, a 2 x 2 sub-pixel structure with red at top
+ * left, blue at bottom right and green at top right and
+ * bottom left
+ * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_QUAD_2:
+ * Quad-pixel, a 2 x 2 sub-pixel structure with red at
+ * bottom left, blue at top right and green at top left and
+ * bottom right
+ * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_DELTA:
+ * Delta (triad)
+ * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_MOSAIC:
+ * Mosaic with red, green and blue fields overlayed
+ * (field sequential color)
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT 197/* R-D */
+#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_UNDEFINED 0
+#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_RGB_V 1
+#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_RGB_H 2
+#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_BGR_V 3
+#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_BGR_H 4
+#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_QUAD_1 5
+#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_QUAD_2 6
+#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_DELTA 7
+#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_MOSAIC 8
+
+/* Select the base technology type
+ * NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_CRT_SHADOWMASK: CRT (shadowmask)
+ * NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_CRT_APERTURE_GRILL: CRT (aperture
+ * grill)
+ * NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_TFT: TFT
+ * NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_LCOS: LCoS
+ * NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_PLASMA: Plasma
+ * NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_OLED: OLED
+ * NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_EL: EL
+ * NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_MEM: MEM
+ * Type: integer
+ */
+#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE 198/* R-D */
+#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_CRT_SHADOWMASK 1
+#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_CRT_APERTURE_GRILL 2
+#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_TFT 3
+#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_LCOS 4
+#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_PLASMA 5
+#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_OLED 6
+#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_EL 7
+#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_MEM 8
+
+/* Returns the current value (in hours) of `active power on' time
+ * accumulated by the display ­ a 2 byte value.
+ * "Active power on" time is defined as the period when the
+ * emissive elements(s) of the display ­ cathodes for a CRT,
+ * fluorescent lamps for a LCD, etc ­ are active.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_MISC_DISPLAY_USAGE_TIME 199/* R-D */
+
+/* Returns the length (in bytes) of non-volatile storage in the display
+ * available for writing a display descriptor ­ the maximum
+ * descriptor length is 256 bytes
+ * See
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_MISC_DISPLAY_DESCRIPTOR_LENGTH 200/* R-D */
+
+/* If enabled (NV_CTRL_DDCCI_ON), the display descriptor written to the
+ * display using XNVCTRLSetDDCCIDisplayDescriptor() shall be displayed when
+ * no video is being received.
+ * The duration for which it is displayed is left to individual manufacturers.
+ * NV_CTRL_DDCCI_ON: Display is enabled
+ * NV_CTRL_DDCCI_OFF: The display descriptor shall not be displayed.
+ * Type: Boolean
+ */
+#define NV_CTRL_DDCCI_MISC_ENABLE_DISPLAY_OF_DISPLAY_DESCRIPTOR 201/* RWD */
+
+/* A 2 byte value used to allow an application to only operate with
+ * known products. The display manufacturer and application author
+ * agree to a code such that application will only run when a valid
+ * code is present in the display.
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_MISC_APPLICATION_ENABLE_KEY 202/* R-D */
+
+/* This VCP code provides allows a 2 byte value identifying the
+ * firmware level installed in the display to be determined.
+ * Type: Range
+ */
+#define NV_CTRL_DDCCI_MISC_DISPLAY_FIRMWARE_LEVEL 203/* R-D */
+
+/* Indicates the current state of the display OSD
+ * NV_CTRL_DDCCI_MISC_OSD_DISABLED: OSD is disabled
+ * NV_CTRL_DDCCI_MISC_OSD_ENABLED: OSD is enabled
+ * NV_CTRL_DDCCI_MISC_OSD_CANNOT_SUPPLY: Indicates that the display cannot
+ * supply this information.
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_MISC_OSD 204/* RWD */
+#define NV_CTRL_DDCCI_MISC_OSD_DISABLED 1
+#define NV_CTRL_DDCCI_MISC_OSD_ENABLED 2
+#define NV_CTRL_DDCCI_MISC_OSD_CANNOT_SUPPLY 0xFF
+
+/* Allows the displayed OSD language to be selected.
+ * Type: Integer */
+#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE 205/* RWD */
+#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_CHINESE 1
+#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_ENGLISH 2
+#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_FRENCH 3
+#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_GERMAN 4
+#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_ITALIAN 5
+#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_JAPANESE 6
+#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_KOREAN 7
+#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_PORTUGESE 8
+#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_RUSSIAN 9
+#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_SPANISH 10
+
+/* An `auxiliary display' is a small alpha-numeric display associated
+ * with the primary display and able to be accessed via the primary
+ * display.
+ * This command returns a 1 byte value that defines the number of
+ * characters and the number of rows available. The format is:
+ * Bits 0 to 5 : The number of characters / row
+ * Bits 6 to 7 : The number of rows
+ * I.e. The maximum auxiliary display size is 4 rows each with 64 characters
+ * Type: Bitmask
+ */
+#define NV_CTRL_DDCCI_MISC_AUXILIARY_DISPLAY_SIZE 206/* R-D */
+#define NV_CTRL_DDCCI_MISC_AUXILIARY_DISPLAY_SIZE_COLUMNS_MASK 0x1F
+#define NV_CTRL_DDCCI_MISC_AUXILIARY_DISPLAY_SIZE_ROWS_MASK 0x60
+
+#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT 207/* RWD */
+
+/* Used to selects the active output.
+ * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_ANALOG_1: Analog video (R/G/B) 1
+ * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_ANALOG_2: Analog video (R/G/B) 2
+ * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_DIGITAL_1: Digital video (TMDS) 1
+ * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_DIGITAL_2: Digital video (TMDS) 2
+ * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPOSITE_1: Composite video 1
+ * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPOSITE_2: Composite video 2
+ * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_SVIDEO_1: S-video 1
+ * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_SVIDEO_2: S-video 2
+ * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_TUNER_1: Tuner 1
+ * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_TUNER_2: Tuner 2
+ * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_TUNER_3: Tuner 3
+ * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPONENT_1: Component video (YPrPb/YCrCb) 1
+ * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPONENT_2: Component video (YPrPb/YCrCb) 2
+ * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPONENT_3: Component video (YPrPb/YCrCb) 3
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_ANALOG_1 1
+#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_ANALOG_2 2
+#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_DIGITAL_1 3
+#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_DIGITAL_2 4
+#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPOSITE_1 5
+#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPOSITE_2 6
+#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_SVIDEO_1 7
+#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_SVIDEO_2 8
+#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_TUNER_1 9
+#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_TUNER_2 10
+#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_TUNER_3 11
+#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPONENT_1 12
+#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPONENT_2 13
+#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPONENT_3 14
+
+/* Used to select the video mode with respect to 2D or 3D video.
+ * Here is the meaning of the bitmask:
+ * NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_FIELD_SEQUENTIAL_RIGHT_FIRST:
+ * Enable Field-Sequential Right Eye First
+ * NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_FIELD_SEQUENTIAL_LEFT_FIRST:
+ * Enable Field-Sequential Left Eye First
+ * NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_2WAY_INTERLEAVED_RIGHT_FIRST:
+ * Enable 2-Way Interleaved Right Eye First
+ * NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_2WAY_INTERLEAVED_LEFT_FIRST:
+ * Enable 2-Way Interleaved Left Eye First
+ * NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_4WAY_INTERLEAVED_ODD_LINES:
+ * Enable 4-Way Interleaved, Display Stereo Buffer 0 (even scan lines)
+ * NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_4WAY_INTERLEAVED_ODD_LINES:
+ * Enable 4-Way Interleaved, Display Stereo Buffer 1 (odd scan lines)
+ * NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_SIDE_BY_SIDE_INTERLEAVED:
+ * Enable Side-by-Side Interleaved
+ * Note: It is permissible, during a read operation, for a display to indicate
+ * support for 2 or more stereo modes
+ * Type: Bitmask
+ */
+#define NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE 208/* RWD */
+#define NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_FIELD_SEQUENTIAL_RIGHT_FIRST (1<<6)
+#define NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_FIELD_SEQUENTIAL_LEFT_FIRST (1<<5)
+#define NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_2WAY_INTERLEAVED_RIGHT_FIRST (1<<4)
+#define NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_2WAY_INTERLEAVED_LEFT_FIRST (1<<3)
+#define NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_4WAY_INTERLEAVED_EVEN_LINES (1<<2)
+#define NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_4WAY_INTERLEAVED_ODD_LINES (1<<1)
+#define NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_SIDE_BY_SIDE_INTERLEAVED (1<<0)
+
+/* Power Mode ­ DPMS and DPM standards are supported.
+ * Value DPMS DPM
+ * NV_CTRL_DDCCI_MISC_POWER_MODE_ON On On
+ * NV_CTRL_DDCCI_MISC_POWER_MODE_STANDBY Standby Off
+ * NV_CTRL_DDCCI_MISC_POWER_MODE_SUSPEND Suspend Off
+ * NV_CTRL_DDCCI_MISC_POWER_MODE_OFF Off Off
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_MISC_POWER_MODE 209/* RWD */
+#define NV_CTRL_DDCCI_MISC_POWER_MODE_ON 1
+#define NV_CTRL_DDCCI_MISC_POWER_MODE_STANDBY 2
+#define NV_CTRL_DDCCI_MISC_POWER_MODE_SUSPEND 3
+#define NV_CTRL_DDCCI_MISC_POWER_MODE_OFF 4
+
+/* Controls output of an auxiliary power output from a display to a host device.
+ * NV_CTRL_DDCCI_MISC_AUXILIARY_POWER_OUTPUT_DISABLE:
+ * Disable auxiliary output power
+ * NV_CTRL_DDCCI_MISC_AUXILIARY_POWER_OUTPUT_ENABLE:
+ * Enable auxiliary output power
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_MISC_AUXILIARY_POWER_OUTPUT 210/* RWD */
+#define NV_CTRL_DDCCI_MISC_AUXILIARY_POWER_OUTPUT_DISABLE 1
+#define NV_CTRL_DDCCI_MISC_AUXILIARY_POWER_OUTPUT_ENABLE 2
+
+/* Operation mode
+ * NV_CTRL_DDCCI_MISC_OPERATION_MODE_STANDALONE: Stand alone
+ * NV_CTRL_DDCCI_MISC_OPERATION_MODE_SLAVE: Slave (full PC control)
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_MISC_OPERATION_MODE 211/* -WD */
+#define NV_CTRL_DDCCI_MISC_OPERATION_MODE_STANDALONE 1
+#define NV_CTRL_DDCCI_MISC_OPERATION_MODE_SLAVE 2
+
+/* Define the version number of VCP list recognized by the display.
+ * This is a 2 byte value, byte 1 defines the version number and
+ * byte 2 defines the revision number
+ * e.g 02 00 (hex) defines Version 2, Revision 0
+ * Type: Integer
+ */
+#define NV_CTRL_DDCCI_MISC_VCP_VERSION 212/* R-D */
+
+/* Save the current adjustment data to EEPROM or other
+ * non-volatile storage inside the display
+ * Returns TRUE on success
+ * Type: Boolean
+ */
+#define NV_CTRL_DDCCI_SAVE_CURRENT_SETTINGS 213/* -WD */
+
+/* Detects if the display is DDC/CI capable
+ * Returns TRUE on success
+ * Type: Boolean
+ */
+#define NV_CTRL_DDCCI_CAPABLE 214/* R-D*/
+
+#define NV_CTRL_DDCCI_FIRST_VCP NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_POSITION
+#define NV_CTRL_DDCCI_LAST_VCP NV_CTRL_DDCCI_CAPABLE
/**************************************************************************/
+/*
+ * NV_CTRL_FLATPANEL_CHIP_LOCATION - for the specified display device,
+ * report whether the flatpanel is driven by the on-chip controller,
+ * or a separate controller chip elsewhere on the graphics board.
+ * This attribute is only available for flatpanels.
+ */
+
+#define NV_CTRL_FLATPANEL_CHIP_LOCATION 215/* R-D */
+#define NV_CTRL_FLATPANEL_CHIP_LOCATION_INTERNAL 0
+#define NV_CTRL_FLATPANEL_CHIP_LOCATION_EXTERNAL 1
+
+/*
+ * NV_CTRL_FLATPANEL_LINK - report whether the specified display
+ * device is driven by a single link or dual link DVI connection.
+ * This attribute is only available for flatpanels.
+ */
+
+#define NV_CTRL_FLATPANEL_LINK 216/* R-D */
+#define NV_CTRL_FLATPANEL_LINK_SINGLE 0
+#define NV_CTRL_FLATPANEL_LINK_DUAL 1
+
+/*
+ * NV_CTRL_FLATPANEL_SIGNAL - for the specified display device, report
+ * whether the flatpanel is driven by an LVDS or TMDS signal. This
+ * attribute is only available for flatpanels.
+ */
-#define NV_CTRL_LAST_ATTRIBUTE NV_CTRL_GVO_X_SCREEN_PAN_Y
+#define NV_CTRL_FLATPANEL_SIGNAL 217/* R-D */
+#define NV_CTRL_FLATPANEL_SIGNAL_LVDS 0
+#define NV_CTRL_FLATPANEL_SIGNAL_TMDS 1
+/*
+ * NV_CTRL_USE_HOUSE_SYNC - when TRUE, framelock will sync to the house
+ * sync
+ *
+ */
+#define NV_CTRL_USE_HOUSE_SYNC 218/* RW- */
+#define NV_CTRL_USE_HOUSE_SYNC_FALSE 0
+#define NV_CTRL_USE_HOUSE_SYNC_TRUE 1
+
+/**************************************************************************/
+#define NV_CTRL_LAST_ATTRIBUTE NV_CTRL_USE_HOUSE_SYNC
/**************************************************************************/
@@ -1021,6 +2361,9 @@
* String Attributes:
*/
+#define QUERY_STRING_ERR 0
+#define QUERY_STRING_OK 1
+#define QUERY_STRING_STATIC 2
/*
* NV_CTRL_STRING_PRODUCT_NAME - the GPU product name on which the
@@ -1060,10 +2403,33 @@
*/
#define NV_CTRL_STRING_TV_ENCODER_NAME 5 /* R-D */
-
-#define NV_CTRL_STRING_LAST_ATTRIBUTE NV_CTRL_STRING_TV_ENCODER_NAME
+/* NV_CTRL_STRING_DDCCI_MISC_TRANSMIT_DISPLAY_DESCRIPTOR -
+ * Allows a display descriptor (up to maximum length defined by the
+ * display (see NV_CTRL_DDCCI_MISC_DISPLAY_DESCRIPTOR_LENGTHC2h) to be written
+ * (read) to (from) non-volatile storage in the display.
+ * If an attempt is made to write beyond the maximum storage
+ * length, the descriptor shall be truncated with the excess bytes
+ * being discarded.
+ */
+#define NV_CTRL_STRING_DDCCI_MISC_TRANSMIT_DISPLAY_DESCRIPTOR 6 /* RWD */
+
+
+/* NV_CTRL_STRING_DDCCI_MISC_AUXILIARY_DISPLAY_DATA -
+ * An `auxiliary display' is a small alpha-numeric display associated
+ * with the primary display and able to be accessed via the primary
+ * display.
+ * This command transmits a number of bytes of alpha-numeric
+ * data to be displayed on the auxiliary display. The data shall
+ * conform to ISO 8859-2 (Latin 1) code set.
+ * The auxiliary display will be written from the top left position,
+ * moving to right along each line and then starting at left end of the
+ * next line.
+ */
+#define NV_CTRL_STRING_DDCCI_MISC_AUXILIARY_DISPLAY_DATA 7 /* -WD */
+
+#define NV_CTRL_STRING_LAST_ATTRIBUTE NV_CTRL_STRING_DDCCI_MISC_AUXILIARY_DISPLAY_DATA
/**************************************************************************/
/*
diff --git a/src/libXNVCtrl/NVCtrlLib.h b/src/libXNVCtrl/NVCtrlLib.h
index 372247c..c5d34f6 100644
--- a/src/libXNVCtrl/NVCtrlLib.h
+++ b/src/libXNVCtrl/NVCtrlLib.h
@@ -71,6 +71,24 @@ void XNVCTRLSetAttribute (
/*
+ * XNVCTRLSetAttributeAndGetStatus -
+ *
+ * Same as XNVCTRLSetAttribute().
+ * In addition, XNVCTRLSetAttributeAndGetStatus() returns
+ * True if the operation succeeds, False otherwise.
+ *
+ */
+
+Bool XNVCTRLSetAttributeAndGetStatus (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int attribute,
+ int value
+);
+
+
+/*
* XNVCTRLQueryAttribute -
*
* Returns True if the attribute exists. Returns False otherwise.
@@ -116,6 +134,24 @@ Bool XNVCTRLQueryStringAttribute (
char **ptr
);
+/*
+ * XNVCTRLSetStringAttribute -
+ *
+ * Returns True if the operation succeded. Returns False otherwise.
+ *
+ * Possible X errors:
+ * BadValue - The screen doesn't exist.
+ * BadMatch - The NVIDIA driver is not present on that screen.
+ * BadAlloc - Insufficient resources to fulfill the request.
+ */
+
+Bool XNVCTRLSetStringAttribute (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int attribute,
+ char *ptr
+);
/*
* XNVCTRLQueryValidAttributeValues -
@@ -172,6 +208,224 @@ Bool XNVCTRLQueryGvoColorConversion (
float colorOffset[3]
);
+/* SPECIAL HANDLING OF VCP CODES
+ *
+ * XNVCTRLQueryDDCCILutSize
+ * XNVCTRLQueryDDCCISinglePointLutOperation
+ * XNVCTRLSetDDCCISinglePointLutOperation
+ * XNVCTRLQueryDDCCIBlockLutOperation
+ * XNVCTRLSetDDCCIBlockLutOperation
+ * XNVCTRLSetDDCCIRemoteProcedureCall
+ * XNVCTRLQueryDDCCIDisplayControllerType
+
+ * Some of DDC/CI VCP codes handle multiple values,
+ * therefore they need their own NV_CONTROL structure
+ */
+
+/* XNVCTRLQueryDDCCILutSize
+ * Provides the size (number of entries and number of bits / entry)
+ * for the Red / Green and Blue LUT in the display
+ *
+ * red_entries: Number of Red LUT entries
+ * green_entries: Number of Green LUT entries
+ * blue_entries: Number of Blue LUT entries
+ * red_bits_per_entries: Number of bits / entry in Red LUT
+ * green_bits_per_entries: Number of bits / entry in Green LUT
+ * blue_bits_per_entries: Number of bits / entry in Blue LUT
+ * Returns TRUE on success
+ */
+Bool XNVCTRLQueryDDCCILutSize (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int *red_entries,
+ unsigned int *green_entries,
+ unsigned int *blue_entries,
+ unsigned int *red_bits_per_entries,
+ unsigned int *green_bits_per_entries,
+ unsigned int *blue_bits_per_entries
+);
+
+/* XNVCTRLQueryDDCCISinglePointLutOperation
+ * Allows a single point within a display's color LUT to be read
+ * Input:
+ * offset: Offset into the LUT
+ * Output:
+ * red_value: Red LUT value read
+ * green_value: Green LUT value read
+ * blue_value: Blue LUT value read
+ * Returns TRUE on success
+ */
+Bool XNVCTRLQueryDDCCISinglePointLutOperation (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int offset,
+ unsigned int *red_value,
+ unsigned int *green_value,
+ unsigned int *blue_value
+);
+
+/* XNVCTRLSetDDCCISinglePointLutOperation
+ * Allows a single point within a display's color LUT (look up table)
+ * to be loaded.
+ * offset: Offset into the LUT
+ * red_value: Red LUT value to be loaded
+ * green_value: Green LUT value to be loaded
+ * blue_value: Blue LUT value to be loaded
+ * Note: If display LUT cannot store 16 bit values then least significant
+ * bits are discarded
+ * Returns TRUE on success
+ */
+Bool XNVCTRLSetDDCCISinglePointLutOperation (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int offset,
+ unsigned int red_value,
+ unsigned int green_value,
+ unsigned int blue_value
+);
+
+/* XNVCTRLQueryDDCCIBlockLutOperation
+ * Provides an efficient method for reading multiple values from a display's LUT
+ * color: is one of NV_CTRL_DDCCI_RED_LUT, NV_CTRL_DDCCI_GREEN_LUT,
+ * NV_CTRL_DDCCI_BLUE_LUT. Color to be read.
+ * size: Number of values to be read
+ * offset: Offset into Red or Green or Blue LUT
+ * value: Red or Green or Blue LUT contents. Needs to be freed when done.
+ * Returns TRUE on success
+ */
+Bool XNVCTRLQueryDDCCIBlockLutOperation (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int color,
+ unsigned int size,
+ unsigned int offset,
+ unsigned int **value
+);
+
+/* XNVCTRLSetDDCCIBlockLutOperation
+ * Provides an efficient method for loading multiple values into a display's LUT
+ * size: Number of values to be loaded
+ * offset: Offset into Red or Green or Blue LUT
+ * value: R or G or B LUT values to be loaded
+ * color: NV_CTRL_DDCCI_RED_LUT, NV_CTRL_DDCCI_GREEN_LUT, NV_CTRL_DDCCI_BLUE_LUT
+ * Note: If display LUT cannot store 16 bit values then least significant
+ * bits are discarded
+ * Returns TRUE on success
+ */
+#define NV_CTRL_DDCCI_RED_LUT 1
+#define NV_CTRL_DDCCI_GREEN_LUT 2
+#define NV_CTRL_DDCCI_BLUE_LUT 3
+Bool XNVCTRLSetDDCCIBlockLutOperation (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int color,
+ unsigned int offset,
+ unsigned int size,
+ unsigned int *value
+);
+
+/* XNVCTRLSetDDCCIRemoteProcedureCall
+ * Allows initiation of a routine / macro resident in the display. Only
+ * one RPC is defined at this time:
+ * A spline curve routine applied to the data (supplied in format
+ * below) and the resulting data used to derive a full set of values
+ * for the display color LUT which shall then be loaded.
+ * offset: Offset into the LUT
+ * size: Number of values to be loaded
+ * red_lut: Red LUT values
+ * green_lut: Green LUT value
+ * blue_lut: Blue LUT value
+ * increment: Increment to next LUT entry
+ * Values of E0h FFh inclusive are reserved for manufacturer
+ * specific routines / macros.
+ * All other values are reserved and shall be ignored.
+ * Returns TRUE on success
+ */
+Bool XNVCTRLSetDDCCIRemoteProcedureCall (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int offset,
+ unsigned int size,
+ unsigned int *red_lut,
+ unsigned int *green_lut,
+ unsigned int *blue_lut,
+ unsigned int *increment
+);
+
+/* XNVCTRLQueryDDCCIDisplayControllerType:
+ * Provides the host with knowledge of the controller type being used by a
+ * particular display
+ * controller_manufacturer: Indicates controller manufacturer. (This string
+ * needs to be freed when done) (XXX This will be changed to a static string)
+ * controller_type: Provide a numeric indication of controller type
+ * Return TRUE on success
+ */
+Bool XNVCTRLQueryDDCCIDisplayControllerType (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned char **controller_manufacturer,
+ unsigned int *controller_type
+);
+
+/* NVCTRLQueryDDCCICapabilities:
+ * Gets the capabilities of the display as a VCP string
+ * Returns :
+ * nvctrl_vcp_supported: a table of 0 (not supported) and 1 (supported)
+ * which index is the NV_CTRL_DDCI* values
+ * possible_value_offset; contains the offsets in the table
+ * nvctrl_vcp_possible_values. Index is the NV_CTRL_DDCI* values.
+ * -1 means no possible values are available.
+ * possible_value_size; contains the count in the table
+ * nvctrl_vcp_possible_values. Index is the NV_CTRL_DDCI* values.
+ * -1 means no possible values are available.
+ * nvctrl_vcp_possible_values: a table of possible values for the non
+ * continuous values.
+ * nvctrl_string_vcp_supported: a table or 0 (not supported) and 1 (supported)
+ * which index is the NV_CTRL_STRING_DDCI* values.
+ *
+ * Returns TRUE on success
+ */
+Bool NVCTRLQueryDDCCICapabilities (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int **nvctrl_vcp_supported, // Size is NV_CTRL_DDCCI_LAST_VCP+1
+ unsigned int **possible_values_offset, // Size is NV_CTRL_DDCCI_LAST_VCP+1
+ unsigned int **possible_values_size, // Size is NV_CTRL_DDCCI_LAST_VCP+1
+ unsigned int **nvctrl_vcp_possible_values,
+ unsigned int **nvctrl_string_vcp_supported // Size is NV_CTRL_STRING_LAST_ATTRIBUTE+1
+);
+
+/* XNVCTRLQueryDDCCITimingReport
+ * Queries the currently operating video signal timing report data.
+ * - is_sync_freq_out_range: Sync. Freq. out of range (TRUE/FALSE)
+ * - is_unstable_count: Unstable Count (TRUE/FALSE)
+ * - is_positive_h_sync: Positive Horizontal sync polarity (TRUE/FALSE)
+ * - is_positive_v_sync: Positive Vertical sync polarity (TRUE/FALSE)
+ * - h_freq: Horizontal Frequency
+ * - v_freq: Vertical Frequency.
+ *
+ * Returns TRUE on success
+ */
+Bool XNVCTRLQueryDDCCITimingReport (
+ Display *dpy,
+ int screen,
+ unsigned int display_mask,
+ unsigned int *sync_freq_out_range,
+ unsigned int *unstable_count,
+ unsigned int *positive_h_sync,
+ unsigned int *positive_v_sync,
+ unsigned int *h_freq,
+ unsigned int *v_freq
+);
+
/*
* XNVCtrlSelectNotify -
diff --git a/src/libXNVCtrl/libXNVCtrl.a b/src/libXNVCtrl/libXNVCtrl.a
index 67db008..a94e166 100644
--- a/src/libXNVCtrl/libXNVCtrl.a
+++ b/src/libXNVCtrl/libXNVCtrl.a
Binary files differ
diff --git a/src/libXNVCtrl/nv_control.h b/src/libXNVCtrl/nv_control.h
index e82b0f4..ff27a95 100644
--- a/src/libXNVCtrl/nv_control.h
+++ b/src/libXNVCtrl/nv_control.h
@@ -8,16 +8,27 @@
#define NV_CONTROL_MAJOR 1
#define NV_CONTROL_MINOR 6
-#define X_nvCtrlQueryExtension 0
-#define X_nvCtrlIsNv 1
-#define X_nvCtrlQueryAttribute 2
-#define X_nvCtrlSetAttribute 3
-#define X_nvCtrlQueryStringAttribute 4
-#define X_nvCtrlQueryValidAttributeValues 5
-#define X_nvCtrlSelectNotify 6
-#define X_nvCtrlSetGvoColorConversion 7
-#define X_nvCtrlQueryGvoColorConversion 8
-#define X_nvCtrlLastRequest (X_nvCtrlQueryGvoColorConversion + 1)
+#define X_nvCtrlQueryExtension 0
+#define X_nvCtrlIsNv 1
+#define X_nvCtrlQueryAttribute 2
+#define X_nvCtrlSetAttribute 3
+#define X_nvCtrlQueryStringAttribute 4
+#define X_nvCtrlQueryValidAttributeValues 5
+#define X_nvCtrlSelectNotify 6
+#define X_nvCtrlSetGvoColorConversion 7
+#define X_nvCtrlQueryGvoColorConversion 8
+#define X_nvCtrlSetStringAttribute 9
+#define X_nvCtrlQueryDDCCILutSize 10
+#define X_nvCtrlQueryDDCCISinglePointLutOperation 11
+#define X_nvCtrlSetDDCCISinglePointLutOperation 12
+#define X_nvCtrlQueryDDCCIBlockLutOperation 13
+#define X_nvCtrlSetDDCCIBlockLutOperation 14
+#define X_nvCtrlSetDDCCIRemoteProcedureCall 15
+#define X_nvCtrlQueryDDCCIDisplayControllerType 16
+#define X_nvCtrlQueryDDCCICapabilities 17
+#define X_nvCtrlQueryDDCCITimingReport 18
+#define X_nvCtrlSetAttributeAndGetStatus 19
+#define X_nvCtrlLastRequest (X_nvCtrlSetAttributeAndGetStatus + 1)
/* Define 32 bit floats */
@@ -113,6 +124,31 @@ typedef struct {
CARD32 screen B32;
CARD32 display_mask B32;
CARD32 attribute B32;
+ INT32 value B32;
+} xnvCtrlSetAttributeAndGetStatusReq;
+#define sz_xnvCtrlSetAttributeAndGetStatusReq 20
+
+typedef struct {
+ BYTE type;
+ BYTE pad0;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 flags B32;
+ CARD32 pad3 B32;
+ CARD32 pad4 B32;
+ CARD32 pad5 B32;
+ CARD32 pad6 B32;
+ CARD32 pad7 B32;
+} xnvCtrlSetAttributeAndGetStatusReply;
+#define sz_xnvCtrlSetAttributeAndGetStatusReply 32
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 nvReqType;
+ CARD16 length B16;
+ CARD32 screen B32;
+ CARD32 display_mask B32;
+ CARD32 attribute B32;
} xnvCtrlQueryStringAttributeReq;
#define sz_xnvCtrlQueryStringAttributeReq 16
@@ -134,6 +170,32 @@ typedef struct {
} xnvCtrlQueryStringAttributeReply;
#define sz_xnvCtrlQueryStringAttributeReply 32
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 nvReqType;
+ CARD16 length B16;
+ CARD32 screen B32;
+ CARD32 display_mask B32;
+ CARD32 attribute B32;
+ CARD32 num_bytes B32;
+} xnvCtrlSetStringAttributeReq;
+#define sz_xnvCtrlSetStringAttributeReq 20
+
+typedef struct {
+ BYTE type;
+ BYTE pad0;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 flags B32;
+ CARD32 pad3 B32;
+ CARD32 pad4 B32;
+ CARD32 pad5 B32;
+ CARD32 pad6 B32;
+ CARD32 pad7 B32;
+} xnvCtrlSetStringAttributeReply;
+#define sz_xnvCtrlSetStringAttributeReply 32
+
typedef struct {
CARD8 reqType;
CARD8 nvReqType;
@@ -203,6 +265,232 @@ typedef struct {
} xnvCtrlQueryGvoColorConversionReply;
#define sz_xnvCtrlQueryGvoColorConversionReply 32
+
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 nvReqType;
+ CARD16 length B16;
+ CARD32 screen B32;
+ CARD32 display_mask B32;
+} xnvCtrlQueryDDCCILutSizeReq;
+#define sz_xnvCtrlQueryDDCCILutSizeReq 12
+
+typedef struct {
+ BYTE type; /* X_Reply */
+ BYTE pad0;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 flags B32;
+ CARD32 pad4 B32;
+ CARD32 pad5 B32;
+ CARD32 pad6 B32;
+ CARD32 pad7 B32;
+ CARD32 pad8 B32;
+} xnvCtrlQueryDDCCILutSizeReply;
+#define sz_xnvCtrlQueryDDCCILutSizeReply 32
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 nvReqType;
+ CARD16 length B16;
+ CARD32 screen B32;
+ CARD32 display_mask B32;
+ CARD32 offset B32;
+ CARD32 red_value B32;
+ CARD32 green_value B32;
+ CARD32 blue_value B32;
+} xnvCtrlSetDDCCISinglePointLutOperationReq;
+#define sz_xnvCtrlSetDDCCISinglePointLutOperationReq 28
+
+typedef struct {
+ BYTE type; /* X_Reply */
+ BYTE pad0;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 flags B32;
+ CARD32 pad4 B32;
+ CARD32 pad5 B32;
+ CARD32 pad6 B32;
+ CARD32 pad7 B32;
+ CARD32 pad8 B32;
+} xnvCtrlSetDDCCISinglePointLutOperationReply;
+#define sz_xnvCtrlSetDDCCISinglePointLutOperationReply 32
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 nvReqType;
+ CARD16 length B16;
+ CARD32 screen B32;
+ CARD32 display_mask B32;
+ CARD32 offset B32;
+} xnvCtrlQueryDDCCISinglePointLutOperationReq;
+#define sz_xnvCtrlQueryDDCCISinglePointLutOperationReq 16
+
+typedef struct {
+ BYTE type; /* X_Reply */
+ BYTE pad0;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 flags B32;
+ CARD32 pad4 B32;
+ CARD32 pad5 B32;
+ CARD32 pad6 B32;
+ CARD32 pad7 B32;
+ CARD32 pad8 B32;
+} xnvCtrlQueryDDCCISinglePointLutOperationReply;
+#define sz_xnvCtrlQueryDDCCISinglePointLutOperationReply 32
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 nvReqType;
+ CARD16 length B16;
+ CARD32 screen B32;
+ CARD32 display_mask B32;
+ CARD32 size B32;
+ CARD32 color B32;
+ CARD32 offset B32;
+} xnvCtrlQueryDDCCIBlockLutOperationReq;
+#define sz_xnvCtrlQueryDDCCIBlockLutOperationReq 24
+
+typedef struct {
+ BYTE type; /* X_Reply */
+ BYTE pad0;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 num_bytes B32;
+ CARD32 flags B32;
+ CARD32 pad5 B32;
+ CARD32 pad6 B32;
+ CARD32 pad7 B32;
+ CARD32 pad8 B32;
+} xnvCtrlQueryDDCCIBlockLutOperationReply;
+#define sz_xnvCtrlQueryDDCCIBlockLutOperationReply 32
+
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 nvReqType;
+ CARD16 length B16;
+ CARD32 screen B32;
+ CARD32 display_mask B32;
+ CARD32 color B32;
+ CARD32 offset B32;
+ CARD32 size B32;
+ CARD32 num_bytes B32;
+} xnvCtrlSetDDCCIBlockLutOperationReq;
+#define sz_xnvCtrlSetDDCCIBlockLutOperationReq 28
+
+typedef struct {
+ BYTE type; /* X_Reply */
+ BYTE pad0;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 num_bytes B32;
+ CARD32 flags B32;
+ CARD32 pad5 B32;
+ CARD32 pad6 B32;
+ CARD32 pad7 B32;
+ CARD32 pad8 B32;
+} xnvCtrlSetDDCCIBlockLutOperationReply;
+#define sz_xnvCtrlSetDDCCIBlockLutOperationReply 32
+
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 nvReqType;
+ CARD16 length B16;
+ CARD32 screen B32;
+ CARD32 display_mask B32;
+ CARD32 num_bytes B32;
+ CARD32 size B32;
+ CARD32 offset B32;
+} xnvCtrlSetDDCCIRemoteProcedureCallReq;
+#define sz_xnvCtrlSetDDCCIRemoteProcedureCallReq 24
+
+typedef struct {
+ BYTE type; /* X_Reply */
+ BYTE pad0;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 num_bytes B32;
+ CARD32 flags B32;
+ CARD32 pad5 B32;
+ CARD32 pad6 B32;
+ CARD32 pad7 B32;
+ CARD32 pad8 B32;
+} xnvCtrlSetDDCCIRemoteProcedureCallReply;
+#define sz_xnvCtrlSetDDCCIRemoteProcedureCallReply 32
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 nvReqType;
+ CARD16 length B16;
+ CARD32 screen B32;
+ CARD32 display_mask B32;
+} xnvCtrlQueryDDCCIDisplayControllerTypeReq;
+#define sz_xnvCtrlQueryDDCCIDisplayControllerTypeReq 12
+
+typedef struct {
+ BYTE type; /* X_Reply */
+ BYTE pad0;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 controller_type B32;
+ CARD32 size B32;
+ CARD32 flags B32;
+ CARD32 pad5 B32;
+ CARD32 pad6 B32;
+ CARD32 pad7 B32;
+} xnvCtrlQueryDDCCIDisplayControllerTypeReply;
+#define sz_xnvCtrlQueryDDCCIDisplayControllerTypeReply 32
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 nvReqType;
+ CARD16 length B16;
+ CARD32 screen B32;
+ CARD32 display_mask B32;
+} xnvCtrlQueryDDCCICapabilitiesReq;
+#define sz_xnvCtrlQueryDDCCICapabilitiesReq 12
+
+typedef struct {
+ BYTE type; /* X_Reply */
+ BYTE pad0;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 num_bytes B32;
+ CARD32 flags B32;
+ CARD32 possible_val_len B32;
+ CARD32 pad6 B32;
+ CARD32 pad7 B32;
+ CARD32 pad8 B32;
+} xnvCtrlQueryDDCCICapabilitiesReply;
+#define sz_xnvCtrlQueryDDCCICapabilitiesReply 32
+
+typedef struct {
+ CARD8 reqType;
+ CARD8 nvReqType;
+ CARD16 length B16;
+ CARD32 screen B32;
+ CARD32 display_mask B32;
+} xnvCtrlQueryDDCCITimingReportReq;
+#define sz_xnvCtrlQueryDDCCITimingReportReq 12
+
+typedef struct {
+ BYTE type; /* X_Reply */
+ BYTE pad0;
+ CARD16 sequenceNumber B16;
+ CARD32 length B32;
+ CARD32 flags B32;
+ CARD32 pad4 B32;
+ CARD32 pad5 B32;
+ CARD32 pad6 B32;
+ CARD32 pad7 B32;
+ CARD32 pad8 B32;
+} xnvCtrlQueryDDCCITimingReportReply;
+#define sz_xnvCtrlQueryDDCCITimingReportReply 32
+
typedef struct {
CARD8 reqType;
CARD8 nvReqType;
@@ -224,7 +512,7 @@ typedef struct {
BYTE type;
BYTE detail;
CARD16 sequenceNumber B16;
- Time time B32;
+ CARD32 time B32;
CARD32 screen B32;
CARD32 display_mask B32;
CARD32 attribute B32;
diff --git a/src/libXNVCtrlAttributes/NvCtrlAttributes.c b/src/libXNVCtrlAttributes/NvCtrlAttributes.c
index 4ffc302..f15d63e 100644
--- a/src/libXNVCtrlAttributes/NvCtrlAttributes.c
+++ b/src/libXNVCtrlAttributes/NvCtrlAttributes.c
@@ -83,7 +83,7 @@ NvCtrlAttributeHandle *NvCtrlAttributeInit(Display *dpy, int screen,
*/
if (subsystems & NV_CTRL_ATTRIBUTES_XVIDEO_SUBSYSTEM) {
- NvCtrlInitXvOverlayAttributes(h);
+ h->xv = NvCtrlInitXvAttributes(h);
}
/*
@@ -303,11 +303,11 @@ NvCtrlGetDisplayAttribute(NvCtrlAttributeHandle *handle,
case NV_CTRL_ATTR_EXT_VM_PRESENT:
*val = (h->vm) ? True : False; break;
case NV_CTRL_ATTR_EXT_XV_OVERLAY_PRESENT:
- *val = (h->xv_overlay) ? True : False; break;
+ *val = (h->xv && h->xv->overlay) ? True : False; break;
case NV_CTRL_ATTR_EXT_XV_TEXTURE_PRESENT:
- *val = (h->xv_texture) ? True : False; break;
+ *val = (h->xv && h->xv->texture) ? True : False; break;
case NV_CTRL_ATTR_EXT_XV_BLITTER_PRESENT:
- *val = (h->xv_blitter) ? True : False; break;
+ *val = (h->xv && h->xv->blitter) ? True : False; break;
default:
return NvCtrlNoAttribute;
}
@@ -482,6 +482,9 @@ void NvCtrlAttributeClose(NvCtrlAttributeHandle *handle)
if ( h->xrandr ) {
NvCtrlXrandrAttributesClose(h);
}
+ if ( h->xv ) {
+ NvCtrlXvAttributesClose(h);
+ }
free(h);
} /* NvCtrlAttributeClose() */
diff --git a/src/libXNVCtrlAttributes/NvCtrlAttributesGlx.c b/src/libXNVCtrlAttributes/NvCtrlAttributesGlx.c
index 4428d94..b7f3060 100644
--- a/src/libXNVCtrlAttributes/NvCtrlAttributesGlx.c
+++ b/src/libXNVCtrlAttributes/NvCtrlAttributesGlx.c
@@ -43,11 +43,9 @@
#include <GL/glx.h> /* GLX #defines */
#if defined(NV_BSD)
-static void *__handle = NULL;
+static void *__libGL_handle = NULL;
#endif
-#define NV_DLSYM(handle, symbol) ({ dlerror(); dlsym(handle, symbol); })
-
/****
*
* Provides a way to communicate GLX settings.
@@ -138,8 +136,10 @@ NvCtrlInitGlxAttributes (NvCtrlAttributePrivateHandle *h)
* to be free()'d on dlclose(); this results in failures
* on subsequent attempts to open libGL.so.
*/
- if (__handle == NULL)
- glx->libGL = __handle = dlopen("libGL.so.1", RTLD_LAZY);
+ if (__libGL_handle == NULL) {
+ __libGL_handle = dlopen("libGL.so.1", RTLD_LAZY);
+ }
+ glx->libGL = __libGL_handle;
#else
/* Link the libGL lib */
glx->libGL = dlopen("libGL.so.1", RTLD_LAZY);
@@ -243,7 +243,7 @@ NvCtrlGlxAttributesClose (NvCtrlAttributePrivateHandle *h)
XCloseDisplay( h->glx->dpy );
}
-#if defined(NV_BSD)
+#if !defined(NV_BSD)
if ( h->glx->libGL != NULL ) {
dlclose( h->glx->libGL );
}
diff --git a/src/libXNVCtrlAttributes/NvCtrlAttributesPrivate.h b/src/libXNVCtrlAttributes/NvCtrlAttributesPrivate.h
index 294cad2..1617bb8 100644
--- a/src/libXNVCtrlAttributes/NvCtrlAttributesPrivate.h
+++ b/src/libXNVCtrlAttributes/NvCtrlAttributesPrivate.h
@@ -29,6 +29,7 @@
#include "NVCtrl.h"
#include <GL/glx.h> /* GLX #defines */
#include <X11/extensions/Xrandr.h> /* Xrandr */
+#include <X11/extensions/Xvlib.h> /* Xv */
#define EXTENSION_NV_CONTROL 0x1
@@ -70,10 +71,16 @@
#define XV_MINMINOR 0
+/* Use to resolve symbols in dynamically opened libraries */
+
+#define NV_DLSYM(handle, symbol) ({ dlerror(); dlsym(handle, symbol); })
+
+
typedef struct __NvCtrlAttributes NvCtrlAttributes;
typedef struct __NvCtrlVidModeAttributes NvCtrlVidModeAttributes;
typedef struct __NvCtrlAttributePrivateHandle NvCtrlAttributePrivateHandle;
typedef struct __NvCtrlNvControlAttributes NvCtrlNvControlAttributes;
+typedef struct __NvCtrlXvAttributes NvCtrlXvAttributes;
typedef struct __NvCtrlXvOverlayAttributes NvCtrlXvOverlayAttributes;
typedef struct __NvCtrlXvTextureAttributes NvCtrlXvTextureAttributes;
typedef struct __NvCtrlXvBlitterAttributes NvCtrlXvBlitterAttributes;
@@ -121,6 +128,33 @@ struct __NvCtrlXvBlitterAttributes {
NvCtrlXvAttribute *defaults;
};
+struct __NvCtrlXvAttributes {
+
+ /* libXv.so library handle */
+ void *libXv;
+
+ /* Private display connection for the Xv ext. */
+ Display *dpy;
+
+ /* libXv functions */
+ int (* XvGetPortAttribute) (Display *, XvPortID, Atom, int *);
+
+ int (* XvSetPortAttribute) (Display *, XvPortID, Atom, int);
+
+ XvAttribute* (* XvQueryPortAttributes) (Display *, XvPortID, int *);
+
+ int (* XvQueryExtension) (Display *, unsigned int *, unsigned int *,
+ unsigned int *, unsigned int *, unsigned int *);
+
+ int (* XvQueryAdaptors) (Display *, Window, unsigned int *,
+ XvAdaptorInfo **);
+
+
+ NvCtrlXvOverlayAttributes *overlay; /* XVideo info (overlay) */
+ NvCtrlXvTextureAttributes *texture; /* XVideo info (texture) */
+ NvCtrlXvBlitterAttributes *blitter; /* XVideo info (blitter) */
+};
+
struct __NvCtrlGlxAttributes {
/* Private display connection for the GLX information ext. */
@@ -154,6 +188,9 @@ struct __NvCtrlGlxAttributes {
struct __NvCtrlXrandrAttributes {
+ /* Private display connection for the XRandR information ext. */
+ Display *dpy;
+
/* libXrandr.so library handle */
void *libXrandr;
int event_base; /* XRandR extension event base */
@@ -190,13 +227,11 @@ struct __NvCtrlXrandrAttributes {
};
struct __NvCtrlAttributePrivateHandle {
- Display *dpy; /* display connection */
- int screen; /* the screen that this handle controls */
- NvCtrlNvControlAttributes *nv; /* NV-CONTROL extension info */
- NvCtrlVidModeAttributes *vm; /* XF86VidMode extension info */
- NvCtrlXvOverlayAttributes *xv_overlay; /* XVideo info (overlay) */
- NvCtrlXvTextureAttributes *xv_texture; /* XVideo info (texture) */
- NvCtrlXvBlitterAttributes *xv_blitter; /* XVideo info (blitter) */
+ Display *dpy; /* display connection */
+ int screen; /* the screen that this handle controls */
+ NvCtrlNvControlAttributes *nv; /* NV-CONTROL extension info */
+ NvCtrlVidModeAttributes *vm; /* XF86VidMode extension info */
+ NvCtrlXvAttributes *xv; /* XVideo info */
NvCtrlGlxAttributes *glx; /* GLX extension info */
NvCtrlXrandrAttributes *xrandr; /* XRandR extension info */
};
@@ -207,43 +242,46 @@ NvCtrlInitNvControlAttributes (NvCtrlAttributePrivateHandle *);
NvCtrlVidModeAttributes *
NvCtrlInitVidModeAttributes (NvCtrlAttributePrivateHandle *);
-void NvCtrlInitXvOverlayAttributes (NvCtrlAttributePrivateHandle *);
+
+/* Xv attribute functions */
+
+NvCtrlXvAttributes *
+NvCtrlInitXvAttributes (NvCtrlAttributePrivateHandle *);
+
+void
+NvCtrlXvAttributesClose (NvCtrlAttributePrivateHandle *);
/* GLX extension attribute functions */
NvCtrlGlxAttributes *
-NvCtrlInitGlxAttributes (NvCtrlAttributePrivateHandle *h);
+NvCtrlInitGlxAttributes (NvCtrlAttributePrivateHandle *);
void
-NvCtrlGlxAttributesClose (NvCtrlAttributePrivateHandle *h);
+NvCtrlGlxAttributesClose (NvCtrlAttributePrivateHandle *);
ReturnStatus
-NvCtrlGlxGetVoidAttribute (NvCtrlAttributePrivateHandle *,
- unsigned int,
+NvCtrlGlxGetVoidAttribute (NvCtrlAttributePrivateHandle *, unsigned int,
int, void **);
ReturnStatus
-NvCtrlGlxGetStringAttribute (NvCtrlAttributePrivateHandle *,
- unsigned int,
+NvCtrlGlxGetStringAttribute (NvCtrlAttributePrivateHandle *, unsigned int,
int, char **);
/* XRandR extension attribute functions */
NvCtrlXrandrAttributes *
-NvCtrlInitXrandrAttributes (NvCtrlAttributePrivateHandle *h);
+NvCtrlInitXrandrAttributes (NvCtrlAttributePrivateHandle *);
void
-NvCtrlXrandrAttributesClose (NvCtrlAttributePrivateHandle *h);
+NvCtrlXrandrAttributesClose (NvCtrlAttributePrivateHandle *);
ReturnStatus
-NvCtrlXrandrGetAttribute (NvCtrlAttributePrivateHandle *h,
- int attr, int *val);
+NvCtrlXrandrGetAttribute (NvCtrlAttributePrivateHandle *, int, int *);
ReturnStatus
-NvCtrlXrandrSetAttribute (NvCtrlAttributePrivateHandle *h,
- int attr, int val);
+NvCtrlXrandrSetAttribute (NvCtrlAttributePrivateHandle *, int, int);
/* Generic attribute functions */
diff --git a/src/libXNVCtrlAttributes/NvCtrlAttributesXrandr.c b/src/libXNVCtrlAttributes/NvCtrlAttributesXrandr.c
index 9fec569..bbd61ef 100644
--- a/src/libXNVCtrlAttributes/NvCtrlAttributesXrandr.c
+++ b/src/libXNVCtrlAttributes/NvCtrlAttributesXrandr.c
@@ -37,8 +37,6 @@
#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h> /* Xrandr */
-#define NV_DLSYM(handle, symbol) ({ dlerror(); dlsym(handle, symbol); })
-
#include "NvCtrlAttributes.h"
#include "NvCtrlAttributesPrivate.h"
#include "NVCtrlLib.h"
@@ -69,14 +67,14 @@ set_rotation(NvCtrlAttributePrivateHandle *h, Rotation rotation)
}
/* Get current size & orientation */
- sc = h->xrandr->XRRGetScreenInfo(h->dpy, DefaultRootWindow(h->dpy));
+ sc = h->xrandr->XRRGetScreenInfo(h->xrandr->dpy, DefaultRootWindow(h->xrandr->dpy));
if ( !sc ) {
return NvCtrlError;
}
cur_size = h->xrandr->XRRConfigCurrentConfiguration(sc, &cur_rotation);
- status = h->xrandr->XRRSetScreenConfig (h->dpy, sc,
- DefaultRootWindow(h->dpy),
+ status = h->xrandr->XRRSetScreenConfig (h->xrandr->dpy, sc,
+ DefaultRootWindow(h->xrandr->dpy),
cur_size, rotation, CurrentTime);
h->xrandr->XRRFreeScreenConfigInfo(sc);
@@ -164,13 +162,19 @@ NvCtrlInitXrandrAttributes (NvCtrlAttributePrivateHandle *h)
if ((error = dlerror()) != NULL) goto fail;
+ /* Duplicate the display connection */
+
+ xrandr->dpy = XOpenDisplay(XDisplayString(h->dpy));
+ if ( xrandr->dpy == NULL )
+ goto fail;
+
/* Verify rotation is supported */
- ret = xrandr->XRRQueryExtension(h->dpy, &xrandr->event_base,
+ ret = xrandr->XRRQueryExtension(xrandr->dpy, &xrandr->event_base,
&xrandr->error_base);
if ( !ret ) goto fail;
- xrandr->rotations = xrandr->XRRRotations(h->dpy, h->screen, &rotation);
- sizes = xrandr->XRRSizes(h->dpy, h->screen, &(xrandr->nsizes));
+ xrandr->rotations = xrandr->XRRRotations(xrandr->dpy, h->screen, &rotation);
+ sizes = xrandr->XRRSizes(xrandr->dpy, h->screen, &(xrandr->nsizes));
/* Must support more than one rotation orientation */
if ( (xrandr->rotations == 1) || (xrandr->rotations == 2) ||
@@ -180,7 +184,7 @@ NvCtrlInitXrandrAttributes (NvCtrlAttributePrivateHandle *h)
/* Register to recieve XRandR events */
- xrandr->XRRSelectInput(h->dpy, DefaultRootWindow(h->dpy),
+ xrandr->XRRSelectInput(xrandr->dpy, DefaultRootWindow(xrandr->dpy),
RRScreenChangeNotifyMask);
// xrandr->rotations = 1;
@@ -194,6 +198,9 @@ NvCtrlInitXrandrAttributes (NvCtrlAttributePrivateHandle *h)
nv_error_msg("libXrandr setup error : %s\n", error);
}
if ( xrandr != NULL ) {
+ if ( xrandr->dpy != NULL ) {
+ XCloseDisplay(xrandr->dpy);
+ }
if ( xrandr->libXrandr != NULL ) {
dlclose(xrandr->libXrandr);
}
@@ -220,6 +227,9 @@ NvCtrlXrandrAttributesClose (NvCtrlAttributePrivateHandle *h)
return;
}
+ if ( h->xrandr->dpy ) {
+ XCloseDisplay(h->xrandr->dpy);
+ }
if ( h->xrandr->libXrandr != NULL ) {
dlclose( h->xrandr->libXrandr );
}
@@ -269,7 +279,7 @@ NvCtrlXrandrGetAttribute (NvCtrlAttributePrivateHandle *h,
break;
case NV_CTRL_ATTR_XRANDR_ROTATION:
- sc = h->xrandr->XRRGetScreenInfo(h->dpy, DefaultRootWindow(h->dpy));
+ sc = h->xrandr->XRRGetScreenInfo(h->xrandr->dpy, DefaultRootWindow(h->xrandr->dpy));
h->xrandr->XRRConfigRotations(sc, &rotation);
h->xrandr->XRRFreeScreenConfigInfo(sc);
diff --git a/src/libXNVCtrlAttributes/NvCtrlAttributesXv.c b/src/libXNVCtrlAttributes/NvCtrlAttributesXv.c
index 1c0bb50..5145d75 100644
--- a/src/libXNVCtrlAttributes/NvCtrlAttributesXv.c
+++ b/src/libXNVCtrlAttributes/NvCtrlAttributesXv.c
@@ -29,8 +29,12 @@
#include <stdlib.h>
#include <string.h>
+#include <dlfcn.h>
-static NvCtrlXvAttribute *getXvAttribute (Display *, XvPortID, const char *);
+#include "msg.h"
+
+static NvCtrlXvAttribute *getXvAttribute (NvCtrlXvAttributes *,
+ XvPortID, const char *);
static Bool checkAdaptor(NvCtrlAttributePrivateHandle *h,
unsigned int attribute);
@@ -52,28 +56,76 @@ static NvCtrlXvAttribute *getXvAttributePtr(NvCtrlAttributePrivateHandle *h,
* otherwise.
*/
-void NvCtrlInitXvOverlayAttributes(NvCtrlAttributePrivateHandle *h)
+NvCtrlXvAttributes * NvCtrlInitXvAttributes(NvCtrlAttributePrivateHandle *h)
{
+ NvCtrlXvAttributes *xv = NULL;
XvAdaptorInfo *ainfo;
unsigned int ver, rev, req, event, error, nadaptors;
int ret, i;
Display *dpy = h->dpy;
+ const char *error_str = NULL;
+ const char *warn_str = NULL;
- /* clear the adaptor pointers */
- h->xv_overlay = NULL;
- h->xv_texture = NULL;
- h->xv_blitter = NULL;
+ /* Check parameters */
+ if (h == NULL || h->dpy == NULL) {
+ goto fail;
+ }
+
+
+ /* Allocate the attributes structure */
+ xv = (NvCtrlXvAttributes *)
+ calloc(1, sizeof (NvCtrlXvAttributes));
+ if ( xv == NULL ) {
+ error_str = "Out of memory.";
+ goto fail;
+ }
+
- ret = XvQueryExtension(dpy, &ver, &rev, &req, &event, &error);
- if (ret != Success) return;
+ /* Link the libXv lib */
+ xv->libXv = dlopen("libXv.so.1", RTLD_LAZY);
+
+ if (xv->libXv == NULL) {
+ warn_str = "Failed to open libXv.so.1: this library "
+ "is not present in your system or is not in your "
+ "LD_LIBRARY_PATH.";
+ goto fail;
+ }
+
+
+ /* Resolve Xv functions needed */
+ xv->XvQueryExtension = NV_DLSYM(xv->libXv, "XvQueryExtension");
+ if ((error_str = dlerror()) != NULL) goto fail;
- /* XXX do we have a minimum Xv version? */
+ xv->XvQueryAdaptors = NV_DLSYM(xv->libXv, "XvQueryAdaptors");
+ if ((error_str = dlerror()) != NULL) goto fail;
- ret = XvQueryAdaptors(dpy, RootWindow(dpy, h->screen),
- &nadaptors, &ainfo);
+ xv->XvGetPortAttribute = NV_DLSYM(xv->libXv, "XvGetPortAttribute");
+ if ((error_str = dlerror()) != NULL) goto fail;
+
+ xv->XvSetPortAttribute = NV_DLSYM(xv->libXv, "XvSetPortAttribute");
+ if ((error_str = dlerror()) != NULL) goto fail;
- if (ret != Success || !nadaptors || !ainfo) return;
+ xv->XvQueryPortAttributes = NV_DLSYM(xv->libXv, "XvQueryPortAttributes");
+ if ((error_str = dlerror()) != NULL) goto fail;
+
+
+ /* Duplicate the display connection and verify Xv extension exists */
+ xv->dpy = XOpenDisplay( XDisplayString(h->dpy) );
+ if ( xv->dpy == NULL ) {
+ goto fail;
+ }
+ ret = xv->XvQueryExtension(xv->dpy, &ver, &rev, &req, &event, &error);
+ if (ret != Success) goto fail;
+
+ /* XXX do we have a minimum Xv version? */
+
+
+ /* Get the list of adaptors */
+ ret = xv->XvQueryAdaptors(xv->dpy, RootWindow(dpy, h->screen),
+ &nadaptors, &ainfo);
+
+ if (ret != Success || !nadaptors || !ainfo) goto fail;
for (i = 0; i < nadaptors; i++) {
@@ -84,17 +136,21 @@ void NvCtrlInitXvOverlayAttributes(NvCtrlAttributePrivateHandle *h)
attrs = (NvCtrlXvOverlayAttributes *)
malloc(sizeof(NvCtrlXvOverlayAttributes));
+ if ( !attrs ) {
+ error_str = "Out of memory.";
+ goto fail;
+ }
attrs->port = ainfo[i].base_id;
- attrs->saturation = getXvAttribute(dpy, attrs->port,
+ attrs->saturation = getXvAttribute(xv, attrs->port,
"XV_SATURATION");
- attrs->contrast = getXvAttribute(dpy, attrs->port,
+ attrs->contrast = getXvAttribute(xv, attrs->port,
"XV_CONTRAST");
- attrs->brightness = getXvAttribute(dpy, attrs->port,
+ attrs->brightness = getXvAttribute(xv, attrs->port,
"XV_BRIGHTNESS");
- attrs->hue = getXvAttribute(dpy, attrs->port,
+ attrs->hue = getXvAttribute(xv, attrs->port,
"XV_HUE");
- attrs->defaults = getXvAttribute(dpy, attrs->port,
+ attrs->defaults = getXvAttribute(xv, attrs->port,
"XV_SET_DEFAULTS");
if (!attrs->saturation ||
@@ -113,7 +169,7 @@ void NvCtrlInitXvOverlayAttributes(NvCtrlAttributePrivateHandle *h)
attrs = NULL;
} else {
- h->xv_overlay = attrs;
+ xv->overlay = attrs;
}
}
@@ -123,11 +179,15 @@ void NvCtrlInitXvOverlayAttributes(NvCtrlAttributePrivateHandle *h)
attrs = (NvCtrlXvTextureAttributes *)
malloc(sizeof(NvCtrlXvTextureAttributes));
-
+ if ( !attrs ) {
+ error_str = "Out of memory.";
+ goto fail;
+ }
+
attrs->port = ainfo[i].base_id;
- attrs->sync_to_vblank = getXvAttribute(dpy, attrs->port,
+ attrs->sync_to_vblank = getXvAttribute(xv, attrs->port,
"XV_SYNC_TO_VBLANK");
- attrs->defaults = getXvAttribute(dpy, attrs->port,
+ attrs->defaults = getXvAttribute(xv, attrs->port,
"XV_SET_DEFAULTS");
if (!attrs->sync_to_vblank ||
!attrs->defaults) {
@@ -139,7 +199,7 @@ void NvCtrlInitXvOverlayAttributes(NvCtrlAttributePrivateHandle *h)
attrs = NULL;
} else {
- h->xv_texture = attrs;
+ xv->texture = attrs;
}
}
@@ -149,11 +209,15 @@ void NvCtrlInitXvOverlayAttributes(NvCtrlAttributePrivateHandle *h)
attrs = (NvCtrlXvBlitterAttributes *)
malloc(sizeof(NvCtrlXvBlitterAttributes));
-
+ if ( !attrs ) {
+ error_str = "Out of memory.";
+ goto fail;
+ }
+
attrs->port = ainfo[i].base_id;
- attrs->sync_to_vblank = getXvAttribute(dpy, attrs->port,
+ attrs->sync_to_vblank = getXvAttribute(xv, attrs->port,
"XV_SYNC_TO_VBLANK");
- attrs->defaults = getXvAttribute(dpy, attrs->port,
+ attrs->defaults = getXvAttribute(xv, attrs->port,
"XV_SET_DEFAULTS");
if (!attrs->sync_to_vblank ||
!attrs->defaults) {
@@ -165,11 +229,35 @@ void NvCtrlInitXvOverlayAttributes(NvCtrlAttributePrivateHandle *h)
attrs = NULL;
} else {
- h->xv_blitter = attrs;
+ xv->blitter = attrs;
}
}
}
-} /* NvCtrlInitXvOverlayAttributes() */
+
+ return xv;
+
+
+ /* Handle failures */
+ fail:
+ if (error_str) {
+ nv_error_msg("libXv setup error: %s\n", error_str);
+ }
+ if (warn_str) {
+ nv_warning_msg("libXv setup warning: %s\n", warn_str);
+ }
+ if (xv != NULL) {
+ if ( xv->dpy != NULL ) {
+ XCloseDisplay(xv->dpy);
+ }
+ if (xv->libXv) {
+ dlclose(xv->libXv);
+ }
+ free (xv);
+ }
+
+ return NULL;
+
+} /* NvCtrlInitXvAttributes() */
@@ -199,7 +287,7 @@ ReturnStatus NvCtrlXvGetAttribute(NvCtrlAttributePrivateHandle *h,
/* finally, query the value */
- if (XvGetPortAttribute(h->dpy, port, a->atom, val) != Success) {
+ if (h->xv->XvGetPortAttribute(h->xv->dpy, port, a->atom, val) != Success) {
return NvCtrlError;
}
@@ -231,7 +319,7 @@ ReturnStatus NvCtrlXvSetAttribute(NvCtrlAttributePrivateHandle *h,
/* finally, set the value */
- if (XvSetPortAttribute(h->dpy, port, a->atom, val) != Success) {
+ if (h->xv->XvSetPortAttribute(h->xv->dpy, port, a->atom, val) != Success) {
return NvCtrlError;
}
@@ -278,7 +366,8 @@ NvCtrlXvGetValidAttributeValues(NvCtrlAttributePrivateHandle *h, int attr,
* NvCtrlXvAttribute struct if successful, otherwise return NULL.
*/
-static NvCtrlXvAttribute *getXvAttribute(Display *dpy, XvPortID port,
+static NvCtrlXvAttribute *getXvAttribute(NvCtrlXvAttributes *xv,
+ XvPortID port,
const char *name)
{
NvCtrlXvAttribute *attr = NULL;
@@ -286,7 +375,7 @@ static NvCtrlXvAttribute *getXvAttribute(Display *dpy, XvPortID port,
unsigned int n;
int i;
- attributes = XvQueryPortAttributes(dpy, port, &n);
+ attributes = xv->XvQueryPortAttributes(xv->dpy, port, &n);
if (!attributes || !n) goto failed;
@@ -297,7 +386,7 @@ static NvCtrlXvAttribute *getXvAttribute(Display *dpy, XvPortID port,
attr->range.type = ATTRIBUTE_TYPE_RANGE;
attr->range.u.range.min = attributes[i].min_value;
attr->range.u.range.max = attributes[i].max_value;
- attr->atom = XInternAtom(dpy, name, True);
+ attr->atom = XInternAtom(xv->dpy, name, True);
if (attr->atom == None) goto failed;
if (! (attributes[i].flags & XvSettable)) goto failed;
@@ -339,17 +428,17 @@ static Bool checkAdaptor(NvCtrlAttributePrivateHandle *h,
case NV_CTRL_ATTR_XV_OVERLAY_BRIGHTNESS:
case NV_CTRL_ATTR_XV_OVERLAY_HUE:
case NV_CTRL_ATTR_XV_OVERLAY_SET_DEFAULTS:
- if (h && h->xv_overlay) return True;
+ if (h && h->xv && h->xv->overlay) return True;
else return False;
case NV_CTRL_ATTR_XV_TEXTURE_SYNC_TO_VBLANK:
case NV_CTRL_ATTR_XV_TEXTURE_SET_DEFAULTS:
- if (h && h->xv_texture) return True;
+ if (h && h->xv && h->xv->texture) return True;
else return False;
case NV_CTRL_ATTR_XV_BLITTER_SYNC_TO_VBLANK:
case NV_CTRL_ATTR_XV_BLITTER_SET_DEFAULTS:
- if (h && h->xv_blitter) return True;
+ if (h && h->xv && h->xv->blitter) return True;
else return False;
default:
@@ -376,15 +465,15 @@ static unsigned int getXvPort(NvCtrlAttributePrivateHandle *h,
case NV_CTRL_ATTR_XV_OVERLAY_BRIGHTNESS:
case NV_CTRL_ATTR_XV_OVERLAY_HUE:
case NV_CTRL_ATTR_XV_OVERLAY_SET_DEFAULTS:
- return h->xv_overlay->port;
+ return h->xv->overlay->port;
case NV_CTRL_ATTR_XV_TEXTURE_SYNC_TO_VBLANK:
case NV_CTRL_ATTR_XV_TEXTURE_SET_DEFAULTS:
- return h->xv_texture->port;
+ return h->xv->texture->port;
case NV_CTRL_ATTR_XV_BLITTER_SYNC_TO_VBLANK:
case NV_CTRL_ATTR_XV_BLITTER_SET_DEFAULTS:
- return h->xv_blitter->port;
+ return h->xv->blitter->port;
default:
return 0;
@@ -406,33 +495,70 @@ static NvCtrlXvAttribute *getXvAttributePtr(NvCtrlAttributePrivateHandle *h,
switch (attribute) {
case NV_CTRL_ATTR_XV_OVERLAY_SATURATION:
- return h->xv_overlay->saturation;
+ return h->xv->overlay->saturation;
case NV_CTRL_ATTR_XV_OVERLAY_CONTRAST:
- return h->xv_overlay->contrast;
+ return h->xv->overlay->contrast;
case NV_CTRL_ATTR_XV_OVERLAY_BRIGHTNESS:
- return h->xv_overlay->brightness;
+ return h->xv->overlay->brightness;
case NV_CTRL_ATTR_XV_OVERLAY_HUE:
- return h->xv_overlay->hue;
+ return h->xv->overlay->hue;
case NV_CTRL_ATTR_XV_TEXTURE_SYNC_TO_VBLANK:
- return h->xv_texture->sync_to_vblank;
+ return h->xv->texture->sync_to_vblank;
case NV_CTRL_ATTR_XV_BLITTER_SYNC_TO_VBLANK:
- return h->xv_blitter->sync_to_vblank;
+ return h->xv->blitter->sync_to_vblank;
case NV_CTRL_ATTR_XV_OVERLAY_SET_DEFAULTS:
- return h->xv_overlay->defaults;
+ return h->xv->overlay->defaults;
case NV_CTRL_ATTR_XV_TEXTURE_SET_DEFAULTS:
- return h->xv_texture->defaults;
+ return h->xv->texture->defaults;
case NV_CTRL_ATTR_XV_BLITTER_SET_DEFAULTS:
- return h->xv_blitter->defaults;
+ return h->xv->blitter->defaults;
default:
return NULL;
}
} /* getXvAttributePtr() */
+
+
+
+/*
+ * Frees and relinquishes any resource used by the Xv Attributes
+ *
+ */
+
+void
+NvCtrlXvAttributesClose (NvCtrlAttributePrivateHandle *h)
+{
+ if (h == NULL || h->xv == NULL) {
+ return;
+ }
+
+ if (h->xv->dpy) {
+ XCloseDisplay(h->xv->dpy);
+ }
+
+ if (h->xv->libXv) {
+ dlclose(h->xv->libXv);
+ }
+
+ if (h->xv->overlay) {
+ free(h->xv->overlay);
+ }
+ if (h->xv->texture) {
+ free(h->xv->texture);
+ }
+ if (h->xv->blitter) {
+ free(h->xv->blitter);
+ }
+
+ free(h->xv);
+ h->xv = NULL;
+
+} /* NvCtrlXvAttributesClose() */
diff --git a/src/msg.h b/src/msg.h
index ea90486..f8eb7ae 100644
--- a/src/msg.h
+++ b/src/msg.h
@@ -26,6 +26,7 @@
#define __MSG_H__
#include <stdarg.h>
+#include <stdio.h>
void nv_error_msg(const char*, ...);
void nv_warning_msg(const char*, ...);
diff --git a/src/parse.c b/src/parse.c
index b162a27..126b740 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -61,12 +61,13 @@ AttributeTableEntry attributeTable[] = {
{ "FlatpanelScaling", NV_CTRL_FLATPANEL_SCALING, 0 },
{ "FlatpanelDithering", NV_CTRL_FLATPANEL_DITHERING, 0 },
{ "DigitalVibrance", NV_CTRL_DIGITAL_VIBRANCE, 0 },
- { "ImageSharpening", NV_CTRL_IMAGE_SHARPENING, 0, },
+ { "ImageSharpening", NV_CTRL_IMAGE_SHARPENING, 0 },
{ "BusType", NV_CTRL_BUS_TYPE, 0 },
{ "VideoRam", NV_CTRL_VIDEO_RAM, 0 },
{ "Irq", NV_CTRL_IRQ, 0 },
{ "OperatingSystem", NV_CTRL_OPERATING_SYSTEM, 0 },
{ "SyncToVBlank", NV_CTRL_SYNC_TO_VBLANK, 0 },
+ { "AllowFlipping", NV_CTRL_FLIPPING_ALLOWED, 0 },
{ "LogAniso", NV_CTRL_LOG_ANISO, 0 },
{ "FSAA", NV_CTRL_FSAA_MODE, 0 },
{ "TextureSharpen", NV_CTRL_TEXTURE_SHARPEN, 0 },
@@ -105,14 +106,15 @@ AttributeTableEntry attributeTable[] = {
{ "RedGamma", GAMMA_VALUE|RED_CHANNEL, C|G },
{ "GreenGamma", GAMMA_VALUE|GREEN_CHANNEL, C|G },
{ "BlueGamma", GAMMA_VALUE|BLUE_CHANNEL, C|G },
- { "TVOverScan", NV_CTRL_TV_OVERSCAN, 0, },
- { "TVFlickerFilter", NV_CTRL_TV_FLICKER_FILTER, 0, },
- { "TVBrightness", NV_CTRL_TV_BRIGHTNESS, 0, },
- { "TVHue", NV_CTRL_TV_HUE, 0, },
- { "TVContrast", NV_CTRL_TV_CONTRAST, 0, },
- { "TVSaturation", NV_CTRL_TV_SATURATION, 0, },
+ { "TVOverScan", NV_CTRL_TV_OVERSCAN, 0 },
+ { "TVFlickerFilter", NV_CTRL_TV_FLICKER_FILTER, 0 },
+ { "TVBrightness", NV_CTRL_TV_BRIGHTNESS, 0 },
+ { "TVHue", NV_CTRL_TV_HUE, 0 },
+ { "TVContrast", NV_CTRL_TV_CONTRAST, 0 },
+ { "TVSaturation", NV_CTRL_TV_SATURATION, 0 },
{ "GPUCoreTemp", NV_CTRL_GPU_CORE_TEMPERATURE, N },
{ "GPUAmbientTemp", NV_CTRL_AMBIENT_TEMPERATURE, N },
+ { "FramelockUseHouseSync", NV_CTRL_USE_HOUSE_SYNC, 0 },
{ "XVideoOverlaySaturation", NV_CTRL_ATTR_XV_OVERLAY_SATURATION, V },
{ "XVideoOverlayContrast", NV_CTRL_ATTR_XV_OVERLAY_CONTRAST, V },
diff --git a/src/query-assign.c b/src/query-assign.c
index f8637b1..8f0366e 100644
--- a/src/query-assign.c
+++ b/src/query-assign.c
@@ -186,6 +186,17 @@ void nv_free_ctrl_handles(CtrlHandles *h)
if (h->display) free(h->display);
if (h->dpy) {
+
+ /*
+ * XXX It is unfortunate that the display connection needs
+ * to be closed before the backends have had a chance to
+ * tear down their state. If future backends need to send
+ * protocol in this case or perform similar tasks, we'll
+ * have to add e.g. NvCtrlAttributeTearDown(), which would
+ * need to be called before XCloseDisplay().
+ */
+ XCloseDisplay(h->dpy);
+ h->dpy = NULL;
for (i = 0; i < h->num_screens; i++) {
NvCtrlAttributeClose(h->h[i]);
@@ -195,8 +206,6 @@ void nv_free_ctrl_handles(CtrlHandles *h)
if (h->d) free(h->d);
if (h->h) free(h->h);
if (h->screen_names) free(h->screen_names);
-
- XCloseDisplay(h->dpy);
}
free(h);